diff --git a/research/INDEX.md b/research/INDEX.md index 4144660..2443530 100644 --- a/research/INDEX.md +++ b/research/INDEX.md @@ -6,11 +6,11 @@ | Metric | Value | |---|---| -| Subjects | 16 | -| Total source documents | 1037 | -| — Tier 1 (Source Dossier, independently analyzed) | 291 | -| — Tier 2 (Source Citation Card, listed only) | 746 | -| Total conclusion documents | 41 | +| Subjects | 17 | +| Total source documents | 1136 | +| — Tier 1 (Source Dossier, independently analyzed) | 301 | +| — Tier 2 (Source Citation Card, listed only) | 835 | +| Total conclusion documents | 43 | | Archive opened | 2026-10-09 | | Last updated | 2026-10-27 | @@ -34,6 +34,7 @@ | [`mcp-client-support`](mcp-client-support/) | 106 (38 / 68) | 3 | 2026-10-18 | 2026-10-18 | Designing tai's MCP client: wire spec (stdio + Streamable HTTP on the 2025-11-25 baseline), pasted-config/GitHub-URL resolver, and the trust/approval model; decided minimal stdlib client, normalizer plus resolver agent, untrusted-until-consent with description pinning, no OAuth in v1, nothing built yet | | [`fuzzy-matching-selectors`](fuzzy-matching-selectors/) | 65 (12 / 53) | 2 | 2026-10-25 | 2026-10-25 | Making `@agent` / `@model` mentions pick the most related candidate: fzf/fzy/Sublime/clangd subsequence scoring, Damerau-Levenshtein, pg_trgm, RapidFuzz WRatio, difflib, CPython suggestions surveyed; decided one generic `FuzzyMatcher` (four signals, deterministic ties, floor 0.3 across agents and models) and implemented it the same day | | [`whatsapp-automation`](whatsapp-automation/) | 70 (9 / 61) | 3 | 2026-10-27 | 2026-10-27 | Making detz send WhatsApp messages from C++ on a personal number: no native Python library exists (neonize is whatsmeow over ctypes, yowsup is dead), no browser needed, decided a native C++ transpile from wa-go (MIT, golden vectors) with whatsmeow as referee, GPL libsignal avoided, plus a whatsapp-mcp shortcut; specified in taicpp/docs/whatsapp.md, nothing built | +| [`terminal-screenshot-rendering`](terminal-screenshot-rendering/) | 99 (10 / 89) | 2 | 2026-10-27 | 2026-10-27 | Making detz take a PNG of the current terminal on a headless server for WhatsApp: surveyed freeze, termshot, textimg, libansilove, agg, aha, silicon, tmux capture-pane -e, bitmap fonts (Spleen, Terminus, Unifont, X11 fixed) and how Baileys, whatsmeow and whatsapp-rust set image mimetypes; decided an in-process renderer (tmux escapes, TuiVtScreen, embedded Spleen 8x16, zlib PNG) and image/png without a JPEG encoder; implemented the same session | ## Recent activity log @@ -67,6 +68,7 @@ | 2026-10-25 | `cap-protocol` | Extended with 59 sources (11 Tier 1 / 48 Tier 2) + 2 conclusions (`cap-model-handling-practice`, `agent-delegation-tool-plus-skill`), from 10 searches and 15 fetches on how CAP and neighboring protocols treat models and cost, and whether delegation should be a tool plus a skill. Both conclusions are recommendations pending retoor, not decisions (their Decided by field says so). Two existing dossiers (`cap-core-v1`, `cap-profile-coding-v1`) were forward-corrected with model-handling findings. Carried gaps: Claude Code sub-agent and skills pages read only to character 100000; advisor benefit rests on one unverified transcript; the A2A searches found no model metadata field; CAP STATUS and the OpenAI handoffs page were not re-read. Nothing built. | | 2026-10-25 | `background-work-limits` | Extended with 46 sources (5 Tier 1 / 41 Tier 2) + 2 conclusions (`sub-agent-panels-on-the-multiplexer`, `sub-agent-supervision-and-collection`), from 8 searches and 6 fetches on how parallel agents are shown, scheduled, timed out, monitored and how their results are collected (Claude Code agent teams, Temporal activity timeouts, the claim-check pattern, Celery worker limits, tmux layouts, Kubernetes termination, terminal streaming, parallel-agent dashboards). Implemented the same session in taicpp (feed panes, `src/orch/`, supervision, CAP collection) and verified live. Carried gaps: the Kubernetes pod lifecycle page was opened but its termination and probe sections were not returned, so it is a Tier 2 card and its numbers are unverified; the tmux manual was read to character 100000 of 278260 (options unread); the 60 s and 300 s idle limits are static judgments, not measurements. | | 2026-10-27 | `whatsapp-automation` | New subject: 70 sources (9 Tier 1 / 61 Tier 2) + 3 conclusions, from 12 searches, 9 repositories shallow-cloned and read (whatsmeow, libsignal-protocol-go, wa-go, Baileys, neonize, whatsapp-rust, whatsapp-mcp, yowsup, libsignal-protocol-c), line counts and GitHub API activity measured, and one live check (libcurl got 101 from wss://web.whatsapp.com/ws/chat). Mirror and language copies of one page are logged as one card each, with every URL named in the card. Decisions: no native Python library exists and no browser is needed; native C++ `detz::wa` transpiled from wa-go (MIT) with whatsmeow (MPL-2.0) as referee and GPL-3.0 libsignal avoided; whatsapp-mcp through detz's MCP client as the two-day shortcut. Specified in taicpp/docs/whatsapp.md, nothing built. Carried gaps: an unpaired whatsmeow QR probe was refused by the session permission classifier, so the full handshake is unverified here; XEdDSA implementation, LID addressing, client-version policy and ban behaviour are open deep-research items. | +| 2026-10-27 | `terminal-screenshot-rendering` | New subject: 99 sources (10 Tier 1 / 89 Tier 2) + 2 conclusions, from 12 searches, 5 page fetches, the Spleen BDF and LICENSE download, 3 source files read in the cloned Baileys, whatsmeow and whatsapp-rust repositories, the local console-setup font copyright file, and live tmux 3.6 captures. Mirror and version copies of one page are one card each, with the URL count in the card title. Decisions: render in-process (capture-pane -e -p -N, TuiVtScreen, embedded Spleen 8x16 BSD-2, zlib PNG); send as image/png, no JPEG encoder. Implemented in taicpp (src/termshot/, terminal_screenshot tool, tests/termshot_test.cpp, docs/termshot.md) and verified with a real model calling the tool. Carried gaps: glyphs outside Spleen render as '?', wide characters take one column, the native plexer path and a live WhatsApp send of image/png are unverified. | ## How to use this index diff --git a/research/terminal-screenshot-rendering/algolia-docsearch-freeze.md b/research/terminal-screenshot-rendering/algolia-docsearch-freeze.md new file mode 100644 index 0000000..5ce4419 --- /dev/null +++ b/research/terminal-screenshot-rendering/algolia-docsearch-freeze.md @@ -0,0 +1,28 @@ +# docsearch MCP charmbracelet/freeze docs + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | docsearch MCP charmbracelet/freeze docs | +| Source URL | https://docsearch.algolia.com/mcp/docs/repo/charmbracelet/freeze | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; docs index. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/algolia-docsearch-termshot.md b/research/terminal-screenshot-rendering/algolia-docsearch-termshot.md new file mode 100644 index 0000000..3a80a49 --- /dev/null +++ b/research/terminal-screenshot-rendering/algolia-docsearch-termshot.md @@ -0,0 +1,28 @@ +# docsearch MCP homeport/termshot docs + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | docsearch MCP homeport/termshot docs | +| Source URL | https://docsearch.algolia.com/mcp/docs/repo/homeport/termshot | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot search; docs index. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/alternativeto-textimg.md b/research/terminal-screenshot-rendering/alternativeto-textimg.md new file mode 100644 index 0000000..e15bcd8 --- /dev/null +++ b/research/terminal-screenshot-rendering/alternativeto-textimg.md @@ -0,0 +1,28 @@ +# textimg on AlternativeTo + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | textimg on AlternativeTo | +| Source URL | https://alternativeto.net/software/textimg/about | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +textimg search; listing. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/altlinux-fonts-bitmap-spleen.md b/research/terminal-screenshot-rendering/altlinux-fonts-bitmap-spleen.md new file mode 100644 index 0000000..83b9364 --- /dev/null +++ b/research/terminal-screenshot-rendering/altlinux-fonts-bitmap-spleen.md @@ -0,0 +1,28 @@ +# fonts-bitmap-spleen on ALT Linux + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | fonts-bitmap-spleen on ALT Linux | +| Source URL | https://packages.altlinux.org/en/sisyphus_e2k/srpms/fonts-bitmap-spleen/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; package. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/aminet-aha-readme.md b/research/terminal-screenshot-rendering/aminet-aha-readme.md new file mode 100644 index 0000000..454574b --- /dev/null +++ b/research/terminal-screenshot-rendering/aminet-aha-readme.md @@ -0,0 +1,28 @@ +# Ansi HTML Adapter readme on Aminet + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Ansi HTML Adapter readme on Aminet | +| Source URL | https://se.aminet.net/text/misc/aha.readme | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +aha search; readme. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/amitkoth-terminal-screenshots-automated.md b/research/terminal-screenshot-rendering/amitkoth-terminal-screenshots-automated.md new file mode 100644 index 0000000..46c98cc --- /dev/null +++ b/research/terminal-screenshot-rendering/amitkoth-terminal-screenshots-automated.md @@ -0,0 +1,28 @@ +# Automated terminal screenshots and videos + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Automated terminal screenshots and videos | +| Source URL | https://amitkoth.com/terminal-screenshots-videos-automated/ | +| Source type | blog post | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot search; blog survey. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/archwiki-tmux-ru.md b/research/terminal-screenshot-rendering/archwiki-tmux-ru.md new file mode 100644 index 0000000..4f01480 --- /dev/null +++ b/research/terminal-screenshot-rendering/archwiki-tmux-ru.md @@ -0,0 +1,28 @@ +# Tmux (Russian) on the Arch wiki + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Tmux (Russian) on the Arch wiki | +| Source URL | https://wiki.archlinux.org/title/Tmux_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; wiki. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/asciinema-docs-agg.md b/research/terminal-screenshot-rendering/asciinema-docs-agg.md new file mode 100644 index 0000000..54c7665 --- /dev/null +++ b/research/terminal-screenshot-rendering/asciinema-docs-agg.md @@ -0,0 +1,28 @@ +# asciinema agg manual (2 URLs incl. usage) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | asciinema agg manual (2 URLs incl. usage) | +| Source URL | https://docs.asciinema.org/manual/agg/ | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; fonts not included, looked up in /usr/share/fonts. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/aur-textimg.md b/research/terminal-screenshot-rendering/aur-textimg.md new file mode 100644 index 0000000..919d13f --- /dev/null +++ b/research/terminal-screenshot-rendering/aur-textimg.md @@ -0,0 +1,28 @@ +# textimg AUR package + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | textimg AUR package | +| Source URL | https://aur.archlinux.org/packages/textimg | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +textimg search; version 3.1.9. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/baileys-messages-ts-mimetype-map.md b/research/terminal-screenshot-rendering/baileys-messages-ts-mimetype-map.md new file mode 100644 index 0000000..0716718 --- /dev/null +++ b/research/terminal-screenshot-rendering/baileys-messages-ts-mimetype-map.md @@ -0,0 +1,47 @@ +# Baileys src/Utils/messages.ts MIMETYPE_MAP + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | Baileys src/Utils/messages.ts MIMETYPE_MAP | +| Source URL | https://github.com/WhiskeySockets/Baileys/blob/master/src/Utils/messages.ts | +| Source publisher / author | WhiskeySockets | +| Source type | repository | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | High | +| Status | Active | + +## Summary + +Baileys falls back to image/jpeg only when the caller gives no mimetype; it does not sniff or transcode the bytes. Read in the cloned repository. + +## Key findings + +- MIMETYPE_MAP image: 'image/jpeg'; applied only `if (!uploadData.mimetype)`. +- Thumbnails generated with jimp as JPEG quality 50 (messages-media.ts) when the optional dependency is present. + +## Pros / strengths + +Shows JPEG is a default, not a protocol requirement. + +## Cons / limitations / caveats + +Does not prove the WhatsApp apps render image/png; that is inferred from whatsmeow's example. + +## Relevance to tai + +Supports PNG; also shows thumbnails are optional and JPEG. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/boddie-vgapic32-copying.md b/research/terminal-screenshot-rendering/boddie-vgapic32-copying.md new file mode 100644 index 0000000..f9523d7 --- /dev/null +++ b/research/terminal-screenshot-rendering/boddie-vgapic32-copying.md @@ -0,0 +1,28 @@ +# VGAPIC32 COPYING.txt (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | VGAPIC32 COPYING.txt (2 URLs) | +| Source URL | https://hg.boddie.org.uk/VGAPIC32/file/1497c26c2e4c/docs/COPYING.txt | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; license copy in a third-party project. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/brokenco-silicon.md b/research/terminal-screenshot-rendering/brokenco-silicon.md new file mode 100644 index 0000000..87ad779 --- /dev/null +++ b/research/terminal-screenshot-rendering/brokenco-silicon.md @@ -0,0 +1,28 @@ +# silicon mirror on git.brokenco.de (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | silicon mirror on git.brokenco.de (2 URLs) | +| Source URL | https://git.brokenco.de/tools/silicon/raw/branch/master/README.md | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +silicon search; README mirror. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/codegraph-fonts-spleen.md b/research/terminal-screenshot-rendering/codegraph-fonts-spleen.md new file mode 100644 index 0000000..2ef561a --- /dev/null +++ b/research/terminal-screenshot-rendering/codegraph-fonts-spleen.md @@ -0,0 +1,28 @@ +# fonts-spleen 2.2.0-5 on codegraph + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | fonts-spleen 2.2.0-5 on codegraph | +| Source URL | https://codegraph.jelmer.uk/fonts-spleen/2.2.0-5/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; Debian package listing. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/conclusions/in-process-terminal-png.md b/research/terminal-screenshot-rendering/conclusions/in-process-terminal-png.md new file mode 100644 index 0000000..d34a618 --- /dev/null +++ b/research/terminal-screenshot-rendering/conclusions/in-process-terminal-png.md @@ -0,0 +1,50 @@ +# Conclusion: Render terminal screenshots in-process: tmux escapes, TuiVtScreen, embedded Spleen, zlib PNG + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Conclusion | +| Tier | N/A | +| Date decided | 2026-10-27 | +| Decided by | retoor, advised by tai (agent, Claude Opus 5.5) | +| Status | Active | +| Confidence | High | + +## Question / problem statement + +How should detz make a picture of the current terminal on a headless server (no desktop, no X, often no fonts), so it can be described or sent as an image? + +## Conclusion + +Capture the visible pane with `tmux capture-pane -e -p -N` plus `display-message` for size and cursor (or the tail of the native multiplexer pane log), replay it through the existing `detz::tui::TuiVtScreen`, paint each cell with the embedded Spleen 8x16 bitmap font (BSD 2-Clause, 1001 glyphs, generated into src/termshot/termshot_font_data.cpp) and the xterm 256-color palette, and encode an RGB PNG with zlib, which detz already links. No new dependency, no system font, no browser, no external binary. + +## Supporting sources + +- [local-tmux-3-6-capture-pane](../local-tmux-3-6-capture-pane.md): capture command and live proof (two panes rendered and inspected). +- [github-fcambus-spleen](../github-fcambus-spleen.md): font, license, coverage, measured BDF metrics. +- [github-charmbracelet-freeze](../github-charmbracelet-freeze.md): same capture-pane -e input pattern. +- [github-homeport-termshot](../github-homeport-termshot.md): line-by-line SGR parsing breaks on cursor movement, so replay through a VT screen. +- [github-jiro4989-textimg](../github-jiro4989-textimg.md): system-font dependency to avoid. +- [debian-manpages-libansilove](../debian-manpages-libansilove.md): C prior art with embedded bitmap fonts. +- [local-console-setup-font-copyright](../local-console-setup-font-copyright.md): Terminus locally available as fallback, OFL reserved name. + +## Alternatives considered and rejected + +freeze, termshot, textimg, silicon, agg: external Go/Rust binaries needing outline or system fonts. aha: HTML only, needs a browser to become a picture. libansilove: artscene formats and CP437, not a live UTF-8 truecolor grid. Terminus Font: locally present but OFL Reserved Font Name complicates a converted copy, kept as fallback. GNU Unifont: full coverage but 16x16 double-width glyphs and a much larger table; rejected for size. + +## Risks / open questions + +Glyphs outside Spleen (CJK, many symbols such as U+276F) render as '?'; wide characters take one column (TuiVtScreen gap). The native plexer path replays the log tail into a default 160x50 screen and was not verified live. + +## Action taken + +Implemented: src/termshot/ (TermshotFont, TermshotPalette, TermshotCanvas, TermshotPng, TermshotCapture, TermshotRenderer, TermshotShooter), tool terminal_screenshot via src/agent/detz_tools.*, tests/termshot_test.cpp, docs/termshot.md; verified live with a real model calling the tool. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial conclusion recorded. | diff --git a/research/terminal-screenshot-rendering/conclusions/whatsapp-image-as-png.md b/research/terminal-screenshot-rendering/conclusions/whatsapp-image-as-png.md new file mode 100644 index 0000000..ebce540 --- /dev/null +++ b/research/terminal-screenshot-rendering/conclusions/whatsapp-image-as-png.md @@ -0,0 +1,46 @@ +# Conclusion: Send terminal screenshots to WhatsApp as image/png, no JPEG encoder + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Conclusion | +| Tier | N/A | +| Date decided | 2026-10-27 | +| Decided by | retoor, advised by tai (agent, Claude Opus 5.5) | +| Status | Active | +| Confidence | Medium | + +## Question / problem statement + +Does a WhatsApp imageMessage need JPEG bytes, or can detz send its PNG directly? + +## Conclusion + +Send the PNG bytes as an imageMessage with mimetype image/png. whatsmeow's own Upload example uses `Mimetype: "image/png"`; Baileys and whatsapp-rust only default to image/jpeg when the caller names nothing and never transcode. The JpegThumbnail field is optional and JPEG; leave it out for now. Add a baseline JPEG encoder only if a live send shows phones refuse image/png. + +## Supporting sources + +- [whatsmeow-upload-go-image-example](../whatsmeow-upload-go-image-example.md): image/png in the reference usage. +- [baileys-messages-ts-mimetype-map](../baileys-messages-ts-mimetype-map.md): jpeg is only a default; thumbnail is optional. +- [whatsapp-rust-media-rs-mimetype](../whatsapp-rust-media-rs-mimetype.md): same default pattern. + +## Alternatives considered and rejected + +Write a JPEG encoder now: about 300 lines for a benefit no source demands. Send as a document: works for any bytes but shows as a file, not a picture. + +## Risks / open questions + +Not verified with a live send from this session (no linked phone). Without a thumbnail the chat may show an empty preview until the image downloads. + +## Action taken + +TermshotShot::summary() reports image/png; the WhatsApp module (parent session) sends with that mimetype. No JPEG encoder built. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial conclusion recorded. | diff --git a/research/terminal-screenshot-rendering/cran-hexfont-readme.md b/research/terminal-screenshot-rendering/cran-hexfont-readme.md new file mode 100644 index 0000000..f94c3fc --- /dev/null +++ b/research/terminal-screenshot-rendering/cran-hexfont-readme.md @@ -0,0 +1,28 @@ +# hexfont README on CRAN + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | hexfont README on CRAN | +| Source URL | https://ftp.fau.de/cran/web/packages/hexfont/readme/README.html | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; R package bundling Unifont hex. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/debian-aha.md b/research/terminal-screenshot-rendering/debian-aha.md new file mode 100644 index 0000000..6c07f3a --- /dev/null +++ b/research/terminal-screenshot-rendering/debian-aha.md @@ -0,0 +1,28 @@ +# aha on Debian (3 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | aha on Debian (3 URLs) | +| Source URL | https://packages.debian.org/zh-cn/sid/ppc64el/aha | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +aha search; package 0.5.1. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/debian-manpages-libansilove.md b/research/terminal-screenshot-rendering/debian-manpages-libansilove.md new file mode 100644 index 0000000..2bacb93 --- /dev/null +++ b/research/terminal-screenshot-rendering/debian-manpages-libansilove.md @@ -0,0 +1,48 @@ +# libansilove(3) manual page (Debian unstable) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | libansilove(3) manual page (Debian unstable) | +| Source URL | https://manpages.debian.org/unstable/libansilove-dev/libansilove.3.en.html | +| Source publisher / author | Stefan Vogt, Brian Cassidy, Frederic Cambus | +| Source type | vendor docs | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | Medium | +| Status | Active | + +## Summary + +libansilove is a C library converting ANS, PCB, BIN, ADF, IDF, TND and XB art files to size-optimized 4-bit PNGs with embedded PC and Amiga fonts. + +## Key findings + +- Options struct fields: diz, dos, icecolors, truecolor, columns, font, bits, mode, scale_factor. +- Supports 80x25 and 80x50 PC fonts, all 14 MS-DOS charsets, Amiga fonts, iCE colors. +- Search listings (pkgsrc) state version 1.4.0 added Spleen 8x16 font data. + +## Pros / strengths + +Closest prior art in C with embedded bitmap fonts, and it chose Spleen too. + +## Cons / limitations / caveats + +Targets artscene files (CP437), not a live terminal grid with UTF-8 and 256/truecolor; license and libgd dependency not stated on the page. + +## Relevance to tai + +Rejected as a dependency; corroborates embedding Spleen bitmap data. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/debian-sources-ansilove-readme.md b/research/terminal-screenshot-rendering/debian-sources-ansilove-readme.md new file mode 100644 index 0000000..293c9ca --- /dev/null +++ b/research/terminal-screenshot-rendering/debian-sources-ansilove-readme.md @@ -0,0 +1,28 @@ +# ansilove 4.2.1 README on sources.debian.org + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | ansilove 4.2.1 README on sources.debian.org | +| Source URL | https://sources.debian.org/src/ansilove/4.2.1-1/README.md | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; CLI README. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/debian-xfonts-terminus-copyright.md b/research/terminal-screenshot-rendering/debian-xfonts-terminus-copyright.md new file mode 100644 index 0000000..4a5d6b6 --- /dev/null +++ b/research/terminal-screenshot-rendering/debian-xfonts-terminus-copyright.md @@ -0,0 +1,28 @@ +# xfonts-terminus 4.48-3 copyright + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | xfonts-terminus 4.48-3 copyright | +| Source URL | https://metadata.ftp-master.debian.org/changelogs//main/x/xfonts-terminus/xfonts-terminus_4.48-3_copyright | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; distribute as Terminus Font. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/dockerhub-kayvan-agg.md b/research/terminal-screenshot-rendering/dockerhub-kayvan-agg.md new file mode 100644 index 0000000..b53b242 --- /dev/null +++ b/research/terminal-screenshot-rendering/dockerhub-kayvan-agg.md @@ -0,0 +1,28 @@ +# kayvan/agg Docker image + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | kayvan/agg Docker image | +| Source URL | https://hub.docker.com/r/kayvan/agg | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; container image. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/docsrs-ansee.md b/research/terminal-screenshot-rendering/docsrs-ansee.md new file mode 100644 index 0000000..c4a6315 --- /dev/null +++ b/research/terminal-screenshot-rendering/docsrs-ansee.md @@ -0,0 +1,28 @@ +# ansee 0.1.1 on docs.rs + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | ansee 0.1.1 on docs.rs | +| Source URL | https://docs.rs/crate/ansee/0.1.1 | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +textimg search; Rust ANSI to PNG CLI. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/docsrs-silicon.md b/research/terminal-screenshot-rendering/docsrs-silicon.md new file mode 100644 index 0000000..bdfb83f --- /dev/null +++ b/research/terminal-screenshot-rendering/docsrs-silicon.md @@ -0,0 +1,28 @@ +# silicon on docs.rs (4 version URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | silicon on docs.rs (4 version URLs) | +| Source URL | https://docs.rs/crate/silicon/0.4.3 | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +silicon search; Rust crate, code images not terminal grids. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/docsrs-unifont-bitmap.md b/research/terminal-screenshot-rendering/docsrs-unifont-bitmap.md new file mode 100644 index 0000000..e2f0bc9 --- /dev/null +++ b/research/terminal-screenshot-rendering/docsrs-unifont-bitmap.md @@ -0,0 +1,28 @@ +# unifont-bitmap crate + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | unifont-bitmap crate | +| Source URL | https://docs.rs/unifont-bitmap/^1.0.0 | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; Rust crate embedding Unifont bitmaps. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/dragonflybsd-libansilove-pkg-descr.md b/research/terminal-screenshot-rendering/dragonflybsd-libansilove-pkg-descr.md new file mode 100644 index 0000000..2e5772c --- /dev/null +++ b/research/terminal-screenshot-rendering/dragonflybsd-libansilove-pkg-descr.md @@ -0,0 +1,28 @@ +# DragonFly dports libansilove pkg-descr + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | DragonFly dports libansilove pkg-descr | +| Source URL | https://gitweb.dragonflybsd.org/dports.git/blob/1c74b6dfa590a766cf15368f4ce18571244ca252:/graphics/libansilove/pkg-descr | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; package description. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/dragonflybsd-xref-spleen.md b/research/terminal-screenshot-rendering/dragonflybsd-xref-spleen.md new file mode 100644 index 0000000..3fd71fe --- /dev/null +++ b/research/terminal-screenshot-rendering/dragonflybsd-xref-spleen.md @@ -0,0 +1,28 @@ +# DragonFly xref freebsd/contrib/spleen (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | DragonFly xref freebsd/contrib/spleen (2 URLs) | +| Source URL | https://grok.dragonflybsd.org/xref/freebsd/contrib/spleen/ | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; FreeBSD ships Spleen in contrib. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/dtiki-terminusv.md b/research/terminal-screenshot-rendering/dtiki-terminusv.md new file mode 100644 index 0000000..6e8f402 --- /dev/null +++ b/research/terminal-screenshot-rendering/dtiki-terminusv.md @@ -0,0 +1,28 @@ +# Terminus variant notes + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Terminus variant notes | +| Source URL | https://dt.iki.fi/terminusv | +| Source type | blog post | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; variant. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/dzx-ansi-terminal-to-html.md b/research/terminal-screenshot-rendering/dzx-ansi-terminal-to-html.md new file mode 100644 index 0000000..0c4bdcd --- /dev/null +++ b/research/terminal-screenshot-rendering/dzx-ansi-terminal-to-html.md @@ -0,0 +1,28 @@ +# How to convert ANSI terminal content to HTML + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | How to convert ANSI terminal content to HTML | +| Source URL | https://dzx.fr/blog/how-to-convert-ansi-terminal-content-to-html | +| Source type | blog post | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; capture-pane -e -p -t into a file. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/ecosystems-awesome-952431.md b/research/terminal-screenshot-rendering/ecosystems-awesome-952431.md new file mode 100644 index 0000000..db1e96a --- /dev/null +++ b/research/terminal-screenshot-rendering/ecosystems-awesome-952431.md @@ -0,0 +1,28 @@ +# Ecosyste.ms Awesome project 952431 + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Ecosyste.ms Awesome project 952431 | +| Source URL | https://awesome.ecosyste.ms/projects/952431 | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot search; listing. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/ecosystems-tmux-view-el.md b/research/terminal-screenshot-rendering/ecosystems-tmux-view-el.md new file mode 100644 index 0000000..3b4ce7c --- /dev/null +++ b/research/terminal-screenshot-rendering/ecosystems-tmux-view-el.md @@ -0,0 +1,28 @@ +# mgalgs/tmux-view.el + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | mgalgs/tmux-view.el | +| Source URL | https://awesome.ecosyste.ms/projects/github.com%2Fmgalgs%2Ftmux-view.el | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; uses capture-pane -e -p -S -. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/espressif-idfxx-font-spleen.md b/research/terminal-screenshot-rendering/espressif-idfxx-font-spleen.md new file mode 100644 index 0000000..7c0e93f --- /dev/null +++ b/research/terminal-screenshot-rendering/espressif-idfxx-font-spleen.md @@ -0,0 +1,28 @@ +# idfxx_font_spleen ESP-IDF component + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | idfxx_font_spleen ESP-IDF component | +| Source URL | https://components.espressif.com/components/cleishm/idfxx_font_spleen/versions/1.0.0/readme | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; embeds Spleen 8x16 in firmware under BSD-2-Clause. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/fontsquirrel-ofl.md b/research/terminal-screenshot-rendering/fontsquirrel-ofl.md new file mode 100644 index 0000000..aa13aac --- /dev/null +++ b/research/terminal-screenshot-rendering/fontsquirrel-ofl.md @@ -0,0 +1,28 @@ +# SIL Open Font License v1.10 on Font Squirrel + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | SIL Open Font License v1.10 on Font Squirrel | +| Source URL | https://www.fontsquirrel.com/fonts/sansation | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; OFL text copy. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/freebsd-cgit-spleen-readme.md b/research/terminal-screenshot-rendering/freebsd-cgit-spleen-readme.md new file mode 100644 index 0000000..4ea9523 --- /dev/null +++ b/research/terminal-screenshot-rendering/freebsd-cgit-spleen-readme.md @@ -0,0 +1,28 @@ +# FreeBSD contrib/spleen README + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | FreeBSD contrib/spleen README | +| Source URL | https://cgit-dev.freebsd.org/src/plain/contrib/spleen/README.md | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; README copy. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/freebsd-reviews-termshot.md b/research/terminal-screenshot-rendering/freebsd-reviews-termshot.md new file mode 100644 index 0000000..5220f45 --- /dev/null +++ b/research/terminal-screenshot-rendering/freebsd-reviews-termshot.md @@ -0,0 +1,28 @@ +# textproc/termshot FreeBSD review + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | textproc/termshot FreeBSD review | +| Source URL | https://reviews-dev.freebsd.org/R11:cbae2daa140c2a002eb60df93d67dbfe0ee0cfc3 | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot search; port review. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/freshports-spleen.md b/research/terminal-screenshot-rendering/freshports-spleen.md new file mode 100644 index 0000000..1f70bbd --- /dev/null +++ b/research/terminal-screenshot-rendering/freshports-spleen.md @@ -0,0 +1,28 @@ +# x11-fonts/spleen on FreshPorts + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | x11-fonts/spleen on FreshPorts | +| Source URL | https://freshports.org/x11-fonts/spleen/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; port 2.2.0 ships LICENSE. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/gentoo-aha.md b/research/terminal-screenshot-rendering/gentoo-aha.md new file mode 100644 index 0000000..2178a5b --- /dev/null +++ b/research/terminal-screenshot-rendering/gentoo-aha.md @@ -0,0 +1,28 @@ +# app-text/aha on Gentoo + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | app-text/aha on Gentoo | +| Source URL | https://packages.gentoo.org/package/app-text/aha | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +aha search; package. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/gentoo-unifont-ebuild.md b/research/terminal-screenshot-rendering/gentoo-unifont-ebuild.md new file mode 100644 index 0000000..edf4487 --- /dev/null +++ b/research/terminal-screenshot-rendering/gentoo-unifont-ebuild.md @@ -0,0 +1,28 @@ +# unifont 17.0.05 ebuild (2 mirror URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | unifont 17.0.05 ebuild (2 mirror URLs) | +| Source URL | https://whiteoak.umd.edu/gentoo-portage/media-fonts/unifont/unifont-17.0.05.ebuild | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; version 17.0.05. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/gitee-silicon.md b/research/terminal-screenshot-rendering/gitee-silicon.md new file mode 100644 index 0000000..96cfe26 --- /dev/null +++ b/research/terminal-screenshot-rendering/gitee-silicon.md @@ -0,0 +1,28 @@ +# aicoder1/silicon on Gitee + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | aicoder1/silicon on Gitee | +| Source URL | https://gitee.com/aicoder1/silicon | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +silicon search; mirror. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-alejandrosuero-freeze.md b/research/terminal-screenshot-rendering/github-alejandrosuero-freeze.md new file mode 100644 index 0000000..f86b778 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-alejandrosuero-freeze.md @@ -0,0 +1,28 @@ +# AlejandroSuero/freeze + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | AlejandroSuero/freeze | +| Source URL | https://github.com/AlejandroSuero/freeze | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; fork. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-asciinema-agg.md b/research/terminal-screenshot-rendering/github-asciinema-agg.md new file mode 100644 index 0000000..91786ea --- /dev/null +++ b/research/terminal-screenshot-rendering/github-asciinema-agg.md @@ -0,0 +1,28 @@ +# asciinema/agg + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | asciinema/agg | +| Source URL | https://github.com/asciinema/agg | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; GIF generator using gifski. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-b0r3dd3v-spleen.md b/research/terminal-screenshot-rendering/github-b0r3dd3v-spleen.md new file mode 100644 index 0000000..38bc11f --- /dev/null +++ b/research/terminal-screenshot-rendering/github-b0r3dd3v-spleen.md @@ -0,0 +1,28 @@ +# b0r3dd3v/spleen + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | b0r3dd3v/spleen | +| Source URL | https://github.com/b0r3dd3v/spleen | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; fork. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-badexception-agg.md b/research/terminal-screenshot-rendering/github-badexception-agg.md new file mode 100644 index 0000000..c7dc2c4 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-badexception-agg.md @@ -0,0 +1,28 @@ +# badexception/agg + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | badexception/agg | +| Source URL | https://github.com/badexception/agg | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; fork. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-byteproject-ansilove-c.md b/research/terminal-screenshot-rendering/github-byteproject-ansilove-c.md new file mode 100644 index 0000000..f24e793 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-byteproject-ansilove-c.md @@ -0,0 +1,28 @@ +# AnsiLove-C README + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | AnsiLove-C README | +| Source URL | https://github.com/ByteProject/AnsiLove-C/blob/master/README.md | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; says DOS and Amiga fonts are embedded binary dumps. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-ccoveille-freeze.md b/research/terminal-screenshot-rendering/github-ccoveille-freeze.md new file mode 100644 index 0000000..c21cb1c --- /dev/null +++ b/research/terminal-screenshot-rendering/github-ccoveille-freeze.md @@ -0,0 +1,28 @@ +# ccoveille/freeze + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | ccoveille/freeze | +| Source URL | https://github.com/ccoveille/freeze | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; fork. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-charmbracelet-freeze.md b/research/terminal-screenshot-rendering/github-charmbracelet-freeze.md new file mode 100644 index 0000000..26d95b7 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-charmbracelet-freeze.md @@ -0,0 +1,49 @@ +# charmbracelet/freeze README + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | charmbracelet/freeze README | +| Source URL | https://github.com/charmbracelet/freeze | +| Source publisher / author | Charmbracelet | +| Source type | repository | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | Medium | +| Status | Active | + +## Summary + +Freeze is a Go CLI that turns code and terminal output into SVG, PNG or WebP images. The README documents capturing ANSI output with `--execute` and piping `tmux capture-pane -pet 1 | freeze -c full`; it does not explain how PNG rasterization works. + +## Key findings + +- Captures ANSI output with `--execute "cmd"`; TUI example `tmux capture-pane -pet 1 | freeze -c full`. +- Output format follows the file extension: .svg, .png, .webp; default out.svg. +- Default font JetBrains Mono 14 px, line height 1.2; `--font.file` embeds a TTF/WOFF/WOFF2 into the SVG. +- MIT license; repository contains ansi.go, font.go, png.go (not read). + +## Pros / strengths + +Confirms the industry pattern this design copies: tmux capture-pane with escapes as the input. + +## Cons / limitations / caveats + +README only; PNG pipeline and whether a system font or rasterizer library is required were not stated. A Go binary dependency for detz. + +## Relevance to tai + +Rejected as a dependency (external Go binary, outline fonts); its `capture-pane -pet` input pattern was adopted. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/github-fcambus-spleen.md b/research/terminal-screenshot-rendering/github-fcambus-spleen.md new file mode 100644 index 0000000..678f3d1 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-fcambus-spleen.md @@ -0,0 +1,49 @@ +# fcambus/spleen README, LICENSE and spleen-8x16.bdf + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | fcambus/spleen README, LICENSE and spleen-8x16.bdf | +| Source URL | https://github.com/fcambus/spleen | +| Source publisher / author | Frederic Cambus | +| Source type | repository | +| Source date (published) | 2026-06-14 (Last Updated in spleen-8x16.bdf header, version 2.2.0) | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | both | +| Confidence | High | +| Status | Active | + +## Summary + +Spleen is a monospaced bitmap font in six sizes under BSD 2-Clause. The 8x16 BDF was downloaded and parsed: 1001 glyphs, every one a full 8x16 cell. + +## Key findings + +- Sizes 5x8, 6x12, 8x16, 12x24, 16x32, 32x64; BSD 2-Clause (LICENSE fetched, reproduced in the generated source). +- 8x16 covers Basic Latin, Latin-1, Latin Extended-A, Box Drawing, Block Elements, Braille Patterns, full CP437. +- spleen-8x16.bdf 2.2.0: FONTBOUNDINGBOX 8 16 0 -4, FONT_ASCENT 12, FONT_DESCENT 4, 1001 STARTCHAR entries, all BBX 8 16 0 -4 (measured). +- No U+FFFD glyph and no CJK (measured via the generated table). + +## Pros / strengths + +Permissive, small (16 KB as C++ data), and covers what TUIs draw: box drawing, blocks, braille spinners. + +## Cons / limitations / caveats + +No CJK, Greek or Cyrillic beyond what Latin Extended-A gives; symbols like U+276F or U+23F5 fall back to '?' (seen in the live capture). + +## Relevance to tai + +Chosen as the embedded font (src/termshot/termshot_font_data.cpp). + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/github-homeport-termshot.md b/research/terminal-screenshot-rendering/github-homeport-termshot.md new file mode 100644 index 0000000..3323abb --- /dev/null +++ b/research/terminal-screenshot-rendering/github-homeport-termshot.md @@ -0,0 +1,48 @@ +# homeport/termshot README + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | homeport/termshot README | +| Source URL | https://github.com/homeport/termshot | +| Source publisher / author | homeport | +| Source type | repository | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | Medium | +| Status | Active | + +## Summary + +termshot runs a command in a pseudo terminal and renders the ANSI output into a PNG that looks like a terminal window; `--raw-read` takes existing output from a file. + +## Key findings + +- Default output out.png; `--raw-read ` reads captured output instead of running a command; `--raw-write` saves raw output. +- Self-described work in progress; commands that reset the cursor position are known to cause issues. +- MIT license. + +## Pros / strengths + +Shows that a plain ANSI stream replayed through a renderer is enough for a useful picture. + +## Cons / limitations / caveats + +Font handling and PNG library not stated on the page; cursor-moving programs break it, which a real VT screen (TuiVtScreen) avoids. + +## Relevance to tai + +Rejected as a dependency; its failure mode on cursor movement is why detz replays through a full VT screen rather than parsing SGR line by line. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/github-jiro4989-textimg.md b/research/terminal-screenshot-rendering/github-jiro4989-textimg.md new file mode 100644 index 0000000..32401ea --- /dev/null +++ b/research/terminal-screenshot-rendering/github-jiro4989-textimg.md @@ -0,0 +1,48 @@ +# jiro4989/textimg README + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | jiro4989/textimg README | +| Source URL | https://github.com/jiro4989/textimg | +| Source publisher / author | jiro4989 | +| Source type | repository | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | Medium | +| Status | Active | + +## Summary + +textimg converts ANSI or 256-color text to PNG, JPG or GIF, using a system CJK font chosen per OS. + +## Key findings + +- Default font on Linux `/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc`; override with TEXTIMG_FONT_FILE or -f. +- Supports 8, 256 and 24-bit SGR colors; PNG default; animated GIF option. +- Emoji need extra image files or an emoji font; not tested on Windows; MIT. + +## Pros / strengths + +Clear statement of color support levels a renderer must cover. + +## Cons / limitations / caveats + +Depends on a system font that a headless server usually lacks; external Go binary. + +## Relevance to tai + +Rejected; its system-font dependency is the exact failure an embedded bitmap font avoids. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/github-libtmux-capture-pane-escape.md b/research/terminal-screenshot-rendering/github-libtmux-capture-pane-escape.md new file mode 100644 index 0000000..f0b5701 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-libtmux-capture-pane-escape.md @@ -0,0 +1,28 @@ +# libtmux commits adding escape_sequences to capture_pane (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | libtmux commits adding escape_sequences to capture_pane (2 URLs) | +| Source URL | https://github.com/tmux-python/libtmux/commit/7fca5805fb5acdca69f29ba8e909bcad6189627e | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; maps escape_sequences=True to -e. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-nerfur-spleen.md b/research/terminal-screenshot-rendering/github-nerfur-spleen.md new file mode 100644 index 0000000..1d4fdc6 --- /dev/null +++ b/research/terminal-screenshot-rendering/github-nerfur-spleen.md @@ -0,0 +1,28 @@ +# nerfur/spleen + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | nerfur/spleen | +| Source URL | https://github.com/nerfur/spleen | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; fork. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/github-samb-debian-unifont.md b/research/terminal-screenshot-rendering/github-samb-debian-unifont.md new file mode 100644 index 0000000..ea77a0d --- /dev/null +++ b/research/terminal-screenshot-rendering/github-samb-debian-unifont.md @@ -0,0 +1,28 @@ +# SamB/debian-unifont + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | SamB/debian-unifont | +| Source URL | https://github-redirect.dependabot.com/SamB/debian-unifont | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; packaging. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/glama-tmux-mcp-capture-pane.md b/research/terminal-screenshot-rendering/glama-tmux-mcp-capture-pane.md new file mode 100644 index 0000000..fa11e7c --- /dev/null +++ b/research/terminal-screenshot-rendering/glama-tmux-mcp-capture-pane.md @@ -0,0 +1,28 @@ +# tmux-mcp capture-pane tool + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | tmux-mcp capture-pane tool | +| Source URL | https://glama.ai/mcp/servers/@nickgnd/tmux-mcp/tools/capture-pane | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; MCP tool. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/guix-font-terminus.md b/research/terminal-screenshot-rendering/guix-font-terminus.md new file mode 100644 index 0000000..709b16b --- /dev/null +++ b/research/terminal-screenshot-rendering/guix-font-terminus.md @@ -0,0 +1,28 @@ +# font-terminus 4.49.1 on Guix + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | font-terminus 4.49.1 on Guix | +| Source URL | https://packages.guix.gnu.org/packages/font-terminus/4.49.1/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; package. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/hexdocs-baileys-ex-media.md b/research/terminal-screenshot-rendering/hexdocs-baileys-ex-media.md new file mode 100644 index 0000000..217d7f6 --- /dev/null +++ b/research/terminal-screenshot-rendering/hexdocs-baileys-ex-media.md @@ -0,0 +1,28 @@ +# baileys_ex Send and Download Media + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | baileys_ex Send and Download Media | +| Source URL | https://hexdocs.pm/baileys_ex/media.md | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search; Elixir port docs. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/huggingface-ravenbs1-msg-js.md b/research/terminal-screenshot-rendering/huggingface-ravenbs1-msg-js.md new file mode 100644 index 0000000..ca3c296 --- /dev/null +++ b/research/terminal-screenshot-rendering/huggingface-ravenbs1-msg-js.md @@ -0,0 +1,28 @@ +# ravenbs1/mmm lib/msg.js + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | ravenbs1/mmm lib/msg.js | +| Source URL | https://huggingface.co/spaces/ravenbs1/mmm/blob/main/lib/msg.js | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search; bot code. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/huntedspace-freeze.md b/research/terminal-screenshot-rendering/huntedspace-freeze.md new file mode 100644 index 0000000..c9245e3 --- /dev/null +++ b/research/terminal-screenshot-rendering/huntedspace-freeze.md @@ -0,0 +1,28 @@ +# hunted.space freeze (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | hunted.space freeze (2 URLs) | +| Source URL | https://hunted.space/product/freeze-3 | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; launch statistics pages. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/jsdelivr-mercury-ai-whatsapp-media.md b/research/terminal-screenshot-rendering/jsdelivr-mercury-ai-whatsapp-media.md new file mode 100644 index 0000000..8fb6fa2 --- /dev/null +++ b/research/terminal-screenshot-rendering/jsdelivr-mercury-ai-whatsapp-media.md @@ -0,0 +1,28 @@ +# mercury-ai WhatsApp media handling doc + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | mercury-ai WhatsApp media handling doc | +| Source URL | https://cdn.jsdelivr.net/npm/mercury-ai@0.4.5/docs/media/whatsapp.md | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search; third-party doc. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/kernelsources-spleen-xref.md b/research/terminal-screenshot-rendering/kernelsources-spleen-xref.md new file mode 100644 index 0000000..869ee26 --- /dev/null +++ b/research/terminal-screenshot-rendering/kernelsources-spleen-xref.md @@ -0,0 +1,28 @@ +# kernelsources xref freebsd/contrib/spleen (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | kernelsources xref freebsd/contrib/spleen (2 URLs) | +| Source URL | https://kernelsources.org/source/xref/freebsd/contrib/spleen | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; source browser. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/kernelsources-terminus-ofl.md b/research/terminal-screenshot-rendering/kernelsources-terminus-ofl.md new file mode 100644 index 0000000..ef60ec1 --- /dev/null +++ b/research/terminal-screenshot-rendering/kernelsources-terminus-ofl.md @@ -0,0 +1,28 @@ +# freebsd contrib/terminus OFL.TXT + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | freebsd contrib/terminus OFL.TXT | +| Source URL | https://kernelsources.org/source/xref/freebsd/contrib/terminus/OFL.TXT?a=true | +| Source type | standard | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; OFL text with RFN Terminus Font. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/linuxcommandlibrary-agg.md b/research/terminal-screenshot-rendering/linuxcommandlibrary-agg.md new file mode 100644 index 0000000..c2c6262 --- /dev/null +++ b/research/terminal-screenshot-rendering/linuxcommandlibrary-agg.md @@ -0,0 +1,28 @@ +# agg man page on linuxcommandlibrary + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | agg man page on linuxcommandlibrary | +| Source URL | https://linuxcommandlibrary.com/man/agg | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; quality depends on system fonts. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/linuxcommandlibrary-aha.md b/research/terminal-screenshot-rendering/linuxcommandlibrary-aha.md new file mode 100644 index 0000000..a6f0eaa --- /dev/null +++ b/research/terminal-screenshot-rendering/linuxcommandlibrary-aha.md @@ -0,0 +1,28 @@ +# aha man page on linuxcommandlibrary + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | aha man page on linuxcommandlibrary | +| Source URL | https://linuxcommandlibrary.com/man/aha | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +aha search; man page, HTML output only. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/linuxlinks-freeze.md b/research/terminal-screenshot-rendering/linuxlinks-freeze.md new file mode 100644 index 0000000..639c33f --- /dev/null +++ b/research/terminal-screenshot-rendering/linuxlinks-freeze.md @@ -0,0 +1,28 @@ +# freeze: generate images of code and terminal output + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | freeze: generate images of code and terminal output | +| Source URL | https://www.linuxlinks.com/freeze-generate-images-code-terminal-output/ | +| Source type | blog post | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; review page. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/local-console-setup-font-copyright.md b/research/terminal-screenshot-rendering/local-console-setup-font-copyright.md new file mode 100644 index 0000000..5f49426 --- /dev/null +++ b/research/terminal-screenshot-rendering/local-console-setup-font-copyright.md @@ -0,0 +1,48 @@ +# console-setup-linux copyright.fonts (this machine) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | console-setup-linux copyright.fonts (this machine) | +| Source URL | file:///usr/share/doc/console-setup-linux/copyright.fonts.gz | +| Source publisher / author | Debian console-setup maintainers (Anton Zinoviev) | +| Source type | other | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | High | +| Status | Active | + +## Summary + +The local copyright file of the PSF console fonts installed under /usr/share/consolefonts. Read to see which bitmap fonts are already on the machine and under which terms. + +## Key findings + +- Terminus Font is SIL OFL 1.1 with Reserved Font Name "Terminus Font". +- X11 fixed fonts 7x14, 8x13, 9x15, 9x18 are public domain; 8x16 variants carry a Sony permission notice; unifont.bdf (old) is Czyborra freeware. +- Installed: Uni2-Terminus16.psf.gz and related Uni1/Uni2/Lat15 Terminus and Fixed PSF fonts (directory listing). + +## Pros / strengths + +Ground truth for the fallback option without a download: Terminus 8x16 is present locally. + +## Cons / limitations / caveats + +PSF fonts are a console package, not guaranteed on a minimal server; OFL reserved-name rules complicate a converted copy. + +## Relevance to tai + +Terminus kept as the documented fallback; Spleen chosen for its simpler BSD license and braille coverage. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/local-tmux-3-6-capture-pane.md b/research/terminal-screenshot-rendering/local-tmux-3-6-capture-pane.md new file mode 100644 index 0000000..318b24a --- /dev/null +++ b/research/terminal-screenshot-rendering/local-tmux-3-6-capture-pane.md @@ -0,0 +1,48 @@ +# tmux 3.6 capture-pane on this machine + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | tmux 3.6 capture-pane on this machine | +| Source URL | file:///usr/bin/tmux | +| Source publisher / author | tmux project (installed binary) | +| Source type | other | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | High | +| Status | Active | + +## Summary + +Measured with the installed tmux 3.6: `capture-pane -e -p -N` returns the visible pane with SGR escapes and trailing spaces, `display-message -p` gives pane size and cursor. + +## Key findings + +- `tmux -V` = tmux 3.6; detz's tmux-parity command table lists capture-pane flags `aCeJMNpPqTb:E:S:t:`. +- Live captures of panes %5 and %16 (192x35) rendered into 1560x584 PNGs of 25809 and 22456 bytes; colors, bold, box drawing and the cursor were visible when viewed. +- `#{pane_width} #{pane_height} #{cursor_x} #{cursor_y} #{cursor_flag} #{pane_id}` returned the values used for the frame. + +## Pros / strengths + +Ground truth for the capture step on the machine detz runs on. + +## Cons / limitations / caveats + +One tmux version; -N with -e behavior on older tmux not checked. + +## Relevance to tai + +The capture command of src/termshot/termshot_capture.cpp. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/macports-freeze.md b/research/terminal-screenshot-rendering/macports-freeze.md new file mode 100644 index 0000000..b0e59cd --- /dev/null +++ b/research/terminal-screenshot-rendering/macports-freeze.md @@ -0,0 +1,28 @@ +# MacPorts freeze port + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | MacPorts freeze port | +| Source URL | https://ports.macports.org/api/v1/ports/freeze/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; package metadata. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/mintlify-baileys-downloading-media.md b/research/terminal-screenshot-rendering/mintlify-baileys-downloading-media.md new file mode 100644 index 0000000..fe02bb7 --- /dev/null +++ b/research/terminal-screenshot-rendering/mintlify-baileys-downloading-media.md @@ -0,0 +1,28 @@ +# Baileys downloading media + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Baileys downloading media | +| Source URL | https://www.mintlify.com/whiskeysockets/Baileys/messaging/downloading-media | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/mintlify-baileys-media-messages.md b/research/terminal-screenshot-rendering/mintlify-baileys-media-messages.md new file mode 100644 index 0000000..9790aa8 --- /dev/null +++ b/research/terminal-screenshot-rendering/mintlify-baileys-media-messages.md @@ -0,0 +1,28 @@ +# Baileys media messages docs + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Baileys media messages docs | +| Source URL | https://www.mintlify.com/WhiskeySockets/Baileys/messaging/media-messages | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search; images by buffer, path or URL; one example uses a PNG. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/mintlify-baileys-media-upload.md b/research/terminal-screenshot-rendering/mintlify-baileys-media-upload.md new file mode 100644 index 0000000..e706642 --- /dev/null +++ b/research/terminal-screenshot-rendering/mintlify-baileys-media-upload.md @@ -0,0 +1,28 @@ +# Baileys media upload API + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Baileys media upload API | +| Source URL | https://www.mintlify.com/whiskeysockets/baileys/api/media-upload | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/mintlify-baileys-media-utils.md b/research/terminal-screenshot-rendering/mintlify-baileys-media-utils.md new file mode 100644 index 0000000..2ef0f84 --- /dev/null +++ b/research/terminal-screenshot-rendering/mintlify-baileys-media-utils.md @@ -0,0 +1,28 @@ +# Baileys media utils + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Baileys media utils | +| Source URL | https://www.mintlify.com/WhiskeySockets/Baileys/api/utilities/media-utils | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search; mimetype auto-detected if not provided. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/mintlify-baileys-sending-media.md b/research/terminal-screenshot-rendering/mintlify-baileys-sending-media.md new file mode 100644 index 0000000..6da238e --- /dev/null +++ b/research/terminal-screenshot-rendering/mintlify-baileys-sending-media.md @@ -0,0 +1,28 @@ +# Baileys sending media + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Baileys sending media | +| Source URL | https://www.mintlify.com/whiskeysockets/baileys/messages/sending-media | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/npm-stagas-terminal-screenshot.md b/research/terminal-screenshot-rendering/npm-stagas-terminal-screenshot.md new file mode 100644 index 0000000..7d8be68 --- /dev/null +++ b/research/terminal-screenshot-rendering/npm-stagas-terminal-screenshot.md @@ -0,0 +1,28 @@ +# @stagas/terminal-screenshot + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | @stagas/terminal-screenshot | +| Source URL | https://npmjs.org/package/@stagas/terminal-screenshot | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot search; xterm.js plus Puppeteer, browser based. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/opensuse-manpages-libansilove.md b/research/terminal-screenshot-rendering/opensuse-manpages-libansilove.md new file mode 100644 index 0000000..734ccad --- /dev/null +++ b/research/terminal-screenshot-rendering/opensuse-manpages-libansilove.md @@ -0,0 +1,28 @@ +# libansilove(3) on openSUSE (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | libansilove(3) on openSUSE (2 URLs) | +| Source URL | https://manpages.opensuse.org/Tumbleweed/libansilove-devel/libansilove.3.en.html | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; same man page. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/packagist-candy-freeze.md b/research/terminal-screenshot-rendering/packagist-candy-freeze.md new file mode 100644 index 0000000..ae95577 --- /dev/null +++ b/research/terminal-screenshot-rendering/packagist-candy-freeze.md @@ -0,0 +1,28 @@ +# sugarcraft/candy-freeze + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | sugarcraft/candy-freeze | +| Source URL | https://root.packagist.org/packages/sugarcraft/candy-freeze | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; PHP port that renders SVG. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pg-gda-terminusa-fonts.md b/research/terminal-screenshot-rendering/pg-gda-terminusa-fonts.md new file mode 100644 index 0000000..8227dc7 --- /dev/null +++ b/research/terminal-screenshot-rendering/pg-gda-terminusa-fonts.md @@ -0,0 +1,28 @@ +# Terminusa fonts page + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Terminusa fonts page | +| Source URL | https://www.pg.gda.pl/~atlka/fonts | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; GPL fork with font exception. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pkgdev-textimg.md b/research/terminal-screenshot-rendering/pkgdev-textimg.md new file mode 100644 index 0000000..f27bb9a --- /dev/null +++ b/research/terminal-screenshot-rendering/pkgdev-textimg.md @@ -0,0 +1,28 @@ +# textimg on pkg.go.dev (3 URLs incl. beta and v3) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | textimg on pkg.go.dev (3 URLs incl. beta and v3) | +| Source URL | https://pkg.go.dev/github.com/jiro4989/textimg | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +textimg search; Go module docs. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pkgdev-tuirec-gif.md b/research/terminal-screenshot-rendering/pkgdev-tuirec-gif.md new file mode 100644 index 0000000..361ddd9 --- /dev/null +++ b/research/terminal-screenshot-rendering/pkgdev-tuirec-gif.md @@ -0,0 +1,28 @@ +# tuirec pkg/gif + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | tuirec pkg/gif | +| Source URL | https://pkg.go.dev/github.com/tui-cs/tuirec/pkg/gif | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; Go wrapper. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pkgsrc-ansilove.md b/research/terminal-screenshot-rendering/pkgsrc-ansilove.md new file mode 100644 index 0000000..5116e78 --- /dev/null +++ b/research/terminal-screenshot-rendering/pkgsrc-ansilove.md @@ -0,0 +1,28 @@ +# pkgsrc graphics/ansilove + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | pkgsrc graphics/ansilove | +| Source URL | https://pkgsrc.se/graphics/ansilove | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; CLI package. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pkgsrc-libansilove.md b/research/terminal-screenshot-rendering/pkgsrc-libansilove.md new file mode 100644 index 0000000..0f429d2 --- /dev/null +++ b/research/terminal-screenshot-rendering/pkgsrc-libansilove.md @@ -0,0 +1,28 @@ +# pkgsrc graphics/libansilove + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | pkgsrc graphics/libansilove | +| Source URL | https://pkgsrc.se/graphics/libansilove | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; changelog mentions Spleen 8x16 added in 1.4.0. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pureos-aha.md b/research/terminal-screenshot-rendering/pureos-aha.md new file mode 100644 index 0000000..5d04231 --- /dev/null +++ b/research/terminal-screenshot-rendering/pureos-aha.md @@ -0,0 +1,28 @@ +# aha on PureOS (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | aha on PureOS (2 URLs) | +| Source URL | https://software.pureos.net/package/bin/pureos/dawn/aha | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +aha search; package. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pypi-ansitoimg.md b/research/terminal-screenshot-rendering/pypi-ansitoimg.md new file mode 100644 index 0000000..ed7f007 --- /dev/null +++ b/research/terminal-screenshot-rendering/pypi-ansitoimg.md @@ -0,0 +1,28 @@ +# ansitoimg on PyPI (4 version URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | ansitoimg on PyPI (4 version URLs) | +| Source URL | https://www.pypi.org/project/ansitoimg/2020.3/ | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot and textimg searches; Python ANSI to image, several rendering paths. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/pypi-asciinema-gif-generator.md b/research/terminal-screenshot-rendering/pypi-asciinema-gif-generator.md new file mode 100644 index 0000000..1e34a27 --- /dev/null +++ b/research/terminal-screenshot-rendering/pypi-asciinema-gif-generator.md @@ -0,0 +1,28 @@ +# asciinema-gif-generator on PyPI + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | asciinema-gif-generator on PyPI | +| Source URL | https://pypi.org/project/asciinema-gif-generator | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; Python packaging. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/rustdigger-silicon.md b/research/terminal-screenshot-rendering/rustdigger-silicon.md new file mode 100644 index 0000000..12b75c9 --- /dev/null +++ b/research/terminal-screenshot-rendering/rustdigger-silicon.md @@ -0,0 +1,28 @@ +# silicon on rust-digger + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | silicon on rust-digger | +| Source URL | https://rust-digger.code-maven.com/crates/silicon | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +silicon search; crate stats. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/sharedcontext-freeze-skill.md b/research/terminal-screenshot-rendering/sharedcontext-freeze-skill.md new file mode 100644 index 0000000..2270288 --- /dev/null +++ b/research/terminal-screenshot-rendering/sharedcontext-freeze-skill.md @@ -0,0 +1,28 @@ +# Freeze code and terminal screenshot generator skill + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Freeze code and terminal screenshot generator skill | +| Source URL | https://sharedcontext.ai/skills/external/agentskillexchange/freeze-code-and-terminal-screenshot-generator | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; agent skill wrapping freeze. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/simplifiedguide-tmux-scrollback-save.md b/research/terminal-screenshot-rendering/simplifiedguide-tmux-scrollback-save.md new file mode 100644 index 0000000..94b4f01 --- /dev/null +++ b/research/terminal-screenshot-rendering/simplifiedguide-tmux-scrollback-save.md @@ -0,0 +1,28 @@ +# How to save tmux scrollback to a file (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | How to save tmux scrollback to a file (2 URLs) | +| Source URL | https://www.simplified.guide/tmux/scrollback-save | +| Source type | blog post | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; -p -e -S - -E -. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/skillgallery-tmux.md b/research/terminal-screenshot-rendering/skillgallery-tmux.md new file mode 100644 index 0000000..6c36066 --- /dev/null +++ b/research/terminal-screenshot-rendering/skillgallery-tmux.md @@ -0,0 +1,28 @@ +# laulauland tmux skill + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | laulauland tmux skill | +| Source URL | https://www.skill-gallery.jp/skills/laulauland/tmux | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; cat -v to inspect escapes. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/slackbuilds-aha.md b/research/terminal-screenshot-rendering/slackbuilds-aha.md new file mode 100644 index 0000000..8c1d90a --- /dev/null +++ b/research/terminal-screenshot-rendering/slackbuilds-aha.md @@ -0,0 +1,28 @@ +# aha SlackBuild (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | aha SlackBuild (2 URLs) | +| Source URL | https://slackbuilds.org/repository/15.0/system/aha/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +aha search; package. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/sourceforge-terminus-font.md b/research/terminal-screenshot-rendering/sourceforge-terminus-font.md new file mode 100644 index 0000000..c80cd88 --- /dev/null +++ b/research/terminal-screenshot-rendering/sourceforge-terminus-font.md @@ -0,0 +1,28 @@ +# Terminus Font home page + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Terminus Font home page | +| Source URL | https://terminus-font.sourceforge.net/ | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; project home. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/sourcemage-spleen-details.md b/research/terminal-screenshot-rendering/sourcemage-spleen-details.md new file mode 100644 index 0000000..7120e1f --- /dev/null +++ b/research/terminal-screenshot-rendering/sourcemage-spleen-details.md @@ -0,0 +1,28 @@ +# Source Mage spleen DETAILS + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Source Mage spleen DETAILS | +| Source URL | https://src.rrz.uni-hamburg.de/files/sourcemage/codex/test/fonts-x11/spleen/DETAILS | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Spleen search; package spec. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/terminaltrove-silicon.md b/research/terminal-screenshot-rendering/terminaltrove-silicon.md new file mode 100644 index 0000000..41918cf --- /dev/null +++ b/research/terminal-screenshot-rendering/terminaltrove-silicon.md @@ -0,0 +1,28 @@ +# silicon on Terminal Trove + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | silicon on Terminal Trove | +| Source URL | https://terminaltrove.com/silicon/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +silicon search; listing. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/trendshift-freeze.md b/research/terminal-screenshot-rendering/trendshift-freeze.md new file mode 100644 index 0000000..be3f4e2 --- /dev/null +++ b/research/terminal-screenshot-rendering/trendshift-freeze.md @@ -0,0 +1,28 @@ +# trendshift AI prompts freeze + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | trendshift AI prompts freeze | +| Source URL | https://trendshift.io/admin/repository/ask-ai/8910 | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +freeze search; listing. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/tribblix-libansilove-man.md b/research/terminal-screenshot-rendering/tribblix-libansilove-man.md new file mode 100644 index 0000000..135dd9b --- /dev/null +++ b/research/terminal-screenshot-rendering/tribblix-libansilove-man.md @@ -0,0 +1,28 @@ +# libansilove man page on Tribblix + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | libansilove man page on Tribblix | +| Source URL | https://www.tribblix.org/man/man3/libansilove.html | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +libansilove search; same man page. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/ucla-matterbridge-whatsappmulti.md b/research/terminal-screenshot-rendering/ucla-matterbridge-whatsappmulti.md new file mode 100644 index 0000000..d5cbff1 --- /dev/null +++ b/research/terminal-screenshot-rendering/ucla-matterbridge-whatsappmulti.md @@ -0,0 +1,28 @@ +# matterbridge bridge/whatsappmulti/whatsapp.go + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | matterbridge bridge/whatsappmulti/whatsapp.go | +| Source URL | https://git.linux.ucla.edu/di-gital/matterbridge/src/commit/91353d0a4daba4d6453deb718848acddf51d7dc4/bridge/whatsappmulti/whatsapp.go | +| Source type | repository | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +WhatsApp PNG search; whatsmeow SendMessage caller. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/unifoundry-unifont.md b/research/terminal-screenshot-rendering/unifoundry-unifont.md new file mode 100644 index 0000000..128c591 --- /dev/null +++ b/research/terminal-screenshot-rendering/unifoundry-unifont.md @@ -0,0 +1,28 @@ +# Unifoundry GNU Unifont page + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Unifoundry GNU Unifont page | +| Source URL | https://unifoundry.com/unifont/ | +| Source type | vendor docs | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; project home. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/unixse-442424-capture-pane-e.md b/research/terminal-screenshot-rendering/unixse-442424-capture-pane-e.md new file mode 100644 index 0000000..afddef0 --- /dev/null +++ b/research/terminal-screenshot-rendering/unixse-442424-capture-pane-e.md @@ -0,0 +1,28 @@ +# Unix & Linux Stack Exchange answer 442424 (mirror) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | Unix & Linux Stack Exchange answer 442424 (mirror) | +| Source URL | https://backiee.wasmer.app/http_unix_stackexchange_com/a/442424 | +| Source type | forum thread | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +tmux -e search; -e needs tmux 1.8 or later. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/whatsapp-rust-media-rs-mimetype.md b/research/terminal-screenshot-rendering/whatsapp-rust-media-rs-mimetype.md new file mode 100644 index 0000000..62d4037 --- /dev/null +++ b/research/terminal-screenshot-rendering/whatsapp-rust-media-rs-mimetype.md @@ -0,0 +1,46 @@ +# whatsapp-rust src/media.rs image mimetype default + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | whatsapp-rust src/media.rs image mimetype default | +| Source URL | https://github.com/oxidezap/whatsapp-rust/blob/main/src/media.rs | +| Source publisher / author | oxidezap | +| Source type | repository | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | Medium | +| Status | Active | + +## Summary + +whatsapp-rust sets the image mimetype from the caller's option and defaults to image/jpeg (media.rs:25, 227). + +## Key findings + +- `proto.mimetype = Some(opts.mimetype.unwrap_or_else(|| "image/jpeg".to_string()))`. + +## Pros / strengths + +Third implementation with the same caller-chosen mimetype pattern. + +## Cons / limitations / caveats + +Only the default line was read. + +## Relevance to tai + +Consistent with sending image/png explicitly. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/whatsmeow-upload-go-image-example.md b/research/terminal-screenshot-rendering/whatsmeow-upload-go-image-example.md new file mode 100644 index 0000000..68f1c03 --- /dev/null +++ b/research/terminal-screenshot-rendering/whatsmeow-upload-go-image-example.md @@ -0,0 +1,48 @@ +# whatsmeow upload.go: Upload doc comment + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Dossier | +| Tier | 1 | +| Source title | whatsmeow upload.go: Upload doc comment | +| Source URL | https://github.com/tulir/whatsmeow/blob/main/upload.go | +| Source publisher / author | Tulir Asokan | +| Source type | repository | +| Source date (published) | Unknown — not stated | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | direct page fetch | +| Confidence | High | +| Status | Active | + +## Summary + +The official usage comment of whatsmeow's Upload shows an ImageMessage with `Mimetype: "image/png"`, JpegThumbnail optional. Read in the cloned repository (HEAD 1eec113). + +## Key findings + +- upload.go:57 `Mimetype: proto.String("image/png"), // replace this with the actual mime type`. +- Comment: 'you can also optionally add other fields like ContextInfo and JpegThumbnail here'. +- waE2E.proto ImageMessage has `optional bytes JPEGThumbnail` (the thumbnail, if any, is JPEG). + +## Pros / strengths + +Primary source from the most used Go implementation that PNG bytes go out as an image with the real mime type. + +## Cons / limitations / caveats + +A code comment, not a live test; the thumbnail is JPEG so leaving it out may show a blank preview until the image downloads. + +## Relevance to tai + +Backs the decision to send screenshots as image/png without a JPEG encoder. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Initial dossier created. | diff --git a/research/terminal-screenshot-rendering/wikipedia-gnu-unifont.md b/research/terminal-screenshot-rendering/wikipedia-gnu-unifont.md new file mode 100644 index 0000000..b668bf0 --- /dev/null +++ b/research/terminal-screenshot-rendering/wikipedia-gnu-unifont.md @@ -0,0 +1,28 @@ +# GNU Unifont on Wikipedia (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | GNU Unifont on Wikipedia (2 URLs) | +| Source URL | https://en.wikipedia.org/wiki/GNU_Unifont | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Unifont search; dual OFL 1.1 or GPL 2+ with font embedding exception since 13.0.04. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/wikipedia-sil-ofl.md b/research/terminal-screenshot-rendering/wikipedia-sil-ofl.md new file mode 100644 index 0000000..f5d8656 --- /dev/null +++ b/research/terminal-screenshot-rendering/wikipedia-sil-ofl.md @@ -0,0 +1,28 @@ +# SIL Open Font License on Wikipedia (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | SIL Open Font License on Wikipedia (2 URLs) | +| Source URL | https://en.wikipedia.org/wiki/SIL_Open_Font_License | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +Terminus search; OFL allows bundling with software. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/xcmd-agg.md b/research/terminal-screenshot-rendering/xcmd-agg.md new file mode 100644 index 0000000..5a9c5f7 --- /dev/null +++ b/research/terminal-screenshot-rendering/xcmd-agg.md @@ -0,0 +1,28 @@ +# agg on x-cmd (2 URLs) + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | agg on x-cmd (2 URLs) | +| Source URL | https://www.x-cmd.com/pkg/agg | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +agg search; installer page. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/xcmd-silicon.md b/research/terminal-screenshot-rendering/xcmd-silicon.md new file mode 100644 index 0000000..af9e223 --- /dev/null +++ b/research/terminal-screenshot-rendering/xcmd-silicon.md @@ -0,0 +1,28 @@ +# silicon on x-cmd + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | silicon on x-cmd | +| Source URL | https://x-cmd.com/install/silicon/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +silicon search; installer page. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/research/terminal-screenshot-rendering/xcmd-termframe.md b/research/terminal-screenshot-rendering/xcmd-termframe.md new file mode 100644 index 0000000..2d5b9ea --- /dev/null +++ b/research/terminal-screenshot-rendering/xcmd-termframe.md @@ -0,0 +1,28 @@ +# termframe on x-cmd + +## Metadata + +| Field | Value | +|---|---| +| Institute | Molodetz Institute — Research & Retrieval Division | +| Subject | terminal-screenshot-rendering | +| Document type | Source Citation Card | +| Tier | 2 | +| Source title | termframe on x-cmd | +| Source URL | https://x-cmd.com/install/termframe/ | +| Source type | other | +| Date researched | 2026-10-27 | +| Researched by | tai (agent), model: Claude Opus 5.5, on behalf of retoor | +| Research method | Search aggregator result listing (not independently opened or quoted) | +| Confidence | Not independently verified | +| Status | Active | + +## Why it's here + +termshot search; SVG first renderer with PNG option. + +## Changelog + +| Date | Change | +|---|---| +| 2026-10-27 | Logged as consulted-but-not-analyzed. | diff --git a/taicpp/CHANGELOG.md b/taicpp/CHANGELOG.md index 334595c..eff8c32 100644 --- a/taicpp/CHANGELOG.md +++ b/taicpp/CHANGELOG.md @@ -5,7 +5,14 @@ ## [Unreleased] - 2026-10-25 +- WhatsApp native protocol core ([docs/whatsapp.md](docs/whatsapp.md), `src/whatsapp/`, namespace `detz::wa`): a from-scratch C++ implementation of WhatsApp Web's multi-device wire protocol, built on OpenSSL plus a vendored public-domain ed25519 ref10 (`third_party/ed25519`, zlib) for XEdDSA, with no new runtime dependency. `WaCrypto` (X25519, AES-GCM/CTR/CBC, HKDF, PBKDF2, SHA, XEdDSA), `WaBinary` (binary-XML codec + token dict v3), `WaProto` (hand-written protobuf + the messages the 1:1 text/image client needs), `WaNoise` (Noise XX handshake + transport), `WaSignal` (X3DH + Double Ratchet, AES-CBC+HMAC). Verified byte-for-byte against golden vectors captured from the real Baileys client (`tests/whatsapp_data/`, from jfelipesjc/wa-go, MIT): HKDF/PBKDF2 RFC vectors, XEdDSA roundtrips, codec battery 19/19, ClientPayload byte-exact, the full Noise handshake, and a 4-exchange Signal session byte-exact. Test: `build/whatsapp_test` (16/16), step `whatsapp.unit` in run_all. The live socket/pairing/send/receive layer and the `--whatsapp-link` wizard and agent tools are not built yet; the live path is unverified (needs a linked phone). Research: research/whatsapp-automation. +- Terminal screenshots ([docs/termshot.md](docs/termshot.md)): new tool `terminal_screenshot` writes a PNG of the current tmux or native multiplexer pane on a headless server (capture-pane -e, TuiVtScreen replay, embedded Spleen 8x16 font, zlib PNG; no new dependency). detz-only tools now live in `src/agent/detz_tools.*`; agent.diff and agent.e2e turn them off to keep comparing with tai.py. Test: `build/termshot_test`. Research: research/terminal-screenshot-rendering (99 sources, 2 conclusions). - WhatsApp research and build spec: [docs/whatsapp.md](docs/whatsapp.md) (no native Python library exists, no browser needed, native C++ `detz::wa` transpiled from wa-go with whatsmeow as referee, no new dependencies, build vs deep-research table, caps, tests, phases, a whatsapp-mcp shortcut). Research: research/whatsapp-automation (70 sources, 3 conclusions). Nothing built. +- LLM failover is no longer silent: every failed candidate prints `x provider/model failed after N.Ns: reason` to stderr the moment it fails (before, errors only reached the debug log until a whole round failed, so a 73 s turn showed only "thinking"). The line clears the spinner row first on a tty. +- muse: `muse exec` now runs with `--reasoning-effort low`, `--preset empty` and `--no-foreign-personal-context` (consts `kMuseReasoningEffort`). Measured on the real 16 KB tai prompt: 36.5 s at the default effort, 2.8 s at low, 2.4 s with the empty preset too; the default let muse reason 4.5k tokens about conflicting tool sets and call its own `read_skill`, which failed with `step_limit` after 34 s. That failure now reads "muse tried to call its own tools instead of answering". +- Circuit breaker (3 consecutive failures, 300 s) now also applies to CLI backends (muse, opencode, grok, claude, codex, gemini); before, they were appended to the candidate list regardless of health. +- opencode runs are capped at `kCliFallbackTimeout` = 30 s each (they sit in the fallback chain and rotate through free models). Test: `build/muse_flags_test`. +- `--install`: the native version reader now returns nothing when the target file is absent, so a fresh install reports `installed` instead of `refreshed X -> X`. Documented the install target and its gaps in [docs/misc.md](docs/misc.md). - Documentation: new [docs/cap-agents.md](docs/cap-agents.md) (agents, models, probes, `@agent` resolution, errors, limits, troubleshooting), rewritten [docs/fuzzy.md](docs/fuzzy.md) (algorithm, constants, measured worked examples) and [docs/orchestration.md](docs/orchestration.md) (protocol with examples, layout, lifecycle, state machine, formatter, event mapping, supervision, collection, caps, measurements, verification, gaps), feed panes in [docs/mplex.md](docs/mplex.md), README overview; `make docs` checks the new pages; drift tests keep the constant tables in step with the code. - Orchestration on the multiplexer screen ([docs/orchestration.md](docs/orchestration.md)): every sub agent (`fork` worker, CAP session, `@agent` mention) gets a live, word-wrapped panel; the main pane stays left at full height and sub agents stack on the right (1, 2, 3 ... up to what fits at 6 rows each). New: feed panes in the multiplexer (`vpane_*` control commands, `MplexVpanes`), `src/orch/` (`OrchBoard`, `OrchPanel`, `OrchFormatter`, `OrchTransport`, `OrchCapAdapter`), `Agent::observer` and cancel flag, supervision (idle warn 60 s, idle cancel 300 s, soft cancel then close after 5 s, closing the pane cancels the job), CAP answers collected through the spill path. Tests: `build/orch_test`, `tests/orch_mplex_e2e.py` with `build/orch_live`. Measured: about 64 frames/s, median 12.9 ms between frames, p90 25 ms with three agents streaming 500 tokens/s each. - Generic `detz::FuzzyMatcher` (src/util/fuzzy.*, docs/fuzzy.md, tests/fuzzy_test.cpp): subsequence DP with fzf constants, Damerau-Levenshtein, per-token typo and trigram signals; `@agent` / `@model` mentions now always pick the most related candidate (floor 0.3, ties shorter then earlier, a note shows what was resolved). Research: research/fuzzy-matching-selectors. diff --git a/taicpp/Makefile b/taicpp/Makefile index 5661cc6..f87c28b 100644 --- a/taicpp/Makefile +++ b/taicpp/Makefile @@ -17,12 +17,21 @@ endif # Include path: every src directory (headers include their own directory first, so same-named # headers in two modules do not collide). SRC_DIRS = $(shell find src -type d) -INC = -I$(GEN_INC) $(addprefix -I,$(SRC_DIRS)) -I$(MOLOAPP_SRC) +INC = -I$(GEN_INC) $(addprefix -I,$(SRC_DIRS)) -I$(MOLOAPP_SRC) -Ithird_party/ed25519 -Ithird_party/qrcodegen CXXFLAGS ?= $(CXXSTD) $(WARN) $(OPT) -LDLIBS = -lsqlite3 -lcurl -lz -pthread -lutil +LDLIBS = -lsqlite3 -lcurl -lz -pthread -lutil -lssl -lcrypto ALL_SRCS = $(shell find src -name '*.cpp') ALL_OBJS = $(patsubst %.cpp,$(BUILD)/obj/%.o,$(ALL_SRCS)) +# Vendored C: the public-domain ed25519 ref10 curve arithmetic (third_party/ed25519, +# zlib license) that detz::wa WaCrypto needs for XEdDSA, the one Signal primitive OpenSSL +# does not expose. Compiled as C (its static load_3/load_4 collide if merged into one TU). +TP_C_SRCS = $(wildcard third_party/ed25519/*.c) +TP_C_OBJS = $(patsubst %.c,$(BUILD)/obj/%.o,$(TP_C_SRCS)) +# Vendored C++: the nayuki QR Code generator (third_party/qrcodegen, MIT) for the +# `--whatsapp-link` terminal wizard. +TP_CPP_SRCS = $(wildcard third_party/qrcodegen/*.cpp) +TP_C_OBJS += $(patsubst %.cpp,$(BUILD)/obj/%.o,$(TP_CPP_SRCS)) MAIN_OBJ = $(BUILD)/obj/main.o LIB = $(BUILD)/libdetz.a @@ -38,15 +47,19 @@ $(BUILD)/obj/%.o: %.cpp $(VERSION_HPP) @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) $(INC) -MMD -MP -c $< -o $@ -$(LIB): $(ALL_OBJS) +$(BUILD)/obj/%.o: %.c + @mkdir -p $(dir $@) + $(CC) -O2 -Wall -Ithird_party/ed25519 -c $< -o $@ + +$(LIB): $(ALL_OBJS) $(TP_C_OBJS) @rm -f $@ ar rcs $@ $^ -$(BIN): $(MAIN_OBJ) $(ALL_OBJS) - $(CXX) $(CXXFLAGS) $(MAIN_OBJ) $(ALL_OBJS) $(LDLIBS) -o $@ +$(BIN): $(MAIN_OBJ) $(ALL_OBJS) $(TP_C_OBJS) + $(CXX) $(CXXFLAGS) $(MAIN_OBJ) $(ALL_OBJS) $(TP_C_OBJS) $(LDLIBS) -o $@ -static: $(MAIN_OBJ) $(ALL_OBJS) - $(CXX) $(CXXFLAGS) -pthread -static $(MAIN_OBJ) $(ALL_OBJS) third_party/curl/libcurl.a third_party/sqlite/libsqlite3.a -lssl -lcrypto third_party/jitterentropy/libjitterentropy.a -lzstd -lz -lnghttp2 -lpsl -lbrotlidec -lidn2 -lrtmp -o $(BUILD)/detz-static +static: $(MAIN_OBJ) $(ALL_OBJS) $(TP_C_OBJS) + $(CXX) $(CXXFLAGS) -pthread -static $(MAIN_OBJ) $(ALL_OBJS) $(TP_C_OBJS) third_party/curl/libcurl.a third_party/sqlite/libsqlite3.a -lssl -lcrypto third_party/jitterentropy/libjitterentropy.a -lzstd -lz -lnghttp2 -lpsl -lbrotlidec -lidn2 -lrtmp -o $(BUILD)/detz-static # --------------------------------------------------------------------------- # Test binaries. Every test links tests/.cpp against build/libdetz.a (the archive pulls @@ -88,6 +101,9 @@ $(eval $(call TESTBIN,$(BUILD)/capmcp/capmcp_probe,tests/capmcp_probe.cpp)) $(eval $(call TESTBIN,$(BUILD)/capmcp/capmcp_cli,tests/capmcp_cli.cpp)) $(eval $(call TESTBIN,$(BUILD)/capmcp/cap_model_catalog_test,tests/cap_model_catalog_test.cpp)) $(eval $(call TESTBIN,$(BUILD)/fuzzy_test,tests/fuzzy_test.cpp)) +$(eval $(call TESTBIN,$(BUILD)/whatsapp_test,tests/whatsapp_test.cpp,-Isrc/whatsapp -Isrc/llm -Ithird_party/ed25519)) +$(eval $(call TESTBIN,$(BUILD)/termshot_test,tests/termshot_test.cpp)) +$(eval $(call TESTBIN,$(BUILD)/muse_flags_test,tests/muse_flags_test.cpp)) $(eval $(call TESTBIN,$(BUILD)/orch_test,tests/orch_test.cpp)) $(eval $(call TESTBIN,$(BUILD)/orch_live,tests/orch_live.cpp)) # misc (skills, sched, telegram, rag, install) diff --git a/taicpp/docs/llm.md b/taicpp/docs/llm.md index 1f7d261..79f3a8c 100644 --- a/taicpp/docs/llm.md +++ b/taicpp/docs/llm.md @@ -20,3 +20,10 @@ Port of tai.py 6957-8650 (backends, ModelHealth, ChatClient) plus the helpers th `--update-models` is `agent::update_models_command(config)`. Gaps: see docs/agent.md. Unit tests never touch the network; the libcurl transport itself is only exercised by compile/link, not against a live server. + +## Failover visibility and CLI caps + +- Each failed candidate prints `x provider/model failed after N.Ns: reason` on stderr immediately (`ChatClient::announce_failure`), in addition to the debug log event. +- `muse_argv` always passes `--reasoning-effort low` (`kMuseReasoningEffort`), `--preset empty`, `--no-foreign-personal-context`. Measured on a 16 KB tai prompt: 36.5 s default, 2.8 s low, 2.4 s low + empty preset. Gap: only one prompt was measured, on one machine. +- `ordered_candidates` drops CLI candidates whose circuit is open (3 consecutive failures, 300 s) unless none remain. +- opencode runs are capped at `kCliFallbackTimeout` (30 s). diff --git a/taicpp/docs/misc.md b/taicpp/docs/misc.md index ae1a88e..9879d79 100644 --- a/taicpp/docs/misc.md +++ b/taicpp/docs/misc.md @@ -66,6 +66,13 @@ Wire format (request bodies, paths, headers) is compared against a scripted loca | next_version, release_bump, atomic_write, sealed_write, quarantine, backups_dir, prune_backups, snapshot_self, backup_has_digest, ensure_self_backup, do_release, capped_text, trunc_marker, read_capped, Tools.run_release | `SelfRelease`, `ReleaseTool` | | Store.audit_event / audit_history / audit_get / audit_search / tag_counts, Tools.run_audit / run_restore / run_tags | `AuditVault`, `AuditTool` | +### `--install` of the native binary (what it does today) + +- `--install` runs `Installer::install_self`: `op_binary("upgrade")`, bash hook (plus zsh/fish hook per `$SHELL`), venv, bundled skills. It always copies, so a second run refreshes. +- Target: `$HOME/.local/bin/tai.py` (same path as tai.py, the shell hooks in `installconsts.cpp` alias `tai` to it). The native binary replaces the Python product at that path; it is not installed as `detz`. A copy that is running (`ETXTBSY`) is written beside the target and renamed. +- `OpsAdapter` sets `InstallContext::version_reader`. It returns the running version only if the file at the given path exists, otherwise nothing, so a fresh install reports `binary: installed ` and an existing one `binary: refreshed -> `. Before this fix the reader ignored the path and a fresh install printed `refreshed X -> X`. Limit: the reader cannot read the version of the installed binary, so `` is the running version. +- Verified by running `build/detz --install` against a throwaway `HOME`: binary byte-identical to `build/detz`, hook, venv and six skills created. The message fix itself is not yet verified by a run (build was still in progress when this was written). + ## Known gaps - Sealed vaults: the Seal crypto and the sealed events memdb belong to the store module; sealed paths are @@ -77,3 +84,4 @@ Wire format (request bodies, paths, headers) is compared against a scripted loca - urllib error text for network failures other than HTTP status, timeout, DNS and refused is approximated. - JSON numbers beyond int64 keep exact digits; floats beyond that use double. - Copying a native binary in `op_binary` cannot read a version from it; set `InstallContext::version_reader`. +- `--install` installs under the name `tai.py`, not `detz`; renaming needs `installconsts.cpp` hooks changed too. diff --git a/taicpp/docs/whatsapp.md b/taicpp/docs/whatsapp.md index be883d3..3fcbcfd 100644 --- a/taicpp/docs/whatsapp.md +++ b/taicpp/docs/whatsapp.md @@ -1,6 +1,47 @@ # whatsapp (taicpp): research result and build specification -Status: **specified, nothing built.** This file states what was found, what was +Status: **built and integrated; the offline core is verified, the live link +is verified through QR display, message send is built but unverified** (it +needs a phone-linked account, which development does not have). What is in the +tree now (`src/whatsapp/`, namespace `detz::wa`): + +| Piece | Files | State | +|---|---|---| +| `WaCrypto` (X25519, AES-GCM/CTR/CBC, HKDF, PBKDF2, SHA, XEdDSA) | `wa_crypto.*` | verified: RFC vectors + XEdDSA roundtrips | +| `WaBinary` (binary-XML codec, token dict v3) | `wa_binary.*`, `wa_tokens_data.h`, `wa_node.h` | verified: wa-go codec battery 19/19 | +| `WaProto` (protobuf + the needed messages) | `wa_proto.*` | verified: ClientPayload byte-exact | +| `WaNoise` (Noise XX + transport) | `wa_noise.*` | verified: golden transcript **and live server** | +| `WaSignal` (X3DH + Double Ratchet) | `wa_signal.*` | verified: golden session 4/4 byte-exact | +| `WaDevice` (identity + ClientPayload) | `wa_device.*` | verified via the handshake | +| `WaSocket` (libcurl WebSocket) | `wa_socket.*` | verified live (connect + frames) | +| `WaClient` (connect, pair, login, send) | `wa_client.*` | connect/QR live-verified; pair-complete + send built, unverified | +| `WaStore` (vault SQLite) | `wa_store.*` | verified: round-trips device + contacts | +| `WaQr` (terminal QR) | `wa_qr.*` | verified: renders a scannable code | +| `WaWizard` (`--whatsapp-link`) | `wa_wizard.*` | live-verified through QR display + device persist | +| agent tools `whatsapp_send`, `whatsapp_contacts` | `src/agent/detz_tools.cpp`, `tools_ops.cpp` | wired; contacts verified, send unverified | + +Verified against the live server (no phone needed): `detz --whatsapp-link` +connects, completes the Noise handshake, receives the `pair-device` node, renders +the QR, and saves the device. A phone scanning that QR would link it; the +pair-success handler (ADV HMAC + account-signature verify, device signing, +`pair-device-sign`) is ported faithfully from whatsmeow but cannot be exercised +in-tree. `whatsapp_send` performs a real usync + prekey-fetch + Signal-encrypt + +send-node sequence; it is faithful to whatsmeow but unverified without a live +linked account. Unit test: `build/whatsapp_test` (16/16), vectors in +`tests/whatsapp_data/`. Dependencies added: none at runtime (OpenSSL was already +linked for the static build; added to the default link), plus two vendored +libraries, `third_party/ed25519` (zlib) and `third_party/qrcodegen` (MIT). + +Remaining to make send fully work: own-device fan-out (DeviceSentMessage), +media upload for `send_image` (`WaMedia`), prekey upload after login, retry +receipts, and a live test with a sacrificial number. + +Original research and plan below (kept as written; some "not built yet" lines +are now superseded by the table above). + +--- + +This file states what was found, what was decided, and the exact plan to build a native C++ WhatsApp client into detz. Research archive: [`../../research/whatsapp-automation/`](../../research/whatsapp-automation/) (sources and three conclusions). Every number below was measured on 2026-10-27 diff --git a/taicpp/src/agent/agent.cpp b/taicpp/src/agent/agent.cpp index 2116d71..8be7889 100644 --- a/taicpp/src/agent/agent.cpp +++ b/taicpp/src/agent/agent.cpp @@ -6,6 +6,7 @@ #include "../cap/cap_mention.h" #include "consts.h" #include "data.h" +#include "detz_tools.h" #include "text.h" #include "tui_control.h" #include @@ -41,12 +42,17 @@ int& total_step_cap() { // ------------------------------------------------------------------ module helpers const std::vector& tool_schemas() { - static const std::vector v = [] { + static const std::vector parity = [] { std::vector out; for (const auto& text : data::ToolSchemaJson()) { out.push_back(json::Value::loads(text)); } return out; }(); - return v; + static const std::vector full = [] { + std::vector out = parity; + for (const auto& text : DetzTools::schema_json()) { out.push_back(json::Value::loads(text)); } + return out; + }(); + return DetzTools::enabled() ? full : parity; } bool tool_env_ok(const std::string& name) { @@ -112,7 +118,6 @@ json::Value select_tools(const std::string& text, const json::Value& extra) { auto toks = alnum_tokens(text); std::set words(toks.begin(), toks.end()); json::Value picked = json::Value::array(); - const auto& tags = data::ToolTags(); for (const auto& schema : tool_schemas()) { std::string name = sv(schema.get("function").get("name")); if (!tool_env_ok(name)) { continue; } @@ -120,11 +125,8 @@ json::Value select_tools(const std::string& text, const json::Value& extra) { auto tokens = name_tokens(name); if (!tokens.empty() && intersects(std::set(tokens.begin(), tokens.end()), words)) { picked.push(schema); continue; } bool tagged = false; - for (const auto& kv : tags) { - if (kv.first == name) { - tagged = intersects(std::set(kv.second.begin(), kv.second.end()), words); - break; - } + if (const auto* own = DetzTools::tags_for(name)) { + tagged = intersects(std::set(own->begin(), own->end()), words); } if (tagged) { picked.push(schema); continue; } if (intersects(long_words(sv(schema.get("function").get("description"))), words)) { picked.push(schema); } diff --git a/taicpp/src/agent/detz_tools.cpp b/taicpp/src/agent/detz_tools.cpp new file mode 100644 index 0000000..c633c6f --- /dev/null +++ b/taicpp/src/agent/detz_tools.cpp @@ -0,0 +1,44 @@ +#include "detz_tools.h" +#include "data.h" +namespace detz::agent { + +namespace { +bool& enabled_flag() { + static bool on = true; + return on; +} +} // namespace + +const std::vector& DetzTools::schema_json() { + static const std::vector v = { + R"DETZ({"type": "function", "function": {"name": "terminal_screenshot", "description": "Make a PNG picture of the user's current terminal (the tmux pane, or the tai multiplexer pane), with colors, on a headless server too: no desktop needed. Returns the file path, size and grid; send or describe that file next (for example as a WhatsApp image). Pass target (a tmux pane id like %3 or session:window.pane) for another pane and path to choose the file, default under the detz home in shots/.", "parameters": {"type": "object", "properties": {"target": {"type": "string"}, "path": {"type": "string"}}, "required": []}}})DETZ", + R"DETZ({"type": "function", "function": {"name": "whatsapp_send", "description": "Send a WhatsApp text message to a contact. 'to' is a name or alias you stored, or a phone number in international format (digits only, with country code, no +). Requires that WhatsApp was linked first with `detz --whatsapp-link` (scan the QR on your phone). Returns the message id, or an error explaining what to do (for example, link first).", "parameters": {"type": "object", "properties": {"to": {"type": "string"}, "text": {"type": "string"}}, "required": ["to", "text"]}}})DETZ", + R"DETZ({"type": "function", "function": {"name": "whatsapp_contacts", "description": "List or add WhatsApp contacts (name to number aliases). With no arguments, lists known contacts. Pass name and number to store an alias you can then use with whatsapp_send. Number is international format, digits only, with country code, no +.", "parameters": {"type": "object", "properties": {"name": {"type": "string"}, "number": {"type": "string"}}, "required": []}}})DETZ", + }; + return v; +} + +const std::vector>>& DetzTools::tags() { + static const std::vector>> v = { + {"terminal_screenshot", {"terminal", "screenshot", "picture", "screen", "image", "snapshot"}}, + {"whatsapp_send", {"whatsapp", "message", "send", "text", "chat", "wa"}}, + {"whatsapp_contacts", {"whatsapp", "contact", "contacts", "alias", "number", "wa"}}, + }; + return v; +} + +const std::vector* DetzTools::tags_for(const std::string& name) { + for (const auto& kv : data::ToolTags()) { + if (kv.first == name) return &kv.second; + } + if (!enabled()) return nullptr; + for (const auto& kv : tags()) { + if (kv.first == name) return &kv.second; + } + return nullptr; +} + +bool DetzTools::enabled() { return enabled_flag(); } +void DetzTools::set_enabled(bool on) { enabled_flag() = on; } + +} // namespace detz::agent diff --git a/taicpp/src/agent/detz_tools.h b/taicpp/src/agent/detz_tools.h new file mode 100644 index 0000000..6714a9b --- /dev/null +++ b/taicpp/src/agent/detz_tools.h @@ -0,0 +1,23 @@ +#pragma once +// DetzTools: tools that exist in detz but not in tai.py. data.cpp is generated +// byte-exact from tai.py (gen/gen_data.py), so detz-only schemas and trigger tags +// live here and tool_schemas() appends them. tests/agent_diff.cpp turns them off +// to keep comparing against tai.py's TOOL_SCHEMAS. +#include +#include +#include +namespace detz::agent { + +class DetzTools { +public: + // json.dumps-style schema text per tool, in registration order. + static const std::vector& schema_json(); + // Trigger tags (same role as data::ToolTags()). + static const std::vector>>& tags(); + // Tags of one tool from either list; nullptr when the tool has none. + static const std::vector* tags_for(const std::string& name); + static bool enabled(); + static void set_enabled(bool on); +}; + +} // namespace detz::agent diff --git a/taicpp/src/agent/tools.h b/taicpp/src/agent/tools.h index a1c92d4..3235976 100644 --- a/taicpp/src/agent/tools.h +++ b/taicpp/src/agent/tools.h @@ -100,6 +100,9 @@ class Tools { std::string run_list_terminals(const json::Value& args); std::string run_tail_terminals(const json::Value& args); std::string run_export_terminal_log(const json::Value& args); + std::string run_terminal_screenshot(const json::Value& args); // detz-only (DetzTools) + std::string run_whatsapp_send(const json::Value& args); // detz-only (DetzTools) + std::string run_whatsapp_contacts(const json::Value& args); // detz-only (DetzTools) std::string run_plexer_send(const json::Value& args); std::string run_plexer_read(const json::Value& args); std::string run_plexer_type(const json::Value& args); diff --git a/taicpp/src/agent/tools_core.cpp b/taicpp/src/agent/tools_core.cpp index 3950653..631239a 100644 --- a/taicpp/src/agent/tools_core.cpp +++ b/taicpp/src/agent/tools_core.cpp @@ -57,7 +57,8 @@ const std::vector& Tools::handler_names() { "sysinfo", "create_skill", "install_skill", "store_secret", "list_secrets", "delete_secret", "schedule", "unschedule", "schedules", "record_save", "record_read", "record_search", "record_delete", "graph_link", "graph_query", "delete_file", "audit", "restore", "release", "tags", "install", "create_bot", "search", - "mcp_add", "mcp_list", "mcp_enable", "mcp_disable", "mcp_remove", "mcp_tools", "mcp_call", "mcp_login"}; + "mcp_add", "mcp_list", "mcp_enable", "mcp_disable", "mcp_remove", "mcp_tools", "mcp_call", "mcp_login", + "terminal_screenshot", "whatsapp_send", "whatsapp_contacts"}; return v; } @@ -118,6 +119,9 @@ const std::map& Tools::handler_table() { {"mcp_tools", &Tools::run_mcp_tools}, {"mcp_call", &Tools::run_mcp_call}, {"mcp_login", &Tools::run_mcp_login}, + {"terminal_screenshot", &Tools::run_terminal_screenshot}, + {"whatsapp_send", &Tools::run_whatsapp_send}, + {"whatsapp_contacts", &Tools::run_whatsapp_contacts}, }; return t; } diff --git a/taicpp/src/agent/tools_ops.cpp b/taicpp/src/agent/tools_ops.cpp index 071be16..e70756e 100644 --- a/taicpp/src/agent/tools_ops.cpp +++ b/taicpp/src/agent/tools_ops.cpp @@ -7,6 +7,11 @@ #include "text.h" #include "tui_control.h" #include "zipfile.h" +#include "../termshot/termshot_capture.h" +#include "../termshot/termshot_shooter.h" +#include "../util/fuzzy.h" +#include "../whatsapp/wa_client.h" +#include "../whatsapp/wa_store.h" #include #include #include @@ -85,6 +90,25 @@ std::string Tools::run_terminal_content_native(const std::string& socket_path, i return header + "\n" + llm::truncate(content, 6000, 2000) + history; } +std::string Tools::run_terminal_screenshot(const json::Value& args) { + std::string target = py::head(py::strip(py::str_or_empty(args.get("target"))), 128); + std::string path = py::strip(py::str_or_empty(args.get("path"))); + termshot::TermshotCapture::NativeReader reader; + std::string socket_path = env_get(PLEXER_SOCKET_ENV); + if (!socket_path.empty() && ports().plexer != nullptr) { + std::string pane_env = env_get(PLEXER_PANE_ENV); + reader = [socket_path, pane_env](int lines) { return ports().plexer->native_read_pane(socket_path, pane_env, lines); }; + } + try { + termshot::TermshotFrame frame = termshot::TermshotCapture::current(target, reader); + return termshot::TermshotShooter(app.config.home).shoot(frame, path).summary(); + } catch (const termshot::TermshotError& exc) { + return std::string("error: terminal screenshot failed: ") + exc.what(); + } catch (const PlexerFailure& exc) { + return std::string("error: terminal screenshot failed: ") + exc.what(); + } +} + std::string Tools::run_list_terminals(const json::Value&) { auto [panes, error] = tmux_panes(); if (!error.empty()) { return error; } @@ -678,4 +702,72 @@ std::string Tools::run_install_skill(const json::Value& args) { py::str(skill.get("description")) + tail; } +// --- WhatsApp tools (detz-only) --- +std::string Tools::run_whatsapp_contacts(const json::Value& args) { + wa::WaStore store(app.config.home, app.config.profile); + std::string name = py::strip(py::str_or_empty(args.get("name"))); + std::string number = py::strip(py::str_or_empty(args.get("number"))); + if (!name.empty() && !number.empty()) { + std::string digits; + for (char c : number) + if (c >= '0' && c <= '9') digits.push_back(c); + if (digits.size() < 7) return "error: number must be international format (country code + number, digits only)"; + store.put_contact(digits + "@s.whatsapp.net", name); + return "saved WhatsApp contact: " + name + " -> " + digits; + } + auto cts = store.contacts(); + if (cts.empty()) return "no WhatsApp contacts yet; add one with whatsapp_contacts name=\"Niggel\" number=\"31612345678\""; + std::string out = std::to_string(cts.size()) + " WhatsApp contact(s):\n"; + for (const auto& [jid, nm] : cts) out += " " + nm + " -> " + jid.substr(0, jid.find('@')) + "\n"; + return out; +} + +std::string Tools::run_whatsapp_send(const json::Value& args) { + std::string to = py::strip(py::str_or_empty(args.get("to"))); + std::string text = py::str_or_empty(args.get("text")); + if (to.empty() || text.empty()) return "error: whatsapp_send needs 'to' and 'text'"; + wa::WaStore store(app.config.home, app.config.profile); + if (!store.has_device()) + return "error: WhatsApp is not linked yet. Run `detz --whatsapp-link` in a terminal and scan the QR code with " + "your phone (Settings > Linked Devices), then try again."; + + // resolve 'to' to a JID: a stored contact name (exact or fuzzy), else a phone number. + std::string to_jid; + std::string resolved_note; + { + std::string digits; + for (char c : to) + if (c >= '0' && c <= '9') digits.push_back(c); + bool all_digits = !to.empty() && digits.size() == to.size(); + auto cts = store.contacts(); + if (!all_digits && !cts.empty()) { + std::vector names; + for (const auto& c : cts) names.push_back(c.second); + double sc = 0; + long idx = FuzzyMatcher::Best(to, names, 0.3, &sc); + if (idx >= 0) { + to_jid = cts[static_cast(idx)].first; + if (names[static_cast(idx)] != to) + resolved_note = " (resolved \"" + to + "\" to contact " + names[static_cast(idx)] + ")"; + } + } + if (to_jid.empty() && digits.size() >= 7) to_jid = digits + "@s.whatsapp.net"; + if (to_jid.empty()) + return "error: could not resolve \"" + to + + "\" to a contact or number. Add it with whatsapp_contacts, or pass an international number."; + } + + wa::WaClient client(store); + std::string log_tail; + client.on_log = [&](const std::string& s) { log_tail += "\n " + s; }; + if (!client.connect()) return "error: could not connect to WhatsApp (check network)" + log_tail; + client.run_until([&]() { return client.logged_in(); }, 20); + if (!client.logged_in()) + return "error: WhatsApp login did not complete; the phone may need to be online to re-authorize." + log_tail; + auto id = client.send_text(to_jid, text); + client.disconnect(); + if (!id) return "error: WhatsApp send failed." + log_tail; + return "sent WhatsApp message to " + to_jid.substr(0, to_jid.find('@')) + resolved_note + " (id " + *id + ")"; +} + } // namespace detz::agent diff --git a/taicpp/src/cli/cli.cpp b/taicpp/src/cli/cli.cpp index 6a16309..fdaa75b 100644 --- a/taicpp/src/cli/cli.cpp +++ b/taicpp/src/cli/cli.cpp @@ -30,6 +30,8 @@ void bind(const Namespace& ns, Options& o) { flag("telegram", o.telegram); flag("scheduler", o.scheduler); flag("install", o.install); flag("install_telegram", o.install_telegram); flag("uninstall_telegram", o.uninstall_telegram); flag("plexer_wrap", o.plexer_wrap); list("mplex", o.mplex); + flag("whatsapp_link", o.whatsapp_link); flag("whatsapp_unlink", o.whatsapp_unlink); + flag("whatsapp_status", o.whatsapp_status); flag("demo", o.demo); flag("demo_shot", o.demo_shot); flag("tui", o.tui); flag("tui_local", o.tui_local); str("theme", o.theme); auto p = ns.lists.find("prompt"); diff --git a/taicpp/src/cli/cli.h b/taicpp/src/cli/cli.h index 483c0ad..bdd930c 100644 --- a/taicpp/src/cli/cli.h +++ b/taicpp/src/cli/cli.h @@ -21,6 +21,7 @@ struct Options { std::optional mcp_bind; bool telegram = false, scheduler = false, install = false; bool install_telegram = false, uninstall_telegram = false, plexer_wrap = false; + bool whatsapp_link = false, whatsapp_unlink = false, whatsapp_status = false; std::optional> mplex; // REMAINDER bool demo = false, demo_shot = false, tui = false, tui_local = false; std::optional theme; diff --git a/taicpp/src/cli/flag_spec.cpp b/taicpp/src/cli/flag_spec.cpp index 7651de3..f4dd623 100644 --- a/taicpp/src/cli/flag_spec.cpp +++ b/taicpp/src/cli/flag_spec.cpp @@ -54,6 +54,9 @@ std::vector build() { t.push_back(sw("--install", "install")); t.push_back(sw("--install-telegram", "install_telegram")); t.push_back(sw("--uninstall-telegram", "uninstall_telegram")); + t.push_back(sw("--whatsapp-link", "whatsapp_link", "link this device to WhatsApp: shows a QR code to scan on your phone (Settings > Linked Devices), then saves the link to the vault")); + t.push_back(sw("--whatsapp-unlink", "whatsapp_unlink", "remove the stored WhatsApp link for this profile")); + t.push_back(sw("--whatsapp-status", "whatsapp_status", "print whether WhatsApp is linked for this profile")); t.push_back(sw("--plexer-wrap", "plexer_wrap", "internal: invoked by the bashrc plexer hook, not meant to be run by hand")); FlagSpec mp = val("--mplex", "mplex", "COMMAND", "terminal multiplexer: any mplex command (new-session, attach-session, list-keys ...); bare --mplex starts a session. Config: ~/.tai/mplex.toml"); mp.nargs = Nargs::Remainder; diff --git a/taicpp/src/glue/detz_embed.cpp b/taicpp/src/glue/detz_embed.cpp new file mode 100644 index 0000000..26cbe14 --- /dev/null +++ b/taicpp/src/glue/detz_embed.cpp @@ -0,0 +1,17 @@ +#include "detz_embed.h" +#include +#include "version.hpp" +namespace detz::embed { +namespace { std::string g_ctx; std::mutex g_mu; } +void set_context(const std::string& ctx) { std::lock_guard l(g_mu); g_ctx = ctx; } +const std::string& context() { return g_ctx; } +std::string apply_context(const std::string& prompt) { + std::lock_guard l(g_mu); + return g_ctx.empty() ? prompt : "[ctx] " + g_ctx + "\n" + prompt; +} +} // namespace detz::embed +extern "C" { +void detz_set_context(const char* ctx) { detz::embed::set_context(ctx ? ctx : ""); } +const char* detz_context(void) { return detz::embed::context().c_str(); } +const char* detz_version(void) { return detz::kVersion.data(); } +} // extern "C" diff --git a/taicpp/src/glue/detz_embed.h b/taicpp/src/glue/detz_embed.h new file mode 100644 index 0000000..0147279 --- /dev/null +++ b/taicpp/src/glue/detz_embed.h @@ -0,0 +1,21 @@ +#pragma once +// Minimal static-embed API for detz. +#include +#ifdef __cplusplus +extern "C" { +#endif +void detz_set_context(const char* ctx); // extra context prepended to prompts; copy held inside +const char* detz_context(void); // current context ("" if none) +const char* detz_version(void); // build version string +#ifdef __cplusplus +} // extern "C" +#endif +#ifdef __cplusplus +namespace detz::embed { +// C++ hook: where to inject extra context before a run. Called by hosts. +void set_context(const std::string& ctx); +const std::string& context(); +// Prepends context to a user prompt. Injection point for modification. +std::string apply_context(const std::string& prompt); +} // namespace detz::embed +#endif diff --git a/taicpp/src/glue/glue_app.cpp b/taicpp/src/glue/glue_app.cpp index de4a29b..c6192ab 100644 --- a/taicpp/src/glue/glue_app.cpp +++ b/taicpp/src/glue/glue_app.cpp @@ -23,6 +23,7 @@ #include "../shell/sandbox.h" #include "../store/debuglog.h" #include "../store/patterns.h" +#include "detz_embed.h" #include "../tui/TuiComplete.h" #include "../tui/tui.h" #include "../util/text.h" @@ -34,6 +35,7 @@ #include "telegram_agent.h" #include "telegram_box.h" #include "tui_chat_adapter.h" +#include "../whatsapp/wa_wizard.h" namespace detz::glue { using llm::Ansi; @@ -196,6 +198,7 @@ int GlueApp::tui_local(AppBundle& bundle, const std::string& theme) { int GlueApp::one_shot(AppBundle& bundle) { std::string prompt; for (const auto& w : o_.prompt) prompt += (prompt.empty() ? "" : " ") + w; + prompt = detz::embed::apply_context(prompt); AgentReplHost host(*bundle.booted().conversation, bundle.agent(), bundle.agent_config(), nullptr); repl::Repl::Options ro; ro.version = version_; @@ -225,6 +228,12 @@ int GlueApp::run() { return 0; } if (o_.install || o_.install_telegram || o_.uninstall_telegram) return install_flag(); + if (o_.whatsapp_link || o_.whatsapp_unlink || o_.whatsapp_status) { + std::string profile = o_.profile.value_or("default"); + if (o_.whatsapp_unlink) return wa::WaWizard::unlink(home(), profile, std::cout); + if (o_.whatsapp_status) return wa::WaWizard::status(home(), profile, std::cout); + return wa::WaWizard::link(home(), profile, std::cout); + } if (o_.version) { std::printf("tai %s\n", version_.c_str()); return 0; diff --git a/taicpp/src/glue/ops_adapter.cpp b/taicpp/src/glue/ops_adapter.cpp index c9482bf..02ffd9c 100644 --- a/taicpp/src/glue/ops_adapter.cpp +++ b/taicpp/src/glue/ops_adapter.cpp @@ -13,7 +13,10 @@ OpsAdapter::OpsAdapter(std::string version, std::string binary) : version_(std:: ctx.script_path = std::move(binary); ctx.script_needs_interpreter = false; // the native binary has no VERSION line to scan: the unit runs the binary the user installed - ctx.version_reader = [v = version_](const std::string&) -> std::optional { return v; }; + ctx.version_reader = [v = version_](const std::string& path) -> std::optional { + if (!misc::PyFs::isfile(path)) return std::nullopt; + return v; + }; installer_ = std::make_unique(ctx, container_, io_); } diff --git a/taicpp/src/glue/repl_commands.cpp b/taicpp/src/glue/repl_commands.cpp index 3fb434c..ad3b4da 100644 --- a/taicpp/src/glue/repl_commands.cpp +++ b/taicpp/src/glue/repl_commands.cpp @@ -8,6 +8,7 @@ #include #include #include "../agent/data.h" +#include "../agent/detz_tools.h" #include "../agent/registry.h" #include "../agent/text.h" #include "../llm/chat_client.h" @@ -235,9 +236,8 @@ void ReplCommands::tools_command(const std::string& arg) { say(arg + " [" + (is_core(arg) ? "core" : "lazy") + "]"); say(fn.get("description").str_or("")); std::string tags; - for (const auto& [n, t] : agent::data::ToolTags()) { - if (n != arg) continue; - for (const auto& x : t) { if (!tags.empty()) tags += ", "; tags += x; } + if (const auto* t = agent::DetzTools::tags_for(arg)) { + for (const auto& x : *t) { if (!tags.empty()) tags += ", "; tags += x; } } say("trigger tags: " + tags); return; diff --git a/taicpp/src/llm/chat_client.cpp b/taicpp/src/llm/chat_client.cpp index 913fff1..d002e62 100644 --- a/taicpp/src/llm/chat_client.cpp +++ b/taicpp/src/llm/chat_client.cpp @@ -308,7 +308,9 @@ std::vector ChatClient::ordered_candidates() { for (size_t i : idx) { ranked.push_back(http[i]); } for (auto& c : ranked) { if (!health.circuit_open(c.provider, c.model)) { usable.push_back(c); } } std::vector base = usable.empty() ? ranked : usable; - for (auto& c : cli) { base.push_back(c); } + std::vector cli_usable; + for (auto& c : cli) { if (!health.circuit_open(c.provider, c.model)) { cli_usable.push_back(c); } } + for (auto& c : (cli_usable.empty() ? cli : cli_usable)) { base.push_back(c); } return apply_pins(base); } @@ -573,6 +575,7 @@ ChatReply ChatClient::call_candidate(const Candidate& cand, const json::Value& m std::vector> extra; if (cand.profile == "opencode") { extra = opencode_headers(); } double timeout = sink != nullptr ? kStreamTimeout : kHttpTimeout; + if (chat_url == kOpencodeChatUrl) { timeout = std::min(timeout, kCliFallbackTimeout); } if (chat_url == kMuseChatUrl) { return muse_turn(messages, tools, sink, label, timeout, ephemeral); } auto raw_out = [](const std::string& out) { CliRaw r; r.out = out; return r; }; if (chat_url == kGrokChatUrl) { @@ -620,6 +623,14 @@ ChatReply ChatClient::call_candidate(const Candidate& cand, const json::Value& m return streaming(chat_url, cand.key, attempt, label, [sink](const std::string& piece) { (*sink)(piece); }, extra); } +void ChatClient::announce_failure(const std::string& label, const std::string& model, double elapsed, + const std::string& error) { + char took[32]; + std::snprintf(took, sizeof(took), "%.1f", elapsed); + if (stderr_isatty()) { std::fputs("\r\033[2K", stderr); } + print_err(paint("x " + label + "/" + model + " failed after " + took + "s: " + py::head(error, 300), Ansi::YELLOW)); +} + std::optional ChatClient::try_candidate(const Candidate& cand, const json::Value& messages, const json::Value& tools, const json::Value& payload, const StreamSink* sink, bool ephemeral, @@ -653,6 +664,7 @@ std::optional ChatClient::try_candidate(const Candidate& cand, const bool transient = transient_failure(exc); round_transient = round_transient || transient; errors.push_back(label + "/" + model + ": " + exc.what()); + announce_failure(label, model, py::now() - started, exc.what()); json::Value meta = json::Value::object(); meta.set("backend", label); meta.set("model", model); @@ -664,6 +676,7 @@ std::optional ChatClient::try_candidate(const Candidate& cand, const health.record(label, model, false); round_transient = true; errors.push_back(label + "/" + model + ": " + short_error(exc)); + announce_failure(label, model, py::now() - started, short_error(exc)); json::Value meta = json::Value::object(); meta.set("backend", label); meta.set("model", model); diff --git a/taicpp/src/llm/chat_client.h b/taicpp/src/llm/chat_client.h index a94eafe..b24b6e3 100644 --- a/taicpp/src/llm/chat_client.h +++ b/taicpp/src/llm/chat_client.h @@ -92,6 +92,7 @@ class ChatClient { private: ChatReply complete_inner(const json::Value& messages, const json::Value& tools, const StreamSink* sink, bool ephemeral, std::optional deadline); + static void announce_failure(const std::string& label, const std::string& model, double elapsed, const std::string& error); std::optional try_candidate(const Candidate& cand, const json::Value& messages, const json::Value& tools, const json::Value& payload, const StreamSink* sink, bool ephemeral, std::vector& errors); diff --git a/taicpp/src/llm/consts.h b/taicpp/src/llm/consts.h index ede8a15..7a977da 100644 --- a/taicpp/src/llm/consts.h +++ b/taicpp/src/llm/consts.h @@ -27,6 +27,8 @@ inline constexpr const char* kOllamaLabel = "ollama"; inline constexpr const char* kOllamaBase = "http://localhost:11434/v1"; inline constexpr int kOllamaListTtl = 600; inline constexpr int kMuseMaxSteps = 1; +inline constexpr const char* kMuseReasoningEffort = "low"; // measured: 2.8s vs 36.5s at the default "high" on a 16KB tai prompt +inline constexpr double kCliFallbackTimeout = 30.0; // hard cap per opencode run, free rotating models inline constexpr const char* kMuseSessionsFile = "muse_sessions.json"; inline constexpr const char* kMuseLocksDir = "muse_locks"; inline constexpr int kMuseWorkerTtl = 86400; diff --git a/taicpp/src/llm/muse.cpp b/taicpp/src/llm/muse.cpp index 035944e..ec41e73 100644 --- a/taicpp/src/llm/muse.cpp +++ b/taicpp/src/llm/muse.cpp @@ -208,7 +208,8 @@ std::vector muse_argv(const std::string& explicit_model, const std: const std::string& prompt_path, const std::optional& session_id) { std::vector argv = {muse_binary(), "exec", "--json", "--max-model-steps", std::to_string(kMuseMaxSteps), "--disable-web-tools", "--disable-reminders", "--disable-shell", "--disable-write", - "--output-schema", schema_path, "--prompt-file", prompt_path}; + "--preset", "empty", "--no-foreign-personal-context", + "--reasoning-effort", kMuseReasoningEffort, "--output-schema", schema_path, "--prompt-file", prompt_path}; if (!session_id.has_value()) { argv.push_back("--no-session-log"); } else { @@ -325,6 +326,9 @@ json::Value muse_run(const std::vector& argv, const std::string& cw if (!(t.is_string() && t.str() == "completed")) { std::string what = t.truthy() ? py::str(t) : "failed"; std::string reason = terminal.get("reason").truthy() ? py::str(terminal.get("reason")) : "unknown"; + if (reason.find("did not reach a terminal state") != std::string::npos) { + reason = "muse tried to call its own tools instead of answering (" + reason + ")"; + } throw BackendError("muse " + what + ": " + py::head(reason, 300)); } json::Value parsed = muse_valid_answer(py::str_or_empty(terminal.get("text"))); diff --git a/taicpp/src/termshot/gen/SPLEEN-LICENSE b/taicpp/src/termshot/gen/SPLEEN-LICENSE new file mode 100644 index 0000000..6928cd0 --- /dev/null +++ b/taicpp/src/termshot/gen/SPLEEN-LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2018-2026, Frederic Cambus +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/taicpp/src/termshot/gen/gen_font.py b/taicpp/src/termshot/gen/gen_font.py new file mode 100644 index 0000000..3d7e17e --- /dev/null +++ b/taicpp/src/termshot/gen/gen_font.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +"""Generate src/termshot/termshot_font_data.cpp from spleen-8x16.bdf. + +Run from taicpp/: python3 src/termshot/gen/gen_font.py +Every glyph of Spleen 8x16 is a full 8x16 cell (BBX 8 16 0 -4), so a glyph is +16 bytes, one per row, most significant bit leftmost. +""" +from pathlib import Path + +HERE = Path(__file__).resolve().parent +SRC = HERE / "spleen-8x16.bdf" +OUT = HERE.parent / "termshot_font_data.cpp" +LICENSE = HERE / "SPLEEN-LICENSE" + + +def glyphs(): + code, rows, in_bitmap = None, [], False + for line in SRC.read_text(encoding="ascii").splitlines(): + if line.startswith("ENCODING "): + code = int(line.split()[1]) + elif line.startswith("BBX ") and line.split()[1:] != ["8", "16", "0", "-4"]: + raise SystemExit("unexpected BBX for %d: %s" % (code, line)) + elif line == "BITMAP": + in_bitmap, rows = True, [] + elif line == "ENDCHAR": + in_bitmap = False + if code is not None and code >= 0: + if len(rows) != 16: + raise SystemExit("glyph %d has %d rows" % (code, len(rows))) + yield code, rows + elif in_bitmap: + rows.append(int(line, 16)) + + +def main(): + items = sorted(glyphs()) + lic = "\n".join("// " + l if l else "//" for l in LICENSE.read_text(encoding="ascii").splitlines()) + out = [ + "// GENERATED by src/termshot/gen/gen_font.py from spleen-8x16.bdf. Do not edit.", + "// Glyph bitmaps of Spleen 8x16 2.2.0 by Frederic Cambus, BSD 2-Clause:", + "//", + lic, + '#include "termshot_font.h"', + "namespace detz::termshot {", + "", + "const TermshotGlyph TermshotFont::kGlyphs[] = {", + ] + for code, rows in items: + out.append(" {0x%04X, {%s}}," % (code, ", ".join("0x%02X" % r for r in rows))) + out += ["};", "", "const std::size_t TermshotFont::kGlyphCount = %d;" % len(items), "", "} // namespace detz::termshot", ""] + OUT.write_text("\n".join(out), encoding="ascii") + print("wrote %d glyphs to %s" % (len(items), OUT)) + + +main() diff --git a/taicpp/src/termshot/gen/spleen-8x16.bdf b/taicpp/src/termshot/gen/spleen-8x16.bdf new file mode 100644 index 0000000..2545c3d --- /dev/null +++ b/taicpp/src/termshot/gen/spleen-8x16.bdf @@ -0,0 +1,23064 @@ +STARTFONT 2.1 +COMMENT /* +COMMENT * Spleen 8x16 2.2.0 +COMMENT * Copyright (c) 2018-2026, Frederic Cambus +COMMENT * https://www.cambus.net/ +COMMENT * +COMMENT * Created: 2018-08-11 +COMMENT * Last Updated: 2026-06-14 +COMMENT * +COMMENT * Spleen is released under the BSD 2-Clause license. +COMMENT * See LICENSE file for details. +COMMENT * +COMMENT * SPDX-License-Identifier: BSD-2-Clause +COMMENT */ +FONT -misc-spleen-medium-r-normal--16-160-72-72-C-80-ISO10646-1 +SIZE 16 72 72 +FONTBOUNDINGBOX 8 16 0 -4 +STARTPROPERTIES 20 +FAMILY_NAME "Spleen" +WEIGHT_NAME "Medium" +FONT_VERSION "2.2.0" +FOUNDRY "misc" +SLANT "R" +SETWIDTH_NAME "Normal" +PIXEL_SIZE 16 +POINT_SIZE 160 +RESOLUTION_X 72 +RESOLUTION_Y 72 +SPACING "C" +AVERAGE_WIDTH 80 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +MIN_SPACE 8 +FONT_ASCENT 12 +FONT_DESCENT 4 +COPYRIGHT "Copyright (c) 2018-2026, Frederic Cambus" +DEFAULT_CHAR 32 +_GBDFED_INFO "Edited with gbdfed 1.6." +ENDPROPERTIES +CHARS 1001 +STARTCHAR SPACE +ENCODING 32 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR EXCLAMATION MARK +ENCODING 33 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +18 +18 +18 +18 +18 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR QUOTATION MARK +ENCODING 34 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR NUMBER SIGN +ENCODING 35 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +FE +6C +6C +6C +6C +FE +6C +6C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOLLAR SIGN +ENCODING 36 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +7E +D0 +D0 +D0 +7C +16 +16 +16 +16 +FC +10 +00 +00 +00 +ENDCHAR +STARTCHAR PERCENT SIGN +ENCODING 37 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +06 +66 +6C +0C +18 +18 +30 +36 +66 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR AMPERSAND +ENCODING 38 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +38 +6C +6C +6C +38 +70 +DA +CC +CC +7A +00 +00 +00 +00 +ENDCHAR +STARTCHAR APOSTROPHE +ENCODING 39 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT PARENTHESIS +ENCODING 40 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0E +18 +30 +30 +60 +60 +60 +60 +30 +30 +18 +0E +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT PARENTHESIS +ENCODING 41 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +70 +18 +0C +0C +06 +06 +06 +06 +0C +0C +18 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ASTERISK +ENCODING 42 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +66 +3C +18 +FF +18 +3C +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR PLUS SIGN +ENCODING 43 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +18 +18 +7E +18 +18 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR COMMA +ENCODING 44 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +30 +00 +00 +00 +ENDCHAR +STARTCHAR HYPHEN-MINUS +ENCODING 45 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR FULL STOP +ENCODING 46 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SOLIDUS +ENCODING 47 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT ZERO +ENCODING 48 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +CE +DE +F6 +E6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT ONE +ENCODING 49 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +38 +78 +58 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT TWO +ENCODING 50 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +06 +06 +0C +18 +30 +60 +C6 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT THREE +ENCODING 51 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +06 +06 +3C +06 +06 +06 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT FOUR +ENCODING 52 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +CC +CC +CC +CC +FE +0C +0C +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT FIVE +ENCODING 53 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +C6 +C0 +C0 +FC +06 +06 +06 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT SIX +ENCODING 54 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C0 +C0 +FC +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT SEVEN +ENCODING 55 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +C6 +06 +06 +0C +18 +30 +30 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT EIGHT +ENCODING 56 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +7C +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIGIT NINE +ENCODING 57 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +C6 +7E +06 +06 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR COLON +ENCODING 58 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SEMICOLON +ENCODING 59 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +18 +18 +30 +00 +00 +00 +ENDCHAR +STARTCHAR LESS-THAN SIGN +ENCODING 60 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +06 +0C +18 +30 +60 +60 +30 +18 +0C +06 +00 +00 +00 +00 +ENDCHAR +STARTCHAR EQUALS SIGN +ENCODING 61 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREATER-THAN SIGN +ENCODING 62 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +60 +30 +18 +0C +06 +06 +0C +18 +30 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR QUESTION MARK +ENCODING 63 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +06 +0C +18 +30 +30 +00 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR COMMERCIAL AT +ENCODING 64 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +C2 +DA +DA +DA +DA +DE +C0 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A +ENCODING 65 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER B +ENCODING 66 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C +ENCODING 67 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER D +ENCODING 68 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E +ENCODING 69 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER F +ENCODING 70 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G +ENCODING 71 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER H +ENCODING 72 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I +ENCODING 73 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +18 +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +18 +18 +18 +18 +18 +18 +18 +18 +F0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER K +ENCODING 75 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +CC +F8 +CC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L +ENCODING 76 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER M +ENCODING 77 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +EE +FE +D6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N +ENCODING 78 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O +ENCODING 79 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER P +ENCODING 80 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Q +ENCODING 81 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +D6 +D6 +7C +18 +0C +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R +ENCODING 82 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER S +ENCODING 83 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER T +ENCODING 84 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U +ENCODING 85 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER V +ENCODING 86 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +38 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER W +ENCODING 87 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +D6 +FE +EE +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER X +ENCODING 88 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +6C +38 +6C +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Y +ENCODING 89 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Z +ENCODING 90 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +06 +06 +0C +18 +30 +60 +C0 +C0 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT SQUARE BRACKET +ENCODING 91 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +3E +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +3E +00 +00 +00 +ENDCHAR +STARTCHAR REVERSE SOLIDUS +ENCODING 92 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +06 +06 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT SQUARE BRACKET +ENCODING 93 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +7C +00 +00 +00 +ENDCHAR +STARTCHAR CIRCUMFLEX ACCENT +ENCODING 94 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +C6 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LOW LINE +ENCODING 95 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FE +00 +ENDCHAR +STARTCHAR GRAVE ACCENT +ENCODING 96 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +30 +18 +0C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A +ENCODING 97 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER B +ENCODING 98 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C +ENCODING 99 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER D +ENCODING 100 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E +ENCODING 101 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER F +ENCODING 102 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +1E +30 +30 +30 +7C +30 +30 +30 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G +ENCODING 103 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER H +ENCODING 104 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I +ENCODING 105 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER J +ENCODING 106 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +70 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER K +ENCODING 107 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L +ENCODING 108 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER M +ENCODING 109 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +EC +D6 +D6 +D6 +D6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N +ENCODING 110 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O +ENCODING 111 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER P +ENCODING 112 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Q +ENCODING 113 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R +ENCODING 114 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER S +ENCODING 115 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C0 +C0 +7C +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER T +ENCODING 116 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +7C +30 +30 +30 +30 +30 +1E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U +ENCODING 117 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER V +ENCODING 118 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +6C +38 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER W +ENCODING 119 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +D6 +D6 +D6 +D6 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER X +ENCODING 120 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +6C +38 +38 +6C +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FE +06 +0C +18 +30 +60 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT CURLY BRACKET +ENCODING 123 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0E +18 +18 +18 +18 +70 +70 +18 +18 +18 +18 +0E +00 +00 +00 +ENDCHAR +STARTCHAR VERTICAL LINE +ENCODING 124 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT CURLY BRACKET +ENCODING 125 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +70 +18 +18 +18 +18 +0E +0E +18 +18 +18 +18 +70 +00 +00 +00 +ENDCHAR +STARTCHAR TILDE +ENCODING 126 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +32 +7E +4C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR +ENCODING 127 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR NO-BREAK SPACE +ENCODING 160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR INVERTED EXCLAMATION MARK +ENCODING 161 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CENT SIGN +ENCODING 162 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +08 +7E +C8 +C8 +C8 +C8 +C8 +7E +08 +00 +00 +00 +ENDCHAR +STARTCHAR POUND SIGN +ENCODING 163 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +38 +6C +60 +60 +60 +F8 +60 +60 +C0 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR CURRENCY SIGN +ENCODING 164 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +3C +66 +66 +66 +3C +66 +00 +00 +00 +00 +ENDCHAR +STARTCHAR YEN SIGN +ENCODING 165 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C3 +C3 +66 +3C +18 +3C +18 +3C +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BROKEN BAR +ENCODING 166 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +18 +18 +18 +00 +00 +18 +18 +18 +18 +18 +00 +00 +ENDCHAR +STARTCHAR SECTION SIGN +ENCODING 167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +3C +66 +60 +30 +3C +66 +66 +66 +66 +3C +0C +06 +66 +3C +00 +ENDCHAR +STARTCHAR DIAERESIS +ENCODING 168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR COPYRIGHT SIGN +ENCODING 169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +82 +9A +A2 +A2 +A2 +9A +82 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR FEMININE ORDINAL INDICATOR +ENCODING 170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +0C +3C +4C +3C +00 +7C +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +ENCODING 171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +33 +66 +CC +66 +33 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR NOT SIGN +ENCODING 172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FE +06 +06 +06 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SOFT HYPHEN +ENCODING 173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR REGISTERED SIGN +ENCODING 174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +82 +BA +AA +B2 +AA +AA +82 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR MACRON +ENCODING 175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DEGREE SIGN +ENCODING 176 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR PLUS-MINUS SIGN +ENCODING 177 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +18 +18 +7E +18 +18 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR SUPERSCRIPT TWO +ENCODING 178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +4C +0C +38 +60 +7C +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SUPERSCRIPT THREE +ENCODING 179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +1C +26 +0C +06 +26 +1C +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ACUTE ACCENT +ENCODING 180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR MICRO SIGN +ENCODING 181 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +CC +CC +CC +CC +CC +CC +F6 +C0 +C0 +C0 +00 +ENDCHAR +STARTCHAR PILCROW SIGN +ENCODING 182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +D6 +D6 +D6 +76 +16 +16 +16 +16 +16 +00 +00 +00 +00 +ENDCHAR +STARTCHAR MIDDLE DOT +ENCODING 183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CEDILLA +ENCODING 184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +30 +00 +ENDCHAR +STARTCHAR SUPERSCRIPT ONE +ENCODING 185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +38 +18 +18 +18 +3C +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR MASCULINE ORDINAL INDICATOR +ENCODING 186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +38 +00 +00 +7C +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +ENCODING 187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +CC +66 +33 +66 +CC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR VULGAR FRACTION ONE QUARTER +ENCODING 188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +40 +C0 +40 +42 +46 +EC +18 +30 +70 +D4 +94 +1E +04 +04 +00 +ENDCHAR +STARTCHAR VULGAR FRACTION ONE HALF +ENCODING 189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +40 +C0 +40 +42 +46 +EC +18 +30 +6C +D2 +82 +0C +10 +1E +00 +ENDCHAR +STARTCHAR VULGAR FRACTION THREE QUARTERS +ENCODING 190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +90 +20 +12 +96 +6C +18 +30 +70 +D4 +94 +1E +04 +04 +00 +ENDCHAR +STARTCHAR INVERTED QUESTION MARK +ENCODING 191 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +18 +18 +30 +60 +C0 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH GRAVE +ENCODING 192 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +30 +18 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH ACUTE +ENCODING 193 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH CIRCUMFLEX +ENCODING 194 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH TILDE +ENCODING 195 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +32 +4C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH DIAERESIS +ENCODING 196 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH RING ABOVE +ENCODING 197 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +38 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER AE +ENCODING 198 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +D8 +D8 +D8 +FE +D8 +D8 +D8 +D8 +DE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C WITH CEDILLA +ENCODING 199 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH GRAVE +ENCODING 200 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +30 +18 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH ACUTE +ENCODING 201 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH CIRCUMFLEX +ENCODING 202 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH DIAERESIS +ENCODING 203 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH GRAVE +ENCODING 204 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +30 +18 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH ACUTE +ENCODING 205 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +0C +18 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH CIRCUMFLEX +ENCODING 206 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH DIAERESIS +ENCODING 207 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +66 +66 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER ETH +ENCODING 208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +66 +66 +66 +F6 +66 +66 +66 +66 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N WITH TILDE +ENCODING 209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +32 +4C +00 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH GRAVE +ENCODING 210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +30 +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH ACUTE +ENCODING 211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH CIRCUMFLEX +ENCODING 212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH TILDE +ENCODING 213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +32 +4C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH DIAERESIS +ENCODING 214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR MULTIPLICATION SIGN +ENCODING 215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +6C +38 +38 +6C +C6 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH STROKE +ENCODING 216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +02 +7C +C6 +CE +CE +D6 +D6 +E6 +E6 +C6 +7C +80 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH GRAVE +ENCODING 217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH ACUTE +ENCODING 218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH CIRCUMFLEX +ENCODING 219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH DIAERESIS +ENCODING 220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Y WITH ACUTE +ENCODING 221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER THORN +ENCODING 222 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER SHARP S +ENCODING 223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +78 +CC +CC +CC +D8 +CC +C6 +C6 +D6 +DC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH GRAVE +ENCODING 224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +30 +18 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH ACUTE +ENCODING 225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH CIRCUMFLEX +ENCODING 226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH TILDE +ENCODING 227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +32 +7E +4C +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH DIAERESIS +ENCODING 228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH RING ABOVE +ENCODING 229 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +38 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER AE +ENCODING 230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +6E +16 +16 +7E +D0 +D0 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C WITH CEDILLA +ENCODING 231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH GRAVE +ENCODING 232 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +30 +18 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH ACUTE +ENCODING 233 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH CIRCUMFLEX +ENCODING 234 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH DIAERESIS +ENCODING 235 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH GRAVE +ENCODING 236 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +30 +18 +0C +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH ACUTE +ENCODING 237 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH CIRCUMFLEX +ENCODING 238 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +3C +66 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH DIAERESIS +ENCODING 239 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +66 +66 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER ETH +ENCODING 240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +70 +D8 +0C +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N WITH TILDE +ENCODING 241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +32 +7E +4C +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH GRAVE +ENCODING 242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +30 +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH ACUTE +ENCODING 243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH CIRCUMFLEX +ENCODING 244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH TILDE +ENCODING 245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +32 +7E +4C +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH DIAERESIS +ENCODING 246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DIVISION SIGN +ENCODING 247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +18 +18 +00 +7E +00 +18 +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH STROKE +ENCODING 248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +02 +7C +C6 +CE +D6 +E6 +C6 +7C +80 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH GRAVE +ENCODING 249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH ACUTE +ENCODING 250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH CIRCUMFLEX +ENCODING 251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH DIAERESIS +ENCODING 252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y WITH ACUTE +ENCODING 253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER THORN +ENCODING 254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y WITH DIAERESIS +ENCODING 255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH MACRON +ENCODING 256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH MACRON +ENCODING 257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH BREVE +ENCODING 258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH BREVE +ENCODING 259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH OGONEK +ENCODING 260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH OGONEK +ENCODING 261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +06 +7E +C6 +C6 +C6 +7E +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C WITH ACUTE +ENCODING 262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C WITH ACUTE +ENCODING 263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C WITH CIRCUMFLEX +ENCODING 264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C WITH CIRCUMFLEX +ENCODING 265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C WITH DOT ABOVE +ENCODING 266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C WITH DOT ABOVE +ENCODING 267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C WITH CARON +ENCODING 268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C WITH CARON +ENCODING 269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER D WITH CARON +ENCODING 270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER D WITH CARON +ENCODING 271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +16 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER D WITH STROKE +ENCODING 272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +66 +66 +66 +F6 +66 +66 +66 +66 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER D WITH STROKE +ENCODING 273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +06 +1F +06 +7E +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH MACRON +ENCODING 274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH MACRON +ENCODING 275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH BREVE +ENCODING 276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH BREVE +ENCODING 277 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH DOT ABOVE +ENCODING 278 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH DOT ABOVE +ENCODING 279 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH OGONEK +ENCODING 280 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +7E +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH OGONEK +ENCODING 281 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH CARON +ENCODING 282 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH CARON +ENCODING 283 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G WITH CIRCUMFLEX +ENCODING 284 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G WITH CIRCUMFLEX +ENCODING 285 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G WITH BREVE +ENCODING 286 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G WITH BREVE +ENCODING 287 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G WITH DOT ABOVE +ENCODING 288 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G WITH DOT ABOVE +ENCODING 289 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G WITH CEDILLA +ENCODING 290 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7E +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G WITH CEDILLA +ENCODING 291 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +30 +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER H WITH CIRCUMFLEX +ENCODING 292 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER H WITH CIRCUMFLEX +ENCODING 293 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER H WITH STROKE +ENCODING 294 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +FF +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER H WITH STROKE +ENCODING 295 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +F0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH TILDE +ENCODING 296 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +32 +4C +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH TILDE +ENCODING 297 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +32 +7E +4C +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH MACRON +ENCODING 298 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7E +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH MACRON +ENCODING 299 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7E +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH BREVE +ENCODING 300 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +66 +3C +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH BREVE +ENCODING 301 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +3C +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH OGONEK +ENCODING 302 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +18 +18 +18 +18 +18 +18 +18 +18 +7E +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH OGONEK +ENCODING 303 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +38 +18 +18 +18 +18 +18 +1C +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH DOT ABOVE +ENCODING 304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER DOTLESS I +ENCODING 305 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LIGATURE IJ +ENCODING 306 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +F7 +66 +66 +66 +66 +66 +66 +66 +66 +EC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LIGATURE IJ +ENCODING 307 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +66 +66 +00 +E6 +66 +66 +66 +66 +66 +76 +06 +06 +1C +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER J WITH CIRCUMFLEX +ENCODING 308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +18 +18 +18 +18 +18 +18 +18 +F0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER J WITH CIRCUMFLEX +ENCODING 309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +3C +66 +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +70 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER K WITH CEDILLA +ENCODING 310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +CC +F8 +CC +C6 +C6 +C6 +C6 +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER K WITH CEDILLA +ENCODING 311 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER KRA +ENCODING 312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +CC +D8 +F0 +D8 +CC +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L WITH ACUTE +ENCODING 313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L WITH ACUTE +ENCODING 314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +30 +30 +30 +30 +30 +30 +30 +30 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L WITH CEDILLA +ENCODING 315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L WITH CEDILLA +ENCODING 316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +1C +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L WITH CARON +ENCODING 317 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L WITH CARON +ENCODING 318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +30 +30 +30 +30 +30 +30 +30 +30 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L WITH MIDDLE DOT +ENCODING 319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +C0 +C0 +C0 +CC +CC +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L WITH MIDDLE DOT +ENCODING 320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +30 +36 +36 +30 +30 +30 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L WITH STROKE +ENCODING 321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +60 +60 +68 +78 +70 +E0 +E0 +60 +60 +3E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L WITH STROKE +ENCODING 322 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +34 +3C +38 +70 +70 +30 +30 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N WITH ACUTE +ENCODING 323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N WITH ACUTE +ENCODING 324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N WITH CEDILLA +ENCODING 325 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N WITH CEDILLA +ENCODING 326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N WITH CARON +ENCODING 327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N WITH CARON +ENCODING 328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +ENCODING 329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +C0 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER ENG +ENCODING 330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +06 +06 +0C +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER ENG +ENCODING 331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +0C +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH MACRON +ENCODING 332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH MACRON +ENCODING 333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH BREVE +ENCODING 334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH BREVE +ENCODING 335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +ENCODING 336 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +66 +CC +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH DOUBLE ACUTE +ENCODING 337 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +36 +6C +D8 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LIGATURE OE +ENCODING 338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +D8 +D8 +D8 +DE +D8 +D8 +D8 +D8 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LIGATURE OE +ENCODING 339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +6E +D6 +D6 +DE +D0 +D0 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R WITH ACUTE +ENCODING 340 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R WITH ACUTE +ENCODING 341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7E +C6 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R WITH CEDILLA +ENCODING 342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +C6 +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R WITH CEDILLA +ENCODING 343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C0 +C0 +C0 +C0 +C0 +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R WITH CARON +ENCODING 344 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R WITH CARON +ENCODING 345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7E +C6 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER S WITH ACUTE +ENCODING 346 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER S WITH ACUTE +ENCODING 347 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7E +C0 +C0 +7C +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER S WITH CIRCUMFLEX +ENCODING 348 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER S WITH CIRCUMFLEX +ENCODING 349 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +7E +C0 +C0 +7C +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER S WITH CEDILLA +ENCODING 350 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER S WITH CEDILLA +ENCODING 351 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C0 +C0 +7C +06 +06 +FC +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER S WITH CARON +ENCODING 352 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7E +C0 +C0 +C0 +7C +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER S WITH CARON +ENCODING 353 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7E +C0 +C0 +7C +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER T WITH CEDILLA +ENCODING 354 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +0C +0C +18 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER T WITH CEDILLA +ENCODING 355 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +7C +30 +30 +30 +30 +30 +1E +0C +0C +18 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER T WITH CARON +ENCODING 356 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +FF +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER T WITH CARON +ENCODING 357 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +30 +30 +7C +30 +30 +30 +30 +30 +1E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER T WITH STROKE +ENCODING 358 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FF +18 +18 +18 +18 +7E +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER T WITH STROKE +ENCODING 359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +7C +30 +7C +30 +30 +30 +1E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH TILDE +ENCODING 360 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +32 +4C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH TILDE +ENCODING 361 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +32 +7E +4C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH MACRON +ENCODING 362 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH MACRON +ENCODING 363 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH BREVE +ENCODING 364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH BREVE +ENCODING 365 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH RING ABOVE +ENCODING 366 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +38 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH RING ABOVE +ENCODING 367 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +ENCODING 368 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +66 +CC +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH DOUBLE ACUTE +ENCODING 369 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +36 +6C +D8 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH OGONEK +ENCODING 370 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH OGONEK +ENCODING 371 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +0C +08 +06 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER W WITH CIRCUMFLEX +ENCODING 372 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +D6 +FE +EE +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER W WITH CIRCUMFLEX +ENCODING 373 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +C6 +C6 +D6 +D6 +D6 +D6 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +ENCODING 374 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y WITH CIRCUMFLEX +ENCODING 375 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +10 +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Y WITH DIAERESIS +ENCODING 376 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Z WITH ACUTE +ENCODING 377 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +FE +06 +0C +18 +30 +60 +C0 +C0 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Z WITH ACUTE +ENCODING 378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +FE +06 +0C +18 +30 +60 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Z WITH DOT ABOVE +ENCODING 379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +FE +06 +0C +18 +30 +60 +C0 +C0 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Z WITH DOT ABOVE +ENCODING 380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +FE +06 +0C +18 +30 +60 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Z WITH CARON +ENCODING 381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +FE +06 +0C +18 +30 +60 +C0 +C0 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Z WITH CARON +ENCODING 382 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +FE +06 +0C +18 +30 +60 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER LONG S +ENCODING 383 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +1E +30 +30 +70 +30 +30 +30 +30 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER F WITH HOOK +ENCODING 402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +0E +1B +1B +18 +18 +18 +7E +18 +18 +18 +D8 +D8 +70 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH CARON +ENCODING 461 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH CARON +ENCODING 462 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH CARON +ENCODING 463 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH CARON +ENCODING 464 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH CARON +ENCODING 465 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH CARON +ENCODING 466 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH CARON +ENCODING 467 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH CARON +ENCODING 468 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER AE WITH MACRON +ENCODING 482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +7E +D8 +D8 +D8 +FE +D8 +D8 +D8 +DE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER AE WITH MACRON +ENCODING 483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +00 +6E +16 +16 +7E +D0 +D0 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G WITH CARON +ENCODING 486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G WITH CARON +ENCODING 487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER K WITH CARON +ENCODING 488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C6 +C6 +C6 +CC +F8 +CC +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER K WITH CARON +ENCODING 489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH OGONEK +ENCODING 490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +18 +10 +0C +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH OGONEK +ENCODING 491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +18 +10 +0C +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +ENCODING 492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +18 +10 +0C +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH OGONEK AND MACRON +ENCODING 493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +18 +10 +0C +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER J WITH CARON +ENCODING 496 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +38 +10 +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +70 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G WITH ACUTE +ENCODING 500 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G WITH ACUTE +ENCODING 501 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +7E +C6 +C6 +C6 +C6 +C6 +7C +06 +06 +FC +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER AE WITH ACUTE +ENCODING 508 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +00 +7E +D8 +D8 +D8 +FE +D8 +D8 +D8 +DE +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER AE WITH ACUTE +ENCODING 509 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +00 +6E +16 +16 +7E +D0 +D0 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +ENCODING 510 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +30 +02 +7C +CE +CE +D6 +D6 +E6 +E6 +C6 +7C +80 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH STROKE AND ACUTE +ENCODING 511 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0C +18 +30 +02 +7C +C6 +CE +D6 +E6 +C6 +7C +80 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +ENCODING 512 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +CC +66 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH DOUBLE GRAVE +ENCODING 513 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +6C +36 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH INVERTED BREVE +ENCODING 514 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH INVERTED BREVE +ENCODING 515 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +ENCODING 516 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +CC +66 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH DOUBLE GRAVE +ENCODING 517 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +6C +36 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH INVERTED BREVE +ENCODING 518 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH INVERTED BREVE +ENCODING 519 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +ENCODING 520 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +CC +66 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH DOUBLE GRAVE +ENCODING 521 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +6C +36 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH INVERTED BREVE +ENCODING 522 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +3C +66 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH INVERTED BREVE +ENCODING 523 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +3C +66 +66 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +ENCODING 524 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +CC +66 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH DOUBLE GRAVE +ENCODING 525 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +6C +36 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH INVERTED BREVE +ENCODING 526 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH INVERTED BREVE +ENCODING 527 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +ENCODING 528 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +CC +66 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R WITH DOUBLE GRAVE +ENCODING 529 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +6C +36 +00 +7E +C6 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R WITH INVERTED BREVE +ENCODING 530 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R WITH INVERTED BREVE +ENCODING 531 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +00 +7E +C6 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +ENCODING 532 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +CC +66 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH DOUBLE GRAVE +ENCODING 533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +D8 +6C +36 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH INVERTED BREVE +ENCODING 534 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH INVERTED BREVE +ENCODING 535 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +38 +6C +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER H WITH CARON +ENCODING 542 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER H WITH CARON +ENCODING 543 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH DOT ABOVE +ENCODING 550 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH DOT ABOVE +ENCODING 551 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH CEDILLA +ENCODING 552 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +7E +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH CEDILLA +ENCODING 553 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +18 +18 +30 +00 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH DOT ABOVE +ENCODING 558 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH DOT ABOVE +ENCODING 559 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CARON +ENCODING 711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BREVE +ENCODING 728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOT ABOVE +ENCODING 729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR OGONEK +ENCODING 731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +08 +06 +00 +ENDCHAR +STARTCHAR SMALL TILDE +ENCODING 732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +32 +4C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOUBLE ACUTE ACCENT +ENCODING 733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +66 +CC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR COMBINING BREVE +ENCODING 774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR COMBINING DIAERESIS +ENCODING 776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER ALPHA +ENCODING 913 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER BETA +ENCODING 914 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER GAMMA +ENCODING 915 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +C6 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER DELTA +ENCODING 916 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +10 +10 +38 +38 +6C +6C +6C +C6 +C6 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER EPSILON +ENCODING 917 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER ZETA +ENCODING 918 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +06 +06 +0C +18 +30 +60 +C0 +C0 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER ETA +ENCODING 919 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER THETA +ENCODING 920 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +38 +6C +C6 +C6 +FE +C6 +C6 +C6 +6C +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER IOTA +ENCODING 921 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +18 +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER KAPPA +ENCODING 922 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +CC +F8 +CC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER LAMDA +ENCODING 923 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +10 +10 +38 +38 +6C +6C +6C +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER MU +ENCODING 924 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +EE +FE +D6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER NU +ENCODING 925 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER OMICRON +ENCODING 927 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER PI +ENCODING 928 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER RHO +ENCODING 929 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER SIGMA +ENCODING 931 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +C6 +60 +30 +18 +18 +30 +60 +C6 +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER TAU +ENCODING 932 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER UPSILON +ENCODING 933 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER PHI +ENCODING 934 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +10 +7C +D6 +D6 +D6 +D6 +D6 +D6 +7C +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER CHI +ENCODING 935 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +6C +38 +6C +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER PSI +ENCODING 936 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +7C +10 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK CAPITAL LETTER OMEGA +ENCODING 937 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +38 +6C +C6 +C6 +C6 +C6 +C6 +6C +6C +EE +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER ALPHA +ENCODING 945 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +76 +DC +D8 +D8 +D8 +DC +76 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER DELTA +ENCODING 948 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +1E +30 +18 +0C +3C +66 +66 +66 +66 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER EPSILON +ENCODING 949 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +C6 +C0 +70 +C0 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER KAPPA +ENCODING 954 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +CC +CC +D8 +F0 +F0 +D8 +CC +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER MU +ENCODING 956 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +CC +CC +CC +CC +CC +CC +F6 +C0 +C0 +C0 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER NU +ENCODING 957 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +6C +38 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER OMICRON +ENCODING 959 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER PI +ENCODING 960 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FE +6C +6C +6C +6C +6C +6C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER SIGMA +ENCODING 963 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +D8 +D8 +D8 +D8 +D8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER TAU +ENCODING 964 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +18 +18 +18 +18 +18 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREEK SMALL LETTER PHI +ENCODING 966 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +4C +D6 +D6 +D6 +D6 +D6 +7C +10 +10 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER IO +ENCODING 1025 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +6C +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +ENCODING 1030 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +18 +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER YI +ENCODING 1031 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +66 +66 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER SHORT U +ENCODING 1038 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER A +ENCODING 1040 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER BE +ENCODING 1041 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER VE +ENCODING 1042 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER GHE +ENCODING 1043 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER DE +ENCODING 1044 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +1C +3C +6C +6C +6C +6C +6C +6C +FE +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER IE +ENCODING 1045 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER ZHE +ENCODING 1046 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +D6 +D6 +D6 +7C +38 +7C +D6 +D6 +D6 +D6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER ZE +ENCODING 1047 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +06 +06 +06 +3C +06 +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER I +ENCODING 1048 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +CE +CE +D6 +D6 +E6 +E6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER SHORT I +ENCODING 1049 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +6C +38 +00 +C6 +CE +CE +D6 +D6 +E6 +E6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER KA +ENCODING 1050 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +CC +F8 +CC +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER EL +ENCODING 1051 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER EM +ENCODING 1052 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +EE +FE +D6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER EN +ENCODING 1053 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER O +ENCODING 1054 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER PE +ENCODING 1055 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER ER +ENCODING 1056 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER ES +ENCODING 1057 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER TE +ENCODING 1058 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER U +ENCODING 1059 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER EF +ENCODING 1060 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +10 +7C +D6 +D6 +D6 +D6 +D6 +D6 +7C +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER HA +ENCODING 1061 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +6C +38 +6C +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER TSE +ENCODING 1062 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7F +03 +03 +06 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER CHE +ENCODING 1063 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +06 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER SHA +ENCODING 1064 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER SHCHA +ENCODING 1065 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +7F +03 +03 +06 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER HARD SIGN +ENCODING 1066 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +F0 +F0 +30 +30 +3C +36 +36 +36 +36 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER YERU +ENCODING 1067 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C6 +C6 +C6 +C6 +F6 +DE +DE +DE +DE +F6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER SOFT SIGN +ENCODING 1068 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +30 +30 +3C +36 +36 +36 +36 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER E +ENCODING 1069 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FC +06 +06 +06 +3E +06 +06 +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER YU +ENCODING 1070 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +CC +D6 +D6 +D6 +F6 +F6 +D6 +D6 +D6 +CC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER YA +ENCODING 1071 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +C6 +C6 +C6 +7E +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER A +ENCODING 1072 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +06 +7E +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER BE +ENCODING 1073 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +C0 +FC +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER VE +ENCODING 1074 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +70 +D8 +D8 +D8 +FC +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER GHE +ENCODING 1075 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +06 +06 +7C +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER DE +ENCODING 1076 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER IE +ENCODING 1077 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER ZHE +ENCODING 1078 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +D6 +7C +38 +38 +7C +D6 +D6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER ZE +ENCODING 1079 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +06 +06 +3C +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER I +ENCODING 1080 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER SHORT I +ENCODING 1081 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER KA +ENCODING 1082 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +CC +CC +D8 +F0 +F0 +D8 +CC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER EL +ENCODING 1083 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER EM +ENCODING 1084 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +EE +FE +D6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER EN +ENCODING 1085 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +FE +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER O +ENCODING 1086 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER PE +ENCODING 1087 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER ER +ENCODING 1088 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER ES +ENCODING 1089 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER TE +ENCODING 1090 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +EC +D6 +D6 +D6 +D6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER U +ENCODING 1091 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER EF +ENCODING 1092 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7C +D6 +D6 +D6 +D6 +D6 +7C +10 +10 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER HA +ENCODING 1093 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +6C +38 +38 +6C +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER TSE +ENCODING 1094 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7F +03 +03 +06 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER CHE +ENCODING 1095 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +C6 +7E +06 +06 +06 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER SHA +ENCODING 1096 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +D6 +D6 +D6 +D6 +6E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER SHCHA +ENCODING 1097 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +D6 +D6 +D6 +D6 +6F +03 +03 +06 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER HARD SIGN +ENCODING 1098 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +F0 +30 +3C +36 +36 +36 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER YERU +ENCODING 1099 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +C6 +C6 +F6 +DE +DE +DE +F6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER SOFT SIGN +ENCODING 1100 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +30 +30 +3C +36 +36 +36 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER E +ENCODING 1101 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FC +06 +06 +3E +06 +06 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER YU +ENCODING 1102 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +CC +D6 +D6 +F6 +D6 +D6 +CC +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER YA +ENCODING 1103 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +C6 +C6 +7E +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER IO +ENCODING 1105 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +6C +6C +00 +7E +C6 +C6 +FE +C0 +C0 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +ENCODING 1110 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER YI +ENCODING 1111 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +66 +66 +00 +38 +18 +18 +18 +18 +18 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER SHORT U +ENCODING 1118 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +6C +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +00 +ENDCHAR +STARTCHAR CYRILLIC CAPITAL LETTER GHE WITH UPTURN +ENCODING 1168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +06 +06 +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR CYRILLIC SMALL LETTER GHE WITH UPTURN +ENCODING 1169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +06 +06 +7C +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR HYPHEN +ENCODING 8208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR EN DASH +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR EM DASH +ENCODING 8212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOUBLE VERTICAL LINE +ENCODING 8214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +66 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT SINGLE QUOTATION MARK +ENCODING 8216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT SINGLE QUOTATION MARK +ENCODING 8217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT DOUBLE QUOTATION MARK +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT DOUBLE QUOTATION MARK +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DAGGER +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +7E +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR DOUBLE DAGGER +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +7E +18 +18 +18 +18 +18 +18 +7E +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR BULLET +ENCODING 8226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +18 +3C +3C +18 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR HORIZONTAL ELLIPSIS +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +DB +DB +00 +00 +00 +00 +ENDCHAR +STARTCHAR SINGLE LEFT-POINTING ANGLE QUOTATION MARK +ENCODING 8249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +0C +18 +30 +18 +0C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +ENCODING 8250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +30 +18 +0C +18 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOUBLE EXCLAMATION MARK +ENCODING 8252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +66 +66 +66 +66 +66 +66 +66 +00 +66 +66 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SUPERSCRIPT LATIN SMALL LETTER N +ENCODING 8319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +78 +6C +6C +6C +6C +6C +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR PESETA SIGN +ENCODING 8359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +F8 +CC +CC +F8 +C0 +CC +DE +CC +CC +CC +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR EURO SIGN +ENCODING 8364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +1C +36 +60 +F8 +60 +F8 +60 +36 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRADE MARK SIGN +ENCODING 8482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +EA +4E +4A +4A +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFTWARDS ARROW +ENCODING 8592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +20 +40 +FE +40 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR UPWARDS ARROW +ENCODING 8593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +3C +5A +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHTWARDS ARROW +ENCODING 8594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +08 +04 +FE +04 +08 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOWNWARDS ARROW +ENCODING 8595 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +18 +18 +18 +18 +18 +5A +3C +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT RIGHT ARROW +ENCODING 8596 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +28 +44 +FE +44 +28 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR UP DOWN ARROW +ENCODING 8597 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +3C +5A +18 +18 +18 +18 +5A +3C +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR UP DOWN ARROW WITH BASE +ENCODING 8616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +3C +5A +18 +18 +18 +18 +5A +3C +18 +7E +00 +00 +00 +ENDCHAR +STARTCHAR BULLET OPERATOR +ENCODING 8729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +38 +38 +38 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SQUARE ROOT +ENCODING 8730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +0F +0C +0C +0C +0C +0C +CC +6C +3C +1C +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR INFINITY +ENCODING 8734 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +7E +DB +DB +DB +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR INTERSECTION +ENCODING 8745 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +00 +00 +00 +ENDCHAR +STARTCHAR UNION +ENCODING 8746 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR ALMOST EQUAL TO +ENCODING 8776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +32 +4C +00 +32 +4C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR IDENTICAL TO +ENCODING 8801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7E +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LESS-THAN OR EQUAL TO +ENCODING 8804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +0C +18 +30 +18 +0C +00 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR GREATER-THAN OR EQUAL TO +ENCODING 8805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +30 +18 +0C +18 +30 +00 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR HOUSE +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +10 +38 +6C +C6 +C6 +C6 +FE +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR REVERSED NOT SIGN +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FE +C0 +C0 +C0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TURNED NOT SIGN +ENCODING 8985 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +C0 +C0 +C0 +FE +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TOP HALF INTEGRAL +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +0E +1B +1B +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOTTOM HALF INTEGRAL +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +18 +D8 +D8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT HORIZONTAL +ENCODING 9472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY HORIZONTAL +ENCODING 9473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT VERTICAL +ENCODING 9474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY VERTICAL +ENCODING 9475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +ENCODING 9476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +DB +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +ENCODING 9477 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +DB +DB +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +ENCODING 9478 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +18 +00 +00 +18 +18 +18 +00 +00 +18 +18 +18 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +ENCODING 9479 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +1C +1C +1C +00 +00 +1C +1C +1C +00 +00 +1C +1C +1C +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +ENCODING 9480 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +AA +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +ENCODING 9481 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +AA +AA +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +ENCODING 9482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +00 +00 +18 +18 +00 +00 +18 +18 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +ENCODING 9483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +1C +1C +00 +00 +1C +1C +00 +00 +1C +1C +00 +00 +1C +1C +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DOWN AND RIGHT +ENCODING 9484 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +ENCODING 9485 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +ENCODING 9486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY DOWN AND RIGHT +ENCODING 9487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +1F +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DOWN AND LEFT +ENCODING 9488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +ENCODING 9489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +ENCODING 9490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY DOWN AND LEFT +ENCODING 9491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT UP AND RIGHT +ENCODING 9492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +ENCODING 9493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +ENCODING 9494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY UP AND RIGHT +ENCODING 9495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1F +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT UP AND LEFT +ENCODING 9496 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP LIGHT AND LEFT HEAVY +ENCODING 9497 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP HEAVY AND LEFT LIGHT +ENCODING 9498 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY UP AND LEFT +ENCODING 9499 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +FC +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT VERTICAL AND RIGHT +ENCODING 9500 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +ENCODING 9501 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +ENCODING 9502 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +ENCODING 9503 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +ENCODING 9504 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1F +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +ENCODING 9505 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1F +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +ENCODING 9506 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1F +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY VERTICAL AND RIGHT +ENCODING 9507 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1F +1F +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT VERTICAL AND LEFT +ENCODING 9508 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +ENCODING 9509 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +ENCODING 9510 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +ENCODING 9511 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +ENCODING 9512 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +ENCODING 9513 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +FC +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +ENCODING 9514 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY VERTICAL AND LEFT +ENCODING 9515 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +ENCODING 9516 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +ENCODING 9517 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +ENCODING 9518 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +ENCODING 9519 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +ENCODING 9520 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +ENCODING 9521 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +ENCODING 9522 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +1F +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +ENCODING 9523 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FF +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT UP AND HORIZONTAL +ENCODING 9524 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +ENCODING 9525 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +ENCODING 9526 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +ENCODING 9527 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +ENCODING 9528 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +ENCODING 9529 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +FC +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +ENCODING 9530 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY UP AND HORIZONTAL +ENCODING 9531 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +ENCODING 9532 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +ENCODING 9533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +ENCODING 9534 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +ENCODING 9535 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +ENCODING 9536 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +ENCODING 9537 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +ENCODING 9538 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +ENCODING 9539 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +ENCODING 9540 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +ENCODING 9541 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +ENCODING 9542 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1F +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +ENCODING 9543 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +ENCODING 9544 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +ENCODING 9545 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +ENCODING 9546 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +1F +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +ENCODING 9547 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FF +FF +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +ENCODING 9548 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +EE +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +ENCODING 9549 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +EE +EE +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +ENCODING 9550 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +18 +18 +18 +18 +18 +18 +00 +00 +18 +18 +18 +18 +18 +18 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +ENCODING 9551 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +1C +1C +1C +1C +1C +1C +00 +00 +1C +1C +1C +1C +1C +1C +00 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE HORIZONTAL +ENCODING 9552 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FF +00 +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE VERTICAL +ENCODING 9553 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +ENCODING 9554 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +1F +18 +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +ENCODING 9555 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3F +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE DOWN AND RIGHT +ENCODING 9556 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +3F +30 +37 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +ENCODING 9557 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +18 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +ENCODING 9558 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FE +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE DOWN AND LEFT +ENCODING 9559 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FE +06 +F6 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +ENCODING 9560 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +1F +18 +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +ENCODING 9561 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +3F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE UP AND RIGHT +ENCODING 9562 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +37 +30 +3F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +ENCODING 9563 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +18 +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +ENCODING 9564 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +FE +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE UP AND LEFT +ENCODING 9565 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +F6 +06 +FE +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +ENCODING 9566 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +1F +18 +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +ENCODING 9567 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +37 +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +ENCODING 9568 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +37 +30 +37 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +ENCODING 9569 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +18 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +ENCODING 9570 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +F6 +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE VERTICAL AND LEFT +ENCODING 9571 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +F6 +06 +F6 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +ENCODING 9572 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FF +00 +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +ENCODING 9573 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +ENCODING 9574 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FF +00 +F7 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +ENCODING 9575 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +FF +00 +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +ENCODING 9576 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE UP AND HORIZONTAL +ENCODING 9577 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +F7 +00 +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +ENCODING 9578 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +FF +18 +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +ENCODING 9579 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +36 +FF +36 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +ENCODING 9580 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +36 +36 +36 +36 +36 +36 +F7 +00 +F7 +36 +36 +36 +36 +36 +36 +36 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +ENCODING 9581 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT ARC DOWN AND LEFT +ENCODING 9582 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT ARC UP AND LEFT +ENCODING 9583 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT ARC UP AND RIGHT +ENCODING 9584 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +0F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +ENCODING 9585 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +01 +03 +03 +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +80 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +ENCODING 9586 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +80 +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +06 +06 +03 +03 +01 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DIAGONAL CROSS +ENCODING 9587 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +81 +C3 +C3 +66 +66 +3C +3C +18 +18 +3C +3C +66 +66 +C3 +C3 +81 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT LEFT +ENCODING 9588 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT UP +ENCODING 9589 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT RIGHT +ENCODING 9590 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT DOWN +ENCODING 9591 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY LEFT +ENCODING 9592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +F0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY UP +ENCODING 9593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1C +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY RIGHT +ENCODING 9594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY DOWN +ENCODING 9595 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +ENCODING 9596 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS LIGHT UP AND HEAVY DOWN +ENCODING 9597 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +ENCODING 9598 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +F0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BOX DRAWINGS HEAVY UP AND LIGHT DOWN +ENCODING 9599 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1C +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR UPPER HALF BLOCK +ENCODING 9600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LOWER ONE EIGHTH BLOCK +ENCODING 9601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +ENDCHAR +STARTCHAR LOWER ONE QUARTER BLOCK +ENCODING 9602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +ENDCHAR +STARTCHAR LOWER THREE EIGHTHS BLOCK +ENCODING 9603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR LOWER HALF BLOCK +ENCODING 9604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR LOWER FIVE EIGHTHS BLOCK +ENCODING 9605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR LOWER THREE QUARTERS BLOCK +ENCODING 9606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR LOWER SEVEN EIGHTHS BLOCK +ENCODING 9607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR FULL BLOCK +ENCODING 9608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR LEFT SEVEN EIGHTHS BLOCK +ENCODING 9609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR LEFT THREE QUARTERS BLOCK +ENCODING 9610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR LEFT FIVE EIGHTHS BLOCK +ENCODING 9611 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR LEFT HALF BLOCK +ENCODING 9612 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR LEFT THREE EIGHTHS BLOCK +ENCODING 9613 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR LEFT ONE QUARTER BLOCK +ENCODING 9614 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR LEFT ONE EIGHTH BLOCK +ENCODING 9615 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR RIGHT HALF BLOCK +ENCODING 9616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +ENDCHAR +STARTCHAR LIGHT SHADE +ENCODING 9617 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +11 +44 +11 +44 +11 +44 +11 +44 +11 +44 +11 +44 +11 +44 +11 +44 +ENDCHAR +STARTCHAR MEDIUM SHADE +ENCODING 9618 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +ENDCHAR +STARTCHAR DARK SHADE +ENCODING 9619 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +DD +77 +DD +77 +DD +77 +DD +77 +DD +77 +DD +77 +DD +77 +DD +77 +ENDCHAR +STARTCHAR UPPER ONE EIGHTH BLOCK +ENCODING 9620 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHT ONE EIGHTH BLOCK +ENCODING 9621 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR QUADRANT LOWER LEFT +ENCODING 9622 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR QUADRANT LOWER RIGHT +ENCODING 9623 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +0F +0F +0F +0F +0F +0F +0F +0F +ENDCHAR +STARTCHAR QUADRANT UPPER LEFT +ENCODING 9624 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +ENCODING 9625 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR QUADRANT UPPER LEFT AND LOWER RIGHT +ENCODING 9626 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +0F +0F +0F +0F +0F +0F +0F +0F +ENDCHAR +STARTCHAR QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +ENCODING 9627 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +ENCODING 9628 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +0F +0F +0F +0F +0F +0F +0F +0F +ENDCHAR +STARTCHAR QUADRANT UPPER RIGHT +ENCODING 9629 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR QUADRANT UPPER RIGHT AND LOWER LEFT +ENCODING 9630 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +ENCODING 9631 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR BLACK SQUARE +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7C +7C +7C +7C +7C +7C +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR WHITE SQUARE +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7C +44 +44 +44 +44 +44 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK RECTANGLE +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FE +FE +FE +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK UP-POINTING TRIANGLE +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +10 +38 +38 +7C +7C +FE +FE +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK DOWN-POINTING TRIANGLE +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +FE +FE +7C +7C +38 +38 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK DIAMOND +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +10 +38 +7C +FE +7C +38 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LOZENGE +ENCODING 9674 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +10 +38 +6C +C6 +6C +38 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR WHITE CIRCLE +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +3C +66 +66 +66 +66 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK CIRCLE +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +3C +7E +7E +7E +7E +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR INVERSE BULLET +ENCODING 9688 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +FF +FF +FF +FF +E7 +C3 +C3 +E7 +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR INVERSE WHITE CIRCLE +ENCODING 9689 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FF +FF +FF +FF +C3 +99 +99 +99 +99 +C3 +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR BLACK LOWER RIGHT TRIANGLE +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +80 +C0 +E0 +F0 +F8 +FC +FE +FF +ENDCHAR +STARTCHAR BLACK LOWER LEFT TRIANGLE +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +01 +03 +07 +0F +1F +3F +7F +FF +ENDCHAR +STARTCHAR BLACK UPPER LEFT TRIANGLE +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +FE +FC +F8 +F0 +E0 +C0 +80 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK UPPER RIGHT TRIANGLE +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +FF +7F +3F +1F +0F +07 +03 +01 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR HEAVEN +ENCODING 9776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7E +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR LAKE +ENCODING 9777 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +66 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR FIRE +ENCODING 9778 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7E +00 +00 +66 +00 +00 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR THUNDER +ENCODING 9779 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +66 +00 +00 +66 +00 +00 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR WIND +ENCODING 9780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7E +00 +00 +7E +00 +00 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR WATER +ENCODING 9781 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +66 +00 +00 +7E +00 +00 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR MOUNTAIN +ENCODING 9782 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +7E +00 +00 +66 +00 +00 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR TRIGRAM FOR EARTH +ENCODING 9783 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +66 +00 +00 +66 +00 +00 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR WHITE SMILING FACE +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +81 +A5 +81 +81 +A5 +99 +81 +81 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK SMILING FACE +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +FF +DB +FF +FF +DB +E7 +FF +FF +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR WHITE SUN WITH RAYS +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +18 +18 +DB +3C +E7 +3C +DB +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR FEMALE SIGN +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +3C +66 +66 +66 +66 +3C +18 +3C +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR MALE SIGN +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +0F +07 +0D +19 +3C +66 +66 +66 +66 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK SPADE SUIT +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +18 +3C +7E +FF +FF +7E +18 +18 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK CLUB SUIT +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +18 +3C +3C +E7 +E7 +E7 +18 +18 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK HEART SUIT +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +6C +FE +FE +FE +7C +38 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BLACK DIAMOND SUIT +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +10 +38 +7C +FE +7C +38 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR EIGHTH NOTE +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +66 +7E +60 +60 +60 +60 +60 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BEAMED EIGHTH NOTES +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +7E +66 +7E +66 +66 +66 +66 +66 +6E +CC +C0 +00 +00 +00 +ENDCHAR +STARTCHAR MATHEMATICAL LEFT ANGLE BRACKET +ENCODING 10216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +0C +0C +18 +18 +30 +30 +18 +18 +0C +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR MATHEMATICAL RIGHT ANGLE BRACKET +ENCODING 10217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +30 +30 +18 +18 +0C +0C +18 +18 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN BLANK +ENCODING 10240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1 +ENCODING 10241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2 +ENCODING 10242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12 +ENCODING 10243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3 +ENCODING 10244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13 +ENCODING 10245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23 +ENCODING 10246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123 +ENCODING 10247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-4 +ENCODING 10248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-14 +ENCODING 10249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-24 +ENCODING 10250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-124 +ENCODING 10251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-34 +ENCODING 10252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-134 +ENCODING 10253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-234 +ENCODING 10254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1234 +ENCODING 10255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-5 +ENCODING 10256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-15 +ENCODING 10257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-25 +ENCODING 10258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-125 +ENCODING 10259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-35 +ENCODING 10260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-135 +ENCODING 10261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-235 +ENCODING 10262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1235 +ENCODING 10263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-45 +ENCODING 10264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-145 +ENCODING 10265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-245 +ENCODING 10266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1245 +ENCODING 10267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-345 +ENCODING 10268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1345 +ENCODING 10269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2345 +ENCODING 10270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12345 +ENCODING 10271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-6 +ENCODING 10272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-16 +ENCODING 10273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-26 +ENCODING 10274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-126 +ENCODING 10275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-36 +ENCODING 10276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-136 +ENCODING 10277 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-236 +ENCODING 10278 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1236 +ENCODING 10279 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-46 +ENCODING 10280 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-146 +ENCODING 10281 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-246 +ENCODING 10282 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1246 +ENCODING 10283 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-346 +ENCODING 10284 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1346 +ENCODING 10285 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2346 +ENCODING 10286 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12346 +ENCODING 10287 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-56 +ENCODING 10288 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-156 +ENCODING 10289 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-256 +ENCODING 10290 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1256 +ENCODING 10291 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-356 +ENCODING 10292 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1356 +ENCODING 10293 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2356 +ENCODING 10294 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12356 +ENCODING 10295 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-456 +ENCODING 10296 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1456 +ENCODING 10297 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2456 +ENCODING 10298 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12456 +ENCODING 10299 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3456 +ENCODING 10300 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13456 +ENCODING 10301 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23456 +ENCODING 10302 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123456 +ENCODING 10303 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-7 +ENCODING 10304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-17 +ENCODING 10305 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-27 +ENCODING 10306 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-127 +ENCODING 10307 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-37 +ENCODING 10308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-137 +ENCODING 10309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-237 +ENCODING 10310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1237 +ENCODING 10311 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-47 +ENCODING 10312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-147 +ENCODING 10313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-247 +ENCODING 10314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1247 +ENCODING 10315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-347 +ENCODING 10316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1347 +ENCODING 10317 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2347 +ENCODING 10318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12347 +ENCODING 10319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-57 +ENCODING 10320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-157 +ENCODING 10321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-257 +ENCODING 10322 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1257 +ENCODING 10323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-357 +ENCODING 10324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1357 +ENCODING 10325 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2357 +ENCODING 10326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12357 +ENCODING 10327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-457 +ENCODING 10328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1457 +ENCODING 10329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2457 +ENCODING 10330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12457 +ENCODING 10331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3457 +ENCODING 10332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13457 +ENCODING 10333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23457 +ENCODING 10334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123457 +ENCODING 10335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-67 +ENCODING 10336 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-167 +ENCODING 10337 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-267 +ENCODING 10338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1267 +ENCODING 10339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-367 +ENCODING 10340 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1367 +ENCODING 10341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2367 +ENCODING 10342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12367 +ENCODING 10343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-467 +ENCODING 10344 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1467 +ENCODING 10345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2467 +ENCODING 10346 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12467 +ENCODING 10347 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3467 +ENCODING 10348 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13467 +ENCODING 10349 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23467 +ENCODING 10350 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123467 +ENCODING 10351 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-567 +ENCODING 10352 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1567 +ENCODING 10353 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2567 +ENCODING 10354 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12567 +ENCODING 10355 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3567 +ENCODING 10356 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13567 +ENCODING 10357 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23567 +ENCODING 10358 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123567 +ENCODING 10359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-4567 +ENCODING 10360 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-14567 +ENCODING 10361 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-24567 +ENCODING 10362 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-124567 +ENCODING 10363 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-34567 +ENCODING 10364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-134567 +ENCODING 10365 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-234567 +ENCODING 10366 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1234567 +ENCODING 10367 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-8 +ENCODING 10368 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-18 +ENCODING 10369 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-28 +ENCODING 10370 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-128 +ENCODING 10371 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-38 +ENCODING 10372 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-138 +ENCODING 10373 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-238 +ENCODING 10374 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1238 +ENCODING 10375 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-48 +ENCODING 10376 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-148 +ENCODING 10377 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-248 +ENCODING 10378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1248 +ENCODING 10379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-348 +ENCODING 10380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1348 +ENCODING 10381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2348 +ENCODING 10382 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12348 +ENCODING 10383 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-58 +ENCODING 10384 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-158 +ENCODING 10385 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-258 +ENCODING 10386 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1258 +ENCODING 10387 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-358 +ENCODING 10388 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1358 +ENCODING 10389 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2358 +ENCODING 10390 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12358 +ENCODING 10391 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-458 +ENCODING 10392 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1458 +ENCODING 10393 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2458 +ENCODING 10394 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12458 +ENCODING 10395 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3458 +ENCODING 10396 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13458 +ENCODING 10397 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23458 +ENCODING 10398 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123458 +ENCODING 10399 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-68 +ENCODING 10400 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-168 +ENCODING 10401 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-268 +ENCODING 10402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1268 +ENCODING 10403 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-368 +ENCODING 10404 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1368 +ENCODING 10405 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2368 +ENCODING 10406 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12368 +ENCODING 10407 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-468 +ENCODING 10408 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1468 +ENCODING 10409 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2468 +ENCODING 10410 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12468 +ENCODING 10411 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3468 +ENCODING 10412 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13468 +ENCODING 10413 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23468 +ENCODING 10414 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123468 +ENCODING 10415 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-568 +ENCODING 10416 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1568 +ENCODING 10417 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2568 +ENCODING 10418 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12568 +ENCODING 10419 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3568 +ENCODING 10420 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13568 +ENCODING 10421 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23568 +ENCODING 10422 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123568 +ENCODING 10423 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-4568 +ENCODING 10424 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-14568 +ENCODING 10425 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-24568 +ENCODING 10426 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-124568 +ENCODING 10427 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-34568 +ENCODING 10428 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-134568 +ENCODING 10429 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-234568 +ENCODING 10430 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1234568 +ENCODING 10431 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-78 +ENCODING 10432 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-178 +ENCODING 10433 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-278 +ENCODING 10434 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1278 +ENCODING 10435 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-378 +ENCODING 10436 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1378 +ENCODING 10437 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2378 +ENCODING 10438 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12378 +ENCODING 10439 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-478 +ENCODING 10440 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1478 +ENCODING 10441 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2478 +ENCODING 10442 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12478 +ENCODING 10443 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3478 +ENCODING 10444 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13478 +ENCODING 10445 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23478 +ENCODING 10446 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123478 +ENCODING 10447 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-578 +ENCODING 10448 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1578 +ENCODING 10449 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2578 +ENCODING 10450 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12578 +ENCODING 10451 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3578 +ENCODING 10452 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13578 +ENCODING 10453 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23578 +ENCODING 10454 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123578 +ENCODING 10455 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-4578 +ENCODING 10456 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-14578 +ENCODING 10457 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-24578 +ENCODING 10458 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-124578 +ENCODING 10459 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-34578 +ENCODING 10460 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-134578 +ENCODING 10461 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-234578 +ENCODING 10462 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1234578 +ENCODING 10463 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-678 +ENCODING 10464 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1678 +ENCODING 10465 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2678 +ENCODING 10466 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12678 +ENCODING 10467 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-3678 +ENCODING 10468 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-13678 +ENCODING 10469 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-23678 +ENCODING 10470 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-123678 +ENCODING 10471 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-4678 +ENCODING 10472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-14678 +ENCODING 10473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-24678 +ENCODING 10474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-124678 +ENCODING 10475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-34678 +ENCODING 10476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-134678 +ENCODING 10477 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-234678 +ENCODING 10478 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1234678 +ENCODING 10479 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-5678 +ENCODING 10480 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-15678 +ENCODING 10481 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-25678 +ENCODING 10482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-125678 +ENCODING 10483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-35678 +ENCODING 10484 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-135678 +ENCODING 10485 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-235678 +ENCODING 10486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1235678 +ENCODING 10487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +60 +60 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-45678 +ENCODING 10488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-145678 +ENCODING 10489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-245678 +ENCODING 10490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1245678 +ENCODING 10491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-345678 +ENCODING 10492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-1345678 +ENCODING 10493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-2345678 +ENCODING 10494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +06 +06 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR BRAILLE PATTERN DOTS-12345678 +ENCODING 10495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR UPWARDS BLACK ARROW +ENCODING 11014 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +3C +7E +FF +3C +3C +3C +3C +3C +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOWNWARDS BLACK ARROW +ENCODING 11015 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +3C +3C +3C +3C +3C +3C +FF +7E +3C +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFTWARDS TRIANGLE-HEADED ARROW +ENCODING 11104 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +20 +60 +FE +60 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR UPWARDS TRIANGLE-HEADED ARROW +ENCODING 11105 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +3C +7E +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR RIGHTWARDS TRIANGLE-HEADED ARROW +ENCODING 11106 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +08 +0C +FE +0C +08 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR DOWNWARDS TRIANGLE-HEADED ARROW +ENCODING 11107 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +18 +18 +18 +18 +18 +18 +7E +3C +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR LEFT RIGHT TRIANGLE-HEADED ARROW +ENCODING 11108 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +00 +00 +00 +28 +6C +FE +6C +28 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR UP DOWN TRIANGLE-HEADED ARROW +ENCODING 11109 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +3C +7E +18 +18 +18 +18 +7E +3C +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR char57504 +ENCODING 57504 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +C0 +CC +DE +CC +CC +CC +98 +30 +60 +C0 +C0 +C0 +00 +00 +ENDCHAR +STARTCHAR char57505 +ENCODING 57505 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +40 +40 +40 +40 +40 +38 +00 +12 +1A +1A +16 +16 +12 +00 +00 +ENDCHAR +STARTCHAR char57506 +ENCODING 57506 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +00 +00 +18 +24 +24 +24 +7E +7E +66 +66 +7E +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR char57520 +ENCODING 57520 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +80 +C0 +E0 +F0 +F8 +FC +FE +FF +FF +FE +FC +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR char57521 +ENCODING 57521 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +80 +C0 +60 +30 +18 +0C +06 +03 +03 +06 +0C +18 +30 +60 +C0 +80 +ENDCHAR +STARTCHAR char57522 +ENCODING 57522 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +01 +03 +07 +0F +1F +3F +7F +FF +FF +7F +3F +1F +0F +07 +03 +01 +ENDCHAR +STARTCHAR char57523 +ENCODING 57523 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -4 +BITMAP +01 +03 +06 +0C +18 +30 +60 +C0 +C0 +60 +30 +18 +0C +06 +03 +01 +ENDCHAR +ENDFONT diff --git a/taicpp/src/termshot/termshot_canvas.cpp b/taicpp/src/termshot/termshot_canvas.cpp new file mode 100644 index 0000000..ebc9bac --- /dev/null +++ b/taicpp/src/termshot/termshot_canvas.cpp @@ -0,0 +1,41 @@ +#include "termshot_canvas.h" +#include +namespace detz::termshot { + +TermshotCanvas::TermshotCanvas(int width, int height, std::uint32_t background) + : width_(std::max(1, width)), height_(std::max(1, height)), + rgb_(static_cast(width_) * static_cast(height_) * 3) { + fill(0, 0, width_, height_, background); +} + +void TermshotCanvas::put(int x, int y, std::uint32_t color) { + if (x < 0 || y < 0 || x >= width_ || y >= height_) return; + std::size_t at = (static_cast(y) * static_cast(width_) + static_cast(x)) * 3; + rgb_[at] = static_cast(color >> 16); + rgb_[at + 1] = static_cast(color >> 8); + rgb_[at + 2] = static_cast(color); +} + +void TermshotCanvas::fill(int x, int y, int w, int h, std::uint32_t color) { + for (int yy = std::max(0, y); yy < std::min(height_, y + h); yy++) { + for (int xx = std::max(0, x); xx < std::min(width_, x + w); xx++) put(xx, yy, color); + } +} + +void TermshotCanvas::glyph(int x, int y, const TermshotGlyph& g, std::uint32_t fg, bool bold) { + for (int row = 0; row < 16; row++) { + std::uint8_t bits = g.rows[static_cast(row)]; + if (bold) bits = static_cast(bits | (bits >> 1)); + for (int col = 0; col < 8; col++) { + if (bits & (0x80 >> col)) put(x + col, y + row, fg); + } + } +} + +std::uint32_t TermshotCanvas::pixel(int x, int y) const { + if (x < 0 || y < 0 || x >= width_ || y >= height_) return 0; + std::size_t at = (static_cast(y) * static_cast(width_) + static_cast(x)) * 3; + return (static_cast(rgb_[at]) << 16) | (static_cast(rgb_[at + 1]) << 8) | rgb_[at + 2]; +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_canvas.h b/taicpp/src/termshot/termshot_canvas.h new file mode 100644 index 0000000..9835f79 --- /dev/null +++ b/taicpp/src/termshot/termshot_canvas.h @@ -0,0 +1,28 @@ +#pragma once +// TermshotCanvas: an RGB pixel buffer with the three drawing operations a +// terminal picture needs: fill a rectangle, draw a glyph, read a pixel. +#include "termshot_font.h" +#include +#include +namespace detz::termshot { + +class TermshotCanvas { +public: + TermshotCanvas(int width, int height, std::uint32_t background); + + int width() const { return width_; } + int height() const { return height_; } + const std::vector& rgb() const { return rgb_; } // width*height*3, row major + + void fill(int x, int y, int w, int h, std::uint32_t color); + // Set pixels of the glyph in fg; bold doubles each lit pixel one to the right. + void glyph(int x, int y, const TermshotGlyph& g, std::uint32_t fg, bool bold); + std::uint32_t pixel(int x, int y) const; + +private: + int width_, height_; + std::vector rgb_; + void put(int x, int y, std::uint32_t color); +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_capture.cpp b/taicpp/src/termshot/termshot_capture.cpp new file mode 100644 index 0000000..d53ca50 --- /dev/null +++ b/taicpp/src/termshot/termshot_capture.cpp @@ -0,0 +1,93 @@ +#include "termshot_capture.h" +#include "termshot_consts.h" +#include "../llm/proc.h" +#include +#include +#include +#include +namespace detz::termshot { + +namespace { +std::string env(const char* name) { + const char* v = std::getenv(name); + return v ? std::string(v) : std::string(); +} +std::string trim(const std::string& s) { + size_t a = s.find_first_not_of(" \t\r\n"); + if (a == std::string::npos) return ""; + size_t b = s.find_last_not_of(" \t\r\n"); + return s.substr(a, b - a + 1); +} +} // namespace + +std::string TermshotCapture::run_tmux(const std::vector& args) { + std::vector argv = {"tmux"}; + argv.insert(argv.end(), args.begin(), args.end()); + llm::ProcResult done = llm::run_process(argv, std::nullopt, kCaptureTimeout); + if (done.spawn_failed) throw TermshotError("tmux not available"); + if (done.timed_out) throw TermshotError("tmux did not answer within " + std::to_string(static_cast(kCaptureTimeout)) + " s"); + if (done.returncode != 0) { + std::string err = trim(done.err); + throw TermshotError("tmux failed: " + (err.empty() ? "exit " + std::to_string(done.returncode) : err.substr(0, 200))); + } + return done.out; +} + +TermshotFrame TermshotCapture::tmux(const std::string& target_in) { + std::string target = trim(target_in); + if (target.empty()) target = trim(env("TMUX_PANE")); + std::vector where; + if (!target.empty()) where = {"-t", target}; + + std::vector info_args = {"display-message", "-p"}; + info_args.insert(info_args.end(), where.begin(), where.end()); + info_args.push_back("#{pane_width} #{pane_height} #{cursor_x} #{cursor_y} #{cursor_flag} #{pane_id}"); + std::istringstream info(run_tmux(info_args)); + int width = 0, height = 0, cx = -1, cy = -1, flag = 0; + std::string pane_id; + if (!(info >> width >> height >> cx >> cy >> flag >> pane_id) || width <= 0 || height <= 0) { + throw TermshotError("tmux gave no pane size" + (target.empty() ? std::string() : " for " + target)); + } + + std::vector cap_args = {"capture-pane", "-e", "-p", "-N"}; + cap_args.insert(cap_args.end(), where.begin(), where.end()); + std::string out = run_tmux(cap_args); + if (out.size() > kMaxCaptureBytes) out.resize(kMaxCaptureBytes); + if (!out.empty() && out.back() == '\n') out.pop_back(); + std::string ansi; + ansi.reserve(out.size() + static_cast(height) * 2); + for (char c : out) { + if (c == '\n') ansi += "\r\n"; + else ansi.push_back(c); + } + + TermshotFrame frame; + frame.ansi = std::move(ansi); + frame.cols = std::clamp(width, kMinCols, kMaxCols); + frame.rows = std::clamp(height, kMinRows, kMaxRows); + if (flag != 0) { frame.cursor_x = cx; frame.cursor_y = cy; } + frame.source = "tmux " + pane_id; + return frame; +} + +TermshotFrame TermshotCapture::native(const std::string& raw, const std::string& pane, int rows, int cols) { + TermshotFrame frame; + frame.ansi = raw.size() > kMaxCaptureBytes ? raw.substr(raw.size() - kMaxCaptureBytes) : raw; + frame.rows = std::clamp(rows > 0 ? rows : kNativeDefaultRows, kMinRows, kMaxRows); + frame.cols = std::clamp(cols > 0 ? cols : kNativeDefaultCols, kMinCols, kMaxCols); + frame.source = pane.empty() ? "native plexer pane" : "native pane " + pane; + return frame; +} + +TermshotFrame TermshotCapture::current(const std::string& target, const NativeReader& reader) { + if (trim(target).empty() && !env("TAI_PLEXER_SOCKET").empty() && reader) { + std::string raw = reader(kNativeDefaultRows * 4); + if (trim(raw).empty()) throw TermshotError("terminal pane is empty"); + int cols = std::atoi(env("COLUMNS").c_str()); + int rows = std::atoi(env("LINES").c_str()); + return native(raw, trim(env("TAI_PLEXER_PANE")), rows, cols); + } + return tmux(target); +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_capture.h b/taicpp/src/termshot/termshot_capture.h new file mode 100644 index 0000000..85728f8 --- /dev/null +++ b/taicpp/src/termshot/termshot_capture.h @@ -0,0 +1,28 @@ +#pragma once +// TermshotCapture: read the current terminal with its colors. +// tmux: capture-pane -e -p -N of the visible screen, size and cursor from display-message. +// native: the tail of the tai multiplexer pane log (raw pty bytes) through a reader the +// caller provides (the agent passes ports().plexer->native_read_pane). +#include "termshot_frame.h" +#include +#include +#include +namespace detz::termshot { + +class TermshotCapture { +public: + using NativeReader = std::function; + + // Visible screen of a tmux pane; target "" means TMUX_PANE, else tmux's current pane. + static TermshotFrame tmux(const std::string& target); + // Raw pane log bytes replayed into a rows x cols screen. + static TermshotFrame native(const std::string& raw, const std::string& pane, int rows = 0, int cols = 0); + // The current terminal, same resolution as get_current_terminal_content: a target means tmux; + // no target under the native plexer (TAI_PLEXER_SOCKET) uses the reader; otherwise tmux. + static TermshotFrame current(const std::string& target, const NativeReader& reader); + +private: + static std::string run_tmux(const std::vector& args); +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_consts.h b/taicpp/src/termshot/termshot_consts.h new file mode 100644 index 0000000..5c9153b --- /dev/null +++ b/taicpp/src/termshot/termshot_consts.h @@ -0,0 +1,25 @@ +#pragma once +// Hard caps and fixed look of a terminal screenshot (docs/termshot.md). +#include +#include +namespace detz::termshot { + +inline constexpr int kCellWidth = 8; // Spleen 8x16 +inline constexpr int kCellHeight = 16; +inline constexpr int kPadding = 12; // pixels around the grid +inline constexpr int kMaxCols = 400; // wider panes are cut at the right +inline constexpr int kMaxRows = 200; // taller panes keep the bottom rows +inline constexpr int kMinCols = 1; +inline constexpr int kMinRows = 1; +inline constexpr int kNativeDefaultCols = 160; // native plexer gives no pane size +inline constexpr int kNativeDefaultRows = 50; +inline constexpr std::size_t kMaxCaptureBytes = 4u << 20; // raw capture fed to the VT parser +inline constexpr std::size_t kMaxPngBytes = 16u << 20; // also the WhatsApp image cap +inline constexpr double kCaptureTimeout = 10.0; // seconds per tmux call +inline constexpr int kPngCompression = 9; // zlib level, size over speed +inline constexpr const char* kShotDir = "shots"; // under the detz home +inline constexpr std::uint32_t kDefaultFg = 0xD0D0D0; +inline constexpr std::uint32_t kDefaultBg = 0x1C1C1C; +inline constexpr std::uint32_t kCursorColor = 0xD0D0D0; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_font.cpp b/taicpp/src/termshot/termshot_font.cpp new file mode 100644 index 0000000..bd5b339 --- /dev/null +++ b/taicpp/src/termshot/termshot_font.cpp @@ -0,0 +1,17 @@ +#include "termshot_font.h" +#include +namespace detz::termshot { + +const TermshotGlyph* TermshotFont::find(char32_t code) { + const TermshotGlyph* end = kGlyphs + kGlyphCount; + const TermshotGlyph* it = std::lower_bound(kGlyphs, end, code, [](const TermshotGlyph& g, char32_t c) { return g.code < c; }); + return (it != end && it->code == code) ? it : nullptr; +} + +const TermshotGlyph& TermshotFont::glyph(char32_t code) { + if (const TermshotGlyph* g = find(code)) return *g; + if (const TermshotGlyph* g = find(U'�')) return *g; + return *find(U'?'); +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_font.h b/taicpp/src/termshot/termshot_font.h new file mode 100644 index 0000000..f79bc0b --- /dev/null +++ b/taicpp/src/termshot/termshot_font.h @@ -0,0 +1,27 @@ +#pragma once +// TermshotFont: the embedded Spleen 8x16 bitmap font (termshot_font_data.cpp, +// generated by gen/gen_font.py). A glyph is 16 rows of 8 bits, MSB leftmost. +#include +#include +#include +namespace detz::termshot { + +struct TermshotGlyph { + char32_t code; + std::array rows; +}; + +class TermshotFont { +public: + // Glyph for a code point; nullptr when the font lacks it. + static const TermshotGlyph* find(char32_t code); + // Glyph to draw: the code point, else U+FFFD, else '?'. + static const TermshotGlyph& glyph(char32_t code); + static std::size_t size() { return kGlyphCount; } + +private: + static const TermshotGlyph kGlyphs[]; + static const std::size_t kGlyphCount; +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_font_data.cpp b/taicpp/src/termshot/termshot_font_data.cpp new file mode 100644 index 0000000..3f83b5e --- /dev/null +++ b/taicpp/src/termshot/termshot_font_data.cpp @@ -0,0 +1,1037 @@ +// GENERATED by src/termshot/gen/gen_font.py from spleen-8x16.bdf. Do not edit. +// Glyph bitmaps of Spleen 8x16 2.2.0 by Frederic Cambus, BSD 2-Clause: +// +// Copyright (c) 2018-2026, Frederic Cambus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +#include "termshot_font.h" +namespace detz::termshot { + +const TermshotGlyph TermshotFont::kGlyphs[] = { + {0x0020, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0021, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x0022, {0x00, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0023, {0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00}}, + {0x0024, {0x00, 0x10, 0x7E, 0xD0, 0xD0, 0xD0, 0x7C, 0x16, 0x16, 0x16, 0x16, 0xFC, 0x10, 0x00, 0x00, 0x00}}, + {0x0025, {0x00, 0x00, 0x06, 0x66, 0x6C, 0x0C, 0x18, 0x18, 0x30, 0x36, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00}}, + {0x0026, {0x00, 0x00, 0x38, 0x6C, 0x6C, 0x6C, 0x38, 0x70, 0xDA, 0xCC, 0xCC, 0x7A, 0x00, 0x00, 0x00, 0x00}}, + {0x0027, {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0028, {0x00, 0x0E, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x18, 0x0E, 0x00, 0x00, 0x00}}, + {0x0029, {0x00, 0x70, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x70, 0x00, 0x00, 0x00}}, + {0x002A, {0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0x18, 0xFF, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x002B, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x002C, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00}}, + {0x002D, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x002E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x002F, {0x00, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0xC0, 0xC0, 0x00, 0x00, 0x00}}, + {0x0030, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0031, {0x00, 0x00, 0x18, 0x38, 0x78, 0x58, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0032, {0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x0033, {0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0034, {0x00, 0x00, 0xC0, 0xC0, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00}}, + {0x0035, {0x00, 0x00, 0xFE, 0xC6, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0036, {0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0037, {0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00}}, + {0x0038, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0039, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x003A, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x003B, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00}}, + {0x003C, {0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00}}, + {0x003D, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x003E, {0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00}}, + {0x003F, {0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00}}, + {0x0040, {0x00, 0x00, 0x00, 0x7C, 0xC2, 0xDA, 0xDA, 0xDA, 0xDA, 0xDE, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0041, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0042, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0043, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0044, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0045, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0046, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0047, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0048, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0049, {0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x004A, {0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00}}, + {0x004B, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x004C, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x004D, {0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x004E, {0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x004F, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0050, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0051, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0x7C, 0x18, 0x0C, 0x00, 0x00}}, + {0x0052, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0053, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0054, {0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x0055, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0056, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x0057, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0058, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0059, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x005A, {0x00, 0x00, 0xFE, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x005B, {0x00, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3E, 0x00, 0x00, 0x00}}, + {0x005C, {0x00, 0xC0, 0xC0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x00, 0x00}}, + {0x005D, {0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00}}, + {0x005E, {0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x005F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00}}, + {0x0060, {0x00, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0061, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0062, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0063, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0064, {0x00, 0x00, 0x06, 0x06, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0065, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0066, {0x00, 0x00, 0x1E, 0x30, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00}}, + {0x0067, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x0068, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0069, {0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x006A, {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00}}, + {0x006B, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x006C, {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x006D, {0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD6, 0xD6, 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x006E, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x006F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0070, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00}}, + {0x0071, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x00}}, + {0x0072, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0073, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0074, {0x00, 0x00, 0x30, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1E, 0x00, 0x00, 0x00, 0x00}}, + {0x0075, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0076, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x0077, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xD6, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x0078, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0079, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x007A, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x007B, {0x00, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00}}, + {0x007C, {0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00}}, + {0x007D, {0x00, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00}}, + {0x007E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x7E, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x007F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00A0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00A1, {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x00A2, {0x00, 0x00, 0x00, 0x00, 0x08, 0x7E, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0x7E, 0x08, 0x00, 0x00, 0x00}}, + {0x00A3, {0x00, 0x00, 0x38, 0x6C, 0x60, 0x60, 0x60, 0xF8, 0x60, 0x60, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x00A4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00}}, + {0x00A5, {0x00, 0x00, 0xC3, 0xC3, 0x66, 0x3C, 0x18, 0x3C, 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x00A6, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00}}, + {0x00A7, {0x00, 0x3C, 0x66, 0x60, 0x30, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x0C, 0x06, 0x66, 0x3C, 0x00}}, + {0x00A8, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00A9, {0x00, 0x00, 0x00, 0x7C, 0x82, 0x9A, 0xA2, 0xA2, 0xA2, 0x9A, 0x82, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00AA, {0x00, 0x38, 0x0C, 0x3C, 0x4C, 0x3C, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00AB, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00AC, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00AD, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00AE, {0x00, 0x00, 0x00, 0x7C, 0x82, 0xBA, 0xAA, 0xB2, 0xAA, 0xAA, 0x82, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00AF, {0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00B0, {0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00B1, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00B2, {0x00, 0x38, 0x4C, 0x0C, 0x38, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00B3, {0x00, 0x1C, 0x26, 0x0C, 0x06, 0x26, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00B4, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00B5, {0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF6, 0xC0, 0xC0, 0xC0, 0x00}}, + {0x00B6, {0x00, 0x00, 0x7E, 0xD6, 0xD6, 0xD6, 0x76, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00}}, + {0x00B7, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00B8, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00}}, + {0x00B9, {0x00, 0x18, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00BA, {0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00BB, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00BC, {0x00, 0x40, 0xC0, 0x40, 0x42, 0x46, 0xEC, 0x18, 0x30, 0x70, 0xD4, 0x94, 0x1E, 0x04, 0x04, 0x00}}, + {0x00BD, {0x00, 0x40, 0xC0, 0x40, 0x42, 0x46, 0xEC, 0x18, 0x30, 0x6C, 0xD2, 0x82, 0x0C, 0x10, 0x1E, 0x00}}, + {0x00BE, {0x00, 0x60, 0x90, 0x20, 0x12, 0x96, 0x6C, 0x18, 0x30, 0x70, 0xD4, 0x94, 0x1E, 0x04, 0x04, 0x00}}, + {0x00BF, {0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00C0, {0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00C1, {0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00C2, {0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00C3, {0x32, 0x4C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00C4, {0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00C5, {0x38, 0x6C, 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00C6, {0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00}}, + {0x00C7, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x18, 0x18, 0x30, 0x00}}, + {0x00C8, {0x30, 0x18, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00C9, {0x18, 0x30, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00CA, {0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00CB, {0x6C, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00CC, {0x30, 0x18, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00CD, {0x0C, 0x18, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00CE, {0x38, 0x6C, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00CF, {0x66, 0x66, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00D0, {0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00D1, {0x32, 0x4C, 0x00, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00D2, {0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00D3, {0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00D4, {0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00D5, {0x32, 0x4C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00D6, {0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00D7, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00D8, {0x00, 0x02, 0x7C, 0xC6, 0xCE, 0xCE, 0xD6, 0xD6, 0xE6, 0xE6, 0xC6, 0x7C, 0x80, 0x00, 0x00, 0x00}}, + {0x00D9, {0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00DA, {0x18, 0x30, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00DB, {0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00DC, {0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00DD, {0x18, 0x30, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x00DE, {0x00, 0x00, 0x00, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0x00, 0x00}}, + {0x00DF, {0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xD8, 0xCC, 0xC6, 0xC6, 0xD6, 0xDC, 0x00, 0x00, 0x00, 0x00}}, + {0x00E0, {0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E1, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E2, {0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E3, {0x00, 0x32, 0x7E, 0x4C, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E4, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E5, {0x00, 0x38, 0x6C, 0x38, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x16, 0x16, 0x7E, 0xD0, 0xD0, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E7, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x18, 0x18, 0x30, 0x00}}, + {0x00E8, {0x00, 0x60, 0x30, 0x18, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00E9, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00EA, {0x00, 0x10, 0x38, 0x6C, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00EB, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00EC, {0x00, 0x30, 0x18, 0x0C, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x00ED, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x00EE, {0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x00EF, {0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F0, {0x00, 0xD8, 0x70, 0xD8, 0x0C, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F1, {0x00, 0x32, 0x7E, 0x4C, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x00F2, {0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F3, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F4, {0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F5, {0x00, 0x32, 0x7E, 0x4C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F6, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x00F7, {0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x00F8, {0x00, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xC6, 0xCE, 0xD6, 0xE6, 0xC6, 0x7C, 0x80, 0x00, 0x00, 0x00}}, + {0x00F9, {0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00FA, {0x00, 0x0C, 0x18, 0x30, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00FB, {0x00, 0x10, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00FC, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x00FD, {0x00, 0x0C, 0x18, 0x30, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x00FE, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00}}, + {0x00FF, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x0100, {0x00, 0x7C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0101, {0x00, 0x00, 0x00, 0x7C, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0102, {0x6C, 0x38, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0103, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0104, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x0C, 0x08, 0x06, 0x00}}, + {0x0105, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x0C, 0x08, 0x06, 0x00}}, + {0x0106, {0x18, 0x30, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0107, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0108, {0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0109, {0x00, 0x10, 0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x010A, {0x18, 0x18, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x010B, {0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x010C, {0x6C, 0x38, 0x10, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x010D, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x010E, {0x6C, 0x38, 0x10, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x010F, {0x6C, 0x38, 0x16, 0x06, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0110, {0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0111, {0x00, 0x00, 0x06, 0x1F, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0112, {0x00, 0x7C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0113, {0x00, 0x00, 0x00, 0x7C, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0114, {0x6C, 0x38, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0115, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0116, {0x18, 0x18, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0117, {0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0118, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x0C, 0x08, 0x06, 0x00}}, + {0x0119, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x0C, 0x08, 0x06, 0x00}}, + {0x011A, {0x6C, 0x38, 0x10, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x011B, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x011C, {0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x011D, {0x00, 0x10, 0x38, 0x6C, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x011E, {0x6C, 0x38, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x011F, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x0120, {0x18, 0x18, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0121, {0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x0122, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x18, 0x18, 0x30, 0x00}}, + {0x0123, {0x00, 0x18, 0x18, 0x30, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x0124, {0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0125, {0x38, 0x6C, 0x00, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0126, {0x00, 0x00, 0xC6, 0xFF, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0127, {0x00, 0x00, 0xC0, 0xF0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0128, {0x32, 0x4C, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0129, {0x00, 0x32, 0x7E, 0x4C, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x012A, {0x00, 0x7E, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x012B, {0x00, 0x00, 0x00, 0x7E, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x012C, {0x66, 0x3C, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x012D, {0x00, 0x66, 0x66, 0x3C, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x012E, {0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x0C, 0x08, 0x06, 0x00}}, + {0x012F, {0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x0C, 0x08, 0x06, 0x00}}, + {0x0130, {0x18, 0x18, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0131, {0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x0132, {0x00, 0x00, 0xF7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xEC, 0x00, 0x00, 0x00, 0x00}}, + {0x0133, {0x00, 0x00, 0x66, 0x66, 0x00, 0xE6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x06, 0x06, 0x1C, 0x00}}, + {0x0134, {0x38, 0x6C, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00}}, + {0x0135, {0x00, 0x18, 0x3C, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00}}, + {0x0136, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xC6, 0x18, 0x18, 0x30, 0x00}}, + {0x0137, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0xC6, 0x18, 0x18, 0x30, 0x00}}, + {0x0138, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0139, {0x18, 0x30, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x013A, {0x18, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x013B, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x18, 0x18, 0x30, 0x00}}, + {0x013C, {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1C, 0x18, 0x18, 0x30, 0x00}}, + {0x013D, {0x6C, 0x38, 0x10, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x013E, {0x6C, 0x38, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x013F, {0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xCC, 0xCC, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0140, {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x36, 0x36, 0x30, 0x30, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x0141, {0x00, 0x00, 0x60, 0x60, 0x68, 0x78, 0x70, 0xE0, 0xE0, 0x60, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x00}}, + {0x0142, {0x00, 0x00, 0x30, 0x30, 0x34, 0x3C, 0x38, 0x70, 0x70, 0x30, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x0143, {0x18, 0x30, 0x00, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0144, {0x00, 0x0C, 0x18, 0x30, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0145, {0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x18, 0x18, 0x30, 0x00}}, + {0x0146, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x18, 0x18, 0x30, 0x00}}, + {0x0147, {0x6C, 0x38, 0x10, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0148, {0x00, 0x6C, 0x38, 0x10, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0149, {0x00, 0x60, 0x60, 0xC0, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x014A, {0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x06, 0x06, 0x0C, 0x00}}, + {0x014B, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x06, 0x06, 0x0C, 0x00}}, + {0x014C, {0x00, 0x7C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x014D, {0x00, 0x00, 0x00, 0x7C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x014E, {0x6C, 0x38, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x014F, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0150, {0x66, 0xCC, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0151, {0x00, 0x36, 0x6C, 0xD8, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0152, {0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xDE, 0xD8, 0xD8, 0xD8, 0xD8, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0153, {0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xD6, 0xD6, 0xDE, 0xD0, 0xD0, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x0154, {0x18, 0x30, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0155, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0156, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x18, 0x18, 0x30, 0x00}}, + {0x0157, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x18, 0x18, 0x30, 0x00}}, + {0x0158, {0x6C, 0x38, 0x10, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0159, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x015A, {0x18, 0x30, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x015B, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x015C, {0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x015D, {0x00, 0x10, 0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x015E, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0x06, 0x06, 0xFC, 0x18, 0x18, 0x30, 0x00}}, + {0x015F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0xFC, 0x18, 0x18, 0x30, 0x00}}, + {0x0160, {0x6C, 0x38, 0x10, 0x7E, 0xC0, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0161, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7E, 0xC0, 0xC0, 0x7C, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0162, {0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x18, 0x00}}, + {0x0163, {0x00, 0x00, 0x30, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1E, 0x0C, 0x0C, 0x18, 0x00}}, + {0x0164, {0x6C, 0x38, 0x10, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x0165, {0x6C, 0x38, 0x10, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1E, 0x00, 0x00, 0x00, 0x00}}, + {0x0166, {0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x0167, {0x00, 0x00, 0x30, 0x30, 0x30, 0x7C, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x1E, 0x00, 0x00, 0x00, 0x00}}, + {0x0168, {0x32, 0x4C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0169, {0x00, 0x32, 0x7E, 0x4C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x016A, {0x00, 0x7C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x016B, {0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x016C, {0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x016D, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x016E, {0x38, 0x6C, 0x38, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x016F, {0x00, 0x38, 0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0170, {0x66, 0xCC, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0171, {0x00, 0x36, 0x6C, 0xD8, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0172, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x0C, 0x08, 0x06, 0x00}}, + {0x0173, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x0C, 0x08, 0x06, 0x00}}, + {0x0174, {0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0175, {0x00, 0x10, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xD6, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x0176, {0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0177, {0x00, 0x10, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x0178, {0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0179, {0x18, 0x30, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x017A, {0x00, 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x017B, {0x18, 0x18, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x017C, {0x00, 0x00, 0x18, 0x18, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x017D, {0x6C, 0x38, 0x10, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x017E, {0x00, 0x6C, 0x38, 0x10, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x017F, {0x00, 0x00, 0x1E, 0x30, 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00}}, + {0x0192, {0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70, 0x00}}, + {0x01CD, {0x6C, 0x38, 0x10, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x01CE, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x01CF, {0x6C, 0x38, 0x10, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x01D0, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x01D1, {0x6C, 0x38, 0x10, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x01D2, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x01D3, {0x6C, 0x38, 0x10, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x01D4, {0x00, 0x6C, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x01E2, {0x00, 0x7C, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00}}, + {0x01E3, {0x00, 0x00, 0x00, 0x7C, 0x00, 0x6E, 0x16, 0x16, 0x7E, 0xD0, 0xD0, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x01E6, {0x6C, 0x38, 0x10, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x01E7, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x01E8, {0x6C, 0x38, 0x10, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x01E9, {0x6C, 0x38, 0x10, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x01EA, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x18, 0x10, 0x0C, 0x00}}, + {0x01EB, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x18, 0x10, 0x0C, 0x00}}, + {0x01EC, {0x00, 0x7C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x18, 0x10, 0x0C, 0x00}}, + {0x01ED, {0x00, 0x00, 0x00, 0x7C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x18, 0x10, 0x0C, 0x00}}, + {0x01F0, {0x00, 0x6C, 0x38, 0x10, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00}}, + {0x01F4, {0x18, 0x30, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x01F5, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x06, 0x06, 0xFC, 0x00}}, + {0x01FC, {0x18, 0x30, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00}}, + {0x01FD, {0x00, 0x0C, 0x18, 0x30, 0x00, 0x6E, 0x16, 0x16, 0x7E, 0xD0, 0xD0, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x01FE, {0x18, 0x30, 0x02, 0x7C, 0xCE, 0xCE, 0xD6, 0xD6, 0xE6, 0xE6, 0xC6, 0x7C, 0x80, 0x00, 0x00, 0x00}}, + {0x01FF, {0x00, 0x0C, 0x18, 0x30, 0x02, 0x7C, 0xC6, 0xCE, 0xD6, 0xE6, 0xC6, 0x7C, 0x80, 0x00, 0x00, 0x00}}, + {0x0200, {0xCC, 0x66, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0201, {0x00, 0xD8, 0x6C, 0x36, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0202, {0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0203, {0x00, 0x38, 0x6C, 0x6C, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0204, {0xCC, 0x66, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0205, {0x00, 0xD8, 0x6C, 0x36, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0206, {0x38, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0207, {0x00, 0x38, 0x6C, 0x6C, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0208, {0xCC, 0x66, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0209, {0x00, 0xD8, 0x6C, 0x36, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x020A, {0x3C, 0x66, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x020B, {0x00, 0x3C, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x020C, {0xCC, 0x66, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x020D, {0x00, 0xD8, 0x6C, 0x36, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x020E, {0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x020F, {0x00, 0x38, 0x6C, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0210, {0xCC, 0x66, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0211, {0x00, 0xD8, 0x6C, 0x36, 0x00, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0212, {0x38, 0x6C, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0213, {0x00, 0x38, 0x6C, 0x6C, 0x00, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0214, {0xCC, 0x66, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0215, {0x00, 0xD8, 0x6C, 0x36, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0216, {0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0217, {0x00, 0x38, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x021E, {0x6C, 0x38, 0x10, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x021F, {0x6C, 0x38, 0x10, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0226, {0x18, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0227, {0x00, 0x00, 0x18, 0x18, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0228, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x18, 0x18, 0x30, 0x00}}, + {0x0229, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x18, 0x18, 0x30, 0x00}}, + {0x022E, {0x18, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x022F, {0x00, 0x00, 0x18, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x02C7, {0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x02D8, {0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x02D9, {0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x02DB, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x08, 0x06, 0x00}}, + {0x02DC, {0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x02DD, {0x66, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0306, {0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0308, {0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x0391, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0392, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0393, {0x00, 0x00, 0xFE, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0394, {0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x6C, 0x6C, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x0395, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0396, {0x00, 0x00, 0xFE, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x0397, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0398, {0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00}}, + {0x0399, {0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x039A, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x039B, {0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x6C, 0x6C, 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x039C, {0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x039D, {0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xD6, 0xD6, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x039F, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x03A0, {0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x03A1, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x03A3, {0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30, 0x18, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x03A4, {0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x03A5, {0x00, 0x00, 0xC3, 0xC3, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x03A6, {0x00, 0x00, 0x10, 0x7C, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x03A7, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x03A8, {0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7C, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x03A9, {0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00}}, + {0x03B1, {0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00}}, + {0x03B4, {0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x03B5, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x70, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x03BA, {0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0x00, 0x00, 0x00, 0x00}}, + {0x03BC, {0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF6, 0xC0, 0xC0, 0xC0, 0x00}}, + {0x03BD, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x03BF, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x03C0, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00}}, + {0x03C3, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00}}, + {0x03C4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00}}, + {0x03C6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7C, 0x10, 0x10, 0x00, 0x00}}, + {0x0401, {0x6C, 0x6C, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0406, {0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0407, {0x66, 0x66, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x040E, {0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0410, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0411, {0x00, 0x00, 0xFC, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0412, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0413, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0414, {0x00, 0x00, 0x1C, 0x3C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xFE, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0415, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0416, {0x00, 0x00, 0xD6, 0xD6, 0xD6, 0x7C, 0x38, 0x7C, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00, 0x00, 0x00}}, + {0x0417, {0x00, 0x00, 0xFC, 0x06, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0418, {0x00, 0x00, 0xC6, 0xC6, 0xCE, 0xCE, 0xD6, 0xD6, 0xE6, 0xE6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0419, {0x6C, 0x38, 0x00, 0xC6, 0xCE, 0xCE, 0xD6, 0xD6, 0xE6, 0xE6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x041A, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x041B, {0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x041C, {0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x041D, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x041E, {0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x041F, {0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0420, {0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0421, {0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0422, {0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x0423, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0424, {0x00, 0x00, 0x10, 0x7C, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x0425, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0426, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7F, 0x03, 0x03, 0x06, 0x00}}, + {0x0427, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00}}, + {0x0428, {0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0429, {0x00, 0x00, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7F, 0x03, 0x03, 0x06, 0x00}}, + {0x042A, {0x00, 0x00, 0xF0, 0xF0, 0x30, 0x30, 0x3C, 0x36, 0x36, 0x36, 0x36, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x042B, {0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xF6, 0xDE, 0xDE, 0xDE, 0xDE, 0xF6, 0x00, 0x00, 0x00, 0x00}}, + {0x042C, {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x36, 0x36, 0x36, 0x36, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x042D, {0x00, 0x00, 0xFC, 0x06, 0x06, 0x06, 0x3E, 0x06, 0x06, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x042E, {0x00, 0x00, 0xCC, 0xD6, 0xD6, 0xD6, 0xF6, 0xF6, 0xD6, 0xD6, 0xD6, 0xCC, 0x00, 0x00, 0x00, 0x00}}, + {0x042F, {0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0430, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0431, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0432, {0x00, 0x00, 0x70, 0xD8, 0xD8, 0xD8, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x0433, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x06, 0x06, 0x7C, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0434, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x0435, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0436, {0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x7C, 0x38, 0x38, 0x7C, 0xD6, 0xD6, 0x00, 0x00, 0x00, 0x00}}, + {0x0437, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x06, 0x06, 0x3C, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x0438, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0439, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x043A, {0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0x00, 0x00, 0x00, 0x00}}, + {0x043B, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x043C, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x043D, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x043E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x043F, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0440, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00}}, + {0x0441, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0442, {0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD6, 0xD6, 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0443, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x0444, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x7C, 0x10, 0x10, 0x00, 0x00}}, + {0x0445, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0446, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7F, 0x03, 0x03, 0x06, 0x00}}, + {0x0447, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00}}, + {0x0448, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xD6, 0x6E, 0x00, 0x00, 0x00, 0x00}}, + {0x0449, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xD6, 0x6F, 0x03, 0x03, 0x06, 0x00}}, + {0x044A, {0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x30, 0x3C, 0x36, 0x36, 0x36, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x044B, {0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xF6, 0xDE, 0xDE, 0xDE, 0xF6, 0x00, 0x00, 0x00, 0x00}}, + {0x044C, {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3C, 0x36, 0x36, 0x36, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x044D, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x06, 0x06, 0x3E, 0x06, 0x06, 0xFC, 0x00, 0x00, 0x00, 0x00}}, + {0x044E, {0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xD6, 0xD6, 0xF6, 0xD6, 0xD6, 0xCC, 0x00, 0x00, 0x00, 0x00}}, + {0x044F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x0451, {0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7E, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x0456, {0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x0457, {0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x045E, {0x00, 0x6C, 0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xFC, 0x00}}, + {0x0490, {0x00, 0x00, 0x06, 0x06, 0x7C, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x0491, {0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x7C, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x2010, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2013, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2014, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2016, {0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00}}, + {0x2018, {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2019, {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x201C, {0x00, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x201D, {0x00, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2020, {0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00}}, + {0x2021, {0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00}}, + {0x2022, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2026, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDB, 0x00, 0x00, 0x00, 0x00}}, + {0x2039, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x203A, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x203C, {0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00}}, + {0x207F, {0x00, 0x78, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x20A7, {0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xCC, 0xDE, 0xCC, 0xCC, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x20AC, {0x00, 0x00, 0x00, 0x1C, 0x36, 0x60, 0xF8, 0x60, 0xF8, 0x60, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00}}, + {0x2122, {0x00, 0x00, 0xEA, 0x4E, 0x4A, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2190, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0xFE, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2191, {0x00, 0x00, 0x18, 0x3C, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2192, {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0xFE, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2193, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x5A, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2194, {0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x44, 0xFE, 0x44, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2195, {0x00, 0x00, 0x18, 0x3C, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x5A, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x21A8, {0x00, 0x00, 0x18, 0x3C, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x5A, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00}}, + {0x2219, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x221A, {0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x6C, 0x3C, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00}}, + {0x221E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2229, {0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00}}, + {0x222A, {0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00}}, + {0x2248, {0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2261, {0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2264, {0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x2265, {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x2302, {0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2310, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2319, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2320, {0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2321, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00}}, + {0x2500, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2501, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2502, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2503, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2504, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2505, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2506, {0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00}}, + {0x2507, {0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00}}, + {0x2508, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2509, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x250A, {0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00}}, + {0x250B, {0x00, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x00}}, + {0x250C, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x250D, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x250E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x250F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2510, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2511, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2512, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2513, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2514, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2515, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2516, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2517, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2518, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2519, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x251A, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x251B, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x251C, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x251D, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x251E, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x251F, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2520, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2521, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2522, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2523, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2524, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2525, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2526, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2527, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2528, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2529, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x252A, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x252B, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x252C, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x252D, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x252E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x252F, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2530, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2531, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2532, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2533, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2534, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2535, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2536, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2537, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2538, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2539, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x253A, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x253B, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x253C, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x253D, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x253E, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x253F, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2540, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2541, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2542, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2543, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2544, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2545, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2546, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2547, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2548, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x2549, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x254A, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x254B, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x254C, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x254D, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x254E, {0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00}}, + {0x254F, {0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00}}, + {0x2550, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2551, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2552, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2553, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2554, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2555, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2556, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2557, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2558, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2559, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x255A, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x255B, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x255C, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x255D, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x255E, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x255F, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2560, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2561, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2562, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2563, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2564, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2565, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2566, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x2567, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2568, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2569, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x256A, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x256B, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x256C, {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}}, + {0x256D, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x256E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x256F, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2570, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2571, {0x01, 0x03, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0xC0, 0xC0, 0x80}}, + {0x2572, {0x80, 0xC0, 0xC0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0x03, 0x01}}, + {0x2573, {0x81, 0xC3, 0xC3, 0x66, 0x66, 0x3C, 0x3C, 0x18, 0x18, 0x3C, 0x3C, 0x66, 0x66, 0xC3, 0xC3, 0x81}}, + {0x2574, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2575, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2576, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2577, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2578, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2579, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x257A, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x257B, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x257C, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x257D, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}}, + {0x257E, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x257F, {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}}, + {0x2580, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2581, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}}, + {0x2582, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2583, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2584, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2585, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2586, {0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2587, {0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2588, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x2589, {0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE}}, + {0x258A, {0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC}}, + {0x258B, {0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8}}, + {0x258C, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}}, + {0x258D, {0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0}}, + {0x258E, {0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0}}, + {0x258F, {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}}, + {0x2590, {0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}}, + {0x2591, {0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44}}, + {0x2592, {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA}}, + {0x2593, {0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77}}, + {0x2594, {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2595, {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}}, + {0x2596, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}}, + {0x2597, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}}, + {0x2598, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2599, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x259A, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}}, + {0x259B, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}}, + {0x259C, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}}, + {0x259D, {0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x259E, {0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}}, + {0x259F, {0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x25A0, {0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25A1, {0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x44, 0x44, 0x44, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25AC, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x25B2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00}}, + {0x25BC, {0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00}}, + {0x25C6, {0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25CA, {0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25CB, {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25CF, {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25D8, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x25D9, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, + {0x25E2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF}}, + {0x25E3, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}}, + {0x25E4, {0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x25E5, {0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2630, {0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2631, {0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2632, {0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2633, {0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2634, {0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2635, {0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2636, {0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2637, {0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x263A, {0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xA5, 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x263B, {0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF, 0xFF, 0xDB, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0x263C, {0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2640, {0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2642, {0x00, 0x00, 0x0F, 0x07, 0x0D, 0x19, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x2660, {0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x2663, {0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x2665, {0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2666, {0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x266A, {0x00, 0x00, 0x7E, 0x66, 0x7E, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00}}, + {0x266B, {0x00, 0x00, 0x7E, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6E, 0xCC, 0xC0, 0x00, 0x00, 0x00}}, + {0x27E8, {0x00, 0x00, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00}}, + {0x27E9, {0x00, 0x00, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00}}, + {0x2800, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2801, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2802, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2803, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2804, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2805, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2806, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2807, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2808, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2809, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x280A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x280B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x280C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x280D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x280E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x280F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2810, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2811, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2812, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2813, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2814, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2815, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2816, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2817, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2818, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2819, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x281A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x281B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x281C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x281D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x281E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x281F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2820, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2821, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2822, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2823, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2824, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2825, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2826, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2827, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2828, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2829, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x282A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x282B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x282C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x282D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x282E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x282F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2830, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2831, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2832, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2833, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2834, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2835, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2836, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2837, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2838, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2839, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x283A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x283B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x283C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x283D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x283E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x283F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2840, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2841, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2842, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2843, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2844, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2845, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2846, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2847, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2848, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2849, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x284A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x284B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x284C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x284D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x284E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x284F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2850, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2851, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2852, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2853, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2854, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2855, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2856, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2857, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2858, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2859, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x285A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x285B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x285C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x285D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x285E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x285F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2860, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2861, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2862, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2863, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2864, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2865, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2866, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2867, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2868, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2869, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x286A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x286B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x286C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x286D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x286E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x286F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2870, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2871, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2872, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2873, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2874, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2875, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2876, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2877, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2878, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2879, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x287A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x287B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x287C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x287D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x287E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x287F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00}}, + {0x2880, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2881, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2882, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2883, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2884, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2885, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2886, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2887, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2888, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2889, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x288A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x288B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x288C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x288D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x288E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x288F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2890, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2891, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2892, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2893, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2894, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2895, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2896, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2897, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2898, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x2899, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x289A, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x289B, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x289C, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x289D, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x289E, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x289F, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A1, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A3, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A5, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A7, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A8, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28A9, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28AA, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28AB, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28AC, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28AD, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28AE, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28AF, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B1, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B3, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B5, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B7, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B8, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28B9, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28BA, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28BB, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28BC, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28BD, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28BE, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28BF, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00}}, + {0x28C0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C1, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C3, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C5, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C7, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C8, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28C9, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28CA, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28CB, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28CC, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28CD, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28CE, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28CF, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D1, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D3, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D5, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D7, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D8, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28D9, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28DA, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28DB, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28DC, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28DD, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28DE, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28DF, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E1, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E3, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E5, {0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E7, {0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E8, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28E9, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28EA, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28EB, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28EC, {0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28ED, {0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28EE, {0x00, 0x06, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28EF, {0x00, 0x66, 0x66, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F1, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F3, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F4, {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F5, {0x00, 0x60, 0x60, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F7, {0x00, 0x60, 0x60, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F8, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28F9, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28FA, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28FB, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28FC, {0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28FD, {0x00, 0x66, 0x66, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28FE, {0x00, 0x06, 0x06, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x28FF, {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}}, + {0x2B06, {0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00}}, + {0x2B07, {0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2B60, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0xFE, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2B61, {0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2B62, {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0xFE, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2B63, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0x2B64, {0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C, 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {0x2B65, {0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00}}, + {0xE0A0, {0x00, 0x00, 0xC0, 0xCC, 0xDE, 0xCC, 0xCC, 0xCC, 0x98, 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x00, 0x00}}, + {0xE0A1, {0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x38, 0x00, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x12, 0x00, 0x00}}, + {0xE0A2, {0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x7E, 0x66, 0x66, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00}}, + {0xE0B0, {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80}}, + {0xE0B1, {0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80}}, + {0xE0B2, {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}}, + {0xE0B3, {0x01, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01}}, +}; + +const std::size_t TermshotFont::kGlyphCount = 1001; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_frame.h b/taicpp/src/termshot/termshot_frame.h new file mode 100644 index 0000000..8aa9d18 --- /dev/null +++ b/taicpp/src/termshot/termshot_frame.h @@ -0,0 +1,22 @@ +#pragma once +// TermshotFrame: what was captured from a terminal, before rendering. +// TermshotError: every capture or write failure, with a reason fit for a tool result. +#include +#include +namespace detz::termshot { + +struct TermshotFrame { + std::string ansi; // bytes to feed a VT screen (SGR escapes kept) + int rows{0}; + int cols{0}; + int cursor_x{-1}; // -1: no cursor drawn + int cursor_y{-1}; + std::string source; // "tmux %3", "native pane 2", "ansi" +}; + +class TermshotError : public std::runtime_error { +public: + using std::runtime_error::runtime_error; +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_palette.cpp b/taicpp/src/termshot/termshot_palette.cpp new file mode 100644 index 0000000..a2116c0 --- /dev/null +++ b/taicpp/src/termshot/termshot_palette.cpp @@ -0,0 +1,52 @@ +#include "termshot_palette.h" +#include +namespace detz::termshot { + +namespace { +constexpr std::array kAnsi = {0x000000, 0xCD0000, 0x00CD00, 0xCDCD00, 0x0000EE, 0xCD00CD, 0x00CDCD, 0xE5E5E5, + 0x7F7F7F, 0xFF0000, 0x00FF00, 0xFFFF00, 0x5C5CFF, 0xFF00FF, 0x00FFFF, 0xFFFFFF}; +constexpr std::array kNames = {"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"}; + +std::uint32_t pack(int r, int g, int b) { + auto clamp = [](int v) { return static_cast(v < 0 ? 0 : v > 255 ? 255 : v); }; + return (clamp(r) << 16) | (clamp(g) << 8) | clamp(b); +} +} // namespace + +std::uint32_t TermshotPalette::indexed(int n) { + if (n < 0 || n > 255) return kAnsi[7]; + if (n < 16) return kAnsi[static_cast(n)]; + if (n < 232) { + int i = n - 16; + auto level = [](int v) { return v == 0 ? 0 : 55 + v * 40; }; + return pack(level(i / 36), level((i / 6) % 6), level(i % 6)); + } + int gray = 8 + (n - 232) * 10; + return pack(gray, gray, gray); +} + +std::uint32_t TermshotPalette::resolve(const tui::TuiColor& color, std::uint32_t fallback, bool bold) { + switch (color.kind) { + case tui::TuiColor::Int: + return indexed(bold && color.n < 8 ? color.n + 8 : color.n); + case tui::TuiColor::Rgb: + return pack(color.c[0], color.c[1], color.c[2]); + case tui::TuiColor::Str: { + bool bright = color.s.rfind("bright_", 0) == 0; + std::string base = bright ? color.s.substr(7) : color.s; + for (std::size_t i = 0; i < kNames.size(); i++) { + if (base == kNames[i]) return kAnsi[i + ((bright || bold) ? 8 : 0)]; + } + return fallback; + } + case tui::TuiColor::None: + break; + } + return fallback; +} + +std::uint32_t TermshotPalette::fragment(const std::optional& frag, std::uint32_t fallback, bool background, bool bold) { + return resolve(tui::TuiVtScreen::frag_to_color(frag, background), fallback, bold && !background); +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_palette.h b/taicpp/src/termshot/termshot_palette.h new file mode 100644 index 0000000..10df99b --- /dev/null +++ b/taicpp/src/termshot/termshot_palette.h @@ -0,0 +1,20 @@ +#pragma once +// TermshotPalette: SGR colors (as TuiVtScreen stores them) to 0xRRGGBB. +// 16 named colors follow the xterm defaults, 16..255 the xterm cube and gray ramp. +#include "../tui/TuiVtScreen.h" +#include +#include +#include +namespace detz::termshot { + +class TermshotPalette { +public: + // One of the 256 indexed colors. + static std::uint32_t indexed(int n); + // A TuiColor from TuiVtScreen::frag_to_color; fallback when it is unset or unknown. + static std::uint32_t resolve(const tui::TuiColor& color, std::uint32_t fallback, bool bold); + // A raw SGR fragment of a TuiVtCell ("31", "38;5;12", "48;2;r;g;b"). + static std::uint32_t fragment(const std::optional& frag, std::uint32_t fallback, bool background, bool bold); +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_png.cpp b/taicpp/src/termshot/termshot_png.cpp new file mode 100644 index 0000000..81cc417 --- /dev/null +++ b/taicpp/src/termshot/termshot_png.cpp @@ -0,0 +1,66 @@ +#include "termshot_png.h" +#include "termshot_consts.h" +#include +#include +namespace detz::termshot { + +void TermshotPng::be32(std::string& out, std::uint32_t v) { + out.push_back(static_cast(v >> 24)); + out.push_back(static_cast(v >> 16)); + out.push_back(static_cast(v >> 8)); + out.push_back(static_cast(v)); +} + +void TermshotPng::chunk(std::string& out, const char type[4], const std::string& data) { + be32(out, static_cast(data.size())); + std::string body(type, 4); + body += data; + out += body; + uLong crc = crc32(0L, reinterpret_cast(body.data()), static_cast(body.size())); + be32(out, static_cast(crc)); +} + +std::string TermshotPng::encode(const TermshotCanvas& canvas) { + const std::size_t w = static_cast(canvas.width()); + const std::size_t h = static_cast(canvas.height()); + std::string raw; + raw.reserve(h * (w * 3 + 1)); + const auto& rgb = canvas.rgb(); + for (std::size_t y = 0; y < h; y++) { + raw.push_back('\0'); // filter type 0 + raw.append(reinterpret_cast(rgb.data() + y * w * 3), w * 3); + } + uLongf packed_size = compressBound(static_cast(raw.size())); + std::string packed(packed_size, '\0'); + if (compress2(reinterpret_cast(packed.data()), &packed_size, reinterpret_cast(raw.data()), + static_cast(raw.size()), kPngCompression) != Z_OK) { + throw std::runtime_error("png: zlib compress failed"); + } + packed.resize(packed_size); + + std::string ihdr; + be32(ihdr, static_cast(w)); + be32(ihdr, static_cast(h)); + ihdr += std::string("\x08\x02\x00\x00\x00", 5); // 8 bit, RGB, deflate, filter 0, no interlace + + std::string out("\x89PNG\r\n\x1a\n", 8); + chunk(out, "IHDR", ihdr); + chunk(out, "IDAT", packed); + chunk(out, "IEND", ""); + return out; +} + +bool TermshotPng::dimensions(const std::string& png, int& width, int& height) { + if (png.size() < 24 || png.compare(0, 8, std::string("\x89PNG\r\n\x1a\n", 8)) != 0 || png.compare(12, 4, "IHDR") != 0) return false; + auto rd = [&](std::size_t at) { + return (static_cast(static_cast(png[at])) << 24) | + (static_cast(static_cast(png[at + 1])) << 16) | + (static_cast(static_cast(png[at + 2])) << 8) | + static_cast(static_cast(png[at + 3])); + }; + width = static_cast(rd(16)); + height = static_cast(rd(20)); + return true; +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_png.h b/taicpp/src/termshot/termshot_png.h new file mode 100644 index 0000000..d4925c1 --- /dev/null +++ b/taicpp/src/termshot/termshot_png.h @@ -0,0 +1,19 @@ +#pragma once +// TermshotPng: encode a TermshotCanvas as an 8-bit RGB PNG (filter 0 rows, +// zlib deflate, zlib crc32). Plus a reader of the IHDR size for tests and checks. +#include "termshot_canvas.h" +#include +namespace detz::termshot { + +class TermshotPng { +public: + static std::string encode(const TermshotCanvas& canvas); + // Width and height from a PNG's IHDR; false when the bytes are not a PNG. + static bool dimensions(const std::string& png, int& width, int& height); + +private: + static void chunk(std::string& out, const char type[4], const std::string& data); + static void be32(std::string& out, std::uint32_t v); +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_renderer.cpp b/taicpp/src/termshot/termshot_renderer.cpp new file mode 100644 index 0000000..d818b02 --- /dev/null +++ b/taicpp/src/termshot/termshot_renderer.cpp @@ -0,0 +1,53 @@ +#include "termshot_renderer.h" +#include "termshot_consts.h" +#include "termshot_palette.h" +#include "../tui/TuiVtScreen.h" +#include +namespace detz::termshot { + +using tui::TuiVtScreen; + +int TermshotRenderer::width_for(int cols) { return cols * kCellWidth + 2 * kPadding; } +int TermshotRenderer::height_for(int rows) { return rows * kCellHeight + 2 * kPadding; } + +TermshotCanvas TermshotRenderer::render(const TermshotFrame& frame) { + const int rows = std::clamp(frame.rows, kMinRows, kMaxRows); + const int cols = std::clamp(frame.cols, kMinCols, kMaxCols); + TuiVtScreen screen(rows, cols); + screen.feed(frame.ansi); + TermshotCanvas canvas(width_for(cols), height_for(rows), kDefaultBg); + + for (int y = 0; y < rows && y < static_cast(screen.grid.size()); y++) { + const auto& row = screen.grid[static_cast(y)]; + for (int x = 0; x < cols && x < static_cast(row.size()); x++) { + const auto& cell = row[static_cast(x)]; + if (!cell.set) continue; + const bool bold = (cell.attr & TuiVtScreen::ATTR_BOLD) != 0; + std::uint32_t fg = TermshotPalette::fragment(cell.fg, kDefaultFg, false, bold); + std::uint32_t bg = TermshotPalette::fragment(cell.bg, kDefaultBg, true, false); + if (cell.attr & TuiVtScreen::ATTR_REVERSE) std::swap(fg, bg); + if (cell.attr & TuiVtScreen::ATTR_DIM) { + fg = ((fg >> 1) & 0x7F7F7F) + ((bg >> 1) & 0x7F7F7F); + } + if (cell.attr & TuiVtScreen::ATTR_HIDDEN) fg = bg; + const bool cursor = (x == frame.cursor_x && y == frame.cursor_y); + if (cursor) { fg = bg; bg = kCursorColor; } + const int px = kPadding + x * kCellWidth; + const int py = kPadding + y * kCellHeight; + canvas.fill(px, py, kCellWidth, kCellHeight, bg); + if (cell.ch != U' ') canvas.glyph(px, py, TermshotFont::glyph(cell.ch), fg, bold); + if (cell.attr & TuiVtScreen::ATTR_UNDERLINE) canvas.fill(px, py + kCellHeight - 2, kCellWidth, 1, fg); + if (cell.attr & TuiVtScreen::ATTR_STRIKE) canvas.fill(px, py + kCellHeight / 2, kCellWidth, 1, fg); + } + } + // A cursor on a never-written cell still shows. + if (frame.cursor_x >= 0 && frame.cursor_y >= 0 && frame.cursor_x < cols && frame.cursor_y < rows) { + const auto& row = screen.grid[static_cast(frame.cursor_y)]; + if (static_cast(frame.cursor_x) >= row.size() || !row[static_cast(frame.cursor_x)].set) { + canvas.fill(kPadding + frame.cursor_x * kCellWidth, kPadding + frame.cursor_y * kCellHeight, kCellWidth, kCellHeight, kCursorColor); + } + } + return canvas; +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_renderer.h b/taicpp/src/termshot/termshot_renderer.h new file mode 100644 index 0000000..090303a --- /dev/null +++ b/taicpp/src/termshot/termshot_renderer.h @@ -0,0 +1,15 @@ +#pragma once +// TermshotRenderer: replay a TermshotFrame into a TuiVtScreen and paint every +// cell (background, glyph, underline, strike, cursor) onto a TermshotCanvas. +#include "termshot_canvas.h" +#include "termshot_frame.h" +namespace detz::termshot { + +class TermshotRenderer { +public: + static TermshotCanvas render(const TermshotFrame& frame); + static int width_for(int cols); + static int height_for(int rows); +}; + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_shooter.cpp b/taicpp/src/termshot/termshot_shooter.cpp new file mode 100644 index 0000000..a18a2f8 --- /dev/null +++ b/taicpp/src/termshot/termshot_shooter.cpp @@ -0,0 +1,61 @@ +#include "termshot_shooter.h" +#include "termshot_consts.h" +#include "termshot_png.h" +#include "termshot_renderer.h" +#include +#include +#include +#include +namespace fs = std::filesystem; +namespace detz::termshot { + +std::string TermshotShot::summary() const { + return "terminal screenshot " + path + " (" + std::to_string(bytes) + " bytes, " + std::to_string(width) + "x" + + std::to_string(height) + " px, " + std::to_string(rows) + " rows x " + std::to_string(cols) + " cols, " + source + + ", image/png)"; +} + +TermshotShooter::TermshotShooter(std::string home) : home_(std::move(home)) {} + +std::string TermshotShooter::png(const TermshotFrame& frame) { return TermshotPng::encode(TermshotRenderer::render(frame)); } + +std::string TermshotShooter::default_path() const { + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + auto ms = std::chrono::duration_cast(now.time_since_epoch()).count() % 1000; + std::tm tm{}; + localtime_r(&t, &tm); + char stamp[32]; + std::strftime(stamp, sizeof stamp, "%Y%m%d-%H%M%S", &tm); + char tail[8]; + std::snprintf(tail, sizeof tail, "-%03d", static_cast(ms)); + return (fs::path(home_) / kShotDir / (std::string("terminal-") + stamp + tail + ".png")).string(); +} + +TermshotShot TermshotShooter::shoot(const TermshotFrame& frame, const std::string& path_in) const { + std::string bytes = png(frame); + if (bytes.size() > kMaxPngBytes) { + throw TermshotError("screenshot is " + std::to_string(bytes.size()) + " bytes, cap is " + std::to_string(kMaxPngBytes)); + } + std::string path = path_in.empty() ? default_path() : path_in; + std::error_code ec; + fs::path parent = fs::path(path).parent_path(); + if (!parent.empty()) fs::create_directories(parent, ec); + if (ec) throw TermshotError("cannot create " + parent.string() + ": " + ec.message()); + std::ofstream out(path, std::ios::binary | std::ios::trunc); + if (!out) throw TermshotError("cannot write " + path); + out.write(bytes.data(), static_cast(bytes.size())); + out.close(); + if (!out) throw TermshotError("short write to " + path); + + TermshotShot shot; + shot.path = path; + shot.bytes = bytes.size(); + shot.rows = frame.rows; + shot.cols = frame.cols; + TermshotPng::dimensions(bytes, shot.width, shot.height); + shot.source = frame.source; + return shot; +} + +} // namespace detz::termshot diff --git a/taicpp/src/termshot/termshot_shooter.h b/taicpp/src/termshot/termshot_shooter.h new file mode 100644 index 0000000..04beada --- /dev/null +++ b/taicpp/src/termshot/termshot_shooter.h @@ -0,0 +1,30 @@ +#pragma once +// TermshotShooter: frame -> PNG bytes -> file. The one entry point for tools: +// TermshotShooter(home).shoot(TermshotCapture::current(target, reader), path) +#include "termshot_frame.h" +#include +#include +namespace detz::termshot { + +struct TermshotShot { + std::string path; + std::size_t bytes{0}; + int rows{0}, cols{0}, width{0}, height{0}; + std::string source; + std::string summary() const; // one line for a tool result +}; + +class TermshotShooter { +public: + explicit TermshotShooter(std::string home); + // Render and encode only (tests, callers that keep the bytes in memory). + static std::string png(const TermshotFrame& frame); + // Render, encode, check kMaxPngBytes, write. Empty path: /shots/terminal-.png. + TermshotShot shoot(const TermshotFrame& frame, const std::string& path = "") const; + std::string default_path() const; + +private: + std::string home_; +}; + +} // namespace detz::termshot diff --git a/taicpp/src/whatsapp/wa_binary.cpp b/taicpp/src/whatsapp/wa_binary.cpp new file mode 100644 index 0000000..0f4c618 --- /dev/null +++ b/taicpp/src/whatsapp/wa_binary.cpp @@ -0,0 +1,486 @@ +#include "wa_binary.h" + +#include + +#include +#include +#include + +#include "wa_tokens_data.h" + +namespace detz::wa { + +namespace { + +// ---------- decoder ---------- +class Decoder { + public: + explicit Decoder(const Bytes& b) : buf_(b) {} + + WaNode read_node() { + uint8_t list_tag = read_byte(); + int list_size = read_list_size(list_tag); + uint8_t header_tag = read_byte(); + std::string tag = read_string(header_tag); + if (list_size == 0 || tag.empty()) throw WireError("invalid node"); + WaNode node(std::move(tag)); + int attr_count = (list_size - 1) >> 1; + for (int i = 0; i < attr_count; ++i) { + std::string key = read_string(read_byte()); + std::string val = read_string(read_byte()); + node.attrs[key] = val; + } + if (list_size % 2 == 0) { + uint8_t content_tag = read_byte(); + if (is_list_tag(content_tag)) { + node.content = read_list(content_tag); + } else if (content_tag == WaBinary::BINARY_8) { + node.content = read_bytes(read_byte()); + } else if (content_tag == WaBinary::BINARY_20) { + node.content = read_bytes(read_int20()); + } else if (content_tag == WaBinary::BINARY_32) { + node.content = read_bytes(read_int(4)); + } else { + std::string s = read_string(content_tag); + node.content = Bytes(s.begin(), s.end()); + } + } + return node; + } + + size_t pos() const { return pos_; } + + private: + const Bytes& buf_; + size_t pos_{0}; + + void need(size_t n) { + if (pos_ + n > buf_.size()) throw WireError("end of stream"); + } + uint8_t read_byte() { + need(1); + return buf_[pos_++]; + } + Bytes read_bytes(int n) { + need(n); + Bytes b(buf_.begin() + pos_, buf_.begin() + pos_ + n); + pos_ += n; + return b; + } + int read_int(int n) { + need(n); + int v = 0; + for (int i = 0; i < n; ++i) v = (v << 8) | buf_[pos_ + i]; + pos_ += n; + return v; + } + int read_int20() { + need(3); + int v = ((buf_[pos_] & 0x0f) << 16) | (buf_[pos_ + 1] << 8) | buf_[pos_ + 2]; + pos_ += 3; + return v; + } + static bool is_list_tag(uint8_t t) { + return t == WaBinary::LIST_EMPTY || t == WaBinary::LIST_8 || t == WaBinary::LIST_16; + } + int read_list_size(uint8_t tag) { + switch (tag) { + case WaBinary::LIST_EMPTY: + return 0; + case WaBinary::LIST_8: + return read_byte(); + case WaBinary::LIST_16: + return read_int(2); + default: + throw WireError("invalid list tag"); + } + } + WaNode::Children read_list(uint8_t tag) { + int size = read_list_size(tag); + WaNode::Children items; + items.reserve(size); + for (int i = 0; i < size; ++i) items.push_back(read_node()); + return items; + } + std::string read_utf8(int n) { + Bytes b = read_bytes(n); + return std::string(b.begin(), b.end()); + } + static char unpack_nibble(uint8_t v) { + if (v <= 9) return static_cast('0' + v); + if (v == 10) return '-'; + if (v == 11) return '.'; + if (v == 15) return 0; + throw WireError("invalid nibble"); + } + static char unpack_hex(uint8_t v) { + if (v < 10) return static_cast('0' + v); + if (v < 16) return static_cast('A' + v - 10); + throw WireError("invalid hex"); + } + std::string read_packed8(uint8_t tag) { + uint8_t start = read_byte(); + int count = start & 0x7f; + bool odd = (start >> 7) != 0; + std::string out; + for (int i = 0; i < count; ++i) { + uint8_t b = read_byte(); + uint8_t hi = (b & 0xf0) >> 4, lo = b & 0x0f; + char c1 = tag == WaBinary::NIBBLE_8 ? unpack_nibble(hi) : unpack_hex(hi); + char c2 = tag == WaBinary::NIBBLE_8 ? unpack_nibble(lo) : unpack_hex(lo); + out.push_back(c1); + out.push_back(c2); + } + if (odd && !out.empty()) out.pop_back(); + return out; + } + std::string read_jid_pair() { + std::string user = read_string(read_byte()); + std::string server = read_string(read_byte()); + if (server.empty()) throw WireError("invalid jid pair"); + return user + "@" + server; + } + std::string read_ad_jid() { + uint8_t domain_type = read_byte(); + uint8_t device = read_byte(); + std::string user = read_string(read_byte()); + std::string server; + switch (domain_type) { + case 1: + server = "lid"; + break; + case 128: + server = "hosted"; + break; + case 129: + server = "hosted.lid"; + break; + default: + server = "s.whatsapp.net"; + } + if (device != 0) return user + ":" + std::to_string(device) + "@" + server; + return user + "@" + server; + } + std::string read_fb_jid() { + std::string user = read_string(read_byte()); + int device = read_int(2); + std::string server = read_string(read_byte()); + return user + ":" + std::to_string(device) + "@" + server; + } + std::string read_interop_jid() { + std::string user = read_string(read_byte()); + int device = read_int(2); + int integrator = read_int(2); + std::string server = "interop"; + size_t saved = pos_; + if (pos_ < buf_.size()) { + try { + uint8_t t = read_byte(); + server = read_string(t); + } catch (const WireError&) { + pos_ = saved; + } + } + return std::to_string(integrator) + "-" + user + ":" + std::to_string(device) + "@" + server; + } + std::string read_string(uint8_t tag) { + if (tag >= 1 && tag < kSingleByteTokens.size()) return std::string(kSingleByteTokens[tag]); + switch (tag) { + case WaBinary::DICTIONARY_0: + case WaBinary::DICTIONARY_1: + case WaBinary::DICTIONARY_2: + case WaBinary::DICTIONARY_3: { + int dict = tag - WaBinary::DICTIONARY_0; + uint8_t idx = read_byte(); + return std::string(kDoubleByteTokens[dict][idx]); + } + case WaBinary::LIST_EMPTY: + return ""; + case WaBinary::BINARY_8: + return read_utf8(read_byte()); + case WaBinary::BINARY_20: + return read_utf8(read_int20()); + case WaBinary::BINARY_32: + return read_utf8(read_int(4)); + case WaBinary::JID_PAIR: + return read_jid_pair(); + case WaBinary::FB_JID: + return read_fb_jid(); + case WaBinary::INTEROP_JID: + return read_interop_jid(); + case WaBinary::AD_JID: + return read_ad_jid(); + case WaBinary::NIBBLE_8: + case WaBinary::HEX_8: + return read_packed8(tag); + default: + throw WireError("invalid string tag " + std::to_string(tag)); + } + } +}; + +// ---------- encoder ---------- +class Encoder { + public: + Bytes take() { return std::move(buf_); } + + void write_node(const WaNode& n) { + if (n.tag.empty()) throw WireError("empty node tag"); + std::vector keys; + keys.reserve(n.attrs.size()); + for (const auto& [k, v] : n.attrs) keys.push_back(k); + std::sort(keys.begin(), keys.end()); + bool has_content = !std::holds_alternative(n.content); + int list_size = 2 * static_cast(keys.size()) + 1 + (has_content ? 1 : 0); + write_list_start(list_size); + write_string(n.tag); + for (const auto& k : keys) { + write_string(k); + write_string(n.attrs.at(k)); + } + if (has_content) { + if (const auto* b = n.bytes()) { + write_byte_length(b->size()); + buf_.insert(buf_.end(), b->begin(), b->end()); + } else if (const auto* c = n.children()) { + write_list_start(static_cast(c->size())); + for (const auto& child : *c) write_node(child); + } + } + } + + private: + Bytes buf_; + + void push(uint8_t b) { buf_.push_back(b); } + void push_int16(int v) { + push((v >> 8) & 0xff); + push(v & 0xff); + } + void push_int20(int v) { + push((v >> 16) & 0x0f); + push((v >> 8) & 0xff); + push(v & 0xff); + } + void push_int32(uint32_t v) { + push((v >> 24) & 0xff); + push((v >> 16) & 0xff); + push((v >> 8) & 0xff); + push(v & 0xff); + } + void write_list_start(int size) { + if (size == 0) { + push(WaBinary::LIST_EMPTY); + } else if (size < 256) { + push(WaBinary::LIST_8); + push(static_cast(size)); + } else { + push(WaBinary::LIST_16); + push_int16(size); + } + } + void write_byte_length(size_t length) { + if (length >= (1u << 20)) { + push(WaBinary::BINARY_32); + push_int32(static_cast(length)); + } else if (length >= 256) { + push(WaBinary::BINARY_20); + push_int20(static_cast(length)); + } else { + push(WaBinary::BINARY_8); + push(static_cast(length)); + } + } + void write_string_raw(const std::string& s) { + write_byte_length(s.size()); + buf_.insert(buf_.end(), s.begin(), s.end()); + } + static bool is_nibble(const std::string& s) { + if (s.empty() || s.size() > WaBinary::PACKED_MAX) return false; + for (char c : s) + if (!((c >= '0' && c <= '9') || c == '-' || c == '.')) return false; + return true; + } + static bool is_hex(const std::string& s) { + if (s.empty() || s.size() > WaBinary::PACKED_MAX) return false; + for (char c : s) + if (!((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))) return false; + return true; + } + static uint8_t pack_nibble(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c == '-') return 10; + if (c == '.') return 11; + if (c == 0) return 15; + throw WireError("invalid nibble char"); + } + static uint8_t pack_hex(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return 10 + c - 'A'; + if (c == 0) return 15; + throw WireError("invalid hex char"); + } + void write_packed(const std::string& s, bool nibble) { + push(nibble ? WaBinary::NIBBLE_8 : WaBinary::HEX_8); + int rounded = static_cast((s.size() + 1) / 2); + uint8_t start = static_cast(rounded); + if (s.size() % 2 != 0) start |= 0x80; + push(start); + auto pack = nibble ? pack_nibble : pack_hex; + size_t half = s.size() / 2; + for (size_t i = 0; i < half; ++i) push((pack(s[2 * i]) << 4) | pack(s[2 * i + 1])); + if (s.size() % 2 != 0) push((pack(s[s.size() - 1]) << 4) | pack(0)); + } + // single/double token lookup + bool single_token(const std::string& s, uint8_t& idx) { + for (size_t i = 1; i < kSingleByteTokens.size(); ++i) + if (kSingleByteTokens[i] == s) { + idx = static_cast(i); + return true; + } + return false; + } + bool double_token(const std::string& s, int& dict, uint8_t& idx) { + for (int d = 0; d < 4; ++d) + for (size_t i = 0; i < 256; ++i) + if (kDoubleByteTokens[d][i] == s) { + dict = d; + idx = static_cast(i); + return true; + } + return false; + } + struct JidParts { + std::string user, server; + int device{0}; + int domain_type{0}; + bool has_device{false}; + }; + static bool parse_jid(const std::string& jid, JidParts& out) { + size_t at = jid.find('@'); + if (at == std::string::npos) return false; + out.server = jid.substr(at + 1); + std::string user_combined = jid.substr(0, at); + size_t colon = user_combined.find(':'); + if (colon != std::string::npos) { + out.user = user_combined.substr(0, colon); + out.has_device = true; + out.device = std::atoi(user_combined.substr(colon + 1).c_str()); + } else { + out.user = user_combined; + } + size_t under = out.user.find('_'); + if (under != std::string::npos) out.user = out.user.substr(0, under); + if (out.server == "lid") + out.domain_type = 1; + else if (out.server == "hosted") + out.domain_type = 128; + else if (out.server == "hosted.lid") + out.domain_type = 129; + return true; + } + void write_jid(const JidParts& j) { + if (j.has_device) { + push(WaBinary::AD_JID); + push(static_cast(j.domain_type)); + push(static_cast(j.device)); + write_string(j.user); + return; + } + push(WaBinary::JID_PAIR); + if (j.user.empty()) + push(WaBinary::LIST_EMPTY); + else + write_string(j.user); + write_string(j.server); + } + void write_string(const std::string& s) { + if (s.empty()) { + write_string_raw(s); + return; + } + uint8_t idx; + if (single_token(s, idx)) { + push(idx); + return; + } + int dict; + uint8_t didx; + if (double_token(s, dict, didx)) { + push(static_cast(WaBinary::DICTIONARY_0 + dict)); + push(didx); + return; + } + if (is_nibble(s)) { + write_packed(s, true); + return; + } + if (is_hex(s)) { + write_packed(s, false); + return; + } + JidParts j; + if (parse_jid(s, j)) { + write_jid(j); + return; + } + write_string_raw(s); + } +}; + +} // namespace + +Bytes WaBinary::encode(const WaNode& node) { + Encoder e; + e.write_node(node); + return e.take(); +} + +WaNode WaBinary::decode(const Bytes& data) { + Decoder d(data); + return d.read_node(); +} + +Bytes WaBinary::unpack(const Bytes& data) { + if (data.empty()) throw WireError("empty frame"); + uint8_t flags = data[0]; + Bytes body(data.begin() + 1, data.end()); + if ((flags & 2) == 0) return body; + // zlib inflate + z_stream zs{}; + if (inflateInit(&zs) != Z_OK) throw WireError("inflateInit failed"); + zs.next_in = body.data(); + zs.avail_in = static_cast(body.size()); + Bytes out; + Bytes chunk(16384); + int ret; + do { + zs.next_out = chunk.data(); + zs.avail_out = static_cast(chunk.size()); + ret = inflate(&zs, Z_NO_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) { + inflateEnd(&zs); + throw WireError("inflate failed"); + } + out.insert(out.end(), chunk.data(), chunk.data() + (chunk.size() - zs.avail_out)); + } while (ret != Z_STREAM_END); + inflateEnd(&zs); + return out; +} + +std::string WaNode::debug() const { + std::string s = "<" + tag; + for (const auto& [k, v] : attrs) s += " " + k + "=\"" + v + "\""; + if (const auto* c = children()) { + s += ">"; + for (const auto& n : *c) s += n.tag + " "; + s += ""; + } else if (const auto* b = bytes()) { + s += " #" + std::to_string(b->size()) + "bytes/>"; + } else { + s += "/>"; + } + return s; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_binary.h b/taicpp/src/whatsapp/wa_binary.h new file mode 100644 index 0000000..48271f2 --- /dev/null +++ b/taicpp/src/whatsapp/wa_binary.h @@ -0,0 +1,53 @@ +#pragma once +// WaBinary: encode/decode WhatsApp's binary-XML node format (token dictionary +// v3, nibble/hex packing, JID encoding). Static, stateless. Ported from wa-go +// internal/wire codec.go (MIT) and whatsmeow binary (MPL-2.0); the behaviour +// referee is whatsmeow. See docs/whatsapp.md section 5. +#include +#include + +#include "wa_node.h" + +namespace detz::wa { + +// Thrown on a malformed node stream (truncated, bad tag, out-of-range token). +class WireError : public std::runtime_error { + public: + explicit WireError(const std::string& m) : std::runtime_error("wa wire: " + m) {} +}; + +class WaBinary { + public: + // Encode a node to its binary representation (no frame header, no compression). + static Bytes encode(const WaNode& node); + // Decode a single node from a decrypted stanza payload. The payload may be + // prefixed with whatsmeow's 1-byte "flags" header (bit 1 = zlib); unpack() + // handles that. decode() assumes the flag byte is already removed. + static WaNode decode(const Bytes& data); + // Strip the 1-byte flags header and inflate if the zlib bit is set. + static Bytes unpack(const Bytes& data); + + // tag constants (wa-go token.go) + enum : uint8_t { + LIST_EMPTY = 0, + STREAM_END = 2, + DICTIONARY_0 = 236, + DICTIONARY_1 = 237, + DICTIONARY_2 = 238, + DICTIONARY_3 = 239, + INTEROP_JID = 245, + FB_JID = 246, + AD_JID = 247, + LIST_8 = 248, + LIST_16 = 249, + JID_PAIR = 250, + HEX_8 = 251, + BINARY_8 = 252, + BINARY_20 = 253, + BINARY_32 = 254, + NIBBLE_8 = 255, + PACKED_MAX = 127, + }; +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_client.cpp b/taicpp/src/whatsapp/wa_client.cpp new file mode 100644 index 0000000..4828bd8 --- /dev/null +++ b/taicpp/src/whatsapp/wa_client.cpp @@ -0,0 +1,534 @@ +#include "wa_client.h" + +#include + +#include +#include + +#include "seal_base64.h" +#include "wa_binary.h" +#include "wa_consts.h" +#include "wa_proto.h" +#include "wa_signal.h" + +namespace detz::wa { + +namespace { +std::string b64(const Bytes& b) { return seal::SealBase64::encode(std::string(b.begin(), b.end())); } +Bytes from_bytes_content(const WaNode* n) { + if (n == nullptr) return {}; + if (const auto* b = n->bytes()) return *b; + return {}; +} +constexpr std::array kAdvAccountPrefix = {6, 0}; +constexpr std::array kAdvDevicePrefix = {6, 1}; +} // namespace + +WaClient::WaClient(WaStorePort& store) : store_(store) { + if (auto d = store_.load_device()) device_ = *d; + else { + device_ = WaDevice::generate(); + store_.save_device(device_); + } +} + +WaClient::~WaClient() { disconnect(); } + +void WaClient::log(const std::string& s) { + if (on_log) on_log(s); +} + +std::string WaClient::next_iq_id() { return std::to_string(++iq_counter_) + "." + std::to_string(::getpid() & 0xffff); } + +bool WaClient::connect() { + sock_ = std::make_unique(); + try { + sock_->connect(WaConsts::kWaConnectTimeout); + } catch (const std::exception& e) { + log(std::string("connect failed: ") + e.what()); + return false; + } + return do_handshake(); +} + +bool WaClient::do_handshake() { + auto eph = WaCrypto::generate_x25519(); + noise_ = std::make_unique(eph.pub); + Bytes hello = encode_client_hello(Bytes(eph.pub.begin(), eph.pub.end())); + try { + sock_->send_frame(WaFraming::frame(hello, true)); + } catch (const std::exception& e) { + log(std::string("send clientHello: ") + e.what()); + return false; + } + auto sh = sock_->recv_frame(WaConsts::kWaConnectTimeout); + if (!sh) { + log("no serverHello"); + return false; + } + auto res = noise_->client_handshake(eph.priv, eph.pub, device_.noise_key.priv, device_.noise_key.pub, *sh, + device_.client_payload()); + if (!res) { + log("noise handshake failed"); + return false; + } + try { + sock_->send_frame(WaFraming::frame(res->client_finish, false)); + } catch (const std::exception& e) { + log(std::string("send clientFinish: ") + e.what()); + return false; + } + log(device_.paired() ? "handshake ok (login)" : "handshake ok (registration)"); + return true; +} + +void WaClient::send_node(const WaNode& node) { + Bytes plain = WaBinary::encode(node); + // prepend the 1-byte flags header (0 = no compression) + Bytes framed_plain; + framed_plain.push_back(0); + framed_plain.insert(framed_plain.end(), plain.begin(), plain.end()); + Bytes ct = noise_->transport_encrypt(framed_plain); + sock_->send_frame(WaFraming::frame(ct, false)); +} + +std::optional WaClient::recv_node(int timeout_seconds) { + auto fr = sock_->recv_frame(timeout_seconds); + if (!fr) return std::nullopt; + auto pt = noise_->transport_decrypt(*fr); + if (!pt) { + log("transport decrypt failed"); + return std::nullopt; + } + try { + return WaBinary::decode(WaBinary::unpack(*pt)); + } catch (const std::exception& e) { + log(std::string("node decode failed: ") + e.what()); + return std::nullopt; + } +} + +void WaClient::send_ack(const WaNode& node) { + WaNode ack("ack"); + ack.attrs["class"] = node.tag; + ack.attrs["id"] = node.attr("id"); + ack.attrs["to"] = node.attr("from"); + if (node.has_attr("participant")) ack.attrs["participant"] = node.attr("participant"); + if (node.tag != "message" && node.has_attr("type")) ack.attrs["type"] = node.attr("type"); + send_node(ack); +} + +void WaClient::dispatch(const WaNode& node) { + if (node.tag == "iq") { + if (node.child("pair-device")) { + handle_pair_device(node); + } else if (node.child("pair-success")) { + handle_pair_success(node); + } + } else if (node.tag == "success") { + logged_in_ = true; + log("logged in"); + } else if (node.tag == "failure" || node.tag == "stream:error") { + log("server " + node.tag + ": " + node.attr("reason") + node.attr("code")); + } else if (node.tag == "ib" || node.tag == "iq") { + // ignored informational nodes + } +} + +void WaClient::handle_pair_device(const WaNode& iq) { + // ack the iq + WaNode result("iq"); + result.attrs["to"] = iq.attr("from"); + result.attrs["id"] = iq.attr("id"); + result.attrs["type"] = "result"; + send_node(result); + const WaNode* pd = iq.child("pair-device"); + std::vector codes; + for (const WaNode* ref : pd->all("ref")) { + Bytes rb = from_bytes_content(ref); + if (!rb.empty()) codes.push_back(make_qr(rb)); + } + log("pair-device: " + std::to_string(codes.size()) + " QR refs"); + if (on_qr) on_qr(codes); +} + +std::string WaClient::make_qr(const Bytes& ref) const { + // whatsmeow makeQRData: wa.me URL with ref,noise,identity,adv,clientType + std::string ref_s(ref.begin(), ref.end()); + std::string noise = b64(Bytes(device_.noise_key.pub.begin(), device_.noise_key.pub.end())); + std::string ident = b64(Bytes(device_.identity_key.pub.begin(), device_.identity_key.pub.end())); + std::string adv = b64(Bytes(device_.adv_secret.begin(), device_.adv_secret.end())); + return "https://wa.me/settings/linked_devices#" + ref_s + "," + noise + "," + ident + "," + adv + ",1"; +} + +void WaClient::handle_pair_success(const WaNode& iq) { + const WaNode* ps = iq.child("pair-success"); + if (ps == nullptr) return; + const WaNode* di = ps->child("device-identity"); + const WaNode* dev = ps->child("device"); + if (di == nullptr || dev == nullptr) { + log("pair-success missing device-identity/device"); + return; + } + Bytes container_bytes = from_bytes_content(di); + std::string jid = dev->attr("jid"); + std::string lid = dev->attr("lid"); + + auto container = parse_adv_hmac(container_bytes); + if (!container) { + log("pair: bad device identity container"); + return; + } + // verify HMAC over details with advSecret (non-hosted path) + Bytes mac = WaCrypto::hmac_sha256(Bytes(device_.adv_secret.begin(), device_.adv_secret.end()), container->details); + if (!WaCrypto::const_time_eq(mac, container->hmac)) { + log("pair: HMAC mismatch"); + return; + } + auto ident = parse_adv_identity(container->details); + if (!ident) { + log("pair: bad signed device identity"); + return; + } + auto details = parse_adv_device_identity(ident->details); + if (!details) { + log("pair: bad device identity details"); + return; + } + // verify account signature: prefix(6,0) || details || our-identity-pub + if (ident->account_signature_key.size() != 32 || ident->account_signature.size() != 64) { + log("pair: bad account signature fields"); + return; + } + Bytes acc_msg(kAdvAccountPrefix.begin(), kAdvAccountPrefix.end()); + acc_msg.insert(acc_msg.end(), ident->details.begin(), ident->details.end()); + acc_msg.insert(acc_msg.end(), device_.identity_key.pub.begin(), device_.identity_key.pub.end()); + std::array acc_key{}; + std::copy(ident->account_signature_key.begin(), ident->account_signature_key.end(), acc_key.begin()); + std::array acc_sig{}; + std::copy(ident->account_signature.begin(), ident->account_signature.end(), acc_sig.begin()); + if (!WaCrypto::xeddsa_verify(acc_key, acc_msg, acc_sig)) { + log("pair: account signature verification failed"); + return; + } + // our device signature: prefix(6,1) || details || our-identity-pub || accountSignatureKey + Bytes dev_msg(kAdvDevicePrefix.begin(), kAdvDevicePrefix.end()); + dev_msg.insert(dev_msg.end(), ident->details.begin(), ident->details.end()); + dev_msg.insert(dev_msg.end(), device_.identity_key.pub.begin(), device_.identity_key.pub.end()); + dev_msg.insert(dev_msg.end(), ident->account_signature_key.begin(), ident->account_signature_key.end()); + auto dev_sig = WaCrypto::xeddsa_sign(device_.identity_key.priv, dev_msg); + ident->device_signature = Bytes(dev_sig.begin(), dev_sig.end()); + + // store the full account identity (with signature key) for message device-identity nodes + device_.account = ident->encode(); + // the self-signed identity we return omits the account signature key + WaADVSignedDeviceIdentity self = *ident; + self.account_signature_key.clear(); + Bytes self_bytes = self.encode(); + + device_.jid = jid; + if (!lid.empty()) device_.lid = lid; + store_.save_device(device_); + + // respond with pair-device-sign + WaNode sign("device-identity"); + sign.attrs["key-index"] = std::to_string(details->key_index); + sign.content = self_bytes; + WaNode outer("pair-device-sign"); + outer.content = WaNode::Children{sign}; + WaNode result("iq"); + result.attrs["to"] = iq.attr("from"); + result.attrs["type"] = "result"; + result.attrs["id"] = iq.attr("id"); + result.content = WaNode::Children{outer}; + send_node(result); + + paired_event_ = true; + log("paired as " + jid); + if (on_paired) on_paired(jid); +} + +void WaClient::run_until(const std::function& stop, int timeout_seconds) { + auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(timeout_seconds); + while (std::chrono::steady_clock::now() < deadline) { + if (stop && stop()) return; + if (paired_event_) return; + auto node = recv_node(2); + if (node) dispatch(*node); + } +} + +std::string WaClient::addr_of(const std::string& device_jid) { + // "user[:device]@server" -> "user.device" (device 0 when absent) + size_t at = device_jid.find('@'); + std::string ud = at == std::string::npos ? device_jid : device_jid.substr(0, at); + size_t colon = ud.find(':'); + if (colon == std::string::npos) return ud + ".0"; + return ud.substr(0, colon) + "." + ud.substr(colon + 1); +} + +std::optional WaClient::send_iq(const WaNode& iq, int timeout_seconds) { + std::string id = iq.attr("id"); + send_node(iq); + auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(timeout_seconds); + while (std::chrono::steady_clock::now() < deadline) { + auto node = recv_node(2); + if (!node) continue; + if (node->tag == "iq" && node->attr("id") == id) return node; + dispatch(*node); // handle anything else (keepalive, notifications) + } + return std::nullopt; +} + +std::vector WaClient::usync_devices(const std::vector& jids) { + WaNode query("query"); + WaNode devices("devices"); + devices.attrs["version"] = "2"; + query.content = WaNode::Children{devices}; + WaNode list("list"); + WaNode::Children users; + for (const auto& j : jids) { + WaNode u("user"); + u.attrs["jid"] = j; + users.push_back(u); + } + list.content = users; + WaNode usync("usync"); + usync.attrs["context"] = "message"; + usync.attrs["mode"] = "query"; + usync.attrs["sid"] = next_iq_id(); + usync.attrs["last"] = "true"; + usync.attrs["index"] = "0"; + usync.content = WaNode::Children{query, list}; + WaNode iq("iq"); + iq.attrs["to"] = "s.whatsapp.net"; + iq.attrs["type"] = "get"; + iq.attrs["xmlns"] = "usync"; + iq.attrs["id"] = next_iq_id(); + iq.content = WaNode::Children{usync}; + + std::vector out; + auto reply = send_iq(iq, 30); + if (!reply) return out; + const WaNode* u = reply->child("usync"); + if (u == nullptr) return out; + const WaNode* l = u->child("list"); + if (l == nullptr) return out; + for (const WaNode* user : l->all("user")) { + std::string jid = user->attr("jid"); + size_t at = jid.find('@'); + std::string server = at == std::string::npos ? "s.whatsapp.net" : jid.substr(at + 1); + std::string userpart = at == std::string::npos ? jid : jid.substr(0, at); + const WaNode* dn = user->child("devices"); + if (dn == nullptr) continue; + const WaNode* dl = dn->child("device-list"); + if (dl == nullptr) continue; + for (const WaNode* dev : dl->all("device")) { + std::string id = dev->attr("id"); + if (id == "0" || id.empty()) + out.push_back(userpart + "@" + server); + else + out.push_back(userpart + ":" + id + "@" + server); + } + } + return out; +} + +bool WaClient::ensure_sessions(const std::vector& device_jids) { + std::vector missing; + for (const auto& d : device_jids) + if (!store_.load_session(addr_of(d))) missing.push_back(d); + if (missing.empty()) return true; + // fetch prekey bundles + WaNode key("key"); + WaNode::Children users; + for (const auto& j : missing) { + WaNode u("user"); + u.attrs["jid"] = j; + users.push_back(u); + } + key.content = users; + WaNode iq("iq"); + iq.attrs["to"] = "s.whatsapp.net"; + iq.attrs["type"] = "get"; + iq.attrs["xmlns"] = "encrypt"; + iq.attrs["id"] = next_iq_id(); + iq.content = WaNode::Children{key}; + auto reply = send_iq(iq, 30); + if (!reply) return false; + const WaNode* list = reply->child("list"); + if (list == nullptr) return false; + auto get_bytes = [](const WaNode* n, const char* tag) -> Bytes { + if (n == nullptr) return {}; + const WaNode* c = n->child(tag); + if (c == nullptr) return {}; + if (const auto* b = c->bytes()) return *b; + return {}; + }; + auto strip05 = [](const Bytes& b) { + if (b.size() == 33) return Bytes(b.begin() + 1, b.end()); + return b; + }; + for (const WaNode* user : list->all("user")) { + std::string jid = user->attr("jid"); + Bytes ident = strip05(get_bytes(user, "identity")); + const WaNode* skey = user->child("skey"); + if (ident.size() != 32 || skey == nullptr) continue; + Bytes spk = strip05(get_bytes(skey, "value")); + Bytes sig = get_bytes(skey, "signature"); + if (spk.size() != 32 || sig.size() != 64) continue; + WaSession::InitiatorParams p; + p.local_identity = device_.identity_key; + p.local_base = WaCrypto::generate_x25519(); + std::array id32{}, spk32{}; + std::copy(ident.begin(), ident.end(), id32.begin()); + std::copy(spk.begin(), spk.end(), spk32.begin()); + p.remote_identity = signal_pub(id32); + p.remote_signed_pre = signal_pub(spk32); + const WaNode* pk = user->child("key"); + uint32_t spk_id = 0; + { + Bytes idb = get_bytes(skey, "id"); + for (uint8_t x : idb) spk_id = (spk_id << 8) | x; + } + uint32_t pk_id = 0; + if (pk != nullptr) { + Bytes pkv = strip05(get_bytes(pk, "value")); + if (pkv.size() == 32) { + std::array pk32{}; + std::copy(pkv.begin(), pkv.end(), pk32.begin()); + p.remote_pre_key = signal_pub(pk32); + p.has_pre_key = true; + Bytes idb = get_bytes(pk, "id"); + for (uint8_t x : idb) pk_id = (pk_id << 8) | x; + } + } + // verify signed prekey signature with the remote identity + Bytes signed_msg(1, 0x05); + signed_msg.insert(signed_msg.end(), spk.begin(), spk.end()); + std::array sig64{}; + std::copy(sig.begin(), sig.end(), sig64.begin()); + if (!WaCrypto::xeddsa_verify(id32, signed_msg, sig64)) { + log("prekey signature verify failed for " + jid); + continue; + } + WaSession s = WaSession::initiate(p, WaCrypto::generate_x25519()); + s.set_pending(device_.registration_id, signal_pub(p.local_base.pub), spk_id, p.has_pre_key, pk_id); + // find which device jid this user maps to (match by user part) + for (const auto& d : missing) + if (d.substr(0, d.find('@')).substr(0, d.find(':') == std::string::npos ? d.find('@') : d.find(':')) == + jid.substr(0, jid.find('@'))) + store_.save_session(addr_of(d), s.serialize()); + } + return true; +} + +std::vector WaClient::encrypt_for_devices(const std::vector& device_jids, + const Bytes& plaintext) { + std::vector nodes; + for (const auto& d : device_jids) { + auto blob = store_.load_session(addr_of(d)); + if (!blob) continue; + auto sess = WaSession::deserialize(*blob); + if (!sess) continue; + auto ct = sess->encrypt(plaintext); + store_.save_session(addr_of(d), sess->serialize()); + WaNode enc("enc"); + enc.attrs["v"] = "2"; + enc.attrs["type"] = ct.type; + enc.content = ct.serialized; + WaNode to("to"); + to.attrs["jid"] = d; + to.content = WaNode::Children{enc}; + nodes.push_back(to); + } + return nodes; +} + +std::optional WaClient::send_message(const std::string& to_jid, const Bytes& message_plaintext, + const Bytes& dsm_plaintext, const std::string& media_type) { + (void)dsm_plaintext; + if (!logged_in_) { + log("send: not logged in"); + return std::nullopt; + } + auto devices = usync_devices({to_jid}); + if (devices.empty()) { + log("send: recipient not on WhatsApp or no devices"); + return std::nullopt; + } + if (!ensure_sessions(devices)) { + log("send: could not establish sessions"); + return std::nullopt; + } + auto part_nodes = encrypt_for_devices(devices, WaCrypto::pkcs7_pad(message_plaintext)); + if (part_nodes.empty()) { + log("send: no recipients encrypted"); + return std::nullopt; + } + std::string msg_id = "3EB0" + [&] { + Bytes r = WaCrypto::random_bytes(8); + static const char* H = "0123456789ABCDEF"; + std::string s; + for (uint8_t c : r) { + s.push_back(H[c >> 4]); + s.push_back(H[c & 0xf]); + } + return s; + }(); + WaNode participants("participants"); + participants.content = WaNode::Children(part_nodes.begin(), part_nodes.end()); + WaNode::Children content{participants}; + if (!device_.account.empty()) { + WaNode di("device-identity"); + di.content = device_.account; + content.push_back(di); + } + WaNode message("message"); + message.attrs["id"] = msg_id; + message.attrs["to"] = to_jid; + message.attrs["type"] = media_type.empty() ? "text" : "media"; + message.content = content; + send_node(message); + // wait for the server ack + auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(20); + while (std::chrono::steady_clock::now() < deadline) { + auto node = recv_node(2); + if (!node) continue; + if (node->tag == "ack" && node->attr("id") == msg_id) return msg_id; + if (node->tag == "message" || node->tag == "receipt") send_ack(*node); + else dispatch(*node); + } + log("send: no ack received (message may still have been delivered)"); + return msg_id; // the node was sent; ack is best-effort +} + +std::optional WaClient::send_text(const std::string& to_jid, const std::string& text) { + WaMessage m; + m.conversation = text; + Bytes plain = m.encode(); + // own-device fanout (DeviceSentMessage) omitted for brevity; the recipient + // still receives the message. See docs/whatsapp.md for the full fan-out. + return send_message(to_jid, plain, {}, ""); +} + +std::optional WaClient::send_image(const std::string& to_jid, const Bytes& image, + const std::string& mimetype, const std::string& caption) { + // Image send needs media upload (WaMedia), which is specified but not wired + // here; this path returns nullopt until the media layer lands. + (void)image; + (void)mimetype; + (void)caption; + (void)to_jid; + log("send_image: media upload not yet wired (see docs/whatsapp.md)"); + return std::nullopt; +} + +void WaClient::disconnect() { + if (sock_) sock_->close(); + sock_.reset(); + noise_.reset(); + logged_in_ = false; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_client.h b/taicpp/src/whatsapp/wa_client.h new file mode 100644 index 0000000..39b387c --- /dev/null +++ b/taicpp/src/whatsapp/wa_client.h @@ -0,0 +1,107 @@ +#pragma once +// WaClient: the WhatsApp Web client state machine, tying the socket, Noise +// handshake, device identity, pairing, prekeys and the Signal session together. +// Orchestration follows whatsmeow (MPL-2.0); see docs/whatsapp.md. The connect +// and Noise/QR path is verified against the live server; pairing completion and +// message send require a linked phone and are not verified in-tree. +#include +#include +#include +#include +#include +#include + +#include "wa_device.h" +#include "wa_node.h" +#include "wa_noise.h" +#include "wa_socket.h" + +namespace detz::wa { + +// Persistence the client needs: the device identity, Signal sessions keyed by +// signal address (e.g. "15551234567.0"), identities, and one-time prekeys. +// Implemented over the vault by WaSqliteStore (src/whatsapp/wa_store.*). +class WaStorePort { + public: + virtual ~WaStorePort() = default; + virtual std::optional load_device() = 0; + virtual void save_device(const WaDevice&) = 0; + virtual std::optional load_session(const std::string& addr) = 0; + virtual void save_session(const std::string& addr, const Bytes& blob) = 0; + // one-time prekeys: store id->priv, fetch+consume by id + virtual void put_prekey(uint32_t id, const Bytes& priv) = 0; + virtual std::optional get_prekey(uint32_t id) = 0; + // contacts / aliases (name -> jid) + virtual void put_contact(const std::string& jid, const std::string& name) = 0; + virtual std::vector> contacts() = 0; // (jid,name) +}; + +class WaClient { + public: + explicit WaClient(WaStorePort& store); + ~WaClient(); + + // Callbacks the wizard/tools hook. All optional. + std::function& qr_codes)> on_qr; // registration: QR strings to show + std::function on_paired; // pairing completed, device saved + std::function on_log; // human-readable progress + + // Connect, run the Noise handshake, and send the ClientPayload (registration + // when the device is unpaired, login when paired). Returns false on failure. + bool connect(); + bool logged_in() const { return logged_in_; } + + // Pump the connection: read and dispatch nodes until `until` returns true, a + // deadline passes, or the socket closes. Used by the link wizard to wait for + // pair-success. Returns when paired (if waiting to pair) or on timeout. + void run_until(const std::function& stop, int timeout_seconds); + + // Send a 1:1 text message. Requires a paired, logged-in client. Returns the + // message id on success. Live path, not verified in-tree. + std::optional send_text(const std::string& to_jid, const std::string& text); + // Send a 1:1 image (PNG/JPEG bytes) with optional caption. Live path. + std::optional send_image(const std::string& to_jid, const Bytes& image, const std::string& mimetype, + const std::string& caption); + + void disconnect(); + + // Build the QR string for a pair-device ref (whatsmeow makeQRData format). + std::string make_qr(const Bytes& ref) const; + + private: + WaStorePort& store_; + WaDevice device_; + std::unique_ptr sock_; + std::unique_ptr noise_; + bool logged_in_{false}; + bool paired_event_{false}; + uint64_t iq_counter_{0}; + + void log(const std::string& s); + bool do_handshake(); + // send a binary node (framed + noise transport encrypted) + void send_node(const WaNode& node); + std::optional recv_node(int timeout_seconds); + void dispatch(const WaNode& node); + void handle_pair_device(const WaNode& iq); + void handle_pair_success(const WaNode& iq); + void send_ack(const WaNode& node); + std::string next_iq_id(); + + // --- send path helpers (live, unverified in-tree) --- + // one synchronous iq request/response, matching by id + std::optional send_iq(const WaNode& iq, int timeout_seconds); + // device JIDs for a set of user JIDs via usync + std::vector usync_devices(const std::vector& jids); + // ensure a Signal session exists for each device jid (fetch prekeys if not) + bool ensure_sessions(const std::vector& device_jids); + // encrypt plaintext for each device, returning nodes + std::vector encrypt_for_devices(const std::vector& device_jids, const Bytes& plaintext); + // signal store address for a device jid + static std::string addr_of(const std::string& device_jid); + // the common send core for a prepared Message + std::optional send_message(const std::string& to_jid, const Bytes& message_plaintext, + const Bytes& dsm_plaintext, const std::string& media_type); +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_consts.h b/taicpp/src/whatsapp/wa_consts.h new file mode 100644 index 0000000..9110b9a --- /dev/null +++ b/taicpp/src/whatsapp/wa_consts.h @@ -0,0 +1,26 @@ +#pragma once +// WaConsts: the fixed values of the WhatsApp Web protocol, tracked against +// whatsmeow (MPL-2.0) at each release. See docs/whatsapp.md section 8. +#include +#include +#include + +namespace detz::wa { + +struct WaConsts { + // WhatsApp Web client version (whatsmeow store/clientpayload.go). A stale + // value makes the server answer with a 405 "client outdated" failure. + static constexpr std::array kClientVersion = {2, 3000, 1050728964}; + + // hard caps (CLAUDE.md: everything gets a ceiling) + static constexpr int kWaSendPerMinute = 10; + static constexpr int kWaSendPerDay = 200; + static constexpr int kWaPrekeyBatch = 50; // whatsmeow WantedPreKeyCount + static constexpr int kWaMinPrekeys = 5; // whatsmeow MinPreKeyCount + static constexpr int kWaConnectTimeout = 20; // seconds + static constexpr int kWaPairTimeout = 120; // seconds + static constexpr size_t kWaImageMax = 16u * 1024 * 1024; + static constexpr int kWaContactsMax = 5000; +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_crypto.cpp b/taicpp/src/whatsapp/wa_crypto.cpp new file mode 100644 index 0000000..fcc0732 --- /dev/null +++ b/taicpp/src/whatsapp/wa_crypto.cpp @@ -0,0 +1,350 @@ +#include "wa_crypto.h" + +#include +#include +#include +#include +#include + +#include +#include + +// Vendored ed25519 ref10 (third_party/ed25519, zlib). Declared here, compiled +// as C by the Makefile %.c rule (ge.h pulls in fe.h; sc.h is the scalar ops). +extern "C" { +#include "ge.h" +#include "sc.h" +} + +namespace detz::wa { + +namespace { +struct EvpCtx { + EVP_CIPHER_CTX* c{EVP_CIPHER_CTX_new()}; + ~EvpCtx() { EVP_CIPHER_CTX_free(c); } +}; +void require(bool ok, const char* what) { + if (!ok) throw CryptoError(what); +} +} // namespace + +Bytes WaCrypto::random_bytes(size_t n) { + Bytes out(n); + require(RAND_bytes(out.data(), static_cast(n)) == 1, "RAND_bytes failed"); + return out; +} + +Bytes WaCrypto::sha256(const Bytes& data) { + Bytes out(SHA256_DIGEST_LENGTH); + SHA256(data.data(), data.size(), out.data()); + return out; +} + +Bytes WaCrypto::sha512(const Bytes& data) { + Bytes out(SHA512_DIGEST_LENGTH); + SHA512(data.data(), data.size(), out.data()); + return out; +} + +Bytes WaCrypto::md5(const Bytes& data) { + Bytes out(16); + unsigned int len = 0; + const EVP_MD* md = EVP_md5(); + EVP_MD_CTX* ctx = EVP_MD_CTX_new(); + require(ctx != nullptr, "md5 ctx"); + bool ok = EVP_DigestInit_ex(ctx, md, nullptr) == 1 && EVP_DigestUpdate(ctx, data.data(), data.size()) == 1 && + EVP_DigestFinal_ex(ctx, out.data(), &len) == 1; + EVP_MD_CTX_free(ctx); + require(ok && len == 16, "md5 failed"); + return out; +} + +Bytes WaCrypto::hmac_sha256(const Bytes& key, const Bytes& data) { + Bytes out(SHA256_DIGEST_LENGTH); + unsigned int len = 0; + HMAC(EVP_sha256(), key.data(), static_cast(key.size()), data.data(), data.size(), out.data(), &len); + require(len == SHA256_DIGEST_LENGTH, "hmac failed"); + return out; +} + +Bytes WaCrypto::hkdf_sha256(const Bytes& ikm, const Bytes& salt, const Bytes& info, size_t out_len) { + // Manual RFC 5869 HKDF over HMAC-SHA256. Done by hand (not OpenSSL's EVP HKDF) + // because WhatsApp's noise finish derives with an empty IKM, which OpenSSL's + // EVP_PKEY_CTX_set1_hkdf_key rejects; empty IKM/info/salt are all valid here. + constexpr size_t kHashLen = 32; + require(out_len <= 255 * kHashLen, "hkdf out_len too large"); + Bytes salt_use = salt.empty() ? Bytes(kHashLen, 0) : salt; + Bytes prk = hmac_sha256(salt_use, ikm); // Extract + Bytes out; + Bytes prev; + for (uint8_t i = 1; out.size() < out_len; ++i) { // Expand + Bytes in = prev; + in.insert(in.end(), info.begin(), info.end()); + in.push_back(i); + prev = hmac_sha256(prk, in); + out.insert(out.end(), prev.begin(), prev.end()); + } + out.resize(out_len); + return out; +} + +Bytes WaCrypto::pbkdf2_sha256(const Bytes& password, const Bytes& salt, int iterations, size_t out_len) { + Bytes out(out_len); + int ok = PKCS5_PBKDF2_HMAC(reinterpret_cast(password.data()), static_cast(password.size()), + salt.data(), static_cast(salt.size()), iterations, EVP_sha256(), + static_cast(out_len), out.data()); + require(ok == 1, "pbkdf2 failed"); + return out; +} + +WaCrypto::KeyPair WaCrypto::generate_x25519() { + KeyPair kp; + EVP_PKEY* pkey = nullptr; + EVP_PKEY_CTX* kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, nullptr); + require(kctx != nullptr, "x25519 keygen ctx"); + bool ok = EVP_PKEY_keygen_init(kctx) == 1 && EVP_PKEY_keygen(kctx, &pkey) == 1; + EVP_PKEY_CTX_free(kctx); + require(ok && pkey != nullptr, "x25519 keygen"); + size_t len = 32; + ok = EVP_PKEY_get_raw_private_key(pkey, kp.priv.data(), &len) == 1 && len == 32; + len = 32; + ok = ok && EVP_PKEY_get_raw_public_key(pkey, kp.pub.data(), &len) == 1 && len == 32; + EVP_PKEY_free(pkey); + require(ok, "x25519 raw key export"); + return kp; +} + +std::array WaCrypto::x25519_public(const std::array& priv) { + EVP_PKEY* pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, nullptr, priv.data(), 32); + require(pkey != nullptr, "x25519 import priv"); + std::array pub{}; + size_t len = 32; + bool ok = EVP_PKEY_get_raw_public_key(pkey, pub.data(), &len) == 1 && len == 32; + EVP_PKEY_free(pkey); + require(ok, "x25519 derive pub"); + return pub; +} + +std::array WaCrypto::x25519(const std::array& priv, + const std::array& peer_pub) { + EVP_PKEY* pk = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, nullptr, priv.data(), 32); + EVP_PKEY* peer = EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, nullptr, peer_pub.data(), 32); + require(pk != nullptr && peer != nullptr, "x25519 import"); + EVP_PKEY_CTX* dctx = EVP_PKEY_CTX_new(pk, nullptr); + std::array out{}; + size_t len = 32; + bool ok = dctx != nullptr && EVP_PKEY_derive_init(dctx) == 1 && EVP_PKEY_derive_set_peer(dctx, peer) == 1 && + EVP_PKEY_derive(dctx, out.data(), &len) == 1 && len == 32; + EVP_PKEY_CTX_free(dctx); + EVP_PKEY_free(pk); + EVP_PKEY_free(peer); + require(ok, "x25519 derive"); + return out; +} + +Bytes WaCrypto::aes_gcm_seal(const Bytes& key, const Bytes& iv, const Bytes& plaintext, const Bytes& aad) { + require(key.size() == 32 && iv.size() == 12, "aes-gcm key/iv length"); + EvpCtx ctx; + require(ctx.c != nullptr, "gcm ctx"); + Bytes out(plaintext.size() + 16); + int len = 0, total = 0; + bool ok = EVP_EncryptInit_ex(ctx.c, EVP_aes_256_gcm(), nullptr, nullptr, nullptr) == 1 && + EVP_CIPHER_CTX_ctrl(ctx.c, EVP_CTRL_GCM_SET_IVLEN, 12, nullptr) == 1 && + EVP_EncryptInit_ex(ctx.c, nullptr, nullptr, key.data(), iv.data()) == 1; + if (ok && !aad.empty()) ok = EVP_EncryptUpdate(ctx.c, nullptr, &len, aad.data(), static_cast(aad.size())) == 1; + ok = ok && EVP_EncryptUpdate(ctx.c, out.data(), &len, plaintext.data(), static_cast(plaintext.size())) == 1; + total = len; + ok = ok && EVP_EncryptFinal_ex(ctx.c, out.data() + total, &len) == 1; + total += len; + ok = ok && EVP_CIPHER_CTX_ctrl(ctx.c, EVP_CTRL_GCM_GET_TAG, 16, out.data() + total) == 1; + require(ok, "aes-gcm seal"); + out.resize(total + 16); + return out; +} + +std::optional WaCrypto::aes_gcm_open(const Bytes& key, const Bytes& iv, const Bytes& ciphertext, + const Bytes& aad) { + if (key.size() != 32 || iv.size() != 12 || ciphertext.size() < 16) return std::nullopt; + EvpCtx ctx; + if (ctx.c == nullptr) return std::nullopt; + size_t ct_len = ciphertext.size() - 16; + Bytes tag(ciphertext.end() - 16, ciphertext.end()); + Bytes out(ct_len); + int len = 0, total = 0; + bool ok = EVP_DecryptInit_ex(ctx.c, EVP_aes_256_gcm(), nullptr, nullptr, nullptr) == 1 && + EVP_CIPHER_CTX_ctrl(ctx.c, EVP_CTRL_GCM_SET_IVLEN, 12, nullptr) == 1 && + EVP_DecryptInit_ex(ctx.c, nullptr, nullptr, key.data(), iv.data()) == 1; + if (ok && !aad.empty()) ok = EVP_DecryptUpdate(ctx.c, nullptr, &len, aad.data(), static_cast(aad.size())) == 1; + ok = ok && EVP_DecryptUpdate(ctx.c, out.data(), &len, ciphertext.data(), static_cast(ct_len)) == 1; + total = len; + ok = ok && EVP_CIPHER_CTX_ctrl(ctx.c, EVP_CTRL_GCM_SET_TAG, 16, tag.data()) == 1; + if (!ok) return std::nullopt; + if (EVP_DecryptFinal_ex(ctx.c, out.data() + total, &len) != 1) return std::nullopt; + total += len; + out.resize(total); + return out; +} + +Bytes WaCrypto::aes_ctr_xor(const Bytes& key, const Bytes& iv, const Bytes& data) { + require(key.size() == 32 && iv.size() == 16, "aes-ctr key/iv length"); + EvpCtx ctx; + require(ctx.c != nullptr, "ctr ctx"); + Bytes out(data.size()); + int len = 0, total = 0; + bool ok = EVP_EncryptInit_ex(ctx.c, EVP_aes_256_ctr(), nullptr, key.data(), iv.data()) == 1 && + EVP_EncryptUpdate(ctx.c, out.data(), &len, data.data(), static_cast(data.size())) == 1; + total = len; + ok = ok && EVP_EncryptFinal_ex(ctx.c, out.data() + total, &len) == 1; + require(ok, "aes-ctr"); + return out; +} + +Bytes WaCrypto::aes_cbc_encrypt_nopad(const Bytes& key, const Bytes& iv, const Bytes& plaintext) { + require(key.size() == 32 && iv.size() == 16 && plaintext.size() % 16 == 0, "aes-cbc enc length"); + EvpCtx ctx; + require(ctx.c != nullptr, "cbc ctx"); + Bytes out(plaintext.size()); + int len = 0, total = 0; + bool ok = EVP_EncryptInit_ex(ctx.c, EVP_aes_256_cbc(), nullptr, key.data(), iv.data()) == 1 && + EVP_CIPHER_CTX_set_padding(ctx.c, 0) == 1 && + EVP_EncryptUpdate(ctx.c, out.data(), &len, plaintext.data(), static_cast(plaintext.size())) == 1; + total = len; + ok = ok && EVP_EncryptFinal_ex(ctx.c, out.data() + total, &len) == 1; + require(ok, "aes-cbc encrypt"); + return out; +} + +Bytes WaCrypto::aes_cbc_decrypt_nopad(const Bytes& key, const Bytes& iv, const Bytes& ciphertext) { + require(key.size() == 32 && iv.size() == 16 && ciphertext.size() % 16 == 0, "aes-cbc dec length"); + EvpCtx ctx; + require(ctx.c != nullptr, "cbc ctx"); + Bytes out(ciphertext.size()); + int len = 0, total = 0; + bool ok = EVP_DecryptInit_ex(ctx.c, EVP_aes_256_cbc(), nullptr, key.data(), iv.data()) == 1 && + EVP_CIPHER_CTX_set_padding(ctx.c, 0) == 1 && + EVP_DecryptUpdate(ctx.c, out.data(), &len, ciphertext.data(), static_cast(ciphertext.size())) == 1; + total = len; + ok = ok && EVP_DecryptFinal_ex(ctx.c, out.data() + total, &len) == 1; + require(ok, "aes-cbc decrypt"); + return out; +} + +Bytes WaCrypto::pkcs7_pad(const Bytes& data) { + size_t pad = 16 - (data.size() % 16); + Bytes out = data; + out.insert(out.end(), pad, static_cast(pad)); + return out; +} + +std::optional WaCrypto::pkcs7_unpad(const Bytes& data) { + if (data.empty() || data.size() % 16 != 0) return std::nullopt; + uint8_t pad = data.back(); + if (pad == 0 || pad > 16 || pad > data.size()) return std::nullopt; + for (size_t i = data.size() - pad; i < data.size(); ++i) + if (data[i] != pad) return std::nullopt; + return Bytes(data.begin(), data.end() - pad); +} + +// --- XEdDSA over ref10 --- +std::array WaCrypto::xeddsa_sign(const std::array& mont_priv, const Bytes& msg) { + // clamp the montgomery private scalar + std::array a = mont_priv; + a[0] &= 248; + a[31] &= 127; + a[31] |= 64; + + // A = a*B + ge_p3 A; + ge_scalarmult_base(&A, a.data()); + std::array Abytes{}; + ge_p3_tobytes(Abytes.data(), &A); + uint8_t sign_bit = Abytes[31] & 0x80; + + // r = SHA512(a || msg) reduced + Bytes rmsg(a.begin(), a.end()); + rmsg.insert(rmsg.end(), msg.begin(), msg.end()); + Bytes rhash = sha512(rmsg); + uint8_t rbuf[64]; + std::memcpy(rbuf, rhash.data(), 64); + sc_reduce(rbuf); // rbuf[0:32] = r mod L + + // R = r*B + ge_p3 R; + ge_scalarmult_base(&R, rbuf); + std::array Rbytes{}; + ge_p3_tobytes(Rbytes.data(), &R); + + // h = SHA512(R || A || msg) reduced + Bytes hmsg(Rbytes.begin(), Rbytes.end()); + hmsg.insert(hmsg.end(), Abytes.begin(), Abytes.end()); + hmsg.insert(hmsg.end(), msg.begin(), msg.end()); + Bytes hhash = sha512(hmsg); + uint8_t hbuf[64]; + std::memcpy(hbuf, hhash.data(), 64); + sc_reduce(hbuf); + + // S = h*a + r mod L + uint8_t sbuf[32]; + sc_muladd(sbuf, hbuf, a.data(), rbuf); + + std::array sig{}; + std::memcpy(sig.data(), Rbytes.data(), 32); + std::memcpy(sig.data() + 32, sbuf, 32); + sig[63] |= sign_bit; + return sig; +} + +bool WaCrypto::xeddsa_verify(const std::array& mont_pub, const Bytes& msg, + const std::array& sig) { + // Convert Montgomery u to Edwards y: ed_y = (u - 1) / (u + 1). + fe u, one, um1, up1, edy; + fe_frombytes(u, mont_pub.data()); + fe_1(one); + fe_sub(um1, u, one); + fe_add(up1, u, one); + fe_invert(up1, up1); + fe_mul(edy, um1, up1); + std::array A_ed{}; + fe_tobytes(A_ed.data(), edy); + A_ed[31] |= (sig[63] & 0x80); + + std::array s = sig; + s[63] &= 0x7f; + + // A = -A (ref10 ge_double_scalarmult computes a*(-A)+b*B, so negate here) + ge_p3 A; + if (ge_frombytes_negate_vartime(&A, A_ed.data()) != 0) return false; + + // h = SHA512(R || A_ed || msg) reduced + Bytes hmsg(s.begin(), s.begin() + 32); + hmsg.insert(hmsg.end(), A_ed.begin(), A_ed.end()); + hmsg.insert(hmsg.end(), msg.begin(), msg.end()); + Bytes hhash = sha512(hmsg); + uint8_t hbuf[64]; + std::memcpy(hbuf, hhash.data(), 64); + sc_reduce(hbuf); + + // check S is canonical (< L): sc_reduce would change it otherwise; cheap guard + // R' = s*B - h*A (ge_double_scalarmult_vartime: h*(-A) + S*B) + ge_p2 Rcheck; + ge_double_scalarmult_vartime(&Rcheck, hbuf, &A, s.data() + 32); + std::array rcheck{}; + ge_tobytes(rcheck.data(), &Rcheck); + return std::memcmp(rcheck.data(), s.data(), 32) == 0; +} + +Bytes WaCrypto::concat(std::initializer_list parts) { + Bytes out; + size_t total = 0; + for (const auto& p : parts) total += p.size(); + out.reserve(total); + for (const auto& p : parts) out.insert(out.end(), p.begin(), p.end()); + return out; +} + +bool WaCrypto::const_time_eq(const Bytes& a, const Bytes& b) { + if (a.size() != b.size()) return false; + return CRYPTO_memcmp(a.data(), b.data(), a.size()) == 0; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_crypto.h b/taicpp/src/whatsapp/wa_crypto.h new file mode 100644 index 0000000..26bb659 --- /dev/null +++ b/taicpp/src/whatsapp/wa_crypto.h @@ -0,0 +1,84 @@ +#pragma once +// WaCrypto: the cryptographic primitives detz::wa needs, as a static utility +// class over OpenSSL EVP plus the vendored ed25519 ref10 (third_party/ed25519) +// for XEdDSA signing/verification, the one Signal primitive OpenSSL does not +// expose. Byte layouts follow whatsmeow (MPL-2.0) and wa-go (MIT); see +// docs/whatsapp.md section 5. Everything here is stateless and deterministic +// except random_bytes. +#include +#include +#include +#include +#include +#include + +namespace detz::wa { + +using Bytes = std::vector; + +// Thrown when a primitive fails in a way that is a programming error (bad key +// length, OpenSSL init failure). Callers treat it as fatal, not protocol noise. +class CryptoError : public std::runtime_error { + public: + explicit CryptoError(const std::string& m) : std::runtime_error("wa crypto: " + m) {} +}; + +class WaCrypto { + public: + // --- random --- + static Bytes random_bytes(size_t n); + + // --- hashing --- + static Bytes sha256(const Bytes& data); + static Bytes sha512(const Bytes& data); + static Bytes md5(const Bytes& data); + static Bytes hmac_sha256(const Bytes& key, const Bytes& data); + + // HKDF-SHA256 (RFC 5869). salt may be empty (treated as zeros of hash len). + static Bytes hkdf_sha256(const Bytes& ikm, const Bytes& salt, const Bytes& info, size_t out_len); + + // PBKDF2-HMAC-SHA256. + static Bytes pbkdf2_sha256(const Bytes& password, const Bytes& salt, int iterations, size_t out_len); + + // --- Curve25519 (X25519) --- + // Generate a clamped X25519 private key and its public key. + struct KeyPair { + std::array priv{}; + std::array pub{}; + }; + static KeyPair generate_x25519(); + static std::array x25519_public(const std::array& priv); + // Diffie-Hellman shared secret. Throws on invalid input lengths. + static std::array x25519(const std::array& priv, + const std::array& peer_pub); + + // --- AES --- + // AES-256-GCM. iv is 12 bytes. Returns ciphertext||tag (tag 16 bytes) for seal. + static Bytes aes_gcm_seal(const Bytes& key, const Bytes& iv, const Bytes& plaintext, const Bytes& aad); + // Returns std::nullopt on auth failure. ciphertext includes the trailing 16-byte tag. + static std::optional aes_gcm_open(const Bytes& key, const Bytes& iv, const Bytes& ciphertext, + const Bytes& aad); + // AES-256-CTR (in place XOR stream; iv 16 bytes). + static Bytes aes_ctr_xor(const Bytes& key, const Bytes& iv, const Bytes& data); + // AES-256-CBC with explicit iv (16 bytes). No padding added/removed; caller pads. + static Bytes aes_cbc_encrypt_nopad(const Bytes& key, const Bytes& iv, const Bytes& plaintext); + static Bytes aes_cbc_decrypt_nopad(const Bytes& key, const Bytes& iv, const Bytes& ciphertext); + + // PKCS#7 helpers (block size 16). + static Bytes pkcs7_pad(const Bytes& data); + static std::optional pkcs7_unpad(const Bytes& data); + + // --- XEdDSA (Curve25519 signatures, per the Signal XEdDSA spec) --- + // Sign msg with a Montgomery (X25519) private key, deterministic nonce + // (SHA-512 of the clamped scalar and message), matching wa-go keys.Sign. + static std::array xeddsa_sign(const std::array& mont_priv, const Bytes& msg); + // Verify an XEdDSA signature made with the Montgomery public key. + static bool xeddsa_verify(const std::array& mont_pub, const Bytes& msg, + const std::array& sig); + + // --- small helpers --- + static Bytes concat(std::initializer_list parts); + static bool const_time_eq(const Bytes& a, const Bytes& b); +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_device.cpp b/taicpp/src/whatsapp/wa_device.cpp new file mode 100644 index 0000000..37603f1 --- /dev/null +++ b/taicpp/src/whatsapp/wa_device.cpp @@ -0,0 +1,181 @@ +#include "wa_device.h" + +#include +#include + +#include "wa_consts.h" +#include "wa_proto.h" + +namespace detz::wa { + +namespace { +Bytes version_hash() { + const auto& v = WaConsts::kClientVersion; + std::string s = std::to_string(v[0]) + "." + std::to_string(v[1]) + "." + std::to_string(v[2]); + return WaCrypto::md5(Bytes(s.begin(), s.end())); +} + +void put_u32(Bytes& b, uint32_t v) { + for (int i = 0; i < 4; ++i) b.push_back((v >> (8 * i)) & 0xff); +} +uint32_t get_u32(const Bytes& b, size_t& p) { + uint32_t v = 0; + for (int i = 0; i < 4; ++i) v |= static_cast(b[p++]) << (8 * i); + return v; +} +void put_blob(Bytes& b, const Bytes& v) { + put_u32(b, static_cast(v.size())); + b.insert(b.end(), v.begin(), v.end()); +} +Bytes get_blob(const Bytes& b, size_t& p) { + uint32_t n = get_u32(b, p); + Bytes v(b.begin() + p, b.begin() + p + n); + p += n; + return v; +} +std::array a32(const Bytes& b) { + std::array a{}; + for (size_t i = 0; i < 32 && i < b.size(); ++i) a[i] = b[i]; + return a; +} +} // namespace + +WaDevice WaDevice::generate() { + WaDevice d; + d.noise_key = WaCrypto::generate_x25519(); + d.identity_key = WaCrypto::generate_x25519(); + d.signed_pre_key.key_id = 1; + d.signed_pre_key.pair = WaCrypto::generate_x25519(); + // sign the 0x05-prefixed signed-prekey public with the identity key (XEdDSA) + Bytes to_sign(1, 0x05); + to_sign.insert(to_sign.end(), d.signed_pre_key.pair.pub.begin(), d.signed_pre_key.pair.pub.end()); + d.signed_pre_key.signature = WaCrypto::xeddsa_sign(d.identity_key.priv, to_sign); + Bytes reg = WaCrypto::random_bytes(2); + d.registration_id = ((static_cast(reg[0]) << 8) | reg[1]) & 0x3fff; // 14-bit + Bytes adv = WaCrypto::random_bytes(32); + std::copy(adv.begin(), adv.end(), d.adv_secret.begin()); + return d; +} + +Bytes WaDevice::client_payload() const { + WaClientPayload p; + p.has_user_agent = true; + auto& u = p.user_agent; + u.app_version.has = true; + u.app_version.primary = WaConsts::kClientVersion[0]; + u.app_version.secondary = WaConsts::kClientVersion[1]; + u.app_version.tertiary = WaConsts::kClientVersion[2]; + p.has_web_info = true; + p.has_connect = true; + + if (paired()) { + p.username = jid_user(); + p.device = jid_device(); + p.has_passive = true; + p.passive = true; + p.has_pull = true; + p.pull = true; + p.lc = 1; + p.has_lid_db_migrated = true; + p.lid_db_migrated = true; + return p.encode(); + } + + // registration + p.has_passive = true; + p.passive = false; + p.has_pull = true; + p.pull = false; + WaDeviceProps dp; + Bytes device_props = dp.encode(); + WaDevicePairingData pd; + Bytes reg(4, 0); + reg[0] = (registration_id >> 24) & 0xff; + reg[1] = (registration_id >> 16) & 0xff; + reg[2] = (registration_id >> 8) & 0xff; + reg[3] = registration_id & 0xff; + pd.e_regid = reg; + pd.e_keytype = Bytes{0x05}; + pd.e_ident = Bytes(identity_key.pub.begin(), identity_key.pub.end()); + Bytes skid(4, 0); + skid[2] = (signed_pre_key.key_id >> 8) & 0xff; + skid[3] = signed_pre_key.key_id & 0xff; + pd.e_skey_id = Bytes(skid.begin() + 1, skid.end()); // 3 bytes (preKeyID[1:]) + pd.e_skey_val = Bytes(signed_pre_key.pair.pub.begin(), signed_pre_key.pair.pub.end()); + pd.e_skey_sig = Bytes(signed_pre_key.signature.begin(), signed_pre_key.signature.end()); + pd.build_hash = version_hash(); + pd.device_props = device_props; + p.pairing = pd; + return p.encode(); +} + +uint64_t WaDevice::jid_user() const { + if (!jid) return 0; + const std::string& j = *jid; + size_t end = j.find_first_of(":@"); + return std::strtoull(j.substr(0, end).c_str(), nullptr, 10); +} + +uint32_t WaDevice::jid_device() const { + if (!jid) return 0; + const std::string& j = *jid; + size_t colon = j.find(':'); + if (colon == std::string::npos) return 0; + size_t at = j.find('@', colon); + return static_cast(std::strtoul(j.substr(colon + 1, at - colon - 1).c_str(), nullptr, 10)); +} + +Bytes WaDevice::serialize() const { + Bytes b; + b.push_back(1); + auto kp = [&](const WaCrypto::KeyPair& k) { + put_blob(b, Bytes(k.priv.begin(), k.priv.end())); + put_blob(b, Bytes(k.pub.begin(), k.pub.end())); + }; + kp(noise_key); + kp(identity_key); + put_u32(b, signed_pre_key.key_id); + kp(signed_pre_key.pair); + put_blob(b, Bytes(signed_pre_key.signature.begin(), signed_pre_key.signature.end())); + put_u32(b, registration_id); + put_blob(b, Bytes(adv_secret.begin(), adv_secret.end())); + b.push_back(jid ? 1 : 0); + put_blob(b, Bytes((jid ? *jid : "").begin(), (jid ? *jid : "").end())); + put_blob(b, Bytes((lid ? *lid : "").begin(), (lid ? *lid : "").end())); + put_blob(b, Bytes(push_name.begin(), push_name.end())); + put_blob(b, account); + return b; +} + +std::optional WaDevice::deserialize(const Bytes& blob) { + if (blob.empty() || blob[0] != 1) return std::nullopt; + try { + size_t p = 1; + WaDevice d; + auto kp = [&](WaCrypto::KeyPair& k) { + k.priv = a32(get_blob(blob, p)); + k.pub = a32(get_blob(blob, p)); + }; + kp(d.noise_key); + kp(d.identity_key); + d.signed_pre_key.key_id = get_u32(blob, p); + kp(d.signed_pre_key.pair); + Bytes sig = get_blob(blob, p); + std::copy_n(sig.begin(), std::min(64, sig.size()), d.signed_pre_key.signature.begin()); + d.registration_id = get_u32(blob, p); + d.adv_secret = a32(get_blob(blob, p)); + bool has_jid = blob[p++] != 0; + Bytes jb = get_blob(blob, p); + Bytes lb = get_blob(blob, p); + if (has_jid) d.jid = std::string(jb.begin(), jb.end()); + if (!lb.empty()) d.lid = std::string(lb.begin(), lb.end()); + Bytes pn = get_blob(blob, p); + d.push_name = std::string(pn.begin(), pn.end()); + d.account = get_blob(blob, p); + return d; + } catch (...) { + return std::nullopt; + } +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_device.h b/taicpp/src/whatsapp/wa_device.h new file mode 100644 index 0000000..8c28413 --- /dev/null +++ b/taicpp/src/whatsapp/wa_device.h @@ -0,0 +1,52 @@ +#pragma once +// WaDevice: the companion device's long-lived identity (the keys and ids a +// linked WhatsApp device holds), plus the ClientPayload builders the Noise +// handshake needs. Serializable for the vault. Mirrors whatsmeow store.Device. +// See docs/whatsapp.md. +#include +#include +#include + +#include "wa_crypto.h" + +namespace detz::wa { + +struct WaSignedPreKey { + uint32_t key_id{0}; + WaCrypto::KeyPair pair; + std::array signature{}; +}; + +class WaDevice { + public: + WaCrypto::KeyPair noise_key; // static key for the Noise handshake + WaCrypto::KeyPair identity_key; // long-term Signal identity + WaSignedPreKey signed_pre_key; + uint32_t registration_id{0}; + std::array adv_secret{}; // pairing HMAC secret + + // set once paired: + std::optional jid; // e.g. "15551234567:3@s.whatsapp.net" + std::optional lid; + std::string push_name{"detz"}; + Bytes account; // serialized ADVSignedDeviceIdentity, sent in each message's device-identity node + + bool paired() const { return jid.has_value(); } + + // Freshly generate a new device identity (registration path). + static WaDevice generate(); + + // ClientPayload for the Noise handshake: registration when unpaired, login + // when paired. + Bytes client_payload() const; + + // The device's user-integer and device number parsed from the JID. + uint64_t jid_user() const; + uint32_t jid_device() const; + + // vault serialization (opaque blob) + Bytes serialize() const; + static std::optional deserialize(const Bytes& blob); +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_node.h b/taicpp/src/whatsapp/wa_node.h new file mode 100644 index 0000000..4af14b6 --- /dev/null +++ b/taicpp/src/whatsapp/wa_node.h @@ -0,0 +1,70 @@ +#pragma once +// WaNode: one node in WhatsApp's binary-XML protocol (the equivalent of an XMPP +// stanza). A node has a tag, string attributes, and content that is either +// nothing, a UTF-8/binary string, or a list of child nodes. Mirrors wa-go +// internal/wire Node; see docs/whatsapp.md. +#include +#include +#include +#include +#include +#include +#include + +namespace detz::wa { + +using Bytes = std::vector; + +class WaNode { + public: + using Children = std::vector; + // content variant: empty (monostate), raw bytes, or child list. + using Content = std::variant; + + std::string tag; + std::map attrs; + Content content; + + WaNode() = default; + explicit WaNode(std::string t) : tag(std::move(t)) {} + WaNode(std::string t, std::map a) : tag(std::move(t)), attrs(std::move(a)) {} + WaNode(std::string t, std::map a, Content c) + : tag(std::move(t)), attrs(std::move(a)), content(std::move(c)) {} + + bool has_bytes() const { return std::holds_alternative(content); } + bool has_children() const { return std::holds_alternative(content); } + const Bytes* bytes() const { return std::get_if(&content); } + const Children* children() const { return std::get_if(&content); } + + std::string attr(const std::string& key) const { + auto it = attrs.find(key); + return it == attrs.end() ? std::string() : it->second; + } + bool has_attr(const std::string& key) const { return attrs.count(key) != 0; } + + // first child with tag, or nullptr + const WaNode* child(const std::string& t) const { + if (const auto* c = children()) { + for (const auto& n : *c) + if (n.tag == t) return &n; + } + return nullptr; + } + std::vector all(const std::string& t) const { + std::vector out; + if (const auto* c = children()) + for (const auto& n : *c) + if (n.tag == t) out.push_back(&n); + return out; + } + // content as string (bytes interpreted as UTF-8), empty if not bytes + std::string text() const { + if (const auto* b = bytes()) return std::string(b->begin(), b->end()); + return {}; + } + + // compact debug rendering (tag, attrs, child tags); not wire format + std::string debug() const; +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_noise.cpp b/taicpp/src/whatsapp/wa_noise.cpp new file mode 100644 index 0000000..b6ac353 --- /dev/null +++ b/taicpp/src/whatsapp/wa_noise.cpp @@ -0,0 +1,141 @@ +#include "wa_noise.h" + +#include "wa_proto.h" + +namespace detz::wa { + +Bytes WaFraming::frame(const Bytes& payload, bool with_header) { + if (payload.size() >= kMaxFrame) throw CryptoError("frame too large"); + Bytes out; + if (with_header) out.insert(out.end(), kHeader.begin(), kHeader.end()); + uint32_t n = static_cast(payload.size()); + out.push_back((n >> 16) & 0xff); + out.push_back((n >> 8) & 0xff); + out.push_back(n & 0xff); + out.insert(out.end(), payload.begin(), payload.end()); + return out; +} + +std::optional WaFraming::unframe(const Bytes& buf, size_t& pos) { + if (pos + 3 > buf.size()) return std::nullopt; + uint32_t n = (static_cast(buf[pos]) << 16) | (static_cast(buf[pos + 1]) << 8) | buf[pos + 2]; + if (pos + 3 + n > buf.size()) return std::nullopt; + Bytes out(buf.begin() + pos + 3, buf.begin() + pos + 3 + n); + pos += 3 + n; + return out; +} + +WaNoise::WaNoise(const std::array& client_ephemeral_pub) { + // start pattern: the 32-byte Noise mode string is used directly as the hash + // (explicit length: the trailing four NULs would truncate a const char* ctor). + static const std::string kMode("Noise_XX_25519_AESGCM_SHA256\x00\x00\x00\x00", 32); + hash_ = Bytes(kMode.begin(), kMode.end()); + salt_ = hash_; + enc_key_ = hash_; + dec_key_ = hash_; + mix_hash(Bytes(WaFraming::kHeader.begin(), WaFraming::kHeader.end())); + mix_hash(Bytes(client_ephemeral_pub.begin(), client_ephemeral_pub.end())); +} + +void WaNoise::mix_hash(const Bytes& data) { + Bytes in = hash_; + in.insert(in.end(), data.begin(), data.end()); + hash_ = WaCrypto::sha256(in); +} + +void WaNoise::mix_key(const Bytes& data) { + Bytes out = WaCrypto::hkdf_sha256(data, salt_, {}, 64); + salt_ = Bytes(out.begin(), out.begin() + 32); + enc_key_ = Bytes(out.begin() + 32, out.end()); + dec_key_ = enc_key_; + counter_ = 0; +} + +Bytes WaNoise::iv(uint32_t counter) { + Bytes v(12, 0); + v[8] = (counter >> 24) & 0xff; + v[9] = (counter >> 16) & 0xff; + v[10] = (counter >> 8) & 0xff; + v[11] = counter & 0xff; + return v; +} + +Bytes WaNoise::encrypt(const Bytes& plaintext) { + Bytes ct = WaCrypto::aes_gcm_seal(enc_key_, iv(counter_), plaintext, hash_); + counter_++; + mix_hash(ct); + return ct; +} + +std::optional WaNoise::decrypt(const Bytes& ciphertext) { + auto pt = WaCrypto::aes_gcm_open(dec_key_, iv(counter_), ciphertext, hash_); + if (!pt) return std::nullopt; + counter_++; + mix_hash(ciphertext); + return pt; +} + +void WaNoise::finish() { + Bytes out = WaCrypto::hkdf_sha256({}, salt_, {}, 64); + write_key_ = Bytes(out.begin(), out.begin() + 32); + read_key_ = Bytes(out.begin() + 32, out.end()); + transport_ = true; + write_counter_ = 0; + read_counter_ = 0; +} + +std::optional WaNoise::client_handshake(const std::array& eph_priv, + const std::array& eph_pub, + const std::array& static_priv, + const std::array& static_pub, + const Bytes& server_hello_msg, + const Bytes& client_payload) { + HandshakeResult res; + res.client_hello = encode_client_hello(Bytes(eph_pub.begin(), eph_pub.end())); + (void)eph_pub; + + auto sh = parse_server_hello(server_hello_msg); + if (!sh || sh->ephemeral.size() != 32) return std::nullopt; + + mix_hash(sh->ephemeral); + std::array se_arr{}; + std::copy(sh->ephemeral.begin(), sh->ephemeral.end(), se_arr.begin()); + auto es = WaCrypto::x25519(eph_priv, se_arr); + mix_key(Bytes(es.begin(), es.end())); + + auto server_static = decrypt(sh->static_enc); + if (!server_static || server_static->size() != 32) return std::nullopt; + res.server_static = *server_static; + std::array ss_pub{}; + std::copy(server_static->begin(), server_static->end(), ss_pub.begin()); + auto ss = WaCrypto::x25519(eph_priv, ss_pub); + mix_key(Bytes(ss.begin(), ss.end())); + + auto server_payload = decrypt(sh->payload); + if (!server_payload) return std::nullopt; + res.server_payload = *server_payload; + + Bytes static_enc = encrypt(Bytes(static_pub.begin(), static_pub.end())); + auto se2 = WaCrypto::x25519(static_priv, se_arr); + mix_key(Bytes(se2.begin(), se2.end())); + + Bytes payload_enc = encrypt(client_payload); + res.client_finish = encode_client_finish(static_enc, payload_enc); + finish(); + return res; +} + +Bytes WaNoise::transport_encrypt(const Bytes& plaintext) { + Bytes ct = WaCrypto::aes_gcm_seal(write_key_, iv(write_counter_), plaintext, {}); + write_counter_++; + return ct; +} + +std::optional WaNoise::transport_decrypt(const Bytes& ciphertext) { + auto pt = WaCrypto::aes_gcm_open(read_key_, iv(read_counter_), ciphertext, {}); + if (!pt) return std::nullopt; + read_counter_++; + return pt; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_noise.h b/taicpp/src/whatsapp/wa_noise.h new file mode 100644 index 0000000..9ca56c1 --- /dev/null +++ b/taicpp/src/whatsapp/wa_noise.h @@ -0,0 +1,73 @@ +#pragma once +// WaNoise: the Noise_XX_25519_AESGCM_SHA256 handshake WhatsApp opens every +// connection with, plus the post-handshake transport cipher. Stateful, one per +// connection. Ported from wa-go internal/wire noise.go (MIT); whatsmeow +// socket/noisehandshake.go is the referee. See docs/whatsapp.md section 5. +#include +#include +#include +#include +#include + +#include "wa_crypto.h" + +namespace detz::wa { + +// WhatsApp frame helpers: a 3-byte big-endian length prefix, with the 4-byte +// "WA" header (magic 6, dict version 3) on the very first client frame. +class WaFraming { + public: + static constexpr std::array kHeader = {0x57, 0x41, 0x06, 0x03}; + static constexpr size_t kMaxFrame = 1u << 24; + // Wrap a payload in a length-prefixed frame; with_header prepends the WA magic. + static Bytes frame(const Bytes& payload, bool with_header); + // Read one length-prefixed frame from buf starting at pos; advances pos. + // Returns std::nullopt if there are not enough bytes yet. + static std::optional unframe(const Bytes& buf, size_t& pos); +}; + +class WaNoise { + public: + explicit WaNoise(const std::array& client_ephemeral_pub); + + struct HandshakeResult { + Bytes client_hello; // proto bytes (unframed) + Bytes client_finish; // proto bytes (unframed) + Bytes server_static; // decrypted server static pubkey (32 bytes) + Bytes server_payload; // decrypted server payload (cert chain) + }; + + // Run the XX handshake. ephemeral/static are our key pairs; server_hello is + // the decrypted ServerHello HandshakeMessage proto (unframed); client_payload + // is the marshaled ClientPayload. On success the object is in transport mode. + // Returns std::nullopt if any AEAD step fails (bad transcript or wrong keys). + std::optional client_handshake(const std::array& eph_priv, + const std::array& eph_pub, + const std::array& static_priv, + const std::array& static_pub, + const Bytes& server_hello_msg, const Bytes& client_payload); + + // transport mode (after handshake): encrypt/decrypt a frame payload. + Bytes transport_encrypt(const Bytes& plaintext); + std::optional transport_decrypt(const Bytes& ciphertext); + + bool in_transport() const { return transport_; } + const Bytes& write_key() const { return write_key_; } + const Bytes& read_key() const { return read_key_; } + + private: + Bytes hash_, salt_, enc_key_, dec_key_; + uint32_t counter_{0}; + bool transport_{false}; + Bytes write_key_, read_key_; + uint32_t write_counter_{0}, read_counter_{0}; + + void mix_hash(const Bytes& data); + void mix_key(const Bytes& data); + Bytes encrypt(const Bytes& plaintext); // handshake-phase (AAD = hash) + std::optional decrypt(const Bytes& ciphertext); // handshake-phase + void finish(); + static Bytes iv(uint32_t counter); +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_proto.cpp b/taicpp/src/whatsapp/wa_proto.cpp new file mode 100644 index 0000000..20d513e --- /dev/null +++ b/taicpp/src/whatsapp/wa_proto.cpp @@ -0,0 +1,418 @@ +#include "wa_proto.h" + +#include +#include + +namespace detz::wa { + +// ---------------- writer ---------------- +void ProtoWriter::put_varint(uint64_t v) { + while (v >= 0x80) { + buf_.push_back(static_cast(v) | 0x80); + v >>= 7; + } + buf_.push_back(static_cast(v)); +} +void ProtoWriter::key(int field, int wire) { put_varint((static_cast(field) << 3) | wire); } +void ProtoWriter::varint(int field, uint64_t v) { + key(field, 0); + put_varint(v); +} +void ProtoWriter::boolean(int field, bool v) { varint(field, v ? 1 : 0); } +void ProtoWriter::sfixed32(int field, int32_t v) { + key(field, 5); + uint32_t u = static_cast(v); + for (int i = 0; i < 4; ++i) buf_.push_back(static_cast(u >> (8 * i))); +} +void ProtoWriter::bytes(int field, const Bytes& b) { + key(field, 2); + put_varint(b.size()); + buf_.insert(buf_.end(), b.begin(), b.end()); +} +void ProtoWriter::str(int field, const std::string& s) { bytes(field, Bytes(s.begin(), s.end())); } +void ProtoWriter::message(int field, const Bytes& sub) { bytes(field, sub); } + +// ---------------- reader ---------------- +bool ProtoReader::next(Field& out) { + if (pos_ >= buf_.size()) return false; + // read key varint + uint64_t k = 0; + int shift = 0; + while (true) { + if (pos_ >= buf_.size()) throw std::runtime_error("wa proto: truncated key"); + uint8_t b = buf_[pos_++]; + k |= static_cast(b & 0x7f) << shift; + if (!(b & 0x80)) break; + shift += 7; + if (shift > 63) throw std::runtime_error("wa proto: key too long"); + } + out = Field{}; + out.field = static_cast(k >> 3); + out.wire = static_cast(k & 7); + switch (out.wire) { + case 0: { // varint + uint64_t v = 0; + int s = 0; + while (true) { + if (pos_ >= buf_.size()) throw std::runtime_error("wa proto: truncated varint"); + uint8_t b = buf_[pos_++]; + v |= static_cast(b & 0x7f) << s; + if (!(b & 0x80)) break; + s += 7; + } + out.varint = v; + return true; + } + case 1: // 64-bit + if (pos_ + 8 > buf_.size()) throw std::runtime_error("wa proto: truncated i64"); + pos_ += 8; + return true; + case 2: { // length-delimited + uint64_t len = 0; + int s = 0; + while (true) { + if (pos_ >= buf_.size()) throw std::runtime_error("wa proto: truncated len"); + uint8_t b = buf_[pos_++]; + len |= static_cast(b & 0x7f) << s; + if (!(b & 0x80)) break; + s += 7; + } + if (pos_ + len > buf_.size()) throw std::runtime_error("wa proto: truncated bytes"); + out.bytes.assign(buf_.begin() + pos_, buf_.begin() + pos_ + len); + pos_ += len; + return true; + } + case 5: // 32-bit + if (pos_ + 4 > buf_.size()) throw std::runtime_error("wa proto: truncated i32"); + out.fixed32 = static_cast(buf_[pos_]) | (static_cast(buf_[pos_ + 1]) << 8) | + (static_cast(buf_[pos_ + 2]) << 16) | (static_cast(buf_[pos_ + 3]) << 24); + pos_ += 4; + return true; + default: + throw std::runtime_error("wa proto: unknown wire type"); + } +} + +// ---------------- message builders ---------------- +Bytes WaAppVersion::encode() const { + ProtoWriter w; + w.varint(1, primary); + w.varint(2, secondary); + w.varint(3, tertiary); + return w.take(); +} + +Bytes WaUserAgent::encode() const { + ProtoWriter w; + w.varint(1, platform); + if (app_version.has) w.message(2, app_version.encode()); + w.str(3, mcc); + w.str(4, mnc); + w.str(5, os_version); + if (!manufacturer.empty()) w.str(6, manufacturer); // wa-go omits the empty field + w.str(7, device); + w.str(8, os_build); + w.varint(10, release_channel); + w.str(11, locale_lang); + w.str(12, locale_country); + return w.take(); +} + +Bytes WaDevicePairingData::encode() const { + ProtoWriter w; + w.bytes(1, e_regid); + w.bytes(2, e_keytype); + w.bytes(3, e_ident); + w.bytes(4, e_skey_id); + w.bytes(5, e_skey_val); + w.bytes(6, e_skey_sig); + w.bytes(7, build_hash); + w.bytes(8, device_props); + return w.take(); +} + +Bytes WaClientPayload::encode() const { + ProtoWriter w; + if (username) w.varint(1, *username); + if (has_passive) w.boolean(3, passive); + if (has_user_agent) w.message(5, user_agent.encode()); + if (has_web_info) { + ProtoWriter wi; + wi.varint(4, web_sub_platform); + w.message(6, wi.take()); + } + if (has_connect) { + w.varint(12, connect_type); + w.varint(13, connect_reason); + } + if (device) w.varint(18, *device); + if (pairing) w.message(19, pairing->encode()); + if (has_pull) w.boolean(33, pull); + if (lc) w.varint(24, static_cast(*lc)); + if (has_lid_db_migrated) w.boolean(41, lid_db_migrated); + return w.take(); +} + +Bytes WaDeviceProps::encode() const { + ProtoWriter w; + w.str(1, os); + ProtoWriter ver; + ver.varint(1, ver_primary); + ver.varint(2, ver_secondary); + ver.varint(3, ver_tertiary); + w.message(2, ver.take()); + w.varint(3, platform_type); + w.boolean(4, require_full_sync); + return w.take(); +} + +Bytes encode_client_hello(const Bytes& ephemeral) { + ProtoWriter inner; + inner.bytes(1, ephemeral); + ProtoWriter w; + w.message(2, inner.take()); // HandshakeMessage.clientHello = 2 + return w.take(); +} + +Bytes encode_client_finish(const Bytes& static_enc, const Bytes& payload_enc) { + ProtoWriter inner; + inner.bytes(1, static_enc); + inner.bytes(2, payload_enc); + ProtoWriter w; + w.message(4, inner.take()); // HandshakeMessage.clientFinish = 4 + return w.take(); +} + +std::optional parse_server_hello(const Bytes& handshake_msg) { + ProtoReader r(handshake_msg); + ProtoReader::Field f; + while (r.next(f)) { + if (f.field == 3 && f.wire == 2) { // serverHello + WaServerHello sh; + ProtoReader sr(f.bytes); + ProtoReader::Field sf; + while (sr.next(sf)) { + if (sf.wire != 2) continue; + if (sf.field == 1) sh.ephemeral = sf.bytes; + else if (sf.field == 2) sh.static_enc = sf.bytes; + else if (sf.field == 3) sh.payload = sf.bytes; + } + return sh; + } + } + return std::nullopt; +} + +std::optional parse_adv_hmac(const Bytes& b) { + WaADVSignedDeviceIdentityHMAC o; + ProtoReader r(b); + ProtoReader::Field f; + while (r.next(f)) { + if (f.field == 1 && f.wire == 2) o.details = f.bytes; + else if (f.field == 2 && f.wire == 2) o.hmac = f.bytes; + else if (f.field == 3 && f.wire == 0) { + o.account_type = static_cast(f.varint); + o.has_account_type = true; + } + } + if (o.details.empty() || o.hmac.empty()) return std::nullopt; + return o; +} + +Bytes WaADVSignedDeviceIdentity::encode() const { + ProtoWriter w; + w.bytes(1, details); + if (!account_signature_key.empty()) w.bytes(2, account_signature_key); + if (!account_signature.empty()) w.bytes(3, account_signature); + if (!device_signature.empty()) w.bytes(4, device_signature); + return w.take(); +} + +std::optional parse_adv_identity(const Bytes& b) { + WaADVSignedDeviceIdentity o; + ProtoReader r(b); + ProtoReader::Field f; + while (r.next(f)) { + if (f.wire != 2) continue; + switch (f.field) { + case 1: + o.details = f.bytes; + break; + case 2: + o.account_signature_key = f.bytes; + break; + case 3: + o.account_signature = f.bytes; + break; + case 4: + o.device_signature = f.bytes; + break; + } + } + if (o.details.empty()) return std::nullopt; + return o; +} + +std::optional parse_adv_device_identity(const Bytes& b) { + WaADVDeviceIdentity o; + ProtoReader r(b); + ProtoReader::Field f; + while (r.next(f)) { + if (f.wire != 0) continue; + switch (f.field) { + case 1: + o.raw_id = static_cast(f.varint); + break; + case 2: + o.timestamp = f.varint; + break; + case 3: + o.key_index = static_cast(f.varint); + break; + case 4: + o.account_type = static_cast(f.varint); + break; + case 5: + o.device_type = static_cast(f.varint); + break; + } + } + return o; +} + +std::optional parse_cert_chain(const Bytes& b) { + WaCertChainParsed o; + ProtoReader r(b); + ProtoReader::Field f; + while (r.next(f)) { + if (f.wire != 2) continue; + // CertChain: intermediate = 1, leaf = 2 (each a NoiseCertificate) + if (f.field == 1) { + if (auto nc = parse_noise_certificate(f.bytes)) { + o.intermediate_details = nc->details; + o.intermediate_signature = nc->signature; + } + } else if (f.field == 2) { + if (auto nc = parse_noise_certificate(f.bytes)) { + o.leaf_details = nc->details; + o.leaf_signature = nc->signature; + } + } + } + return o; +} + +std::optional parse_noise_certificate(const Bytes& b) { + WaNoiseCertificate o; + ProtoReader r(b); + ProtoReader::Field f; + while (r.next(f)) { + if (f.wire != 2) continue; + if (f.field == 1) o.details = f.bytes; + else if (f.field == 2) o.signature = f.bytes; + } + return o; +} + +std::optional parse_cert_details(const Bytes& b) { + WaNoiseCertDetails o; + ProtoReader r(b); + ProtoReader::Field f; + while (r.next(f)) { + if (f.field == 2 && f.wire == 0) o.serial = static_cast(f.varint); + else if (f.field == 3 && f.wire == 2) o.key = f.bytes; // key field in NoiseCertificate.Details + } + return o; +} + +// ---- E2E message encode ---- +static Bytes encode_context_info_empty() { return {}; } + +Bytes WaMessage::encode() const { + ProtoWriter w; + if (conversation) w.str(1, *conversation); + if (ext_text) { + ProtoWriter e; + e.str(1, *ext_text); + w.message(6, e.take()); + } + if (image) { + ProtoWriter im; + im.str(1, image->url); + im.str(2, image->mimetype); + if (!image->caption.empty()) im.str(3, image->caption); + im.bytes(4, image->file_sha256); + im.varint(5, image->file_length); + if (image->height) im.varint(6, image->height); + if (image->width) im.varint(7, image->width); + im.bytes(8, image->media_key); + im.bytes(9, image->file_enc_sha256); + im.str(11, image->direct_path); + if (image->media_key_timestamp) im.varint(12, static_cast(image->media_key_timestamp)); + if (!image->jpeg_thumbnail.empty()) im.bytes(16, image->jpeg_thumbnail); + w.message(3, im.take()); + } + if (device_sent) { + ProtoWriter ds; + ds.str(1, device_sent->destination_jid); + ds.message(2, device_sent->inner); + w.message(31, ds.take()); + } + (void)encode_context_info_empty; + return w.take(); +} + +Bytes pad_random_max16(const Bytes& b) { + uint8_t r; + // deterministic fallback not needed: caller seeds via WaCrypto; here use rand-free + // simple scheme matching wa-go (pad in 1..16). We take a random byte from the OS. + Bytes rb(1); + // use the C library getrandom via std::random_device-free path: read 1 byte + FILE* f = fopen("/dev/urandom", "rb"); + if (f) { + if (fread(&r, 1, 1, f) != 1) r = 1; + fclose(f); + } else { + r = 1; + } + uint8_t pad = static_cast((r & 0x0f) + 1); + Bytes out = b; + out.insert(out.end(), pad, pad); + (void)rb; + return out; +} + +std::optional unpad_random_max16(const Bytes& b) { + if (b.empty()) return std::nullopt; + uint8_t pad = b.back(); + if (pad == 0 || pad > 16 || pad > b.size()) return std::nullopt; + return Bytes(b.begin(), b.end() - pad); +} + +std::string extract_text(const Bytes& message_proto) { + ProtoReader r(message_proto); + ProtoReader::Field f; + std::string conversation; + std::string ext; + Bytes device_sent_inner; + while (r.next(f)) { + if (f.field == 1 && f.wire == 2) conversation.assign(f.bytes.begin(), f.bytes.end()); + else if (f.field == 6 && f.wire == 2) { // extendedTextMessage + ProtoReader er(f.bytes); + ProtoReader::Field ef; + while (er.next(ef)) + if (ef.field == 1 && ef.wire == 2) ext.assign(ef.bytes.begin(), ef.bytes.end()); + } else if (f.field == 31 && f.wire == 2) { // deviceSentMessage + ProtoReader dr(f.bytes); + ProtoReader::Field df; + while (dr.next(df)) + if (df.field == 2 && df.wire == 2) device_sent_inner = df.bytes; + } + } + if (!conversation.empty()) return conversation; + if (!ext.empty()) return ext; + if (!device_sent_inner.empty()) return extract_text(device_sent_inner); + return {}; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_proto.h b/taicpp/src/whatsapp/wa_proto.h new file mode 100644 index 0000000..82fffb4 --- /dev/null +++ b/taicpp/src/whatsapp/wa_proto.h @@ -0,0 +1,187 @@ +#pragma once +// WaProto: a minimal protobuf wire writer/reader plus the specific WhatsApp +// messages detz::wa needs. No protobuf library; field numbers come from +// whatsmeow proto/*.proto (MPL-2.0). Only the ~15 messages the 1:1 text+image +// client touches are modelled. See docs/whatsapp.md section 5. +#include +#include +#include +#include +#include + +namespace detz::wa { + +using Bytes = std::vector; + +// ---- generic protobuf wire writer (proto2/proto3 compatible) ---- +class ProtoWriter { + public: + void varint(int field, uint64_t v); + void boolean(int field, bool v); + void sfixed32(int field, int32_t v); + void bytes(int field, const Bytes& b); + void str(int field, const std::string& s); + void message(int field, const Bytes& sub); // length-delimited submessage + const Bytes& data() const { return buf_; } + Bytes take() { return std::move(buf_); } + + private: + Bytes buf_; + void key(int field, int wire); + void put_varint(uint64_t v); +}; + +// ---- generic protobuf wire reader ---- +class ProtoReader { + public: + explicit ProtoReader(const Bytes& b) : buf_(b) {} + struct Field { + int field{0}; + int wire{0}; + uint64_t varint{0}; // wire 0 + Bytes bytes; // wire 2 + uint32_t fixed32{0}; // wire 5 + }; + bool next(Field& out); // false at end; throws on malformed + + private: + Bytes buf_; // owned copy: callers often pass temporaries (message slices) + size_t pos_{0}; +}; + +// ---------- message builders (encode) ---------- + +struct WaAppVersion { + uint32_t primary{0}, secondary{0}, tertiary{0}; + bool has{false}; + Bytes encode() const; +}; + +struct WaUserAgent { + int platform{14}; // WEB + WaAppVersion app_version; + std::string mcc{"000"}, mnc{"000"}, os_version{"0.1"}, manufacturer{""}, device{"Desktop"}, os_build{"0.1"}; + int release_channel{0}; // RELEASE + std::string locale_lang{"en"}, locale_country{"US"}; + Bytes encode() const; +}; + +struct WaDevicePairingData { + Bytes e_regid, e_keytype, e_ident, e_skey_id, e_skey_val, e_skey_sig, build_hash, device_props; + Bytes encode() const; +}; + +// ClientPayload for registration (unpaired) or login (paired). +struct WaClientPayload { + bool has_passive{false}; + bool passive{false}; + WaUserAgent user_agent; + bool has_user_agent{false}; + bool has_web_info{false}; + int web_sub_platform{0}; // WEB_BROWSER + bool has_connect{false}; + int connect_type{1}; // WIFI_UNKNOWN + int connect_reason{1}; // USER_ACTIVATED + std::optional username; + std::optional device; + std::optional pairing; + bool has_pull{false}; + bool pull{false}; + std::optional lc; + bool lid_db_migrated{false}; + bool has_lid_db_migrated{false}; + Bytes encode() const; +}; + +struct WaDeviceProps { + std::string os{"whatsmeow"}; + uint32_t ver_primary{0}, ver_secondary{1}, ver_tertiary{0}; + int platform_type{0}; // UNKNOWN + bool require_full_sync{false}; + Bytes encode() const; +}; + +// HandshakeMessage: we only ever build ClientHello and ClientFinish, and parse +// ServerHello. +Bytes encode_client_hello(const Bytes& ephemeral); +Bytes encode_client_finish(const Bytes& static_enc, const Bytes& payload_enc); + +struct WaServerHello { + Bytes ephemeral, static_enc, payload; +}; +// Parse a HandshakeMessage, returning its ServerHello (field 3). +std::optional parse_server_hello(const Bytes& handshake_msg); + +// ---- ADV device identity (pairing) ---- +struct WaADVSignedDeviceIdentityHMAC { + Bytes details, hmac; + int account_type{0}; + bool has_account_type{false}; +}; +std::optional parse_adv_hmac(const Bytes& b); + +struct WaADVSignedDeviceIdentity { + Bytes details, account_signature_key, account_signature, device_signature; + Bytes encode() const; // re-encode (for the self-signed identity we send back) +}; +std::optional parse_adv_identity(const Bytes& b); + +struct WaADVDeviceIdentity { + uint32_t raw_id{0}, key_index{0}; + uint64_t timestamp{0}; + int account_type{0}, device_type{0}; +}; +std::optional parse_adv_device_identity(const Bytes& b); + +// ---- cert chain (noise handshake) ---- +struct WaNoiseCertDetails { + uint32_t serial{0}; + Bytes key; // the issuer/subject key (32 bytes) +}; +struct WaCertChainParsed { + Bytes intermediate_details, intermediate_signature; + Bytes leaf_details, leaf_signature; +}; +std::optional parse_cert_chain(const Bytes& b); +// parse NoiseCertificate (the leaf's "details" actually wraps a NoiseCertificate) +struct WaNoiseCertificate { + Bytes details, signature; +}; +std::optional parse_noise_certificate(const Bytes& b); +std::optional parse_cert_details(const Bytes& b); + +// ---- E2E messages ---- +struct WaMessage { + // build helpers (only what we send/receive for 1:1 text + image) + std::optional conversation; + // extended text + std::optional ext_text; + // image + struct Image { + std::string url, direct_path, mimetype, caption; + Bytes media_key, file_sha256, file_enc_sha256; + uint64_t file_length{0}; + uint32_t width{0}, height{0}; + int64_t media_key_timestamp{0}; + Bytes jpeg_thumbnail; + }; + std::optional image; + // deviceSent wrapper (own-device fanout) + struct DeviceSent { + std::string destination_jid; + Bytes inner; // already-encoded Message + }; + std::optional device_sent; + Bytes encode() const; +}; + +// Pad a serialized message with 1..16 random pad bytes (WhatsApp message padding). +Bytes pad_random_max16(const Bytes& b); +std::optional unpad_random_max16(const Bytes& b); + +// Parse an incoming decrypted Message and pull out plain text (conversation or +// extendedText) and, if present, unwrap deviceSentMessage. Returns the text, or +// empty if the message carried no text we understand. +std::string extract_text(const Bytes& message_proto); + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_qr.cpp b/taicpp/src/whatsapp/wa_qr.cpp new file mode 100644 index 0000000..de223c0 --- /dev/null +++ b/taicpp/src/whatsapp/wa_qr.cpp @@ -0,0 +1,42 @@ +#include "wa_qr.h" + +#include + +#include "qrcodegen.hpp" + +namespace detz::wa { + +std::string WaQr::render(const std::string& text, int quiet) { + using qrcodegen::QrCode; + QrCode qr = QrCode::encodeText(text.c_str(), QrCode::Ecc::LOW); + int size = qr.getSize(); + auto dark = [&](int x, int y) -> bool { + if (x < 0 || y < 0 || x >= size || y >= size) return false; // quiet zone is light + return qr.getModule(x, y); + }; + // Half-block rendering: each character row covers two module rows. A QR dark + // module is drawn as a dark cell. We print with an explicit light border. + const std::string FULL = "\xE2\x96\x88"; // U+2588 full block (both halves dark) + const std::string UPPER = "\xE2\x96\x80"; // U+2580 upper half block + const std::string LOWER = "\xE2\x96\x84"; // U+2584 lower half block + const std::string EMPTY = " "; + int lo = -quiet, hi = size + quiet; + std::string out; + for (int y = lo; y < hi; y += 2) { + for (int x = lo; x < hi; ++x) { + bool top = dark(x, y); + bool bot = dark(x, y + 1); + // terminal default: dark module = foreground glyph on a light background. + // We invert so the QR is dark-on-light (scannable): dark module -> space-less. + // Represent dark as the block, light as empty, using half blocks. + if (top && bot) out += FULL; + else if (top && !bot) out += UPPER; + else if (!top && bot) out += LOWER; + else out += EMPTY; + } + out += "\n"; + } + return out; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_qr.h b/taicpp/src/whatsapp/wa_qr.h new file mode 100644 index 0000000..49e971b --- /dev/null +++ b/taicpp/src/whatsapp/wa_qr.h @@ -0,0 +1,16 @@ +#pragma once +// WaQr: render a string (the WhatsApp linking payload) as a scannable QR code +// in the terminal, using the vendored nayuki qrcodegen (third_party/qrcodegen, +// MIT). Uses Unicode half-block characters so one text row shows two QR rows. +#include + +namespace detz::wa { + +class WaQr { + public: + // Render `text` as a QR code into a multi-line string of half-block glyphs + // with a quiet-zone border. quiet is the border in modules (>=2 recommended). + static std::string render(const std::string& text, int quiet = 2); +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_signal.cpp b/taicpp/src/whatsapp/wa_signal.cpp new file mode 100644 index 0000000..203f9f1 --- /dev/null +++ b/taicpp/src/whatsapp/wa_signal.cpp @@ -0,0 +1,389 @@ +#include "wa_signal.h" + +#include +#include + +#include "wa_proto.h" + +namespace detz::wa { + +namespace { +constexpr int kCurrentVersion = 3; +constexpr uint8_t kVersionByte = (kCurrentVersion << 4) | kCurrentVersion; // 0x33 +constexpr size_t kMacLen = 8; +constexpr int kMaxSkip = 2000; + +Bytes b32(const std::array& a) { return Bytes(a.begin(), a.end()); } +std::array a32(const Bytes& b) { + std::array a{}; + std::copy_n(b.begin(), std::min(32, b.size()), a.begin()); + return a; +} + +// DH between our 32-byte private and a 33-byte Signal public (strip 0x05). +std::array sdh(const std::array& priv, const SignalKey& pub33) { + std::array peer{}; + std::copy(pub33.begin() + 1, pub33.end(), peer.begin()); + return WaCrypto::x25519(priv, peer); +} + +Bytes hkdf(const Bytes& ikm, const Bytes& salt, const std::string& info, size_t n) { + return WaCrypto::hkdf_sha256(ikm, salt, Bytes(info.begin(), info.end()), n); +} + +// ---- WhisperMessage (proto-ish) ---- +Bytes marshal_whisper_body(const SignalKey& ratchet, uint32_t counter, uint32_t prev, const Bytes& ciphertext) { + ProtoWriter w; + w.bytes(1, Bytes(ratchet.begin(), ratchet.end())); + w.varint(2, counter); + w.varint(3, prev); + w.bytes(4, ciphertext); + return w.take(); +} + +} // namespace + +SignalKey signal_pub(const std::array& curve_pub) { + SignalKey out{}; + out[0] = 0x05; + std::copy(curve_pub.begin(), curve_pub.end(), out.begin() + 1); + return out; +} + +static std::array chain_next(const std::array& chain) { + Bytes mac = WaCrypto::hmac_sha256(b32(chain), Bytes{0x02}); + return a32(mac); +} + +static WaSession::MsgKeys derive_msg_keys(const std::array& chain, uint32_t counter) { + Bytes material = WaCrypto::hmac_sha256(b32(chain), Bytes{0x01}); + Bytes out = hkdf(material, Bytes(32, 0), "WhisperMessageKeys", 80); + WaSession::MsgKeys mk; + std::copy_n(out.begin(), 32, mk.cipher_key.begin()); + std::copy_n(out.begin() + 32, 32, mk.mac_key.begin()); + std::copy_n(out.begin() + 64, 16, mk.iv.begin()); + mk.counter = counter; + return mk; +} + +static Bytes compute_mac(const std::array& mac_key, const SignalKey& sender, const SignalKey& receiver, + const Bytes& data) { + Bytes in(sender.begin(), sender.end()); + in.insert(in.end(), receiver.begin(), receiver.end()); + in.insert(in.end(), data.begin(), data.end()); + return WaCrypto::hmac_sha256(b32(mac_key), in); +} + +// X3DH --------------------------------------------------------------- +static Bytes discontinuity() { return Bytes(32, 0xFF); } + +WaSession WaSession::initiate(const InitiatorParams& p, const WaCrypto::KeyPair& sending_ratchet) { + Bytes master = discontinuity(); + // DH1 = DH(IK_a, SPK_b); DH2 = DH(EK_a, IK_b); DH3 = DH(EK_a, SPK_b); [DH4 = DH(EK_a, OPK_b)] + auto d1 = sdh(p.local_identity.priv, p.remote_signed_pre); + auto d2 = sdh(p.local_base.priv, p.remote_identity); + auto d3 = sdh(p.local_base.priv, p.remote_signed_pre); + master.insert(master.end(), d1.begin(), d1.end()); + master.insert(master.end(), d2.begin(), d2.end()); + master.insert(master.end(), d3.begin(), d3.end()); + if (p.has_pre_key) { + auto d4 = sdh(p.local_base.priv, p.remote_pre_key); + master.insert(master.end(), d4.begin(), d4.end()); + } + Bytes rc = hkdf(master, Bytes(32, 0), "WhisperText", 64); + WaSession s; + s.local_identity_pub_ = signal_pub(p.local_identity.pub); + s.remote_identity_pub_ = p.remote_identity; + std::copy_n(rc.begin(), 32, s.root_key_.begin()); + s.sending_ratchet_ = sending_ratchet; + s.their_ratchet_pub_ = p.remote_signed_pre; + s.is_initiator_ = true; + s.pending_base_key_ = signal_pub(p.local_base.pub); + // first sending chain via root KDF + auto dh = sdh(sending_ratchet.priv, p.remote_signed_pre); + Bytes out = hkdf(b32(dh), b32(s.root_key_), "WhisperRatchet", 64); + std::copy_n(out.begin(), 32, s.root_key_.begin()); + std::copy_n(out.begin() + 32, 32, s.sending_chain_.begin()); + s.has_sending_chain_ = true; + return s; +} + +std::optional> WaSession::process_prekey_message( + const Bytes& pkmsg, const WaCrypto::KeyPair& local_identity, const WaCrypto::KeyPair& signed_pre, + const std::optional& pre_key, uint32_t local_reg_id) { + // parse PreKeyWhisperMessage + if (pkmsg.empty() || pkmsg[0] != kVersionByte) return std::nullopt; + ProtoReader r(Bytes(pkmsg.begin() + 1, pkmsg.end())); + ProtoReader::Field f; + SignalKey base{}, ident{}; + Bytes inner; + bool has_pre_key = false; + try { + while (r.next(f)) { + if (f.field == 1 && f.wire == 0) has_pre_key = true; + else if (f.field == 2 && f.wire == 2 && f.bytes.size() == 33) std::copy(f.bytes.begin(), f.bytes.end(), base.begin()); + else if (f.field == 3 && f.wire == 2 && f.bytes.size() == 33) std::copy(f.bytes.begin(), f.bytes.end(), ident.begin()); + else if (f.field == 4 && f.wire == 2) inner = f.bytes; + } + } catch (...) { + return std::nullopt; + } + if (inner.empty()) return std::nullopt; + + WaSession s; + // X3DH responder: DH1 = DH(SPK_b, IK_a); DH2 = DH(IK_b, EK_a); DH3 = DH(SPK_b, EK_a); [DH4 = DH(OPK_b, EK_a)] + Bytes master = discontinuity(); + auto d1 = sdh(signed_pre.priv, ident); + auto d2 = sdh(local_identity.priv, base); + auto d3 = sdh(signed_pre.priv, base); + master.insert(master.end(), d1.begin(), d1.end()); + master.insert(master.end(), d2.begin(), d2.end()); + master.insert(master.end(), d3.begin(), d3.end()); + if (has_pre_key && pre_key) { + auto d4 = sdh(pre_key->priv, base); + master.insert(master.end(), d4.begin(), d4.end()); + } + Bytes rc = hkdf(master, Bytes(32, 0), "WhisperText", 64); + std::copy_n(rc.begin(), 32, s.root_key_.begin()); + s.local_identity_pub_ = signal_pub(local_identity.pub); + s.remote_identity_pub_ = ident; + s.sending_ratchet_ = signed_pre; // Bob's current ratchet = SPK_b + s.is_initiator_ = false; + s.local_reg_id_ = local_reg_id; + + auto pt = s.decrypt(inner); + if (!pt) return std::nullopt; + return std::make_pair(*pt, s); +} + +void WaSession::set_pending(uint32_t reg_id, const SignalKey& base, uint32_t signed_pre_id, bool has_pre_key, + uint32_t pre_key_id) { + local_reg_id_ = reg_id; + pending_base_key_ = base; + pending_signed_pre_key_id_ = signed_pre_id; + has_pending_pre_key_ = has_pre_key; + pending_pre_key_id_ = pre_key_id; + pending_active_ = true; +} + +CiphertextMessage WaSession::encrypt(const Bytes& plaintext) { + MsgKeys mk = derive_msg_keys(sending_chain_, send_counter_); + Bytes body = WaCrypto::aes_cbc_encrypt_nopad(b32(mk.cipher_key), Bytes(mk.iv.begin(), mk.iv.end()), + WaCrypto::pkcs7_pad(plaintext)); + Bytes signed_bytes; + signed_bytes.push_back(kVersionByte); + Bytes wbody = marshal_whisper_body(signal_pub(sending_ratchet_.pub), send_counter_, prev_send_counter_, body); + signed_bytes.insert(signed_bytes.end(), wbody.begin(), wbody.end()); + Bytes mac = compute_mac(mk.mac_key, local_identity_pub_, remote_identity_pub_, signed_bytes); + Bytes whisper = signed_bytes; + whisper.insert(whisper.end(), mac.begin(), mac.begin() + kMacLen); + + sending_chain_ = chain_next(sending_chain_); + send_counter_++; + + if (pending_active_) { + ProtoWriter w; + if (has_pending_pre_key_) w.varint(1, pending_pre_key_id_); + w.bytes(2, Bytes(pending_base_key_.begin(), pending_base_key_.end())); + w.bytes(3, Bytes(local_identity_pub_.begin(), local_identity_pub_.end())); + w.bytes(4, whisper); + w.varint(5, local_reg_id_); + w.varint(6, pending_signed_pre_key_id_); + Bytes pk; + pk.push_back(kVersionByte); + Bytes body2 = w.take(); + pk.insert(pk.end(), body2.begin(), body2.end()); + return {"pkmsg", pk}; + } + return {"msg", whisper}; +} + +static bool parse_whisper(const Bytes& data, SignalKey& ratchet, uint32_t& counter, Bytes& ciphertext, + Bytes& signed_out, Bytes& mac_out) { + if (data.size() < 1 + kMacLen || data[0] != kVersionByte) return false; + signed_out.assign(data.begin(), data.end() - kMacLen); + mac_out.assign(data.end() - kMacLen, data.end()); + ProtoReader r(Bytes(data.begin() + 1, data.end() - kMacLen)); + ProtoReader::Field f; + bool got_ratchet = false; + try { + while (r.next(f)) { + if (f.field == 1 && f.wire == 2 && f.bytes.size() == 33) { + std::copy(f.bytes.begin(), f.bytes.end(), ratchet.begin()); + got_ratchet = true; + } else if (f.field == 2 && f.wire == 0) { + counter = static_cast(f.varint); + } else if (f.field == 4 && f.wire == 2) { + ciphertext = f.bytes; + } + } + } catch (...) { + return false; + } + return got_ratchet && !ciphertext.empty(); +} + +void WaSession::dh_ratchet_receive(const SignalKey& their_ratchet) { + // derive receiving chain + auto dh1 = sdh(sending_ratchet_.priv, their_ratchet); + Bytes out = hkdf(b32(dh1), b32(root_key_), "WhisperRatchet", 64); + std::copy_n(out.begin(), 32, root_key_.begin()); + std::copy_n(out.begin() + 32, 32, receiving_chain_.begin()); + has_receiving_chain_ = true; + recv_counter_ = 0; + their_ratchet_pub_ = their_ratchet; + // new sending ratchet + WaCrypto::KeyPair nr = gen_ratchet_ ? gen_ratchet_() : WaCrypto::generate_x25519(); + auto dh2 = sdh(nr.priv, their_ratchet); + Bytes out2 = hkdf(b32(dh2), b32(root_key_), "WhisperRatchet", 64); + std::copy_n(out2.begin(), 32, root_key_.begin()); + std::copy_n(out2.begin() + 32, 32, sending_chain_.begin()); + sending_ratchet_ = nr; + has_sending_chain_ = true; + if (send_counter_ > 0) prev_send_counter_ = send_counter_ - 1; + send_counter_ = 0; + pending_active_ = false; +} + +std::optional WaSession::decrypt(const Bytes& serialized) { + SignalKey ratchet{}; + uint32_t counter = 0; + Bytes ciphertext, signed_bytes, mac; + if (!parse_whisper(serialized, ratchet, counter, ciphertext, signed_bytes, mac)) return std::nullopt; + + auto try_decrypt = [&](const MsgKeys& mk) -> std::optional { + Bytes want = compute_mac(mk.mac_key, remote_identity_pub_, local_identity_pub_, signed_bytes); + if (!WaCrypto::const_time_eq(Bytes(want.begin(), want.begin() + kMacLen), mac)) return std::nullopt; + Bytes pt = WaCrypto::aes_cbc_decrypt_nopad(b32(mk.cipher_key), Bytes(mk.iv.begin(), mk.iv.end()), ciphertext); + return WaCrypto::pkcs7_unpad(pt); + }; + + auto key = std::make_pair(ratchet, counter); + auto it = skipped_.find(key); + if (it != skipped_.end()) { + auto pt = try_decrypt(it->second); + if (pt) skipped_.erase(it); + return pt; + } + if (!has_receiving_chain_ || ratchet != their_ratchet_pub_) dh_ratchet_receive(ratchet); + if (counter < recv_counter_) return std::nullopt; + if (counter - recv_counter_ > static_cast(kMaxSkip)) return std::nullopt; + while (recv_counter_ < counter) { + MsgKeys mk = derive_msg_keys(receiving_chain_, recv_counter_); + skipped_[{their_ratchet_pub_, recv_counter_}] = mk; + receiving_chain_ = chain_next(receiving_chain_); + recv_counter_++; + } + MsgKeys mk = derive_msg_keys(receiving_chain_, recv_counter_); + auto pt = try_decrypt(mk); + if (!pt) return std::nullopt; + receiving_chain_ = chain_next(receiving_chain_); + recv_counter_++; + return pt; +} + +// ---- serialization (opaque length-prefixed blob for the vault) ---- +namespace { +void put_u32(Bytes& b, uint32_t v) { + for (int i = 0; i < 4; ++i) b.push_back((v >> (8 * i)) & 0xff); +} +uint32_t get_u32(const Bytes& b, size_t& p) { + uint32_t v = 0; + for (int i = 0; i < 4; ++i) v |= static_cast(b[p++]) << (8 * i); + return v; +} +void put_blob(Bytes& b, const Bytes& v) { + put_u32(b, static_cast(v.size())); + b.insert(b.end(), v.begin(), v.end()); +} +Bytes get_blob(const Bytes& b, size_t& p) { + uint32_t n = get_u32(b, p); + Bytes v(b.begin() + p, b.begin() + p + n); + p += n; + return v; +} +} // namespace + +Bytes WaSession::serialize() const { + Bytes b; + b.push_back(1); // version + put_blob(b, Bytes(local_identity_pub_.begin(), local_identity_pub_.end())); + put_blob(b, Bytes(remote_identity_pub_.begin(), remote_identity_pub_.end())); + put_u32(b, local_reg_id_); + put_blob(b, b32(root_key_)); + put_blob(b, Bytes(sending_ratchet_.priv.begin(), sending_ratchet_.priv.end())); + put_blob(b, Bytes(sending_ratchet_.pub.begin(), sending_ratchet_.pub.end())); + put_blob(b, b32(sending_chain_)); + b.push_back(has_sending_chain_ ? 1 : 0); + put_u32(b, send_counter_); + put_u32(b, prev_send_counter_); + put_blob(b, Bytes(their_ratchet_pub_.begin(), their_ratchet_pub_.end())); + b.push_back(has_receiving_chain_ ? 1 : 0); + put_blob(b, b32(receiving_chain_)); + put_u32(b, recv_counter_); + b.push_back(is_initiator_ ? 1 : 0); + put_u32(b, pending_pre_key_id_); + b.push_back(has_pending_pre_key_ ? 1 : 0); + put_u32(b, pending_signed_pre_key_id_); + put_blob(b, Bytes(pending_base_key_.begin(), pending_base_key_.end())); + b.push_back(pending_active_ ? 1 : 0); + put_u32(b, static_cast(skipped_.size())); + for (const auto& [k, mk] : skipped_) { + put_blob(b, Bytes(k.first.begin(), k.first.end())); + put_u32(b, k.second); + put_blob(b, b32(mk.cipher_key)); + put_blob(b, b32(mk.mac_key)); + put_blob(b, Bytes(mk.iv.begin(), mk.iv.end())); + } + return b; +} + +std::optional WaSession::deserialize(const Bytes& blob) { + if (blob.empty() || blob[0] != 1) return std::nullopt; + try { + size_t p = 1; + WaSession s; + auto sk = [](const Bytes& v) { + SignalKey k{}; + std::copy_n(v.begin(), std::min(33, v.size()), k.begin()); + return k; + }; + s.local_identity_pub_ = sk(get_blob(blob, p)); + s.remote_identity_pub_ = sk(get_blob(blob, p)); + s.local_reg_id_ = get_u32(blob, p); + s.root_key_ = a32(get_blob(blob, p)); + s.sending_ratchet_.priv = a32(get_blob(blob, p)); + s.sending_ratchet_.pub = a32(get_blob(blob, p)); + s.sending_chain_ = a32(get_blob(blob, p)); + s.has_sending_chain_ = blob[p++] != 0; + s.send_counter_ = get_u32(blob, p); + s.prev_send_counter_ = get_u32(blob, p); + s.their_ratchet_pub_ = sk(get_blob(blob, p)); + s.has_receiving_chain_ = blob[p++] != 0; + s.receiving_chain_ = a32(get_blob(blob, p)); + s.recv_counter_ = get_u32(blob, p); + s.is_initiator_ = blob[p++] != 0; + s.pending_pre_key_id_ = get_u32(blob, p); + s.has_pending_pre_key_ = blob[p++] != 0; + s.pending_signed_pre_key_id_ = get_u32(blob, p); + s.pending_base_key_ = sk(get_blob(blob, p)); + s.pending_active_ = blob[p++] != 0; + uint32_t n = get_u32(blob, p); + for (uint32_t i = 0; i < n; ++i) { + SignalKey r = sk(get_blob(blob, p)); + uint32_t c = get_u32(blob, p); + MsgKeys mk; + mk.cipher_key = a32(get_blob(blob, p)); + mk.mac_key = a32(get_blob(blob, p)); + Bytes iv = get_blob(blob, p); + std::copy_n(iv.begin(), 16, mk.iv.begin()); + mk.counter = c; + s.skipped_[{r, c}] = mk; + } + return s; + } catch (...) { + return std::nullopt; + } +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_signal.h b/taicpp/src/whatsapp/wa_signal.h new file mode 100644 index 0000000..69fce5f --- /dev/null +++ b/taicpp/src/whatsapp/wa_signal.h @@ -0,0 +1,102 @@ +#pragma once +// WaSignal: the Signal protocol (X3DH key agreement + Double Ratchet) as +// WhatsApp uses it, over Curve25519. Ported from wa-go internal/signal (MIT); +// the reference is Signal's libsignal. Message keys are AES-256-CBC + HMAC-SHA256 +// (truncated to 8 bytes). See docs/whatsapp.md section 5. +#include +#include +#include +#include +#include +#include +#include + +#include "wa_crypto.h" + +namespace detz::wa { + +// A 33-byte Signal public key (0x05 prefix + 32-byte Curve25519 point). +using SignalKey = std::array; +SignalKey signal_pub(const std::array& curve_pub); + +// A ciphertext ready to place in an node: type is "pkmsg" or "msg". +struct CiphertextMessage { + std::string type; + Bytes serialized; +}; + +// One Double Ratchet session with a single remote device. Serializable for the +// vault (store_session / load_session). All public keys are 33-byte Signal keys. +class WaSession { + public: + // X3DH as the initiator (Alice): we have the remote's prekey bundle. + struct InitiatorParams { + WaCrypto::KeyPair local_identity; // our identity key (32-byte curve) + WaCrypto::KeyPair local_base; // ephemeral base key EK_a + SignalKey remote_identity; + SignalKey remote_signed_pre; + SignalKey remote_pre_key; + bool has_pre_key{false}; + }; + // X3DH as the responder (Bob): we received a pkmsg. + struct ResponderParams { + WaCrypto::KeyPair local_identity; + WaCrypto::KeyPair local_signed_pre; + WaCrypto::KeyPair local_pre_key; + bool has_pre_key{false}; + SignalKey remote_identity; + SignalKey remote_base; + }; + + // Build an initiator session; sending_ratchet is the first DH ratchet key pair. + static WaSession initiate(const InitiatorParams& p, const WaCrypto::KeyPair& sending_ratchet); + // Process an incoming pkmsg as responder, returning plaintext and the new + // session. local_reg_id is our registration id. + static std::optional> process_prekey_message( + const Bytes& pkmsg, const WaCrypto::KeyPair& local_identity, const WaCrypto::KeyPair& signed_pre, + const std::optional& pre_key, uint32_t local_reg_id); + + CiphertextMessage encrypt(const Bytes& plaintext); + std::optional decrypt(const Bytes& serialized); + + // pending-prekey info (for the initiator's first pkmsg) + void set_pending(uint32_t reg_id, const SignalKey& base, uint32_t signed_pre_id, bool has_pre_key, + uint32_t pre_key_id); + // inject a deterministic ratchet generator (tests); default is random. + void set_ratchet_generator(std::function gen) { gen_ratchet_ = std::move(gen); } + + // serialize/deserialize for the vault (opaque blob) + Bytes serialize() const; + static std::optional deserialize(const Bytes& blob); + + struct MsgKeys { + std::array cipher_key{}, mac_key{}; + std::array iv{}; + uint32_t counter{0}; + }; + + private: + SignalKey local_identity_pub_{}, remote_identity_pub_{}; + uint32_t local_reg_id_{0}; + std::array root_key_{}; + WaCrypto::KeyPair sending_ratchet_; + std::array sending_chain_{}; + bool has_sending_chain_{false}; + uint32_t send_counter_{0}, prev_send_counter_{0}; + SignalKey their_ratchet_pub_{}; + bool has_receiving_chain_{false}; + std::array receiving_chain_{}; + uint32_t recv_counter_{0}; + bool is_initiator_{false}; + uint32_t pending_pre_key_id_{0}; + bool has_pending_pre_key_{false}; + uint32_t pending_signed_pre_key_id_{0}; + SignalKey pending_base_key_{}; + bool pending_active_{false}; + std::map, MsgKeys> skipped_; + std::function gen_ratchet_; + + void dh_ratchet_receive(const SignalKey& their_ratchet); +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_socket.cpp b/taicpp/src/whatsapp/wa_socket.cpp new file mode 100644 index 0000000..abed0eb --- /dev/null +++ b/taicpp/src/whatsapp/wa_socket.cpp @@ -0,0 +1,110 @@ +#include "wa_socket.h" + +#include + +#include + +#include "wa_noise.h" // WaFraming + +namespace detz::wa { + +WaSocket::WaSocket() { + handle_ = curl_easy_init(); + if (handle_ == nullptr) throw WaSocketError("curl_easy_init failed"); +} + +WaSocket::~WaSocket() { close(); } + +void WaSocket::close() { + if (handle_ != nullptr) { + curl_easy_cleanup(static_cast(handle_)); + handle_ = nullptr; + } + connected_ = false; +} + +void WaSocket::connect(int timeout_seconds) { + CURL* c = static_cast(handle_); + curl_easy_setopt(c, CURLOPT_URL, kUrl); + curl_easy_setopt(c, CURLOPT_CONNECT_ONLY, 2L); // 2L = WebSocket connect-only mode + struct curl_slist* hdrs = nullptr; + hdrs = curl_slist_append(hdrs, (std::string("Origin: ") + kOrigin).c_str()); + curl_easy_setopt(c, CURLOPT_HTTPHEADER, hdrs); + curl_easy_setopt(c, CURLOPT_TIMEOUT, static_cast(timeout_seconds)); + curl_easy_setopt(c, CURLOPT_CONNECTTIMEOUT, static_cast(timeout_seconds)); + CURLcode rc = curl_easy_perform(c); + curl_slist_free_all(hdrs); + if (rc != CURLE_OK) throw WaSocketError(std::string("connect: ") + curl_easy_strerror(rc)); + connected_ = true; +} + +void WaSocket::send_frame(const Bytes& framed) { + CURL* c = static_cast(handle_); + size_t off = 0; + while (off < framed.size()) { + size_t sent = 0; + CURLcode rc = curl_ws_send(c, framed.data() + off, framed.size() - off, &sent, 0, CURLWS_BINARY); + if (rc == CURLE_AGAIN) continue; + if (rc != CURLE_OK) throw WaSocketError(std::string("ws_send: ") + curl_easy_strerror(rc)); + off += sent; + } +} + +bool WaSocket::pump_once(int timeout_seconds) { + CURL* c = static_cast(handle_); + char buf[16384]; + size_t rlen = 0; + const struct curl_ws_frame* meta = nullptr; + int waited_ms = 0; + while (true) { + CURLcode rc = curl_ws_recv(c, buf, sizeof buf, &rlen, &meta); + if (rc == CURLE_OK) { + if (rlen > 0) inbuf_.insert(inbuf_.end(), buf, buf + rlen); + if (meta != nullptr && (meta->flags & CURLWS_CLOSE)) return false; + return true; + } + if (rc == CURLE_AGAIN) { + if (waited_ms >= timeout_seconds * 1000) return true; // nothing yet, let caller retry + struct timeval tv { + 0, 20 * 1000 + }; + select(0, nullptr, nullptr, nullptr, &tv); + waited_ms += 20; + continue; + } + if (rc == CURLE_GOT_NOTHING) return false; + throw WaSocketError(std::string("ws_recv: ") + curl_easy_strerror(rc)); + } +} + +std::optional WaSocket::recv_frame(int timeout_seconds) { + int waited = 0; + while (true) { + // try to parse a complete frame from what we already have + size_t pos = frame_pos_; + auto fr = WaFraming::unframe(inbuf_, pos); + if (fr) { + frame_pos_ = pos; + // compact occasionally + if (frame_pos_ > (1u << 20)) { + inbuf_.erase(inbuf_.begin(), inbuf_.begin() + frame_pos_); + frame_pos_ = 0; + } + return fr; + } + if (waited >= timeout_seconds) return std::nullopt; + if (!pump_once(1)) { + // closed: try one last parse + size_t p2 = frame_pos_; + auto last = WaFraming::unframe(inbuf_, p2); + if (last) { + frame_pos_ = p2; + return last; + } + return std::nullopt; + } + waited += 1; + } +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_socket.h b/taicpp/src/whatsapp/wa_socket.h new file mode 100644 index 0000000..2902550 --- /dev/null +++ b/taicpp/src/whatsapp/wa_socket.h @@ -0,0 +1,54 @@ +#pragma once +// WaSocket: the WhatsApp Web WebSocket transport over libcurl's ws API. Handles +// connecting to wss://web.whatsapp.com/ws/chat, sending length-prefixed frames +// and reassembling incoming ones. Binary only. One per connection. See +// docs/whatsapp.md section 5. +#include +#include +#include +#include +#include + +namespace detz::wa { + +using Bytes = std::vector; + +class WaSocketError : public std::runtime_error { + public: + explicit WaSocketError(const std::string& m) : std::runtime_error("wa socket: " + m) {} +}; + +class WaSocket { + public: + static constexpr const char* kUrl = "wss://web.whatsapp.com/ws/chat"; + static constexpr const char* kOrigin = "https://web.whatsapp.com"; + + WaSocket(); + ~WaSocket(); + WaSocket(const WaSocket&) = delete; + WaSocket& operator=(const WaSocket&) = delete; + + // Connect and upgrade to a WebSocket. Throws WaSocketError on failure. + void connect(int timeout_seconds = 20); + bool connected() const { return handle_ != nullptr && connected_; } + + // Send one already-framed payload (WaFraming::frame output) as a binary message. + void send_frame(const Bytes& framed); + + // Receive the next complete WhatsApp frame (unwraps the 3-byte length prefix, + // reassembling across WebSocket fragments). Returns std::nullopt on clean + // close / timeout with no data. Throws on socket error. + std::optional recv_frame(int timeout_seconds = 30); + + void close(); + + private: + void* handle_{nullptr}; // CURL* + bool connected_{false}; + Bytes inbuf_; // raw bytes received, not yet split into frames + size_t frame_pos_{0}; // read cursor into inbuf_ + + bool pump_once(int timeout_seconds); // read one chunk into inbuf_; false on close +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_store.cpp b/taicpp/src/whatsapp/wa_store.cpp new file mode 100644 index 0000000..9df6799 --- /dev/null +++ b/taicpp/src/whatsapp/wa_store.cpp @@ -0,0 +1,109 @@ +#include "wa_store.h" + +#include + +#include + +#include "sqldb.h" + +namespace detz::wa { + +namespace { +std::string tohex(const Bytes& b) { + static const char* H = "0123456789abcdef"; + std::string s; + s.reserve(b.size() * 2); + for (uint8_t c : b) { + s.push_back(H[c >> 4]); + s.push_back(H[c & 0xf]); + } + return s; +} +Bytes fromhex(const std::string& h) { + Bytes b; + auto nib = [](char c) -> int { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return 0; + }; + for (size_t i = 0; i + 1 < h.size(); i += 2) b.push_back((nib(h[i]) << 4) | nib(h[i + 1])); + return b; +} +} // namespace + +std::string WaStore::db_path(const std::string& home, const std::string& profile) { + return home + "/whatsapp/" + (profile.empty() ? "default" : profile) + ".db"; +} + +WaStore::WaStore(const std::string& home, const std::string& profile) { + std::error_code ec; + std::filesystem::create_directories(home + "/whatsapp", ec); + db_ = std::make_unique(db_path(home, profile)); + db_->execute("CREATE TABLE IF NOT EXISTS wa_device (id INTEGER PRIMARY KEY CHECK (id=1), blob TEXT)"); + db_->execute("CREATE TABLE IF NOT EXISTS wa_session (addr TEXT PRIMARY KEY, blob TEXT)"); + db_->execute("CREATE TABLE IF NOT EXISTS wa_prekey (id INTEGER PRIMARY KEY, priv TEXT)"); + db_->execute("CREATE TABLE IF NOT EXISTS wa_contact (jid TEXT PRIMARY KEY, name TEXT)"); + db_->commit(); +} + +WaStore::~WaStore() = default; + +std::optional WaStore::load_device() { + auto cur = db_->execute("SELECT blob FROM wa_device WHERE id=1"); + const auto* row = cur.first(); + if (row == nullptr || (*row)[0].is_null()) return std::nullopt; + return WaDevice::deserialize(fromhex((*row)[0].text())); +} + +void WaStore::save_device(const WaDevice& d) { + db_->execute("INSERT INTO wa_device (id, blob) VALUES (1, ?) ON CONFLICT(id) DO UPDATE SET blob=excluded.blob", + {store::Cell(tohex(d.serialize()))}); + db_->commit(); +} + +bool WaStore::has_device() { + auto d = load_device(); + return d.has_value() && d->paired(); +} + +std::optional WaStore::load_session(const std::string& addr) { + auto cur = db_->execute("SELECT blob FROM wa_session WHERE addr=?", {store::Cell(addr)}); + const auto* row = cur.first(); + if (row == nullptr) return std::nullopt; + return fromhex((*row)[0].text()); +} + +void WaStore::save_session(const std::string& addr, const Bytes& blob) { + db_->execute("INSERT INTO wa_session (addr, blob) VALUES (?, ?) ON CONFLICT(addr) DO UPDATE SET blob=excluded.blob", + {store::Cell(addr), store::Cell(tohex(blob))}); + db_->commit(); +} + +void WaStore::put_prekey(uint32_t id, const Bytes& priv) { + db_->execute("INSERT INTO wa_prekey (id, priv) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET priv=excluded.priv", + {store::Cell(static_cast(id)), store::Cell(tohex(priv))}); + db_->commit(); +} + +std::optional WaStore::get_prekey(uint32_t id) { + auto cur = db_->execute("SELECT priv FROM wa_prekey WHERE id=?", {store::Cell(static_cast(id))}); + const auto* row = cur.first(); + if (row == nullptr) return std::nullopt; + return fromhex((*row)[0].text()); +} + +void WaStore::put_contact(const std::string& jid, const std::string& name) { + db_->execute("INSERT INTO wa_contact (jid, name) VALUES (?, ?) ON CONFLICT(jid) DO UPDATE SET name=excluded.name", + {store::Cell(jid), store::Cell(name)}); + db_->commit(); +} + +std::vector> WaStore::contacts() { + auto cur = db_->execute("SELECT jid, name FROM wa_contact ORDER BY name"); + std::vector> out; + for (const auto& row : cur.rows) out.emplace_back(row[0].text(), row[1].text()); + return out; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_store.h b/taicpp/src/whatsapp/wa_store.h new file mode 100644 index 0000000..7ea0821 --- /dev/null +++ b/taicpp/src/whatsapp/wa_store.h @@ -0,0 +1,41 @@ +#pragma once +// WaStore: a WaStorePort backed by a dedicated SQLite file under tai's home +// (one per profile, like telegram.env is a file under home). Holds the device +// identity, Signal sessions, one-time prekeys and learned contacts. See +// docs/whatsapp.md. +#include +#include + +#include "wa_client.h" + +namespace detz::store { +class SqlDb; +} + +namespace detz::wa { + +class WaStore : public WaStorePort { + public: + // Opens (creating if needed) /whatsapp/.db and its tables. + WaStore(const std::string& home, const std::string& profile); + ~WaStore() override; + + static std::string db_path(const std::string& home, const std::string& profile); + + std::optional load_device() override; + void save_device(const WaDevice&) override; + std::optional load_session(const std::string& addr) override; + void save_session(const std::string& addr, const Bytes& blob) override; + void put_prekey(uint32_t id, const Bytes& priv) override; + std::optional get_prekey(uint32_t id) override; + void put_contact(const std::string& jid, const std::string& name) override; + std::vector> contacts() override; + + // true if a paired device is stored (used to decide link vs send). + bool has_device(); + + private: + std::unique_ptr db_; +}; + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_tokens_data.h b/taicpp/src/whatsapp/wa_tokens_data.h new file mode 100644 index 0000000..e1ef36e --- /dev/null +++ b/taicpp/src/whatsapp/wa_tokens_data.h @@ -0,0 +1,18 @@ +#pragma once +// wa_tokens_data.h: WhatsApp binary-XML token dictionary version 3, generated +// from whatsmeow binary/token/token.go (MPL-2.0). 236 single-byte tokens and four +// 256-entry double-byte dictionaries. Do not edit by hand; see docs/whatsapp.md. +#include +#include +namespace detz::wa { +inline constexpr int kDictVersion = 3; +inline constexpr std::array kSingleByteTokens = { + "", "xmlstreamstart", "xmlstreamend", "s.whatsapp.net", "type", "participant", "from", "receipt", "id", "notification", "disappearing_mode", "status", "jid", "broadcast", "user", "devices", "device_hash", "to", "offline", "message", "result", "class", "xmlns", "duration", "notify", "iq", "t", "ack", "g.us", "enc", "urn:xmpp:whatsapp:push", "presence", "config_value", "picture", "verified_name", "config_code", "key-index-list", "contact", "mediatype", "routing_info", "edge_routing", "get", "read", "urn:xmpp:ping", "fallback_hostname", "0", "chatstate", "business_hours_config", "unavailable", "download_buckets", "skmsg", "verified_level", "composing", "handshake", "device-list", "media", "text", "fallback_ip4", "media_conn", "device", "creation", "location", "config", "item", "fallback_ip6", "count", "w:profile:picture", "image", "business", "2", "hostname", "call-creator", "display_name", "relaylatency", "platform", "abprops", "success", "msg", "offline_preview", "prop", "key-index", "v", "day_of_week", "pkmsg", "version", "1", "ping", "w:p", "download", "video", "set", "specific_hours", "props", "primary", "unknown", "hash", "commerce_experience", "last", "subscribe", "max_buckets", "call", "profile", "member_since_text", "close_time", "call-id", "sticker", "mode", "participants", "value", "query", "profile_options", "open_time", "code", "list", "host", "ts", "contacts", "upload", "lid", "preview", "update", "usync", "w:stats", "delivery", "auth_ttl", "context", "fail", "cart_enabled", "appdata", "category", "atn", "direct_connection", "decrypt-fail", "relay_id", "mmg-fallback.whatsapp.net", "target", "available", "name", "last_id", "mmg.whatsapp.net", "categories", "401", "is_new", "index", "tctoken", "ip4", "token_id", "latency", "recipient", "edit", "ip6", "add", "thumbnail-document", "26", "paused", "true", "identity", "stream:error", "key", "sidelist", "background", "audio", "3", "thumbnail-image", "biz-cover-photo", "cat", "gcm", "thumbnail-video", "error", "auth", "deny", "serial", "in", "registration", "thumbnail-link", "remove", "00", "gif", "thumbnail-gif", "tag", "capability", "multicast", "item-not-found", "description", "business_hours", "config_expo_key", "md-app-state", "expiration", "fallback", "ttl", "300", "md-msg-hist", "device_orientation", "out", "w:m", "open_24h", "side_list", "token", "inactive", "01", "document", "te2", "played", "encrypt", "msgr", "hide", "direct_path", "12", "state", "not-authorized", "url", "terminate", "signature", "status-revoke-delay", "02", "te", "linked_accounts", "trusted_contact", "timezone", "ptt", "kyc-id", "privacy_token", "readreceipts", "appointment_only", "address", "expected_ts", "privacy", "7", "android", "interactive", "device-identity", "enabled", "attribute_padding", "1080", "03", "screen_height" +}; +inline constexpr std::array, 4> kDoubleByteTokens = {{ + {{"read-self", "active", "fbns", "protocol", "reaction", "screen_width", "heartbeat", "deviceid", "2:47DEQpj8", "uploadfieldstat", "voip_settings", "retry", "priority", "longitude", "conflict", "false", "ig_professional", "replaced", "preaccept", "cover_photo", "uncompressed", "encopt", "ppic", "04", "passive", "status-revoke-drop", "keygen", "540", "offer", "rate", "opus", "latitude", "w:gp2", "ver", "4", "business_profile", "medium", "sender", "prev_v_id", "email", "website", "invited", "sign_credential", "05", "transport", "skey", "reason", "peer_abtest_bucket", "America/Sao_Paulo", "appid", "refresh", "100", "06", "404", "101", "104", "107", "102", "109", "103", "member_add_mode", "105", "transaction-id", "110", "106", "outgoing", "108", "111", "tokens", "followers", "ig_handle", "self_pid", "tue", "dec", "thu", "joinable", "peer_pid", "mon", "features", "wed", "peer_device_presence", "pn", "delete", "07", "fri", "audio_duration", "admin", "connected", "delta", "rcat", "disable", "collection", "08", "480", "sat", "phash", "all", "invite", "accept", "critical_unblock_low", "group_update", "signed_credential", "blinded_credential", "eph_setting", "net", "09", "background_location", "refresh_id", "Asia/Kolkata", "privacy_mode_ts", "account_sync", "voip_payload_type", "service_areas", "acs_public_key", "v_id", "0a", "fallback_class", "relay", "actual_actors", "metadata", "w:biz", "5", "connected-limit", "notice", "0b", "host_storage", "fb_page", "subject", "privatestats", "invis", "groupadd", "010", "note.m4r", "uuid", "0c", "8000", "sun", "372", "1020", "stage", "1200", "720", "canonical", "fb", "011", "video_duration", "0d", "1140", "superadmin", "012", "Opening.m4r", "keystore_attestation", "dleq_proof", "013", "timestamp", "ab_key", "w:sync:app:state", "0e", "vertical", "600", "p_v_id", "6", "likes", "014", "500", "1260", "creator", "0f", "rte", "destination", "group", "group_info", "syncd_anti_tampering_fatal_exception_enabled", "015", "dl_bw", "Asia/Jakarta", "vp8/h.264", "online", "1320", "fb:multiway", "10", "timeout", "016", "nse_retry", "urn:xmpp:whatsapp:dirty", "017", "a_v_id", "web_shops_chat_header_button_enabled", "nse_call", "inactive-upgrade", "none", "web", "groups", "2250", "mms_hot_content_timespan_in_seconds", "contact_blacklist", "nse_read", "suspended_group_deletion_notification", "binary_version", "018", "https://www.whatsapp.com/otp/copy/", "reg_push", "shops_hide_catalog_attachment_entrypoint", "server_sync", ".", "ephemeral_messages_allowed_values", "019", "mms_vcache_aggregation_enabled", "iphone", "America/Argentina/Buenos_Aires", "01a", "mms_vcard_autodownload_size_kb", "nse_ver", "shops_header_dropdown_menu_item", "dhash", "catalog_status", "communities_mvp_new_iqs_serverprop", "blocklist", "default", "11", "ephemeral_messages_enabled", "01b", "original_dimensions", "8", "mms4_media_retry_notification_encryption_enabled", "mms4_server_error_receipt_encryption_enabled", "original_image_url", "sync", "multiway", "420", "companion_enc_static", "shops_profile_drawer_entrypoint", "01c", "vcard_as_document_size_kb", "status_video_max_duration", "request_image_url", "01d", "regular_high", "s_t", "abt", "share_ext_min_preliminary_image_quality", "01e", "32", "syncd_key_rotation_enabled", "data_namespace", "md_downgrade_read_receipts2", "patch", "polltype", "ephemeral_messages_setting", "userrate", "15", "partial_pjpeg_bw_threshold", "played-self", "catalog_exists", "01f", "mute_v2"}}, + {{"reject", "dirty", "announcement", "020", "13", "9", "status_video_max_bitrate", "fb:thrift_iq", "offline_batch", "022", "full", "ctwa_first_business_reply_logging", "h.264", "smax_id", "group_description_length", "https://www.whatsapp.com/otp/code", "status_image_max_edge", "smb_upsell_business_profile_enabled", "021", "web_upgrade_to_md_modal", "14", "023", "s_o", "smaller_video_thumbs_status_enabled", "media_max_autodownload", "960", "blocking_status", "peer_msg", "joinable_group_call_client_version", "group_call_video_maximization_enabled", "return_snapshot", "high", "America/Mexico_City", "entry_point_block_logging_enabled", "pop", "024", "1050", "16", "1380", "one_tap_calling_in_group_chat_size", "regular_low", "inline_joinable_education_enabled", "hq_image_max_edge", "locked", "America/Bogota", "smb_biztools_deeplink_enabled", "status_image_quality", "1088", "025", "payments_upi_intent_transaction_limit", "voip", "w:g2", "027", "md_pin_chat_enabled", "026", "multi_scan_pjpeg_download_enabled", "shops_product_grid", "transaction_id", "ctwa_context_enabled", "20", "fna", "hq_image_quality", "alt_jpeg_doc_detection_quality", "group_call_max_participants", "pkey", "America/Belem", "image_max_kbytes", "web_cart_v1_1_order_message_changes_enabled", "ctwa_context_enterprise_enabled", "urn:xmpp:whatsapp:account", "840", "Asia/Kuala_Lumpur", "max_participants", "video_remux_after_repair_enabled", "stella_addressbook_restriction_type", "660", "900", "780", "context_menu_ios13_enabled", "mute-state", "ref", "payments_request_messages", "029", "frskmsg", "vcard_max_size_kb", "sample_buffer_gif_player_enabled", "match_last_seen", "510", "4983", "video_max_bitrate", "028", "w:comms:chat", "17", "frequently_forwarded_max", "groups_privacy_blacklist", "Asia/Karachi", "02a", "web_download_document_thumb_mms_enabled", "02b", "hist_sync", "biz_block_reasons_version", "1024", "18", "web_is_direct_connection_for_plm_transparent", "view_once_write", "file_max_size", "paid_convo_id", "online_privacy_setting", "video_max_edge", "view_once_read", "enhanced_storage_management", "multi_scan_pjpeg_encoding_enabled", "ctwa_context_forward_enabled", "video_transcode_downgrade_enable", "template_doc_mime_types", "hq_image_bw_threshold", "30", "body", "u_aud_limit_sil_restarts_ctrl", "other", "participating", "w:biz:directory", "1110", "vp8", "4018", "meta", "doc_detection_image_max_edge", "image_quality", "1170", "02c", "smb_upsell_chat_banner_enabled", "key_expiry_time_second", "pid", "stella_interop_enabled", "19", "linked_device_max_count", "md_device_sync_enabled", "02d", "02e", "360", "enhanced_block_enabled", "ephemeral_icon_in_forwarding", "paid_convo_status", "gif_provider", "project_name", "server-error", "canonical_url_validation_enabled", "wallpapers_v2", "syncd_clear_chat_delete_chat_enabled", "medianotify", "02f", "shops_required_tos_version", "vote", "reset_skey_on_id_change", "030", "image_max_edge", "multicast_limit_global", "ul_bw", "21", "25", "5000", "poll", "570", "22", "031", "1280", "WhatsApp", "032", "bloks_shops_enabled", "50", "upload_host_switching_enabled", "web_ctwa_context_compose_enabled", "ptt_forwarded_features_enabled", "unblocked", "partial_pjpeg_enabled", "fbid:devices", "height", "ephemeral_group_query_ts", "group_join_permissions", "order", "033", "alt_jpeg_status_quality", "migrate", "popular-bank", "win_uwp_deprecation_killswitch_enabled", "web_download_status_thumb_mms_enabled", "blocking", "url_text", "035", "web_forwarding_limit_to_groups", "1600", "val", "1000", "syncd_msg_date_enabled", "bank-ref-id", "max_subject", "payments_web_enabled", "web_upload_document_thumb_mms_enabled", "size", "request", "ephemeral", "24", "receipt_agg", "ptt_remember_play_position", "sampling_weight", "enc_rekey", "mute_always", "037", "034", "23", "036", "action", "click_to_chat_qr_enabled", "width", "disabled", "038", "md_blocklist_v2", "played_self_enabled", "web_buttons_message_enabled", "flow_id", "clear", "450", "fbid:thread", "bloks_session_state", "America/Lima", "attachment_picker_refresh", "download_host_switching_enabled", "1792", "u_aud_limit_sil_restarts_test2", "custom_urls", "device_fanout", "optimistic_upload", "2000", "key_cipher_suite", "web_smb_upsell_in_biz_profile_enabled", "e", "039", "siri_post_status_shortcut", "pair-device", "lg", "lc", "stream_attribution_url", "model", "mspjpeg_phash_gen", "catalog_send_all", "new_multi_vcards_ui", "share_biz_vcard_enabled", "-", "clean", "200", "md_blocklist_v2_server", "03b", "03a", "web_md_migration_experience", "ptt_conversation_waveform", "u_aud_limit_sil_restarts_test1"}}, + {{"64", "ptt_playback_speed_enabled", "web_product_list_message_enabled", "paid_convo_ts", "27", "manufacturer", "psp-routing", "grp_uii_cleanup", "ptt_draft_enabled", "03c", "business_initiated", "web_catalog_products_onoff", "web_upload_link_thumb_mms_enabled", "03e", "mediaretry", "35", "hfm_string_changes", "28", "America/Fortaleza", "max_keys", "md_mhfs_days", "streaming_upload_chunk_size", "5541", "040", "03d", "2675", "03f", "...", "512", "mute", "48", "041", "alt_jpeg_quality", "60", "042", "md_smb_quick_reply", "5183", "c", "1343", "40", "1230", "043", "044", "mms_cat_v1_forward_hot_override_enabled", "user_notice", "ptt_waveform_send", "047", "Asia/Calcutta", "250", "md_privacy_v2", "31", "29", "128", "md_messaging_enabled", "046", "crypto", "690", "045", "enc_iv", "75", "failure", "ptt_oot_playback", "AIzaSyDR5yfaG7OG8sMTUj8kfQEb8T9pN8BM6Lk", "w", "048", "2201", "web_large_files_ui", "Asia/Makassar", "812", "status_collapse_muted", "1334", "257", "2HP4dm", "049", "patches", "1290", "43cY6T", "America/Caracas", "web_sticker_maker", "campaign", "ptt_pausable_enabled", "33", "42", "attestation", "biz", "04b", "query_linked", "s", "125", "04a", "810", "availability", "1411", "responsiveness_v2_m1", "catalog_not_created", "34", "America/Santiago", "1465", "enc_p", "04d", "status_info", "04f", "key_version", "..", "04c", "04e", "md_group_notification", "1598", "1215", "web_cart_enabled", "37", "630", "1920", "2394", "-1", "vcard", "38", "elapsed", "36", "828", "peer", "pricing_category", "1245", "invalid", "stella_ios_enabled", "2687", "45", "1528", "39", "u_is_redial_audio_1104_ctrl", "1025", "1455", "58", "2524", "2603", "054", "bsp_system_message_enabled", "web_pip_redesign", "051", "verify_apps", "1974", "1272", "1322", "1755", "052", "70", "050", "1063", "1135", "1361", "80", "1096", "1828", "1851", "1251", "1921", "key_config_id", "1254", "1566", "1252", "2525", "critical_block", "1669", "max_available", "w:auth:backup:token", "product", "2530", "870", "1022", "participant_uuid", "web_cart_on_off", "1255", "1432", "1867", "41", "1415", "1440", "240", "1204", "1608", "1690", "1846", "1483", "1687", "1749", "69", "url_number", "053", "1325", "1040", "365", "59", "Asia/Riyadh", "1177", "test_recommended", "057", "1612", "43", "1061", "1518", "1635", "055", "1034", "1375", "750", "1430", "event_code", "1682", "503", "55", "865", "78", "1309", "1365", "44", "America/Guayaquil", "535", "LIMITED", "1377", "1613", "1420", "1599", "1822", "05a", "1681", "password", "1111", "1214", "1376", "1478", "47", "1082", "4282", "Europe/Istanbul", "1307", "46", "058", "1124", "256", "rate-overlimit", "retail", "u_a_socket_err_fix_succ_test", "1292", "1370", "1388", "520", "861", "psa", "regular", "1181", "1766", "05b", "1183", "1213", "1304", "1537"}}, + {{"1724", "profile_picture", "1071", "1314", "1605", "407", "990", "1710", "746", "pricing_model", "056", "059", "061", "1119", "6027", "65", "877", "1607", "05d", "917", "seen", "1516", "49", "470", "973", "1037", "1350", "1394", "1480", "1796", "keys", "794", "1536", "1594", "2378", "1333", "1524", "1825", "116", "309", "52", "808", "827", "909", "495", "1660", "361", "957", "google", "1357", "1565", "1967", "996", "1775", "586", "736", "1052", "1670", "bank", "177", "1416", "2194", "2222", "1454", "1839", "1275", "53", "997", "1629", "6028", "smba", "1378", "1410", "05c", "1849", "727", "create", "1559", "536", "1106", "1310", "1944", "670", "1297", "1316", "1762", "en", "1148", "1295", "1551", "1853", "1890", "1208", "1784", "7200", "05f", "178", "1283", "1332", "381", "643", "1056", "1238", "2024", "2387", "179", "981", "1547", "1705", "05e", "290", "903", "1069", "1285", "2436", "062", "251", "560", "582", "719", "56", "1700", "2321", "325", "448", "613", "777", "791", "51", "488", "902", "Asia/Almaty", "is_hidden", "1398", "1527", "1893", "1999", "2367", "2642", "237", "busy", "065", "067", "233", "590", "993", "1511", "54", "723", "860", "363", "487", "522", "605", "995", "1321", "1691", "1865", "2447", "2462", "NON_TRANSACTIONAL", "433", "871", "432", "1004", "1207", "2032", "2050", "2379", "2446", "279", "636", "703", "904", "248", "370", "691", "700", "1068", "1655", "2334", "060", "063", "364", "533", "534", "567", "1191", "1210", "1473", "1827", "069", "701", "2531", "514", "prev_dhash", "064", "496", "790", "1046", "1139", "1505", "1521", "1108", "207", "544", "637", "final", "1173", "1293", "1694", "1939", "1951", "1993", "2353", "2515", "504", "601", "857", "modify", "spam_request", "p_121_aa_1101_test4", "866", "1427", "1502", "1638", "1744", "2153", "068", "382", "725", "1704", "1864", "1990", "2003", "Asia/Dubai", "508", "531", "1387", "1474", "1632", "2307", "2386", "819", "2014", "066", "387", "1468", "1706", "2186", "2261", "471", "728", "1147", "1372", "1961"}}, +}}; +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_wizard.cpp b/taicpp/src/whatsapp/wa_wizard.cpp new file mode 100644 index 0000000..4baccf6 --- /dev/null +++ b/taicpp/src/whatsapp/wa_wizard.cpp @@ -0,0 +1,97 @@ +#include "wa_wizard.h" + +#include +#include +#include + +#include "wa_client.h" +#include "wa_consts.h" +#include "wa_qr.h" +#include "wa_store.h" + +namespace detz::wa { + +namespace { +std::atomic g_interrupt{false}; +void on_sigint(int) { g_interrupt.store(true); } +} // namespace + +int WaWizard::link(const std::string& home, const std::string& profile, std::ostream& out) { + WaStore store(home, profile); + if (store.has_device()) { + auto d = store.load_device(); + out << "Already linked as " << (d && d->jid ? *d->jid : "?") << ".\n"; + out << "Run with --whatsapp-unlink first to link a different phone.\n"; + return 2; + } + + WaClient client(store); + bool linked = false; + std::string linked_jid; + client.on_log = [&](const std::string& s) { out << " " << s << "\n"; }; + client.on_qr = [&](const std::vector& codes) { + if (codes.empty()) return; + out << "\nScan this in WhatsApp on your phone:\n"; + out << " Settings -> Linked Devices -> Link a Device\n\n"; + out << WaQr::render(codes.front()) << "\n"; + out << "(the code refreshes automatically; keep this window open)\n\n"; + }; + client.on_paired = [&](const std::string& jid) { + linked = true; + linked_jid = jid; + }; + + out << "Connecting to WhatsApp...\n"; + if (!client.connect()) { + out << "Could not connect to WhatsApp. Check your internet connection and try again.\n"; + return 1; + } + + auto prev = std::signal(SIGINT, on_sigint); + g_interrupt.store(false); + client.run_until([&]() { return linked || g_interrupt.load(); }, WaConsts::kWaPairTimeout); + std::signal(SIGINT, prev); + + if (g_interrupt.load() && !linked) { + out << "\nCancelled.\n"; + return 1; + } + if (!linked) { + out << "\nTimed out waiting for the phone to scan the code. Try again.\n"; + return 1; + } + // The server drops the socket right after pairing; reconnect to log in and + // confirm the saved identity works. + client.disconnect(); + out << "\nLinked as " << linked_jid << ". Logging in to confirm...\n"; + if (client.connect()) { + client.run_until([&]() { return client.logged_in(); }, 20); + } + out << (client.logged_in() ? "WhatsApp is linked and ready.\n" + : "Linked, but the login confirmation did not complete; it should work on next use.\n"); + return 0; +} + +int WaWizard::unlink(const std::string& home, const std::string& profile, std::ostream& out) { + std::string path = WaStore::db_path(home, profile); + std::error_code ec; + if (std::filesystem::remove(path, ec)) { + out << "WhatsApp unlinked for profile '" << (profile.empty() ? "default" : profile) << "'.\n"; + return 0; + } + out << "No WhatsApp link found for this profile.\n"; + return 1; +} + +int WaWizard::status(const std::string& home, const std::string& profile, std::ostream& out) { + WaStore store(home, profile); + auto d = store.load_device(); + if (d && d->paired()) { + out << "WhatsApp: linked as " << *d->jid << "\n"; + return 0; + } + out << "WhatsApp: not linked (run --whatsapp-link)\n"; + return 1; +} + +} // namespace detz::wa diff --git a/taicpp/src/whatsapp/wa_wizard.h b/taicpp/src/whatsapp/wa_wizard.h new file mode 100644 index 0000000..e7d7d9e --- /dev/null +++ b/taicpp/src/whatsapp/wa_wizard.h @@ -0,0 +1,22 @@ +#pragma once +// WaWizard: the `--whatsapp-link` terminal wizard. Connects to WhatsApp, shows +// a scannable QR code, and waits for the phone to link the device, then saves +// the paired identity to the vault. User-friendly and automatable (exit code 0 +// on link, non-zero otherwise). See docs/whatsapp.md. +#include +#include + +namespace detz::wa { + +class WaWizard { + public: + // Run the link flow for the given profile. Prints progress and the QR to out. + // Returns a process exit code: 0 linked, 1 failed/timed out, 2 already linked. + static int link(const std::string& home, const std::string& profile, std::ostream& out); + // Unlink: delete the stored device for the profile. 0 on success. + static int unlink(const std::string& home, const std::string& profile, std::ostream& out); + // Print the current link status. 0 if linked, 1 if not. + static int status(const std::string& home, const std::string& profile, std::ostream& out); +}; + +} // namespace detz::wa diff --git a/taicpp/tests/agent_diff.cpp b/taicpp/tests/agent_diff.cpp index 9e5e311..8637cb5 100644 --- a/taicpp/tests/agent_diff.cpp +++ b/taicpp/tests/agent_diff.cpp @@ -4,6 +4,7 @@ #include "../src/agent/agent.h" #include "../src/agent/text.h" #include "../src/agent/data.h" +#include "../src/agent/detz_tools.h" #include "../src/llm/chat_client.h" #include "../src/llm/cli_backends.h" #include "../src/llm/http_transport.h" @@ -326,6 +327,7 @@ std::map registry() { } // namespace int main() { + agent::DetzTools::set_enabled(false); // compare the tai.py tool set only auto reg = registry(); std::string line; while (std::getline(std::cin, line)) { diff --git a/taicpp/tests/agent_e2e.cpp b/taicpp/tests/agent_e2e.cpp index f181d23..19f12e8 100644 --- a/taicpp/tests/agent_e2e.cpp +++ b/taicpp/tests/agent_e2e.cpp @@ -3,6 +3,7 @@ // the observable outcome as JSON. tests/agent_e2e.py runs the same scenario // through tai.py and compares. #include "../src/agent/agent.h" +#include "../src/agent/detz_tools.h" #include "../src/llm/http_transport.h" #include "../src/llm/py.h" #include "agent_memstore.h" @@ -153,6 +154,7 @@ std::string slurp(const std::string& path) { } // namespace int main(int argc, char** argv) { + agent::DetzTools::set_enabled(false); // compare the tai.py tool set only if (argc < 3) { std::fprintf(stderr, "usage: agent_e2e scenario.json workdir\n"); return 2; } Value sc = Value::loads(slurp(argv[1])); std::string workdir = argv[2]; diff --git a/taicpp/tests/misc_data/chunk_cases.json b/taicpp/tests/misc_data/chunk_cases.json new file mode 100644 index 0000000..875ba7c --- /dev/null +++ b/taicpp/tests/misc_data/chunk_cases.json @@ -0,0 +1,806 @@ +[ +{ +"text": "", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "one line", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "a\nb\nc", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "a\n\nb\n\n\nc", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "\n\n\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": " \n ", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "trail\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "\nlead", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "a\r\nb\rc\u000bd\fe\u001cf\u001dg\u001eh\u0085i\u2028j\u2029k", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "line 0\nline 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8\nline 9\nline 10\nline 11\nline 12\nline 13\nline 14\nline 15\nline 16\nline 17\nline 18\nline 19\nline 20\nline 21\nline 22\nline 23\nline 24\nline 25\nline 26\nline 27\nline 28\nline 29\nline 30\nline 31\nline 32\nline 33\nline 34\nline 35\nline 36\nline 37\nline 38\nline 39\nline 40\nline 41\nline 42\nline 43\nline 44\nline 45\nline 46\nline 47\nline 48\nline 49\nline 50\nline 51\nline 52\nline 53\nline 54\nline 55\nline 56\nline 57\nline 58\nline 59\nline 60\nline 61\nline 62\nline 63\nline 64\nline 65\nline 66\nline 67\nline 68\nline 69\nline 70\nline 71\nline 72\nline 73\nline 74\nline 75\nline 76\nline 77\nline 78\nline 79\nline 80\nline 81\nline 82\nline 83\nline 84\nline 85\nline 86\nline 87\nline 88\nline 89\nline 90\nline 91\nline 92\nline 93\nline 94\nline 95\nline 96\nline 97\nline 98\nline 99\nline 100\nline 101\nline 102\nline 103\nline 104\nline 105\nline 106\nline 107\nline 108\nline 109\nline 110\nline 111\nline 112\nline 113\nline 114\nline 115\nline 116\nline 117\nline 118\nline 119\nline 120\nline 121\nline 122\nline 123\nline 124\nline 125\nline 126\nline 127\nline 128\nline 129\nline 130\nline 131\nline 132\nline 133\nline 134\nline 135\nline 136\nline 137\nline 138\nline 139\nline 140\nline 141\nline 142\nline 143\nline 144\nline 145\nline 146\nline 147\nline 148\nline 149\nline 150\nline 151\nline 152\nline 153\nline 154\nline 155\nline 156\nline 157\nline 158\nline 159\nline 160\nline 161\nline 162\nline 163\nline 164\nline 165\nline 166\nline 167\nline 168\nline 169\nline 170\nline 171\nline 172\nline 173\nline 174\nline 175\nline 176\nline 177\nline 178\nline 179\nline 180\nline 181\nline 182\nline 183\nline 184\nline 185\nline 186\nline 187\nline 188\nline 189\nline 190\nline 191\nline 192\nline 193\nline 194\nline 195\nline 196\nline 197\nline 198\nline 199", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\u00e9\nnext", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "same\nsame\nsame\nsame\nsame\nsame\nsame\nsame\nsame\nsame\nsame\nsame", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "a\nb\nb\nb\nc\nc\nd", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "p\np\np\nq\nq\nq\nq\nr", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "same\nsame\nsame", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "same\nsame\nother\nsame\nsame\nsame", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "one line", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "one line", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "one line", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "a\nb\nc", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "a\nb\nc", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "a\nb\nc", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "a\n\nb\n\n\nc", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "a\n\nb\n\n\nc", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "a\n\nb\n\n\nc", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "\n\n\n", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "\n\n\n", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "\n\n\n", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": " \n ", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": " \n ", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": " \n ", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "trail\n", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "trail\n", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "trail\n", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "\nlead", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "\nlead", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "\nlead", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "a\r\nb\rc\u000bd\fe\u001cf\u001dg\u001eh\u0085i\u2028j\u2029k", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "a\r\nb\rc\u000bd\fe\u001cf\u001dg\u001eh\u0085i\u2028j\u2029k", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "a\r\nb\rc\u000bd\fe\u001cf\u001dg\u001eh\u0085i\u2028j\u2029k", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "line 0\nline 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8\nline 9\nline 10\nline 11\nline 12\nline 13\nline 14\nline 15\nline 16\nline 17\nline 18\nline 19\nline 20\nline 21\nline 22\nline 23\nline 24\nline 25\nline 26\nline 27\nline 28\nline 29\nline 30\nline 31\nline 32\nline 33\nline 34\nline 35\nline 36\nline 37\nline 38\nline 39\nline 40\nline 41\nline 42\nline 43\nline 44\nline 45\nline 46\nline 47\nline 48\nline 49\nline 50\nline 51\nline 52\nline 53\nline 54\nline 55\nline 56\nline 57\nline 58\nline 59\nline 60\nline 61\nline 62\nline 63\nline 64\nline 65\nline 66\nline 67\nline 68\nline 69\nline 70\nline 71\nline 72\nline 73\nline 74\nline 75\nline 76\nline 77\nline 78\nline 79\nline 80\nline 81\nline 82\nline 83\nline 84\nline 85\nline 86\nline 87\nline 88\nline 89\nline 90\nline 91\nline 92\nline 93\nline 94\nline 95\nline 96\nline 97\nline 98\nline 99\nline 100\nline 101\nline 102\nline 103\nline 104\nline 105\nline 106\nline 107\nline 108\nline 109\nline 110\nline 111\nline 112\nline 113\nline 114\nline 115\nline 116\nline 117\nline 118\nline 119\nline 120\nline 121\nline 122\nline 123\nline 124\nline 125\nline 126\nline 127\nline 128\nline 129\nline 130\nline 131\nline 132\nline 133\nline 134\nline 135\nline 136\nline 137\nline 138\nline 139\nline 140\nline 141\nline 142\nline 143\nline 144\nline 145\nline 146\nline 147\nline 148\nline 149\nline 150\nline 151\nline 152\nline 153\nline 154\nline 155\nline 156\nline 157\nline 158\nline 159\nline 160\nline 161\nline 162\nline 163\nline 164\nline 165\nline 166\nline 167\nline 168\nline 169\nline 170\nline 171\nline 172\nline 173\nline 174\nline 175\nline 176\nline 177\nline 178\nline 179\nline 180\nline 181\nline 182\nline 183\nline 184\nline 185\nline 186\nline 187\nline 188\nline 189\nline 190\nline 191\nline 192\nline 193\nline 194\nline 195\nline 196\nline 197\nline 198\nline 199", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "line 0\nline 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8\nline 9\nline 10\nline 11\nline 12\nline 13\nline 14\nline 15\nline 16\nline 17\nline 18\nline 19\nline 20\nline 21\nline 22\nline 23\nline 24\nline 25\nline 26\nline 27\nline 28\nline 29\nline 30\nline 31\nline 32\nline 33\nline 34\nline 35\nline 36\nline 37\nline 38\nline 39\nline 40\nline 41\nline 42\nline 43\nline 44\nline 45\nline 46\nline 47\nline 48\nline 49\nline 50\nline 51\nline 52\nline 53\nline 54\nline 55\nline 56\nline 57\nline 58\nline 59\nline 60\nline 61\nline 62\nline 63\nline 64\nline 65\nline 66\nline 67\nline 68\nline 69\nline 70\nline 71\nline 72\nline 73\nline 74\nline 75\nline 76\nline 77\nline 78\nline 79\nline 80\nline 81\nline 82\nline 83\nline 84\nline 85\nline 86\nline 87\nline 88\nline 89\nline 90\nline 91\nline 92\nline 93\nline 94\nline 95\nline 96\nline 97\nline 98\nline 99\nline 100\nline 101\nline 102\nline 103\nline 104\nline 105\nline 106\nline 107\nline 108\nline 109\nline 110\nline 111\nline 112\nline 113\nline 114\nline 115\nline 116\nline 117\nline 118\nline 119\nline 120\nline 121\nline 122\nline 123\nline 124\nline 125\nline 126\nline 127\nline 128\nline 129\nline 130\nline 131\nline 132\nline 133\nline 134\nline 135\nline 136\nline 137\nline 138\nline 139\nline 140\nline 141\nline 142\nline 143\nline 144\nline 145\nline 146\nline 147\nline 148\nline 149\nline 150\nline 151\nline 152\nline 153\nline 154\nline 155\nline 156\nline 157\nline 158\nline 159\nline 160\nline 161\nline 162\nline 163\nline 164\nline 165\nline 166\nline 167\nline 168\nline 169\nline 170\nline 171\nline 172\nline 173\nline 174\nline 175\nline 176\nline 177\nline 178\nline 179\nline 180\nline 181\nline 182\nline 183\nline 184\nline 185\nline 186\nline 187\nline 188\nline 189\nline 190\nline 191\nline 192\nline 193\nline 194\nline 195\nline 196\nline 197\nline 198\nline 199", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "line 0\nline 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8\nline 9\nline 10\nline 11\nline 12\nline 13\nline 14\nline 15\nline 16\nline 17\nline 18\nline 19\nline 20\nline 21\nline 22\nline 23\nline 24\nline 25\nline 26\nline 27\nline 28\nline 29\nline 30\nline 31\nline 32\nline 33\nline 34\nline 35\nline 36\nline 37\nline 38\nline 39\nline 40\nline 41\nline 42\nline 43\nline 44\nline 45\nline 46\nline 47\nline 48\nline 49\nline 50\nline 51\nline 52\nline 53\nline 54\nline 55\nline 56\nline 57\nline 58\nline 59\nline 60\nline 61\nline 62\nline 63\nline 64\nline 65\nline 66\nline 67\nline 68\nline 69\nline 70\nline 71\nline 72\nline 73\nline 74\nline 75\nline 76\nline 77\nline 78\nline 79\nline 80\nline 81\nline 82\nline 83\nline 84\nline 85\nline 86\nline 87\nline 88\nline 89\nline 90\nline 91\nline 92\nline 93\nline 94\nline 95\nline 96\nline 97\nline 98\nline 99\nline 100\nline 101\nline 102\nline 103\nline 104\nline 105\nline 106\nline 107\nline 108\nline 109\nline 110\nline 111\nline 112\nline 113\nline 114\nline 115\nline 116\nline 117\nline 118\nline 119\nline 120\nline 121\nline 122\nline 123\nline 124\nline 125\nline 126\nline 127\nline 128\nline 129\nline 130\nline 131\nline 132\nline 133\nline 134\nline 135\nline 136\nline 137\nline 138\nline 139\nline 140\nline 141\nline 142\nline 143\nline 144\nline 145\nline 146\nline 147\nline 148\nline 149\nline 150\nline 151\nline 152\nline 153\nline 154\nline 155\nline 156\nline 157\nline 158\nline 159\nline 160\nline 161\nline 162\nline 163\nline 164\nline 165\nline 166\nline 167\nline 168\nline 169\nline 170\nline 171\nline 172\nline 173\nline 174\nline 175\nline 176\nline 177\nline 178\nline 179\nline 180\nline 181\nline 182\nline 183\nline 184\nline 185\nline 186\nline 187\nline 188\nline 189\nline 190\nline 191\nline 192\nline 193\nline 194\nline 195\nline 196\nline 197\nline 198\nline 199", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", +"max_lines": 5, +"overlap": 2, +"max_chars": 40 +}, +{ +"text": "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", +"max_lines": 3, +"overlap": 0, +"max_chars": 10 +}, +{ +"text": "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", +"max_lines": 4, +"overlap": 9, +"max_chars": 100 +}, +{ +"text": " delta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\n\t\ngamma gamma alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 x x\u001e\t alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta alpha epsilon na\u00efve\n\u20ac alpha alpha\nna\u00efve \ud83d\ude00 \u20ac\u001cgamma \u20ac \u20ac\n\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nna\u00efve caf\u00e9 \ud83d\ude00 \t\u0085alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta beta\u2028\n\ud83d\ude00 caf\u00e9 na\u00efve delta\fna\u00efve beta gamma alpha x delta \n caf\u00e9 \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\n\u20ac\n\ud83d\ude00 \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta x delta caf\u00e9 delta alpha\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha gamma gamma \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n delta na\u00efve \u20ac \n\u20ac delta delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \ud83d\ude00 gamma\n\t caf\u00e9 epsilon gamma caf\u00e9 delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\t caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon na\u00efve na\u00efve delta caf\u00e9 beta \u20ac na\u00efve \t \n\u2028delta gamma epsilon \t \ud83d\ude00 alpha x\nbeta beta \t alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve delta na\u00efve alpha\u001egamma\u2029delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta \u20ac beta \ud83d\ude00 \ud83d\ude00 epsilon gamma alpha\u2029\nna\u00efve x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac na\u00efve \t\nalpha na\u00efve alpha alpha \t na\u00efve\ngamma \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ncaf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon epsilon \u20ac x na\u00efve\nepsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac \u20ac \u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 gamma \ngamma\nalpha beta \t x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve caf\u00e9 \t x\r epsilon delta \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t x caf\u00e9 x epsilon beta alpha na\u00efve x x beta\n\ud83d\ude00 alpha\u001dcaf\u00e9 \ud83d\ude00 epsilon na\u00efve alpha gamma \nalpha beta\u001egamma epsilon \u20ac gamma caf\u00e9 beta x alpha caf\u00e9\nalpha gamma delta caf\u00e9 epsilon delta x caf\u00e9 epsilon delta\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x gamma na\u00efve beta caf\u00e9 \u20ac \n\t delta beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta alpha \ud83d\ude00 caf\u00e9 epsilon\ncaf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t beta beta caf\u00e9 alpha \t \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\u001ena\u00efve \t \u20ac \t beta \u20ac\u001dna\u00efve \t caf\u00e9 x \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x\nna\u00efve caf\u00e9 alpha na\u00efve na\u00efve\n epsilon\f alpha alpha alpha epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha\nepsilon na\u00efve caf\u00e9\n\ud83d\ude00 delta na\u00efve delta x\ncaf\u00e9 beta epsilon \u20ac gamma \ud83d\ude00 gamma gamma\r\nepsilon\n \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t delta epsilon x na\u00efve \u20ac\n\u20ac \ud83d\ude00 \u20ac \u20ac na\u00efve na\u00efve caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha x beta caf\u00e9 gamma\u001ex gamma epsilon epsilon alpha \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\ndelta gamma gamma alpha delta\u000bgamma alpha \u20ac delta caf\u00e9 caf\u00e9 \u20ac \u20ac \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r \t\n caf\u00e9 \ud83d\ude00 \ud83d\ude00 x caf\u00e9 na\u00efve\n\t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve caf\u00e9\nx alpha beta \ud83d\ude00\nbeta \ud83d\ude00 \u20ac x delta\falpha x \t beta caf\u00e9 gamma gamma na\u00efve gamma\u0085na\u00efve \t x \ud83d\ude00\n caf\u00e9 epsilon epsilon\n delta \ud83d\ude00 gamma delta \u20ac gamma \u20ac \n\n caf\u00e9\n\u001d\ud83d\ude00 gamma na\u00efve \ud83d\ude00 \t na\u00efve alpha \t\n\nepsilon \ud83d\ude00 epsilon \t gamma \nalpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\t \u20ac delta \t \ud83d\ude00 alpha caf\u00e9 epsilon delta alpha na\u00efve\ncaf\u00e9 epsilon delta epsilon x alpha na\u00efve caf\u00e9\nna\u00efve beta beta \u20ac na\u00efve \t na\u00efve\n\u20ac epsilon beta x na\u00efve x x delta na\u00efve \ud83d\ude00 caf\u00e9\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ngamma gamma x \t alpha gamma\r\nepsilon \u20ac \ud83d\ude00 alpha delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha gamma alpha \u001c\r\n \t\u001d \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta epsilon caf\u00e9 \u20ac\n\n\u20ac caf\u00e9 \t gamma caf\u00e9 beta \ud83d\ude00 caf\u00e9 gamma beta\n \u20ac \t x \t\u0085\nna\u00efve \u20ac\u2028\u20ac gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx beta \u20ac \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fx \u20ac \u20ac \t na\u00efve \ud83d\ude00 na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve x \t delta beta\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac x x\n epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon \u20ac \u20ac delta\nbeta alpha alpha epsilon \r\n", +"max_lines": 7, +"overlap": 0, +"max_chars": 120 +}, +{ +"text": "beta gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac\ncaf\u00e9 caf\u00e9 epsilon alpha \u20ac \t \u20ac \ud83d\ude00\ndelta \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\u000bcaf\u00e9 na\u00efve beta x\nbeta x \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta epsilon\ndelta x gamma beta x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta\n\ud83d\ude00 caf\u00e9 na\u00efve delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta na\u00efve caf\u00e9 x alpha \u20ac na\u00efve gamma delta\n", +"max_lines": 60, +"overlap": 0, +"max_chars": 4000 +}, +{ +"text": "x \t epsilon caf\u00e9 \u20ac\n\ud83d\ude00 alpha caf\u00e9 \u20ac\u0085na\u00efve x \t \ud83d\ude00 \u20ac \u20ac \nepsilon caf\u00e9 \ud83d\ude00 \nbeta epsilon alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon na\u00efve\fbeta \ud83d\ude00 \u20ac \t beta \ud83d\ude00\u000b\n\ud83d\ude00 caf\u00e9 na\u00efve epsilon na\u00efve \ud83d\ude00 beta \u20ac x x\r\ngamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 na\u00efve\u2029delta \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 \ud83d\ude00\nepsilon \u20ac \ud83d\ude00 \ud83d\ude00 epsilon epsilon delta gamma\r\n\n\u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085x\nna\u00efve\n na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 \ud83d\ude00 x\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta alpha\n\nx delta delta x\nbeta caf\u00e9 \t na\u00efve x \u20ac \t\u2029\ud83d\ude00 na\u00efve caf\u00e9 na\u00efve\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon x x\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta\u000b\ud83d\ude00 beta epsilon x\ndelta beta \nna\u00efve x alpha caf\u00e9 na\u00efve x \n\nna\u00efve x\ngamma\u000bdelta alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac delta alpha beta gamma delta x gamma \ncaf\u00e9 na\u00efve \t epsilon\u0085\nalpha na\u00efve caf\u00e9 caf\u00e9 na\u00efve delta delta \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\n\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 alpha gamma gamma\u2028alpha caf\u00e9 na\u00efve\nalpha epsilon\nx na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 x na\u00efve \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve \t epsilon \u20ac x na\u00efve \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac caf\u00e9 \t gamma na\u00efve\u2028caf\u00e9 epsilon \u20ac gamma\n\ncaf\u00e9 caf\u00e9 x gamma x gamma epsilon \ud83d\ude00 x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t alpha\u2028gamma \t \ud83d\ude00 na\u00efve na\u00efve \t alpha delta\n\u20ac delta gamma epsilon alpha x \t \u20ac\ncaf\u00e9 alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta caf\u00e9 na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\nalpha \u20ac \ud83d\ude00 x alpha epsilon x delta alpha delta\n\ud83d\ude00 beta gamma caf\u00e9 \ud83d\ude00\n\ud83d\ude00 gamma \u20ac x\nna\u00efve alpha \u20ac gamma delta epsilon gamma beta\nbeta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta gamma beta gamma na\u00efve epsilon\u2028\t \ud83d\ude00\fcaf\u00e9 caf\u00e9\nna\u00efve alpha\nx x delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 \u20ac caf\u00e9 \t \ngamma gamma delta \nna\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon\n\nalpha delta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n\ud83d\ude00 alpha gamma caf\u00e9 \ud83d\ude00 gamma x\n\ncaf\u00e9 x na\u00efve\nbeta \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\ud83d\ude00\nx\rcaf\u00e9 na\u00efve \u20ac \u20ac \u20ac \u20ac alpha gamma na\u00efve \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma na\u00efve beta x x \ud83d\ude00\ngamma alpha\u0085epsilon caf\u00e9 beta na\u00efve \t caf\u00e9 \ud83d\ude00 \ud83d\ude00 alpha \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta na\u00efve caf\u00e9\rgamma x gamma caf\u00e9 x delta epsilon delta \u20ac \n x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \nbeta x beta x alpha gamma \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00\u2029\n\t gamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma na\u00efve \t \t \u20ac \t\u001dalpha gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\r\t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma na\u00efve\nna\u00efve na\u00efve\nalpha\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nbeta alpha gamma\ndelta na\u00efve caf\u00e9 \ud83d\ude00 x \ud83d\ude00\n\ud83d\ude00 beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t\r\u20ac alpha \t gamma\n\u2028x \t beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t caf\u00e9 \u20ac \u20ac\nx \u20ac epsilon epsilon alpha \u20ac\nna\u00efve x beta x na\u00efve alpha beta \nepsilon \ud83d\ude00 beta epsilon \ud83d\ude00 epsilon\u001d alpha caf\u00e9 na\u00efve na\u00efve epsilon beta\n\ud83d\ude00 \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha\rdelta x x beta na\u00efve na\u00efve beta delta gamma\nbeta \t beta delta beta\r\nna\u00efve \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta delta x alpha delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon delta \u20ac\n x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve \ud83d\ude00\n\t alpha \u0085x delta\n \u20ac na\u00efve \u20ac na\u00efve delta caf\u00e9 x \ud83d\ude00\n", +"max_lines": 13, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon na\u00efve delta\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta \t \ud83d\ude00 x na\u00efve caf\u00e9\n\t \t\ndelta \t \ud83d\ude00 na\u00efve delta alpha\n\ud83d\ude00 \u20ac caf\u00e9 \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta \ud83d\ude00 gamma alpha\nx x x\nalpha x x na\u00efve alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t caf\u00e9\nbeta na\u00efve na\u00efve \n \t na\u00efve epsilon\n\t gamma x\nbeta delta na\u00efve delta x caf\u00e9 na\u00efve beta\nalpha caf\u00e9 beta alpha \t caf\u00e9 na\u00efve x delta\nepsilon\u001ex\f\u20ac \ud83d\ude00 gamma epsilon caf\u00e9\nx\n\ud83d\ude00 gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\n \t epsilon\u0085delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x gamma\rna\u00efve delta x gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon \ud83d\ude00\nx \ud83d\ude00 \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\rna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n gamma x gamma na\u00efve gamma\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00\u2028alpha delta gamma\n\t delta alpha x caf\u00e9 epsilon beta \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001eepsilon delta epsilon x \u20ac\u001cepsilon na\u00efve caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fna\u00efve \t epsilon gamma \u20ac \u20ac x\nna\u00efve na\u00efve gamma \ud83d\ude00 \u20ac\u0085alpha x x caf\u00e9 epsilon alpha epsilon beta\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x beta beta alpha\u2028alpha \u20ac beta epsilon gamma x\n epsilon beta na\u00efve na\u00efve na\u00efve\n epsilon beta na\u00efve na\u00efve epsilon \u20ac \nx \ud83d\ude00 \t delta gamma \u20ac x x\n\ud83d\ude00 \t epsilon caf\u00e9 caf\u00e9 \u20ac delta gamma\u2029alpha epsilon epsilon delta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ncaf\u00e9 alpha epsilon \t epsilon caf\u00e9 delta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma \u20ac na\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\fgamma\n\nalpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\u001eepsilon \ud83d\ude00 x epsilon caf\u00e9 \u20ac gamma \u2029x na\u00efve na\u00efve na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\u20ac epsilon \u20ac epsilon delta beta alpha gamma \ud83d\ude00\n\nx beta alpha\nna\u00efve caf\u00e9 caf\u00e9 \n\ncaf\u00e9 x caf\u00e9\n caf\u00e9 caf\u00e9\u001e\n\u20ac gamma beta epsilon beta gamma epsilon gamma alpha \ncaf\u00e9 delta epsilon beta\n\u20ac beta caf\u00e9 beta \u001e", +"max_lines": 2, +"overlap": 0, +"max_chars": 17 +}, +{ +"text": "\r\n\t delta\ngamma caf\u00e9 epsilon \u20ac\ngamma alpha epsilon delta na\u00efve\r\ndelta \u001e\u001c\f\u20ac epsilon \ud83d\ude00 gamma alpha \u20ac \ud83d\ude00 na\u00efve\nalpha \ud83d\ude00 alpha x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 \u20ac \ud83d\ude00\n\ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9\r\ncaf\u00e9 \t\n\u20ac alpha beta \ud83d\ude00 \ud83d\ude00 alpha epsilon caf\u00e9 \u20ac \u20ac\nna\u00efve \t x epsilon \ud83d\ude00 x delta na\u00efve caf\u00e9\nepsilon caf\u00e9 delta \u20ac \u20ac \u20ac \t\nx x delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t beta epsilon\r alpha \n\u20ac delta caf\u00e9\n\t \t caf\u00e9 \ud83d\ude00 caf\u00e9\nbeta\n\u20ac na\u00efve alpha epsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\r\u20ac x delta \t epsilon \u20ac gamma delta delta alpha\ncaf\u00e9 \ngamma x \t \t \t beta\u001depsilon \ud83d\ude00 beta\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t \u20ac\n\ud83d\ude00 \t x alpha \t \ud83d\ude00\nx \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\u001cna\u00efve\nalpha x x x x \ud83d\ude00 na\u00efve gamma\u2028epsilon \ud83d\ude00 x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 delta alpha \u20ac\n\n\n\t x \t\n\ud83d\ude00 \ud83d\ude00 caf\u00e9 \ud83d\ude00 caf\u00e9\nbeta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve\n\u20ac delta alpha \u20ac beta caf\u00e9 \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001c \ud83d\ude00 gamma gamma delta caf\u00e9 na\u00efve \ud83d\ude00 caf\u00e9 \n\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta na\u00efve na\u00efve beta x epsilon \t epsilon \ud83d\ude00 beta \ud83d\ude00 \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \ud83d\ude00 \u20ac beta na\u00efve delta alpha beta alpha beta \t gamma\ndelta\nbeta beta delta\n\t\nna\u00efve\u2028 x beta caf\u00e9 \t na\u00efve gamma \ud83d\ude00\nbeta \u20ac delta delta x gamma na\u00efve \nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve alpha caf\u00e9\nalpha \ud83d\ude00 beta epsilon \t beta na\u00efve x delta \t caf\u00e9\n\t \u20ac \u20ac\n\t \t \u20ac delta delta \t x\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon caf\u00e9 \ud83d\ude00 alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac beta\n\u20ac na\u00efve delta beta na\u00efve beta na\u00efve na\u00efve \u20ac\ncaf\u00e9 beta alpha gamma delta alpha na\u00efve alpha \ud83d\ude00\nbeta caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon delta \t \ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n \rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t \ud83d\ude00 epsilon \nbeta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha caf\u00e9 \ud83d\ude00\n\n\u20ac \ud83d\ude00 gamma delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nna\u00efve \t na\u00efve delta delta\ndelta caf\u00e9 \ud83d\ude00 beta \t caf\u00e9 \t gamma \ud83d\ude00 x\ncaf\u00e9 gamma \ud83d\ude00 na\u00efve x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\fdelta gamma gamma gamma epsilon x delta beta x\n\nepsilon na\u00efve \u20ac\u001c\t na\u00efve\ndelta delta epsilon \t\nalpha beta alpha \u20ac \t \t beta\n na\u00efve beta\ncaf\u00e9 epsilon gamma gamma \u20ac\n \ud83d\ude00 alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 beta \ngamma \t \t delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \n\u20ac x \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028\u20ac epsilon \t \u20ac delta x gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ncaf\u00e9 epsilon \u20ac caf\u00e9 delta \ud83d\ude00\ngamma \t delta caf\u00e9 \u20ac\nx \u001ddelta na\u00efve beta caf\u00e9 alpha x\n\u001d\ud83d\ude00\ngamma \ud83d\ude00 x alpha \t caf\u00e9\fbeta gamma gamma delta \t delta \t x gamma\n", +"max_lines": 13, +"overlap": 0, +"max_chars": 17 +}, +{ +"text": "caf\u00e9 epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t\u001e\t \ud83d\ude00 delta delta\ndelta \t\u000bdelta delta alpha \u20ac \t x x alpha\u001ex \ud83d\ude00 epsilon \u20ac \t\u0085 \t x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta beta x\u001e\nna\u00efve gamma caf\u00e9 caf\u00e9\u001d gamma beta alpha delta beta na\u00efve \ud83d\ude00\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nna\u00efve alpha gamma x beta epsilon delta \ud83d\ude00 alpha \t\n\u20ac alpha \ud83d\ude00 beta\nalpha \u20ac epsilon \t epsilon\u000bcaf\u00e9\u001calpha \u2029\ud83d\ude00\n caf\u00e9 beta caf\u00e9 alpha \nalpha caf\u00e9 beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t \t gamma \ud83d\ude00 alpha \ud83d\ude00 \ud83d\ude00 beta\nepsilon beta na\u00efve \u20ac x \u20ac x \u20ac na\u00efve\n\n\n caf\u00e9 \ud83d\ude00 \u20ac epsilon\r\nx delta epsilon alpha caf\u00e9 beta \ngamma x alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n x gamma caf\u00e9 caf\u00e9 \t \t epsilon caf\u00e9\u001d\u20ac x epsilon gamma beta\nbeta\u001d \t \t \ud83d\ude00 caf\u00e9\r\n alpha alpha \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma \ud83d\ude00 caf\u00e9 \u20ac x\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon na\u00efve\u2029 \n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fbeta \u20ac \ud83d\ude00 delta caf\u00e9 \t\u2028\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta\f\u20ac beta gamma\n\ud83d\ude00 alpha\n\u20ac \t gamma epsilon beta beta \ud83d\ude00 x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta gamma\nx na\u00efve delta\n\t\u000b beta na\u00efve \u20ac beta gamma na\u00efve\n epsilon \ud83d\ude00 na\u00efve alpha epsilon\n \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac caf\u00e9 delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nepsilon na\u00efve epsilon \t na\u00efve \u20ac\nalpha beta \ncaf\u00e9 \u20ac epsilon x \t alpha delta \t\ngamma epsilon \t gamma \u20ac x \ud83d\ude00 x alpha x \ncaf\u00e9 beta beta\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00\n alpha caf\u00e9 epsilon \ud83d\ude00 \u20ac na\u00efve \t\n\n caf\u00e9 \ud83d\ude00 x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 epsilon na\u00efve \t \t\ngamma na\u00efve epsilon\nalpha caf\u00e9 \ud83d\ude00 alpha x na\u00efve caf\u00e9 gamma\ndelta \ud83d\ude00 beta alpha na\u00efve \ud83d\ude00 \u20ac epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n alpha\nalpha \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta \u20ac beta\n\t \ud83d\ude00 delta x \u20ac \n\ud83d\ude00 \u20ac epsilon\n delta beta epsilon gamma beta epsilon alpha\n\ud83d\ude00 caf\u00e9 gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta\n caf\u00e9 epsilon epsilon gamma epsilon \t\nepsilon x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta \u20ac \t\ncaf\u00e9 alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta\ngamma beta alpha epsilon \t\n\n\ud83d\ude00 \u20ac \ud83d\ude00\n\n\nx \u20ac alpha x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \nx caf\u00e9 \u20ac\u2028beta delta na\u00efve\nna\u00efve epsilon\n na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 \u20ac alpha \u20ac caf\u00e9 gamma delta \u20ac\n", +"max_lines": 2, +"overlap": 0, +"max_chars": 120 +}, +{ +"text": "\ndelta caf\u00e9 na\u00efve beta\rgamma \t epsilon\u001cepsilon na\u00efve\nna\u00efve\nbeta \u20ac gamma alpha alpha na\u00efve\nbeta \ud83d\ude00\n\t beta na\u00efve delta \u20ac beta epsilon \u20ac na\u00efve x\n x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve na\u00efve \t gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma beta alpha delta\n\u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\ncaf\u00e9 caf\u00e9 na\u00efve delta \nx \u20ac beta alpha \ud83d\ude00 delta \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \nepsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\r\ndelta \ud83d\ude00 x beta \ud83d\ude00 delta\n\n\t \u20ac \nx gamma alpha caf\u00e9 na\u00efve gamma caf\u00e9 \t \t \nx beta caf\u00e9 caf\u00e9\n na\u00efve na\u00efve na\u00efve gamma beta beta \u20ac\u000balpha\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon gamma \t gamma x\n epsilon beta\ncaf\u00e9 beta x\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha\u001cbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x\ngamma \t x gamma delta \t gamma alpha \u2029na\u00efve caf\u00e9 \ud83d\ude00 gamma\u000bx\ncaf\u00e9 \ud83d\ude00 gamma alpha \ud83d\ude00 \u20ac\n\t \ud83d\ude00\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac beta beta caf\u00e9 na\u00efve \u20ac delta caf\u00e9 delta\nalpha \u0085alpha beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nalpha alpha \u20ac na\u00efve\nalpha \ud83d\ude00 x x \u20ac epsilon \ud83d\ude00 beta x epsilon \nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n beta\nx\n \u20ac na\u00efve \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nx epsilon na\u00efve \ud83d\ude00 epsilon beta caf\u00e9 gamma x \t\u2028alpha\nx x epsilon alpha epsilon caf\u00e9\ngamma \u20ac gamma x na\u00efve \n\ud83d\ude00 epsilon caf\u00e9 epsilon na\u00efve delta delta alpha \ud83d\ude00 epsilon \n \ud83d\ude00 \u20ac alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta \u20ac caf\u00e9\n\u20ac \ud83d\ude00 epsilon\r\ngamma \n\t na\u00efve caf\u00e9 delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nna\u00efve\u2028\nx na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta na\u00efve \t \u20ac \t \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 delta delta gamma alpha\n\u2029 epsilon delta \n\ud83d\ude00 x na\u00efve\ncaf\u00e9 beta epsilon \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma alpha \t \ud83d\ude00\ngamma delta beta delta\n gamma gamma caf\u00e9\ndelta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon \t\ncaf\u00e9 caf\u00e9\n\ud83d\ude00 \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 \t gamma gamma \ud83d\ude00 \ud83d\ude00\r\nepsilon caf\u00e9 \t alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\ud83d\ude00 epsilon \t x\ngamma \ud83d\ude00 na\u00efve gamma x \u20ac beta \u20ac\n\t\n\ud83d\ude00 \ud83d\ude00 caf\u00e9\nx x delta caf\u00e9 na\u00efve beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nx\ndelta\n delta\r\ndelta epsilon x beta x epsilon x\u000balpha na\u00efve gamma caf\u00e9 alpha beta\u000balpha \ud83d\ude00 x beta x\nepsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 gamma \t \ud83d\ude00 caf\u00e9 beta\nepsilon epsilon \u20ac alpha caf\u00e9 na\u00efve na\u00efve na\u00efve\nalpha gamma \ud83d\ude00 delta \ud83d\ude00 alpha \t\n delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001cna\u00efve alpha x delta \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t beta\n\ud83d\ude00 x epsilon epsilon\nna\u00efve alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t \ud83d\ude00 \u20ac epsilon \nx x na\u00efve \u20ac na\u00efve \t delta beta \ud83d\ude00 beta \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t delta \t\ndelta x epsilon delta \t \ud83d\ude00 na\u00efve\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve caf\u00e9 alpha beta delta na\u00efve \ud83d\ude00 alpha na\u00efve\nalpha epsilon x\n \t \t \ud83d\ude00 x epsilon\n alpha beta caf\u00e9 \t caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028epsilon \u20ac alpha\nalpha delta delta \t gamma caf\u00e9 \u0085 na\u00efve gamma beta \ud83d\ude00 gamma\nx alpha \nbeta \ud83d\ude00 x x beta na\u00efve epsilon alpha\u001dgamma na\u00efve caf\u00e9 \n\t \ud83d\ude00 \t\nbeta \u20ac caf\u00e9 beta beta epsilon x na\u00efve\u0085\t na\u00efve\u001d\u20ac \ud83d\ude00 epsilon epsilon epsilon epsilon \u20ac x x\nalpha caf\u00e9 \t\u000b", +"max_lines": 60, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "beta x\f x alpha epsilon x delta alpha na\u00efve\ncaf\u00e9 \u20ac epsilon beta delta alpha na\u00efve \t \u20ac x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac\n\u20ac caf\u00e9\u001dna\u00efve caf\u00e9 alpha alpha x beta \u20ac na\u00efve beta \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac alpha \u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon caf\u00e9 \t gamma gamma caf\u00e9 \t delta \t \n\nx epsilon beta\u2028\u000bgamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha x na\u00efve na\u00efve\u0085x alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \t beta x epsilon na\u00efve\nna\u00efve\n\n\ud83d\ude00 alpha gamma gamma \t alpha\n alpha \u20ac gamma caf\u00e9 \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000bdelta \ud83d\ude00\nx alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 gamma \u20ac \t\n\r\n\u20ac alpha \u20ac x epsilon\nepsilon x gamma epsilon gamma \u20ac \t\r caf\u00e9 beta x beta beta epsilon na\u00efve epsilon gamma\ndelta beta epsilon \t alpha gamma \u001cna\u00efve gamma beta na\u00efve \u20ac gamma \u20ac \t epsilon x\u0085\ud83d\ude00 caf\u00e9 \ud83d\ude00\nalpha \n\u20ac \ud83d\ude00 \t \u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve gamma gamma delta \n\u20ac\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac epsilon epsilon alpha delta \t\ndelta \t epsilon \ud83d\ude00 gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 delta\n\t caf\u00e9\n\n alpha na\u00efve x delta alpha \t\r\ngamma epsilon alpha x x\u001ecaf\u00e9\n\ud83d\ude00 alpha x na\u00efve caf\u00e9 \t beta \u2029alpha gamma \ud83d\ude00 caf\u00e9 epsilon\u0085 \ud83d\ude00 gamma \u20ac na\u00efve \t beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon beta\nx caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 gamma \u0085beta epsilon caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nepsilon delta x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n\t \ud83d\ude00 \ud83d\ude00 \u0085\n \n \u20ac epsilon \ud83d\ude00 caf\u00e9 gamma\n \ud83d\ude00 caf\u00e9\nbeta gamma epsilon na\u00efve na\u00efve na\u00efve alpha delta gamma\n\ngamma\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta \ud83d\ude00 \ud83d\ude00 beta epsilon caf\u00e9 caf\u00e9 caf\u00e9 na\u00efve\nna\u00efve caf\u00e9 caf\u00e9 alpha gamma \t na\u00efve\n\u20ac gamma na\u00efve x x na\u00efve caf\u00e9 na\u00efve alpha epsilon \u20ac\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nepsilon\n\ud83d\ude00 delta delta na\u00efve x delta\fx \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u000b\u20ac x\u001dalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t alpha caf\u00e9 epsilon epsilon gamma\nbeta \t caf\u00e9 \ud83d\ude00 delta gamma alpha \t epsilon x alpha beta\n \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t \ud83d\ude00 caf\u00e9 x epsilon alpha\n\u20ac gamma gamma caf\u00e9\nalpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\ngamma beta na\u00efve alpha x \u20ac \u20ac delta\r x \ud83d\ude00\ndelta \ud83d\ude00 na\u00efve x delta alpha x delta delta caf\u00e9\u001dbeta \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nbeta alpha \ud83d\ude00 epsilon alpha\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha \u20ac epsilon\ndelta caf\u00e9 \u20ac delta na\u00efve\r\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t delta \ud83d\ude00\r\ndelta beta delta \t x caf\u00e9\ngamma\n\nx alpha gamma na\u00efve\u0085\nna\u00efve alpha na\u00efve delta x epsilon alpha caf\u00e9 x caf\u00e9\n\nbeta \u20ac \ud83d\ude00 delta\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac \t na\u00efve caf\u00e9 alpha\u2028alpha \ud83d\ude00 \t alpha \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\n caf\u00e9 delta\ncaf\u00e9 alpha na\u00efve delta delta caf\u00e9 beta\n\u20ac \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac gamma delta caf\u00e9\ngamma gamma caf\u00e9\ndelta delta beta gamma epsilon\u0085na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\rbeta \t epsilon delta delta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac \ud83d\ude00 epsilon gamma\ngamma caf\u00e9 \t caf\u00e9 gamma gamma delta\r\nbeta na\u00efve epsilon caf\u00e9 beta gamma \ud83d\ude00 na\u00efve delta delta caf\u00e9 alpha\u001dgamma \t gamma\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve epsilon x \t\u001dx na\u00efve gamma\fna\u00efve beta x \t \t gamma \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9\n\t\repsilon epsilon na\u00efve x x \u20ac alpha alpha \u20ac delta\ngamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 na\u00efve epsilon \ud83d\ude00 delta alpha\u000b\t\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\ndelta \t\ngamma gamma delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x gamma caf\u00e9 \u20ac \ud83d\ude00 na\u00efve\n gamma alpha beta delta epsilon beta\nbeta gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta gamma \t\nna\u00efve x \t caf\u00e9 \t \ud83d\ude00\u2028gamma na\u00efve x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx x delta\n\t \ud83d\ude00 na\u00efve gamma \u20ac delta caf\u00e9 alpha alpha\nna\u00efve beta \t gamma epsilon\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 \u20ac alpha \t\ngamma beta \u20ac\n", +"max_lines": 1, +"overlap": 0, +"max_chars": 120 +}, +{ +"text": " alpha \ud83d\ude00 gamma caf\u00e9 x gamma x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 alpha x\ncaf\u00e9 alpha \t alpha na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta alpha delta \u0085x epsilon x na\u00efve caf\u00e9 delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon\u2029\t \ud83d\ude00\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta delta epsilon na\u00efve\ngamma beta\ncaf\u00e9 caf\u00e9\n\u20ac\u2029gamma \ud83d\ude00 \u20ac gamma gamma \ud83d\ude00 x na\u00efve \t beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta \u20ac gamma \u20ac delta \n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nalpha \t \t \t \n\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha caf\u00e9 \u20ac \t caf\u00e9\u000balpha alpha gamma alpha\nbeta delta beta epsilon \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve \ud83d\ude00 \ud83d\ude00 x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 \ud83d\ude00 delta beta delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx delta\u001depsilon \t epsilon \t\n\ud83d\ude00 caf\u00e9\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x \n \t\u2029delta \t \ud83d\ude00 \t \t beta\ndelta caf\u00e9 x caf\u00e9\ndelta \u20ac\ncaf\u00e9 gamma \ud83d\ude00\n\t beta alpha gamma beta epsilon\n\u000bdelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \t \t\u001d caf\u00e9 gamma x delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00\ndelta\fepsilon\ncaf\u00e9 \t alpha \t alpha na\u00efve x alpha x\nepsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve caf\u00e9 alpha\nepsilon\nepsilon x\u001c\u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 \u20ac \ud83d\ude00 na\u00efve \ud83d\ude00 gamma\r\ud83d\ude00\nx epsilon caf\u00e9 \u20ac x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nalpha caf\u00e9 alpha beta \t gamma\ncaf\u00e9 alpha \ud83d\ude00 alpha\nna\u00efve \t na\u00efve epsilon \ud83d\ude00 alpha \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon gamma gamma beta \ud83d\ude00 \t\n \t\n \u20ac alpha \ud83d\ude00 \u20ac \u20ac delta alpha delta\ngamma na\u00efve beta beta na\u00efve beta gamma \ud83d\ude00 \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u2029\t epsilon caf\u00e9 delta caf\u00e9 \u20ac\n\u20ac \u20ac delta epsilon alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 caf\u00e9 delta \t beta\r\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x x \u20ac epsilon gamma\u000bna\u00efve delta \n\t \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta delta epsilon \f\u20ac beta caf\u00e9 \t delta delta epsilon beta gamma\ncaf\u00e9 \u20ac epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac delta epsilon epsilon\ncaf\u00e9 delta beta \ud83d\ude00 \ud83d\ude00\nepsilon alpha \ud83d\ude00 x delta epsilon \u20ac alpha\fdelta\ncaf\u00e9 alpha x gamma delta gamma caf\u00e9 x epsilon delta\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve\rx alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta epsilon\u001d\t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 \u20ac \t x beta epsilon na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha beta gamma beta beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta delta delta x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \t beta delta caf\u00e9 alpha delta caf\u00e9 x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 delta \ud83d\ude00\n\t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 na\u00efve epsilon caf\u00e9\n\ud83d\ude00 x \ud83d\ude00 x\ngamma \t na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 caf\u00e9 delta beta\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac na\u00efve na\u00efve delta \ud83d\ude00 caf\u00e9\n\n\t alpha \t delta \u20ac caf\u00e9 alpha \ud83d\ude00 alpha\nepsilon caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta \ud83d\ude00 alpha \repsilon \u20ac x \ud83d\ude00 epsilon alpha\f beta \ud83d\ude00 delta x na\u00efve \u20ac \t \t x \t\nalpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon\nbeta \u20ac x alpha alpha na\u00efve beta caf\u00e9\nx \t gamma \t epsilon \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma gamma alpha\n beta \ud83d\ude00 delta \u20ac delta\ncaf\u00e9 na\u00efve alpha gamma epsilon \ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001c\u001c\ud83d\ude00\nbeta delta beta alpha epsilon x epsilon na\u00efve\n\nna\u00efve \ud83d\ude00\n alpha gamma \t\n\u001egamma\u0085\t x beta alpha \ud83d\ude00 epsilon caf\u00e9\ngamma \u20ac alpha x epsilon x \t\fcaf\u00e9 beta caf\u00e9 caf\u00e9 \t alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u001ex caf\u00e9 beta beta alpha\n\u20ac \ud83d\ude00 \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n \t epsilon\u0085na\u00efve gamma \u20ac\n\u20ac epsilon \u20ac na\u00efve gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001cna\u00efve \t epsilon beta alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta \u20ac\n\n\u20ac \ud83d\ude00 na\u00efve x \ud83d\ude00 \u20ac \ud83d\ude00 alpha\ngamma x beta caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon\n \t na\u00efve\u001cbeta delta \ud83d\ude00 \ud83d\ude00 caf\u00e9\n\u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac\u000bdelta beta\nepsilon gamma na\u00efve epsilon delta x caf\u00e9 x\n", +"max_lines": 7, +"overlap": 5, +"max_chars": 17 +}, +{ +"text": "caf\u00e9 \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac x \t na\u00efve x delta\u2028\u20ac \u20ac beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta \t gamma gamma\u2029epsilon \r\ndelta delta\n\u20ac delta epsilon\u2028\ud83d\ude00 \u20ac \t x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta caf\u00e9 \nna\u00efve \u20ac \u20ac \u20ac\nalpha delta na\u00efve caf\u00e9 caf\u00e9 epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve\ngamma alpha delta \u20ac beta \ud83d\ude00 beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nna\u00efve \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u001ecaf\u00e9 alpha delta alpha x gamma delta x\ngamma \t na\u00efve epsilon \t caf\u00e9 delta gamma \u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085gamma \ud83d\ude00 beta \u20ac delta beta \u20ac alpha\ndelta alpha delta gamma x \t delta na\u00efve\ndelta \ud83d\ude00 na\u00efve alpha caf\u00e9 alpha alpha x\n epsilon\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve caf\u00e9 epsilon delta \t \ud83d\ude00 beta\nbeta x\ngamma \t delta beta beta alpha x na\u00efve gamma beta \t \ud83d\ude00\n\u20ac delta x gamma \t x x caf\u00e9 \u20ac\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t caf\u00e9 \u20ac\n\n \ud83d\ude00 alpha\nalpha na\u00efve x na\u00efve \nx beta delta\ndelta \ud83d\ude00 x \t delta gamma x \u20ac epsilon delta\u000b", +"max_lines": 7, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": "\u20ac beta \t caf\u00e9 alpha beta beta na\u00efve\ngamma beta beta na\u00efve\nbeta gamma gamma caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma \t gamma x\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta gamma \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve\nepsilon \u20ac caf\u00e9 na\u00efve alpha \t gamma na\u00efve \nbeta beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma gamma na\u00efve delta\u2028\ngamma delta\ngamma alpha\n\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta x beta delta alpha \n \ud83d\ude00 beta beta delta na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha x caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta \t\n\ud83d\ude00 delta epsilon delta \t gamma na\u00efve gamma\n\ud83d\ude00 x\n\t epsilon epsilon \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u2029\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta\nx \t delta \u20ac epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon gamma alpha epsilon \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac \u20ac \u20ac\u001egamma \t beta alpha gamma delta\ngamma alpha alpha \t\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \n epsilon \t na\u00efve alpha \ud83d\ude00 x caf\u00e9 na\u00efve na\u00efve caf\u00e9 \ud83d\ude00\nepsilon gamma beta \ud83d\ude00 \t\nna\u00efve caf\u00e9 \u20ac x x x na\u00efve \ud83d\ude00\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx na\u00efve delta beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon\nepsilon\n\u20ac beta gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ncaf\u00e9\nx alpha epsilon beta\n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x\n\t beta caf\u00e9\u001calpha epsilon caf\u00e9 delta\n \t alpha \ud83d\ude00 na\u00efve \nx epsilon na\u00efve gamma x \t caf\u00e9 \ud83d\ude00 x epsilon \t\nalpha \t gamma caf\u00e9\ngamma na\u00efve epsilon\n\n epsilon \u20ac caf\u00e9 \t gamma\u2028 \nepsilon \t caf\u00e9 alpha caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \nx alpha x\n epsilon na\u00efve delta gamma \ud83d\ude00 x \u2029gamma caf\u00e9 \ud83d\ude00 epsilon \ud83d\ude00 epsilon caf\u00e9 delta gamma\ncaf\u00e9 \u20ac\u001d\ud83d\ude00\n\nalpha gamma delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon beta delta epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \t x delta delta x delta\n x \n\t delta x x alpha \t\u001cna\u00efve \t \ud83d\ude00 epsilon\n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta delta \u20ac x delta caf\u00e9\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x\u000b gamma caf\u00e9 x na\u00efve \ud83d\ude00 \u001cdelta \u20ac beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma x\nna\u00efve x epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha caf\u00e9 \t\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u001e \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 epsilon alpha beta\nbeta beta delta \u20ac epsilon beta delta delta na\u00efve caf\u00e9\nna\u00efve gamma na\u00efve \ud83d\ude00 \u20ac \u20ac alpha caf\u00e9 caf\u00e9\u2029 beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma gamma \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085na\u00efve delta gamma \u20ac delta\ncaf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta beta na\u00efve \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve \n \n caf\u00e9 \t \u20ac x delta \ud83d\ude00 delta\n \ud83d\ude00 na\u00efve na\u00efve delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001eepsilon alpha beta x na\u00efve delta x\n caf\u00e9 beta caf\u00e9 gamma na\u00efve \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nx \t\u001dcaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta\nbeta caf\u00e9 na\u00efve epsilon\nx \u20ac x gamma \u20ac gamma caf\u00e9 na\u00efve \u20ac\n\u20ac na\u00efve delta x delta alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha na\u00efve \ud83d\ude00 gamma \t\n epsilon \t epsilon alpha beta \u001dcaf\u00e9 \u20ac \ndelta delta na\u00efve caf\u00e9 na\u00efve\ngamma na\u00efve \ud83d\ude00 gamma na\u00efve delta alpha\u2028\ngamma \t gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \fx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta \u20ac na\u00efve\u001ealpha \t \ud83d\ude00\u0085\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 gamma caf\u00e9 alpha gamma\nepsilon delta na\u00efve x \t \t caf\u00e9 \u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta\u001c\u20ac\u2028 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \t \ud83d\ude00 epsilon delta caf\u00e9 beta na\u00efve gamma\nalpha na\u00efve delta alpha gamma \u20ac \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\u001ena\u00efve \ud83d\ude00 beta alpha\ncaf\u00e9 \u20ac epsilon epsilon \ndelta \ud83d\ude00 \ud83d\ude00 epsilon \ud83d\ude00 caf\u00e9 alpha\n", +"max_lines": 60, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "x x delta \t beta \t \u20ac \t beta \ud83d\ude00 \ud83d\ude00\fna\u00efve \ud83d\ude00 caf\u00e9 beta na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon\ncaf\u00e9 \u20ac na\u00efve\n\t gamma x caf\u00e9 beta x \u20ac x\nepsilon beta \u20ac x \ncaf\u00e9 epsilon caf\u00e9 gamma\n delta gamma beta \t delta na\u00efve alpha epsilon\ngamma delta x \u20ac\n\n caf\u00e9 delta \ud83d\ude00 \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001edelta\u2029x\n\nna\u00efve alpha \ud83d\ude00 caf\u00e9 epsilon na\u00efve epsilon gamma \n x \ud83d\ude00 caf\u00e9 gamma \ud83d\ude00 delta na\u00efve \t \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x gamma epsilon delta\n\u0085x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 delta \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac\n\nepsilon epsilon x beta beta alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\u000bna\u00efve epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma gamma x \u20ac \t\nbeta alpha beta beta beta \t \ud83d\ude00 \n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n \u20ac caf\u00e9 alpha caf\u00e9\ndelta delta x epsilon \t x na\u00efve beta\nalpha na\u00efve na\u00efve \ud83d\ude00 \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n \ud83d\ude00 alpha na\u00efve \ud83d\ude00 \t na\u00efve epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma \ud83d\ude00 beta \ud83d\ude00\ncaf\u00e9 na\u00efve delta epsilon caf\u00e9 x\n\u20ac \ud83d\ude00 \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta x \u20ac caf\u00e9 \ngamma x gamma caf\u00e9 \t gamma\n\ud83d\ude00 alpha delta na\u00efve na\u00efve alpha \u001ex beta gamma \u20ac epsilon alpha caf\u00e9 \t alpha caf\u00e9 \t\ngamma caf\u00e9 alpha caf\u00e9\n\u20ac gamma beta x\nalpha na\u00efve \u20ac x beta \u001ealpha\n caf\u00e9 epsilon gamma \ud83d\ude00\n\ud83d\ude00 epsilon alpha\n\t delta alpha epsilon \u20ac beta\nepsilon \ud83d\ude00 \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma caf\u00e9\u0085caf\u00e9 delta x epsilon\n\nepsilon \ud83d\ude00 \u20ac caf\u00e9 na\u00efve caf\u00e9\u001c alpha\u001e\u20ac \ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon alpha alpha caf\u00e9 \ud83d\ude00\nepsilon x na\u00efve delta \t \u20ac alpha \u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta alpha gamma x \t x alpha \n beta \t \u20ac alpha x \t alpha alpha alpha \n\t x\ngamma x na\u00efve delta epsilon\ndelta \ud83d\ude00 caf\u00e9 epsilon gamma delta beta\u000bcaf\u00e9 gamma epsilon \u20ac \ud83d\ude00 na\u00efve epsilon na\u00efve na\u00efve epsilon delta\n\u20ac gamma epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x\u000b\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma \ud83d\ude00 \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\nalpha\nalpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x \ud83d\ude00\nbeta epsilon\nalpha \t x x epsilon x gamma epsilon gamma na\u00efve \ud83d\ude00\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\t caf\u00e9 x epsilon beta gamma beta caf\u00e9 \t\n", +"max_lines": 7, +"overlap": 3, +"max_chars": 17 +}, +{ +"text": "x\nbeta caf\u00e9 \u20ac caf\u00e9\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta gamma beta na\u00efve \u20ac \t x \u20ac na\u00efve\n\nalpha \ud83d\ude00 alpha\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta gamma alpha \t alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\u20ac epsilon x \ud83d\ude00 na\u00efve alpha\nna\u00efve\nx gamma \ud83d\ude00 epsilon beta beta caf\u00e9 beta beta\n\t alpha \ud83d\ude00\nna\u00efve \ud83d\ude00 \t epsilon\nx\n \ud83d\ude00 \t \ud83d\ude00 alpha gamma \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x alpha \t\n na\u00efve gamma\rbeta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x caf\u00e9 beta \ud83d\ude00 alpha\u000bna\u00efve na\u00efve x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\fcaf\u00e9\u0085alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t\n\u000b caf\u00e9 beta delta delta gamma \nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta delta\f\t \t x \ud83d\ude00\n\t delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 \t na\u00efve\u001d\nepsilon gamma delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x \u20ac\u2028 \u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma\nna\u00efve epsilon x na\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon na\u00efve \ud83d\ude00\n\u20ac alpha gamma na\u00efve \u20ac na\u00efve na\u00efve x \ud83d\ude00\r\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma gamma x \ud83d\ude00\n\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 na\u00efve gamma epsilon\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma alpha \ud83d\ude00 delta gamma \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00\ncaf\u00e9 caf\u00e9 beta beta caf\u00e9\u001e gamma\n \n gamma gamma \ud83d\ude00 gamma alpha\nbeta \t \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\f\ud83d\ude00 gamma na\u00efve beta alpha \ud83d\ude00 gamma na\u00efve caf\u00e9\u001c na\u00efve\nx beta \t\n\t epsilon alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \u20ac\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve gamma x\u001depsilon x delta alpha epsilon epsilon \t\ncaf\u00e9 \t na\u00efve na\u00efve alpha beta\n\nalpha delta gamma \t beta gamma na\u00efve \ud83d\ude00 epsilon \u20ac beta caf\u00e9\n \t delta \ud83d\ude00 gamma\n delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 epsilon delta beta\nepsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve caf\u00e9 gamma\u2029 na\u00efve gamma delta epsilon alpha x\n\u20ac \ud83d\ude00 alpha na\u00efve x x \ud83d\ude00\n \t \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon caf\u00e9 caf\u00e9 na\u00efve na\u00efve\u2029x x \ud83d\ude00 delta beta caf\u00e9 epsilon gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve na\u00efve \t \u20ac beta \u20ac caf\u00e9 x \n \u20ac x beta \u20ac \t caf\u00e9\n epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nbeta caf\u00e9 alpha caf\u00e9 na\u00efve x \t \u001e epsilon na\u00efve epsilon caf\u00e9 x\u001d\t beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n x gamma \u20ac na\u00efve x beta delta\n\u2028beta gamma \n\n\t \t epsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac caf\u00e9 alpha\ncaf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma delta\u2029x epsilon x \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta \u20ac \n na\u00efve \ud83d\ude00 beta\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\ndelta x x beta \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac\ncaf\u00e9 epsilon epsilon\n\n", +"max_lines": 13, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "na\u00efve caf\u00e9 x na\u00efve alpha na\u00efve\n\u20ac na\u00efve caf\u00e9 beta epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta caf\u00e9 gamma\n\t alpha alpha na\u00efve \t caf\u00e9 epsilon na\u00efve\u001cgamma delta beta delta\n alpha epsilon x alpha \n\u20ac delta epsilon beta na\u00efve na\u00efve beta gamma epsilon\n\u20ac epsilon delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t \t \ud83d\ude00\ncaf\u00e9 caf\u00e9 epsilon x beta delta\n\ud83d\ude00 x alpha\nepsilon \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00\n\u20ac \t\u2029\nalpha caf\u00e9\nbeta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon \u20ac caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nepsilon \u20ac \u20ac delta x na\u00efve \nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t\n\u20ac \ud83d\ude00\u001ena\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta x delta\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 \ud83d\ude00 epsilon\r\ngamma \t \t \ud83d\ude00\n x\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma epsilon \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\ud83d\ude00\nbeta x gamma beta alpha \ngamma na\u00efve epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\u001dalpha \t \ud83d\ude00 alpha alpha beta x \ud83d\ude00 caf\u00e9\ndelta \ud83d\ude00 alpha\nalpha epsilon epsilon \ud83d\ude00 \t\nna\u00efve delta \ud83d\ude00 \ud83d\ude00 \t na\u00efve x alpha caf\u00e9 caf\u00e9 epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n\u20ac \t na\u00efve \ud83d\ude00 delta \ud83d\ude00 \ud83d\ude00\ngamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha\nna\u00efve delta \u20ac na\u00efve gamma alpha na\u00efve\ngamma na\u00efve \t gamma x \u20ac\nepsilon delta beta\n\t alpha caf\u00e9 epsilon x beta na\u00efve \t caf\u00e9 epsilon gamma\n\t beta na\u00efve\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon\u001e\n\u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\ndelta delta gamma caf\u00e9 beta delta gamma \u20ac\ngamma x \u20ac \u20ac \t \ud83d\ude00 \ud83d\ude00\n\t alpha \ud83d\ude00 gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve epsilon \ud83d\ude00 epsilon gamma alpha caf\u00e9 alpha \u20ac\u2028epsilon\ndelta na\u00efve caf\u00e9 beta \u20ac \u20ac \u20ac\ndelta \t x \t gamma beta \t na\u00efve alpha x\nna\u00efve delta \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta epsilon\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta gamma caf\u00e9 \u20ac alpha alpha delta\nbeta \ngamma x caf\u00e9\n\u20ac epsilon delta epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon caf\u00e9 x caf\u00e9 caf\u00e9\u001ena\u00efve gamma \ud83d\ude00 alpha x \u20ac alpha epsilon\n beta caf\u00e9 x gamma delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve na\u00efve beta \t na\u00efve \t x caf\u00e9\r\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve delta gamma delta beta gamma\nepsilon beta na\u00efve\u2028x alpha \u20ac \t \ud83d\ude00 epsilon\n", +"max_lines": 7, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "x \u20ac na\u00efve na\u00efve caf\u00e9 epsilon alpha beta \nna\u00efve epsilon gamma delta \t\n epsilon beta epsilon \t \ud83d\ude00 delta\ndelta \n\t x \t \ud83d\ude00 beta alpha alpha beta\n\ud83d\ude00 alpha beta x epsilon alpha delta gamma \ud83d\ude00 \u20ac\nx gamma delta epsilon beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac na\u00efve\ngamma beta \t \ud83d\ude00 delta alpha \u20ac epsilon x beta\u001d x \nx \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve gamma na\u00efve \ud83d\ude00 na\u00efve na\u00efve \t\n\n\t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha epsilon \t na\u00efve gamma epsilon alpha\u2029\nalpha gamma na\u00efve\n\t caf\u00e9 delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \ud83d\ude00 beta alpha\ncaf\u00e9 \u20ac alpha x \u001cepsilon caf\u00e9 na\u00efve delta\u2028\ud83d\ude00 caf\u00e9 \u20ac na\u00efve \u20ac beta \u20ac alpha \ud83d\ude00\n\n caf\u00e9\n beta\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac \ud83d\ude00\u0085gamma x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nalpha gamma \t epsilon alpha delta gamma x alpha\nepsilon beta gamma epsilon epsilon caf\u00e9 caf\u00e9 caf\u00e9\n\u20ac \ud83d\ude00 \ud83d\ude00 delta na\u00efve gamma \u20ac\ncaf\u00e9 na\u00efve \u20ac delta gamma x beta alpha na\u00efve \ud83d\ude00\nalpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha \t\u2029epsilon alpha \t beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac alpha beta\r\n\t \ud83d\ude00 epsilon beta \ud83d\ude00 epsilon na\u00efve epsilon\u001e\t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma \u20ac x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\u20ac \ud83d\ude00 alpha caf\u00e9 delta \t epsilon\n\ud83d\ude00 \t \ud83d\ude00 \t \t beta \t \n\t na\u00efve gamma alpha delta epsilon \u20ac \u20ac caf\u00e9\n\u20ac alpha alpha gamma \t na\u00efve na\u00efve beta alpha na\u00efve caf\u00e9\nx beta caf\u00e9 \u20ac na\u00efve\ncaf\u00e9 beta delta caf\u00e9 alpha \u20ac alpha gamma\u2028epsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve \u20ac\u001c\n x \n beta na\u00efve epsilon delta x caf\u00e9 na\u00efve gamma alpha\nalpha beta \ud83d\ude00 alpha\u001ebeta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\n\ud83d\ude00 epsilon na\u00efve \ud83d\ude00\ncaf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta epsilon na\u00efve alpha\u2029 delta na\u00efve gamma epsilon epsilon \u20ac x \t beta\u2028\u001ccaf\u00e9 x delta \u20ac\u0085caf\u00e9 gamma\u001dx epsilon x epsilon epsilon epsilon alpha gamma\ncaf\u00e9 \u20ac gamma x na\u00efve x gamma beta\nepsilon na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac delta beta na\u00efve delta\ngamma \u20ac x gamma caf\u00e9 delta \ud83d\ude00 caf\u00e9 alpha alpha\nna\u00efve\n\t \ud83d\ude00 \u20ac delta epsilon \u20ac \t \u20ac delta\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x \t \ud83d\ude00 na\u00efve\ngamma \u20ac \u20ac x\nalpha alpha \t \t alpha \t \u20ac \t x gamma\nepsilon x \ud83d\ude00 gamma \ud83d\ude00 alpha\n gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9\n x beta \ndelta delta caf\u00e9 epsilon delta\r beta na\u00efve x delta \u20ac \ud83d\ude00 \ud83d\ude00 gamma na\u00efve\ncaf\u00e9 delta na\u00efve beta \u20ac \ud83d\ude00 delta gamma\nalpha na\u00efve \u20ac \ud83d\ude00 na\u00efve \t\n\t\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha x \t \u20ac \ud83d\ude00 epsilon \nalpha \u20ac alpha gamma x caf\u00e9 \nepsilon beta x epsilon x delta \ud83d\ude00 na\u00efve x \ud83d\ude00\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 \u20ac \ud83d\ude00 na\u00efve\r\nna\u00efve epsilon caf\u00e9\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac x\u001dalpha \ud83d\ude00 \u20ac beta\n\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\u20ac gamma alpha delta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve x alpha x \u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t epsilon\n\u20ac alpha caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve caf\u00e9\u001dalpha epsilon alpha beta \ud83d\ude00 caf\u00e9 caf\u00e9 \u20ac alpha \ud83d\ude00 \t\nx \t \t delta x\n alpha epsilon delta gamma epsilon \u20ac na\u00efve\ndelta beta \u20ac \ud83d\ude00 na\u00efve x x beta \ud83d\ude00 delta gamma\n\ndelta beta \ud83d\ude00 beta\f\t caf\u00e9 \ud83d\ude00 epsilon alpha delta na\u00efve alpha epsilon na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac\u2029delta na\u00efve caf\u00e9 na\u00efve epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta epsilon na\u00efve\ncaf\u00e9 alpha x \ud83d\ude00 gamma gamma epsilon caf\u00e9 \u20ac delta\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta alpha na\u00efve alpha na\u00efve epsilon\nepsilon na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n epsilon epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma \t alpha\nalpha caf\u00e9 alpha gamma delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \u20ac gamma \ud83d\ude00 epsilon caf\u00e9 \t \t \ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve x\u001e caf\u00e9 alpha\ncaf\u00e9 delta alpha \t \ud83d\ude00 alpha beta \t \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma alpha x beta beta\nbeta epsilon\f caf\u00e9 \u20ac \ud83d\ude00 \t\u2029\ud83d\ude00 beta\ngamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x caf\u00e9 gamma delta caf\u00e9 beta beta\ngamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta na\u00efve\nepsilon epsilon delta epsilon caf\u00e9\n\ud83d\ude00 epsilon na\u00efve\nbeta \ud83d\ude00 \u20ac beta epsilon alpha beta delta\n\t alpha caf\u00e9 \u20ac\n\ud83d\ude00 gamma x gamma epsilon na\u00efve\u0085beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha delta \t alpha x \t beta\u0085\nbeta\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\nepsilon na\u00efve\n \u2029x caf\u00e9 \u20ac \t beta epsilon beta\ndelta alpha x alpha \ndelta alpha \t \ud83d\ude00 \t gamma delta alpha beta alpha\n gamma caf\u00e9 caf\u00e9 beta\u2028\u2028na\u00efve beta \ud83d\ude00 epsilon \u20ac caf\u00e9 alpha na\u00efve \t \ud83d\ude00\nalpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta delta na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001e beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta alpha delta \u001ddelta \t alpha gamma na\u00efve delta beta \ud83d\ude00 x beta\n\ud83d\ude00 beta \u20ac \ud83d\ude00 na\u00efve\ncaf\u00e9\nbeta gamma \t na\u00efve gamma beta beta delta\nalpha delta gamma delta alpha\n\t x epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta\n\u2029na\u00efve epsilon \t\n\ud83d\ude00 caf\u00e9 \ndelta \ud83d\ude00 beta gamma\r\n\ud83d\ude00 beta caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta caf\u00e9 caf\u00e9 beta \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha x \u20ac\nepsilon alpha na\u00efve caf\u00e9 epsilon alpha \u20ac\u001cna\u00efve x gamma\rdelta \ud83d\ude00 x \t caf\u00e9 epsilon\u2028delta delta\ndelta beta x beta caf\u00e9 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve x\ndelta na\u00efve delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t delta \ud83d\ude00 gamma \ud83d\ude00\n", +"max_lines": 2, +"overlap": 3, +"max_chars": 17 +}, +{ +"text": "x \u20ac caf\u00e9\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 x \u20ac \u20ac \ud83d\ude00 epsilon \u20ac\n\u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac x delta\u2029 \u20ac alpha beta na\u00efve delta \u20ac \u20ac alpha na\u00efve na\u00efve\ngamma epsilon gamma x beta caf\u00e9 epsilon epsilon\u000bdelta na\u00efve \ud83d\ude00 caf\u00e9\f x beta alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 \n\t \u20ac na\u00efve caf\u00e9 x \nalpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta beta \u20ac\n\t\nx gamma epsilon epsilon \t \rna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 \u20ac gamma delta \ud83d\ude00 alpha alpha \n beta \ud83d\ude00 \u20ac x gamma \u20ac \ngamma \ud83d\ude00 alpha delta na\u00efve \t\nalpha alpha alpha na\u00efve delta\n\u20ac \ud83d\ude00 beta \t \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx gamma alpha \u20ac beta na\u00efve \ud83d\ude00 \ncaf\u00e9 \ud83d\ude00\n\u20ac caf\u00e9 x alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 \u20ac x na\u00efve\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac\n epsilon epsilon \t gamma\rbeta \t gamma \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma \t x \u20ac\r\ud83d\ude00 caf\u00e9 \u20ac caf\u00e9 \ud83d\ude00 x \n delta gamma \n\n\ud83d\ude00 na\u00efve delta x x \ud83d\ude00\ngamma delta \u20ac \ud83d\ude00 delta \t gamma delta\nalpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\ngamma \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\u0085alpha gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 epsilon \t caf\u00e9 caf\u00e9 x \ud83d\ude00\n caf\u00e9 \u20ac\n beta \u20ac epsilon \ud83d\ude00 epsilon delta alpha x\n na\u00efve\n\u000bgamma caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 beta\ngamma gamma \t epsilon na\u00efve delta alpha x\n\ud83d\ude00 caf\u00e9 x delta x\nna\u00efve delta \ud83d\ude00\n\n \t delta beta beta epsilon alpha \u20ac beta delta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac gamma \u20ac\ngamma \u20ac \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n gamma delta x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n\ud83d\ude00 caf\u00e9 alpha \u20ac beta beta delta \ud83d\ude00 na\u00efve \t \ndelta delta \ud83d\ude00 caf\u00e9 caf\u00e9 \u20ac \u20ac\ngamma\u001dna\u00efve \u20ac alpha \u20ac gamma caf\u00e9\ndelta alpha na\u00efve caf\u00e9 \u20ac delta\n beta na\u00efve epsilon na\u00efve beta caf\u00e9 delta na\u00efve\nx caf\u00e9 \ud83d\ude00 gamma \u20ac delta gamma\n\u20ac beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta x \t x x beta\n epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta alpha alpha epsilon beta \t delta\nna\u00efve epsilon na\u00efve epsilon \ud83d\ude00 \t\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac caf\u00e9 x na\u00efve \u000b epsilon gamma x delta gamma delta\n\ngamma \u20ac alpha caf\u00e9 \t\ndelta \t \u20ac gamma \u20ac gamma \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u2029gamma epsilon \ud83d\ude00 \u20ac delta \t beta \u20ac gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 caf\u00e9 na\u00efve \u20ac na\u00efve alpha \u20ac na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta x epsilon delta delta \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx delta epsilon x \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9\n", +"max_lines": 2, +"overlap": 5, +"max_chars": 4000 +}, +{ +"text": "\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac \t\r\ncaf\u00e9 x \t delta x \u001d epsilon \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta delta na\u00efve gamma \u20ac\n\u20ac beta epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\n\nx caf\u00e9 x \u20ac alpha \u20ac delta\nx \n x \u2029\t beta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac \u20ac caf\u00e9\fna\u00efve x\ncaf\u00e9 delta \t\nx na\u00efve delta na\u00efve x beta \ud83d\ude00\u0085beta x \ud83d\ude00 gamma delta epsilon \ud83d\ude00 \t x x\u2028\n\ud83d\ude00 x \ud83d\ude00 \t delta caf\u00e9 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta\ncaf\u00e9 \t epsilon epsilon\u2028caf\u00e9 \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon na\u00efve x caf\u00e9 beta\n\u20ac\ngamma alpha \u20ac beta x gamma delta x\nx caf\u00e9 x\ncaf\u00e9 \u20ac delta\ncaf\u00e9 epsilon x gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma caf\u00e9 x \t alpha x alpha\nna\u00efve epsilon \ud83d\ude00 beta na\u00efve x \u20ac beta delta beta x\nepsilon x \t na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma \ud83d\ude00 alpha caf\u00e9 delta caf\u00e9 \ud83d\ude00 beta \u001e \ud83d\ude00 \t epsilon \ud83d\ude00 caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\fgamma \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\n \ud83d\ude00 \t gamma x delta x beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta gamma caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x epsilon beta\u2028 alpha x epsilon \u20ac alpha beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta\ralpha \u20ac \ud83d\ude00 na\u00efve\r\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t \t\nepsilon gamma beta \t\n\n \nalpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t caf\u00e9 beta\nx delta x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 epsilon epsilon \ud83d\ude00\r na\u00efve delta\n\nbeta epsilon \t alpha\u2028epsilon \ud83d\ude00\nepsilon epsilon \t \u20ac \t \t caf\u00e9 \ndelta epsilon x caf\u00e9 gamma alpha delta na\u00efve \ud83d\ude00\n\nna\u00efve epsilon delta alpha \t alpha x alpha beta gamma caf\u00e9\ndelta \u20ac x delta caf\u00e9 \ud83d\ude00 \u20ac \ud83d\ude00\u2029na\u00efve \u001egamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001e\ngamma \u20ac\u2028x x na\u00efve caf\u00e9 \t \ud83d\ude00 alpha x na\u00efve caf\u00e9 \nepsilon \u20ac \t\u001d \u20ac gamma na\u00efve\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma alpha\fdelta beta delta delta \t epsilon beta gamma na\u00efve \t\n delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\n\u20ac \rgamma alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma x caf\u00e9 \t \u20ac\u000bna\u00efve \ud83d\ude00 beta beta beta caf\u00e9 gamma \ud83d\ude00\u001ccaf\u00e9 delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n beta \t gamma na\u00efve x \u20ac \u20ac \ud83d\ude00\ngamma caf\u00e9 delta beta\u001edelta alpha alpha gamma\nalpha \t \t delta\u2029caf\u00e9 gamma beta\nna\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n\t caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\f\ud83d\ude00 \t gamma x \t\nalpha beta \ud83d\ude00 alpha\u000bgamma na\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\r\ngamma x \ud83d\ude00 epsilon gamma \t caf\u00e9 \n\ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 x x \ud83d\ude00 alpha\u2029caf\u00e9 caf\u00e9 delta \n\t \t \u20ac epsilon epsilon gamma \ud83d\ude00\nalpha na\u00efve x beta \ud83d\ude00 epsilon\u000bx \n epsilon x \u20ac alpha caf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve\nx gamma beta alpha \t epsilon \nx x caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\r\n\nna\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta gamma beta delta \t x\nalpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac delta caf\u00e9 \t alpha\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta \u20ac \ndelta epsilon beta \t\ndelta beta caf\u00e9 caf\u00e9 \u20ac alpha \u20ac \u20ac caf\u00e9\n na\u00efve \ud83d\ude00 \ud83d\ude00 beta caf\u00e9 na\u00efve na\u00efve\nepsilon epsilon delta \ud83d\ude00 beta\u001depsilon \u20ac \u20ac delta \u20ac beta alpha\n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x gamma\nx beta gamma na\u00efve\nna\u00efve \ud83d\ude00 gamma delta \t \ud83d\ude00\ngamma gamma \ud83d\ude00 \t\ngamma \t caf\u00e9 epsilon epsilon \ud83d\ude00 caf\u00e9 x \ud83d\ude00 beta\rcaf\u00e9 caf\u00e9 delta alpha alpha\n \t \ud83d\ude00 epsilon epsilon x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta \u20ac na\u00efve \u20ac delta\u001d\ud83d\ude00 na\u00efve x\u0085\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma gamma na\u00efve \ud83d\ude00 \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n x gamma\nx delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac caf\u00e9 epsilon \ud83d\ude00 \ud83d\ude00 caf\u00e9 \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta epsilon caf\u00e9 beta\nalpha beta beta\n caf\u00e9 \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\t epsilon epsilon \t\n\ndelta beta caf\u00e9 na\u00efve x beta \u20ac\n\nx \ud83d\ude00 \ud83d\ude00 \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ngamma beta alpha \t x x na\u00efve\n alpha gamma beta\ncaf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac\n\t caf\u00e9 alpha beta caf\u00e9 \r\nalpha \t \ud83d\ude00 x na\u00efve \t \t beta na\u00efve\nx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac delta beta \u20ac \ud83d\ude00\u2029alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ncaf\u00e9 delta\n\u20ac \ud83d\ude00 beta x delta gamma beta na\u00efve beta delta alpha x\n", +"max_lines": 7, +"overlap": 5, +"max_chars": 17 +}, +{ +"text": "x\u2029epsilon x epsilon alpha na\u00efve x \ud83d\ude00\nalpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u0085beta x x\n alpha x\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon alpha epsilon epsilon \ud83d\ude00 caf\u00e9 beta delta delta\nalpha \ud83d\ude00 delta caf\u00e9 \t\ngamma alpha na\u00efve \ncaf\u00e9 x beta x \u20ac na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha\n\u20ac na\u00efve na\u00efve na\u00efve \n \ud83d\ude00 \ud83d\ude00\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma delta\f \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 \u20ac caf\u00e9 \ud83d\ude00 \t caf\u00e9\nna\u00efve \u20ac gamma alpha gamma na\u00efve caf\u00e9\u2028\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon\n\ud83d\ude00 epsilon na\u00efve x caf\u00e9 na\u00efve \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 gamma \ud83d\ude00 alpha\u2028\ud83d\ude00 beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta delta\n x \n \t caf\u00e9 na\u00efve na\u00efve alpha\nbeta \u20ac \ud83d\ude00\n\t \ud83d\ude00 gamma caf\u00e9 epsilon na\u00efve caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta caf\u00e9\nx na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nbeta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha \u20ac epsilon caf\u00e9\nna\u00efve epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x caf\u00e9\ndelta\u2028na\u00efve delta beta epsilon \rx x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve\u0085\t caf\u00e9 alpha beta\n\nepsilon delta x \ud83d\ude00 \ud83d\ude00 caf\u00e9 \ud83d\ude00 epsilon\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta alpha x \ud83d\ude00 caf\u00e9 na\u00efve \t\r\nbeta alpha \ud83d\ude00 \t x caf\u00e9 epsilon epsilon beta gamma\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 delta beta\u001e\t gamma \ud83d\ude00 \ud83d\ude00 epsilon epsilon\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t \ud83d\ude00 \nna\u00efve \t \ud83d\ude00 beta epsilon delta epsilon alpha x gamma\nbeta na\u00efve\fbeta na\u00efve \t beta \ud83d\ude00 \ud83d\ude00 gamma \ud83d\ude00\n\u20ac caf\u00e9\ncaf\u00e9 gamma beta caf\u00e9 \u0085x beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma gamma na\u00efve x alpha \n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 alpha \u20ac delta beta na\u00efve beta\n\n\u0085\nx \u20ac\u001d\ud83d\ude00 \ud83d\ude00 \t\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x na\u00efve gamma epsilon na\u00efve alpha caf\u00e9\n\t x delta x beta delta \u20ac \t x x\u2028\ngamma beta \u20ac gamma gamma alpha epsilon\n\u000bbeta na\u00efve delta \ndelta beta \ud83d\ude00 caf\u00e9 na\u00efve na\u00efve\n\ud83d\ude00 gamma x \n\u20ac\nx \t \t\ngamma gamma caf\u00e9 gamma x epsilon x \ud83d\ude00 \t beta\ngamma epsilon\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta beta \ud83d\ude00 beta epsilon na\u00efve\u2029 \t \t \ud83d\ude00 \ud83d\ude00 caf\u00e9 \t gamma beta\nx na\u00efve \u20ac \ud83d\ude00 na\u00efve caf\u00e9 gamma\n\t caf\u00e9 \t \t x epsilon delta gamma epsilon\ndelta x delta x epsilon epsilon delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n\n\r\u20ac epsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\ud83d\ude00 \ud83d\ude00 epsilon epsilon\n\nbeta caf\u00e9 delta na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\u000b\ud83d\ude00 x \u20ac gamma \ud83d\ude00 x caf\u00e9 beta \u20ac epsilon\r\t beta \ud83d\ude00 \ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \ud83d\ude00 na\u00efve gamma x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001cx epsilon epsilon alpha na\u00efve na\u00efve \u20ac alpha\n\ud83d\ude00 beta \t\u001ena\u00efve beta epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma beta caf\u00e9 beta epsilon caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve na\u00efve beta \t\n\u20ac alpha beta delta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac na\u00efve na\u00efve alpha\nx x gamma alpha caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 delta \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\t caf\u00e9 epsilon x delta x \t delta \t gamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028 alpha \ud83d\ude00 gamma caf\u00e9 beta beta \t\n epsilon\nna\u00efve alpha \t epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha \u20ac\ngamma beta x gamma delta x \t \t alpha\n na\u00efve gamma\r\n \t gamma na\u00efve epsilon x x\n\n\u20ac epsilon\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac alpha gamma caf\u00e9 \t x\n\nna\u00efve gamma \ud83d\ude00 beta delta delta epsilon epsilon \nbeta x \t \ud83d\ude00 delta epsilon \ndelta na\u00efve \t\n\t delta delta beta \ud83d\ude00 \u20ac alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha gamma alpha x x \u20ac\nepsilon \u20ac epsilon alpha na\u00efve caf\u00e9 \t delta gamma epsilon\nepsilon alpha caf\u00e9\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma alpha alpha epsilon alpha\nna\u00efve epsilon beta delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta epsilon caf\u00e9\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 \t \t na\u00efve \t \nalpha gamma \ud83d\ude00 delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\r\n beta \u20ac x delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon beta na\u00efve\r\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta beta epsilon\ndelta delta\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha\nepsilon epsilon epsilon na\u00efve caf\u00e9 caf\u00e9 \u20ac \t na\u00efve delta\nalpha beta gamma x \ud83d\ude00\n\u001c\t gamma\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac na\u00efve beta gamma\n \ud83d\ude00 alpha beta beta epsilon caf\u00e9 delta \ud83d\ude00\n\n\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x delta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b \ud83d\ude00 x beta caf\u00e9 \u20ac delta \ud83d\ude00\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon caf\u00e9 gamma alpha \n\n\ud83d\ude00 na\u00efve gamma \t alpha \u20ac \ud83d\ude00 \t gamma \u2029\nbeta \ud83d\ude00 epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t beta \u20ac\nalpha \u20ac x alpha delta delta \t alpha epsilon gamma\nbeta na\u00efve epsilon beta delta beta \n\t epsilon na\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta gamma x alpha beta\ncaf\u00e9 \u20ac \ud83d\ude00 \u20ac na\u00efve gamma epsilon epsilon \ud83d\ude00 x\u2029beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x caf\u00e9 alpha beta\n epsilon x\n\u20ac alpha \t beta \ud83d\ude00 epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \n\t\nna\u00efve na\u00efve\u2028\t \t alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\ndelta caf\u00e9 delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve \t \t\nbeta\r", +"max_lines": 7, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": "beta delta alpha\n\ud83d\ude00 x x delta \u20ac caf\u00e9\falpha x caf\u00e9 \u20ac alpha beta \ud83d\ude00 \ud83d\ude00 beta \n\nepsilon gamma alpha \u20ac \t epsilon epsilon \n\ud83d\ude00 gamma gamma caf\u00e9 delta na\u00efve \ud83d\ude00 \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha \u20ac gamma x caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\ncaf\u00e9 alpha\u001ex gamma alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon \t alpha\u2029 \t \ud83d\ude00 gamma gamma\n caf\u00e9 epsilon \t alpha gamma na\u00efve\rcaf\u00e9 caf\u00e9 \u20ac caf\u00e9 gamma \u20ac \n caf\u00e9 x \nna\u00efve alpha caf\u00e9 \ud83d\ude00 delta beta x \nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta \ud83d\ude00 delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx x delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha \ud83d\ude00\u000b\u000bgamma \t caf\u00e9 beta\u001dbeta caf\u00e9 alpha epsilon beta alpha\nna\u00efve gamma epsilon \u20ac\n\ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac\u001eepsilon na\u00efve x alpha x gamma \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon \ud83d\ude00 caf\u00e9 na\u00efve beta na\u00efve\nepsilon caf\u00e9 na\u00efve\r\n\ndelta na\u00efve\n\t\ngamma x alpha \ud83d\ude00 epsilon gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n x\u000b\ud83d\ude00 caf\u00e9 \t x na\u00efve \u20ac epsilon beta \t x gamma \ud83d\ude00\ndelta epsilon \nx alpha epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 alpha epsilon\nepsilon epsilon beta x caf\u00e9 gamma caf\u00e9 epsilon\n\ngamma \ud83d\ude00\r\nx gamma epsilon x x epsilon\u000bdelta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x epsilon gamma x\fna\u00efve\n gamma beta x delta delta \t\u0085beta \t beta \ud83d\ude00 alpha \u20ac delta na\u00efve\ncaf\u00e9 \t caf\u00e9 delta\nbeta \ud83d\ude00 epsilon caf\u00e9 gamma \t \t x\u2028 delta\n \u20ac \ud83d\ude00 caf\u00e9\ndelta \t\u2028\u001c epsilon beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac alpha \t beta \ud83d\ude00\ndelta \u20ac na\u00efve alpha na\u00efve \u20ac caf\u00e9\n\u2028beta \t beta\ngamma caf\u00e9 beta beta gamma \t alpha \ud83d\ude00\ngamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n", +"max_lines": 1, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "\ud83d\ude00 alpha \ud83d\ude00 alpha beta caf\u00e9 caf\u00e9 epsilon alpha beta\ngamma \u20ac\nx delta \u20ac alpha \ud83d\ude00\nna\u00efve beta\n\n beta \t alpha na\u00efve\nx alpha delta caf\u00e9\n\t na\u00efve \t epsilon beta na\u00efve \u20ac gamma\u2029epsilon x \ud83d\ude00 epsilon \t delta \nbeta alpha na\u00efve alpha \u20ac caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \nepsilon na\u00efve \u20ac gamma gamma na\u00efve \ud83d\ude00 \t na\u00efve beta delta\n", +"max_lines": 2, +"overlap": 3, +"max_chars": 120 +}, +{ +"text": " longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nx epsilon caf\u00e9 beta delta \t epsilon \t\n\t \u20ac caf\u00e9 \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t gamma\r\nalpha \t epsilon beta beta na\u00efve\u001e\u20ac beta epsilon gamma \t \t alpha\rcaf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ralpha beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u001c\u001e\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta gamma x gamma alpha na\u00efve caf\u00e9 na\u00efve na\u00efve alpha\n\ud83d\ude00 alpha \ud83d\ude00 \u20ac beta delta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha gamma \t alpha delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\ndelta x \t \u20ac \t \t alpha gamma \ud83d\ude00 beta \n\u20ac \u20ac epsilon gamma \u20ac x \ud83d\ude00\n\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve beta \u20ac epsilon alpha \t\u2028gamma caf\u00e9 delta \t beta\u001d\ud83d\ude00 epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\n alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta \u20ac \t\u001cepsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x \ud83d\ude00 \u20ac delta caf\u00e9 alpha \u20ac\ndelta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x \t \ud83d\ude00\nx x \t \t alpha na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta beta x \t alpha \ud83d\ude00 x \ud83d\ude00 \t\ndelta gamma gamma epsilon alpha alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00\n\u20ac \ud83d\ude00 na\u00efve alpha \t na\u00efve x beta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta\n\n caf\u00e9\nna\u00efve na\u00efve\nx na\u00efve gamma\n \u20ac caf\u00e9 caf\u00e9 alpha epsilon delta alpha beta\nalpha alpha \ud83d\ude00 gamma \u20ac x \u20ac \ud83d\ude00 x epsilon \n\ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac \ud83d\ude00 na\u00efve\nna\u00efve alpha\nna\u00efve \ud83d\ude00 \u20ac delta \ud83d\ude00 caf\u00e9 alpha\n gamma gamma\n\u20ac gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x\r\ud83d\ude00 gamma\n\ud83d\ude00 \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x caf\u00e9 delta\u0085x gamma x \ud83d\ude00\n\u20ac x epsilon x delta\nepsilon beta delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac delta\u2028 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\ud83d\ude00 \u20ac caf\u00e9 epsilon \u20ac alpha na\u00efve\nx caf\u00e9 na\u00efve gamma alpha alpha \ud83d\ude00 \ncaf\u00e9 gamma delta delta \t\n\t delta gamma alpha\n\ud83d\ude00 \t \u20ac caf\u00e9 beta \ud83d\ude00 alpha \t caf\u00e9\nna\u00efve x\u001ex epsilon caf\u00e9 epsilon \t \ud83d\ude00 epsilon\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta gamma gamma \u20ac delta delta \ud83d\ude00 \u20ac\u2028gamma\nbeta\n\ud83d\ude00 \u20ac x delta \t caf\u00e9 na\u00efve caf\u00e9 \t\nx x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta\f\f \u20ac caf\u00e9 beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \u20ac x epsilon caf\u00e9 caf\u00e9 beta\fepsilon na\u00efve \u20ac alpha na\u00efve na\u00efve alpha beta na\u00efve\ncaf\u00e9 na\u00efve epsilon gamma beta na\u00efve \t \t \u20ac caf\u00e9 beta na\u00efve\u001cna\u00efve beta alpha epsilon \t\nna\u00efve beta x \u20ac \t alpha \n", +"max_lines": 60, +"overlap": 0, +"max_chars": 4000 +}, +{ +"text": "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma caf\u00e9\n\t \u20ac alpha caf\u00e9 delta beta \ud83d\ude00\u001dalpha beta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta \nalpha\r\n \t na\u00efve delta epsilon x epsilon\n", +"max_lines": 13, +"overlap": 3, +"max_chars": 17 +}, +{ +"text": "epsilon \u20ac alpha \t delta \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \ud83d\ude00 \ud83d\ude00\n epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma x \u20ac \u20ac beta \ud83d\ude00 na\u00efve \ud83d\ude00 epsilon delta\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve gamma\u001eepsilon \t beta \u001d\ngamma caf\u00e9 beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028x caf\u00e9 alpha \ud83d\ude00 beta \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00\rdelta alpha x gamma\ncaf\u00e9 gamma x x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon\u2028gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve \u20ac beta na\u00efve gamma gamma alpha \u20ac \u20ac\n\n\u20ac delta beta\u001c\ud83d\ude00\u2028\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha beta beta \u20ac\n\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\ud83d\ude00 gamma caf\u00e9 alpha caf\u00e9 beta\n", +"max_lines": 13, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": "\u20ac \ud83d\ude00 beta beta beta alpha \ud83d\ude00 na\u00efve alpha x alpha\nx beta na\u00efve caf\u00e9 x na\u00efve \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \t \u20ac\n na\u00efve\nepsilon epsilon beta epsilon \u20ac beta delta caf\u00e9 x\nna\u00efve beta\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma na\u00efve \u20ac \u20ac alpha epsilon \u000b alpha na\u00efve delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta caf\u00e9\ndelta na\u00efve \u20ac caf\u00e9 epsilon gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta\nalpha \ud83d\ude00 \t x \t\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nna\u00efve\u000bgamma alpha gamma beta beta \t caf\u00e9 \t \ud83d\ude00 caf\u00e9\u2029gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon beta caf\u00e9 x\u2028na\u00efve \ud83d\ude00 epsilon epsilon\nepsilon \ud83d\ude00 alpha epsilon gamma x na\u00efve delta epsilon gamma beta \ndelta caf\u00e9 x \ud83d\ude00\u001dx caf\u00e9 alpha beta alpha x \ud83d\ude00 na\u00efve na\u00efve \t \u20ac\n epsilon\ndelta beta beta caf\u00e9 delta gamma epsilon na\u00efve\u2029beta epsilon alpha delta x\n\ud83d\ude00\n\n\t epsilon na\u00efve epsilon \t\nepsilon na\u00efve \t caf\u00e9 \ud83d\ude00 epsilon\u0085 delta\nna\u00efve\u001c \t alpha \ud83d\ude00\ngamma \t epsilon\nbeta \u20ac x\nalpha x \u20ac \u20ac \t alpha\nbeta \t na\u00efve\nalpha \t \u20ac gamma caf\u00e9 epsilon caf\u00e9 beta beta\nepsilon beta \u20ac delta\f\n\n caf\u00e9 \ud83d\ude00 epsilon \t \u000balpha alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nbeta \u20ac beta caf\u00e9 x \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 caf\u00e9 beta \t epsilon beta \t alpha\ngamma x x gamma delta \n\u20ac \t beta delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx\ncaf\u00e9 \u20ac delta na\u00efve epsilon caf\u00e9\n\u20ac\ndelta beta caf\u00e9 na\u00efve x epsilon\r\n\u20ac epsilon x \u20ac delta epsilon x caf\u00e9 epsilon\nbeta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon \t gamma \ud83d\ude00 alpha \u20ac\ngamma epsilon alpha\fgamma delta na\u00efve \t x gamma alpha\u2028caf\u00e9 caf\u00e9 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x \t x \nna\u00efve gamma \t na\u00efve\u000bx caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001ex \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon \ud83d\ude00 \t na\u00efve gamma beta x \t na\u00efve\u2029caf\u00e9 na\u00efve alpha \u20ac\ndelta delta\n\t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t x na\u00efve\n\nepsilon na\u00efve caf\u00e9 alpha \ud83d\ude00 gamma beta\nepsilon delta beta \n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 alpha caf\u00e9 \ud83d\ude00 x caf\u00e9 alpha\nx x epsilon gamma caf\u00e9 epsilon\n\n\ud83d\ude00 na\u00efve\nbeta x caf\u00e9 \t epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha\u2029\nna\u00efve caf\u00e9 \ud83d\ude00 \u20ac beta gamma \u20ac gamma \t beta\nepsilon caf\u00e9 na\u00efve caf\u00e9 delta \ncaf\u00e9 beta delta \ud83d\ude00 gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma alpha delta \t delta epsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac\u001ex epsilon \ud83d\ude00 x na\u00efve alpha\n\u20ac epsilon beta caf\u00e9 delta \t \ud83d\ude00 \u20ac\ncaf\u00e9 \ud83d\ude00 na\u00efve alpha \ud83d\ude00 na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\nna\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac beta x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \fna\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b\n\u20ac delta delta\n\ud83d\ude00 gamma delta beta na\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma epsilon caf\u00e9 delta\u001dx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 delta \u20ac x epsilon \t\nepsilon gamma\ndelta alpha \t delta gamma beta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t\u2029na\u00efve delta na\u00efve alpha delta \ud83d\ude00 beta caf\u00e9 beta \ud83d\ude00 gamma\u2029gamma gamma caf\u00e9 beta \u20ac epsilon epsilon gamma \n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta \u20ac \u20ac alpha epsilon\u0085 caf\u00e9 epsilon \t \ud83d\ude00 caf\u00e9 \u000bgamma \ud83d\ude00 \ud83d\ude00 caf\u00e9\u2029alpha alpha epsilon caf\u00e9 \t \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve\n\t na\u00efve\u000balpha x gamma alpha \u20ac\n\t \u20ac\n\u20ac na\u00efve beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac\u000bdelta \t epsilon caf\u00e9 \n\t na\u00efve delta epsilon delta epsilon gamma \u20ac\n \ud83d\ude00\n delta delta beta epsilon beta epsilon epsilon\u000bbeta caf\u00e9 delta caf\u00e9 delta delta delta gamma\nbeta\ndelta \u20ac \t \ud83d\ude00 epsilon delta \n caf\u00e9 \nalpha alpha\u000bna\u00efve alpha \t \t delta epsilon epsilon beta x alpha\r\ncaf\u00e9 x caf\u00e9 na\u00efve na\u00efve gamma alpha na\u00efve \u20ac \nx \t \ud83d\ude00 caf\u00e9\u0085beta beta \t\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta gamma epsilon delta\u2029alpha\nna\u00efve gamma beta na\u00efve gamma x epsilon alpha alpha\ngamma \u20ac \ud83d\ude00 beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha na\u00efve \t\n\t na\u00efve na\u00efve\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve na\u00efve x gamma \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n\nx gamma\u000b\u20ac \t\n delta\u001cbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t\u001dna\u00efve \ud83d\ude00 x gamma \u20ac gamma \ud83d\ude00 \u20ac \t caf\u00e9\ngamma \t epsilon \u20ac alpha caf\u00e9 gamma \u20ac delta caf\u00e9\u001cdelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x beta caf\u00e9 \u20ac \t\ndelta \t delta beta \u20ac \t na\u00efve x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta\n", +"max_lines": 2, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma caf\u00e9 caf\u00e9 \u20ac x beta caf\u00e9 delta\nna\u00efve \ud83d\ude00 \ud83d\ude00 alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta x gamma \u20ac\nepsilon \u20ac \ud83d\ude00 \ud83d\ude00 gamma \u20ac\n gamma beta \u20ac delta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve delta x beta beta delta delta beta\ngamma \u20ac gamma alpha caf\u00e9 na\u00efve beta beta beta beta \n \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fbeta na\u00efve beta beta \ud83d\ude00 epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\r gamma \t \n", +"max_lines": 1, +"overlap": 0, +"max_chars": 4000 +}, +{ +"text": "\n\nepsilon na\u00efve alpha \n\t beta alpha delta na\u00efve na\u00efve \u20ac gamma\n\n\ud83d\ude00 \t x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 alpha alpha alpha \rx na\u00efve gamma \u20ac \ud83d\ude00 beta\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x \u20ac epsilon epsilon \t\n\n\u001ecaf\u00e9 x delta \t gamma alpha beta delta\nalpha beta \u20ac caf\u00e9 caf\u00e9 x x x alpha delta\ndelta \u20ac x alpha x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\ngamma caf\u00e9 beta x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta \nna\u00efve \u20ac gamma epsilon alpha alpha \ud83d\ude00\u001dcaf\u00e9 \t \u20ac gamma epsilon beta\u2028epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta alpha\u0085epsilon \u20ac gamma epsilon beta caf\u00e9 delta caf\u00e9\nna\u00efve alpha\r\t \ud83d\ude00 gamma caf\u00e9 na\u00efve beta\nx epsilon \t caf\u00e9\nbeta \nna\u00efve \ud83d\ude00 \t \ud83d\ude00 delta \ud83d\ude00\n gamma caf\u00e9\n\u20ac \ud83d\ude00 epsilon gamma \ud83d\ude00 na\u00efve caf\u00e9 epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha \ud83d\ude00\n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma epsilon na\u00efve caf\u00e9 gamma\n delta \ud83d\ude00 \u20ac beta epsilon\n\ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t \t \ud83d\ude00 \t\n \r\nepsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 delta beta\u0085\ud83d\ude00 x beta \u20ac \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 gamma \t epsilon \t na\u00efve\ncaf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x delta \u20ac beta\nalpha x x \ud83d\ude00 \t \t \u20ac\f\u20ac na\u00efve na\u00efve delta na\u00efve x epsilon\nalpha delta \t gamma \ud83d\ude00 \ud83d\ude00 \u20ac \u001cx alpha beta x gamma\u2029na\u00efve delta x na\u00efve caf\u00e9\n", +"max_lines": 60, +"overlap": 1, +"max_chars": 4000 +}, +{ +"text": "epsilon x alpha \u20ac caf\u00e9 gamma \t gamma\n\n\ncaf\u00e9 epsilon caf\u00e9 caf\u00e9 epsilon \u20ac \t na\u00efve\n\t beta x x beta epsilon \t\nepsilon alpha caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 \nbeta \u20ac gamma \ud83d\ude00 alpha x epsilon \ud83d\ude00\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve epsilon na\u00efve caf\u00e9 epsilon\ndelta delta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x epsilon alpha delta\n\t caf\u00e9 alpha epsilon alpha x caf\u00e9\u001cna\u00efve beta epsilon \t delta\nalpha na\u00efve \u20ac na\u00efve \t \u20ac\nx epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta alpha \ud83d\ude00 caf\u00e9 epsilon \ud83d\ude00 alpha\nna\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\u001dbeta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx epsilon beta\u2028 delta alpha epsilon caf\u00e9 beta\ndelta alpha delta delta\u2028caf\u00e9 delta \ud83d\ude00\nna\u00efve \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve beta \u20ac\nalpha gamma gamma caf\u00e9 beta\nbeta alpha gamma x \ud83d\ude00\n\n\t na\u00efve \t gamma \t\u2029\u20ac \u20ac delta \u20ac epsilon alpha na\u00efve\nx epsilon\n \ud83d\ude00 gamma\nna\u00efve \ud83d\ude00 beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 \ud83d\ude00 na\u00efve \t\nbeta alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta\nna\u00efve x alpha x epsilon \ud83d\ude00 \u20ac caf\u00e9 epsilon caf\u00e9 caf\u00e9\nna\u00efve x x beta delta beta\u001ecaf\u00e9\n\ud83d\ude00 delta alpha x alpha gamma na\u00efve \t na\u00efve alpha beta\nx gamma \ud83d\ude00 x epsilon epsilon beta \u001cna\u00efve \u20ac \u20ac x beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha gamma\n \n\r\ndelta\ncaf\u00e9 \ud83d\ude00 caf\u00e9 \t gamma\r\nx beta na\u00efve \ncaf\u00e9 gamma caf\u00e9 \t \ud83d\ude00 beta\f alpha gamma\u000bepsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 \t \nalpha \t delta na\u00efve delta gamma beta x \u20ac\n\t epsilon \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma beta\u2028\ud83d\ude00 na\u00efve gamma alpha caf\u00e9 \ud83d\ude00 gamma\n \t delta \ud83d\ude00 alpha na\u00efve alpha\n\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta \ud83d\ude00 epsilon gamma \t\u0085alpha \t \ngamma na\u00efve na\u00efve alpha \ndelta\nna\u00efve beta\nalpha \ud83d\ude00 x na\u00efve\ncaf\u00e9 x \u20ac epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha \ud83d\ude00 \t delta\n alpha beta x epsilon epsilon na\u00efve x\u001cbeta\ncaf\u00e9 delta \u20ac gamma beta \fgamma delta epsilon\n\t gamma \t epsilon delta alpha delta \u20ac x caf\u00e9 gamma\ncaf\u00e9 beta delta alpha delta gamma \u20ac\rdelta \u20ac\nx \ud83d\ude00 x epsilon\n epsilon\ncaf\u00e9 \u20ac delta na\u00efve epsilon delta \u20ac delta \nx delta \u20ac delta na\u00efve delta x beta\u2029 epsilon \ud83d\ude00 \t beta \t alpha beta\n \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha delta\n\ud83d\ude00 \ud83d\ude00 alpha \u20ac \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\r x \t \u20ac \nbeta delta gamma gamma \ud83d\ude00 epsilon\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac epsilon delta \t\u2028\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon \t gamma\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u001cepsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma alpha caf\u00e9 beta delta \ud83d\ude00 \u20ac\u2028\t na\u00efve \t na\u00efve delta\u2029caf\u00e9 \u20ac na\u00efve alpha beta \t\n na\u00efve \ud83d\ude00 x delta \ud83d\ude00 beta caf\u00e9 na\u00efve \u20ac beta delta\ngamma \t \ud83d\ude00 \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac\ndelta \ud83d\ude00 delta\u2029delta \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 caf\u00e9\u001c\n epsilon x epsilon \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta \t epsilon beta na\u00efve\ngamma \ud83d\ude00 beta epsilon gamma caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \nna\u00efve delta epsilon \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta beta\n\n\ud83d\ude00 caf\u00e9 \u20ac \u20ac \u2028alpha \ud83d\ude00 x beta \t \ud83d\ude00 x\n\u20ac \ud83d\ude00 x \nna\u00efve delta gamma beta x x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\ud83d\ude00 gamma caf\u00e9\u000bdelta \t beta \u20ac alpha\nalpha beta \ud83d\ude00 beta epsilon\n\u20ac x\u001d\n\t \u20ac alpha \t caf\u00e9 beta \ud83d\ude00 delta epsilon \nalpha x \n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha \u20ac x x\nx caf\u00e9 beta gamma gamma na\u00efve alpha \u20ac delta\u0085", +"max_lines": 7, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "\ud83d\ude00 epsilon \t delta epsilon delta\nbeta \u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta na\u00efve alpha \u20ac \t epsilon beta\nepsilon alpha\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 na\u00efve epsilon caf\u00e9 \ud83d\ude00\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\nepsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\n\nalpha epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta\nepsilon \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \r\t \u20ac alpha \ncaf\u00e9 delta \t epsilon caf\u00e9 \u20ac \u20ac\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dgamma na\u00efve \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\r\n\ncaf\u00e9 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon delta \ud83d\ude00 \nalpha\u000b caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta \ud83d\ude00 \t epsilon epsilon epsilon\u001ddelta x\u2029\ud83d\ude00 caf\u00e9 beta caf\u00e9 na\u00efve \ud83d\ude00 \t \ud83d\ude00\n beta alpha alpha caf\u00e9 beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon epsilon beta \u20ac epsilon beta \ud83d\ude00 delta beta epsilon alpha alpha\n\ud83d\ude00 beta beta caf\u00e9 na\u00efve alpha \u20ac \u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta gamma \t epsilon\n\u0085\r\nna\u00efve\n beta epsilon \ngamma alpha gamma x \ud83d\ude00 \t \ud83d\ude00 gamma\u001dbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta caf\u00e9 \u20ac alpha gamma\n\u20ac beta caf\u00e9 \t\u2029na\u00efve beta alpha gamma \u20ac epsilon gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \ud83d\ude00 gamma delta alpha alpha epsilon beta\nepsilon delta delta \ud83d\ude00 delta x na\u00efve caf\u00e9 alpha alpha\u0085x beta na\u00efve\n\u20ac \ud83d\ude00 delta \ud83d\ude00 beta \u20ac x delta\nna\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha epsilon \t \u20ac alpha na\u00efve gamma na\u00efve\nepsilon \ud83d\ude00 \u20ac delta \r \ud83d\ude00 \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\t na\u00efve \ncaf\u00e9 \u20ac\r\ud83d\ude00 caf\u00e9 \u2029caf\u00e9 epsilon beta\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha epsilon gamma \ud83d\ude00 x \t\u2029na\u00efve gamma \ud83d\ude00\nalpha beta \ud83d\ude00 \u20ac beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac \u20ac\n\nepsilon beta\nalpha\ngamma \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve alpha gamma \t\n na\u00efve\n\ud83d\ude00 caf\u00e9 \u20ac \u20ac beta gamma epsilon epsilon\nepsilon delta\u2028\ud83d\ude00 delta na\u00efve caf\u00e9 epsilon \u20ac alpha x \n caf\u00e9 delta epsilon na\u00efve\ngamma caf\u00e9 x alpha delta\u001c\u20ac \ud83d\ude00 caf\u00e9 beta caf\u00e9 \t epsilon \ud83d\ude00 \t \u20ac\ngamma\n\u20ac \ud83d\ude00 gamma na\u00efve alpha x caf\u00e9 na\u00efve beta alpha\nalpha alpha \t x beta alpha caf\u00e9 na\u00efve \ud83d\ude00 \ngamma \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta \t\n\n na\u00efve alpha \ud83d\ude00 x caf\u00e9 beta epsilon\n \t beta \t delta alpha\n\t caf\u00e9 x x\n\ud83d\ude00 epsilon \t \ud83d\ude00 gamma gamma gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nx \ud83d\ude00 delta\nx beta \t caf\u00e9 \t \ud83d\ude00 alpha na\u00efve\u2029beta\nepsilon na\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u001e\t \t alpha \t \ud83d\ude00 \ncaf\u00e9 beta gamma gamma beta alpha\n epsilon gamma epsilon \nalpha\n \u20ac \t gamma\nbeta gamma gamma \t \t \t \t \u20ac\nbeta alpha \u20ac\n \u2028beta epsilon na\u00efve caf\u00e9 epsilon x beta caf\u00e9\nna\u00efve \ud83d\ude00 caf\u00e9 x delta\ncaf\u00e9 \ud83d\ude00 \ud83d\ude00 epsilon delta alpha gamma \ud83d\ude00 x\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \t \u20ac\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 \u2028na\u00efve na\u00efve na\u00efve \ud83d\ude00\u001c\u20ac\u000b\t epsilon na\u00efve delta \u20ac \ud83d\ude00 alpha \ud83d\ude00 gamma \u20ac\nalpha beta \t beta gamma na\u00efve caf\u00e9\ndelta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac alpha \t x x \u20ac \u20ac\n\u20ac x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fna\u00efve x gamma \t beta\nbeta epsilon alpha caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \n epsilon beta \t\nepsilon\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 caf\u00e9 \u20ac \u20ac\nna\u00efve \ud83d\ude00 gamma beta gamma na\u00efve\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha caf\u00e9 \u20ac \u20ac \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 beta epsilon\n\u20ac gamma alpha x epsilon \t caf\u00e9 delta gamma epsilon\nna\u00efve\n\ud83d\ude00 x gamma\u001d\u20ac na\u00efve epsilon alpha beta x na\u00efve delta epsilon\r\n caf\u00e9 \t \t na\u00efve beta \t alpha gamma\n\u20ac gamma \t caf\u00e9 \ud83d\ude00 delta\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma\u001c\nx na\u00efve \ud83d\ude00 delta \u20ac epsilon \t\nalpha na\u00efve na\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u2028\u20ac gamma \ud83d\ude00 \t gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve caf\u00e9\nbeta na\u00efve caf\u00e9\u001e longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 caf\u00e9 alpha na\u00efve \t\u2028 epsilon epsilon na\u00efve alpha x delta gamma\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha \u0085 \ndelta epsilon x x beta \ud83d\ude00 na\u00efve alpha na\u00efve alpha x\n\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x\nbeta alpha epsilon \u20ac\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve alpha \u20ac na\u00efve\u001c\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve \ud83d\ude00 caf\u00e9 \t epsilon\nna\u00efve epsilon \u20ac x alpha alpha\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma x na\u00efve x\ncaf\u00e9\nbeta alpha \ud83d\ude00\nna\u00efve alpha alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x alpha delta\n\t gamma \t epsilon x x delta epsilon beta\nx gamma \ud83d\ude00 gamma beta\n x caf\u00e9 \u20ac beta beta\n\n\u20ac epsilon alpha alpha \ud83d\ude00 beta na\u00efve gamma\fgamma \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\t gamma gamma\ncaf\u00e9 \ud83d\ude00 alpha \t alpha alpha \ud83d\ude00\u001e\u20ac beta beta beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u001d \t \u20ac gamma gamma delta epsilon caf\u00e9\ndelta caf\u00e9 caf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n beta alpha delta beta delta na\u00efve\n \ud83d\ude00 epsilon delta beta\ndelta caf\u00e9 \t alpha \t gamma alpha beta\u001c", +"max_lines": 7, +"overlap": 0, +"max_chars": 4000 +}, +{ +"text": "alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u2029\u20ac \u20ac\u001depsilon caf\u00e9 na\u00efve \n\t \t delta caf\u00e9\u2028na\u00efve x\n\u20ac \u20ac \u20ac \u20ac \u20ac \ud83d\ude00 gamma beta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\ud83d\ude00\u000bx x \ud83d\ude00\u001e\t\u2029\t x alpha \u20ac \t gamma caf\u00e9\nalpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ndelta \ud83d\ude00 na\u00efve\nbeta \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon delta\nna\u00efve \nepsilon x \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac epsilon epsilon beta delta alpha delta caf\u00e9 delta x\n na\u00efve x x epsilon caf\u00e9 \nepsilon gamma na\u00efve delta \t \ud83d\ude00 gamma \ud83d\ude00 na\u00efve\n\u20ac na\u00efve \n", +"max_lines": 13, +"overlap": 5, +"max_chars": 4000 +}, +{ +"text": "", +"max_lines": 7, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "\u20ac \u20ac x \t alpha beta \ud83d\ude00 delta\nepsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta epsilon \u20ac beta epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon na\u00efve \t x na\u00efve gamma gamma\nepsilon beta \t\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha epsilon \ud83d\ude00 gamma gamma \ud83d\ude00 \ud83d\ude00 na\u00efve x\u001dgamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha\nbeta gamma na\u00efve alpha \t \ud83d\ude00\n\t alpha caf\u00e9 \ud83d\ude00 gamma beta na\u00efve beta alpha beta\n \ud83d\ude00 \t \nx\n caf\u00e9 \nbeta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\t alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u0085gamma \ud83d\ude00 \u20ac\u001cgamma alpha beta\n x \nbeta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta \u20ac gamma \ud83d\ude00 \r\n\u20ac \t \u20ac caf\u00e9 gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n gamma gamma\n caf\u00e9 na\u00efve x \u20ac\n\ud83d\ude00 gamma caf\u00e9 epsilon\fepsilon gamma alpha epsilon\u001dna\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve\nalpha delta gamma na\u00efve caf\u00e9 alpha\nbeta gamma delta \u20ac delta \ud83d\ude00 \nalpha\r\ud83d\ude00 alpha alpha\n\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve \u20ac gamma caf\u00e9\r\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon \t na\u00efve \t\n \u20ac delta delta\n\t delta delta beta alpha x\rbeta delta delta \u20ac beta x \ud83d\ude00 epsilon \r\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma beta\u0085beta \t\ncaf\u00e9 beta alpha gamma \ud83d\ude00 \ndelta \u20ac na\u00efve delta \ud83d\ude00 \ud83d\ude00 gamma beta\n epsilon alpha \ud83d\ude00 x\rx \t \t x beta alpha alpha \u20ac \ud83d\ude00\nepsilon \ud83d\ude00 delta epsilon delta \nbeta\u0085\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x x\ncaf\u00e9 x x \u20ac \ud83d\ude00\n\nna\u00efve delta alpha epsilon \ud83d\ude00 na\u00efve caf\u00e9 epsilon \t\n\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta \r\u20ac x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha alpha \ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha \ud83d\ude00\ngamma \ud83d\ude00 \t \flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma\nna\u00efve epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 beta \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x\u001ex x \t na\u00efve alpha \ud83d\ude00\u001depsilon \t alpha delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x delta epsilon beta \ud83d\ude00 \t alpha \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma na\u00efve x \t na\u00efve delta \ud83d\ude00 \u20ac\u001e epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma delta \t alpha caf\u00e9\ncaf\u00e9 na\u00efve x epsilon caf\u00e9 caf\u00e9 beta caf\u00e9 na\u00efve \u20ac\nepsilon \ud83d\ude00 x x na\u00efve \u20ac na\u00efve gamma epsilon\ngamma\nx \ud83d\ude00 epsilon epsilon \ud83d\ude00 caf\u00e9 na\u00efve\ndelta epsilon \t epsilon alpha epsilon \u20ac caf\u00e9 \u20ac\nepsilon beta\n\t\n\t beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha epsilon \u2028caf\u00e9 \u20ac gamma epsilon x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x\n \t caf\u00e9 alpha delta caf\u00e9\n\t \ud83d\ude00 alpha alpha epsilon \ud83d\ude00 gamma \u20ac \t\u2028 \t caf\u00e9 na\u00efve\nbeta x \u20ac delta beta\n delta\nna\u00efve \u20ac caf\u00e9 \ud83d\ude00 delta alpha delta \u20ac caf\u00e9 \ncaf\u00e9 alpha epsilon delta\nna\u00efve delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx beta beta epsilon\n\ud83d\ude00 beta\n\rbeta caf\u00e9 \ud83d\ude00 \t alpha\ncaf\u00e9 na\u00efve\nalpha alpha \ud83d\ude00 \ud83d\ude00 beta beta caf\u00e9 alpha x gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon x epsilon\ndelta \u20ac gamma na\u00efve epsilon caf\u00e9 alpha epsilon gamma\n\ud83d\ude00 beta delta gamma \ud83d\ude00 delta delta x \ud83d\ude00 \u20ac \ud83d\ude00\nna\u00efve gamma \u20ac \u20ac alpha beta gamma \ud83d\ude00\n beta x na\u00efve na\u00efve caf\u00e9 gamma\ncaf\u00e9 \t \ncaf\u00e9 \u20ac epsilon alpha na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac caf\u00e9 delta \t \ud83d\ude00 \n\u20ac caf\u00e9 gamma beta alpha\u001cgamma gamma \t alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001c beta na\u00efve x \nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 epsilon beta\n gamma epsilon \u20ac x x alpha beta\u2029\n\t gamma beta na\u00efve \u20ac \t\n\u20ac \t x\n\ud83d\ude00 na\u00efve gamma \t \ud83d\ude00 gamma \u20ac na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma caf\u00e9 beta caf\u00e9 \nepsilon caf\u00e9 \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve \t alpha \ud83d\ude00\n\ud83d\ude00\n\u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\r\n\u2029beta na\u00efve \t epsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 x\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\ndelta \u20ac gamma caf\u00e9\n", +"max_lines": 7, +"overlap": 1, +"max_chars": 120 +}, +{ +"text": "gamma \t epsilon \ud83d\ude00 \u20ac na\u00efve\ndelta beta \nbeta \t x caf\u00e9\nx \t caf\u00e9 gamma alpha caf\u00e9 x \t\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 120 +}, +{ +"text": "epsilon gamma epsilon \t beta gamma caf\u00e9 gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta\ndelta \t epsilon gamma\n beta na\u00efve \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9\nalpha gamma\n\rgamma \u20ac\r\u20ac na\u00efve\n\nx epsilon caf\u00e9 epsilon \ud83d\ude00\n \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta \t\n", +"max_lines": 7, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": "alpha beta epsilon\n x delta caf\u00e9 \ud83d\ude00 beta epsilon \u20ac \ud83d\ude00 epsilon\u2028x x alpha epsilon na\u00efve delta\nbeta\u000bdelta \ud83d\ude00 delta\n\ud83d\ude00 \ud83d\ude00\n\nna\u00efve \ud83d\ude00 gamma caf\u00e9 epsilon \t \nx \u2028epsilon \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta beta \nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 gamma \nbeta alpha caf\u00e9 epsilon \u20ac\n\u0085x caf\u00e9\nx \ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \n\ud83d\ude00 beta epsilon\nna\u00efve beta na\u00efve gamma x\u001ecaf\u00e9 delta epsilon beta caf\u00e9 caf\u00e9 \t x beta epsilon \nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\ud83d\ude00 caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve \u20ac beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac delta epsilon epsilon epsilon gamma\nepsilon gamma caf\u00e9 alpha\f\u20ac\u2028x\u0085\t \t \ud83d\ude00\n\t na\u00efve epsilon \t x beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 alpha caf\u00e9 x delta alpha \t x caf\u00e9\n\t alpha alpha \ud83d\ude00 \u20ac \t \t epsilon alpha\n delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve epsilon epsilon\u001ecaf\u00e9 beta caf\u00e9 epsilon gamma\ndelta alpha epsilon alpha beta caf\u00e9 \ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\u2029x epsilon delta delta alpha\nbeta delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \t \t \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 x na\u00efve \u20ac epsilon gamma \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t gamma delta \ud83d\ude00\nx \t \ud83d\ude00 x beta epsilon \fepsilon alpha beta \ud83d\ude00 alpha \u20ac delta beta \u20ac \ud83d\ude00\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma alpha na\u00efve na\u00efve \u20ac alpha \t \ud83d\ude00\u001d\n caf\u00e9 epsilon x gamma \t \ud83d\ude00 \n\u20ac caf\u00e9 epsilon gamma beta beta epsilon\u001e\t \t \t \ud83d\ude00\n \u20ac na\u00efve \t caf\u00e9 \t alpha x \ud83d\ude00 beta\u001ecaf\u00e9 \ud83d\ude00 \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001c\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n epsilon alpha \u20ac delta x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n caf\u00e9 na\u00efve na\u00efve alpha \t \ud83d\ude00 \t epsilon\u001c caf\u00e9 caf\u00e9 na\u00efve x \ud83d\ude00 beta delta alpha alpha epsilon\u001ddelta na\u00efve alpha \ud83d\ude00 caf\u00e9 alpha beta\n\u20ac na\u00efve \nx delta \u20ac epsilon na\u00efve na\u00efve \ud83d\ude00\ndelta caf\u00e9 \ud83d\ude00 \t\n\ncaf\u00e9 \t beta\r\ncaf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00\n\u20ac beta\u0085\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ncaf\u00e9 caf\u00e9 beta \t delta \ud83d\ude00 \t\u0085caf\u00e9\ndelta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \ud83d\ude00 na\u00efve gamma \u20ac \t na\u00efve na\u00efve \ud83d\ude00 \nx epsilon epsilon beta na\u00efve alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon gamma \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve \t \u20ac\n\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta delta beta \t epsilon\nepsilon x caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta \u20ac caf\u00e9 gamma caf\u00e9\n\ud83d\ude00 delta x delta x x\fcaf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac\n \ud83d\ude00 \u20ac \ud83d\ude00 na\u00efve\rna\u00efve \ud83d\ude00 na\u00efve \ud83d\ude00 x epsilon \u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x \ud83d\ude00\u001dna\u00efve gamma \t\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \u20ac epsilon \nbeta \u20ac alpha \t na\u00efve na\u00efve beta beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nepsilon \t caf\u00e9 \t\u001dbeta x gamma x caf\u00e9\nx delta epsilon \u20ac epsilon x alpha\u2029\u20ac x na\u00efve delta\u0085gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u000b x x beta \t gamma beta caf\u00e9 na\u00efve beta gamma\n\t na\u00efve \u20ac alpha \u20ac\nna\u00efve epsilon alpha na\u00efve alpha \t gamma \t caf\u00e9 caf\u00e9\nna\u00efve delta gamma \t alpha \u20ac na\u00efve delta \t\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha caf\u00e9 epsilon \t x \u2028x alpha caf\u00e9 \ud83d\ude00 alpha alpha\nepsilon alpha\nna\u00efve\ncaf\u00e9 x na\u00efve \ud83d\ude00 alpha beta x caf\u00e9 delta\nalpha \ud83d\ude00 \ud83d\ude00 x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029 gamma alpha alpha beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x gamma\n\u20ac delta x \t gamma na\u00efve \nna\u00efve \u20ac\n x alpha epsilon caf\u00e9 na\u00efve alpha epsilon caf\u00e9 \ncaf\u00e9 epsilon \t na\u00efve beta \u20ac na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha alpha epsilon caf\u00e9 caf\u00e9 alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n epsilon \u20ac x alpha \u20ac \u20ac \u20ac caf\u00e9 \ud83d\ude00\ncaf\u00e9 alpha epsilon \u20ac \t \t caf\u00e9 delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon\f \u2029delta epsilon epsilon na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t beta na\u00efve caf\u00e9 \ud83d\ude00 gamma\nepsilon \t alpha \t x x beta \t alpha\u2028\t epsilon delta\nalpha alpha x gamma beta alpha alpha na\u00efve x\u001c\ud83d\ude00 x gamma \ud83d\ude00 \u20ac x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t x \u20ac\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon epsilon epsilon na\u00efve \t epsilon \u20ac\n\n\ud83d\ude00 beta gamma beta alpha na\u00efve delta na\u00efve delta na\u00efve\n\ngamma \u20ac \ud83d\ude00 x\ndelta \ud83d\ude00 \u20ac\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nbeta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta na\u00efve caf\u00e9 beta \u20ac\n\ud83d\ude00 epsilon \ud83d\ude00 delta delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta x gamma beta \t alpha \ud83d\ude00 \u20ac x\n epsilon delta gamma \t \t\ndelta epsilon \ud83d\ude00 caf\u00e9 beta\u2029delta epsilon epsilon na\u00efve delta epsilon beta delta\n na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \nx\u0085caf\u00e9\nalpha alpha gamma delta \ndelta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nbeta delta gamma alpha gamma\n\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t\nbeta beta na\u00efve caf\u00e9 alpha \t alpha \t \u20ac\n", +"max_lines": 1, +"overlap": 5, +"max_chars": 17 +}, +{ +"text": "epsilon\nna\u00efve \u20ac beta caf\u00e9 x \ud83d\ude00 \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 delta delta\f\ud83d\ude00 \u000b gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u2029epsilon na\u00efve x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dgamma x \ud83d\ude00 beta\nx \n\u20ac \u20ac delta \t \u20ac epsilon\n\ud83d\ude00 delta delta \u20ac \ud83d\ude00 delta \ud83d\ude00 na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta alpha epsilon x\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha beta x \t\ncaf\u00e9 \ud83d\ude00 \u20ac gamma epsilon caf\u00e9 beta alpha \ud83d\ude00 epsilon\n\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha na\u00efve delta\n \fna\u00efve na\u00efve x gamma x caf\u00e9 alpha epsilon\u000bcaf\u00e9 \u20ac \ud83d\ude00\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon x gamma\nbeta na\u00efve na\u00efve delta beta alpha alpha\nbeta delta gamma epsilon \t beta caf\u00e9 \t\n\nepsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nalpha gamma\n\u20ac epsilon alpha x caf\u00e9 epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta alpha x\u001e epsilon epsilon epsilon alpha \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha\ncaf\u00e9 alpha caf\u00e9 epsilon delta gamma\nx gamma na\u00efve x \u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\ngamma epsilon\nx caf\u00e9 caf\u00e9 \u20ac\n\t gamma delta na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve\n\t alpha beta gamma \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma\nbeta x gamma beta delta beta delta\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma \t na\u00efve\nx epsilon gamma gamma gamma\nx gamma \t epsilon \ud83d\ude00 gamma alpha \t\n na\u00efve epsilon\n\ud83d\ude00 \t caf\u00e9 \u20ac beta\nbeta delta delta\nepsilon alpha gamma x na\u00efve caf\u00e9 caf\u00e9 alpha x\nbeta alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon\ncaf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \t \t\nx\nbeta beta na\u00efve gamma caf\u00e9 na\u00efve \u20ac\nepsilon beta gamma x \u20ac alpha\fdelta \t gamma epsilon \u20ac gamma \nbeta\ndelta \u20ac caf\u00e9 alpha alpha gamma caf\u00e9 caf\u00e9 caf\u00e9\ngamma beta \u0085 na\u00efve alpha \u20ac \u20ac gamma \u20ac epsilon gamma \u20ac\n\n beta \t x delta\u2029delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve caf\u00e9 x epsilon alpha alpha\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve x \ud83d\ude00 \ngamma alpha alpha \t \u20ac \t epsilon \u20ac \u20ac\nepsilon caf\u00e9 beta alpha epsilon x caf\u00e9\n\nepsilon na\u00efve x \ud83d\ude00 caf\u00e9 \ud83d\ude00 caf\u00e9\nna\u00efve x \u20ac \u20ac\rbeta \u20ac x caf\u00e9 \u20ac delta \u20ac alpha \nbeta \u20ac na\u00efve x na\u00efve \t\nx x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon beta delta \ud83d\ude00 \u20ac\u000bna\u00efve alpha epsilon \u20ac beta \t \t na\u00efve\n\ud83d\ude00\u2029epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x na\u00efve\n\ud83d\ude00\n\nx na\u00efve \ud83d\ude00\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t \ndelta \t gamma beta alpha na\u00efve \u2029 alpha beta delta delta alpha delta \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\n gamma beta epsilon gamma gamma \t delta \u20ac \ud83d\ude00\u001ealpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028alpha alpha alpha \ud83d\ude00 caf\u00e9\nepsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nx \t na\u00efve \u20ac alpha \t na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \u20ac \u20ac epsilon delta \u20ac\nalpha gamma gamma na\u00efve \ud83d\ude00 x delta epsilon alpha epsilon\n delta delta\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n na\u00efve \ud83d\ude00 x\n", +"max_lines": 13, +"overlap": 0, +"max_chars": 120 +}, +{ +"text": "\t epsilon alpha beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\u20ac \ud83d\ude00 delta alpha \u20ac\u001eepsilon caf\u00e9 \u20ac caf\u00e9\u001dcaf\u00e9 caf\u00e9 na\u00efve na\u00efve \r\n\r\n delta \u20ac epsilon beta x \t na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha caf\u00e9 epsilon x \u20ac caf\u00e9 gamma \ngamma beta caf\u00e9 x \u20ac beta epsilon x x epsilon x delta\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta delta \ud83d\ude00 \u20ac\nbeta epsilon x\u001d\u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac alpha gamma beta \u20ac gamma\nalpha \ud83d\ude00 \ud83d\ude00 gamma delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve \t epsilon\n\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x delta \ud83d\ude00 x na\u00efve na\u00efve beta delta\n\u20ac gamma \ud83d\ude00 alpha delta epsilon caf\u00e9 gamma epsilon gamma\nx na\u00efve delta\nbeta beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u2028alpha\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 delta \ud83d\ude00 epsilon x gamma\n\u20ac caf\u00e9 \ud83d\ude00 gamma delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x epsilon\n\t na\u00efve na\u00efve \nx delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 gamma \t\ncaf\u00e9 epsilon gamma \ud83d\ude00 \u20ac\n na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha beta na\u00efve beta epsilon \ud83d\ude00 na\u00efve\n\ud83d\ude00 caf\u00e9 x \ud83d\ude00 beta na\u00efve \ud83d\ude00 na\u00efve caf\u00e9 alpha\u0085\u20ac caf\u00e9 epsilon gamma \u20ac epsilon caf\u00e9 epsilon na\u00efve \n\t alpha epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta\fgamma caf\u00e9 \t beta caf\u00e9\n\u20ac \t\r\n na\u00efve delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma na\u00efve epsilon delta caf\u00e9\u000bdelta delta x caf\u00e9 beta \ud83d\ude00 alpha epsilon\ngamma\ndelta \f\u20ac epsilon caf\u00e9\ncaf\u00e9 x caf\u00e9 epsilon na\u00efve delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\ndelta caf\u00e9 delta gamma caf\u00e9\ngamma na\u00efve \t gamma \t \u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n gamma \n\ud83d\ude00 \t caf\u00e9 na\u00efve x x beta caf\u00e9\u001egamma\n\u20ac \u20ac \t epsilon gamma x\n\u20ac na\u00efve \u20ac caf\u00e9 epsilon na\u00efve epsilon \ud83d\ude00 gamma\nalpha gamma beta \u20ac alpha beta beta gamma \ud83d\ude00 x alpha\n\u20ac \ud83d\ude00 alpha \t beta \u20ac\n \ud83d\ude00 beta delta na\u00efve \ud83d\ude00 \t \u20ac \n\ud83d\ude00\n delta gamma delta na\u00efve \u20ac \ud83d\ude00\nna\u00efve\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t x na\u00efve\n", +"max_lines": 7, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": " caf\u00e9 \u2029 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta x\r\nx \ud83d\ude00 \u20ac caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u2029alpha beta delta delta caf\u00e9 na\u00efve \t \u20ac na\u00efve\nna\u00efve beta \ud83d\ude00 \t \t delta caf\u00e9 \u20ac caf\u00e9 \u20ac\n\ud83d\ude00 epsilon beta \u20ac\ncaf\u00e9 x \ud83d\ude00 beta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma\n\n\nx na\u00efve caf\u00e9 \t caf\u00e9 delta\ngamma alpha \u20ac gamma \ud83d\ude00 epsilon \ngamma epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u001ena\u00efve caf\u00e9 x epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon\u2029delta \n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nepsilon\u2029 caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve delta epsilon x \ud83d\ude00 na\u00efve\n na\u00efve epsilon alpha\n\ud83d\ude00 gamma alpha\nx caf\u00e9 \u20ac \ud83d\ude00 x na\u00efve caf\u00e9 caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon beta\u001ccaf\u00e9 caf\u00e9 beta caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x\n\u20ac\n\t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha \u20ac\nalpha \t alpha \ud83d\ude00 gamma\ndelta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\ud83d\ude00 \ud83d\ude00 gamma caf\u00e9 delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u2028\u20ac delta \t na\u00efve \ud83d\ude00 x\u001dbeta na\u00efve gamma\ngamma epsilon x alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u2029 x caf\u00e9 beta \u001c\t na\u00efve caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\u0085x\r\ndelta caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ncaf\u00e9 delta alpha delta \u20ac delta caf\u00e9\ncaf\u00e9 epsilon epsilon epsilon \u20ac \nepsilon\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac beta\n\r\n\f\u20ac \t epsilon x na\u00efve alpha \u001dalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha\n\ud83d\ude00 gamma\nalpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\nx \u20ac\ralpha \t caf\u00e9 epsilon \t\nepsilon\n\t beta na\u00efve\n x alpha\ngamma alpha beta x epsilon \t na\u00efve\nx \u2029\ud83d\ude00 beta caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon beta na\u00efve\nna\u00efve\nx alpha delta beta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\t beta x beta \t\n \u20ac \ud83d\ude00 \u20ac delta \ud83d\ude00 \u20ac\u2029 \t delta alpha\nalpha delta x caf\u00e9 alpha na\u00efve x\u2028 \t \ud83d\ude00 delta gamma x beta alpha delta\ncaf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha\ngamma \nalpha \n\t alpha delta epsilon epsilon na\u00efve\u2028\ncaf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nepsilon \ud83d\ude00 gamma epsilon \t \t beta caf\u00e9 gamma beta\ngamma alpha gamma caf\u00e9 \t\ngamma delta\nna\u00efve delta alpha delta caf\u00e9 alpha gamma \u20ac\nepsilon caf\u00e9 epsilon epsilon \u20ac gamma \ud83d\ude00 beta gamma\n delta \n\ud83d\ude00 \ud83d\ude00 \ud83d\ude00 \t epsilon epsilon \u20ac \ud83d\ude00 \t \ud83d\ude00\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon\nx caf\u00e9 beta alpha epsilon \u20ac beta\n \ud83d\ude00 epsilon delta gamma beta x epsilon \t\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta \t\nalpha beta \t caf\u00e9 caf\u00e9 \ud83d\ude00 \t\n \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\ndelta \t \t \u20ac epsilon\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\ud83d\ude00 gamma delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve alpha beta\n\nepsilon beta delta epsilon epsilon \n\ndelta alpha \t\nalpha \t alpha delta x caf\u00e9 na\u00efve\n\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon gamma gamma\n\ngamma na\u00efve caf\u00e9 gamma\nalpha\nbeta delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac na\u00efve delta\nx \ndelta epsilon\n\u20ac gamma delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\ud83d\ude00 caf\u00e9 delta gamma x\ndelta epsilon alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t \ud83d\ude00 \u20ac x \t \nx \u20ac x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta alpha na\u00efve x x\nepsilon caf\u00e9 x epsilon delta \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 x gamma x epsilon \u20ac\n delta gamma \t \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \n\t beta na\u00efve \u20ac caf\u00e9 caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00\n\ud83d\ude00 epsilon epsilon caf\u00e9 alpha epsilon epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n \u000bx \ud83d\ude00 \n\ud83d\ude00 caf\u00e9 epsilon gamma delta gamma \ud83d\ude00 beta na\u00efve beta delta\ngamma \ud83d\ude00 \r\n\ud83d\ude00 epsilon delta alpha alpha \u20ac\u001cna\u00efve alpha na\u00efve delta delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon epsilon alpha na\u00efve x gamma delta \t epsilon beta \ud83d\ude00\ndelta x na\u00efve \ud83d\ude00\u2029gamma caf\u00e9 na\u00efve gamma na\u00efve\n\u20ac \ud83d\ude00 x na\u00efve gamma epsilon\ngamma epsilon na\u00efve \nepsilon \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac x x caf\u00e9 delta\nna\u00efve epsilon alpha delta beta x alpha\rcaf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 caf\u00e9 gamma delta \ud83d\ude00 alpha caf\u00e9 epsilon na\u00efve delta \u20ac\nna\u00efve delta alpha x epsilon epsilon delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nna\u00efve \ud83d\ude00 \u001e\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta caf\u00e9 delta x epsilon alpha x \u20ac \t \ud83d\ude00 epsilon\n \ud83d\ude00 delta \ud83d\ude00 \u20ac beta \ud83d\ude00 delta \u20ac \ralpha \u20ac x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha\r\nalpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve \t \n", +"max_lines": 2, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "caf\u00e9 na\u00efve \t \ud83d\ude00 caf\u00e9 \ud83d\ude00 \u20ac \nepsilon \u20ac alpha \t alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta caf\u00e9\n caf\u00e9\n\u20ac na\u00efve\u001ebeta delta \t \u20ac na\u00efve\u2028\ncaf\u00e9 gamma epsilon \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon \t \u20ac alpha\n\u20ac na\u00efve \t\nx beta gamma \ud83d\ude00 beta \nbeta\n\ud83d\ude00 \t \t x caf\u00e9 na\u00efve na\u00efve gamma \ud83d\ude00 caf\u00e9\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon alpha x\u0085caf\u00e9 gamma delta \nepsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve \ud83d\ude00 \ud83d\ude00 epsilon \t\nbeta\n\nepsilon caf\u00e9\n\t gamma \u20ac alpha\r\ncaf\u00e9\n\ud83d\ude00 \ud83d\ude00\ngamma\f epsilon delta alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac epsilon delta \ud83d\ude00 caf\u00e9\r\n \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac \t alpha\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x gamma gamma\n\ud83d\ude00 na\u00efve x gamma alpha gamma\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta beta \t \ud83d\ude00 \u000bepsilon \ud83d\ude00\n\u20ac caf\u00e9 na\u00efve caf\u00e9 delta \u20ac\u001c\n caf\u00e9 \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fbeta\ngamma alpha na\u00efve\ndelta \u20ac epsilon beta beta epsilon x caf\u00e9\nalpha x\n\t epsilon delta na\u00efve caf\u00e9 \u20ac epsilon \u20ac\u001dgamma epsilon\nepsilon epsilon \u20ac delta caf\u00e9 delta caf\u00e9 \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 gamma x x gamma \t gamma\ndelta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00\r\nna\u00efve delta delta beta\n\ngamma gamma beta beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma epsilon\u2029 beta\nbeta\ngamma delta epsilon \ud83d\ude00 na\u00efve \t \ud83d\ude00 \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha \ud83d\ude00 gamma caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 caf\u00e9 na\u00efve na\u00efve \nx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx x delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t \u20ac caf\u00e9 alpha \u000b\t \t gamma caf\u00e9 na\u00efve \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \n\nna\u00efve alpha \u20ac\nepsilon \t na\u00efve gamma beta gamma epsilon beta \ud83d\ude00\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "alpha \ud83d\ude00 epsilon beta\nna\u00efve alpha alpha beta x \t na\u00efve\nbeta x gamma delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac gamma \n\t \n \ud83d\ude00 delta \t \ud83d\ude00\n\t \t epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha \t alpha beta x beta \t \u20ac alpha caf\u00e9 epsilon alpha\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve gamma\u000b\ud83d\ude00 alpha x x delta caf\u00e9 epsilon\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\ngamma gamma na\u00efve \t \u20ac \t\u001calpha\nna\u00efve x\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta gamma gamma beta \ud83d\ude00\u2029na\u00efve \u20ac \ud83d\ude00 caf\u00e9 alpha\nepsilon\n\n\ud83d\ude00 caf\u00e9 gamma \ud83d\ude00 delta \ud83d\ude00 na\u00efve\u2028alpha \t na\u00efve caf\u00e9 beta epsilon\n\ud83d\ude00 \ud83d\ude00 beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma epsilon gamma beta beta epsilon\ncaf\u00e9\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u000bna\u00efve\n\u001depsilon \u20ac na\u00efve gamma delta caf\u00e9 gamma\nepsilon epsilon epsilon na\u00efve x\n \ud83d\ude00 epsilon x delta \u20ac na\u00efve caf\u00e9 \t alpha\u001cx na\u00efve beta beta epsilon gamma delta na\u00efve caf\u00e9 epsilon \n\t\nx gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha \t \t beta \u001e na\u00efve \t na\u00efve caf\u00e9 x\n\u000bna\u00efve na\u00efve na\u00efve alpha alpha alpha gamma na\u00efve gamma\u2028\nna\u00efve caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nx\n\u20ac delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\f\t \u20ac gamma x \u20ac gamma \t na\u00efve\nalpha \u20ac\nna\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\nna\u00efve x alpha caf\u00e9 \ud83d\ude00 beta delta na\u00efve \u20ac\n alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac beta\n alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 delta epsilon epsilon delta\n \u20ac \t \t delta\ngamma beta\n\ud83d\ude00\nx \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 gamma\nalpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u000b\t beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta beta beta \t \u20ac x\ndelta\n\u20ac gamma\ndelta x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 \t beta \t \r\n beta beta alpha x \u20ac \t caf\u00e9\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma x na\u00efve\n\u20ac gamma\u001eepsilon gamma gamma \u20ac caf\u00e9 beta delta epsilon\nbeta x delta \u20ac beta epsilon \u20ac \nepsilon beta epsilon x x gamma caf\u00e9\n gamma gamma \u20ac \t \t \u20ac \u20ac epsilon\nalpha na\u00efve beta \t\r\nalpha na\u00efve delta delta gamma beta caf\u00e9 \u20ac \nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta x na\u00efve \ud83d\ude00 delta\n\t x\u000bdelta beta delta alpha \u20ac gamma\r\nbeta \t\u001cx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha na\u00efve \ud83d\ude00 caf\u00e9 epsilon\u001ena\u00efve beta \t \t na\u00efve gamma x\n\r\n\nx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \ud83d\ude00\n\u20ac gamma na\u00efve beta \u20ac gamma x gamma gamma\n\t epsilon\r\nalpha\r\n\u001e\t delta \u20ac delta na\u00efve gamma na\u00efve caf\u00e9 delta beta\nbeta alpha beta alpha beta \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t caf\u00e9 x \u20ac \t beta \t \u20ac\n gamma na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\r\nna\u00efve \u20ac beta delta \u20ac beta \ud83d\ude00 \u20ac\n epsilon epsilon\nbeta \u20ac epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta\nepsilon \t gamma x \u20ac \ud83d\ude00 beta epsilon \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\ncaf\u00e9 epsilon\ngamma epsilon \t \u20ac\n\ud83d\ude00 x alpha x gamma\n\t \u20ac gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma caf\u00e9 delta delta\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n beta x \ud83d\ude00 na\u00efve x caf\u00e9 gamma\n x\nbeta caf\u00e9 x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b\ud83d\ude00 alpha epsilon gamma \u20ac delta beta\rx delta \ud83d\ude00\u001ecaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta delta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \t \u20ac na\u00efve \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dgamma delta \u20ac na\u00efve\f\n\u20ac x \ud83d\ude00 delta gamma beta \ud83d\ude00 caf\u00e9\nepsilon\nx \u20ac epsilon epsilon gamma gamma gamma \t \t \nx \u20ac x \u20ac gamma \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\t x \t \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 \u20ac \t caf\u00e9 \ncaf\u00e9 caf\u00e9\u0085caf\u00e9 caf\u00e9 \u20ac \u20ac epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x\ndelta beta\nna\u00efve \t delta na\u00efve caf\u00e9 caf\u00e9 gamma na\u00efve na\u00efve beta \u001d\t gamma\u000b\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve delta epsilon \t delta gamma caf\u00e9 \t\u2028na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon\nna\u00efve \u20ac na\u00efve alpha caf\u00e9 na\u00efve caf\u00e9 delta \ud83d\ude00 \t \u20ac \t\n \ud83d\ude00\ndelta \t delta \t alpha beta beta epsilon\n\t gamma\nx beta x\nalpha beta \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve\n\t \ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve x beta alpha alpha \ud83d\ude00 epsilon \u20ac\n\ud83d\ude00 epsilon delta \n beta caf\u00e9 alpha beta \t epsilon caf\u00e9 beta\u001ex \t x\ndelta na\u00efve na\u00efve gamma\n\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \nbeta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta x \t delta\n epsilon \ud83d\ude00 caf\u00e9 beta \ud83d\ude00 \t x\nepsilon gamma caf\u00e9 delta na\u00efve gamma delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ncaf\u00e9 beta gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve na\u00efve \t\n\u2029\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma\nalpha alpha \ud83d\ude00 na\u00efve gamma beta\n\t \u20ac beta alpha \ud83d\ude00 \u20ac \t \u20ac beta \t\n", +"max_lines": 13, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "gamma alpha epsilon epsilon\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta \t delta na\u00efve \u20ac caf\u00e9 x\rna\u00efve \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b\ud83d\ude00 epsilon gamma \t \u20ac beta gamma gamma caf\u00e9 delta\n\t na\u00efve \t na\u00efve epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \u20ac\n\u001c\ud83d\ude00 epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \t\u0085epsilon delta na\u00efve caf\u00e9\u2029epsilon beta\nepsilon x na\u00efve epsilon \t beta \ud83d\ude00 \ud83d\ude00 na\u00efve beta x\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t \ud83d\ude00 epsilon caf\u00e9 \n\ud83d\ude00 delta\fdelta \u20ac na\u00efve \t\u001d\rgamma \u001d\t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta alpha \ud83d\ude00 epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx na\u00efve caf\u00e9 beta na\u00efve \u20ac\ndelta epsilon x beta gamma \u20ac\u0085\t \ud83d\ude00 \u20ac \nepsilon alpha caf\u00e9 \t delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma\n\u20ac na\u00efve caf\u00e9 na\u00efve gamma beta \t \ud83d\ude00 na\u00efve caf\u00e9 \u2028x \t delta x\nna\u00efve\u001d\ud83d\ude00 \t \ud83d\ude00\ndelta \t \ud83d\ude00 beta \ud83d\ude00 \ud83d\ude00 x \nbeta epsilon gamma caf\u00e9 epsilon \u0085 na\u00efve beta \t alpha \t beta\u2029\t beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha \t \n \ud83d\ude00 \ud83d\ude00 beta na\u00efve x \u20ac caf\u00e9 na\u00efve \t\nx epsilon epsilon gamma x delta epsilon caf\u00e9 delta \t \u20ac beta\u001d\ndelta delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon\n\u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\ngamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac caf\u00e9 \u20ac beta \ud83d\ude00 epsilon \u20ac \ud83d\ude00 x\n\t \t\nx \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t delta\nbeta na\u00efve \t na\u00efve epsilon \ud83d\ude00 alpha gamma\n alpha \u20ac \u20ac epsilon \u20ac \u20ac\n alpha delta epsilon x beta\nalpha alpha gamma gamma\u0085\ud83d\ude00 gamma caf\u00e9 delta \t caf\u00e9 x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\r caf\u00e9 epsilon x epsilon epsilon\n\ud83d\ude00 \n\t\nepsilon\ngamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta \ud83d\ude00 \t delta \t\nbeta \u20ac beta x x epsilon alpha delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\fcaf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\ud83d\ude00 delta gamma x \t gamma\nx delta x\u001ccaf\u00e9 epsilon beta gamma caf\u00e9\fna\u00efve\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t epsilon x beta\n \t\n\u20ac na\u00efve \t\u001e\ud83d\ude00\n\u000b\u20ac x \ud83d\ude00 \t\n \ud83d\ude00 epsilon caf\u00e9 na\u00efve delta na\u00efve\nbeta caf\u00e9 gamma caf\u00e9 alpha delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u001d\ud83d\ude00 \u20ac \ud83d\ude00 delta x \t caf\u00e9 beta \ud83d\ude00\u001e\t epsilon \t \ud83d\ude00\nalpha beta caf\u00e9 x beta caf\u00e9 na\u00efve \ud83d\ude00 \u20ac delta \nx \t \t gamma delta delta x beta \t\nalpha x \t \u20ac gamma \u20ac \ud83d\ude00 caf\u00e9\ncaf\u00e9 \t alpha epsilon x caf\u00e9 \t na\u00efve\nbeta epsilon na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma delta \t\n\t epsilon delta \t beta alpha beta alpha gamma caf\u00e9 \ud83d\ude00 alpha\n delta\ngamma na\u00efve x caf\u00e9 epsilon\n\ud83d\ude00 \ud83d\ude00\fgamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9 delta \ngamma alpha \t \ud83d\ude00 \ud83d\ude00\u2028\n \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029x caf\u00e9\u000bepsilon epsilon epsilon\nepsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u2029caf\u00e9\ngamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta alpha gamma delta alpha \ud83d\ude00\n\n\rgamma epsilon beta alpha \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha delta \u20ac x\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x\u001d\ngamma x epsilon alpha na\u00efve caf\u00e9 \n\u2029\nepsilon gamma\u001cx gamma \t epsilon alpha \t delta gamma gamma gamma\u001e\u20ac na\u00efve caf\u00e9 delta alpha\ncaf\u00e9\u000b\t \ud83d\ude00 na\u00efve beta epsilon epsilon\nepsilon x\nbeta \ud83d\ude00 gamma delta\n\t delta caf\u00e9 caf\u00e9 na\u00efve \t alpha\rcaf\u00e9\nepsilon gamma caf\u00e9 epsilon \u20ac gamma caf\u00e9\ngamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve gamma beta \ud83d\ude00 \u20ac\n\ud83d\ude00 x beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029delta beta\n gamma beta\u2029beta\u001ex na\u00efve beta \t gamma na\u00efve na\u00efve beta \u20ac \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t \u20ac beta x \u20ac beta\n\u20ac delta \u20ac x x \nx gamma \u20ac \u20ac\nna\u00efve na\u00efve\nx na\u00efve \u20ac \ud83d\ude00 na\u00efve alpha\u2028beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta \u20ac\n\u20ac beta delta epsilon \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve alpha gamma\nx alpha beta delta beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac \u20ac\ndelta epsilon \ud83d\ude00 caf\u00e9\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma\u2029epsilon\nalpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta\u2029na\u00efve x \t beta beta delta gamma beta caf\u00e9 beta \ndelta\nna\u00efve na\u00efve \t gamma caf\u00e9 na\u00efve \n\t \t x epsilon\n gamma beta \t alpha\n beta beta x \t gamma x \u001c \ud83d\ude00 \t x na\u00efve \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta na\u00efve epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon epsilon\ndelta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma\u2029\ndelta epsilon na\u00efve\nbeta alpha caf\u00e9 delta \u20ac\u001d\ud83d\ude00 caf\u00e9 x alpha na\u00efve na\u00efve delta\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nx\n", +"max_lines": 7, +"overlap": 3, +"max_chars": 120 +}, +{ +"text": "alpha \t \u20ac \nepsilon caf\u00e9 beta na\u00efve alpha gamma caf\u00e9 x caf\u00e9 x beta \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta alpha caf\u00e9 delta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta delta delta epsilon caf\u00e9\ndelta beta x alpha beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 \ud83d\ude00\u0085caf\u00e9 caf\u00e9 x gamma na\u00efve \t\n\t gamma \ud83d\ude00 delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nbeta caf\u00e9 caf\u00e9 gamma caf\u00e9 alpha x \ud83d\ude00\ngamma gamma caf\u00e9 gamma delta \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n delta \u20ac \ud83d\ude00 beta x x \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u001ecaf\u00e9 epsilon beta delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac alpha\u0085x na\u00efve na\u00efve beta alpha delta\u000b x na\u00efve na\u00efve delta \t\u0085epsilon \u20ac\n\ud83d\ude00 gamma epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\f\u20ac epsilon beta caf\u00e9 \u20ac x delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085gamma \t epsilon \t \ud83d\ude00 gamma caf\u00e9 epsilon\n\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ngamma \nalpha beta alpha gamma\nbeta delta \t epsilon na\u00efve gamma delta na\u00efve beta \nx \ud83d\ude00 delta na\u00efve x \ud83d\ude00 alpha\nepsilon epsilon \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon\n\n\u20ac \u20ac \ud83d\ude00 beta alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u001d \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\ud83d\ude00 epsilon gamma beta epsilon gamma x x alpha \nalpha na\u00efve \n\u20ac\n gamma delta delta \ud83d\ude00 alpha \u20ac \u20ac \u20ac \ud83d\ude00 \ud83d\ude00\u001cgamma\n\u20ac beta delta \ud83d\ude00\nepsilon \t \u20ac epsilon delta \ud83d\ude00 beta \u20ac\nx beta \ud83d\ude00 \t\n\ud83d\ude00 na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha alpha\u000bdelta gamma \ud83d\ude00 delta gamma alpha beta alpha na\u00efve alpha alpha x\ndelta epsilon epsilon epsilon na\u00efve na\u00efve delta x delta\n\u20ac \t\fx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\u0085\u001ddelta \ud83d\ude00 \u20ac delta \t \ud83d\ude00 delta gamma\n\ud83d\ude00 epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma beta\rbeta caf\u00e9 caf\u00e9 \u20ac delta\ndelta na\u00efve \t caf\u00e9 beta caf\u00e9 alpha epsilon\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma alpha\ndelta delta caf\u00e9 alpha\ngamma na\u00efve \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00\u001c\ud83d\ude00 \t \ud83d\ude00 \t delta \ud83d\ude00 \ud83d\ude00 alpha beta caf\u00e9 \u2028x alpha x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nalpha \t gamma na\u00efve gamma epsilon\n\r\ncaf\u00e9 delta gamma \ud83d\ude00 \u20ac gamma delta delta delta x\ncaf\u00e9 alpha \u20ac caf\u00e9 alpha x caf\u00e9 \u0085epsilon alpha x epsilon epsilon na\u00efve beta \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac alpha x delta gamma\u0085alpha \u20ac caf\u00e9\ncaf\u00e9 \u20ac \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma alpha \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\nbeta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 \t \u2028caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta beta beta alpha na\u00efve epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n epsilon\n\ud83d\ude00 caf\u00e9 x na\u00efve \t \t \u20ac\r\nbeta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta gamma na\u00efve caf\u00e9 caf\u00e9 gamma \t \t\ndelta caf\u00e9 \t \t \t na\u00efve\n \ud83d\ude00 \ud83d\ude00\ngamma delta caf\u00e9 beta alpha \ud83d\ude00\nalpha \t \ud83d\ude00 alpha \t caf\u00e9 x \ud83d\ude00 beta\nbeta caf\u00e9 beta \u20ac na\u00efve \ud83d\ude00 x \ud83d\ude00 delta\nepsilon caf\u00e9 x \ud83d\ude00 na\u00efve beta\n caf\u00e9 gamma caf\u00e9 \t na\u00efve \ud83d\ude00 alpha delta\fepsilon \ud83d\ude00 \t delta alpha na\u00efve delta\nna\u00efve \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \falpha alpha x \ud83d\ude00 \t x\u0085\ud83d\ude00 caf\u00e9 beta beta \ud83d\ude00 \u20ac \u20ac\n\ud83d\ude00 epsilon alpha\n caf\u00e9 na\u00efve \u20ac caf\u00e9 alpha epsilon \t\n\ud83d\ude00 x alpha delta na\u00efve \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nbeta\rbeta gamma \u20ac alpha beta alpha gamma \u20ac\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029 \ud83d\ude00 epsilon na\u00efve gamma\nalpha epsilon alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha x\nepsilon beta \t x gamma\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon\nna\u00efve epsilon caf\u00e9\n beta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta x na\u00efve beta \n\u2029gamma epsilon x \ud83d\ude00 caf\u00e9 \ud83d\ude00 \t\n\ud83d\ude00 \ud83d\ude00\ndelta \nbeta \ud83d\ude00 alpha\n delta beta x gamma \u20ac delta \u20ac \ud83d\ude00 \ngamma caf\u00e9 na\u00efve\nx \t na\u00efve \t\r na\u00efve \t\u001e\ncaf\u00e9 alpha \u20ac beta delta \u20ac\nepsilon alpha x alpha \n\t epsilon \t \ud83d\ude00 \ud83d\ude00 na\u00efve delta\ncaf\u00e9 \ud83d\ude00 beta\n\nx alpha caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t \u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t alpha x\n gamma x x \t alpha \u20ac\f\t beta beta \ud83d\ude00 \ud83d\ude00 epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \u20ac caf\u00e9 x gamma gamma \u20ac x caf\u00e9 delta x\nx alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma x na\u00efve alpha \t\u001cepsilon\n\nalpha\u2029 na\u00efve epsilon\ngamma x \u20ac caf\u00e9 alpha \ud83d\ude00 \ud83d\ude00 delta alpha \ud83d\ude00\u000bna\u00efve \ud83d\ude00 delta\r\nna\u00efve x x delta epsilon na\u00efve \ud83d\ude00 delta \u20ac \nepsilon epsilon gamma epsilon beta\nx caf\u00e9 na\u00efve epsilon gamma delta\nna\u00efve alpha gamma beta \fbeta caf\u00e9 x \ud83d\ude00 epsilon epsilon \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac alpha beta \ud83d\ude00 \t \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\u2029\ndelta x delta epsilon \ud83d\ude00\u000balpha gamma alpha beta \t delta alpha x caf\u00e9\n epsilon \t alpha \t \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon \u20ac\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\u001d\n beta \t na\u00efve \u20ac alpha \u20ac \u20ac na\u00efve \t\u001ddelta caf\u00e9 \u20ac \u20ac \ud83d\ude00 beta x beta \n alpha epsilon \u20ac na\u00efve \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve\ndelta x delta \ndelta na\u00efve x gamma epsilon beta delta alpha beta\n epsilon \u20ac\n\fna\u00efve caf\u00e9 x delta caf\u00e9 alpha \t caf\u00e9\falpha alpha epsilon x delta alpha \t beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha gamma x\u001d\n\ndelta \ud83d\ude00\nalpha \ud83d\ude00 beta x epsilon alpha x delta caf\u00e9 \nalpha \ud83d\ude00 \u20ac \ud83d\ude00 \u20ac gamma x caf\u00e9 gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \ud83d\ude00 caf\u00e9 delta\n\nna\u00efve na\u00efve beta beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac alpha gamma \nepsilon epsilon \ud83d\ude00\nna\u00efve \t \ud83d\ude00 gamma\n\t delta x gamma\n\t \ud83d\ude00 alpha epsilon na\u00efve delta \n caf\u00e9 gamma gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac \u20ac \ud83d\ude00\fna\u00efve delta na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac delta epsilon alpha \t caf\u00e9 gamma na\u00efve caf\u00e9 delta\r\ncaf\u00e9 epsilon \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9\nx epsilon na\u00efve x x delta na\u00efve caf\u00e9 \u20ac \n\ndelta alpha\u001ex \u20ac caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x delta delta\n caf\u00e9\n\n\u20ac epsilon na\u00efve\fna\u00efve x epsilon beta \ud83d\ude00 delta na\u00efve\n\ud83d\ude00 na\u00efve beta delta \u20ac \t \ud83d\ude00 gamma \ud83d\ude00\n \n\n", +"max_lines": 13, +"overlap": 1, +"max_chars": 300 +}, +{ +"text": " caf\u00e9 gamma epsilon x delta\u000b\t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 caf\u00e9 gamma epsilon beta \t \u20ac\ndelta na\u00efve \u20ac gamma epsilon caf\u00e9 x epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma epsilon gamma \t delta alpha \ud83d\ude00 \u20ac\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 beta \t x beta \u20ac alpha \u20ac\u2029gamma caf\u00e9 \ud83d\ude00 x na\u00efve na\u00efve na\u00efve x \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta na\u00efve alpha \ud83d\ude00 na\u00efve\n \n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 na\u00efve x\n na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha caf\u00e9 x\nna\u00efve x\n\ncaf\u00e9 na\u00efve \t na\u00efve x \ud83d\ude00 na\u00efve beta \ud83d\ude00\nalpha \u20ac na\u00efve epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n caf\u00e9 na\u00efve beta\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \ud83d\ude00 \t \t caf\u00e9 na\u00efve caf\u00e9 caf\u00e9\n\u20ac \ud83d\ude00 beta gamma \t gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\fx beta \ud83d\ude00 alpha epsilon delta \ud83d\ude00 \ud83d\ude00 \t \u20ac\n\u20ac alpha \u20ac beta\ndelta alpha beta delta gamma \u20ac beta gamma x caf\u00e9 na\u00efve\n\u20ac x gamma epsilon delta delta caf\u00e9\nbeta\n\nx \u20ac gamma \u20ac \u20ac\ncaf\u00e9 \u20ac \t na\u00efve \ud83d\ude00\nbeta gamma \u20ac gamma alpha caf\u00e9 delta\n\ndelta alpha\u001cbeta \u20ac beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\ngamma delta caf\u00e9 gamma \n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x \t gamma\n\t x alpha caf\u00e9 alpha \ud83d\ude00 \ud83d\ude00 \u20ac\nalpha caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dgamma \u20ac beta gamma \u20ac \t alpha na\u00efve alpha\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000bgamma caf\u00e9 beta x \ud83d\ude00 \nbeta na\u00efve epsilon \u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \t gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\u2028caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon gamma gamma \u20ac \ud83d\ude00 alpha gamma\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon\n na\u00efve \u20ac\u2028\u20ac beta\n\u20ac gamma gamma \u20ac \ud83d\ude00 delta delta x \u20ac\u000balpha \t caf\u00e9 caf\u00e9\ndelta caf\u00e9 gamma alpha\n\ud83d\ude00 x x na\u00efve alpha na\u00efve na\u00efve \t delta \ud83d\ude00\ngamma gamma \t \u000b\t \u20ac\nepsilon \ud83d\ude00 alpha \t caf\u00e9\nna\u00efve \ud83d\ude00 na\u00efve na\u00efve epsilon gamma caf\u00e9 \u20ac\n\t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha\u001cbeta na\u00efve epsilon \t epsilon\nalpha caf\u00e9 alpha gamma gamma na\u00efve\f\ndelta alpha \t \u20ac \ud83d\ude00 delta epsilon \n x\n\u001e epsilon \ud83d\ude00 epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nx na\u00efve alpha \u2029beta epsilon \t delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nbeta \ud83d\ude00 x\u001cx epsilon gamma alpha beta \ud83d\ude00\u2029x alpha x caf\u00e9\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta x\nbeta \rbeta alpha caf\u00e9 \t epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha\nepsilon caf\u00e9 \t na\u00efve gamma x\u2029alpha na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \n\nna\u00efve caf\u00e9 beta x\n alpha na\u00efve \n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nalpha \u20ac caf\u00e9 x alpha delta \u20ac caf\u00e9\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon epsilon x caf\u00e9 \ud83d\ude00 epsilon\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 delta alpha epsilon epsilon\ncaf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 \ud83d\ude00 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029 caf\u00e9 alpha na\u00efve \ud83d\ude00\ngamma caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon x\nalpha gamma x x \u20ac\ncaf\u00e9 beta delta beta alpha \ud83d\ude00 delta caf\u00e9 gamma \ud83d\ude00\nx na\u00efve epsilon\ncaf\u00e9 \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t beta caf\u00e9 \ud83d\ude00\nx na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t beta delta \u0085\ud83d\ude00 \ud83d\ude00 x caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha \u20ac\n \u20ac \ud83d\ude00 beta alpha x na\u00efve \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta na\u00efve na\u00efve gamma\u2028na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon \ud83d\ude00 delta alpha\n\ud83d\ude00 x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve\nx alpha \ud83d\ude00 \nalpha x caf\u00e9 caf\u00e9 \u20ac delta delta delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028delta \ud83d\ude00 delta \nx \t alpha beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001eepsilon alpha delta alpha x delta na\u00efve delta beta\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t caf\u00e9 epsilon \t \ud83d\ude00 alpha epsilon \u20ac \u20ac\u001ebeta \ud83d\ude00\n\u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \n\t caf\u00e9 alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 \ud83d\ude00 x caf\u00e9 gamma\r\nx delta \t epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta\u001c caf\u00e9 alpha caf\u00e9 delta delta na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nna\u00efve gamma alpha beta na\u00efve \ud83d\ude00 \ud83d\ude00 alpha\n caf\u00e9 na\u00efve alpha na\u00efve \u20ac delta caf\u00e9 na\u00efve\n\ud83d\ude00 epsilon \t caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac\u001cna\u00efve delta delta \n beta alpha na\u00efve x alpha x\nna\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta x na\u00efve alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha x\ncaf\u00e9 x beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac\nx x x x beta beta\n\ud83d\ude00 \t caf\u00e9 beta \u20ac \u20ac gamma alpha \t caf\u00e9\nbeta \u20ac alpha \t\nalpha epsilon x x na\u00efve alpha \n\u20ac na\u00efve gamma \t \nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u001ena\u00efve delta caf\u00e9 \t \t\u001e", +"max_lines": 13, +"overlap": 5, +"max_chars": 4000 +}, +{ +"text": "na\u00efve delta\u2028 na\u00efve na\u00efve x \t \ud83d\ude00 na\u00efve x\nx beta na\u00efve gamma alpha alpha delta alpha \ud83d\ude00 epsilon\n\u000b\n gamma delta beta\u000balpha caf\u00e9 delta gamma \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta \ud83d\ude00 delta delta caf\u00e9 \u20ac \t\n x\fdelta gamma alpha gamma epsilon x \u20ac\nalpha na\u00efve \t x caf\u00e9 \t \u20ac\ncaf\u00e9 beta na\u00efve alpha alpha \u20ac alpha\r\n\ud83d\ude00 beta x gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u001e\t \u20ac caf\u00e9 gamma epsilon na\u00efve gamma\nx caf\u00e9 x \ud83d\ude00 x\u001d caf\u00e9 na\u00efve alpha\nna\u00efve alpha\u0085 epsilon gamma alpha \u20ac na\u00efve x\nalpha na\u00efve beta na\u00efve alpha na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 epsilon epsilon \ud83d\ude00 \t alpha x \u20ac \ud83d\ude00 \t\u2029gamma \t \t na\u00efve\ngamma x \ndelta na\u00efve \u20ac gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x\u2028 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac alpha beta caf\u00e9 gamma caf\u00e9 \ngamma epsilon delta caf\u00e9 \t \ud83d\ude00 na\u00efve gamma na\u00efve alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon gamma epsilon \ud83d\ude00 \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 epsilon x\ncaf\u00e9 epsilon beta gamma x \t epsilon \ngamma beta gamma gamma gamma \t \u20ac epsilon epsilon \ud83d\ude00 na\u00efve \ud83d\ude00\nalpha \t delta x \ud83d\ude00 caf\u00e9 \u20ac alpha alpha \ud83d\ude00 \n epsilon epsilon gamma\u2029", +"max_lines": 13, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "beta beta na\u00efve\nbeta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac x \nx alpha caf\u00e9 gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac\nalpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t \u20ac \t delta\n beta epsilon \u001dcaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\n \t caf\u00e9 alpha \ud83d\ude00 \u20ac na\u00efve epsilon\u0085gamma beta epsilon\ngamma \u20ac x\n\t gamma \t\n\t \ud83d\ude00 delta alpha x epsilon alpha gamma\u2028 caf\u00e9 caf\u00e9 \u20ac alpha alpha epsilon caf\u00e9 na\u00efve gamma \ud83d\ude00\n\u20ac x gamma beta\ndelta \u20ac x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon x na\u00efve alpha caf\u00e9 \u20ac\n\u001d\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon x alpha \t\u001e\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon delta gamma \ud83d\ude00 delta\n epsilon x \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\ngamma \u20ac \ud83d\ude00 \t beta epsilon x \ud83d\ude00\nalpha epsilon na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028beta delta \t alpha na\u00efve\u001cepsilon alpha alpha delta\n", +"max_lines": 13, +"overlap": 1, +"max_chars": 120 +}, +{ +"text": "\nepsilon \ud83d\ude00 caf\u00e9 gamma caf\u00e9 delta alpha caf\u00e9 epsilon\fdelta alpha beta beta \u20ac \u20ac\n na\u00efve x caf\u00e9 alpha \ud83d\ude00 alpha\nbeta delta\n\u20ac \ud83d\ude00 na\u00efve gamma \u20ac delta\u2029 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nx beta caf\u00e9 epsilon \ud83d\ude00 na\u00efve\u001ecaf\u00e9 alpha x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x caf\u00e9 beta x\u2029caf\u00e9 \u20ac \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon \u20ac delta \t\nx delta\nna\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta \ud83d\ude00 \t \ud83d\ude00 na\u00efve beta\n\ud83d\ude00 epsilon alpha epsilon \t \u20ac caf\u00e9 na\u00efve delta\u001ccaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve alpha na\u00efve \t\nepsilon gamma\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085\ud83d\ude00 gamma x gamma gamma epsilon\nepsilon \u20ac caf\u00e9 alpha beta delta \t beta x\nx \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta epsilon\nepsilon delta na\u00efve \ud83d\ude00 delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 x caf\u00e9\n\u20ac x alpha gamma epsilon \n \t delta alpha \ud83d\ude00 \t \u20ac epsilon\ngamma epsilon x beta \ud83d\ude00\ndelta na\u00efve \ud83d\ude00 gamma caf\u00e9 beta beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n alpha delta \t\f\nalpha gamma\ndelta epsilon alpha gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\u20ac na\u00efve caf\u00e9 \ud83d\ude00 caf\u00e9 epsilon \u20ac na\u00efve\u001d \t\n\t\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve delta \ud83d\ude00 gamma \nepsilon na\u00efve caf\u00e9 epsilon na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x caf\u00e9 x\u2029delta \u20ac epsilon \u20ac \t \ud83d\ude00 \ud83d\ude00 \n", +"max_lines": 7, +"overlap": 3, +"max_chars": 17 +}, +{ +"text": "\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\u001ebeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma \t gamma beta alpha \ud83d\ude00 delta delta \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x x \ud83d\ude00 \ud83d\ude00 \ud83d\ude00 na\u00efve alpha\nx beta x \u20ac epsilon alpha na\u00efve beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta\nna\u00efve epsilon \t beta \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \r\ud83d\ude00 epsilon gamma gamma epsilon caf\u00e9 beta delta delta\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \ud83d\ude00 gamma epsilon \u20ac na\u00efve \t\u001d\n\n\u20ac beta \t \u20ac \ud83d\ude00 x \u20ac \nbeta\u001e\t alpha caf\u00e9 \u20ac\nalpha gamma \ud83d\ude00 gamma delta beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x\n \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma epsilon\ngamma \n\rbeta beta caf\u00e9 alpha\u001depsilon x na\u00efve delta caf\u00e9 x beta \u20ac gamma beta delta \t\n x beta \ud83d\ude00 alpha caf\u00e9 \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x gamma\ndelta na\u00efve gamma\nalpha gamma alpha na\u00efve na\u00efve beta beta \ud83d\ude00 na\u00efve\n\t \u20ac delta alpha \ud83d\ude00\u001ena\u00efve delta x \t\r\ngamma \t alpha x \u20ac \ud83d\ude00 gamma gamma \t\u000bbeta delta beta gamma caf\u00e9 \ud83d\ude00\r\ndelta epsilon delta \t beta \t \u20ac beta \n\u20ac caf\u00e9 na\u00efve delta delta delta alpha \t\n\ud83d\ude00 \u20ac beta na\u00efve epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha \ud83d\ude00 \t\nbeta\ndelta gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve beta \u20ac \t beta\r\u20ac beta beta \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001ex caf\u00e9\nalpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 alpha alpha caf\u00e9\ngamma \t alpha na\u00efve caf\u00e9 alpha delta beta delta\n\u001d gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta\u000b\ngamma alpha \ud83d\ude00 \t \u20ac\u001depsilon alpha\r\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 beta alpha alpha x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma alpha beta na\u00efve x gamma gamma \u0085beta\ncaf\u00e9 beta alpha epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta delta gamma na\u00efve\ncaf\u00e9 caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac epsilon beta \t\n\t \t na\u00efve \ud83d\ude00 x alpha\n\t alpha \u20ac beta beta \nalpha \u20ac alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x gamma alpha \u20ac epsilon\nepsilon x \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 x\u001edelta x\n\ud83d\ude00\r\u20ac caf\u00e9 x \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon \ud83d\ude00\ncaf\u00e9 epsilon \u20ac caf\u00e9 epsilon\nepsilon na\u00efve \t \t caf\u00e9 delta \t beta x na\u00efve\n\u20ac epsilon na\u00efve gamma gamma \t gamma x\ngamma beta \t epsilon alpha \t \ud83d\ude00 alpha na\u00efve\n \t epsilon\nna\u00efve \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac\u001e\t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028delta epsilon epsilon beta caf\u00e9 alpha\n\u20ac epsilon alpha delta\u001c x delta \t\ngamma caf\u00e9 \u20ac epsilon x \t alpha epsilon\n\u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma epsilon\u001cbeta x \ud83d\ude00 \t gamma\n\u20ac alpha alpha\n\ud83d\ude00 x na\u00efve \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha gamma\nalpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n beta \u20ac beta caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac\ncaf\u00e9 alpha beta caf\u00e9 \u20ac\nalpha caf\u00e9 alpha \t\nx \t beta epsilon alpha epsilon gamma \ud83d\ude00 na\u00efve beta\nepsilon \t \t gamma \t\n\u20ac \u20ac beta beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha \ud83d\ude00 beta alpha delta beta na\u00efve delta gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve caf\u00e9\ncaf\u00e9 gamma \t \ud83d\ude00 gamma \t caf\u00e9 epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n gamma \ud83d\ude00 x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta na\u00efve alpha \nalpha na\u00efve beta gamma caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n \u20ac caf\u00e9\u001d\u20ac \t beta \ud83d\ude00 epsilon gamma \ud83d\ude00 \ud83d\ude00 beta\fepsilon gamma na\u00efve gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\u0085epsilon alpha alpha delta alpha alpha \ud83d\ude00 gamma alpha caf\u00e9 delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 delta gamma epsilon alpha\nalpha x epsilon alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \t x na\u00efve beta x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 \t na\u00efve \ud83d\ude00 \t \ncaf\u00e9\n\ngamma\n\n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha na\u00efve \t x epsilon alpha \u20ac\ndelta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \nna\u00efve x \ud83d\ude00 delta na\u00efve epsilon \ndelta \nna\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta \ud83d\ude00\fna\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta \u20ac \u001d\ud83d\ude00 \ud83d\ude00 \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9\ndelta gamma x \t epsilon\ndelta\n gamma\r\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t\n beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 \ud83d\ude00\ndelta na\u00efve beta \ud83d\ude00 \t epsilon delta gamma\ndelta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha gamma\n\t \t x epsilon beta \u20ac na\u00efve\nna\u00efve delta\nbeta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon \u20ac alpha\n\ud83d\ude00 beta \t\r\ncaf\u00e9\n \ud83d\ude00\ndelta beta \u001cx \ud83d\ude00 gamma beta\u2028x \ud83d\ude00 alpha x\n\ud83d\ude00 beta na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u0085beta alpha alpha\u2028\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \n alpha \u20ac \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve na\u00efve\n\u20ac gamma caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha x beta\u2028\ndelta alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t alpha \ud83d\ude00\fna\u00efve \t \u20ac \u20ac delta epsilon\ncaf\u00e9 caf\u00e9 caf\u00e9 caf\u00e9 epsilon gamma epsilon delta\repsilon caf\u00e9 caf\u00e9 alpha \u20ac\n", +"max_lines": 1, +"overlap": 3, +"max_chars": 4000 +}, +{ +"text": "\u20ac\u001dx na\u00efve \u20ac \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dalpha caf\u00e9 gamma epsilon\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 beta na\u00efve \u20ac \t epsilon na\u00efve caf\u00e9 epsilon\n\t\u001ex na\u00efve \t epsilon\r\n\ud83d\ude00 \u20ac\n \ud83d\ude00 alpha beta gamma \ud83d\ude00 beta gamma \t x \t delta\n\t x alpha \u20ac alpha \t epsilon gamma caf\u00e9 epsilon gamma\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha \u20ac \u000b beta \u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n epsilon \ud83d\ude00 \u20ac \u20ac delta \u20ac na\u00efve \ud83d\ude00\n\u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon na\u00efve na\u00efve \ud83d\ude00 \ud83d\ude00 alpha na\u00efve caf\u00e9 epsilon x na\u00efve gamma\ndelta alpha \u20ac beta alpha epsilon\u0085\t \ud83d\ude00 epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t x \u20ac delta gamma \t \t epsilon \ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta epsilon alpha \u001e\ud83d\ude00 \u20ac \ud83d\ude00 na\u00efve gamma alpha na\u00efve epsilon \n caf\u00e9 x delta\nalpha\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t gamma \t alpha\repsilon x gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u2029beta \ud83d\ude00\n \u20ac \t\n\t caf\u00e9 na\u00efve\ncaf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u2028 x gamma\u0085 caf\u00e9 \ud83d\ude00 delta \t \t gamma na\u00efve na\u00efve\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t\fcaf\u00e9 \u20ac gamma epsilon\nepsilon\n delta beta \ud83d\ude00 delta\u000balpha x epsilon \u20ac caf\u00e9 na\u00efve \t beta delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta epsilon delta na\u00efve \t \ud83d\ude00 na\u00efve epsilon beta\nx\u0085 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon delta na\u00efve caf\u00e9 delta alpha \ud83d\ude00 beta\n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta \ud83d\ude00 x gamma \t beta caf\u00e9 \u20ac\n\u20ac \ud83d\ude00 beta \t \ud83d\ude00 na\u00efve epsilon\n\n \ud83d\ude00 x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x x na\u00efve x x na\u00efve\n\nepsilon alpha x caf\u00e9 x gamma caf\u00e9 \u20ac alpha delta delta\u001c \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 na\u00efve x x\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve na\u00efve \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta\nalpha beta gamma \u20ac \n\ud83d\ude00 gamma na\u00efve \u20ac x x\nna\u00efve\n \t x na\u00efve gamma na\u00efve alpha x delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\u001cdelta beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t x delta gamma\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha caf\u00e9 \u20ac beta delta\u2029delta caf\u00e9 epsilon \t x beta\n\u20ac epsilon beta caf\u00e9 caf\u00e9 na\u00efve caf\u00e9\n\u001d\u20ac\nalpha na\u00efve beta\ncaf\u00e9 beta \nx x \u20ac\n\ud83d\ude00 beta epsilon x na\u00efve beta x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta\n x \t beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00\u0085\ud83d\ude00 x\r\u001cdelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta na\u00efve alpha\n delta gamma na\u00efve delta epsilon delta\u0085\ud83d\ude00 gamma beta \ud83d\ude00 x x \t x alpha\nbeta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 \t\n\u20ac\u001c\u20ac \t \ud83d\ude00 delta beta\nepsilon beta caf\u00e9 alpha \ud83d\ude00 gamma\nbeta gamma delta\n alpha \u20ac \u20ac \u20ac beta \t alpha \ud83d\ude00 alpha\n \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta \ud83d\ude00 na\u00efve gamma \ud83d\ude00 alpha alpha alpha\u0085epsilon \t\nbeta beta na\u00efve beta gamma\ndelta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \n\u001cgamma \t x x gamma \ud83d\ude00 delta x gamma\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\u001dbeta x delta \u20ac x\r \t na\u00efve \u20ac \f\t beta\u001depsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u001e\u0085epsilon \u20ac \ud83d\ude00 \t \t gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta \t\n\ud83d\ude00 \ud83d\ude00 alpha \u20ac \t \ud83d\ude00 epsilon \t beta \ud83d\ude00\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t \t x\n\u20ac \ud83d\ude00 epsilon na\u00efve beta\n epsilon delta\n\u20ac \t epsilon caf\u00e9 delta alpha \nx epsilon caf\u00e9 na\u00efve \ud83d\ude00 \ud83d\ude00\nalpha gamma \u20ac\n", +"max_lines": 13, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "x epsilon caf\u00e9 caf\u00e9 \t \ud83d\ude00\ndelta alpha gamma delta beta \t\u000b\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 beta caf\u00e9 caf\u00e9 x gamma delta gamma\n gamma epsilon beta epsilon \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 caf\u00e9 epsilon gamma caf\u00e9 \ud83d\ude00 epsilon \ud83d\ude00\nepsilon\r\u20ac beta \u20ac\ngamma alpha alpha na\u00efve \ud83d\ude00 gamma delta x na\u00efve\ncaf\u00e9 epsilon x beta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \nx epsilon\ngamma \u20ac \t epsilon gamma na\u00efve delta delta alpha \u20ac \u20ac\nx \ud83d\ude00 \ud83d\ude00 alpha\nx epsilon caf\u00e9 \t \ud83d\ude00 \ud83d\ude00 beta\u2029beta beta epsilon delta \u20ac delta gamma na\u00efve gamma x\u001d\u20ac na\u00efve epsilon \u2029beta na\u00efve \u20ac \u20ac \t gamma alpha\nx delta \t delta alpha beta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha \u20ac \t\u2029beta \ngamma \ud83d\ude00 epsilon\u001eepsilon \t \t \ud83d\ude00 \r\n caf\u00e9 na\u00efve caf\u00e9 na\u00efve \t epsilon \t \u20ac beta na\u00efve\r\u20ac beta caf\u00e9 \t epsilon gamma \u20ac\n\t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u000b beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t alpha gamma alpha epsilon \t \n x \ud83d\ude00 \ud83d\ude00\n\t \u20ac x \ud83d\ude00 alpha caf\u00e9 delta\nalpha delta delta gamma\nalpha gamma gamma caf\u00e9 gamma caf\u00e9\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve \ud83d\ude00\n x x na\u00efve beta caf\u00e9 \u20ac epsilon caf\u00e9 na\u00efve\nalpha\u000bgamma delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9 x \t beta \t\nna\u00efve alpha\u001e\u20ac caf\u00e9 beta alpha \ud83d\ude00 \t \ud83d\ude00 \ud83d\ude00\u2028na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ngamma \ud83d\ude00 na\u00efve \nbeta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b\fna\u00efve caf\u00e9 na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon epsilon\ndelta epsilon \t delta beta\nalpha\nepsilon \t alpha x x \t\n\ud83d\ude00 gamma caf\u00e9 \u20ac caf\u00e9 epsilon \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u000b\u20ac na\u00efve gamma\u000b \u20ac \ud83d\ude00 alpha beta x \ngamma\nna\u00efve gamma \ud83d\ude00 \ud83d\ude00 x na\u00efve\nbeta\n\ud83d\ude00 epsilon\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nna\u00efve beta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \t epsilon alpha epsilon\n\ud83d\ude00\n", +"max_lines": 1, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "alpha \t gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 \u20ac \u2028\n\u20ac delta epsilon \u20ac\nepsilon gamma\n\n\n\nalpha \t delta gamma caf\u00e9\u001d\ud83d\ude00 \ud83d\ude00 x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 \ud83d\ude00\n\ud83d\ude00 gamma \t \ud83d\ude00 \u20ac \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085 \nbeta\nx x epsilon\u000bna\u00efve epsilon x \ud83d\ude00 \u20ac beta caf\u00e9 \t \ud83d\ude00\n\n\n \ud83d\ude00 alpha beta gamma x \t\nx caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha gamma\n\t \u20ac delta \u20ac \ud83d\ude00 \t \u20ac gamma gamma\n\r\n na\u00efve\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta beta caf\u00e9 epsilon\ncaf\u00e9 x delta\ndelta na\u00efve alpha \ud83d\ude00 caf\u00e9\ralpha x \ud83d\ude00 \u20ac na\u00efve delta alpha\n\u20ac beta delta \ngamma \t x na\u00efve\u000b\t alpha x x alpha \t epsilon \ud83d\ude00 \t\n\u000b\u20ac \ud83d\ude00 x beta\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\ngamma epsilon x beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \nna\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 \t x epsilon x beta\ndelta beta \u20ac alpha caf\u00e9 gamma beta beta\r\nbeta alpha beta \t delta\nbeta delta caf\u00e9 \ud83d\ude00 \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma \u20ac x x na\u00efve caf\u00e9 epsilon alpha beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma\f\ud83d\ude00 \u20ac \u20ac epsilon gamma \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \t\nx beta x delta beta alpha delta \u20ac \n\t \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x na\u00efve gamma caf\u00e9\n \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 na\u00efve \t \t epsilon epsilon\u001d\u20ac gamma\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac na\u00efve beta na\u00efve gamma \t caf\u00e9\r\n gamma x beta caf\u00e9 \n \nbeta\u001d\nepsilon \t \ud83d\ude00\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha \ud83d\ude00 x alpha\nbeta delta gamma delta x gamma na\u00efve \t epsilon\r\ncaf\u00e9 \u20ac \t delta alpha alpha caf\u00e9 alpha x\ndelta alpha \t \n\ud83d\ude00 alpha\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \n\u20ac alpha\n\ncaf\u00e9 beta delta epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 beta\n\ud83d\ude00 \u000b \ud83d\ude00\nepsilon \u20ac caf\u00e9\fepsilon epsilon epsilon \u20ac gamma na\u00efve \t x\u001ccaf\u00e9 gamma \t caf\u00e9 \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 epsilon alpha delta \ud83d\ude00 \u001e\u20ac\n beta x epsilon gamma caf\u00e9 x x caf\u00e9\ndelta caf\u00e9 \u20ac epsilon\n\t \n \t beta beta na\u00efve delta alpha \t\n x caf\u00e9 \u20ac alpha caf\u00e9 caf\u00e9\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\ndelta \t gamma \t epsilon\nbeta \u20ac\u2028x\n\nna\u00efve na\u00efve\nbeta caf\u00e9 delta x \t \ud83d\ude00\n\u20ac \u20ac alpha\n", +"max_lines": 2, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": "epsilon na\u00efve caf\u00e9 gamma gamma beta x epsilon\u001e\ud83d\ude00\u0085epsilon beta epsilon \ud83d\ude00 beta delta\nbeta epsilon epsilon x x x gamma\ndelta \ud83d\ude00 \u20ac na\u00efve\r\n \u20ac gamma delta delta gamma beta \u20ac \u20ac na\u00efve delta\n", +"max_lines": 7, +"overlap": 3, +"max_chars": 120 +}, +{ +"text": "gamma \ud83d\ude00 x\n\ud83d\ude00 \u20ac \u20ac delta\n beta delta caf\u00e9 alpha beta \ud83d\ude00 beta epsilon \t gamma\u001egamma na\u00efve\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha na\u00efve x beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac\u2029alpha\r\nepsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001e\u20ac \fepsilon epsilon\r\ndelta epsilon\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001egamma \ud83d\ude00 beta beta caf\u00e9 epsilon \ud83d\ude00 epsilon alpha na\u00efve \u20ac\nx alpha beta caf\u00e9 delta\ncaf\u00e9 \t alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\ndelta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha caf\u00e9 na\u00efve\u2028\t caf\u00e9 \t na\u00efve \n\u20ac alpha \ud83d\ude00\u001e\u000b\t x\nepsilon epsilon delta \t delta na\u00efve beta caf\u00e9 caf\u00e9 beta\nepsilon gamma beta\n epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 x \ud83d\ude00 beta x epsilon\nx caf\u00e9 na\u00efve\nepsilon caf\u00e9 na\u00efve na\u00efve \t alpha epsilon\nalpha \ud83d\ude00 epsilon \ud83d\ude00 beta beta epsilon epsilon x epsilon na\u00efve\u001e\u20ac alpha caf\u00e9\n\ud83d\ude00 \ud83d\ude00 \n\u20ac \ud83d\ude00\ndelta \u20ac epsilon alpha alpha gamma \ud83d\ude00\ngamma epsilon\n\ud83d\ude00 na\u00efve \t epsilon caf\u00e9\n \u20ac gamma \u20ac \u20ac epsilon alpha \ud83d\ude00 \u20ac x \u20ac caf\u00e9\nepsilon \ud83d\ude00 gamma x \u001ddelta gamma beta \u000bbeta\u000bna\u00efve alpha na\u00efve na\u00efve beta epsilon na\u00efve na\u00efve\nalpha x \u20ac \u0085delta \ud83d\ude00 caf\u00e9 delta delta \ud83d\ude00 beta \t caf\u00e9 gamma\u2028\t epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta delta \u20ac caf\u00e9\n\u20ac delta na\u00efve epsilon na\u00efve na\u00efve \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u0085\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve na\u00efve na\u00efve epsilon beta \u20ac \ncaf\u00e9 \ud83d\ude00 beta alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\ncaf\u00e9 x \n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9\n\u20ac na\u00efve \ud83d\ude00 \ud83d\ude00 delta beta \ud83d\ude00 gamma delta x\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 \u20ac\nna\u00efve epsilon alpha delta \t gamma gamma beta\n gamma caf\u00e9 x x alpha epsilon\ngamma beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon alpha x caf\u00e9 \u20ac \n\n\ud83d\ude00 na\u00efve beta gamma na\u00efve caf\u00e9 delta gamma\u001e\t \u20ac \t \nna\u00efve alpha na\u00efve caf\u00e9 gamma alpha epsilon\nna\u00efve caf\u00e9 alpha beta\u2029\ud83d\ude00 x beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001e\ud83d\ude00 x alpha delta delta caf\u00e9 delta\nna\u00efve \u20ac caf\u00e9 \ud83d\ude00 caf\u00e9 beta\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta delta na\u00efve\ncaf\u00e9 caf\u00e9 gamma \ud83d\ude00\n\t\nepsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \t gamma x x \n \t\n\nna\u00efve \t \u20ac beta\u001dgamma delta epsilon\n x na\u00efve epsilon gamma \t x \t \u20ac\n\ud83d\ude00 alpha\n\u0085alpha gamma beta gamma beta\ncaf\u00e9\ncaf\u00e9 \u20ac \u20ac gamma alpha caf\u00e9 delta\u001cepsilon caf\u00e9 caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x \t x\u2028 caf\u00e9 caf\u00e9 epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\f\u20ac epsilon \u20ac\nx \u20ac caf\u00e9 beta \u20ac caf\u00e9 \t epsilon x\n\u20ac na\u00efve beta gamma \ud83d\ude00 na\u00efve \n\t\n\u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma caf\u00e9 beta epsilon \ud83d\ude00 alpha\ndelta epsilon delta delta delta\n \u20ac \t alpha alpha \t \t \r\n\u20ac\n\u20ac alpha delta caf\u00e9 \t caf\u00e9 x\r\n\u20ac beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x\n\t gamma x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon\nepsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ngamma beta na\u00efve x \u20ac beta delta epsilon \n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \n\t na\u00efve gamma\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\ncaf\u00e9 caf\u00e9 gamma beta\nx gamma gamma \t caf\u00e9 \u20ac delta beta\ngamma \ud83d\ude00 alpha\nx delta\u001cepsilon na\u00efve x\nepsilon alpha delta gamma \u20ac\u000bepsilon caf\u00e9 epsilon alpha delta \t na\u00efve x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve \n\ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta \u20ac epsilon\n\ud83d\ude00 caf\u00e9 gamma \t x\n \ud83d\ude00 \t caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n\u2029\ud83d\ude00 \n\t\n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n", +"max_lines": 13, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "\ud83d\ude00 caf\u00e9 epsilon \ud83d\ude00 caf\u00e9\nalpha gamma alpha \t \ud83d\ude00 na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha\n epsilon \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 alpha alpha caf\u00e9 na\u00efve delta na\u00efve gamma\u001c gamma\n\nna\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 caf\u00e9 \ud83d\ude00 caf\u00e9 \t beta\u000balpha \ud83d\ude00 caf\u00e9 caf\u00e9 \t alpha\nepsilon alpha na\u00efve delta delta \ud83d\ude00 epsilon\n\t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t beta x delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \nbeta delta \u20ac\nna\u00efve \u20ac beta\r\nalpha \ud83d\ude00 na\u00efve delta \u20ac\nalpha x caf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve epsilon caf\u00e9 alpha\nx alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta na\u00efve x \ud83d\ude00 \ud83d\ude00 na\u00efve na\u00efve \nbeta x delta delta gamma gamma\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 x alpha x\n\u20ac delta gamma beta delta alpha alpha\u2029na\u00efve \t caf\u00e9 delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u001e\u20ac \t \ud83d\ude00 na\u00efve \u20ac x \nbeta x gamma\n\ud83d\ude00\n\t gamma beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t \u20ac gamma delta\nalpha\u0085epsilon\u001dgamma na\u00efve alpha na\u00efve x x\ngamma \u20ac \u20ac caf\u00e9 beta na\u00efve x \ud83d\ude00 \ud83d\ude00\ngamma \ud83d\ude00 alpha delta caf\u00e9 \ud83d\ude00 \t\nepsilon gamma na\u00efve epsilon gamma \ud83d\ude00 gamma \u20ac delta epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta beta alpha na\u00efve na\u00efve delta x gamma delta delta\nx \t \ud83d\ude00 epsilon alpha x x na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta\n caf\u00e9 gamma na\u00efve beta \u20ac \ud83d\ude00 \u20ac beta\u001d\u20ac x caf\u00e9 \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 \u20ac\r\nalpha beta \ud83d\ude00 caf\u00e9 \t caf\u00e9 x\nx gamma na\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta \t\u0085\u20ac \t delta epsilon\nepsilon alpha na\u00efve delta epsilon \ud83d\ude00 epsilon\nepsilon \u20ac \u20ac \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma x beta gamma\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta \u20ac \ud83d\ude00 caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma gamma alpha\n \ud83d\ude00\n\n epsilon caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9 \ud83d\ude00 epsilon\u0085\t \t \ud83d\ude00 \u20ac epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\ndelta\n\u20ac na\u00efve beta \u20ac gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \n\u20ac beta na\u00efve x delta\n\t caf\u00e9 \u20ac \t epsilon\nna\u00efve alpha \t gamma\nbeta \ud83d\ude00 gamma \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x \u20ac\ncaf\u00e9 alpha caf\u00e9 x \u20ac na\u00efve epsilon\r\u20ac na\u00efve delta alpha\ngamma na\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma\nbeta \ud83d\ude00 alpha\nna\u00efve\u2029 gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x alpha \u001e \u20ac gamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta\u0085caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta \ud83d\ude00 \t gamma \ndelta gamma \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve \ud83d\ude00 delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac\n\n epsilon epsilon beta \u20ac beta \t caf\u00e9 \ud83d\ude00 delta\ngamma \ud83d\ude00 caf\u00e9 beta epsilon \u20ac beta epsilon \n\ud83d\ude00 \t beta beta na\u00efve beta\nalpha beta beta delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma\u0085caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \ud83d\ude00 alpha x \u20ac delta epsilon\u001d\t \u20ac caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b\t delta \ud83d\ude00 delta x alpha gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta gamma\nepsilon beta\n\u20ac na\u00efve \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u001dcaf\u00e9 na\u00efve na\u00efve\ndelta na\u00efve \u20ac alpha caf\u00e9\nbeta \t caf\u00e9 \t caf\u00e9 \u2029\n\u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta gamma\u2028caf\u00e9 alpha caf\u00e9 beta caf\u00e9 caf\u00e9 epsilon \u20ac gamma \n x\ngamma na\u00efve delta epsilon caf\u00e9 caf\u00e9 caf\u00e9 delta alpha \ud83d\ude00\ngamma \n\ud83d\ude00\n\ud83d\ude00 caf\u00e9 alpha \t \ud83d\ude00 delta caf\u00e9\n\t \t beta epsilon epsilon \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma alpha\n\ud83d\ude00 \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x\nalpha alpha alpha \ud83d\ude00 \t delta alpha beta x\n\n \t \u20ac na\u00efve caf\u00e9\u0085 \ud83d\ude00 gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\ndelta alpha \nepsilon\n delta alpha \u20ac \ud83d\ude00 delta \u20ac na\u00efve \u20ac gamma \n", +"max_lines": 1, +"overlap": 0, +"max_chars": 120 +}, +{ +"text": "alpha x gamma epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\u001calpha \t \u20ac \ud83d\ude00 x \nalpha beta \ud83d\ude00 x epsilon \ud83d\ude00 caf\u00e9\u000bcaf\u00e9 na\u00efve \t\r\n x\u2028alpha\u001c\ud83d\ude00 alpha \u20ac\n\u20ac \t \u20ac delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x gamma \ud83d\ude00 caf\u00e9 \u20ac gamma \nx \r\ndelta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\ndelta x \ngamma \t alpha \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\u0085\ud83d\ude00 alpha delta \u20ac beta\n epsilon\u2029na\u00efve na\u00efve na\u00efve\ncaf\u00e9 epsilon x \t na\u00efve \u20ac beta \t caf\u00e9 gamma x\nx x delta delta gamma\nbeta \t delta\nalpha caf\u00e9 \ud83d\ude00 beta x \u20ac na\u00efve epsilon delta\nna\u00efve epsilon na\u00efve delta gamma\rlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac\n\nepsilon caf\u00e9\r\nx\ngamma delta alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta caf\u00e9\n\u20ac epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta caf\u00e9 beta\ncaf\u00e9 gamma delta epsilon delta \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha epsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon beta \t\ndelta beta delta na\u00efve\ndelta epsilon \ud83d\ude00\r\n\ud83d\ude00 \u20ac alpha \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta gamma\n\u001ddelta x\u001cdelta delta caf\u00e9 alpha delta caf\u00e9 epsilon gamma\u0085\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta delta caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon\nbeta \ud83d\ude00 beta \ud83d\ude00 na\u00efve alpha \t beta alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n \ud83d\ude00 gamma x alpha \ud83d\ude00 \n\t \u20ac gamma delta gamma \t alpha epsilon caf\u00e9 caf\u00e9 \u20ac alpha\nx \t epsilon delta \t caf\u00e9 \u20ac\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 \t\ngamma epsilon\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve delta na\u00efve delta \ud83d\ude00\u0085delta na\u00efve \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 gamma\n beta \ud83d\ude00\u001d \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve na\u00efve\n\u20ac caf\u00e9 caf\u00e9 \u20ac \ngamma \t alpha \n\t beta beta caf\u00e9 na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon \ud83d\ude00\n alpha caf\u00e9 beta beta \u20ac beta beta alpha caf\u00e9\u2029\t \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9\n\nx\ndelta epsilon x caf\u00e9 \u20ac gamma \r\nepsilon caf\u00e9\ncaf\u00e9 \t alpha x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon \u20ac delta\u000bepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha caf\u00e9 beta gamma x \u20ac epsilon epsilon\n\t caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 caf\u00e9 alpha \ud83d\ude00\nepsilon \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta caf\u00e9 epsilon\n\ud83d\ude00 epsilon gamma caf\u00e9 caf\u00e9 \ud83d\ude00 beta epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta gamma \t caf\u00e9\u001c\n\ncaf\u00e9 x gamma \u20ac delta x caf\u00e9 beta\nx caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x\n caf\u00e9\ncaf\u00e9 gamma \ud83d\ude00 beta na\u00efve\u001dna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta \ud83d\ude00 \ud83d\ude00 x \t na\u00efve\ngamma caf\u00e9 caf\u00e9 x x beta x x alpha \t\r\nalpha \ud83d\ude00 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta\r\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta delta\f\u20ac \u20ac beta beta caf\u00e9\nalpha na\u00efve \t \u20ac alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t alpha\ndelta epsilon \u20ac caf\u00e9 gamma beta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nna\u00efve \t beta gamma gamma alpha caf\u00e9 \ud83d\ude00 \n gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha epsilon caf\u00e9 alpha gamma x \ud83d\ude00\r\u20ac \u2028\u20ac alpha alpha gamma delta epsilon gamma na\u00efve\n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ncaf\u00e9 alpha delta delta \ud83d\ude00 \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac\n\t epsilon \t caf\u00e9 delta caf\u00e9 epsilon\u0085delta gamma \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac \u20ac\nepsilon delta epsilon \t x \t alpha epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 \ud83d\ude00 \t caf\u00e9 delta\f\u20ac \u20ac gamma \u20ac\r\n \ud83d\ude00 gamma x x caf\u00e9\n \ud83d\ude00 gamma x \ud83d\ude00 alpha\ndelta \ud83d\ude00 x\ncaf\u00e9 \u20ac delta epsilon \u20ac \ud83d\ude00 x alpha gamma gamma\nbeta \t alpha \t na\u00efve alpha gamma\n\t\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 \u20ac epsilon\n epsilon beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9\n\nbeta \ud83d\ude00 \t beta alpha epsilon\u001cbeta alpha na\u00efve \u20ac x\n\t na\u00efve gamma \ud83d\ude00 delta epsilon caf\u00e9 x\n\nx na\u00efve \u2029\u20ac beta\u0085", +"max_lines": 7, +"overlap": 5, +"max_chars": 17 +}, +{ +"text": "epsilon x gamma delta \ud83d\ude00 caf\u00e9\n\n\t\r\n\n x epsilon \t alpha beta\fcaf\u00e9 \u20ac\nx gamma gamma delta\nna\u00efve na\u00efve \ud83d\ude00 alpha beta \t \u20ac x na\u00efve na\u00efve na\u00efve\nbeta caf\u00e9 caf\u00e9 x na\u00efve epsilon epsilon\ncaf\u00e9 \u20ac beta caf\u00e9 delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t\u2028caf\u00e9 gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha\nalpha gamma alpha \ud83d\ude00 alpha \u20ac \ud83d\ude00 na\u00efve\nx gamma x epsilon caf\u00e9\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t caf\u00e9 \t epsilon \t delta epsilon epsilon\n beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 na\u00efve\fbeta\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve x\ndelta beta \u20ac alpha caf\u00e9 \u20ac na\u00efve \ud83d\ude00 \t \u20ac x na\u00efve\r\n\t\nalpha \u20ac x caf\u00e9\nepsilon\nalpha alpha alpha\nx beta delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve \t\u001depsilon \t x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001c\ndelta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 \ud83d\ude00 x delta \ud83d\ude00 na\u00efve gamma\nepsilon alpha na\u00efve \t x beta x alpha x na\u00efve\nepsilon \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 epsilon x\ngamma gamma epsilon \t \ud83d\ude00 x na\u00efve\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha \u20ac alpha epsilon x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha \t x\nalpha delta\n epsilon beta \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha alpha delta gamma\u0085\t gamma \u20ac delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\u000balpha alpha epsilon caf\u00e9\ncaf\u00e9 delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta alpha caf\u00e9\u2028\u20ac \u20ac\ncaf\u00e9 epsilon \u20ac \u20ac \u2028caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta caf\u00e9 gamma \nalpha epsilon caf\u00e9 \t beta\n x\n\t epsilon alpha \t\ndelta beta x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon beta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\n na\u00efve \u20ac alpha na\u00efve na\u00efve \t caf\u00e9\n\t delta beta\nna\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\n\u001eepsilon gamma alpha x na\u00efve beta x caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\n \ud83d\ude00 caf\u00e9 delta\nepsilon caf\u00e9 beta \u20ac alpha gamma\nalpha x beta \t\n\ud83d\ude00 epsilon \ud83d\ude00 beta \u20ac \ud83d\ude00 x x \t gamma\n\t delta delta \ud83d\ude00 \ud83d\ude00 alpha \u20ac delta \nalpha \ud83d\ude00 epsilon \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha alpha\n\ud83d\ude00 epsilon \t\nx \t \t epsilon \t alpha\n\t gamma beta \t\ndelta gamma gamma epsilon na\u00efve \t caf\u00e9 caf\u00e9 epsilon gamma\n\n\ud83d\ude00 caf\u00e9 beta \u20ac \ud83d\ude00\rgamma \t\n\u20ac na\u00efve \u20ac \t \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n \u20ac\ngamma na\u00efve \t gamma beta beta\u2028beta gamma x caf\u00e9 na\u00efve \ud83d\ude00 \u20ac\nbeta na\u00efve caf\u00e9 gamma\nna\u00efve \t \t epsilon \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\u20ac na\u00efve na\u00efve \n", +"max_lines": 7, +"overlap": 1, +"max_chars": 120 +}, +{ +"text": "alpha \u20ac epsilon \ud83d\ude00 x \t alpha alpha epsilon \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve caf\u00e9 delta \ndelta x caf\u00e9 \t gamma delta \t epsilon\ndelta \u20ac gamma epsilon epsilon alpha\u2029\ud83d\ude00 beta epsilon delta alpha na\u00efve na\u00efve \u20ac\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 gamma\nalpha gamma epsilon na\u00efve\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve \ud83d\ude00 epsilon\r\nx \ud83d\ude00 x \t\n\t \t beta alpha na\u00efve alpha x caf\u00e9 \n\t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha x \ud83d\ude00 caf\u00e9 \ud83d\ude00 caf\u00e9\n\u20ac \t x\nx \t\u0085epsilon\ngamma \u20ac \ud83d\ude00 caf\u00e9 alpha \ud83d\ude00 \u20ac\r\ndelta\ndelta\ndelta caf\u00e9 epsilon\n\t \t \t \u0085beta beta x \ud83d\ude00 alpha gamma na\u00efve caf\u00e9 delta \r\n \t \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha \u000bgamma na\u00efve beta caf\u00e9 alpha beta delta beta \u20ac\nbeta delta \u20ac \u20ac caf\u00e9\n\n\t caf\u00e9 \u20ac gamma \ud83d\ude00\nalpha caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9\n\u20ac \t \t \u20ac na\u00efve x delta \u20ac epsilon\ncaf\u00e9 \u20ac delta\nna\u00efve gamma caf\u00e9 \ud83d\ude00\nbeta\n\nbeta gamma\ngamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha alpha epsilon delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\n beta \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta caf\u00e9\nepsilon gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\f beta \ud83d\ude00 na\u00efve beta gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\t epsilon beta na\u00efve gamma delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve caf\u00e9 \ud83d\ude00\nna\u00efve alpha delta\nbeta alpha \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon\nna\u00efve na\u00efve \u20ac \nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 \u20ac \t alpha caf\u00e9 beta \n\u000b\t \u20ac\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 alpha \t caf\u00e9 alpha x caf\u00e9 \u20ac\falpha gamma \u20ac caf\u00e9 delta beta beta \u20ac delta\nbeta beta \n\n\t gamma\n\t x x \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\u000bna\u00efve \ud83d\ude00 delta epsilon \ud83d\ude00 \t gamma\ndelta x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \u20ac \u20ac\ndelta beta na\u00efve na\u00efve beta alpha gamma \u20ac na\u00efve gamma caf\u00e9\n\ud83d\ude00 \t gamma x x epsilon delta\nbeta alpha \ud83d\ude00 delta\n\ud83d\ude00 alpha x gamma caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha na\u00efve\n\ud83d\ude00 delta \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 alpha delta \t \t \u20ac\u001ena\u00efve delta x na\u00efve\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \t \t x na\u00efve alpha gamma\u2029gamma \u20ac caf\u00e9 \ud83d\ude00 alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve\n\ud83d\ude00 na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta caf\u00e9 na\u00efve gamma\u001edelta\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac gamma na\u00efve\nalpha caf\u00e9 delta \u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma epsilon \u20ac alpha\n\ud83d\ude00 delta beta\nepsilon \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t alpha\n na\u00efve caf\u00e9 beta beta caf\u00e9 x beta x epsilon \ud83d\ude00\u2029na\u00efve alpha x\r\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha gamma gamma\n\t alpha caf\u00e9 x alpha delta \u20ac \u20ac beta \t \t alpha\n\u20ac alpha beta alpha beta\u0085\nx na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nna\u00efve alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha\n x gamma gamma \u0085beta \ud83d\ude00 \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 alpha na\u00efve beta epsilon na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\falpha\u001dna\u00efve \ud83d\ude00 epsilon epsilon alpha x \u20ac\n delta beta alpha \t x delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx caf\u00e9 na\u00efve alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon alpha na\u00efve \ud83d\ude00 caf\u00e9 \t\r\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 \t gamma alpha \ud83d\ude00\f alpha na\u00efve caf\u00e9 gamma \ud83d\ude00\n\repsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u000b\nbeta x beta \t na\u00efve epsilon gamma \ud83d\ude00 alpha alpha\n x x delta alpha caf\u00e9 na\u00efve gamma\nalpha \ud83d\ude00 alpha x gamma\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma \ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \t x \u20ac alpha \u20ac\ndelta gamma delta epsilon gamma\n na\u00efve delta caf\u00e9 caf\u00e9 x delta caf\u00e9 delta \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve na\u00efve alpha caf\u00e9 delta\n delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac \n\t caf\u00e9 beta\ngamma \ncaf\u00e9 \t gamma beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma \ud83d\ude00 delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t x epsilon delta gamma epsilon alpha beta\rx \t x na\u00efve x\r\ngamma\ndelta \u20ac beta beta gamma\nx\ndelta x na\u00efve \t\n \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac delta \ud83d\ude00 x gamma gamma\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 \t beta caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9\r\nna\u00efve beta epsilon \u20ac \u20ac \n\u001e\u20ac caf\u00e9 epsilon \t \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00 x\ndelta x beta\n\ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve \u20ac \ud83d\ude00 beta\n\n\t\n\u20ac delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x \u20ac\nx alpha \u20ac beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n x alpha \nbeta\ngamma\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \nna\u00efve epsilon epsilon \ud83d\ude00 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha epsilon\n\u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 caf\u00e9 \u20ac \u20ac caf\u00e9 caf\u00e9 gamma\u2029epsilon alpha x caf\u00e9\n\t epsilon delta x x caf\u00e9\u2028beta\ndelta\u2029\n\nna\u00efve x \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t delta\n\nbeta caf\u00e9 \ud83d\ude00 na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001ebeta caf\u00e9 delta delta na\u00efve\u000b\t epsilon alpha\u001c", +"max_lines": 1, +"overlap": 5, +"max_chars": 300 +}, +{ +"text": " epsilon\n alpha\nepsilon epsilon beta caf\u00e9 x na\u00efve\u2028x epsilon \ud83d\ude00 \ud83d\ude00 x alpha\n\u20ac\n beta \u20ac caf\u00e9 \u20ac x caf\u00e9 na\u00efve \u20ac\ndelta\ngamma caf\u00e9 delta \t \ud83d\ude00 \t \u20ac \ngamma na\u00efve epsilon\n\t \ud83d\ude00 delta epsilon \ud83d\ude00 caf\u00e9 alpha\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta\u001ddelta na\u00efve alpha caf\u00e9\n delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x \t beta\n\t caf\u00e9 na\u00efve delta delta alpha alpha\u2028\u20ac caf\u00e9 epsilon na\u00efve beta x x \nx caf\u00e9 \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma epsilon beta \nbeta \t \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 gamma gamma \ud83d\ude00 \u20ac alpha caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta\n\ud83d\ude00 epsilon epsilon \t \nna\u00efve epsilon x na\u00efve \t beta gamma \u20ac \u20ac \t\ndelta x epsilon na\u00efve\n\nalpha x x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac\n\r\ngamma gamma gamma na\u00efve gamma \t gamma \u20ac\u001dx caf\u00e9 gamma delta na\u00efve na\u00efve na\u00efve delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\t na\u00efve caf\u00e9 \t\r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \t \u20ac \t \t gamma\n caf\u00e9 caf\u00e9 \t epsilon \nalpha gamma \ud83d\ude00 epsilon na\u00efve beta\u0085\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x x delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 x \ud83d\ude00\nna\u00efve beta gamma \t epsilon alpha\n\nalpha epsilon \t gamma\nna\u00efve \u20ac gamma delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001ealpha \t delta\u001e beta na\u00efve gamma delta\n \u20ac x \u20ac x\u000b beta\nbeta epsilon \u20ac \ud83d\ude00 alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t\nalpha alpha gamma x x \t \ngamma na\u00efve na\u00efve x gamma epsilon epsilon\nna\u00efve gamma alpha caf\u00e9\n gamma \t \u20ac\u2029\t \t \ud83d\ude00 alpha \t \t epsilon\u0085gamma epsilon\n\n\ud83d\ude00 beta x na\u00efve caf\u00e9 \n\u20ac\ngamma delta \ud83d\ude00 delta alpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac\u001cepsilon gamma \t delta caf\u00e9 gamma x epsilon na\u00efve \u20ac \t\nbeta caf\u00e9 \ud83d\ude00 x na\u00efve\nalpha beta \u20ac \u20ac alpha gamma\ncaf\u00e9 caf\u00e9\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta beta \ndelta x na\u00efve caf\u00e9 alpha alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \nx gamma \ncaf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon \t \t \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nalpha\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta caf\u00e9 alpha\n\t \ud83d\ude00\nalpha beta\ndelta delta \t \u20ac\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta \t \t caf\u00e9 epsilon\ndelta epsilon \t \ngamma gamma caf\u00e9 gamma \u20ac caf\u00e9 delta\fna\u00efve delta \u20ac alpha alpha delta gamma \t gamma\n\nepsilon \u20ac beta\u2029na\u00efve gamma beta \u20ac \ud83d\ude00\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon epsilon epsilon alpha alpha epsilon \u20ac delta\ncaf\u00e9 \ud83d\ude00 na\u00efve\n \u20ac delta\n \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta epsilon gamma x \u20ac beta \u20ac\u000bcaf\u00e9 x gamma delta beta alpha epsilon \u20ac \ud83d\ude00 x caf\u00e9\ngamma \n\u20ac gamma beta \u20ac \u20ac gamma alpha na\u00efve \u2028 \ud83d\ude00 alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma epsilon\nna\u00efve caf\u00e9 \n\ud83d\ude00 \t beta na\u00efve beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t\n", +"max_lines": 13, +"overlap": 3, +"max_chars": 120 +}, +{ +"text": "\ud83d\ude00 x \ud83d\ude00 \ud83d\ude00 delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u000b\t na\u00efve na\u00efve delta \u20ac epsilon delta\u2028delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma caf\u00e9 delta caf\u00e9 \u20ac\nx caf\u00e9 gamma \t epsilon \ud83d\ude00 x \ud83d\ude00 x\n alpha na\u00efve beta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9 gamma\nalpha \ud83d\ude00 alpha epsilon \u20ac \t \ud83d\ude00 \nbeta beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta\nalpha \ud83d\ude00 \t\nalpha x alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac \ud83d\ude00 \t x beta \t \ud83d\ude00 x\nepsilon x caf\u00e9 \t beta\u001cepsilon \t alpha beta epsilon x \ud83d\ude00 alpha\r\ngamma \t caf\u00e9 alpha\nna\u00efve alpha gamma \ndelta \t na\u00efve \t beta beta epsilon\n\ud83d\ude00 \ud83d\ude00\fcaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \t na\u00efve \ud83d\ude00\n\ud83d\ude00\ngamma beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 alpha\ncaf\u00e9 alpha alpha\n beta caf\u00e9 \t caf\u00e9\nalpha caf\u00e9 \ud83d\ude00\n gamma caf\u00e9 \u20ac caf\u00e9 delta alpha epsilon beta beta alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac beta beta delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\ncaf\u00e9 x x \ud83d\ude00 \ud83d\ude00 \ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon \r\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta\n\u20ac epsilon beta x gamma \t \t caf\u00e9 gamma\u000b\ud83d\ude00 delta \t gamma\repsilon epsilon na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\ndelta\nx delta \nna\u00efve x epsilon epsilon gamma \u20ac \t na\u00efve \ud83d\ude00\n x \u20ac na\u00efve alpha\ngamma \ud83d\ude00 caf\u00e9 alpha gamma\nalpha delta caf\u00e9 \u20ac \ud83d\ude00 epsilon delta\r beta beta caf\u00e9 epsilon \u20ac epsilon\n na\u00efve\r\ud83d\ude00 epsilon beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t gamma\u0085caf\u00e9 \u20ac alpha \ud83d\ude00 \u20ac beta epsilon \u20ac\ngamma\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ndelta epsilon epsilon na\u00efve alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta \ud83d\ude00 alpha\n alpha\ngamma caf\u00e9 na\u00efve gamma delta na\u00efve \t\r\t caf\u00e9 \t na\u00efve\u001dbeta epsilon x alpha beta\u001cna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha beta beta epsilon na\u00efve alpha\ngamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta \u20ac beta \t na\u00efve \t\r\t x epsilon \t x caf\u00e9 caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve alpha x\nx epsilon \u20ac beta alpha na\u00efve \u20ac\n gamma\n alpha caf\u00e9 epsilon caf\u00e9 \u20ac caf\u00e9 x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta \t \t \n beta\ncaf\u00e9 delta x\nx \t alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon x beta beta \ud83d\ude00\nx \t caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\u001c\ud83d\ude00 epsilon \t\u2028epsilon epsilon caf\u00e9 epsilon caf\u00e9 x beta gamma x caf\u00e9\n epsilon \t na\u00efve delta caf\u00e9 caf\u00e9 alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u001d beta beta x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\nbeta alpha \u20ac caf\u00e9 delta \u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nx gamma \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma delta \ud83d\ude00 alpha caf\u00e9 gamma gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n\ud83d\ude00\u2028 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta alpha \t gamma x caf\u00e9 x\n\u20ac caf\u00e9 na\u00efve caf\u00e9 alpha \t \u20ac na\u00efve \ud83d\ude00 epsilon \ud83d\ude00\u000b\ud83d\ude00 na\u00efve \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac na\u00efve gamma \u20ac\u001dna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta \nna\u00efve delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 na\u00efve x \u20ac na\u00efve delta delta \ud83d\ude00\nx \ud83d\ude00 gamma \u20ac\nepsilon gamma\r \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha na\u00efve \u20ac x \ud83d\ude00 \t caf\u00e9 alpha epsilon beta\n", +"max_lines": 60, +"overlap": 1, +"max_chars": 4000 +}, +{ +"text": "na\u00efve \t gamma na\u00efve x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \nbeta delta \u20ac \n caf\u00e9 beta gamma x\nx \t gamma beta \t\nalpha alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t gamma gamma alpha epsilon\ncaf\u00e9 x \ud83d\ude00\nna\u00efve gamma \t \u20ac gamma na\u00efve \ud83d\ude00\nepsilon epsilon caf\u00e9\ncaf\u00e9 alpha x caf\u00e9 alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \nbeta\u000b\u0085beta \ud83d\ude00 delta caf\u00e9 gamma caf\u00e9 delta na\u00efve \t\ndelta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma \u20ac alpha alpha beta \t \u20ac \n\ud83d\ude00 \t beta x caf\u00e9 caf\u00e9 alpha epsilon delta epsilon\n\f\ud83d\ude00 \ud83d\ude00\n\ud83d\ude00 \u20ac gamma delta\n", +"max_lines": 60, +"overlap": 5, +"max_chars": 4000 +}, +{ +"text": "delta \ud83d\ude00 gamma \u20ac\ncaf\u00e9 x x epsilon\n alpha x x\u2029x alpha alpha alpha \u20ac beta\n\ud83d\ude00 alpha\nna\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\f\u20ac x \u20ac epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha beta delta \t\nx epsilon\ndelta gamma \u20ac x delta na\u00efve na\u00efve delta \t delta\u001dalpha \u20ac \t x beta \nna\u00efve\u001c \t alpha na\u00efve \t gamma gamma \nepsilon\u2029caf\u00e9 \t \u20ac \t epsilon \u20ac gamma delta epsilon alpha\ncaf\u00e9 na\u00efve\nalpha beta na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9 caf\u00e9 epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma\n\u001d\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9 epsilon \u20ac epsilon \ncaf\u00e9 alpha \t alpha gamma epsilon\nx alpha epsilon\u0085beta na\u00efve na\u00efve beta\ncaf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t beta delta \nna\u00efve x alpha gamma delta na\u00efve\n\ud83d\ude00 caf\u00e9 \u20ac x x gamma delta delta\nalpha beta gamma delta\n epsilon \t x \ud83d\ude00 gamma\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nepsilon gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac\n\u20ac na\u00efve gamma epsilon alpha na\u00efve \u20ac delta\n\rbeta na\u00efve \ud83d\ude00 na\u00efve x beta delta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma \t beta gamma \nna\u00efve gamma \t na\u00efve x \ud83d\ude00 caf\u00e9 \u20ac delta gamma \ud83d\ude00\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t beta epsilon beta \nepsilon beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\fgamma\nepsilon x caf\u00e9 \ud83d\ude00 epsilon caf\u00e9 delta \u20ac x x \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\fbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 delta \u20ac na\u00efve na\u00efve \u20ac \u20ac \u20ac\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma caf\u00e9 na\u00efve na\u00efve epsilon\nx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma delta x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve\ngamma\fepsilon \t epsilon delta caf\u00e9 epsilon caf\u00e9 epsilon\n\t\u001c\ud83d\ude00 \ud83d\ude00 beta \n\nalpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u2029\nbeta \t epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha \u20ac\n\nbeta gamma\nbeta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma \u20ac \ud83d\ude00 \t alpha\r\nx na\u00efve caf\u00e9 gamma caf\u00e9 beta \t \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 delta \u20ac beta beta delta alpha \u2028gamma \t alpha \t x na\u00efve epsilon\n\t na\u00efve caf\u00e9 beta \ud83d\ude00 \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve gamma delta caf\u00e9 \t\n\ud83d\ude00 gamma caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \t beta \u20ac na\u00efve na\u00efve \u20ac beta \u20ac \ud83d\ude00\r\n delta gamma x na\u00efve alpha \u20ac \u20ac gamma caf\u00e9\nx \n\u20ac beta\nalpha delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon\u001ddelta na\u00efve alpha \t x\r\nepsilon caf\u00e9 \ud83d\ude00\n\t epsilon\n x epsilon epsilon\ngamma \u20ac caf\u00e9 na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha \t beta \ud83d\ude00 x \ud83d\ude00 \ud83d\ude00 delta beta\n\t gamma \t na\u00efve caf\u00e9 delta \u20ac\nx \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac \ud83d\ude00 na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac na\u00efve x \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma delta \t caf\u00e9 alpha \nalpha delta epsilon \t caf\u00e9\nalpha na\u00efve alpha \u0085caf\u00e9 alpha na\u00efve epsilon na\u00efve epsilon epsilon x\n\ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\ngamma x gamma \u20ac x\n caf\u00e9 delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta x alpha \ud83d\ude00\n\t beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 gamma x \nalpha \u20ac \t alpha caf\u00e9 caf\u00e9 \n beta \t gamma beta epsilon alpha alpha beta beta\n\u20ac\r\n\ud83d\ude00\u0085na\u00efve epsilon\n x na\u00efve epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha epsilon caf\u00e9 alpha x\nx alpha beta \t\nna\u00efve delta gamma \t epsilon caf\u00e9 \ud83d\ude00 beta\ndelta \ndelta epsilon\n\t \t \u20ac alpha \t \t na\u00efve caf\u00e9 \u20ac gamma\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 gamma na\u00efve \t\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n \t \ud83d\ude00 delta\n\nalpha \t x \t \u20ac \u20ac \u20ac\nalpha gamma x x caf\u00e9 \u20ac alpha caf\u00e9 \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta epsilon x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac \ncaf\u00e9 gamma epsilon delta caf\u00e9 \t beta caf\u00e9 epsilon\u000b\nx \t \ud83d\ude00 alpha epsilon epsilon x \ud83d\ude00 epsilon\n\u20ac na\u00efve \u20ac\n\u20ac epsilon alpha gamma caf\u00e9 alpha caf\u00e9 \t\nx \u20ac \t alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001dx delta alpha delta x x\n beta \ud83d\ude00 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta gamma \f na\u00efve beta \t \t \u20ac x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n caf\u00e9 na\u00efve \u20ac alpha gamma na\u00efve gamma\n\ud83d\ude00 x \ud83d\ude00 x beta \t caf\u00e9 alpha \ud83d\ude00 na\u00efve x\u001e\nalpha delta gamma caf\u00e9 epsilon epsilon \ud83d\ude00 na\u00efve x\ndelta x beta \ud83d\ude00 \ud83d\ude00 x caf\u00e9 na\u00efve x\u2029\t beta \t alpha caf\u00e9 x alpha delta delta\n\u20ac alpha \t gamma \u20ac \ud83d\ude00 epsilon delta na\u00efve \u20ac caf\u00e9\u001e \t alpha na\u00efve alpha \ud83d\ude00 alpha \ud83d\ude00 gamma \ngamma gamma \t delta \t\n\t\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9 gamma\n \ud83d\ude00\rx caf\u00e9 x \u20ac delta beta \u20ac alpha epsilon beta\u0085x epsilon delta \t\nna\u00efve\nna\u00efve gamma epsilon alpha \nx \ud83d\ude00 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n delta na\u00efve beta \t \u20ac\nalpha epsilon beta x\u001c\ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nbeta \ud83d\ude00 alpha na\u00efve delta\n\n gamma x x alpha \t beta\u001e", +"max_lines": 13, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "\ud83d\ude00 \t na\u00efve beta delta \u20ac \ud83d\ude00 x\n\n delta \u20ac \t \ud83d\ude00 alpha \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ncaf\u00e9 na\u00efve na\u00efve\u0085beta x x \ud83d\ude00 \ud83d\ude00 delta na\u00efve\nalpha delta caf\u00e9 x delta alpha \u20ac x \ud83d\ude00\n gamma \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma \ud83d\ude00 \u001d\ud83d\ude00 na\u00efve delta na\u00efve alpha beta beta \ud83d\ude00 \ud83d\ude00\u2029alpha gamma alpha caf\u00e9 epsilon \u20ac delta x epsilon delta\n\u0085\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x gamma delta\u000b\u2028epsilon \ud83d\ude00 \t na\u00efve delta\nx delta epsilon\n\t\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\t\u000bgamma \ud83d\ude00 \t \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x beta\n alpha\u2028delta x alpha \t x \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 \u20ac na\u00efve\n\u20ac beta \u20ac epsilon \u20ac x delta\ngamma \u20ac \ud83d\ude00 \ud83d\ude00 \ud83d\ude00\n\u20ac beta \t x \ndelta\u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \u20ac\u2029delta \t \t delta \ud83d\ude00 gamma alpha na\u00efve gamma \ud83d\ude00\n\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\u0085\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma\n \nx x delta caf\u00e9 \t\fdelta beta \u20ac epsilon epsilon\nna\u00efve \u20ac \t\n\t caf\u00e9 epsilon caf\u00e9 alpha epsilon x \n\u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \ud83d\ude00 epsilon \ud83d\ude00 epsilon beta na\u00efve delta\ncaf\u00e9 alpha \t\ngamma gamma \u20ac beta \ud83d\ude00 gamma \u20ac \t na\u00efve na\u00efve\n\u20ac alpha\ndelta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta x epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t caf\u00e9 beta\repsilon\n beta\u0085\ud83d\ude00\nalpha delta delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta\n\rna\u00efve \u20ac gamma \u20ac \ud83d\ude00 \t \u001depsilon x\nbeta \ud83d\ude00 x alpha na\u00efve beta caf\u00e9\ndelta x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x\nna\u00efve beta\nalpha \t na\u00efve alpha\u000b\t \ud83d\ude00 caf\u00e9 \u20ac \n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac \ud83d\ude00 \n\u20ac na\u00efve \u20ac alpha gamma alpha gamma gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ralpha caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n caf\u00e9 \u20ac\u001egamma \ud83d\ude00 \t\ndelta x \ud83d\ude00 alpha\n\t x \ud83d\ude00 \u20ac\nepsilon\ndelta na\u00efve alpha caf\u00e9 \u20ac \t na\u00efve \ud83d\ude00\n\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx beta\nbeta\u2028beta x \u20ac\n\ud83d\ude00 beta beta\ncaf\u00e9 beta gamma beta x delta na\u00efve \t alpha epsilon\u2028 \ud83d\ude00 epsilon epsilon \ud83d\ude00 \ud83d\ude00 \ud83d\ude00 alpha\nbeta\u2029alpha \ud83d\ude00 na\u00efve \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon\nx \nx \ud83d\ude00 caf\u00e9 alpha alpha epsilon alpha \ud83d\ude00\u0085\u20ac epsilon \u20ac x epsilon \ud83d\ude00 \ud83d\ude00 gamma epsilon x \u2028gamma x epsilon beta delta gamma \u20ac \ud83d\ude00 beta \u20ac epsilon \ud83d\ude00\r\nalpha gamma delta \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve caf\u00e9 na\u00efve caf\u00e9 x \u20ac\n x epsilon\fbeta \t alpha x epsilon \nna\u00efve beta caf\u00e9 caf\u00e9 na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n", +"max_lines": 1, +"overlap": 5, +"max_chars": 300 +}, +{ +"text": "\u20ac caf\u00e9 gamma \u20ac x\ndelta x caf\u00e9\nx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha epsilon \u20ac alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 \t \ud83d\ude00 beta x \ud83d\ude00 alpha delta x \t gamma beta\n\t alpha gamma gamma na\u00efve \u20ac \t alpha \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac gamma delta gamma\nepsilon \t gamma delta caf\u00e9 epsilon \t delta na\u00efve \ud83d\ude00 \ud83d\ude00\nna\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta x \ud83d\ude00 gamma caf\u00e9 alpha \ud83d\ude00 na\u00efve delta x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta\n\t \ud83d\ude00 beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\u000b \u20ac \u2028epsilon gamma\ncaf\u00e9 caf\u00e9\n\ud83d\ude00 \u20ac alpha beta caf\u00e9\n beta \ud83d\ude00 caf\u00e9\ncaf\u00e9\n\nbeta beta delta epsilon\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon delta \ud83d\ude00 alpha caf\u00e9\n x \t alpha \t\u001cepsilon x \ud83d\ude00 beta gamma\u000b\nx caf\u00e9 \ud83d\ude00 na\u00efve x gamma\ncaf\u00e9\n\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta gamma caf\u00e9 \t \nalpha \t alpha \t alpha alpha gamma \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 \ud83d\ude00 caf\u00e9 delta epsilon gamma\n\ud83d\ude00 \ud83d\ude00 na\u00efve gamma \u20ac\ndelta delta \ud83d\ude00\n\ndelta epsilon beta caf\u00e9 \ud83d\ude00 beta\n\ncaf\u00e9 \t x na\u00efve \ud83d\ude00 \u20ac \u20ac\ngamma alpha na\u00efve\u001c \n", +"max_lines": 1, +"overlap": 3, +"max_chars": 17 +}, +{ +"text": "\t beta x \t epsilon\r\ncaf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma x \ud83d\ude00 x alpha x\nbeta caf\u00e9 alpha x\n\ud83d\ude00 beta x \t epsilon delta\nx \t gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta epsilon beta gamma\nna\u00efve\n\u20ac na\u00efve caf\u00e9 delta caf\u00e9 epsilon na\u00efve \t gamma gamma \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha beta beta x na\u00efve \ud83d\ude00 \t \t \t beta\u001e\t \t epsilon \ud83d\ude00 epsilon \u20ac \t \ud83d\ude00 \ud83d\ude00\nna\u00efve \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001d\r\nbeta alpha caf\u00e9 \t \u20ac epsilon x epsilon x \ud83d\ude00 caf\u00e9\n na\u00efve \u20ac gamma x\n alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085gamma epsilon caf\u00e9 caf\u00e9 caf\u00e9 epsilon\ncaf\u00e9 delta caf\u00e9 caf\u00e9 na\u00efve\nalpha\nna\u00efve delta delta x na\u00efve na\u00efve caf\u00e9 delta alpha delta\n epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x beta beta \ud83d\ude00 na\u00efve \ud83d\ude00\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma beta caf\u00e9 x epsilon gamma gamma\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon gamma delta\n\u20ac gamma \ud83d\ude00 gamma delta x epsilon \u20ac caf\u00e9\n\n\ud83d\ude00 gamma delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta \t \u20ac delta\n\nalpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma epsilon delta\ncaf\u00e9 caf\u00e9 \u20ac x\nalpha \ud83d\ude00 \t delta delta caf\u00e9 \ud83d\ude00 \u20ac\u001cepsilon \t \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\t alpha beta delta na\u00efve beta \t delta\u2028caf\u00e9 caf\u00e9 alpha beta alpha \n\t alpha epsilon epsilon gamma gamma \u20ac caf\u00e9\u001ddelta\ngamma na\u00efve na\u00efve gamma \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha gamma\u001e", +"max_lines": 7, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t \ud83d\ude00 caf\u00e9 \t alpha \ud83d\ude00\n\u001cgamma \t\u001cgamma caf\u00e9 \u20ac \u20ac na\u00efve beta beta x\n\ud83d\ude00\u000b gamma na\u00efve \u20ac alpha caf\u00e9 caf\u00e9 \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve \ud83d\ude00 epsilon delta caf\u00e9\n\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 delta\ndelta gamma caf\u00e9 na\u00efve x x beta alpha\ngamma caf\u00e9 epsilon\nbeta \t alpha caf\u00e9 \u20ac\ndelta \u20ac x \t epsilon \t epsilon caf\u00e9 \nbeta caf\u00e9\u001d na\u00efve na\u00efve \ud83d\ude00 na\u00efve gamma \u20ac \u0085 epsilon caf\u00e9 alpha na\u00efve \t \ud83d\ude00 \u20ac epsilon delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon delta x \t x beta \n\u001cx alpha x epsilon gamma \t beta x\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 \t gamma\r\n delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\n alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \nx caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha delta caf\u00e9 \nx x na\u00efve caf\u00e9 epsilon \t\nbeta \t gamma alpha\u001d\u20ac\u0085\nepsilon \nalpha alpha beta\n\u20ac delta na\u00efve gamma epsilon beta gamma \t \t caf\u00e9\nbeta epsilon delta \ud83d\ude00 \t\n\ud83d\ude00 alpha \t \t \t\n\t x x\nbeta alpha gamma \t \ud83d\ude00\ncaf\u00e9 gamma \t gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma \ud83d\ude00 delta caf\u00e9 x x\nalpha beta beta alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\u2029na\u00efve \u20ac epsilon \n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve\ngamma beta gamma epsilon \t x x \t gamma\nx \t epsilon \u000b longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve alpha \u20ac \ud83d\ude00 \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha delta beta\r\ndelta\u2029\t caf\u00e9 gamma caf\u00e9 epsilon alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\n\ud83d\ude00 alpha delta x beta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nalpha beta na\u00efve epsilon \ud83d\ude00 gamma \nepsilon \nalpha epsilon x \ud83d\ude00 \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t alpha\u001c \u20ac alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nx alpha delta \u20ac \t gamma epsilon na\u00efve alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve gamma alpha beta \t alpha epsilon alpha \nbeta alpha \u20ac beta x \t \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nbeta gamma \t alpha beta \u20ac gamma epsilon\nalpha delta alpha alpha \ud83d\ude00 epsilon beta\n beta beta caf\u00e9 \ud83d\ude00 epsilon\n\ndelta \t na\u00efve gamma epsilon caf\u00e9\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta gamma gamma\ncaf\u00e9 \u20ac caf\u00e9 caf\u00e9 na\u00efve epsilon delta delta \t\nepsilon x alpha \u20ac alpha \u20ac x caf\u00e9 \nbeta x na\u00efve \t \u20ac \nalpha \u20ac x \n\t\n\u20ac na\u00efve delta gamma alpha \t \u20ac caf\u00e9 \rcaf\u00e9 na\u00efve caf\u00e9 epsilon epsilon epsilon na\u00efve epsilon \t\n epsilon x na\u00efve beta\n\u20ac beta gamma \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x delta beta caf\u00e9 epsilon na\u00efve na\u00efve delta na\u00efve \f\ud83d\ude00 alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta x x\u2029beta\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\nepsilon caf\u00e9 gamma\nna\u00efve alpha delta x \t caf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u0085beta \u20ac \u20ac gamma delta \u20ac \n\ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve beta gamma \u20ac \u20ac\n\ud83d\ude00 delta epsilon x\r\nbeta x delta \ud83d\ude00 x\nalpha epsilon \t alpha caf\u00e9 caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac delta gamma epsilon\u0085epsilon\ngamma \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha na\u00efve x na\u00efve\n\u20ac alpha x gamma \ud83d\ude00 gamma na\u00efve gamma\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\nx\n\u20ac gamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta \ud83d\ude00 \nna\u00efve delta epsilon alpha delta na\u00efve epsilon \u20ac \f\ud83d\ude00 x \u20ac\nna\u00efve \t alpha \t na\u00efve na\u00efve x x \t alpha gamma\rna\u00efve alpha \t x alpha \u20ac epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 beta \t \u20ac epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon \u20ac \u20ac \u20ac alpha \u20ac\nna\u00efve x alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9\u001e\nx x gamma \u20ac epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000bcaf\u00e9 x gamma gamma \ud83d\ude00 \ud83d\ude00 \t \t epsilon \u20ac\u001e\t na\u00efve \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha\nx\u001d\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9 \nna\u00efve caf\u00e9 caf\u00e9 \u20ac\n\u001dalpha epsilon gamma beta\n", +"max_lines": 2, +"overlap": 0, +"max_chars": 4000 +}, +{ +"text": "\n \ud83d\ude00 gamma epsilon beta \ud83d\ude00 epsilon delta gamma caf\u00e9\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t\ndelta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac \t\n\u20ac na\u00efve beta \u20ac caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \n\repsilon \u20ac na\u00efve na\u00efve epsilon \t gamma beta beta \ud83d\ude00\ndelta alpha gamma\nalpha beta \u20ac beta gamma\ngamma delta alpha na\u00efve caf\u00e9 caf\u00e9 na\u00efve na\u00efve caf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00 gamma beta caf\u00e9 alpha beta alpha alpha \t epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x caf\u00e9 beta na\u00efve gamma delta \ud83d\ude00 \u20ac gamma\ndelta epsilon \n \ud83d\ude00\n\ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2029epsilon na\u00efve gamma \t caf\u00e9 \t \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha beta\nalpha delta epsilon alpha\nalpha\nna\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 alpha\u001d \u20ac \u20ac \ngamma caf\u00e9 \ud83d\ude00 alpha alpha \t delta na\u00efve alpha beta \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta x beta\n delta\rbeta na\u00efve gamma \ud83d\ude00 delta \u20ac \ud83d\ude00\u000b\t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\n\nalpha caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \t \t \ud83d\ude00\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 na\u00efve alpha \n\t na\u00efve na\u00efve na\u00efve \t beta epsilon delta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha x alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac\ngamma alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 alpha alpha alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\ncaf\u00e9 alpha \t epsilon alpha beta x gamma caf\u00e9\nx x caf\u00e9\nna\u00efve alpha x na\u00efve\nalpha delta \ud83d\ude00 x epsilon \t\n gamma gamma alpha \u20ac x \ud83d\ude00 \ud83d\ude00 delta epsilon caf\u00e9\ndelta delta delta beta alpha \ud83d\ude00 caf\u00e9 beta\n\ud83d\ude00 delta delta caf\u00e9 x caf\u00e9 alpha alpha \ud83d\ude00 alpha\n\t beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nbeta na\u00efve delta delta na\u00efve x gamma beta\fbeta \t\nepsilon delta caf\u00e9 delta x gamma gamma beta beta \n gamma epsilon\n gamma alpha gamma \t\nalpha x delta gamma na\u00efve epsilon \t \u20ac na\u00efve na\u00efve \ud83d\ude00\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve epsilon delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ngamma delta epsilon beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ud83d\ude00 delta caf\u00e9 \t epsilon\u001d caf\u00e9 beta delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \nbeta\n\ud83d\ude00 \t x beta \u20ac \t x beta \n\ngamma \ud83d\ude00\nna\u00efve caf\u00e9 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00\n\u20ac \t x epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nx\ngamma beta x \t gamma \u20ac beta alpha x\r\nalpha \t x beta epsilon \ud83d\ude00 gamma alpha gamma \ud83d\ude00\n gamma epsilon beta\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n delta \u20ac beta\nalpha epsilon caf\u00e9 beta alpha caf\u00e9\n\u0085\t gamma alpha caf\u00e9 \t gamma gamma \u20ac\r\nbeta alpha \nna\u00efve beta epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma gamma\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta alpha \u20ac\n gamma na\u00efve epsilon\n\ud83d\ude00 \t \t beta delta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \rcaf\u00e9 x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac \ngamma x\ndelta \ud83d\ude00 caf\u00e9 beta gamma gamma na\u00efve beta \u20ac\n beta delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 x caf\u00e9\nepsilon beta x\n\u2028gamma \t\u2028\ud83d\ude00\u001dbeta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\n\nbeta \ud83d\ude00 caf\u00e9 beta gamma\nna\u00efve caf\u00e9 x \u20ac epsilon beta\nbeta delta x alpha \u20ac\u2029\u20ac beta na\u00efve alpha \u20ac beta epsilon \u20ac x epsilon\r\ngamma \u001ex \nalpha alpha \u20ac \ud83d\ude00 gamma \ud83d\ude00 \u20ac\r\fna\u00efve caf\u00e9 x \t beta delta\n\n\ud83d\ude00 epsilon x \ud83d\ude00 delta alpha alpha \u20ac \t\n\t\n\t beta gamma \u20ac caf\u00e9\n\u20ac delta \t \ud83d\ude00 epsilon \t delta na\u00efve \ud83d\ude00 \ud83d\ude00 caf\u00e9\n\n\ud83d\ude00 alpha \t \t x epsilon na\u00efve\r\ncaf\u00e9 x na\u00efve\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x gamma \u20ac delta na\u00efve\u001ddelta caf\u00e9\n\ud83d\ude00 x\nbeta \ud83d\ude00 \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\f", +"max_lines": 60, +"overlap": 0, +"max_chars": 17 +}, +{ +"text": "epsilon x delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\u20ac\ncaf\u00e9 alpha gamma \nepsilon gamma na\u00efve \t delta beta \u20ac\ncaf\u00e9 beta caf\u00e9 \t delta\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha caf\u00e9 delta \t \n caf\u00e9 delta na\u00efve alpha x\n beta delta \t \n\u20ac \u20ac \ud83d\ude00 \t x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\f\ud83d\ude00 epsilon delta \u20ac beta gamma\n\nalpha \t \t x \ud83d\ude00 x gamma alpha\nalpha caf\u00e9 na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac caf\u00e9 delta x \n\n\u001e\t \t alpha \t x alpha\ngamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac caf\u00e9\nalpha gamma gamma gamma gamma \t\n\n epsilon caf\u00e9\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x\n\u20ac beta \ud83d\ude00 alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t x gamma delta gamma\n epsilon na\u00efve\u000bdelta gamma gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta \t alpha\u000bbeta \ud83d\ude00 beta alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac \t\nx \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x\n\u20ac beta epsilon caf\u00e9 epsilon gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x\u000b\ud83d\ude00 \ud83d\ude00\n\n beta\ngamma delta gamma delta gamma delta \t gamma beta alpha\nna\u00efve na\u00efve epsilon beta alpha \t\n\u20ac caf\u00e9 \ud83d\ude00 alpha caf\u00e9 beta \t \u20ac na\u00efve\u2029\ud83d\ude00 \u20ac delta\u000bepsilon caf\u00e9 epsilon epsilon \u20ac caf\u00e9 delta epsilon\nbeta epsilon \ud83d\ude00 delta \u20ac \ud83d\ude00 \n\n", +"max_lines": 2, +"overlap": 5, +"max_chars": 300 +}, +{ +"text": "x \ud83d\ude00 na\u00efve na\u00efve x na\u00efve \u20ac \u20ac\ncaf\u00e9 alpha \ud83d\ude00\n\n\t alpha na\u00efve na\u00efve epsilon \ncaf\u00e9 na\u00efve \u20ac beta \ud83d\ude00 caf\u00e9 \ud83d\ude00 \ud83d\ude00 caf\u00e9\r\ud83d\ude00 \ud83d\ude00 gamma alpha \nalpha epsilon caf\u00e9 delta gamma \ud83d\ude00 gamma caf\u00e9 epsilon\nx \u20ac \ud83d\ude00 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x \ud83d\ude00 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\u2028\t x caf\u00e9 beta beta beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma na\u00efve gamma delta gamma x beta na\u00efve\u001c\ndelta epsilon beta caf\u00e9 caf\u00e9 x delta\n\nbeta epsilon gamma x alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nna\u00efve\u2029x alpha \ud83d\ude00\nbeta epsilon\n gamma na\u00efve delta delta delta beta\n epsilon \u20ac beta \ud83d\ude00 na\u00efve \u20ac alpha caf\u00e9 beta\ncaf\u00e9 \t x x caf\u00e9 \t\n\u20ac delta caf\u00e9 caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\t \t beta na\u00efve epsilon delta x alpha delta epsilon\r\ndelta \ud83d\ude00 x \t x beta\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta na\u00efve gamma x gamma caf\u00e9\r\ngamma \u20ac\nepsilon na\u00efve \ud83d\ude00 caf\u00e9 beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\n\t beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha na\u00efve \ud83d\ude00 \rx caf\u00e9 epsilon delta epsilon alpha \u001ebeta alpha \u20ac \t\nepsilon x na\u00efve\n\ud83d\ude00 \t delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta beta beta\u2028epsilon beta delta \u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac \nx \t\n beta gamma\u2028 \u20ac gamma\u2028na\u00efve \t \ud83d\ude00 na\u00efve \ud83d\ude00 \ud83d\ude00\nalpha\r\nalpha beta caf\u00e9 caf\u00e9\n\ud83d\ude00 alpha beta caf\u00e9 \t\n \u20ac gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\t delta na\u00efve x beta \t alpha caf\u00e9\n\t \u20ac \ud83d\ude00 caf\u00e9 gamma\n\n\ngamma x epsilon \ud83d\ude00 \u20ac\r\t \t delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 gamma\ndelta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac \u20ac alpha epsilon\r\f\nna\u00efve\nx x beta \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon beta \t\nalpha \t caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta epsilon x \rx x x epsilon caf\u00e9 epsilon\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\u2028 delta caf\u00e9 x epsilon \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma \t na\u00efve \ud83d\ude00 \ud83d\ude00 gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x delta na\u00efve x \u20ac\nalpha \t x delta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac beta gamma alpha \u20ac \u20ac\u2028\t na\u00efve gamma\ndelta alpha alpha \ud83d\ude00 \t delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta beta\u001egamma x x delta gamma \t \t caf\u00e9 gamma\n \u20ac x \t alpha \t\n\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma delta epsilon epsilon \u20ac \ud83d\ude00\f", +"max_lines": 60, +"overlap": 0, +"max_chars": 300 +}, +{ +"text": "caf\u00e9 x delta x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta alpha \n\ud83d\ude00 na\u00efve caf\u00e9 gamma caf\u00e9 caf\u00e9 gamma\n\n\nbeta delta na\u00efve na\u00efve alpha\ngamma gamma na\u00efve x x delta x\nepsilon \ud83d\ude00 alpha na\u00efve alpha\ngamma alpha \ud83d\ude00 caf\u00e9 \u20ac na\u00efve x \u000bcaf\u00e9 \t \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t x caf\u00e9 epsilon caf\u00e9 gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma caf\u00e9 delta na\u00efve delta epsilon\nalpha gamma caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon epsilon \ud83d\ude00 caf\u00e9\nx \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 x alpha\u2028caf\u00e9 \ud83d\ude00\n\u20ac gamma \u20ac\r gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve \t delta beta \t\nna\u00efve \ud83d\ude00 delta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta\u001e\t\n beta x epsilon epsilon gamma caf\u00e9 \ud83d\ude00 delta alpha\fgamma delta alpha gamma epsilon gamma \u20ac \u20ac x delta\ngamma epsilon \u20ac alpha \u20ac \n\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x \t epsilon delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma caf\u00e9 \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve delta epsilon x\n gamma caf\u00e9\u2028", +"max_lines": 13, +"overlap": 1, +"max_chars": 17 +}, +{ +"text": "caf\u00e9 \t caf\u00e9 caf\u00e9 \ud83d\ude00\n\n\t x beta \ud83d\ude00 x \ud83d\ude00 na\u00efve\nna\u00efve \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma \t \ud83d\ude00\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x \u20ac\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha epsilon\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 gamma \t\u001e\u20ac alpha \ud83d\ude00 \t \u20ac delta \u20ac beta \u20ac\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\t x beta \t \u20ac\nna\u00efve\n\ud83d\ude00\n\u20ac delta beta \u20ac na\u00efve delta beta \u20ac \t x \nalpha alpha alpha \u20ac beta beta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \ud83d\ude00 caf\u00e9 delta \ncaf\u00e9 alpha \ud83d\ude00 gamma epsilon gamma \u20ac \ud83d\ude00 \t \u20ac\nalpha caf\u00e9 \ud83d\ude00 \u20ac caf\u00e9 x\nna\u00efve \r x beta \u20ac na\u00efve\ncaf\u00e9 \t epsilon \t \ud83d\ude00\n\u20ac gamma delta \ud83d\ude00\nepsilon \ud83d\ude00\n\ud83d\ude00 \nepsilon \ud83d\ude00\fna\u00efve gamma beta \u20ac \t beta na\u00efve gamma alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 caf\u00e9 alpha delta epsilon epsilon \u20ac\nbeta \u20ac epsilon x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon epsilon gamma\nbeta caf\u00e9 \ud83d\ude00 x\u001cgamma caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 beta\rbeta caf\u00e9 x gamma \t alpha\n\u20ac \u20ac alpha \u20ac gamma epsilon gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha\ndelta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta delta na\u00efve beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\ngamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma gamma\nbeta beta delta \t\n alpha na\u00efve \ud83d\ude00 x caf\u00e9 x beta \t\n\t epsilon \t delta \n\u20ac beta \u20ac \n\t \u20ac beta alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta gamma beta \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta beta\u001egamma epsilon epsilon na\u00efve epsilon epsilon delta x\nepsilon \t \u20ac\nepsilon na\u00efve beta beta \u20ac \u20ac caf\u00e9 \ud83d\ude00 caf\u00e9\nalpha x caf\u00e9 \t na\u00efve x beta alpha caf\u00e9 gamma epsilon\nalpha x gamma \t \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t\u0085 \t epsilon x \n beta epsilon delta \t delta \t \u0085delta na\u00efve delta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve x caf\u00e9 epsilon \u20ac\n caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve x \ud83d\ude00 gamma na\u00efve \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t beta\nepsilon gamma\n\t epsilon beta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\nbeta x \ud83d\ude00 \u20ac \ud83d\ude00 epsilon x \u20ac\n na\u00efve delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \t \ud83d\ude00 \ud83d\ude00\nbeta beta alpha beta\nx \t delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta\nalpha epsilon gamma na\u00efve gamma \u20ac caf\u00e9 na\u00efve\u001edelta epsilon gamma x beta \ud83d\ude00 alpha x\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx\u0085\u20ac \u20ac na\u00efve caf\u00e9\ncaf\u00e9 epsilon \ud83d\ude00 x x na\u00efve gamma \u20ac na\u00efve\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 beta delta caf\u00e9\r\nepsilon \t alpha\u2028\nepsilon x gamma \u20ac \u20ac \u20ac \t \t\nna\u00efve \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028epsilon \u20ac alpha beta alpha\nx delta epsilon caf\u00e9 \u20ac na\u00efve\nx \ud83d\ude00 alpha \ud83d\ude00 \u20ac gamma na\u00efve\n\ngamma epsilon x \t delta beta beta \ud83d\ude00 alpha na\u00efve beta\u0085\ud83d\ude00 delta \u20ac beta beta alpha \t \t epsilon\n\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta beta delta caf\u00e9 alpha caf\u00e9 beta \n\t\nbeta x \u20ac\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta \u20ac beta \ud83d\ude00 delta na\u00efve beta \u20ac beta \u20ac \u20ac\u001cna\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t beta\u001edelta \u20ac epsilon beta\n\ncaf\u00e9 \ud83d\ude00 gamma \ud83d\ude00 delta \ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\ud83d\ude00 \ud83d\ude00 x beta \u20ac beta \u20ac \ud83d\ude00 \u20ac\r\n\t \u20ac epsilon \ud83d\ude00 gamma x x \u20ac \u20ac \u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon delta\ncaf\u00e9 \ud83d\ude00 x beta \ud83d\ude00 alpha gamma x\ngamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 delta caf\u00e9 delta\n\u20ac \u001cdelta alpha x na\u00efve beta \t\n alpha \ud83d\ude00 na\u00efve \t na\u00efve \ud83d\ude00 alpha \n alpha caf\u00e9 epsilon alpha beta na\u00efve \n\u2028alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta caf\u00e9 na\u00efve na\u00efve \ud83d\ude00 caf\u00e9 gamma\ngamma \t delta x\nx beta epsilon beta x delta \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n\u20ac caf\u00e9\n gamma x gamma beta\u0085caf\u00e9 \u20ac \ncaf\u00e9 \t na\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac gamma \ud83d\ude00 \u20ac x\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 x gamma \ud83d\ude00 alpha \u20ac epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \ud83d\ude00 x\ndelta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon delta beta\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "\nbeta na\u00efve alpha \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha x \r\n\ncaf\u00e9 x beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\n \n\ud83d\ude00 caf\u00e9 beta \ud83d\ude00 x alpha \t na\u00efve \ud83d\ude00 \t epsilon\n\n beta alpha \ud83d\ude00 \t alpha\n\nepsilon alpha\n\u20ac delta gamma \t\nbeta alpha x delta \t beta \n\ud83d\ude00 x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha \ud83d\ude00 delta \u20ac na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 alpha \u20ac gamma\u001ena\u00efve\r\ngamma na\u00efve beta gamma \t \t alpha epsilon gamma\u001ex beta x \u20ac na\u00efve \ud83d\ude00 caf\u00e9 na\u00efve \ngamma \u20ac delta epsilon x \t alpha delta \ud83d\ude00 \ud83d\ude00 x\ndelta delta caf\u00e9 epsilon caf\u00e9 x \t beta\fgamma na\u00efve gamma\n\t alpha\n\n\ngamma \t na\u00efve alpha gamma \u20ac gamma\n alpha epsilon caf\u00e9 beta beta epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n caf\u00e9 beta caf\u00e9 delta\u001c\f\ud83d\ude00 beta gamma x gamma gamma caf\u00e9 caf\u00e9 alpha x \nx x gamma \t alpha na\u00efve\u2028alpha caf\u00e9 gamma\n\n\nalpha gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x epsilon x alpha \nalpha epsilon epsilon \u20ac gamma \t caf\u00e9 \t\n\ud83d\ude00 gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve \ud83d\ude00\ndelta x epsilon gamma gamma epsilon \u20ac caf\u00e9 \t\nna\u00efve\u0085x beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha\nna\u00efve x na\u00efve\nepsilon caf\u00e9 \u20ac na\u00efve\u001cgamma epsilon \t epsilon beta alpha\u0085 alpha delta delta beta na\u00efve \t\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nx \ud83d\ude00 alpha gamma delta caf\u00e9 delta\u2029 \ud83d\ude00 delta x \ud83d\ude00 alpha beta beta\nna\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve\n\n\u20ac epsilon caf\u00e9\fdelta \u20ac \u20ac epsilon alpha x gamma x delta epsilon\n\t delta beta na\u00efve epsilon delta beta beta \u20ac alpha\n beta\n\n x beta x gamma \u20ac alpha\n\t caf\u00e9 alpha\nepsilon na\u00efve \u20ac gamma na\u00efve \t caf\u00e9 \u20ac\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001cx epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve caf\u00e9 gamma caf\u00e9 \u20ac gamma beta na\u00efve gamma\ndelta \u20ac na\u00efve epsilon delta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \u20ac\n\u20ac epsilon \ud83d\ude00 na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac alpha caf\u00e9\nepsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 delta beta na\u00efve \ud83d\ude00 na\u00efve na\u00efve alpha\nbeta epsilon epsilon delta gamma x delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000bbeta alpha \t beta gamma epsilon\nepsilon\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t epsilon beta caf\u00e9 \u20ac\ncaf\u00e9 caf\u00e9 beta \u20ac beta \ud83d\ude00 gamma epsilon\n\ud83d\ude00\n\u20ac \ud83d\ude00 delta\n x beta \u20ac beta gamma \ud83d\ude00 gamma caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta alpha epsilon\n\u20ac gamma\u001dgamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x alpha caf\u00e9 \t\u0085alpha alpha beta gamma na\u00efve\u000b\ud83d\ude00 x\nna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta alpha caf\u00e9\ncaf\u00e9 caf\u00e9 na\u00efve delta\u001d beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \ud83d\ude00\u000bna\u00efve \t x \ud83d\ude00 gamma caf\u00e9\nx\u001c \t epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \u20ac beta \t \n\u001dgamma alpha \ud83d\ude00 beta na\u00efve epsilon \u20ac\n alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\u001c na\u00efve beta alpha epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ud83d\ude00\nna\u00efve delta na\u00efve \ud83d\ude00\nbeta na\u00efve\n\t na\u00efve caf\u00e9 caf\u00e9 epsilon beta \t epsilon delta\u000bcaf\u00e9 beta x\u2029x epsilon gamma \u20ac caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x x gamma x x alpha na\u00efve\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nx epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t\n\u20ac delta \u20ac epsilon beta alpha delta\u2029alpha alpha beta \t caf\u00e9 na\u00efve na\u00efve gamma\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\u000bgamma gamma epsilon epsilon\ncaf\u00e9 beta \t \ud83d\ude00 delta\u0085\u20ac x x\u001cx caf\u00e9 x\n\t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta \u20ac delta gamma\n\ud83d\ude00 x caf\u00e9 na\u00efve x \u20ac\n\u20ac alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta \t\n \ud83d\ude00 \t gamma beta delta\fx delta beta \t \ud83d\ude00 na\u00efve \t alpha beta x \u20ac\n\t \t epsilon\ncaf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon delta epsilon\n \u2028\ud83d\ude00 \f\ud83d\ude00 na\u00efve beta gamma alpha \u20ac alpha \u20ac gamma na\u00efve \u20ac\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\nalpha x\n\nbeta \ud83d\ude00 delta gamma \t \ud83d\ude00 caf\u00e9 alpha epsilon beta\r\n\ud83d\ude00 \t caf\u00e9 caf\u00e9\u2028beta caf\u00e9 alpha\ndelta \t \u20ac beta \ud83d\ude00\n", +"max_lines": 13, +"overlap": 5, +"max_chars": 120 +}, +{ +"text": "\ud83d\ude00 delta x beta delta \t na\u00efve\u2029\u20ac gamma caf\u00e9 beta caf\u00e9 x delta\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve delta beta gamma delta\u001dna\u00efve alpha caf\u00e9 x \t x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t \ud83d\ude00 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma beta delta\n\ud83d\ude00 x \u20ac \ud83d\ude00\nepsilon delta na\u00efve \ud83d\ude00 na\u00efve \ud83d\ude00 gamma beta caf\u00e9 caf\u00e9 \ud83d\ude00\n\ud83d\ude00 \ud83d\ude00 delta\u0085epsilon \ud83d\ude00\n\t epsilon epsilon \u20ac beta\n\u20ac na\u00efve\ncaf\u00e9 \t epsilon\n\u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 x\u0085\t epsilon \ud83d\ude00 delta alpha \t\n\ud83d\ude00 \ngamma gamma beta x caf\u00e9 delta alpha \u20ac\n\u0085gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9 \t \u20ac delta epsilon gamma gamma\nbeta x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nx alpha gamma caf\u00e9 \u2028\ndelta \ud83d\ude00\nbeta gamma delta \ud83d\ude00 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\n", +"max_lines": 1, +"overlap": 3, +"max_chars": 17 +}, +{ +"text": "caf\u00e9 caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 alpha \ud83d\ude00 na\u00efve beta epsilon \ud83d\ude00 x \u20ac\nepsilon\u2028\u20ac epsilon \t \t caf\u00e9 \t\n\u2028epsilon epsilon delta gamma caf\u00e9 x\ndelta \ud83d\ude00 alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\nx caf\u00e9 x x gamma \ud83d\ude00\u001c\ud83d\ude00 alpha gamma\n \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \u20ac gamma x \ud83d\ude00 \t gamma\ndelta\u0085\n\t gamma \t epsilon epsilon \ud83d\ude00\u001ealpha na\u00efve caf\u00e9 gamma \u20ac \t delta epsilon\u2029\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nna\u00efve delta epsilon\ngamma caf\u00e9 \t alpha \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\nepsilon x epsilon epsilon beta \ud83d\ude00 caf\u00e9\n\t \t epsilon gamma epsilon beta x x epsilon\nalpha\nepsilon x alpha epsilon caf\u00e9 beta\f\u000bbeta\n epsilon delta na\u00efve caf\u00e9\nalpha caf\u00e9 alpha \t\nepsilon na\u00efve caf\u00e9 \t alpha \ud83d\ude00 epsilon caf\u00e9 alpha \t\ngamma na\u00efve epsilon delta alpha beta beta \t\u001cx delta\n\u20ac gamma caf\u00e9 \ud83d\ude00 \ud83d\ude00 na\u00efve\nbeta caf\u00e9 caf\u00e9 epsilon alpha\ngamma \ud83d\ude00 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac beta\n gamma \u20ac x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\r\nepsilon \r\n", +"max_lines": 1, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "\u20ac alpha beta na\u00efve delta delta \t\ncaf\u00e9 beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n x \n \t gamma alpha beta x\n\u20ac gamma epsilon beta caf\u00e9 delta delta \t \ngamma \n\ud83d\ude00 alpha alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000b longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta beta delta \ud83d\ude00 \t x alpha \n\u20ac \t x delta \t alpha gamma\n\ud83d\ude00 \u20ac\u2029epsilon \u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac epsilon alpha\n\n\u001e\u20ac \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000balpha delta beta beta beta delta\ngamma alpha epsilon na\u00efve \u20ac alpha beta \u20ac \t\u2029epsilon x gamma beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\r\n\n \t caf\u00e9 \ud83d\ude00 x \t\n delta beta alpha \u20ac delta gamma na\u00efve gamma\n \t delta caf\u00e9 na\u00efve caf\u00e9 beta delta \ud83d\ude00 \ud83d\ude00\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ngamma\u000bna\u00efve caf\u00e9\n\ndelta \ud83d\ude00 caf\u00e9 epsilon delta x \u20ac delta caf\u00e9 x x \nx epsilon epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \t x caf\u00e9\u2028na\u00efve \ud83d\ude00 caf\u00e9 \n \u000blonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve \r longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha caf\u00e9 caf\u00e9 \u20ac delta\u001c\ud83d\ude00 \ud83d\ude00 \u20ac beta x\nx\n \ud83d\ude00 beta \t alpha na\u00efve gamma\n\u20ac\nna\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 x na\u00efve\nepsilon \u20ac epsilon x x epsilon\u2029\u20ac \t x \ud83d\ude00\u001c\u000b \u20ac caf\u00e9 x gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha delta beta na\u00efve \ud83d\ude00 \u20ac na\u00efve alpha na\u00efve \t epsilon\ngamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta gamma\nalpha beta \ud83d\ude00\nbeta\nepsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x \t \ud83d\ude00 epsilon alpha alpha \t caf\u00e9 \u20ac\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 \t \ud83d\ude00 caf\u00e9 na\u00efve beta \ndelta \ud83d\ude00 gamma gamma\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta \t caf\u00e9 alpha\nalpha epsilon caf\u00e9 x\nbeta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac delta \n", +"max_lines": 2, +"overlap": 0, +"max_chars": 4000 +}, +{ +"text": " longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve beta \t gamma gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha\nalpha x \ndelta caf\u00e9 epsilon\u001dlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\n\ncaf\u00e9 \ud83d\ude00 caf\u00e9 \t gamma epsilon\n delta\n\ud83d\ude00\nbeta na\u00efve \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00\nna\u00efve delta beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\ncaf\u00e9\nbeta\ncaf\u00e9 alpha na\u00efve x gamma\u2029epsilon \t \ndelta alpha beta gamma delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve epsilon delta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x\r\n\t delta delta \ud83d\ude00 na\u00efve \ud83d\ude00 gamma\nbeta beta\n\ud83d\ude00 delta beta beta beta\nepsilon alpha \nx \nepsilon epsilon gamma beta \t caf\u00e9 x x caf\u00e9 x\u001ecaf\u00e9 caf\u00e9\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \ud83d\ude00 alpha\u001dx caf\u00e9 caf\u00e9 \t\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve alpha na\u00efve delta \ud83d\ude00 x \t alpha\nepsilon na\u00efve delta epsilon gamma na\u00efve\nepsilon \u20ac\ngamma \ud83d\ude00 caf\u00e9 epsilon beta \ud83d\ude00 \u20ac delta\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve na\u00efve gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac caf\u00e9 \ud83d\ude00 \t gamma \ud83d\ude00 x \t\nalpha beta delta alpha alpha\nbeta alpha \t beta\nepsilon delta gamma\nna\u00efve \ud83d\ude00 caf\u00e9\falpha \u20ac\u000b alpha \t alpha beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u0085\t caf\u00e9 caf\u00e9 alpha gamma alpha epsilon epsilon \ud83d\ude00 beta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t\n caf\u00e9 beta \ud83d\ude00 epsilon epsilon \ud83d\ude00\fgamma x alpha alpha caf\u00e9 caf\u00e9 x \ud83d\ude00\ndelta beta caf\u00e9 na\u00efve na\u00efve\n\t caf\u00e9 \u20ac alpha beta\r\nna\u00efve \t gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta gamma beta na\u00efve \nna\u00efve x \u20ac \t caf\u00e9\n\t\ndelta delta na\u00efve\n\t\n\n\t \ud83d\ude00 na\u00efve beta\ndelta caf\u00e9\ncaf\u00e9\n\u2028\n\t x na\u00efve \ud83d\ude00 na\u00efve\n \u20ac alpha beta x\nepsilon na\u00efve epsilon na\u00efve epsilon gamma delta beta\n\ud83d\ude00 \ud83d\ude00 caf\u00e9 \ud83d\ude00\n\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve na\u00efve \u20ac beta alpha x gamma alpha\n\ud83d\ude00 \t caf\u00e9 \u20ac x delta alpha \n", +"max_lines": 1, +"overlap": 1, +"max_chars": 4000 +}, +{ +"text": "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma gamma beta beta na\u00efve x \u20ac\ndelta \ud83d\ude00 beta x delta x\nx delta\n\nna\u00efve beta beta x \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nna\u00efve x beta delta \u20ac caf\u00e9 \ud83d\ude00 \t \t\n\u20ac\u2028 \nepsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t x beta na\u00efve\u001calpha gamma x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac \t gamma gamma gamma gamma alpha epsilon epsilon \n\u001cbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\t \u20ac alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac\ncaf\u00e9\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac gamma \t epsilon \t\n\t beta \u000bx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00\ngamma x caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \ud83d\ude00 delta\u000b\t\nna\u00efve x \u20ac\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \nbeta\ngamma na\u00efve\fx x alpha caf\u00e9 x na\u00efve alpha\n", +"max_lines": 60, +"overlap": 3, +"max_chars": 120 +}, +{ +"text": "\u20ac alpha na\u00efve delta x delta na\u00efve\u001cbeta na\u00efve na\u00efve delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x\n\ud83d\ude00 \t beta epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n gamma \ud83d\ude00 gamma caf\u00e9 x delta na\u00efve caf\u00e9 \ud83d\ude00\r longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\ngamma epsilon gamma epsilon beta delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha\nepsilon x alpha\n", +"max_lines": 7, +"overlap": 1, +"max_chars": 300 +}, +{ +"text": "na\u00efve alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac beta x \t beta x caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac \ud83d\ude00 delta \u20ac \nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \u20ac \t caf\u00e9 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001e\n\t alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta\ndelta delta \t epsilon alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta\ndelta\f\u20ac \u20ac na\u00efve epsilon delta na\u00efve\u001d\u2028caf\u00e9 \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t \u20ac\n\ud83d\ude00\n beta beta epsilon beta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n\t na\u00efve x beta alpha beta \t\u001egamma epsilon gamma na\u00efve \u20ac gamma \u20ac \n caf\u00e9\nbeta caf\u00e9 caf\u00e9\n\u20ac \u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \t alpha \t \t\u2028caf\u00e9 na\u00efve beta caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n delta beta \u20ac delta alpha epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u001ccaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \u20ac \t gamma\u000bx delta\u2029alpha \ud83d\ude00 \t \ud83d\ude00 \t epsilon\nepsilon gamma gamma na\u00efve epsilon alpha\ndelta delta \ud83d\ude00 delta alpha gamma alpha na\u00efve\n\n\ud83d\ude00 epsilon gamma beta \ud83d\ude00\u001eepsilon\nbeta\n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta beta \u20ac x\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 \ud83d\ude00 x beta \u20ac na\u00efve\n beta alpha beta beta \ud83d\ude00 \u20ac \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha x delta\n\t delta na\u00efve na\u00efve na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 gamma \ud83d\ude00\n\n\n\u20ac caf\u00e9 beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ncaf\u00e9 \t x \u001dx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon na\u00efve epsilon delta na\u00efve delta delta x\nbeta\nalpha alpha epsilon beta delta na\u00efve delta\nx \t \ud83d\ude00 gamma\u001d", +"max_lines": 1, +"overlap": 0, +"max_chars": 120 +}, +{ +"text": "", +"max_lines": 2, +"overlap": 1, +"max_chars": 120 +}, +{ +"text": "\nna\u00efve x delta alpha beta alpha\nx longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\t\u2028alpha \u20ac x epsilon x \t \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\n\fx \t epsilon caf\u00e9 \t epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n gamma\nalpha beta beta \t beta gamma\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 beta\n epsilon\u001edelta \u20ac beta \r\ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \n caf\u00e9 epsilon na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta caf\u00e9 gamma \ud83d\ude00\ncaf\u00e9 beta \t \u20ac caf\u00e9 \t delta \t\n\t \t beta epsilon delta gamma\n gamma \ud83d\ude00 na\u00efve\n \t x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \ud83d\ude00\u001d \ud83d\ude00 caf\u00e9 delta na\u00efve beta na\u00efve beta epsilon\ndelta caf\u00e9 alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\r x \t alpha na\u00efve caf\u00e9 \u20ac na\u00efve epsilon \f\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma x epsilon epsilon x\nx beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 gamma\nepsilon \u20ac delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 \ncaf\u00e9 gamma na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac x \nx x delta gamma x beta \ud83d\ude00 alpha\n\t \ud83d\ude00 \t \ud83d\ude00\n delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta \u20ac\nalpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve delta beta \ud83d\ude00 \ud83d\ude00\ngamma na\u00efve alpha na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\rx alpha caf\u00e9 epsilon gamma alpha alpha delta\rdelta na\u00efve na\u00efve epsilon x delta delta\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta x \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \ud83d\ude00 na\u00efve\fcaf\u00e9 x beta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha x \ud83d\ude00 alpha\ncaf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\n delta caf\u00e9\n x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 delta \u20ac \t delta\u000bdelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon\nna\u00efve beta \t\ncaf\u00e9 \t \u20ac \t gamma x\nepsilon delta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac gamma alpha\nalpha gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\ncaf\u00e9 \t delta alpha \t\u001d\ud83d\ude00 \ud83d\ude00 \u20ac epsilon\u2029 alpha beta epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 \ud83d\ude00 epsilon\ncaf\u00e9 na\u00efve beta caf\u00e9 x na\u00efve \ud83d\ude00 \n\u20ac gamma x alpha gamma \ud83d\ude00 gamma gamma na\u00efve \nx na\u00efve alpha beta caf\u00e9 x na\u00efve epsilon\u2028longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma na\u00efve delta\n\u20ac\flonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 beta epsilon \ud83d\ude00 x\ngamma \u20ac x \ud83d\ude00 gamma gamma alpha beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x delta\nepsilon \t \ud83d\ude00\u001d\t na\u00efve\ngamma delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac alpha\nna\u00efve \ud83d\ude00 \u20ac beta \u20ac alpha \t\n\ud83d\ude00 na\u00efve na\u00efve\u0085 caf\u00e9 \ud83d\ude00 \ngamma beta delta\f\nbeta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t na\u00efve\n beta alpha \t delta beta alpha \t\u001ex longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon\u0085\nx \u20ac gamma caf\u00e9 caf\u00e9 \u20ac\u2028gamma epsilon delta \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon alpha\u000bepsilon alpha \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta delta alpha \u20ac x\ncaf\u00e9 beta \u0085delta \u20ac delta \ud83d\ude00\n\u20ac epsilon\u001cdelta \ud83d\ude00 delta \ud83d\ude00 na\u00efve caf\u00e9 na\u00efve\n\u20ac \ud83d\ude00 beta x epsilon beta caf\u00e9 delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\n \nx x beta\n caf\u00e9 beta epsilon alpha \t caf\u00e9\n\ud83d\ude00 x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \n\nx epsilon beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9\u000bdelta \t \u20ac beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\ncaf\u00e9 na\u00efve \u20ac \u20ac gamma beta caf\u00e9 \u20ac\ncaf\u00e9 epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nbeta delta gamma\u2028alpha x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\n\u0085\r\ud83d\ude00 epsilon \u20ac alpha\rbeta gamma epsilon caf\u00e9 \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nepsilon \ud83d\ude00 gamma gamma\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\n", +"max_lines": 13, +"overlap": 3, +"max_chars": 300 +}, +{ +"text": "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ralpha \u2029caf\u00e9 delta beta na\u00efve epsilon delta gamma alpha\r\n\t caf\u00e9 gamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\rx delta beta \ud83d\ude00 \u20ac beta alpha delta \n\t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha gamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n caf\u00e9 beta gamma alpha x \u20ac epsilon\nx \u20ac \t gamma delta \t epsilon beta\ndelta na\u00efve delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma na\u00efve beta caf\u00e9 x na\u00efve na\u00efve na\u00efve\n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t caf\u00e9\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 alpha\n\ud83d\ude00 caf\u00e9 caf\u00e9 alpha beta \ud83d\ude00 delta \t\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon x alpha na\u00efve\u000bgamma beta \f \ud83d\ude00 na\u00efve \u20ac caf\u00e9 na\u00efve \ud83d\ude00\n beta na\u00efve alpha beta beta x delta \ud83d\ude00\u001c\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong beta \u20ac \t na\u00efve\nbeta na\u00efve caf\u00e9 alpha\ndelta beta beta beta\u001elonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 na\u00efve gamma alpha\n\ncaf\u00e9 na\u00efve \u20ac delta beta \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \t na\u00efve \ud83d\ude00\n\t \u20ac\n\ud83d\ude00 epsilon \u20ac alpha beta x\nbeta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve caf\u00e9 \ud83d\ude00 \ud83d\ude00 gamma\n\u20ac beta \u20ac na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t\nx gamma na\u00efve caf\u00e9 \nna\u00efve alpha epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u000bgamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\r alpha \ud83d\ude00 gamma \u20ac epsilon \t delta alpha\ngamma beta \ud83d\ude00\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta gamma\nepsilon epsilon x beta x caf\u00e9\u001cna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma \u20ac epsilon caf\u00e9\nx x epsilon \t \ud83d\ude00 delta caf\u00e9\u2029 gamma delta \t \ud83d\ude00\nepsilon beta caf\u00e9 alpha gamma x \t delta beta\ngamma epsilon \ud83d\ude00 gamma x gamma beta \ud83d\ude00\n beta caf\u00e9 epsilon \ud83d\ude00\u000bbeta beta na\u00efve epsilon caf\u00e9 \u20ac \t delta gamma\n\n\n\u20ac alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma delta alpha\ngamma na\u00efve epsilon \ud83d\ude00\nx beta delta \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\nx gamma \t caf\u00e9 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \nna\u00efve alpha\n epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 \t epsilon\ngamma \ud83d\ude00 \u20ac x alpha \u20ac alpha na\u00efve \n longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 epsilon alpha\n x gamma delta delta na\u00efve epsilon na\u00efve\u0085longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve epsilon caf\u00e9 \ngamma \ud83d\ude00 \ud83d\ude00\ncaf\u00e9 na\u00efve alpha beta \u20ac na\u00efve alpha\ndelta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta\n \ud83d\ude00 x alpha x x alpha beta delta \t epsilon\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00 beta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 caf\u00e9\r\n epsilon delta \t beta \u20ac na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma\ndelta epsilon alpha \u20ac alpha caf\u00e9 x \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\ndelta epsilon alpha \t caf\u00e9 epsilon \u20ac na\u00efve\n\ud83d\ude00 alpha \u20ac gamma alpha\ngamma longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong alpha \ndelta beta\u001cbeta \ud83d\ude00\nx alpha gamma caf\u00e9 beta\ncaf\u00e9 alpha caf\u00e9 caf\u00e9 alpha \u20ac na\u00efve \n\ud83d\ude00 epsilon beta alpha epsilon\n x na\u00efve na\u00efve\n delta beta beta beta \n\u20ac epsilon\n \t beta beta \t na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u001c na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \ud83d\ude00 \ud83d\ude00 \u2028caf\u00e9 delta \ud83d\ude00 \nalpha gamma \n\ud83d\ude00 alpha delta\f\ud83d\ude00 na\u00efve alpha caf\u00e9 \ud83d\ude00 beta \t beta na\u00efve\nna\u00efve caf\u00e9\u001c alpha epsilon na\u00efve na\u00efve\n\t delta beta x x \u20ac alpha na\u00efve \nna\u00efve alpha beta caf\u00e9 caf\u00e9 beta\n\u20ac epsilon \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve \fx\nna\u00efve alpha epsilon\u001clonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x na\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon beta \ndelta na\u00efve epsilon delta \u20ac \t gamma \n delta x\n\fna\u00efve gamma caf\u00e9\u001d\u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\n\u20ac \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta x longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\nalpha\r\n\nbeta \ud83d\ude00 \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve beta \ud83d\ude00 \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong\u2028\ud83d\ude00 caf\u00e9\nna\u00efve \u20ac \u20ac longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac\nx gamma beta alpha\nna\u00efve \t epsilon x na\u00efve\n epsilon alpha\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma alpha delta x caf\u00e9 beta caf\u00e9 gamma\u0085x\fgamma epsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta \ud83d\ude00\nx\nepsilon alpha caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac na\u00efve\n\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \u20ac alpha beta x \t beta caf\u00e9\rbeta alpha longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta delta\ndelta caf\u00e9 epsilon\ndelta \u20ac epsilon \u20ac \ud83d\ude00 epsilon \t\u000balpha alpha delta beta\n\t caf\u00e9 \ndelta alpha beta \ud83d\ude00 x\u001d\u2029longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x caf\u00e9 \t gamma epsilon\ngamma delta \ud83d\ude00 na\u00efve beta na\u00efve\n gamma x gamma \ud83d\ude00 caf\u00e9\ngamma gamma epsilon beta delta \t caf\u00e9 gamma x \u20ac\rna\u00efve longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t gamma\u2029\ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong x\n x \t delta \u20ac \ud83d\ude00 beta \t\u2028alpha gamma\nepsilon \ud83d\ude00 delta caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta na\u00efve beta longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon \u20ac\nna\u00efve epsilon beta \u20ac beta \u20ac epsilon alpha \u20ac\n\t caf\u00e9 beta beta \t\nepsilon\n\t delta \t caf\u00e9 delta na\u00efve\nlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong delta epsilon caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong \t longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong caf\u00e9 gamma \u20ac\nx \ud83d\ude00 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong na\u00efve alpha caf\u00e9 \t x caf\u00e9 \ud83d\ude00\nepsilon longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong gamma epsilon\nbeta gamma\nna\u00efve \ud83d\ude00 \ud83d\ude00 delta x\n \u20ac \t\u2029alpha \t \u20ac delta gamma \ud83d\ude00 \ud83d\ude00 na\u00efve beta na\u00efve\fdelta \u20ac na\u00efve epsilon\nalpha caf\u00e9 epsilon na\u00efve caf\u00e9 longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong epsilon caf\u00e9\n", +"max_lines": 7, +"overlap": 1, +"max_chars": 120 +} +] diff --git a/taicpp/tests/misc_data/datetime_cases.json b/taicpp/tests/misc_data/datetime_cases.json new file mode 100644 index 0000000..ef0aaa4 --- /dev/null +++ b/taicpp/tests/misc_data/datetime_cases.json @@ -0,0 +1,151 @@ +[ +"2026-10-08T09:00", +"2026-10-08 09:00", +"2026-10-08", +"2026-10-08T09:00:30", +"2026-10-08T09:00:30.5", +"2026-10-08T09:00:30.123456", +"2026-10-08T09:00:30.1234567", +"2026-10-08T09:00Z", +"2026-10-08T09:00:00z", +"2026-10-08T09:00+02:00", +"2026-10-08T09:00-05:30", +"2026-10-08T09:00:00+0200", +"2026-10-08T09:00:00+02", +"2026-10-08T09:00:00.25+02:00", +"20261008T0900", +"20261008", +"20261008T090030", +"2026-10-08T09", +"2026-10-08T0900", +"2026-10-08x09:00", +"2026-13-01", +"2026-02-30", +"2024-02-29T12:00", +"2023-02-29T12:00", +"2026-10-08T25:00", +"2026-10-08T09:61", +"2026-10-08T09:00:61", +"now", +"", +" ", +"tomorrow", +"2026-10-08T", +"2026-10-08T09:", +"2026-10-08T09:0", +"2026-1-8", +"26-10-08", +"2026-10-08T09:00+25:00", +"2026-10-08T09:00+02:00:30", +" 2026-10-08T09:00 ", +"2026-10-08T09:00:00.123+01:00", +"0001-01-01T00:00", +"9999-12-31T23:59:59.999999", +"2026-10-08T09:00 +02:00", +"2026-10-08T09:00:00Z\n", +"2026-03-29T02:30", +"2026-10-25T02:30", +"2026-10-25T12:00:00+00:00", +"2026-10-25T12:00:00.000001+00:00", +"2026-10-08T09:00x+02:00", +"2026-10-08T09:00\u00a0+02:00", +"2026-10-08T09:00\n+02:00", +"2026-10-08T09:00:00x-02:00", +"2026-10-08T09:00:00xZ", +"2026-10-08T09:00:00 Z", +"2026-10-08T09 Z", +"2026-10-08T0900 Z", +"2026-10-08T090000 +01", +"2026-10-08T09:00:00.123456789 +01", +"2026-10-08T09:00:00,5 +01", +"2026-10-08T09:00:00.5x+01", +"2026-10-08T09:00:00+01 ", +"2026-10-08T09:00:00+0100", +"2026-10-08T09:00:00+01:0", +"2026-10-08T09:00:00+1", +"2026-10-08T09:00:00+01:00:", +"2026-10-08T09:00:00++01", +"2026-10-08T09:00:00+01Z", +"2026-10-08T09:00:00 +", +"2026-10-08T09:00:00-", +"2026-10-08 T09:00", +"2026-10-08TT09:00", +"2026-10-08\u00e9", +"2026-10-08\u00e909:00", +"2026-10-08\u20ac09:00", +"2026-10-08T09:00:00.000001+01:00:00.5", +"1999-12-31T24:00:00", +"2026-10-08T24:00", +"2026-10-08T24:00:00.0", +"9999-12-31T24:00", +"2026-10-08T09:00:00+0100:00", +"2026-10-08T09:00:00+01:00:0000", +"2026-10-08T09:00:00-00:00", +"2026-W01-1", +"2026-W53-7", +"2026-W00-1", +"2026-W41-8", +"2026W414", +"2026W41", +"2026-W41-4T10:00", +"2026-W41T10:00", +"2026-10-08t09:00", +"2026-10-08T09:+02:00", +"2026-10-08T09:00xx+02:00", +"2026-10-08T09:00:00.12345x+02:00", +"2026-10-08T09:00:00.1234567x+02:00", +"2026-10-08T09:00:00.123456xy+02:00", +"2026-10-08T09:0+02:00", +"2026-10-08T09:00:00:00", +"2026-10-08T09:00:00.5.5", +"2026-10-08T0900:00", +"2026-10-08T09:0000", +"2026-10-08T09:00:00+01:00:00.1234567", +"2026-10-08T09:00:00+01:00:00.", +"2026-W53-1", +"2020-W53-5", +"2015-W53-4", +"2026-W41-4 10:00", +"2026-W41-4x", +"2026-W41-4-10", +"2026-W41-410", +"2026W4141", +"2026W41410", +"2026-10-08T09:00-23:59", +"2026-10-08T09:00+23:59:59", +"2026-10-08T09:00+24:00", +"2026-10-08T09:00-24:00", +"0001-01-01T00:00+00:00", +"0001-01-01T00:00+01:00", +"0001-01-01T00:00-01:00", +"0001-01-01T10:00:00+00:00", +"9999-12-31T23:59:59.999999+00:00", +"9999-12-31T23:59:59+00:00", +"9999-12-31T23:59:59-01:00", +"9999-12-31T00:00:00+01:00", +"0001-01-01T00:00:00.000001+00:00", +"1970-01-01T00:00:00", +"1900-01-01T00:00:00", +"1800-06-15T12:00:00", +"2026-03-29T01:59:59", +"2026-03-29T02:00:00", +"2026-03-29T03:00:00", +"2026-10-25T01:59:59", +"2026-10-25T02:00:00", +"2026-10-25T03:00:00", +"2026-10-25T02:59:59.999999", +"2038-01-19T03:14:08", +"2100-12-31T23:59:59", +"5000-01-01T00:00:00", +"2026-10-08T09:00:00\u00e9", +"\u2003 2026-10-08T09:00 \u2003", +"2026-10-08T09:00:00,123", +"2026-02-29", +"2028-02-29", +"2100-02-29", +"2000-02-29", +"20260229", +"2026-10-08T09:00:00.5+02:00", +"2026-10-08T09:00:00,5+02:00", +"2026-10-08T09:00:00.+02:00" +] diff --git a/taicpp/tests/misc_data/delay_cases.json b/taicpp/tests/misc_data/delay_cases.json new file mode 100644 index 0000000..cc2a27a --- /dev/null +++ b/taicpp/tests/misc_data/delay_cases.json @@ -0,0 +1,21 @@ +[ +-5.5, +-1, +-0.5, +0, +0.9, +1, +59, +59.99, +60, +61, +3599, +3600, +3601, +86399, +86400, +86401, +90061, +1000000, +1000000000.0 +] diff --git a/taicpp/tests/misc_data/duration_cases.json b/taicpp/tests/misc_data/duration_cases.json new file mode 100644 index 0000000..03962f3 --- /dev/null +++ b/taicpp/tests/misc_data/duration_cases.json @@ -0,0 +1,23 @@ +[ +"30", +"30s", +"5m", +"2h", +"1d", +"1w", +"10 m", +" 7D ", +"0", +"0s", +"5x", +"", +"m", +"-5", +"5.5", +"1e3", +"00012h", +"9999999999d", +"5 M", +"5mm", +"5\u0660" +] diff --git a/taicpp/tests/misc_data/fts_cases.json b/taicpp/tests/misc_data/fts_cases.json new file mode 100644 index 0000000..dd375a3 --- /dev/null +++ b/taicpp/tests/misc_data/fts_cases.json @@ -0,0 +1,18 @@ +[ +"", +"hello world", +"Hello, World!", +"caf\u00e9 na\u00efve", +"\u212aelvin", +"\u0130stanbul", +"a-b_c d.e", +"UPPER lower 123", +" ", +"!!!", +"x", +"\"quoted\" 'single'", +"tab\tsep\nnl", +"\u00e9\u00e8 \u00fc", +"snake_case_word", +"alpha1beta2" +] diff --git a/taicpp/tests/misc_data/json_cases.json b/taicpp/tests/misc_data/json_cases.json new file mode 100644 index 0000000..1946246 --- /dev/null +++ b/taicpp/tests/misc_data/json_cases.json @@ -0,0 +1,75 @@ +[ +"{}", +"[]", +"null", +"true", +"false", +"0", +"-0", +"1", +"-1", +"123456789012", +"1.5", +"-0.25", +"1e3", +"1E-7", +"0.1", +"1e22", +"1e16", +"123456789.123456789", +"0.00001", +"0.0001", +"100.0", +"1e-5", +"5e-324", +"1.7976931348623157e308", +"NaN", +"Infinity", +"-Infinity", +"\"plain\"", +"\"quote\\\"inside\"", +"\"back\\\\slash\"", +"\"tab\\there\"", +"\"nl\\nhere\"", +"\"cr\\rhere\"", +"\"\\b\\f\"", +"\"\\u00e9\"", +"\"\\u20ac\"", +"\"\\ud83d\\ude00\"", +"\"\\u007f\"", +"\"\\u0000\"", +"\"\\u001f\"", +"\"/\"", +"\"\\/\"", +"\"caf\u00e9\"", +"\"\u20ac100\"", +"\"\ud83d\ude00 smile\"", +"\"\\ud83d\"", +"{\"a\": 1, \"b\": [1, 2, {\"c\": null}], \"d\": \"e\"}", +"{\"z\": 1, \"a\": 2, \"z\": 3}", +"[1, [2, [3, [4]]]]", +" { \"x\" : [ 1 , 2 ] } ", +"{\"source\": \"tai-bundled\", \"mode\": \"bundled\", \"scope\": \"home\", \"files\": {\"SKILL.md\": \"abc12345\"}, \"installed_at\": \"2026-10-25T10:11:12.123456+00:00\"}", +"[1,2", +"{\"a\":}", +"{\"a\" 1}", +"{'a': 1}", +"\"unterminated", +"[1,]", +"{\"a\":1,}", +"tru", +"01", +"1.", +".5", +"+1", +"\"\\x41\"", +"", +" ", +"{} extra", +"\"a\nb\"", +"[true, false, null, 1, 2.0, \"s\"]", +"{\"k\": \"\\u00e9\\u20ac\\ud83d\\ude00\"}", +"12345678901234567890", +"-9223372036854775808", +"9223372036854775807" +] diff --git a/taicpp/tests/muse_flags_test.cpp b/taicpp/tests/muse_flags_test.cpp new file mode 100644 index 0000000..c153dd8 --- /dev/null +++ b/taicpp/tests/muse_flags_test.cpp @@ -0,0 +1,27 @@ +// muse exec flags: measured on a 16KB tai prompt, the default reasoning effort took 36.5s and +// let the model call its own tools (step_limit failure); low effort plus the empty preset took 2.4s. +#include +#include +#include "consts.h" +#include "muse.h" +static int g_fail = 0; +#define CHECK(cond) do { if (!(cond)) { g_fail++; std::printf("FAIL %s:%d %s\n", __FILE__, __LINE__, #cond); } } while (0) + +static bool has_pair(const std::vector& v, const std::string& a, const std::string& b) { + for (size_t i = 0; i + 1 < v.size(); ++i) { if (v[i] == a && v[i + 1] == b) { return true; } } + return false; +} + +int main() { + auto argv = detz::llm::muse_argv("", "s.json", "p.txt", std::nullopt); + CHECK(has_pair(argv, "--reasoning-effort", detz::llm::kMuseReasoningEffort)); + CHECK(has_pair(argv, "--preset", "empty")); + CHECK(std::find(argv.begin(), argv.end(), "--no-foreign-personal-context") != argv.end()); + CHECK(std::find(argv.begin(), argv.end(), "--no-session-log") != argv.end()); + auto sess = detz::llm::muse_argv("", "s.json", "p.txt", std::string("abc")); + CHECK(has_pair(sess, "--session-id", "abc")); + CHECK(has_pair(sess, "--preset", "empty")); + CHECK(detz::llm::kCliFallbackTimeout > 0 && detz::llm::kCliFallbackTimeout <= 60); + std::printf(g_fail ? "muse_flags_test: %d FAILED\n" : "muse_flags_test: ok\n", g_fail); + return g_fail ? 1 : 0; +} diff --git a/taicpp/tests/run_all.py b/taicpp/tests/run_all.py index fa7cb2c..3ccb213 100644 --- a/taicpp/tests/run_all.py +++ b/taicpp/tests/run_all.py @@ -60,6 +60,9 @@ STEPS = [ ("capmcp.cli_diff", "cap/mcp", [[PY, "-I", t("capmcp_cli_diff.py"), b("capmcp/capmcp_cli"), "--tai", TAI]], None), ("capmcp.catalog", "cap/mcp", [[b("capmcp/cap_model_catalog_test")]], None), ("fuzzy.unit", "util", [[b("fuzzy_test")]], None), + ("termshot.unit", "termshot", [[b("termshot_test")]], None), + ("whatsapp.unit", "whatsapp", [[b("whatsapp_test"), "tests/whatsapp_data"]], None), + ("muse.flags", "llm", [[b("muse_flags_test")]], None), # orchestration (sub agent panels on the multiplexer) ("orch.unit", "orch", [[b("orch_test")]], None), ("orch.mplex_e2e", "orch", [[PY, "-I", t("orch_mplex_e2e.py"), b("detz"), b("orch_live")]], None), diff --git a/taicpp/tests/termshot_test.cpp b/taicpp/tests/termshot_test.cpp new file mode 100644 index 0000000..75facd5 --- /dev/null +++ b/taicpp/tests/termshot_test.cpp @@ -0,0 +1,122 @@ +// termshot (src/termshot): font lookup, palette, ANSI fixtures to PNG, pixel colors, caps, file write. +#include +#include +#include +#include +#include +#include + +#include "termshot_canvas.h" +#include "termshot_capture.h" +#include "termshot_consts.h" +#include "termshot_font.h" +#include "termshot_palette.h" +#include "termshot_png.h" +#include "termshot_renderer.h" +#include "termshot_shooter.h" + +using namespace detz::termshot; + +static int failures = 0; +#define CHECK(c) do { if (!(c)) { std::printf("FAIL %s:%d %s\n", __FILE__, __LINE__, #c); ++failures; } } while (0) + +// Decode the RGB rows of a PNG written by TermshotPng (single IDAT, filter 0). +static bool pixel_at(const std::string& png, int x, int y, std::uint32_t& rgb) { + int w = 0, h = 0; + if (!TermshotPng::dimensions(png, w, h)) return false; + size_t at = 8; + std::string idat; + while (at + 8 <= png.size()) { + uint32_t len = (uint32_t(uint8_t(png[at])) << 24) | (uint32_t(uint8_t(png[at + 1])) << 16) | (uint32_t(uint8_t(png[at + 2])) << 8) | + uint32_t(uint8_t(png[at + 3])); + std::string type = png.substr(at + 4, 4); + if (type == "IDAT") idat += png.substr(at + 8, len); + at += 12 + len; + } + uLongf raw_len = static_cast(h) * static_cast(w * 3 + 1); + std::string raw(raw_len, '\0'); + if (uncompress(reinterpret_cast(raw.data()), &raw_len, reinterpret_cast(idat.data()), idat.size()) != Z_OK) return false; + size_t p = static_cast(y) * static_cast(w * 3 + 1) + 1 + static_cast(x) * 3; + if (raw[static_cast(y) * static_cast(w * 3 + 1)] != 0) return false; + rgb = (uint32_t(uint8_t(raw[p])) << 16) | (uint32_t(uint8_t(raw[p + 1])) << 8) | uint32_t(uint8_t(raw[p + 2])); + return true; +} + +static TermshotFrame frame(const std::string& ansi, int rows, int cols) { + TermshotFrame f; + f.ansi = ansi; + f.rows = rows; + f.cols = cols; + f.source = "ansi"; + return f; +} + +int main() { + // Font: sorted table, the coverage a TUI needs, fallback for the rest. + CHECK(TermshotFont::size() == 1001); + CHECK(TermshotFont::find(U'A') != nullptr); + CHECK(TermshotFont::find(U'─') != nullptr); // box drawing + CHECK(TermshotFont::find(U'█') != nullptr); // full block + CHECK(TermshotFont::find(U'⠀') != nullptr); // braille + CHECK(TermshotFont::find(U'中') == nullptr); // CJK not covered + CHECK(TermshotFont::glyph(U'中').code == U'�' || TermshotFont::glyph(U'中').code == U'?'); + const TermshotGlyph& block = TermshotFont::glyph(U'█'); + CHECK(block.rows[0] == 0xFF && block.rows[15] == 0xFF); + + // Palette: named, bright, bold-brightening, 256 cube, gray ramp, truecolor. + CHECK(TermshotPalette::fragment(std::string("31"), 0, false, false) == 0xCD0000); + CHECK(TermshotPalette::fragment(std::string("31"), 0, false, true) == 0xFF0000); + CHECK(TermshotPalette::fragment(std::string("94"), 0, false, false) == 0x5C5CFF); + CHECK(TermshotPalette::fragment(std::string("38;5;196"), 0, false, false) == 0xFF0000); + CHECK(TermshotPalette::fragment(std::string("38;5;232"), 0, false, false) == 0x080808); + CHECK(TermshotPalette::fragment(std::string("48;2;1;2;3"), 0, true, false) == 0x010203); + CHECK(TermshotPalette::fragment(std::nullopt, 0x123456, false, false) == 0x123456); + + // Dimensions follow the grid plus padding. + std::string png = TermshotShooter::png(frame("hello", 3, 10)); + int w = 0, h = 0; + CHECK(png.compare(0, 8, std::string("\x89PNG\r\n\x1a\n", 8)) == 0); + CHECK(TermshotPng::dimensions(png, w, h)); + CHECK(w == 10 * kCellWidth + 2 * kPadding && h == 3 * kCellHeight + 2 * kPadding); + + // Pixels: padding is the default background, a red-background cell is red, + // a full block in green fills its cell, reverse swaps fg and bg. + std::string colored = TermshotShooter::png(frame("\x1b[41m \x1b[0m\x1b[32m\xe2\x96\x88\x1b[0m\x1b[7m \x1b[0m", 1, 4)); + std::uint32_t c = 0; + CHECK(pixel_at(colored, 0, 0, c) && c == kDefaultBg); + CHECK(pixel_at(colored, kPadding + 3, kPadding + 8, c) && c == 0xCD0000); + CHECK(pixel_at(colored, kPadding + kCellWidth + 3, kPadding + 8, c) && c == 0x00CD00); + CHECK(pixel_at(colored, kPadding + 2 * kCellWidth + 3, kPadding + 8, c) && c == kDefaultFg); + + // Lines: \r\n moves down; text lands in row 2. + std::string two = TermshotShooter::png(frame("a\r\n\x1b[44m \x1b[0m", 2, 2)); + CHECK(pixel_at(two, kPadding + 2, kPadding + kCellHeight + 8, c) && c == 0x0000EE); + + // Cursor: drawn as a block on an empty cell. + TermshotFrame cur = frame("", 2, 2); + cur.cursor_x = 1; cur.cursor_y = 1; + std::string cpng = TermshotShooter::png(cur); + CHECK(pixel_at(cpng, kPadding + kCellWidth + 4, kPadding + kCellHeight + 8, c) && c == kCursorColor); + + // Caps: absurd sizes are clamped. + int big_w = 0, big_h = 0; + std::string capped = TermshotShooter::png(frame("x", 100000, 100000)); + CHECK(TermshotPng::dimensions(capped, big_w, big_h)); + CHECK(big_w == TermshotRenderer::width_for(kMaxCols) && big_h == TermshotRenderer::height_for(kMaxRows)); + TermshotFrame nat = TermshotCapture::native(std::string(kMaxCaptureBytes + 10, 'x'), "1"); + CHECK(nat.ansi.size() == kMaxCaptureBytes && nat.rows == kNativeDefaultRows && nat.cols == kNativeDefaultCols); + CHECK(nat.source == "native pane 1"); + + // File: default path under /shots, bytes on disk equal the encoder output. + auto home = std::filesystem::temp_directory_path() / ("termshot_test_" + std::to_string(::getpid())); + TermshotShooter shooter(home.string()); + TermshotShot shot = shooter.shoot(frame("\x1b[1;33mdetz\x1b[0m", 2, 8)); + CHECK(shot.path.rfind((home / kShotDir).string(), 0) == 0); + CHECK(std::filesystem::file_size(shot.path) == shot.bytes); + CHECK(shot.width == TermshotRenderer::width_for(8) && shot.rows == 2); + CHECK(shot.summary().find("image/png") != std::string::npos); + std::filesystem::remove_all(home); + + if (failures == 0) std::printf("termshot_test: all checks passed\n"); + return failures == 0 ? 0 : 1; +} diff --git a/taicpp/tests/whatsapp_data/client_payload.json b/taicpp/tests/whatsapp_data/client_payload.json new file mode 100644 index 0000000..7ec76d7 --- /dev/null +++ b/taicpp/tests/whatsapp_data/client_payload.json @@ -0,0 +1,80 @@ +{ + "_note": "Generated offline by gen_client_payload.mjs — no network required", + "config": { + "version": [ + 2, + 3000, + 1035194821 + ], + "browser": [ + "Ubuntu", + "Chrome", + "22.04.4" + ], + "countryCode": "US", + "syncFullHistory": false + }, + "payloadHex": "18002a36080e120b080210b81718c5a3cfed031a0330303022033030302a03302e313a074465736b746f704203302e3150005a02656e6202555332022000600168019a01d5010a04000000f31201051a2070ecefd9e95137bebbfd4a31aff191ceeab920fecb65bf8816cb2c98c623136222030000012a206f5cd14d65e5e77ea668021fda8b7ff047cdfa02fc7c87c432cda22c0e65d44b3240e3d87f565b2c3e194fc00ce33688cf2bb567319c583bc98fb44341c41c968bc55cf46d8cfd6de68c2c1b3abec0d486549578b208f759458c7322392ca7fbef0d3a10a2c9471eff910a9e1ae659890a28872d422d0a065562756e74751206080a100f1807180120002a171880502001300038014001480150015801600170017800880200", + "fields": { + "passive": false, + "userAgent": { + "platform": "WEB", + "appVersion": { + "primary": 2, + "secondary": 3000, + "tertiary": 1035194821 + }, + "mcc": "000", + "mnc": "000", + "osVersion": "0.1", + "device": "Desktop", + "osBuildNumber": "0.1", + "releaseChannel": "RELEASE", + "localeLanguageIso6391": "en", + "localeCountryIso31661Alpha2": "US" + }, + "webInfo": { + "webSubPlatform": "WEB_BROWSER" + }, + "connectType": "WIFI_UNKNOWN", + "connectReason": "USER_ACTIVATED", + "devicePairingData": { + "eRegid": "AAAA8w==", + "eKeytype": "BQ==", + "eIdent": "cOzv2elRN767/Uoxr/GRzuq5IP7LZb+IFsssmMYjE2I=", + "eSkeyId": "AAAB", + "eSkeyVal": "b1zRTWXl536maAIf2ot/8EfN+gL8fIfEMs2iLA5l1Es=", + "eSkeySig": "49h/VlssPhlPwAzjNojPK7VnMZxYO8mPtENBxByWi8Vc9G2M/W3mjCwbOr7A1IZUlXiyCPdZRYxzIjksp/vvDQ==", + "buildHash": "oslHHv+RCp4a5lmJCiiHLQ==", + "deviceProps": "CgZVYnVudHUSBggKEA8YBxgBIAAqFxiAUCABMAA4AUABSAFQAVgBYAFwAXgA" + }, + "pull": false + }, + "creds": { + "noiseKey": { + "public": "LXgcdtm3II72sGgK+0Sc/vFNMZE44tWKruyWVqVMu1w=", + "private": "qN2ejtyx8hEN+QOUGQ1oUtSJi/oBTs+Hkq/Qy6KvbXU=" + }, + "pairingEphemeralKeyPair": { + "public": "coBzj369DBXaa2CwIaMwwrA0sgZgJJ9I6HJNuZxiQng=", + "private": "OL9B2D5RbwzprdO3nDXMDNVIx6TmNXVtCIcUFXbHFVs=" + }, + "signedIdentityKey": { + "public": "cOzv2elRN767/Uoxr/GRzuq5IP7LZb+IFsssmMYjE2I=", + "private": "mHUjHb4GXCdOWWS6SRvlNr1TPgbvlflmWBvsRPPXKVA=" + }, + "signedPreKey": { + "keyId": 1, + "keyPair": { + "public": "b1zRTWXl536maAIf2ot/8EfN+gL8fIfEMs2iLA5l1Es=", + "private": "uClkvqehx27KQYwZ7HLy176A4Lbcwk+0XoZi8HDdEGg=" + }, + "signature": "49h/VlssPhlPwAzjNojPK7VnMZxYO8mPtENBxByWi8Vc9G2M/W3mjCwbOr7A1IZUlXiyCPdZRYxzIjksp/vvDQ==" + }, + "registrationId": 243, + "advSecretKey": "m6Fs57lbPr6hcMgSzSKVcCnHCvo5e8ZeNrs/bRsAdWc=", + "nextPreKeyId": 1, + "firstUnuploadedPreKeyId": 1, + "registered": false + } +} \ No newline at end of file diff --git a/taicpp/tests/whatsapp_data/codec_battery.jsonl b/taicpp/tests/whatsapp_data/codec_battery.jsonl new file mode 100644 index 0000000..d975772 --- /dev/null +++ b/taicpp/tests/whatsapp_data/codec_battery.jsonl @@ -0,0 +1,19 @@ +{"name":"1-single-byte-tokens","tree":{"tag":"iq","attrs":{"to":"s.whatsapp.net","type":"get"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"to":"s.whatsapp.net","type":"get"},"content":null},"encoded_hex":"00f8051911030429"} +{"name":"2-double-byte-tokens","tree":{"tag":"iq","attrs":{"timezone":"America/Sao_Paulo","platform":"WhatsApp"},"content":[{"tag":"item","attrs":{"value":"google"},"content":null},{"tag":"item","attrs":{"value":"voip"},"content":null}]},"decoded_tree":{"tag":"iq","attrs":{"timezone":"America/Sao_Paulo","platform":"WhatsApp"},"content":[{"tag":"item","attrs":{"value":"google"},"content":null},{"tag":"item","attrs":{"value":"voip"},"content":null}]},"encoded_hex":"00f80619daec304aeda6f802f8033f6cef30f8033f6ced32"} +{"name":"3-adhoc-short-string","tree":{"tag":"iq","attrs":{"id":"wa-go-test-123"},"content":"wa-go-test-123"},"decoded_tree":{"tag":"iq","attrs":{"id":"wa-go-test-123"},"content":"77612d676f2d746573742d313233"},"encoded_hex":"00f8041908fc0e77612d676f2d746573742d313233fc0e77612d676f2d746573742d313233"} +{"name":"4-long-string","tree":{"tag":"message","attrs":{},"content":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-long-tail"},"decoded_tree":{"tag":"message","attrs":{},"content":"4141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141412d6c6f6e672d7461696c"},"encoded_hex":"00f80213fd0001364141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141412d6c6f6e672d7461696c"} +{"name":"5-user-jid","tree":{"tag":"iq","attrs":{"to":"5512999999999@s.whatsapp.net"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"to":"5512999999999@s.whatsapp.net"},"content":null},"encoded_hex":"00f8031911faff875512999999999f03"} +{"name":"6a-group-jid","tree":{"tag":"iq","attrs":{"to":"120363000000000000@g.us"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"to":"120363000000000000@g.us"},"content":null},"encoded_hex":"00f8031911faff091203630000000000001c"} +{"name":"6b-lid-jid","tree":{"tag":"iq","attrs":{"to":"99999999999999@lid"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"to":"99999999999999@lid"},"content":null},"encoded_hex":"00f8031911faff079999999999999976"} +{"name":"7-nibble-pack","tree":{"tag":"iq","attrs":{"id":"123456789012345"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"id":"123456789012345"},"content":null},"encoded_hex":"00f8031908ff88123456789012345f"} +{"name":"8-hex-pack","tree":{"tag":"iq","attrs":{"hash":"ABCDEF0123456789"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"hash":"ABCDEF0123456789"},"content":null},"encoded_hex":"00f803195ffb08abcdef0123456789"} +{"name":"9-binary-content-buffer","tree":{"tag":"enc","attrs":{"type":"msg"},"content":"00010203fffe8040"},"decoded_tree":{"tag":"enc","attrs":{"type":"msg"},"content":"00010203fffe8040"},"encoded_hex":"00f8041d044dfc0800010203fffe8040"} +{"name":"9b-binary-content-u8","tree":{"tag":"enc","attrs":{"v":"2"},"content":"0a141e2832"},"decoded_tree":{"tag":"enc","attrs":{"v":"2"},"content":"0a141e2832"},"encoded_hex":"00f8041d5145fc050a141e2832"} +{"name":"9c-binary-large","tree":{"tag":"enc","attrs":{},"content":"abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab"},"decoded_tree":{"tag":"enc","attrs":{},"content":"abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab"},"encoded_hex":"00f8021dfd0001f4abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab"} +{"name":"10a-null-content","tree":{"tag":"ping","attrs":{},"content":null},"decoded_tree":{"tag":"ping","attrs":{},"content":null},"encoded_hex":"00f80156"} +{"name":"10b-string-content","tree":{"tag":"text","attrs":{},"content":"hello-wa-go"},"decoded_tree":{"tag":"text","attrs":{},"content":"68656c6c6f2d77612d676f"},"encoded_hex":"00f80238fc0b68656c6c6f2d77612d676f"} +{"name":"10c-children-list","tree":{"tag":"iq","attrs":{"type":"set"},"content":[{"tag":"add","attrs":{},"content":null},{"tag":"remove","attrs":{},"content":null}]},"decoded_tree":{"tag":"iq","attrs":{"type":"set"},"content":[{"tag":"add","attrs":{},"content":null},{"tag":"remove","attrs":{},"content":null}]},"encoded_hex":"00f80419045af802f80197f801af"} +{"name":"11-big-list-list16","tree":{"tag":"list","attrs":{},"content":[{"tag":"item","attrs":{"i":"0"},"content":null},{"tag":"item","attrs":{"i":"1"},"content":null},{"tag":"item","attrs":{"i":"2"},"content":null},{"tag":"item","attrs":{"i":"3"},"content":null},{"tag":"item","attrs":{"i":"4"},"content":null},{"tag":"item","attrs":{"i":"5"},"content":null},{"tag":"item","attrs":{"i":"6"},"content":null},{"tag":"item","attrs":{"i":"7"},"content":null},{"tag":"item","attrs":{"i":"8"},"content":null},{"tag":"item","attrs":{"i":"9"},"content":null},{"tag":"item","attrs":{"i":"10"},"content":null},{"tag":"item","attrs":{"i":"11"},"content":null},{"tag":"item","attrs":{"i":"12"},"content":null},{"tag":"item","attrs":{"i":"13"},"content":null},{"tag":"item","attrs":{"i":"14"},"content":null},{"tag":"item","attrs":{"i":"15"},"content":null},{"tag":"item","attrs":{"i":"16"},"content":null},{"tag":"item","attrs":{"i":"17"},"content":null},{"tag":"item","attrs":{"i":"18"},"content":null},{"tag":"item","attrs":{"i":"19"},"content":null},{"tag":"item","attrs":{"i":"20"},"content":null},{"tag":"item","attrs":{"i":"21"},"content":null},{"tag":"item","attrs":{"i":"22"},"content":null},{"tag":"item","attrs":{"i":"23"},"content":null},{"tag":"item","attrs":{"i":"24"},"content":null},{"tag":"item","attrs":{"i":"25"},"content":null},{"tag":"item","attrs":{"i":"26"},"content":null},{"tag":"item","attrs":{"i":"27"},"content":null},{"tag":"item","attrs":{"i":"28"},"content":null},{"tag":"item","attrs":{"i":"29"},"content":null},{"tag":"item","attrs":{"i":"30"},"content":null},{"tag":"item","attrs":{"i":"31"},"content":null},{"tag":"item","attrs":{"i":"32"},"content":null},{"tag":"item","attrs":{"i":"33"},"content":null},{"tag":"item","attrs":{"i":"34"},"content":null},{"tag":"item","attrs":{"i":"35"},"content":null},{"tag":"item","attrs":{"i":"36"},"content":null},{"tag":"item","attrs":{"i":"37"},"content":null},{"tag":"item","attrs":{"i":"38"},"content":null},{"tag":"item","attrs":{"i":"39"},"content":null},{"tag":"item","attrs":{"i":"40"},"content":null},{"tag":"item","attrs":{"i":"41"},"content":null},{"tag":"item","attrs":{"i":"42"},"content":null},{"tag":"item","attrs":{"i":"43"},"content":null},{"tag":"item","attrs":{"i":"44"},"content":null},{"tag":"item","attrs":{"i":"45"},"content":null},{"tag":"item","attrs":{"i":"46"},"content":null},{"tag":"item","attrs":{"i":"47"},"content":null},{"tag":"item","attrs":{"i":"48"},"content":null},{"tag":"item","attrs":{"i":"49"},"content":null},{"tag":"item","attrs":{"i":"50"},"content":null},{"tag":"item","attrs":{"i":"51"},"content":null},{"tag":"item","attrs":{"i":"52"},"content":null},{"tag":"item","attrs":{"i":"53"},"content":null},{"tag":"item","attrs":{"i":"54"},"content":null},{"tag":"item","attrs":{"i":"55"},"content":null},{"tag":"item","attrs":{"i":"56"},"content":null},{"tag":"item","attrs":{"i":"57"},"content":null},{"tag":"item","attrs":{"i":"58"},"content":null},{"tag":"item","attrs":{"i":"59"},"content":null},{"tag":"item","attrs":{"i":"60"},"content":null},{"tag":"item","attrs":{"i":"61"},"content":null},{"tag":"item","attrs":{"i":"62"},"content":null},{"tag":"item","attrs":{"i":"63"},"content":null},{"tag":"item","attrs":{"i":"64"},"content":null},{"tag":"item","attrs":{"i":"65"},"content":null},{"tag":"item","attrs":{"i":"66"},"content":null},{"tag":"item","attrs":{"i":"67"},"content":null},{"tag":"item","attrs":{"i":"68"},"content":null},{"tag":"item","attrs":{"i":"69"},"content":null},{"tag":"item","attrs":{"i":"70"},"content":null},{"tag":"item","attrs":{"i":"71"},"content":null},{"tag":"item","attrs":{"i":"72"},"content":null},{"tag":"item","attrs":{"i":"73"},"content":null},{"tag":"item","attrs":{"i":"74"},"content":null},{"tag":"item","attrs":{"i":"75"},"content":null},{"tag":"item","attrs":{"i":"76"},"content":null},{"tag":"item","attrs":{"i":"77"},"content":null},{"tag":"item","attrs":{"i":"78"},"content":null},{"tag":"item","attrs":{"i":"79"},"content":null},{"tag":"item","attrs":{"i":"80"},"content":null},{"tag":"item","attrs":{"i":"81"},"content":null},{"tag":"item","attrs":{"i":"82"},"content":null},{"tag":"item","attrs":{"i":"83"},"content":null},{"tag":"item","attrs":{"i":"84"},"content":null},{"tag":"item","attrs":{"i":"85"},"content":null},{"tag":"item","attrs":{"i":"86"},"content":null},{"tag":"item","attrs":{"i":"87"},"content":null},{"tag":"item","attrs":{"i":"88"},"content":null},{"tag":"item","attrs":{"i":"89"},"content":null},{"tag":"item","attrs":{"i":"90"},"content":null},{"tag":"item","attrs":{"i":"91"},"content":null},{"tag":"item","attrs":{"i":"92"},"content":null},{"tag":"item","attrs":{"i":"93"},"content":null},{"tag":"item","attrs":{"i":"94"},"content":null},{"tag":"item","attrs":{"i":"95"},"content":null},{"tag":"item","attrs":{"i":"96"},"content":null},{"tag":"item","attrs":{"i":"97"},"content":null},{"tag":"item","attrs":{"i":"98"},"content":null},{"tag":"item","attrs":{"i":"99"},"content":null},{"tag":"item","attrs":{"i":"100"},"content":null},{"tag":"item","attrs":{"i":"101"},"content":null},{"tag":"item","attrs":{"i":"102"},"content":null},{"tag":"item","attrs":{"i":"103"},"content":null},{"tag":"item","attrs":{"i":"104"},"content":null},{"tag":"item","attrs":{"i":"105"},"content":null},{"tag":"item","attrs":{"i":"106"},"content":null},{"tag":"item","attrs":{"i":"107"},"content":null},{"tag":"item","attrs":{"i":"108"},"content":null},{"tag":"item","attrs":{"i":"109"},"content":null},{"tag":"item","attrs":{"i":"110"},"content":null},{"tag":"item","attrs":{"i":"111"},"content":null},{"tag":"item","attrs":{"i":"112"},"content":null},{"tag":"item","attrs":{"i":"113"},"content":null},{"tag":"item","attrs":{"i":"114"},"content":null},{"tag":"item","attrs":{"i":"115"},"content":null},{"tag":"item","attrs":{"i":"116"},"content":null},{"tag":"item","attrs":{"i":"117"},"content":null},{"tag":"item","attrs":{"i":"118"},"content":null},{"tag":"item","attrs":{"i":"119"},"content":null},{"tag":"item","attrs":{"i":"120"},"content":null},{"tag":"item","attrs":{"i":"121"},"content":null},{"tag":"item","attrs":{"i":"122"},"content":null},{"tag":"item","attrs":{"i":"123"},"content":null},{"tag":"item","attrs":{"i":"124"},"content":null},{"tag":"item","attrs":{"i":"125"},"content":null},{"tag":"item","attrs":{"i":"126"},"content":null},{"tag":"item","attrs":{"i":"127"},"content":null},{"tag":"item","attrs":{"i":"128"},"content":null},{"tag":"item","attrs":{"i":"129"},"content":null},{"tag":"item","attrs":{"i":"130"},"content":null},{"tag":"item","attrs":{"i":"131"},"content":null},{"tag":"item","attrs":{"i":"132"},"content":null},{"tag":"item","attrs":{"i":"133"},"content":null},{"tag":"item","attrs":{"i":"134"},"content":null},{"tag":"item","attrs":{"i":"135"},"content":null},{"tag":"item","attrs":{"i":"136"},"content":null},{"tag":"item","attrs":{"i":"137"},"content":null},{"tag":"item","attrs":{"i":"138"},"content":null},{"tag":"item","attrs":{"i":"139"},"content":null},{"tag":"item","attrs":{"i":"140"},"content":null},{"tag":"item","attrs":{"i":"141"},"content":null},{"tag":"item","attrs":{"i":"142"},"content":null},{"tag":"item","attrs":{"i":"143"},"content":null},{"tag":"item","attrs":{"i":"144"},"content":null},{"tag":"item","attrs":{"i":"145"},"content":null},{"tag":"item","attrs":{"i":"146"},"content":null},{"tag":"item","attrs":{"i":"147"},"content":null},{"tag":"item","attrs":{"i":"148"},"content":null},{"tag":"item","attrs":{"i":"149"},"content":null},{"tag":"item","attrs":{"i":"150"},"content":null},{"tag":"item","attrs":{"i":"151"},"content":null},{"tag":"item","attrs":{"i":"152"},"content":null},{"tag":"item","attrs":{"i":"153"},"content":null},{"tag":"item","attrs":{"i":"154"},"content":null},{"tag":"item","attrs":{"i":"155"},"content":null},{"tag":"item","attrs":{"i":"156"},"content":null},{"tag":"item","attrs":{"i":"157"},"content":null},{"tag":"item","attrs":{"i":"158"},"content":null},{"tag":"item","attrs":{"i":"159"},"content":null},{"tag":"item","attrs":{"i":"160"},"content":null},{"tag":"item","attrs":{"i":"161"},"content":null},{"tag":"item","attrs":{"i":"162"},"content":null},{"tag":"item","attrs":{"i":"163"},"content":null},{"tag":"item","attrs":{"i":"164"},"content":null},{"tag":"item","attrs":{"i":"165"},"content":null},{"tag":"item","attrs":{"i":"166"},"content":null},{"tag":"item","attrs":{"i":"167"},"content":null},{"tag":"item","attrs":{"i":"168"},"content":null},{"tag":"item","attrs":{"i":"169"},"content":null},{"tag":"item","attrs":{"i":"170"},"content":null},{"tag":"item","attrs":{"i":"171"},"content":null},{"tag":"item","attrs":{"i":"172"},"content":null},{"tag":"item","attrs":{"i":"173"},"content":null},{"tag":"item","attrs":{"i":"174"},"content":null},{"tag":"item","attrs":{"i":"175"},"content":null},{"tag":"item","attrs":{"i":"176"},"content":null},{"tag":"item","attrs":{"i":"177"},"content":null},{"tag":"item","attrs":{"i":"178"},"content":null},{"tag":"item","attrs":{"i":"179"},"content":null},{"tag":"item","attrs":{"i":"180"},"content":null},{"tag":"item","attrs":{"i":"181"},"content":null},{"tag":"item","attrs":{"i":"182"},"content":null},{"tag":"item","attrs":{"i":"183"},"content":null},{"tag":"item","attrs":{"i":"184"},"content":null},{"tag":"item","attrs":{"i":"185"},"content":null},{"tag":"item","attrs":{"i":"186"},"content":null},{"tag":"item","attrs":{"i":"187"},"content":null},{"tag":"item","attrs":{"i":"188"},"content":null},{"tag":"item","attrs":{"i":"189"},"content":null},{"tag":"item","attrs":{"i":"190"},"content":null},{"tag":"item","attrs":{"i":"191"},"content":null},{"tag":"item","attrs":{"i":"192"},"content":null},{"tag":"item","attrs":{"i":"193"},"content":null},{"tag":"item","attrs":{"i":"194"},"content":null},{"tag":"item","attrs":{"i":"195"},"content":null},{"tag":"item","attrs":{"i":"196"},"content":null},{"tag":"item","attrs":{"i":"197"},"content":null},{"tag":"item","attrs":{"i":"198"},"content":null},{"tag":"item","attrs":{"i":"199"},"content":null},{"tag":"item","attrs":{"i":"200"},"content":null},{"tag":"item","attrs":{"i":"201"},"content":null},{"tag":"item","attrs":{"i":"202"},"content":null},{"tag":"item","attrs":{"i":"203"},"content":null},{"tag":"item","attrs":{"i":"204"},"content":null},{"tag":"item","attrs":{"i":"205"},"content":null},{"tag":"item","attrs":{"i":"206"},"content":null},{"tag":"item","attrs":{"i":"207"},"content":null},{"tag":"item","attrs":{"i":"208"},"content":null},{"tag":"item","attrs":{"i":"209"},"content":null},{"tag":"item","attrs":{"i":"210"},"content":null},{"tag":"item","attrs":{"i":"211"},"content":null},{"tag":"item","attrs":{"i":"212"},"content":null},{"tag":"item","attrs":{"i":"213"},"content":null},{"tag":"item","attrs":{"i":"214"},"content":null},{"tag":"item","attrs":{"i":"215"},"content":null},{"tag":"item","attrs":{"i":"216"},"content":null},{"tag":"item","attrs":{"i":"217"},"content":null},{"tag":"item","attrs":{"i":"218"},"content":null},{"tag":"item","attrs":{"i":"219"},"content":null},{"tag":"item","attrs":{"i":"220"},"content":null},{"tag":"item","attrs":{"i":"221"},"content":null},{"tag":"item","attrs":{"i":"222"},"content":null},{"tag":"item","attrs":{"i":"223"},"content":null},{"tag":"item","attrs":{"i":"224"},"content":null},{"tag":"item","attrs":{"i":"225"},"content":null},{"tag":"item","attrs":{"i":"226"},"content":null},{"tag":"item","attrs":{"i":"227"},"content":null},{"tag":"item","attrs":{"i":"228"},"content":null},{"tag":"item","attrs":{"i":"229"},"content":null},{"tag":"item","attrs":{"i":"230"},"content":null},{"tag":"item","attrs":{"i":"231"},"content":null},{"tag":"item","attrs":{"i":"232"},"content":null},{"tag":"item","attrs":{"i":"233"},"content":null},{"tag":"item","attrs":{"i":"234"},"content":null},{"tag":"item","attrs":{"i":"235"},"content":null},{"tag":"item","attrs":{"i":"236"},"content":null},{"tag":"item","attrs":{"i":"237"},"content":null},{"tag":"item","attrs":{"i":"238"},"content":null},{"tag":"item","attrs":{"i":"239"},"content":null},{"tag":"item","attrs":{"i":"240"},"content":null},{"tag":"item","attrs":{"i":"241"},"content":null},{"tag":"item","attrs":{"i":"242"},"content":null},{"tag":"item","attrs":{"i":"243"},"content":null},{"tag":"item","attrs":{"i":"244"},"content":null},{"tag":"item","attrs":{"i":"245"},"content":null},{"tag":"item","attrs":{"i":"246"},"content":null},{"tag":"item","attrs":{"i":"247"},"content":null},{"tag":"item","attrs":{"i":"248"},"content":null},{"tag":"item","attrs":{"i":"249"},"content":null},{"tag":"item","attrs":{"i":"250"},"content":null},{"tag":"item","attrs":{"i":"251"},"content":null},{"tag":"item","attrs":{"i":"252"},"content":null},{"tag":"item","attrs":{"i":"253"},"content":null},{"tag":"item","attrs":{"i":"254"},"content":null},{"tag":"item","attrs":{"i":"255"},"content":null},{"tag":"item","attrs":{"i":"256"},"content":null},{"tag":"item","attrs":{"i":"257"},"content":null},{"tag":"item","attrs":{"i":"258"},"content":null},{"tag":"item","attrs":{"i":"259"},"content":null},{"tag":"item","attrs":{"i":"260"},"content":null},{"tag":"item","attrs":{"i":"261"},"content":null},{"tag":"item","attrs":{"i":"262"},"content":null},{"tag":"item","attrs":{"i":"263"},"content":null},{"tag":"item","attrs":{"i":"264"},"content":null},{"tag":"item","attrs":{"i":"265"},"content":null},{"tag":"item","attrs":{"i":"266"},"content":null},{"tag":"item","attrs":{"i":"267"},"content":null},{"tag":"item","attrs":{"i":"268"},"content":null},{"tag":"item","attrs":{"i":"269"},"content":null},{"tag":"item","attrs":{"i":"270"},"content":null},{"tag":"item","attrs":{"i":"271"},"content":null},{"tag":"item","attrs":{"i":"272"},"content":null},{"tag":"item","attrs":{"i":"273"},"content":null},{"tag":"item","attrs":{"i":"274"},"content":null},{"tag":"item","attrs":{"i":"275"},"content":null},{"tag":"item","attrs":{"i":"276"},"content":null},{"tag":"item","attrs":{"i":"277"},"content":null},{"tag":"item","attrs":{"i":"278"},"content":null},{"tag":"item","attrs":{"i":"279"},"content":null},{"tag":"item","attrs":{"i":"280"},"content":null},{"tag":"item","attrs":{"i":"281"},"content":null},{"tag":"item","attrs":{"i":"282"},"content":null},{"tag":"item","attrs":{"i":"283"},"content":null},{"tag":"item","attrs":{"i":"284"},"content":null},{"tag":"item","attrs":{"i":"285"},"content":null},{"tag":"item","attrs":{"i":"286"},"content":null},{"tag":"item","attrs":{"i":"287"},"content":null},{"tag":"item","attrs":{"i":"288"},"content":null},{"tag":"item","attrs":{"i":"289"},"content":null},{"tag":"item","attrs":{"i":"290"},"content":null},{"tag":"item","attrs":{"i":"291"},"content":null},{"tag":"item","attrs":{"i":"292"},"content":null},{"tag":"item","attrs":{"i":"293"},"content":null},{"tag":"item","attrs":{"i":"294"},"content":null},{"tag":"item","attrs":{"i":"295"},"content":null},{"tag":"item","attrs":{"i":"296"},"content":null},{"tag":"item","attrs":{"i":"297"},"content":null},{"tag":"item","attrs":{"i":"298"},"content":null},{"tag":"item","attrs":{"i":"299"},"content":null}]},"decoded_tree":{"tag":"list","attrs":{},"content":[{"tag":"item","attrs":{"i":"0"},"content":null},{"tag":"item","attrs":{"i":"1"},"content":null},{"tag":"item","attrs":{"i":"2"},"content":null},{"tag":"item","attrs":{"i":"3"},"content":null},{"tag":"item","attrs":{"i":"4"},"content":null},{"tag":"item","attrs":{"i":"5"},"content":null},{"tag":"item","attrs":{"i":"6"},"content":null},{"tag":"item","attrs":{"i":"7"},"content":null},{"tag":"item","attrs":{"i":"8"},"content":null},{"tag":"item","attrs":{"i":"9"},"content":null},{"tag":"item","attrs":{"i":"10"},"content":null},{"tag":"item","attrs":{"i":"11"},"content":null},{"tag":"item","attrs":{"i":"12"},"content":null},{"tag":"item","attrs":{"i":"13"},"content":null},{"tag":"item","attrs":{"i":"14"},"content":null},{"tag":"item","attrs":{"i":"15"},"content":null},{"tag":"item","attrs":{"i":"16"},"content":null},{"tag":"item","attrs":{"i":"17"},"content":null},{"tag":"item","attrs":{"i":"18"},"content":null},{"tag":"item","attrs":{"i":"19"},"content":null},{"tag":"item","attrs":{"i":"20"},"content":null},{"tag":"item","attrs":{"i":"21"},"content":null},{"tag":"item","attrs":{"i":"22"},"content":null},{"tag":"item","attrs":{"i":"23"},"content":null},{"tag":"item","attrs":{"i":"24"},"content":null},{"tag":"item","attrs":{"i":"25"},"content":null},{"tag":"item","attrs":{"i":"26"},"content":null},{"tag":"item","attrs":{"i":"27"},"content":null},{"tag":"item","attrs":{"i":"28"},"content":null},{"tag":"item","attrs":{"i":"29"},"content":null},{"tag":"item","attrs":{"i":"30"},"content":null},{"tag":"item","attrs":{"i":"31"},"content":null},{"tag":"item","attrs":{"i":"32"},"content":null},{"tag":"item","attrs":{"i":"33"},"content":null},{"tag":"item","attrs":{"i":"34"},"content":null},{"tag":"item","attrs":{"i":"35"},"content":null},{"tag":"item","attrs":{"i":"36"},"content":null},{"tag":"item","attrs":{"i":"37"},"content":null},{"tag":"item","attrs":{"i":"38"},"content":null},{"tag":"item","attrs":{"i":"39"},"content":null},{"tag":"item","attrs":{"i":"40"},"content":null},{"tag":"item","attrs":{"i":"41"},"content":null},{"tag":"item","attrs":{"i":"42"},"content":null},{"tag":"item","attrs":{"i":"43"},"content":null},{"tag":"item","attrs":{"i":"44"},"content":null},{"tag":"item","attrs":{"i":"45"},"content":null},{"tag":"item","attrs":{"i":"46"},"content":null},{"tag":"item","attrs":{"i":"47"},"content":null},{"tag":"item","attrs":{"i":"48"},"content":null},{"tag":"item","attrs":{"i":"49"},"content":null},{"tag":"item","attrs":{"i":"50"},"content":null},{"tag":"item","attrs":{"i":"51"},"content":null},{"tag":"item","attrs":{"i":"52"},"content":null},{"tag":"item","attrs":{"i":"53"},"content":null},{"tag":"item","attrs":{"i":"54"},"content":null},{"tag":"item","attrs":{"i":"55"},"content":null},{"tag":"item","attrs":{"i":"56"},"content":null},{"tag":"item","attrs":{"i":"57"},"content":null},{"tag":"item","attrs":{"i":"58"},"content":null},{"tag":"item","attrs":{"i":"59"},"content":null},{"tag":"item","attrs":{"i":"60"},"content":null},{"tag":"item","attrs":{"i":"61"},"content":null},{"tag":"item","attrs":{"i":"62"},"content":null},{"tag":"item","attrs":{"i":"63"},"content":null},{"tag":"item","attrs":{"i":"64"},"content":null},{"tag":"item","attrs":{"i":"65"},"content":null},{"tag":"item","attrs":{"i":"66"},"content":null},{"tag":"item","attrs":{"i":"67"},"content":null},{"tag":"item","attrs":{"i":"68"},"content":null},{"tag":"item","attrs":{"i":"69"},"content":null},{"tag":"item","attrs":{"i":"70"},"content":null},{"tag":"item","attrs":{"i":"71"},"content":null},{"tag":"item","attrs":{"i":"72"},"content":null},{"tag":"item","attrs":{"i":"73"},"content":null},{"tag":"item","attrs":{"i":"74"},"content":null},{"tag":"item","attrs":{"i":"75"},"content":null},{"tag":"item","attrs":{"i":"76"},"content":null},{"tag":"item","attrs":{"i":"77"},"content":null},{"tag":"item","attrs":{"i":"78"},"content":null},{"tag":"item","attrs":{"i":"79"},"content":null},{"tag":"item","attrs":{"i":"80"},"content":null},{"tag":"item","attrs":{"i":"81"},"content":null},{"tag":"item","attrs":{"i":"82"},"content":null},{"tag":"item","attrs":{"i":"83"},"content":null},{"tag":"item","attrs":{"i":"84"},"content":null},{"tag":"item","attrs":{"i":"85"},"content":null},{"tag":"item","attrs":{"i":"86"},"content":null},{"tag":"item","attrs":{"i":"87"},"content":null},{"tag":"item","attrs":{"i":"88"},"content":null},{"tag":"item","attrs":{"i":"89"},"content":null},{"tag":"item","attrs":{"i":"90"},"content":null},{"tag":"item","attrs":{"i":"91"},"content":null},{"tag":"item","attrs":{"i":"92"},"content":null},{"tag":"item","attrs":{"i":"93"},"content":null},{"tag":"item","attrs":{"i":"94"},"content":null},{"tag":"item","attrs":{"i":"95"},"content":null},{"tag":"item","attrs":{"i":"96"},"content":null},{"tag":"item","attrs":{"i":"97"},"content":null},{"tag":"item","attrs":{"i":"98"},"content":null},{"tag":"item","attrs":{"i":"99"},"content":null},{"tag":"item","attrs":{"i":"100"},"content":null},{"tag":"item","attrs":{"i":"101"},"content":null},{"tag":"item","attrs":{"i":"102"},"content":null},{"tag":"item","attrs":{"i":"103"},"content":null},{"tag":"item","attrs":{"i":"104"},"content":null},{"tag":"item","attrs":{"i":"105"},"content":null},{"tag":"item","attrs":{"i":"106"},"content":null},{"tag":"item","attrs":{"i":"107"},"content":null},{"tag":"item","attrs":{"i":"108"},"content":null},{"tag":"item","attrs":{"i":"109"},"content":null},{"tag":"item","attrs":{"i":"110"},"content":null},{"tag":"item","attrs":{"i":"111"},"content":null},{"tag":"item","attrs":{"i":"112"},"content":null},{"tag":"item","attrs":{"i":"113"},"content":null},{"tag":"item","attrs":{"i":"114"},"content":null},{"tag":"item","attrs":{"i":"115"},"content":null},{"tag":"item","attrs":{"i":"116"},"content":null},{"tag":"item","attrs":{"i":"117"},"content":null},{"tag":"item","attrs":{"i":"118"},"content":null},{"tag":"item","attrs":{"i":"119"},"content":null},{"tag":"item","attrs":{"i":"120"},"content":null},{"tag":"item","attrs":{"i":"121"},"content":null},{"tag":"item","attrs":{"i":"122"},"content":null},{"tag":"item","attrs":{"i":"123"},"content":null},{"tag":"item","attrs":{"i":"124"},"content":null},{"tag":"item","attrs":{"i":"125"},"content":null},{"tag":"item","attrs":{"i":"126"},"content":null},{"tag":"item","attrs":{"i":"127"},"content":null},{"tag":"item","attrs":{"i":"128"},"content":null},{"tag":"item","attrs":{"i":"129"},"content":null},{"tag":"item","attrs":{"i":"130"},"content":null},{"tag":"item","attrs":{"i":"131"},"content":null},{"tag":"item","attrs":{"i":"132"},"content":null},{"tag":"item","attrs":{"i":"133"},"content":null},{"tag":"item","attrs":{"i":"134"},"content":null},{"tag":"item","attrs":{"i":"135"},"content":null},{"tag":"item","attrs":{"i":"136"},"content":null},{"tag":"item","attrs":{"i":"137"},"content":null},{"tag":"item","attrs":{"i":"138"},"content":null},{"tag":"item","attrs":{"i":"139"},"content":null},{"tag":"item","attrs":{"i":"140"},"content":null},{"tag":"item","attrs":{"i":"141"},"content":null},{"tag":"item","attrs":{"i":"142"},"content":null},{"tag":"item","attrs":{"i":"143"},"content":null},{"tag":"item","attrs":{"i":"144"},"content":null},{"tag":"item","attrs":{"i":"145"},"content":null},{"tag":"item","attrs":{"i":"146"},"content":null},{"tag":"item","attrs":{"i":"147"},"content":null},{"tag":"item","attrs":{"i":"148"},"content":null},{"tag":"item","attrs":{"i":"149"},"content":null},{"tag":"item","attrs":{"i":"150"},"content":null},{"tag":"item","attrs":{"i":"151"},"content":null},{"tag":"item","attrs":{"i":"152"},"content":null},{"tag":"item","attrs":{"i":"153"},"content":null},{"tag":"item","attrs":{"i":"154"},"content":null},{"tag":"item","attrs":{"i":"155"},"content":null},{"tag":"item","attrs":{"i":"156"},"content":null},{"tag":"item","attrs":{"i":"157"},"content":null},{"tag":"item","attrs":{"i":"158"},"content":null},{"tag":"item","attrs":{"i":"159"},"content":null},{"tag":"item","attrs":{"i":"160"},"content":null},{"tag":"item","attrs":{"i":"161"},"content":null},{"tag":"item","attrs":{"i":"162"},"content":null},{"tag":"item","attrs":{"i":"163"},"content":null},{"tag":"item","attrs":{"i":"164"},"content":null},{"tag":"item","attrs":{"i":"165"},"content":null},{"tag":"item","attrs":{"i":"166"},"content":null},{"tag":"item","attrs":{"i":"167"},"content":null},{"tag":"item","attrs":{"i":"168"},"content":null},{"tag":"item","attrs":{"i":"169"},"content":null},{"tag":"item","attrs":{"i":"170"},"content":null},{"tag":"item","attrs":{"i":"171"},"content":null},{"tag":"item","attrs":{"i":"172"},"content":null},{"tag":"item","attrs":{"i":"173"},"content":null},{"tag":"item","attrs":{"i":"174"},"content":null},{"tag":"item","attrs":{"i":"175"},"content":null},{"tag":"item","attrs":{"i":"176"},"content":null},{"tag":"item","attrs":{"i":"177"},"content":null},{"tag":"item","attrs":{"i":"178"},"content":null},{"tag":"item","attrs":{"i":"179"},"content":null},{"tag":"item","attrs":{"i":"180"},"content":null},{"tag":"item","attrs":{"i":"181"},"content":null},{"tag":"item","attrs":{"i":"182"},"content":null},{"tag":"item","attrs":{"i":"183"},"content":null},{"tag":"item","attrs":{"i":"184"},"content":null},{"tag":"item","attrs":{"i":"185"},"content":null},{"tag":"item","attrs":{"i":"186"},"content":null},{"tag":"item","attrs":{"i":"187"},"content":null},{"tag":"item","attrs":{"i":"188"},"content":null},{"tag":"item","attrs":{"i":"189"},"content":null},{"tag":"item","attrs":{"i":"190"},"content":null},{"tag":"item","attrs":{"i":"191"},"content":null},{"tag":"item","attrs":{"i":"192"},"content":null},{"tag":"item","attrs":{"i":"193"},"content":null},{"tag":"item","attrs":{"i":"194"},"content":null},{"tag":"item","attrs":{"i":"195"},"content":null},{"tag":"item","attrs":{"i":"196"},"content":null},{"tag":"item","attrs":{"i":"197"},"content":null},{"tag":"item","attrs":{"i":"198"},"content":null},{"tag":"item","attrs":{"i":"199"},"content":null},{"tag":"item","attrs":{"i":"200"},"content":null},{"tag":"item","attrs":{"i":"201"},"content":null},{"tag":"item","attrs":{"i":"202"},"content":null},{"tag":"item","attrs":{"i":"203"},"content":null},{"tag":"item","attrs":{"i":"204"},"content":null},{"tag":"item","attrs":{"i":"205"},"content":null},{"tag":"item","attrs":{"i":"206"},"content":null},{"tag":"item","attrs":{"i":"207"},"content":null},{"tag":"item","attrs":{"i":"208"},"content":null},{"tag":"item","attrs":{"i":"209"},"content":null},{"tag":"item","attrs":{"i":"210"},"content":null},{"tag":"item","attrs":{"i":"211"},"content":null},{"tag":"item","attrs":{"i":"212"},"content":null},{"tag":"item","attrs":{"i":"213"},"content":null},{"tag":"item","attrs":{"i":"214"},"content":null},{"tag":"item","attrs":{"i":"215"},"content":null},{"tag":"item","attrs":{"i":"216"},"content":null},{"tag":"item","attrs":{"i":"217"},"content":null},{"tag":"item","attrs":{"i":"218"},"content":null},{"tag":"item","attrs":{"i":"219"},"content":null},{"tag":"item","attrs":{"i":"220"},"content":null},{"tag":"item","attrs":{"i":"221"},"content":null},{"tag":"item","attrs":{"i":"222"},"content":null},{"tag":"item","attrs":{"i":"223"},"content":null},{"tag":"item","attrs":{"i":"224"},"content":null},{"tag":"item","attrs":{"i":"225"},"content":null},{"tag":"item","attrs":{"i":"226"},"content":null},{"tag":"item","attrs":{"i":"227"},"content":null},{"tag":"item","attrs":{"i":"228"},"content":null},{"tag":"item","attrs":{"i":"229"},"content":null},{"tag":"item","attrs":{"i":"230"},"content":null},{"tag":"item","attrs":{"i":"231"},"content":null},{"tag":"item","attrs":{"i":"232"},"content":null},{"tag":"item","attrs":{"i":"233"},"content":null},{"tag":"item","attrs":{"i":"234"},"content":null},{"tag":"item","attrs":{"i":"235"},"content":null},{"tag":"item","attrs":{"i":"236"},"content":null},{"tag":"item","attrs":{"i":"237"},"content":null},{"tag":"item","attrs":{"i":"238"},"content":null},{"tag":"item","attrs":{"i":"239"},"content":null},{"tag":"item","attrs":{"i":"240"},"content":null},{"tag":"item","attrs":{"i":"241"},"content":null},{"tag":"item","attrs":{"i":"242"},"content":null},{"tag":"item","attrs":{"i":"243"},"content":null},{"tag":"item","attrs":{"i":"244"},"content":null},{"tag":"item","attrs":{"i":"245"},"content":null},{"tag":"item","attrs":{"i":"246"},"content":null},{"tag":"item","attrs":{"i":"247"},"content":null},{"tag":"item","attrs":{"i":"248"},"content":null},{"tag":"item","attrs":{"i":"249"},"content":null},{"tag":"item","attrs":{"i":"250"},"content":null},{"tag":"item","attrs":{"i":"251"},"content":null},{"tag":"item","attrs":{"i":"252"},"content":null},{"tag":"item","attrs":{"i":"253"},"content":null},{"tag":"item","attrs":{"i":"254"},"content":null},{"tag":"item","attrs":{"i":"255"},"content":null},{"tag":"item","attrs":{"i":"256"},"content":null},{"tag":"item","attrs":{"i":"257"},"content":null},{"tag":"item","attrs":{"i":"258"},"content":null},{"tag":"item","attrs":{"i":"259"},"content":null},{"tag":"item","attrs":{"i":"260"},"content":null},{"tag":"item","attrs":{"i":"261"},"content":null},{"tag":"item","attrs":{"i":"262"},"content":null},{"tag":"item","attrs":{"i":"263"},"content":null},{"tag":"item","attrs":{"i":"264"},"content":null},{"tag":"item","attrs":{"i":"265"},"content":null},{"tag":"item","attrs":{"i":"266"},"content":null},{"tag":"item","attrs":{"i":"267"},"content":null},{"tag":"item","attrs":{"i":"268"},"content":null},{"tag":"item","attrs":{"i":"269"},"content":null},{"tag":"item","attrs":{"i":"270"},"content":null},{"tag":"item","attrs":{"i":"271"},"content":null},{"tag":"item","attrs":{"i":"272"},"content":null},{"tag":"item","attrs":{"i":"273"},"content":null},{"tag":"item","attrs":{"i":"274"},"content":null},{"tag":"item","attrs":{"i":"275"},"content":null},{"tag":"item","attrs":{"i":"276"},"content":null},{"tag":"item","attrs":{"i":"277"},"content":null},{"tag":"item","attrs":{"i":"278"},"content":null},{"tag":"item","attrs":{"i":"279"},"content":null},{"tag":"item","attrs":{"i":"280"},"content":null},{"tag":"item","attrs":{"i":"281"},"content":null},{"tag":"item","attrs":{"i":"282"},"content":null},{"tag":"item","attrs":{"i":"283"},"content":null},{"tag":"item","attrs":{"i":"284"},"content":null},{"tag":"item","attrs":{"i":"285"},"content":null},{"tag":"item","attrs":{"i":"286"},"content":null},{"tag":"item","attrs":{"i":"287"},"content":null},{"tag":"item","attrs":{"i":"288"},"content":null},{"tag":"item","attrs":{"i":"289"},"content":null},{"tag":"item","attrs":{"i":"290"},"content":null},{"tag":"item","attrs":{"i":"291"},"content":null},{"tag":"item","attrs":{"i":"292"},"content":null},{"tag":"item","attrs":{"i":"293"},"content":null},{"tag":"item","attrs":{"i":"294"},"content":null},{"tag":"item","attrs":{"i":"295"},"content":null},{"tag":"item","attrs":{"i":"296"},"content":null},{"tag":"item","attrs":{"i":"297"},"content":null},{"tag":"item","attrs":{"i":"298"},"content":null},{"tag":"item","attrs":{"i":"299"},"content":null}]},"encoded_hex":"00f80271f9012cf8033ffc01692df8033ffc016955f8033ffc016945f8033ffc0169a2f8033ffc0169ec22f8033ffc0169ec79f8033ffc0169eca1f8033ffc0169e3f8033ffc0169ecdff8033ffc0169ed05f8033ffc0169ecb4f8033ffc0169ecdbf8033ffc0169cff8033ffc0169ed04f8033ffc0169ed14f8033ffc0169ecfaf8033ffc0169ed25f8033ffc0169ed5cf8033ffc0169ed66f8033ffc0169ed86f8033ffc0169ed3bf8033ffc0169ed9ef8033ffc0169eda3f8033ffc0169edd1f8033ffc0169edc9f8033ffc0169ed9ff8033ffc016999f8033ffc0169ee04f8033ffc0169ee11f8033ffc0169ee33f8033ffc0169ed74f8033ffc0169ee32f8033ffc0169ecf2f8033ffc0169ee51f8033ffc0169ee5ff8033ffc0169ee0ff8033ffc0169ee76f8033ffc0169ee6ef8033ffc0169ee74f8033ffc0169ee80f8033ffc0169ee27f8033ffc0169eeaef8033ffc0169ee52f8033ffc0169eec5f8033ffc0169eed6f8033ffc0169ee7ef8033ffc0169eeebf8033ffc0169eee6f8033ffc0169ee1ef8033ffc0169ef16f8033ffc0169eda9f8033ffc0169ef80f8033ffc0169ef28f8033ffc0169ef42f8033ffc0169ef93f8033ffc0169eed1f8033ffc0169ef78f8033ffc0169ff0157f8033ffc0169ee84f8033ffc0169eebff8033ffc0169ee21f8033ffc0169ff0161f8033ffc0169ff0162f8033ffc0169ff0163f8033ffc0169ee00f8033ffc0169ef0ff8033ffc0169ff0166f8033ffc0169ff0167f8033ffc0169ff0168f8033ffc0169eeb9f8033ffc0169ee91f8033ffc0169ff0171f8033ffc0169ff0172f8033ffc0169ff0173f8033ffc0169ff0174f8033ffc0169ee3bf8033ffc0169ff0176f8033ffc0169ff0177f8033ffc0169eed3f8033ffc0169ff0179f8033ffc0169ee96f8033ffc0169ff0181f8033ffc0169ff0182f8033ffc0169ff0183f8033ffc0169ff0184f8033ffc0169ff0185f8033ffc0169ff0186f8033ffc0169ff0187f8033ffc0169ff0188f8033ffc0169ff0189f8033ffc0169ff0190f8033ffc0169ff0191f8033ffc0169ff0192f8033ffc0169ff0193f8033ffc0169ff0194f8033ffc0169ff0195f8033ffc0169ff0196f8033ffc0169ff0197f8033ffc0169ff0198f8033ffc0169ff0199f8033ffc0169ec33f8033ffc0169ec36f8033ffc0169ec39f8033ffc0169ec3bf8033ffc0169ec37f8033ffc0169ec3df8033ffc0169ec40f8033ffc0169ec38f8033ffc0169ec42f8033ffc0169ec3af8033ffc0169ec3ff8033ffc0169ec43f8033ffc0169ff82112ff8033ffc0169ff82113ff8033ffc0169ff82114ff8033ffc0169ff82115ff8033ffc0169ef26f8033ffc0169ff82117ff8033ffc0169ff82118ff8033ffc0169ff82119ff8033ffc0169ff82120ff8033ffc0169ff82121ff8033ffc0169ff82122ff8033ffc0169ff82123ff8033ffc0169ff82124ff8033ffc0169ee58f8033ffc0169ff82126ff8033ffc0169ff82127ff8033ffc0169ee34f8033ffc0169ff82129ff8033ffc0169ff82130ff8033ffc0169ff82131ff8033ffc0169ff82132ff8033ffc0169ff82133ff8033ffc0169ff82134ff8033ffc0169ff82135ff8033ffc0169ff82136ff8033ffc0169ff82137ff8033ffc0169ff82138ff8033ffc0169ff82139ff8033ffc0169ff82140ff8033ffc0169ff82141ff8033ffc0169ff82142ff8033ffc0169ff82143ff8033ffc0169ff82144ff8033ffc0169ff82145ff8033ffc0169ff82146ff8033ffc0169ff82147ff8033ffc0169ff82148ff8033ffc0169ff82149ff8033ffc0169ff82150ff8033ffc0169ff82151ff8033ffc0169ff82152ff8033ffc0169ff82153ff8033ffc0169ff82154ff8033ffc0169ff82155ff8033ffc0169ff82156ff8033ffc0169ff82157ff8033ffc0169ff82158ff8033ffc0169ff82159ff8033ffc0169ff82160ff8033ffc0169ff82161ff8033ffc0169ff82162ff8033ffc0169ff82163ff8033ffc0169ff82164ff8033ffc0169ff82165ff8033ffc0169ff82166ff8033ffc0169ff82167ff8033ffc0169ff82168ff8033ffc0169ff82169ff8033ffc0169ff82170ff8033ffc0169ff82171ff8033ffc0169ff82172ff8033ffc0169ff82173ff8033ffc0169ff82174ff8033ffc0169ff82175ff8033ffc0169ff82176ff8033ffc0169ef3bf8033ffc0169ef60f8033ffc0169ef69f8033ffc0169ff82180ff8033ffc0169ff82181ff8033ffc0169ff82182ff8033ffc0169ff82183ff8033ffc0169ff82184ff8033ffc0169ff82185ff8033ffc0169ff82186ff8033ffc0169ff82187ff8033ffc0169ff82188ff8033ffc0169ff82189ff8033ffc0169ff82190ff8033ffc0169ff82191ff8033ffc0169ff82192ff8033ffc0169ff82193ff8033ffc0169ff82194ff8033ffc0169ff82195ff8033ffc0169ff82196ff8033ffc0169ff82197ff8033ffc0169ff82198ff8033ffc0169ff82199ff8033ffc0169edf9f8033ffc0169ff82201ff8033ffc0169ff82202ff8033ffc0169ff82203ff8033ffc0169ff82204ff8033ffc0169ff82205ff8033ffc0169ff82206ff8033ffc0169efccf8033ffc0169ff82208ff8033ffc0169ff82209ff8033ffc0169ff82210ff8033ffc0169ff82211ff8033ffc0169ff82212ff8033ffc0169ff82213ff8033ffc0169ff82214ff8033ffc0169ff82215ff8033ffc0169ff82216ff8033ffc0169ff82217ff8033ffc0169ff82218ff8033ffc0169ff82219ff8033ffc0169ff82220ff8033ffc0169ff82221ff8033ffc0169ff82222ff8033ffc0169ff82223ff8033ffc0169ff82224ff8033ffc0169ff82225ff8033ffc0169ff82226ff8033ffc0169ff82227ff8033ffc0169ff82228ff8033ffc0169ff82229ff8033ffc0169ff82230ff8033ffc0169ff82231ff8033ffc0169ff82232ff8033ffc0169ef8ff8033ffc0169ff82234ff8033ffc0169ff82235ff8033ffc0169ff82236ff8033ffc0169ef8bf8033ffc0169ff82238ff8033ffc0169ff82239ff8033ffc0169eeb1f8033ffc0169ff82241ff8033ffc0169ff82242ff8033ffc0169ff82243ff8033ffc0169ff82244ff8033ffc0169ff82245ff8033ffc0169ff82246ff8033ffc0169ff82247ff8033ffc0169efaef8033ffc0169ff82249ff8033ffc0169ee30f8033ffc0169ef74f8033ffc0169ff82252ff8033ffc0169ff82253ff8033ffc0169ff82254ff8033ffc0169ff82255ff8033ffc0169eeeef8033ffc0169ee47f8033ffc0169ff82258ff8033ffc0169ff82259ff8033ffc0169ff82260ff8033ffc0169ff82261ff8033ffc0169ff82262ff8033ffc0169ff82263ff8033ffc0169ff82264ff8033ffc0169ff82265ff8033ffc0169ff82266ff8033ffc0169ff82267ff8033ffc0169ff82268ff8033ffc0169ff82269ff8033ffc0169ff82270ff8033ffc0169ff82271ff8033ffc0169ff82272ff8033ffc0169ff82273ff8033ffc0169ff82274ff8033ffc0169ff82275ff8033ffc0169ff82276ff8033ffc0169ff82277ff8033ffc0169ff82278ff8033ffc0169efaaf8033ffc0169ff82280ff8033ffc0169ff82281ff8033ffc0169ff82282ff8033ffc0169ff82283ff8033ffc0169ff82284ff8033ffc0169ff82285ff8033ffc0169ff82286ff8033ffc0169ff82287ff8033ffc0169ff82288ff8033ffc0169ff82289ff8033ffc0169ef6ef8033ffc0169ff82291ff8033ffc0169ff82292ff8033ffc0169ff82293ff8033ffc0169ff82294ff8033ffc0169ff82295ff8033ffc0169ff82296ff8033ffc0169ff82297ff8033ffc0169ff82298ff8033ffc0169ff82299f"} +{"name":"11b-small-list-list8","tree":{"tag":"list","attrs":{},"content":[{"tag":"item","attrs":{},"content":null},{"tag":"item","attrs":{},"content":null},{"tag":"item","attrs":{},"content":null}]},"decoded_tree":{"tag":"list","attrs":{},"content":[{"tag":"item","attrs":{},"content":null},{"tag":"item","attrs":{},"content":null},{"tag":"item","attrs":{},"content":null}]},"encoded_hex":"00f80271f803f8013ff8013ff8013f"} +{"name":"12-many-attrs-mixed","tree":{"tag":"iq","attrs":{"to":"s.whatsapp.net","type":"result","id":"123456789012345","xmlns":"urn:xmpp:ping","count":"42","name":"wa-go-custom-attr"},"content":null},"decoded_tree":{"tag":"iq","attrs":{"to":"s.whatsapp.net","type":"result","id":"123456789012345","xmlns":"urn:xmpp:ping","count":"42","name":"wa-go-custom-attr"},"content":null},"encoded_hex":"00f80d191103041408ff88123456789012345f162b41ee5289fc1177612d676f2d637573746f6d2d61747472"} +{"name":"12b-empty-string-content","tree":{"tag":"val","attrs":{},"content":""},"decoded_tree":{"tag":"val","attrs":{},"content":""},"encoded_hex":"00f802edbffc00"} diff --git a/taicpp/tests/whatsapp_data/noise.json b/taicpp/tests/whatsapp_data/noise.json new file mode 100644 index 0000000..c1db9de --- /dev/null +++ b/taicpp/tests/whatsapp_data/noise.json @@ -0,0 +1,15 @@ +{ + "noiseMode": "Noise_XX_25519_AESGCM_SHA256\u0000\u0000\u0000\u0000", + "noiseHeader": "57410603", + "ephemeralKeyPriv": "b8ef390533848c869ce3b4f9adfa8e96c4a7fed801358db38ad71dc030e0a55c", + "ephemeralKeyPub": "caf5622e3c1d1db8aff791b352dba84f4afce55e87eaa4d8b08fc7204dab377a", + "serverEphemeral": "6a9c63c9866ba67db354e88cfaac9950809959248796cea915f38036cefdbd56", + "serverStaticEnc": "d5cbb0d38ec4eeea5b51f4c48232e50a03702f1f4caf983fe70c4d34b3639c37831ca6ded9de78d074fd6c30fd13a309", + "serverPayloadEnc": "d19fc76bbfaed765b2bb3066e60c963a270fd2b103fb22ae04ab3ad4fae1a344ddd52c8371f16d33e61da3cfb5ad2d07a6592f8f39f76c7d96530c120bf456947ef443d8c3b679d8c7b0af9d7bcb09be1f4ec6866d738eac3ebdc5ee7f13fae9b5984e19753e98c847292d0d6e2f919f45c2be0c282de29903ae37fa05a43f8fd3daa021e1ca70411d7cdbf0439a5e0e09140c68ebd593e10c569d7d80bd2c6a69903d2c06aeb30d8f59de9876a80af1711bb0b81d94f01ec6af20457bd8153acede7de29396e851123970f298f0429ebd5e212e211c10c2898ea3da73aff6642d7d9d9d884509525d3d14307594648090a9817c5162accbf8131ff7fd190c4628", + "authStaticKeyPriv": "48dc3abe885821ca900cd2dbc04b89ddf4bb7f97a59db24b4897867abd694d64", + "authStaticKeyPub": "ddbfdecf73054216d4c385a22ad44558339cefe375dadbe89f4e9c5b6162bc1d", + "clientHelloFrameHex": "5741060300002412220a20caf5622e3c1d1db8aff791b352dba84f4afce55e87eaa4d8b08fc7204dab377a", + "serverHelloFrameHex": "00015b1ad8020a206a9c63c9866ba67db354e88cfaac9950809959248796cea915f38036cefdbd561230d5cbb0d38ec4eeea5b51f4c48232e50a03702f1f4caf983fe70c4d34b3639c37831ca6ded9de78d074fd6c30fd13a3091a8102d19fc76bbfaed765b2bb3066e60c963a270fd2b103fb22ae04ab3ad4fae1a344ddd52c8371f16d33e61da3cfb5ad2d07a6592f8f39f76c7d96530c120bf456947ef443d8c3b679d8c7b0af9d7bcb09be1f4ec6866d738eac3ebdc5ee7f13fae9b5984e19753e98c847292d0d6e2f919f45c2be0c282de29903ae37fa05a43f8fd3daa021e1ca70411d7cdbf0439a5e0e09140c68ebd593e10c569d7d80bd2c6a69903d2c06aeb30d8f59de9876a80af1711bb0b81d94f01ec6af20457bd8153acede7de29396e851123970f298f0429ebd5e212e211c10c2898ea3da73aff6642d7d9d9d884509525d3d14307594648090a9817c5162accbf8131ff7fd190c4628", + "clientFinishFrameHex": "00016d22ea020a302fb7b823866de378b62e29e8700882f179645058f79f37981dca794a08aef9e4532adb725e13ddbbde05152c06138cf712b5028ea319dd74e0bf961c0a02b5237ffc4b3ebe02e8b3538160efe65bd7f83c669333a38bad0ac06c0d769263d0dd8109e3b485d3aef3ef483e0094c35fd94d9e97b70884f60446c4ff7ef83ac57f92711a0ba304a639f49f2cf7a6de2e0fe9809c37b4aad0da9fd4ac6c7a3f6b5a6d24affd43ab3a7134178493464f753dbef81fade6b211741ba5a8ffd117771a9cd17e83a8b2004bd315659ac9a11c05cccb9704ded0ee22a7744d482704481c18a144006b1b752d3794a2f4cc27240142112734256dc2051106631865174b5272d9a8e564aeee18236a24b52a64582e1e5feb3cd2b6359b93631fea869304034bea811031a83535b94b1dc2eaecae357332c886db62864358897b7e26518ec00654fc088908a9d854e588b715bcfdaf0ffabe9d1c3c438e31325b5c31a603dcf7c8afbd52059799", + "transportKeysNote": "Transport keys derived inside TransportState closure; not directly accessible without deeper patching." +} \ No newline at end of file diff --git a/taicpp/tests/whatsapp_data/session_ab.json b/taicpp/tests/whatsapp_data/session_ab.json new file mode 100644 index 0000000..d21b1a8 --- /dev/null +++ b/taicpp/tests/whatsapp_data/session_ab.json @@ -0,0 +1,120 @@ +{ + "_meta": { + "lib": "libsignal", + "libVersion": "6.0.0", + "note": "Golden Signal vectors from Baileys libsignal (WhiskeySockets/libsignal-node v6).", + "pubkeyFormat": "0x05-prefixed, 33 bytes (priv keys are 32 bytes raw)", + "versionByte": "0x33 = (3<<4)|3 for v3; first byte of every ciphertext", + "macTrailer": "last 8 bytes = HMAC-SHA256(macKey, version||serialized)[:8]", + "privateKeysNote": "alice.baseKey.priv + ephemeralsGenerated[] captured via runtime hook on curve.generateKeyPair (no on-disk patch). ephemeralsGenerated is in generation order; index 0 = alice X3DH baseKey; match each to a type-1 msg by the pub appearing as WhisperMessage.ephemeralKey (ratchet key).", + "protoFields": { + "WhisperMessage": { + "ephemeralKey": 1, + "counter": 2, + "previousCounter": 3, + "ciphertext": 4 + }, + "PreKeyWhisperMessage": { + "preKeyId": 1, + "baseKey": 2, + "identityKey": 3, + "message": 4, + "registrationId": 5, + "signedPreKeyId": 6 + } + } + }, + "bob": { + "identityKeyPair": { + "priv": "b01cf18616de3465f7bf0c35d1aa9ce2cb9ee789a18ebd21835ac5f52c9f4871", + "pub": "058145e775548a99bcd83f9762f142e18c75f140d29a78eb06855c66f3d0c4a628" + }, + "registrationId": 229, + "signedPreKey": { + "id": 1, + "keyPair": { + "priv": "c007e4ea5647ae8742112de44e1b932c97ab8dbfbdaf53b671a29307e471d260", + "pub": "057e5a8733d90d474011dd6729f0b9ec79a5b857bd2484573c39de47a3ebae6626" + }, + "signature": "40ca5537630abd0f9beaf9d19972b04a6965593efff0e7d405f9d5e9fb144977fc245a9330c2c7cb8ae397d0c3c41d30a5ffb9bf9b10d5479e3eae4dec84c781" + }, + "preKey": { + "id": 31337, + "keyPair": { + "priv": "380f8a6897b6988a512103839c5706c29267b8a8197c819e6f154fb4aac2634e", + "pub": "0515f7045f70040d3843e81f85fcb3c4c73e25530fe8ce2849842cefb3f3711358" + } + } + }, + "alice": { + "identityKeyPair": { + "priv": "507a73dd453888aa35927e388dc7b01e75e3592c9dc95eb1e25eadfaa1121577", + "pub": "057734c1731899d34408dbafd2f69ce9e71c37179ddcb4056dcaff9e8a70355f10" + }, + "registrationId": 117, + "baseKey": { + "priv": "30dfb094961cae4131cb02f21201abc045b73cd5fce183a21c1680c92e364a6a", + "pub": "053067086fca49c23215ed0072f9519f498a143e757b85ec3956b923df9232a327" + } + }, + "ephemeralsGenerated": [ + { + "priv": "30dfb094961cae4131cb02f21201abc045b73cd5fce183a21c1680c92e364a6a", + "pub": "053067086fca49c23215ed0072f9519f498a143e757b85ec3956b923df9232a327" + }, + { + "priv": "b8f725339b890331bb7b8af495ff3789e449b497c53f1f7fcdad330b09def044", + "pub": "05fcf4cbd0550b6db39cd353a80ead18582140ddce02b2d947ad33cae9f7631825" + }, + { + "priv": "f801076c5aeb5921d5a41e5175e592ad73d592781e8e3e11cfe55ee375479267", + "pub": "055f366c2db4e44e33ee3eef0d7c4589734b1536d3ba6f2baf2bd74909a3ba8712" + }, + { + "priv": "909d6cb7cc2b3c4ae771833d9c593a391e4fb295fd2a1183be1430bbe3416c46", + "pub": "0514a2d223f6a4dad317a830ad6d6e9d59cc3ea5737179fbccd3ea495a7c73ce03" + }, + { + "priv": "207634bea326276723a7e41cd451165f7d327e355d3d3b67c81ab139deb82d4b", + "pub": "0510aa5d286ad9789928d1eef1c513abcee659d3b3a97f1e84345faf51383a937e" + } + ], + "exchanges": [ + { + "n": 1, + "dir": "a->b", + "type": "pkmsg", + "sigType": 3, + "ciphertextHex": "3308e9f4011221053067086fca49c23215ed0072f9519f498a143e757b85ec3956b923df9232a3271a21057734c1731899d34408dbafd2f69ce9e71c37179ddcb4056dcaff9e8a70355f102242330a2105fcf4cbd0550b6db39cd353a80ead18582140ddce02b2d947ad33cae9f7631825100018002210763bbb51fbb5bd1413165517ca21cc20558abe8b0a340f6128753001", + "plaintextHex": "6f6c6120626f622031", + "plaintext": "ola bob 1" + }, + { + "n": 2, + "dir": "b->a", + "type": "msg", + "sigType": 1, + "ciphertextHex": "330a21055f366c2db4e44e33ee3eef0d7c4589734b1536d3ba6f2baf2bd74909a3ba8712100018002210c6166a2533ee88d074cf2aced7d199237f48f54963dcc97b", + "plaintextHex": "6f6920616c6963652032", + "plaintext": "oi alice 2" + }, + { + "n": 3, + "dir": "a->b", + "type": "msg", + "sigType": 1, + "ciphertextHex": "330a210514a2d223f6a4dad317a830ad6d6e9d59cc3ea5737179fbccd3ea495a7c73ce03100018002210b5003ff4e1a7b384cf2e4fb8cae6040c7e352d271c9da3b0", + "plaintextHex": "6f6c6120626f622033", + "plaintext": "ola bob 3" + }, + { + "n": 4, + "dir": "a->b", + "type": "msg", + "sigType": 1, + "ciphertextHex": "330a210514a2d223f6a4dad317a830ad6d6e9d59cc3ea5737179fbccd3ea495a7c73ce031001180022100d9867d62c85219a9db34b66017d47d853df2dd14c3b5bc6", + "plaintextHex": "6f6c6120626f622034", + "plaintext": "ola bob 4" + } + ] +} \ No newline at end of file diff --git a/taicpp/tests/whatsapp_test.cpp b/taicpp/tests/whatsapp_test.cpp new file mode 100644 index 0000000..fbc2306 --- /dev/null +++ b/taicpp/tests/whatsapp_test.cpp @@ -0,0 +1,257 @@ +// whatsapp_test.cpp: validates detz's native WhatsApp implementation against +// golden vectors captured from the real Baileys client (tests/whatsapp_data, +// copied from jfelipesjc/wa-go, MIT). No network; these are offline byte-exact +// checks of the wire codec, crypto, Noise handshake and Signal session. The +// live pairing/send paths need a phone and are not covered here. See +// docs/whatsapp.md. +#include +#include +#include + +#include "json.h" +#include "wa_binary.h" +#include "wa_crypto.h" +#include "wa_noise.h" +#include "wa_proto.h" +#include "wa_signal.h" + +using namespace detz::wa; +using detz::json::Value; + +static int g_fail = 0; +static void check(bool ok, const std::string& name) { + std::printf(" %s %s\n", ok ? "ok " : "FAIL", name.c_str()); + if (!ok) g_fail++; +} + +static Bytes fromhex(const std::string& h) { + Bytes b; + for (size_t i = 0; i + 1 < h.size(); i += 2) b.push_back((uint8_t)std::stoi(h.substr(i, 2), nullptr, 16)); + return b; +} +static std::string tohex(const Bytes& b) { + std::string s; + char t[3]; + for (auto c : b) { + std::snprintf(t, 3, "%02x", c); + s += t; + } + return s; +} +static Bytes b64(const std::string& in) { + static const std::string T = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + Bytes out; + int val = 0, bits = -8; + for (char c : in) { + if (c == '=') break; + auto p = T.find(c); + if (p == std::string::npos) continue; + val = (val << 6) | (int)p; + bits += 6; + if (bits >= 0) { + out.push_back((uint8_t)((val >> bits) & 0xff)); + bits -= 8; + } + } + return out; +} +static std::string slurp(const std::string& p) { + std::ifstream f(p); + return std::string((std::istreambuf_iterator(f)), std::istreambuf_iterator()); +} +static std::array a32(const Bytes& b) { + std::array a{}; + for (size_t i = 0; i < 32 && i < b.size(); ++i) a[i] = b[i]; + return a; +} +static SignalKey sk33(const Bytes& b) { + SignalKey k{}; + for (size_t i = 0; i < 33 && i < b.size(); ++i) k[i] = b[i]; + return k; +} +static WaCrypto::KeyPair kpair(const Value& o) { + WaCrypto::KeyPair k; + k.priv = a32(fromhex(o.get("priv").str())); + Bytes pb = fromhex(o.get("pub").str()); + k.pub = a32(Bytes(pb.begin() + (pb.size() == 33 ? 1 : 0), pb.end())); + return k; +} + +static const char* DIR = nullptr; +static std::string path(const std::string& f) { return std::string(DIR) + "/" + f; } + +// ---- crypto (RFC vectors + XEdDSA) ---- +static void test_crypto() { + std::printf("[crypto]\n"); + Bytes ikm(22, 0x0b), salt; + for (int i = 0; i < 13; i++) salt.push_back(i); + Bytes info; + for (int i = 0xf0; i <= 0xf9; i++) info.push_back(i); + check(tohex(WaCrypto::hkdf_sha256(ikm, salt, info, 42)) == + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865", + "HKDF-SHA256 RFC 5869 case 1"); + check(tohex(WaCrypto::pbkdf2_sha256(Bytes{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}, Bytes{'s', 'a', 'l', 't'}, 1, 32)) == + "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b", + "PBKDF2-SHA256"); + auto a = WaCrypto::generate_x25519(), b = WaCrypto::generate_x25519(); + check(WaCrypto::x25519(a.priv, b.pub) == WaCrypto::x25519(b.priv, a.pub), "X25519 DH agreement"); + bool xok = true; + for (int i = 0; i < 64; ++i) { + auto kp = WaCrypto::generate_x25519(); + Bytes m = WaCrypto::random_bytes(1 + i); + auto sig = WaCrypto::xeddsa_sign(kp.priv, m); + if (!WaCrypto::xeddsa_verify(kp.pub, m, sig)) xok = false; + sig[i % 64] ^= 1; + if (WaCrypto::xeddsa_verify(kp.pub, m, sig)) xok = false; + } + check(xok, "XEdDSA sign/verify roundtrip + tamper (64 keys)"); +} + +// ---- binary codec ---- +static void test_codec() { + std::printf("[codec]\n"); + std::ifstream f(path("codec_battery.jsonl")); + std::string line; + int n = 0, ok = 0; + std::function build = [&](const Value& t) -> WaNode { + WaNode node(t.get("tag").str()); + for (const auto& m : t.get("attrs").members()) node.attrs[m.first] = m.second.str(); + const Value& c = t.get("content"); + if (c.is_string()) + node.content = fromhex(c.str()); + else if (c.is_array()) { + WaNode::Children ch; + for (const auto& e : c.items()) ch.push_back(build(e)); + node.content = ch; + } + return node; + }; + std::function eq = [&](const WaNode& x, const WaNode& y) -> bool { + if (x.tag != y.tag || x.attrs != y.attrs || x.content.index() != y.content.index()) return false; + if (auto* a = x.bytes()) return *a == *y.bytes(); + if (auto* a = x.children()) { + auto* b = y.children(); + if (a->size() != b->size()) return false; + for (size_t i = 0; i < a->size(); ++i) + if (!eq((*a)[i], (*b)[i])) return false; + } + return true; + }; + while (std::getline(f, line)) { + if (line.empty()) continue; + ++n; + Value v = Value::loads(line); + WaNode want = build(v.get("decoded_tree")); + WaNode got = WaBinary::decode(WaBinary::unpack(fromhex(v.get("encoded_hex").str()))); + Bytes re = WaBinary::encode(got); + Bytes framed; + framed.push_back(0); + framed.insert(framed.end(), re.begin(), re.end()); + WaNode got2 = WaBinary::decode(WaBinary::unpack(framed)); + if (eq(got, want) && eq(got2, want)) ++ok; + } + check(ok == n && n == 19, "codec battery " + std::to_string(ok) + "/" + std::to_string(n) + " (decode + re-encode)"); +} + +// ---- ClientPayload byte-exact ---- +static void test_client_payload() { + std::printf("[proto]\n"); + Value d = Value::loads(slurp(path("client_payload.json"))); + const Value& fl = d.get("fields"); + const Value& ua = fl.get("userAgent"); + const Value& dp = fl.get("devicePairingData"); + WaClientPayload p; + p.has_passive = true; + p.has_user_agent = true; + auto& u = p.user_agent; + u.app_version.has = true; + u.app_version.primary = ua.get("appVersion").get("primary").as_int(); + u.app_version.secondary = ua.get("appVersion").get("secondary").as_int(); + u.app_version.tertiary = ua.get("appVersion").get("tertiary").as_int(); + p.has_web_info = true; + p.has_connect = true; + WaDevicePairingData pd; + pd.e_regid = b64(dp.get("eRegid").str()); + pd.e_keytype = b64(dp.get("eKeytype").str()); + pd.e_ident = b64(dp.get("eIdent").str()); + pd.e_skey_id = b64(dp.get("eSkeyId").str()); + pd.e_skey_val = b64(dp.get("eSkeyVal").str()); + pd.e_skey_sig = b64(dp.get("eSkeySig").str()); + pd.build_hash = b64(dp.get("buildHash").str()); + pd.device_props = b64(dp.get("deviceProps").str()); + p.pairing = pd; + p.has_pull = true; + check(tohex(p.encode()) == d.get("payloadHex").str(), "ClientPayload byte-exact (registration)"); +} + +// ---- Noise handshake ---- +static void test_noise() { + std::printf("[noise]\n"); + Value d = Value::loads(slurp(path("noise.json"))); + auto ephPriv = a32(fromhex(d.get("ephemeralKeyPriv").str())); + auto ephPub = a32(fromhex(d.get("ephemeralKeyPub").str())); + auto stPriv = a32(fromhex(d.get("authStaticKeyPriv").str())); + auto stPub = a32(fromhex(d.get("authStaticKeyPub").str())); + Bytes shFrame = fromhex(d.get("serverHelloFrameHex").str()); + size_t pos = 0; + auto sh = WaFraming::unframe(shFrame, pos); + WaNoise noise(ephPub); + auto res = noise.client_handshake(ephPriv, ephPub, stPriv, stPub, *sh, Bytes{1, 2, 3, 4}); + check(res.has_value(), "handshake completed (server static+payload decrypted)"); + if (res) { + check(tohex(WaFraming::frame(res->client_hello, true)) == d.get("clientHelloFrameHex").str(), + "clientHello frame byte-exact"); + check(res->server_static.size() == 32, "server static key is 32 bytes"); + check(parse_cert_chain(res->server_payload).has_value(), "server payload parses as cert chain"); + check(noise.in_transport(), "transport keys derived"); + } +} + +// ---- Signal session ---- +static void test_signal() { + std::printf("[signal]\n"); + Value d = Value::loads(slurp(path("session_ab.json"))); + auto& al = d.get("alice"); + auto& bo = d.get("bob"); + auto& eph = d.get("ephemeralsGenerated"); + WaSession::InitiatorParams p; + p.local_identity = kpair(al.get("identityKeyPair")); + p.local_base = kpair(al.get("baseKey")); + p.remote_identity = sk33(fromhex(bo.get("identityKeyPair").get("pub").str())); + p.remote_signed_pre = sk33(fromhex(bo.get("signedPreKey").get("keyPair").get("pub").str())); + p.remote_pre_key = sk33(fromhex(bo.get("preKey").get("keyPair").get("pub").str())); + p.has_pre_key = true; + WaSession s = WaSession::initiate(p, kpair(eph.at(1))); + s.set_pending(al.get("registrationId").as_int(), signal_pub(p.local_base.pub), + bo.get("signedPreKey").get("id").as_int(), true, bo.get("preKey").get("id").as_int()); + WaCrypto::KeyPair nextR = kpair(eph.at(3)); + s.set_ratchet_generator([&]() { return nextR; }); + const Value& ex = d.get("exchanges"); + auto pt = [&](int i) { + std::string t = ex.at(i).get("plaintext").str(); + return Bytes(t.begin(), t.end()); + }; + auto want = [&](int i) { return ex.at(i).get("ciphertextHex").str(); }; + auto o1 = s.encrypt(pt(0)); + check(o1.type == "pkmsg" && tohex(o1.serialized) == want(0), "exchange #1 pkmsg byte-exact"); + auto p2 = s.decrypt(fromhex(want(1))); + check(p2 && std::string(p2->begin(), p2->end()) == ex.at(1).get("plaintext").str(), "exchange #2 decrypt"); + auto o3 = s.encrypt(pt(2)); + check(o3.type == "msg" && tohex(o3.serialized) == want(2), "exchange #3 msg byte-exact"); + auto o4 = s.encrypt(pt(3)); + check(o4.type == "msg" && tohex(o4.serialized) == want(3), "exchange #4 msg byte-exact"); + // session survives a serialize/deserialize round trip + Bytes blob = s.serialize(); + check(WaSession::deserialize(blob).has_value(), "session serialize/deserialize"); +} + +int main(int argc, char** argv) { + DIR = argc > 1 ? argv[1] : "tests/whatsapp_data"; + test_crypto(); + test_codec(); + test_client_payload(); + test_noise(); + test_signal(); + std::printf("%s\n", g_fail == 0 ? "whatsapp: ALL OK" : "whatsapp: FAILURES"); + return g_fail == 0 ? 0 : 1; +} diff --git a/taicpp/third_party/ed25519/LICENSE b/taicpp/third_party/ed25519/LICENSE new file mode 100644 index 0000000..c1503f9 --- /dev/null +++ b/taicpp/third_party/ed25519/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) 2015 Orson Peters + +This software is provided 'as-is', without any express or implied warranty. In no event will the +authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial +applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the + original software. If you use this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as + being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/taicpp/third_party/ed25519/fe.c b/taicpp/third_party/ed25519/fe.c new file mode 100644 index 0000000..2105eb7 --- /dev/null +++ b/taicpp/third_party/ed25519/fe.c @@ -0,0 +1,1491 @@ +#include "fixedint.h" +#include "fe.h" + + +/* + helper functions +*/ +static uint64_t load_3(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + + return result; +} + +static uint64_t load_4(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + + return result; +} + + + +/* + h = 0 +*/ + +void fe_0(fe h) { + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + + + +/* + h = 1 +*/ + +void fe_1(fe h) { + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + + + +/* + h = f + g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + + Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_add(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 + g0; + int32_t h1 = f1 + g1; + int32_t h2 = f2 + g2; + int32_t h3 = f3 + g3; + int32_t h4 = f4 + g4; + int32_t h5 = f5 + g5; + int32_t h6 = f6 + g6; + int32_t h7 = f7 + g7; + int32_t h8 = f8 + g8; + int32_t h9 = f9 + g9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + + +/* + Replace (f,g) with (g,g) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. +*/ + +void fe_cmov(fe f, const fe g, unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + + b = (unsigned int) (- (int) b); /* silence warning */ + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; +} + +/* + Replace (f,g) with (g,f) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. +*/ + +void fe_cswap(fe f,fe g,unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + b = (unsigned int) (- (int) b); /* silence warning */ + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; + g[0] = g0 ^ x0; + g[1] = g1 ^ x1; + g[2] = g2 ^ x2; + g[3] = g3 ^ x3; + g[4] = g4 ^ x4; + g[5] = g5 ^ x5; + g[6] = g6 ^ x6; + g[7] = g7 ^ x7; + g[8] = g8 ^ x8; + g[9] = g9 ^ x9; +} + + + +/* + h = f +*/ + +void fe_copy(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} + + + +/* + Ignores top bit of h. +*/ + +void fe_frombytes(fe h, const unsigned char *s) { + int64_t h0 = load_4(s); + int64_t h1 = load_3(s + 4) << 6; + int64_t h2 = load_3(s + 7) << 5; + int64_t h3 = load_3(s + 10) << 3; + int64_t h4 = load_3(s + 13) << 2; + int64_t h5 = load_4(s + 16); + int64_t h6 = load_3(s + 20) << 7; + int64_t h7 = load_3(s + 23) << 5; + int64_t h8 = load_3(s + 26) << 4; + int64_t h9 = (load_3(s + 29) & 8388607) << 2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + + +void fe_invert(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + fe t3; + int i; + + fe_sq(t0, z); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_sq(t1, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t2, t0); + + for (i = 1; i < 1; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t1, t2); + fe_sq(t2, t1); + + for (i = 1; i < 5; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + + for (i = 1; i < 10; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + + for (i = 1; i < 20; ++i) { + fe_sq(t3, t3); + } + + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + + for (i = 1; i < 10; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + + for (i = 1; i < 50; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + + for (i = 1; i < 100; ++i) { + fe_sq(t3, t3); + } + + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + + for (i = 1; i < 50; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 5; ++i) { + fe_sq(t1, t1); + } + + fe_mul(out, t1, t0); +} + + + +/* + return 1 if f is in {1,3,5,...,q-2} + return 0 if f is in {0,2,4,...,q-1} + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnegative(const fe f) { + unsigned char s[32]; + + fe_tobytes(s, f); + + return s[0] & 1; +} + + + +/* + return 1 if f == 0 + return 0 if f != 0 + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnonzero(const fe f) { + unsigned char s[32]; + unsigned char r; + + fe_tobytes(s, f); + + r = s[0]; + #define F(i) r |= s[i] + F(1); + F(2); + F(3); + F(4); + F(5); + F(6); + F(7); + F(8); + F(9); + F(10); + F(11); + F(12); + F(13); + F(14); + F(15); + F(16); + F(17); + F(18); + F(19); + F(20); + F(21); + F(22); + F(23); + F(24); + F(25); + F(26); + F(27); + F(28); + F(29); + F(30); + F(31); + #undef F + + return r != 0; +} + + + +/* + h = f * g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + + Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + */ + + /* + Notes on implementation strategy: + + Using schoolbook multiplication. + Karatsuba would save a little in some cost models. + + Most multiplications by 2 and 19 are 32-bit precomputations; + cheaper than 64-bit postcomputations. + + There is one remaining multiplication by 19 in the carry chain; + one *19 precomputation can be merged into this, + but the resulting data flow is considerably less clean. + + There are 12 carries below. + 10 of them are 2-way parallelizable and vectorizable. + Can get away with 11 carries, but then data flow is much deeper. + + With tighter constraints on inputs can squeeze carries into int32. +*/ + +void fe_mul(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */ + int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + int32_t g3_19 = 19 * g3; + int32_t g4_19 = 19 * g4; + int32_t g5_19 = 19 * g5; + int32_t g6_19 = 19 * g6; + int32_t g7_19 = 19 * g7; + int32_t g8_19 = 19 * g8; + int32_t g9_19 = 19 * g9; + int32_t f1_2 = 2 * f1; + int32_t f3_2 = 2 * f3; + int32_t f5_2 = 2 * f5; + int32_t f7_2 = 2 * f7; + int32_t f9_2 = 2 * f9; + int64_t f0g0 = f0 * (int64_t) g0; + int64_t f0g1 = f0 * (int64_t) g1; + int64_t f0g2 = f0 * (int64_t) g2; + int64_t f0g3 = f0 * (int64_t) g3; + int64_t f0g4 = f0 * (int64_t) g4; + int64_t f0g5 = f0 * (int64_t) g5; + int64_t f0g6 = f0 * (int64_t) g6; + int64_t f0g7 = f0 * (int64_t) g7; + int64_t f0g8 = f0 * (int64_t) g8; + int64_t f0g9 = f0 * (int64_t) g9; + int64_t f1g0 = f1 * (int64_t) g0; + int64_t f1g1_2 = f1_2 * (int64_t) g1; + int64_t f1g2 = f1 * (int64_t) g2; + int64_t f1g3_2 = f1_2 * (int64_t) g3; + int64_t f1g4 = f1 * (int64_t) g4; + int64_t f1g5_2 = f1_2 * (int64_t) g5; + int64_t f1g6 = f1 * (int64_t) g6; + int64_t f1g7_2 = f1_2 * (int64_t) g7; + int64_t f1g8 = f1 * (int64_t) g8; + int64_t f1g9_38 = f1_2 * (int64_t) g9_19; + int64_t f2g0 = f2 * (int64_t) g0; + int64_t f2g1 = f2 * (int64_t) g1; + int64_t f2g2 = f2 * (int64_t) g2; + int64_t f2g3 = f2 * (int64_t) g3; + int64_t f2g4 = f2 * (int64_t) g4; + int64_t f2g5 = f2 * (int64_t) g5; + int64_t f2g6 = f2 * (int64_t) g6; + int64_t f2g7 = f2 * (int64_t) g7; + int64_t f2g8_19 = f2 * (int64_t) g8_19; + int64_t f2g9_19 = f2 * (int64_t) g9_19; + int64_t f3g0 = f3 * (int64_t) g0; + int64_t f3g1_2 = f3_2 * (int64_t) g1; + int64_t f3g2 = f3 * (int64_t) g2; + int64_t f3g3_2 = f3_2 * (int64_t) g3; + int64_t f3g4 = f3 * (int64_t) g4; + int64_t f3g5_2 = f3_2 * (int64_t) g5; + int64_t f3g6 = f3 * (int64_t) g6; + int64_t f3g7_38 = f3_2 * (int64_t) g7_19; + int64_t f3g8_19 = f3 * (int64_t) g8_19; + int64_t f3g9_38 = f3_2 * (int64_t) g9_19; + int64_t f4g0 = f4 * (int64_t) g0; + int64_t f4g1 = f4 * (int64_t) g1; + int64_t f4g2 = f4 * (int64_t) g2; + int64_t f4g3 = f4 * (int64_t) g3; + int64_t f4g4 = f4 * (int64_t) g4; + int64_t f4g5 = f4 * (int64_t) g5; + int64_t f4g6_19 = f4 * (int64_t) g6_19; + int64_t f4g7_19 = f4 * (int64_t) g7_19; + int64_t f4g8_19 = f4 * (int64_t) g8_19; + int64_t f4g9_19 = f4 * (int64_t) g9_19; + int64_t f5g0 = f5 * (int64_t) g0; + int64_t f5g1_2 = f5_2 * (int64_t) g1; + int64_t f5g2 = f5 * (int64_t) g2; + int64_t f5g3_2 = f5_2 * (int64_t) g3; + int64_t f5g4 = f5 * (int64_t) g4; + int64_t f5g5_38 = f5_2 * (int64_t) g5_19; + int64_t f5g6_19 = f5 * (int64_t) g6_19; + int64_t f5g7_38 = f5_2 * (int64_t) g7_19; + int64_t f5g8_19 = f5 * (int64_t) g8_19; + int64_t f5g9_38 = f5_2 * (int64_t) g9_19; + int64_t f6g0 = f6 * (int64_t) g0; + int64_t f6g1 = f6 * (int64_t) g1; + int64_t f6g2 = f6 * (int64_t) g2; + int64_t f6g3 = f6 * (int64_t) g3; + int64_t f6g4_19 = f6 * (int64_t) g4_19; + int64_t f6g5_19 = f6 * (int64_t) g5_19; + int64_t f6g6_19 = f6 * (int64_t) g6_19; + int64_t f6g7_19 = f6 * (int64_t) g7_19; + int64_t f6g8_19 = f6 * (int64_t) g8_19; + int64_t f6g9_19 = f6 * (int64_t) g9_19; + int64_t f7g0 = f7 * (int64_t) g0; + int64_t f7g1_2 = f7_2 * (int64_t) g1; + int64_t f7g2 = f7 * (int64_t) g2; + int64_t f7g3_38 = f7_2 * (int64_t) g3_19; + int64_t f7g4_19 = f7 * (int64_t) g4_19; + int64_t f7g5_38 = f7_2 * (int64_t) g5_19; + int64_t f7g6_19 = f7 * (int64_t) g6_19; + int64_t f7g7_38 = f7_2 * (int64_t) g7_19; + int64_t f7g8_19 = f7 * (int64_t) g8_19; + int64_t f7g9_38 = f7_2 * (int64_t) g9_19; + int64_t f8g0 = f8 * (int64_t) g0; + int64_t f8g1 = f8 * (int64_t) g1; + int64_t f8g2_19 = f8 * (int64_t) g2_19; + int64_t f8g3_19 = f8 * (int64_t) g3_19; + int64_t f8g4_19 = f8 * (int64_t) g4_19; + int64_t f8g5_19 = f8 * (int64_t) g5_19; + int64_t f8g6_19 = f8 * (int64_t) g6_19; + int64_t f8g7_19 = f8 * (int64_t) g7_19; + int64_t f8g8_19 = f8 * (int64_t) g8_19; + int64_t f8g9_19 = f8 * (int64_t) g9_19; + int64_t f9g0 = f9 * (int64_t) g0; + int64_t f9g1_38 = f9_2 * (int64_t) g1_19; + int64_t f9g2_19 = f9 * (int64_t) g2_19; + int64_t f9g3_38 = f9_2 * (int64_t) g3_19; + int64_t f9g4_19 = f9 * (int64_t) g4_19; + int64_t f9g5_38 = f9_2 * (int64_t) g5_19; + int64_t f9g6_19 = f9 * (int64_t) g6_19; + int64_t f9g7_38 = f9_2 * (int64_t) g7_19; + int64_t f9g8_19 = f9 * (int64_t) g8_19; + int64_t f9g9_38 = f9_2 * (int64_t) g9_19; + int64_t h0 = f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38; + int64_t h1 = f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19; + int64_t h2 = f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38; + int64_t h3 = f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19; + int64_t h4 = f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38; + int64_t h5 = f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19; + int64_t h6 = f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38; + int64_t h7 = f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19; + int64_t h8 = f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38; + int64_t h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 ; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = f * 121666 +Can overlap h with f. + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_mul121666(fe h, fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int64_t h0 = f0 * (int64_t) 121666; + int64_t h1 = f1 * (int64_t) 121666; + int64_t h2 = f2 * (int64_t) 121666; + int64_t h3 = f3 * (int64_t) 121666; + int64_t h4 = f4 * (int64_t) 121666; + int64_t h5 = f5 * (int64_t) 121666; + int64_t h6 = f6 * (int64_t) 121666; + int64_t h7 = f7 * (int64_t) 121666; + int64_t h8 = f8 * (int64_t) 121666; + int64_t h9 = f9 * (int64_t) 121666; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = -f + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_neg(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t h0 = -f0; + int32_t h1 = -f1; + int32_t h2 = -f2; + int32_t h3 = -f3; + int32_t h4 = -f4; + int32_t h5 = -f5; + int32_t h6 = -f6; + int32_t h7 = -f7; + int32_t h8 = -f8; + int32_t h9 = -f9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +void fe_pow22523(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + int i; + fe_sq(t0, z); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_sq(t1, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t0, t0); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 5; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 10; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + + for (i = 1; i < 20; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 10; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 50; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + + for (i = 1; i < 100; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 50; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t0, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t0, t0); + } + + fe_mul(out, t0, z); + return; +} + + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + int64_t h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + int64_t h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + int64_t h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + int64_t h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + int64_t h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + int64_t h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + int64_t h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + int64_t h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + int64_t h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq2(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + int64_t h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + int64_t h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + int64_t h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + int64_t h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + int64_t h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + int64_t h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + int64_t h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + int64_t h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + int64_t h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_sub(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 - g0; + int32_t h1 = f1 - g1; + int32_t h2 = f2 - g2; + int32_t h3 = f3 - g3; + int32_t h4 = f4 - g4; + int32_t h5 = f5 - g5; + int32_t h6 = f6 - g6; + int32_t h7 = f7 - g7; + int32_t h8 = f8 - g8; + int32_t h9 = f9 - g9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + + +/* +Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + carry0 = h0 >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry1 = h1 >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry2 = h2 >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry3 = h3 >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry4 = h4 >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry5 = h5 >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry6 = h6 >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry7 = h7 >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry8 = h8 >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = h9 >> 25; + h9 -= carry9 << 25; + + /* h10 = carry9 */ + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + s[0] = (unsigned char) (h0 >> 0); + s[1] = (unsigned char) (h0 >> 8); + s[2] = (unsigned char) (h0 >> 16); + s[3] = (unsigned char) ((h0 >> 24) | (h1 << 2)); + s[4] = (unsigned char) (h1 >> 6); + s[5] = (unsigned char) (h1 >> 14); + s[6] = (unsigned char) ((h1 >> 22) | (h2 << 3)); + s[7] = (unsigned char) (h2 >> 5); + s[8] = (unsigned char) (h2 >> 13); + s[9] = (unsigned char) ((h2 >> 21) | (h3 << 5)); + s[10] = (unsigned char) (h3 >> 3); + s[11] = (unsigned char) (h3 >> 11); + s[12] = (unsigned char) ((h3 >> 19) | (h4 << 6)); + s[13] = (unsigned char) (h4 >> 2); + s[14] = (unsigned char) (h4 >> 10); + s[15] = (unsigned char) (h4 >> 18); + s[16] = (unsigned char) (h5 >> 0); + s[17] = (unsigned char) (h5 >> 8); + s[18] = (unsigned char) (h5 >> 16); + s[19] = (unsigned char) ((h5 >> 24) | (h6 << 1)); + s[20] = (unsigned char) (h6 >> 7); + s[21] = (unsigned char) (h6 >> 15); + s[22] = (unsigned char) ((h6 >> 23) | (h7 << 3)); + s[23] = (unsigned char) (h7 >> 5); + s[24] = (unsigned char) (h7 >> 13); + s[25] = (unsigned char) ((h7 >> 21) | (h8 << 4)); + s[26] = (unsigned char) (h8 >> 4); + s[27] = (unsigned char) (h8 >> 12); + s[28] = (unsigned char) ((h8 >> 20) | (h9 << 6)); + s[29] = (unsigned char) (h9 >> 2); + s[30] = (unsigned char) (h9 >> 10); + s[31] = (unsigned char) (h9 >> 18); +} diff --git a/taicpp/third_party/ed25519/fe.h b/taicpp/third_party/ed25519/fe.h new file mode 100644 index 0000000..b4b62d2 --- /dev/null +++ b/taicpp/third_party/ed25519/fe.h @@ -0,0 +1,41 @@ +#ifndef FE_H +#define FE_H + +#include "fixedint.h" + + +/* + fe means field element. + Here the field is \Z/(2^255-19). + An element t, entries t[0]...t[9], represents the integer + t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. + Bounds on each t[i] vary depending on context. +*/ + + +typedef int32_t fe[10]; + + +void fe_0(fe h); +void fe_1(fe h); + +void fe_frombytes(fe h, const unsigned char *s); +void fe_tobytes(unsigned char *s, const fe h); + +void fe_copy(fe h, const fe f); +int fe_isnegative(const fe f); +int fe_isnonzero(const fe f); +void fe_cmov(fe f, const fe g, unsigned int b); +void fe_cswap(fe f, fe g, unsigned int b); + +void fe_neg(fe h, const fe f); +void fe_add(fe h, const fe f, const fe g); +void fe_invert(fe out, const fe z); +void fe_sq(fe h, const fe f); +void fe_sq2(fe h, const fe f); +void fe_mul(fe h, const fe f, const fe g); +void fe_mul121666(fe h, fe f); +void fe_pow22523(fe out, const fe z); +void fe_sub(fe h, const fe f, const fe g); + +#endif diff --git a/taicpp/third_party/ed25519/fixedint.h b/taicpp/third_party/ed25519/fixedint.h new file mode 100644 index 0000000..1a8745b --- /dev/null +++ b/taicpp/third_party/ed25519/fixedint.h @@ -0,0 +1,72 @@ +/* + Portable header to provide the 32 and 64 bits type. + + Not a compatible replacement for , do not blindly use it as such. +*/ + +#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__WATCOMC__) && (defined(_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined(__UINT_FAST64_TYPE__)) )) && !defined(FIXEDINT_H_INCLUDED) + #include + #define FIXEDINT_H_INCLUDED + + #if defined(__WATCOMC__) && __WATCOMC__ >= 1250 && !defined(UINT64_C) + #include + #define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) + #endif +#endif + + +#ifndef FIXEDINT_H_INCLUDED + #define FIXEDINT_H_INCLUDED + + #include + + /* (u)int32_t */ + #ifndef uint32_t + #if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long uint32_t; + #elif (UINT_MAX == 0xffffffffUL) + typedef unsigned int uint32_t; + #elif (USHRT_MAX == 0xffffffffUL) + typedef unsigned short uint32_t; + #endif + #endif + + + #ifndef int32_t + #if (LONG_MAX == 0x7fffffffL) + typedef signed long int32_t; + #elif (INT_MAX == 0x7fffffffL) + typedef signed int int32_t; + #elif (SHRT_MAX == 0x7fffffffL) + typedef signed short int32_t; + #endif + #endif + + + /* (u)int64_t */ + #if (defined(__STDC__) && defined(__STDC_VERSION__) && __STDC__ && __STDC_VERSION__ >= 199901L) + typedef long long int64_t; + typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif defined(__GNUC__) + __extension__ typedef long long int64_t; + __extension__ typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif defined(__MWERKS__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__APPLE_CC__) || defined(_LONG_LONG) || defined(_CRAYC) + typedef long long int64_t; + typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || defined(__alpha) || defined(__DECC) + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; + + #define UINT64_C(v) v ##UI64 + #define INT64_C(v) v ##I64 + #endif +#endif diff --git a/taicpp/third_party/ed25519/ge.c b/taicpp/third_party/ed25519/ge.c new file mode 100644 index 0000000..87c691b --- /dev/null +++ b/taicpp/third_party/ed25519/ge.c @@ -0,0 +1,467 @@ +#include "ge.h" +#include "precomp_data.h" + + +/* +r = p + q +*/ + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YplusX); + fe_mul(r->Y, r->Y, q->YminusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + + +static void slide(signed char *r, const unsigned char *a) { + int i; + int b; + int k; + + for (i = 0; i < 256; ++i) { + r[i] = 1 & (a[i >> 3] >> (i & 7)); + } + + for (i = 0; i < 256; ++i) + if (r[i]) { + for (b = 1; b <= 6 && i + b < 256; ++b) { + if (r[i + b]) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; + r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + + for (k = i + b; k < 256; ++k) { + if (!r[k]) { + r[k] = 1; + break; + } + + r[k] = 0; + } + } else { + break; + } + } + } + } +} + +/* +r = a * A + b * B +where a = a[0]+256*a[1]+...+256^31 a[31]. +and b = b[0]+256*b[1]+...+256^31 b[31]. +B is the Ed25519 base point (x,4/5) with x positive. +*/ + +void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b) { + signed char aslide[256]; + signed char bslide[256]; + ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + ge_p1p1 t; + ge_p3 u; + ge_p3 A2; + int i; + slide(aslide, a); + slide(bslide, b); + ge_p3_to_cached(&Ai[0], A); + ge_p3_dbl(&t, A); + ge_p1p1_to_p3(&A2, &t); + ge_add(&t, &A2, &Ai[0]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[1], &u); + ge_add(&t, &A2, &Ai[1]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[2], &u); + ge_add(&t, &A2, &Ai[2]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[3], &u); + ge_add(&t, &A2, &Ai[3]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[4], &u); + ge_add(&t, &A2, &Ai[4]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[5], &u); + ge_add(&t, &A2, &Ai[5]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[6], &u); + ge_add(&t, &A2, &Ai[6]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[7], &u); + ge_p2_0(r); + + for (i = 255; i >= 0; --i) { + if (aslide[i] || bslide[i]) { + break; + } + } + + for (; i >= 0; --i) { + ge_p2_dbl(&t, r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_add(&t, &u, &Ai[aslide[i] / 2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_madd(&t, &u, &Bi[bslide[i] / 2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]); + } + + ge_p1p1_to_p2(r, &t); + } +} + + +static const fe d = { + -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 +}; + +static const fe sqrtm1 = { + -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 +}; + +int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s) { + fe u; + fe v; + fe v3; + fe vxx; + fe check; + fe_frombytes(h->Y, s); + fe_1(h->Z); + fe_sq(u, h->Y); + fe_mul(v, u, d); + fe_sub(u, u, h->Z); /* u = y^2-1 */ + fe_add(v, v, h->Z); /* v = dy^2+1 */ + fe_sq(v3, v); + fe_mul(v3, v3, v); /* v3 = v^3 */ + fe_sq(h->X, v3); + fe_mul(h->X, h->X, v); + fe_mul(h->X, h->X, u); /* x = uv^7 */ + fe_pow22523(h->X, h->X); /* x = (uv^7)^((q-5)/8) */ + fe_mul(h->X, h->X, v3); + fe_mul(h->X, h->X, u); /* x = uv^3(uv^7)^((q-5)/8) */ + fe_sq(vxx, h->X); + fe_mul(vxx, vxx, v); + fe_sub(check, vxx, u); /* vx^2-u */ + + if (fe_isnonzero(check)) { + fe_add(check, vxx, u); /* vx^2+u */ + + if (fe_isnonzero(check)) { + return -1; + } + + fe_mul(h->X, h->X, sqrtm1); + } + + if (fe_isnegative(h->X) == (s[31] >> 7)) { + fe_neg(h->X, h->X); + } + + fe_mul(h->T, h->X, h->Y); + return 0; +} + + +/* +r = p + q +*/ + +void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yplusx); + fe_mul(r->Y, r->Y, q->yminusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + + +/* +r = p - q +*/ + +void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yminusx); + fe_mul(r->Y, r->Y, q->yplusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + + +/* +r = p +*/ + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); +} + + + +/* +r = p +*/ + +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); + fe_mul(r->T, p->X, p->Y); +} + + +void ge_p2_0(ge_p2 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); +} + + + +/* +r = 2 * p +*/ + +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { + fe t0; + + fe_sq(r->X, p->X); + fe_sq(r->Z, p->Y); + fe_sq2(r->T, p->Z); + fe_add(r->Y, p->X, p->Y); + fe_sq(t0, r->Y); + fe_add(r->Y, r->Z, r->X); + fe_sub(r->Z, r->Z, r->X); + fe_sub(r->X, t0, r->Y); + fe_sub(r->T, r->T, r->Z); +} + + +void ge_p3_0(ge_p3 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); + fe_0(h->T); +} + + +/* +r = 2 * p +*/ + +void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { + ge_p2 q; + ge_p3_to_p2(&q, p); + ge_p2_dbl(r, &q); +} + + + +/* +r = p +*/ + +static const fe d2 = { + -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 +}; + +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { + fe_add(r->YplusX, p->Y, p->X); + fe_sub(r->YminusX, p->Y, p->X); + fe_copy(r->Z, p->Z); + fe_mul(r->T2d, p->T, d2); +} + + +/* +r = p +*/ + +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { + fe_copy(r->X, p->X); + fe_copy(r->Y, p->Y); + fe_copy(r->Z, p->Z); +} + + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h) { + fe recip; + fe x; + fe y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} + + +static unsigned char equal(signed char b, signed char c) { + unsigned char ub = b; + unsigned char uc = c; + unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + uint64_t y = x; /* 0: yes; 1..255: no */ + y -= 1; /* large: yes; 0..254: no */ + y >>= 63; /* 1: yes; 0: no */ + return (unsigned char) y; +} + +static unsigned char negative(signed char b) { + uint64_t x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return (unsigned char) x; +} + +static void cmov(ge_precomp *t, const ge_precomp *u, unsigned char b) { + fe_cmov(t->yplusx, u->yplusx, b); + fe_cmov(t->yminusx, u->yminusx, b); + fe_cmov(t->xy2d, u->xy2d, b); +} + + +static void select(ge_precomp *t, int pos, signed char b) { + ge_precomp minust; + unsigned char bnegative = negative(b); + unsigned char babs = b - (((-bnegative) & b) << 1); + fe_1(t->yplusx); + fe_1(t->yminusx); + fe_0(t->xy2d); + cmov(t, &base[pos][0], equal(babs, 1)); + cmov(t, &base[pos][1], equal(babs, 2)); + cmov(t, &base[pos][2], equal(babs, 3)); + cmov(t, &base[pos][3], equal(babs, 4)); + cmov(t, &base[pos][4], equal(babs, 5)); + cmov(t, &base[pos][5], equal(babs, 6)); + cmov(t, &base[pos][6], equal(babs, 7)); + cmov(t, &base[pos][7], equal(babs, 8)); + fe_copy(minust.yplusx, t->yminusx); + fe_copy(minust.yminusx, t->yplusx); + fe_neg(minust.xy2d, t->xy2d); + cmov(t, &minust, bnegative); +} + +/* +h = a * B +where a = a[0]+256*a[1]+...+256^31 a[31] +B is the Ed25519 base point (x,4/5) with x positive. + +Preconditions: + a[31] <= 127 +*/ + +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) { + signed char e[64]; + signed char carry; + ge_p1p1 r; + ge_p2 s; + ge_precomp t; + int i; + + for (i = 0; i < 32; ++i) { + e[2 * i + 0] = (a[i] >> 0) & 15; + e[2 * i + 1] = (a[i] >> 4) & 15; + } + + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + carry = 0; + + for (i = 0; i < 63; ++i) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= carry << 4; + } + + e[63] += carry; + /* each e[i] is between -8 and 8 */ + ge_p3_0(h); + + for (i = 1; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); + ge_p1p1_to_p3(h, &r); + } + + ge_p3_dbl(&r, h); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p3(h, &r); + + for (i = 0; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); + ge_p1p1_to_p3(h, &r); + } +} + + +/* +r = p - q +*/ + +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YminusX); + fe_mul(r->Y, r->Y, q->YplusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + + +void ge_tobytes(unsigned char *s, const ge_p2 *h) { + fe recip; + fe x; + fe y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} diff --git a/taicpp/third_party/ed25519/ge.h b/taicpp/third_party/ed25519/ge.h new file mode 100644 index 0000000..17fde2d --- /dev/null +++ b/taicpp/third_party/ed25519/ge.h @@ -0,0 +1,74 @@ +#ifndef GE_H +#define GE_H + +#include "fe.h" + + +/* +ge means group element. + +Here the group is the set of pairs (x,y) of field elements (see fe.h) +satisfying -x^2 + y^2 = 1 + d x^2y^2 +where d = -121665/121666. + +Representations: + ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z + ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT + ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T + ge_precomp (Duif): (y+x,y-x,2dxy) +*/ + +typedef struct { + fe X; + fe Y; + fe Z; +} ge_p2; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p3; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p1p1; + +typedef struct { + fe yplusx; + fe yminusx; + fe xy2d; +} ge_precomp; + +typedef struct { + fe YplusX; + fe YminusX; + fe Z; + fe T2d; +} ge_cached; + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h); +void ge_tobytes(unsigned char *s, const ge_p2 *h); +int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s); + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b); +void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); +void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a); + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p); +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p); +void ge_p2_0(ge_p2 *h); +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p); +void ge_p3_0(ge_p3 *h); +void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p); +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p); +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p); + +#endif diff --git a/taicpp/third_party/ed25519/precomp_data.h b/taicpp/third_party/ed25519/precomp_data.h new file mode 100644 index 0000000..ff23986 --- /dev/null +++ b/taicpp/third_party/ed25519/precomp_data.h @@ -0,0 +1,1391 @@ +static const ge_precomp Bi[8] = { + { + { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, + { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, + { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, + }, + { + { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, + { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, + { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, + }, + { + { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, + { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, + { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, + }, + { + { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, + { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, + { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, + }, + { + { -22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877 }, + { -6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951 }, + { 4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784 }, + }, + { + { -25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436 }, + { 25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918 }, + { 23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877 }, + }, + { + { -33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800 }, + { -25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305 }, + { -13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300 }, + }, + { + { -3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876 }, + { -24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619 }, + { -3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683 }, + }, +}; + + +/* base[i][j] = (j+1)*256^i*B */ +static const ge_precomp base[32][8] = { + { + { + { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, + { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, + { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, + }, + { + { -12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303 }, + { -21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081 }, + { 26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697 }, + }, + { + { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, + { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, + { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, + }, + { + { -17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540 }, + { 23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397 }, + { 7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325 }, + }, + { + { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, + { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, + { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, + }, + { + { -15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777 }, + { -8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737 }, + { -18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652 }, + }, + { + { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, + { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, + { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, + }, + { + { 14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726 }, + { -7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955 }, + { 27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425 }, + }, + }, + { + { + { -13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171 }, + { 27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510 }, + { 17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660 }, + }, + { + { -10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639 }, + { 29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963 }, + { 5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950 }, + }, + { + { -27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568 }, + { 12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335 }, + { 25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628 }, + }, + { + { -26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007 }, + { -2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772 }, + { -22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653 }, + }, + { + { 2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567 }, + { 13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686 }, + { 21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372 }, + }, + { + { -13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887 }, + { -23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954 }, + { -29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953 }, + }, + { + { 24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833 }, + { -16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532 }, + { -22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876 }, + }, + { + { 2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268 }, + { 33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214 }, + { 1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038 }, + }, + }, + { + { + { 6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800 }, + { 4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645 }, + { -4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664 }, + }, + { + { 1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933 }, + { -25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182 }, + { -17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222 }, + }, + { + { -18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991 }, + { 20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880 }, + { 9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092 }, + }, + { + { -16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295 }, + { 19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788 }, + { 8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553 }, + }, + { + { -15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026 }, + { 11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347 }, + { -18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033 }, + }, + { + { -23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395 }, + { -27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278 }, + { 1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890 }, + }, + { + { 32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995 }, + { -30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596 }, + { -11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891 }, + }, + { + { 31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060 }, + { 11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608 }, + { -20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606 }, + }, + }, + { + { + { 7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389 }, + { -19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016 }, + { -11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341 }, + }, + { + { -22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505 }, + { 14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553 }, + { -28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655 }, + }, + { + { 15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220 }, + { 12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631 }, + { -4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099 }, + }, + { + { 26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556 }, + { 14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749 }, + { 236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930 }, + }, + { + { 1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391 }, + { 5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253 }, + { 20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066 }, + }, + { + { 24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958 }, + { -11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082 }, + { -28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383 }, + }, + { + { -30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521 }, + { -11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807 }, + { 23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948 }, + }, + { + { 9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134 }, + { -32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455 }, + { 27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629 }, + }, + }, + { + { + { -8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069 }, + { -32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746 }, + { 24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919 }, + }, + { + { 11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837 }, + { 8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906 }, + { -28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771 }, + }, + { + { -25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817 }, + { 10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098 }, + { 10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409 }, + }, + { + { -12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504 }, + { -26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727 }, + { 28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420 }, + }, + { + { -32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003 }, + { -1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605 }, + { -30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384 }, + }, + { + { -26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701 }, + { -23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683 }, + { 29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708 }, + }, + { + { -3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563 }, + { -19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260 }, + { -5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387 }, + }, + { + { -19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672 }, + { 23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686 }, + { -24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665 }, + }, + }, + { + { + { 11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182 }, + { -31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277 }, + { 14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628 }, + }, + { + { -4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474 }, + { -26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539 }, + { -25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822 }, + }, + { + { -10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970 }, + { 19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756 }, + { -24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508 }, + }, + { + { -26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683 }, + { -10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655 }, + { -20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158 }, + }, + { + { -4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125 }, + { -15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839 }, + { -20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664 }, + }, + { + { 27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294 }, + { -18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899 }, + { -11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070 }, + }, + { + { 3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294 }, + { -15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949 }, + { -21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083 }, + }, + { + { 31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420 }, + { -5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940 }, + { 29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396 }, + }, + }, + { + { + { -12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567 }, + { 20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127 }, + { -16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294 }, + }, + { + { -12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887 }, + { 22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964 }, + { 16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195 }, + }, + { + { 9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244 }, + { 24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999 }, + { -1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762 }, + }, + { + { -18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274 }, + { -33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236 }, + { -16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605 }, + }, + { + { -13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761 }, + { -22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884 }, + { -6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482 }, + }, + { + { -24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638 }, + { -11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490 }, + { -32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170 }, + }, + { + { 5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736 }, + { 10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124 }, + { -17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392 }, + }, + { + { 8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029 }, + { 6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048 }, + { 28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958 }, + }, + }, + { + { + { 24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593 }, + { 26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071 }, + { -11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692 }, + }, + { + { 11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687 }, + { -160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441 }, + { -20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001 }, + }, + { + { -938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460 }, + { -19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007 }, + { -21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762 }, + }, + { + { 15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005 }, + { -9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674 }, + { 4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035 }, + }, + { + { 7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590 }, + { -2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957 }, + { -30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812 }, + }, + { + { 33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740 }, + { -18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122 }, + { -27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158 }, + }, + { + { 8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885 }, + { 26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140 }, + { 19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857 }, + }, + { + { 801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155 }, + { 19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260 }, + { 19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483 }, + }, + }, + { + { + { -3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677 }, + { 32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815 }, + { 22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751 }, + }, + { + { -16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203 }, + { -11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208 }, + { 1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230 }, + }, + { + { 16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850 }, + { -21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389 }, + { -9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968 }, + }, + { + { -11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689 }, + { 14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880 }, + { 5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304 }, + }, + { + { 30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632 }, + { -3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412 }, + { 20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566 }, + }, + { + { -20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038 }, + { -26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232 }, + { -1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943 }, + }, + { + { 17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856 }, + { 23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738 }, + { 15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971 }, + }, + { + { -27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718 }, + { -13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697 }, + { -11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883 }, + }, + }, + { + { + { 5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912 }, + { -26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358 }, + { 3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849 }, + }, + { + { 29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307 }, + { -14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977 }, + { -6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335 }, + }, + { + { -29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644 }, + { -22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616 }, + { -27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735 }, + }, + { + { -21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099 }, + { 29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341 }, + { -936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336 }, + }, + { + { -23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646 }, + { 31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425 }, + { -17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388 }, + }, + { + { -31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743 }, + { -16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822 }, + { -8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462 }, + }, + { + { 18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985 }, + { 9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702 }, + { -22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797 }, + }, + { + { 21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293 }, + { 27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100 }, + { 19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688 }, + }, + }, + { + { + { 12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186 }, + { 2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610 }, + { -2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707 }, + }, + { + { 7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220 }, + { 915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025 }, + { 32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044 }, + }, + { + { 32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992 }, + { -4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027 }, + { 21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197 }, + }, + { + { 8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901 }, + { 31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952 }, + { 19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878 }, + }, + { + { -28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390 }, + { 32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730 }, + { 2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730 }, + }, + { + { -19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180 }, + { -30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272 }, + { -15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715 }, + }, + { + { -22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970 }, + { -31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772 }, + { -17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865 }, + }, + { + { 15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750 }, + { 20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373 }, + { 32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348 }, + }, + }, + { + { + { 9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144 }, + { -22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195 }, + { 5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086 }, + }, + { + { -13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684 }, + { -8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518 }, + { -2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233 }, + }, + { + { -5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793 }, + { -2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794 }, + { 580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435 }, + }, + { + { 23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921 }, + { 13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518 }, + { 2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563 }, + }, + { + { 14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278 }, + { -27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024 }, + { 4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030 }, + }, + { + { 10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783 }, + { 27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717 }, + { 6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844 }, + }, + { + { 14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333 }, + { 16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048 }, + { 22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760 }, + }, + { + { -4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760 }, + { -15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757 }, + { -2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112 }, + }, + }, + { + { + { -19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468 }, + { 3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184 }, + { 10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289 }, + }, + { + { 15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066 }, + { 24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882 }, + { 13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226 }, + }, + { + { 16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101 }, + { 29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279 }, + { -6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811 }, + }, + { + { 27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709 }, + { 20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714 }, + { -2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121 }, + }, + { + { 9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464 }, + { 12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847 }, + { 13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400 }, + }, + { + { 4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414 }, + { -15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158 }, + { 17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045 }, + }, + { + { -461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415 }, + { -5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459 }, + { -31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079 }, + }, + { + { 21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412 }, + { -20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743 }, + { -14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836 }, + }, + }, + { + { + { 12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022 }, + { 18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429 }, + { -6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065 }, + }, + { + { 30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861 }, + { 10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000 }, + { -33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101 }, + }, + { + { 32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815 }, + { 29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642 }, + { 10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966 }, + }, + { + { 25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574 }, + { -21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742 }, + { -18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689 }, + }, + { + { 12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020 }, + { -10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772 }, + { 3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982 }, + }, + { + { -14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953 }, + { -16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218 }, + { -17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265 }, + }, + { + { 29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073 }, + { -3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325 }, + { -11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798 }, + }, + { + { -4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870 }, + { -7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863 }, + { -13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927 }, + }, + }, + { + { + { -2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267 }, + { -9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663 }, + { 22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862 }, + }, + { + { -25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673 }, + { 15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943 }, + { 15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020 }, + }, + { + { -4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238 }, + { 11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064 }, + { 14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795 }, + }, + { + { 15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052 }, + { -10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904 }, + { 29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531 }, + }, + { + { -13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979 }, + { -5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841 }, + { 10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431 }, + }, + { + { 10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324 }, + { -31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940 }, + { 10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320 }, + }, + { + { -15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184 }, + { 14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114 }, + { 30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878 }, + }, + { + { 12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784 }, + { -2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091 }, + { -16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585 }, + }, + }, + { + { + { -8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208 }, + { 10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864 }, + { 17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661 }, + }, + { + { 7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233 }, + { 26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212 }, + { -12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525 }, + }, + { + { -24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068 }, + { 9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397 }, + { -8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988 }, + }, + { + { 5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889 }, + { 32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038 }, + { 14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697 }, + }, + { + { 20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875 }, + { -25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905 }, + { -25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656 }, + }, + { + { 11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818 }, + { 27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714 }, + { 10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203 }, + }, + { + { 20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931 }, + { -30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024 }, + { -23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084 }, + }, + { + { -1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204 }, + { 20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817 }, + { 27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667 }, + }, + }, + { + { + { 11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504 }, + { -12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768 }, + { -19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255 }, + }, + { + { 6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790 }, + { 1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438 }, + { -22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333 }, + }, + { + { 17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971 }, + { 31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905 }, + { 29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409 }, + }, + { + { 12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409 }, + { 6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499 }, + { -8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363 }, + }, + { + { 28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664 }, + { -11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324 }, + { -21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940 }, + }, + { + { 13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990 }, + { -17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914 }, + { -25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290 }, + }, + { + { 24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257 }, + { -6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433 }, + { -16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236 }, + }, + { + { -12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045 }, + { 11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093 }, + { -1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347 }, + }, + }, + { + { + { -28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191 }, + { -15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507 }, + { -12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906 }, + }, + { + { 3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018 }, + { -16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109 }, + { -23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926 }, + }, + { + { -24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528 }, + { 8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625 }, + { -32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286 }, + }, + { + { 2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033 }, + { 27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866 }, + { 21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896 }, + }, + { + { 30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075 }, + { 26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347 }, + { -22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437 }, + }, + { + { -5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165 }, + { -18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588 }, + { -32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193 }, + }, + { + { -19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017 }, + { -28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883 }, + { 21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961 }, + }, + { + { 8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043 }, + { 29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663 }, + { -20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362 }, + }, + }, + { + { + { -33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860 }, + { 2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466 }, + { -24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063 }, + }, + { + { -26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997 }, + { -1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295 }, + { -13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369 }, + }, + { + { 9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385 }, + { 18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109 }, + { 2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906 }, + }, + { + { 4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424 }, + { -19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185 }, + { 7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962 }, + }, + { + { -7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325 }, + { 10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593 }, + { 696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404 }, + }, + { + { -11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644 }, + { 17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801 }, + { 26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804 }, + }, + { + { -31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884 }, + { -586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577 }, + { -9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849 }, + }, + { + { 32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473 }, + { -8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644 }, + { -2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319 }, + }, + }, + { + { + { -11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599 }, + { -9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768 }, + { -27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084 }, + }, + { + { -27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328 }, + { -15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369 }, + { 20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920 }, + }, + { + { 12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815 }, + { -32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025 }, + { -21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397 }, + }, + { + { -20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448 }, + { 6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981 }, + { 30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165 }, + }, + { + { 32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501 }, + { 17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073 }, + { -1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861 }, + }, + { + { 14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845 }, + { -1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211 }, + { 18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870 }, + }, + { + { 10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096 }, + { 33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803 }, + { -32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168 }, + }, + { + { 30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965 }, + { -14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505 }, + { 18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598 }, + }, + }, + { + { + { 5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782 }, + { 5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900 }, + { -31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479 }, + }, + { + { -12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208 }, + { 8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232 }, + { 17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719 }, + }, + { + { 16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271 }, + { -4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326 }, + { -8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132 }, + }, + { + { 14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300 }, + { 8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570 }, + { 15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670 }, + }, + { + { -2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994 }, + { -12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913 }, + { 31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317 }, + }, + { + { -25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730 }, + { 842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096 }, + { -4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078 }, + }, + { + { -15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411 }, + { -19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905 }, + { -9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654 }, + }, + { + { -28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870 }, + { -23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498 }, + { 12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579 }, + }, + }, + { + { + { 14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677 }, + { 10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647 }, + { -2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743 }, + }, + { + { -25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468 }, + { 21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375 }, + { -25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155 }, + }, + { + { 6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725 }, + { -12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612 }, + { -10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943 }, + }, + { + { -30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944 }, + { 30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928 }, + { 9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406 }, + }, + { + { 22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139 }, + { -8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963 }, + { -31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693 }, + }, + { + { 1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734 }, + { -448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680 }, + { -24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410 }, + }, + { + { -9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931 }, + { -16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654 }, + { 22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710 }, + }, + { + { 29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180 }, + { -26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684 }, + { -10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895 }, + }, + }, + { + { + { 22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501 }, + { -11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413 }, + { 6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880 }, + }, + { + { -8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874 }, + { 22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962 }, + { -7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899 }, + }, + { + { 21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152 }, + { 9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063 }, + { 7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080 }, + }, + { + { -9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146 }, + { -17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183 }, + { -19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133 }, + }, + { + { -32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421 }, + { -3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622 }, + { -4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197 }, + }, + { + { 2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663 }, + { 31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753 }, + { 4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755 }, + }, + { + { -9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862 }, + { -26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118 }, + { 26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171 }, + }, + { + { 15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380 }, + { 16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824 }, + { 28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270 }, + }, + }, + { + { + { -817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438 }, + { -31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584 }, + { -594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562 }, + }, + { + { 30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471 }, + { 18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610 }, + { 19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269 }, + }, + { + { -30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650 }, + { 14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369 }, + { 19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461 }, + }, + { + { 30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462 }, + { -5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793 }, + { -2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218 }, + }, + { + { -24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226 }, + { 18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019 }, + { -15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037 }, + }, + { + { 31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171 }, + { -17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132 }, + { -28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841 }, + }, + { + { 21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181 }, + { -33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210 }, + { -1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040 }, + }, + { + { 3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935 }, + { 24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105 }, + { -28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814 }, + }, + }, + { + { + { 793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852 }, + { 5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581 }, + { -4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646 }, + }, + { + { 10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844 }, + { 10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025 }, + { 27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453 }, + }, + { + { -23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068 }, + { 4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192 }, + { -17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921 }, + }, + { + { -9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259 }, + { -12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426 }, + { -5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072 }, + }, + { + { -17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305 }, + { 13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832 }, + { 28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943 }, + }, + { + { -16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011 }, + { 24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447 }, + { 17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494 }, + }, + { + { -28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245 }, + { -20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859 }, + { 28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915 }, + }, + { + { 16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707 }, + { 10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848 }, + { -11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224 }, + }, + }, + { + { + { -25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391 }, + { 15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215 }, + { -23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101 }, + }, + { + { 23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713 }, + { 21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849 }, + { -7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930 }, + }, + { + { -29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940 }, + { -21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031 }, + { -17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404 }, + }, + { + { -25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243 }, + { -23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116 }, + { -24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525 }, + }, + { + { -23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509 }, + { -10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883 }, + { 15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865 }, + }, + { + { -3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660 }, + { 4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273 }, + { -28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138 }, + }, + { + { -25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560 }, + { -10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135 }, + { 2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941 }, + }, + { + { -4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739 }, + { 18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756 }, + { -30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819 }, + }, + }, + { + { + { -6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347 }, + { -27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028 }, + { 21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075 }, + }, + { + { 16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799 }, + { -2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609 }, + { -25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817 }, + }, + { + { -23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989 }, + { -30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523 }, + { 4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278 }, + }, + { + { 31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045 }, + { 19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377 }, + { 24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480 }, + }, + { + { 17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016 }, + { 510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426 }, + { 18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525 }, + }, + { + { 13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396 }, + { 9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080 }, + { 12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892 }, + }, + { + { 15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275 }, + { 11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074 }, + { 20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140 }, + }, + { + { -16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717 }, + { -1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101 }, + { 24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127 }, + }, + }, + { + { + { -12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632 }, + { -26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415 }, + { -31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160 }, + }, + { + { 31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876 }, + { 22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625 }, + { -15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478 }, + }, + { + { 27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164 }, + { 26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595 }, + { -7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248 }, + }, + { + { -16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858 }, + { 15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193 }, + { 8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184 }, + }, + { + { -18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942 }, + { -1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635 }, + { 21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948 }, + }, + { + { 11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935 }, + { -25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415 }, + { -15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416 }, + }, + { + { -7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018 }, + { 4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778 }, + { 366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659 }, + }, + { + { -24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385 }, + { 18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503 }, + { 476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329 }, + }, + }, + { + { + { 20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056 }, + { -13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838 }, + { 24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948 }, + }, + { + { -3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691 }, + { -15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118 }, + { -23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517 }, + }, + { + { -20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269 }, + { -6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904 }, + { -23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589 }, + }, + { + { -28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193 }, + { -7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910 }, + { -30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930 }, + }, + { + { -7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667 }, + { 25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481 }, + { -9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876 }, + }, + { + { 22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640 }, + { -8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278 }, + { -21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112 }, + }, + { + { 26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272 }, + { 17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012 }, + { -10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221 }, + }, + { + { 30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046 }, + { 13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345 }, + { -19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310 }, + }, + }, + { + { + { 19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937 }, + { 31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636 }, + { -9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008 }, + }, + { + { -2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429 }, + { -15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576 }, + { 31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066 }, + }, + { + { -9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490 }, + { -12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104 }, + { 33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053 }, + }, + { + { 31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275 }, + { -20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511 }, + { 22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095 }, + }, + { + { -28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439 }, + { 23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939 }, + { -23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424 }, + }, + { + { 2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310 }, + { 3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608 }, + { -32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079 }, + }, + { + { -23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101 }, + { 21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418 }, + { 18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576 }, + }, + { + { 30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356 }, + { 9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996 }, + { -26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099 }, + }, + }, + { + { + { -26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728 }, + { -13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658 }, + { -10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242 }, + }, + { + { -21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001 }, + { -4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766 }, + { 18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373 }, + }, + { + { 26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458 }, + { -17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628 }, + { -13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657 }, + }, + { + { -23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062 }, + { 25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616 }, + { 31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014 }, + }, + { + { 24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383 }, + { -25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814 }, + { -20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718 }, + }, + { + { 30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417 }, + { 2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222 }, + { 33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444 }, + }, + { + { -20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597 }, + { 23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970 }, + { 1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799 }, + }, + { + { -5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647 }, + { 13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511 }, + { -29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032 }, + }, + }, + { + { + { 9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834 }, + { -23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461 }, + { 29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062 }, + }, + { + { -25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516 }, + { -20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547 }, + { -24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240 }, + }, + { + { -17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038 }, + { -33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741 }, + { 16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103 }, + }, + { + { -19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747 }, + { -1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323 }, + { 31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016 }, + }, + { + { -14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373 }, + { 15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228 }, + { -2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141 }, + }, + { + { 16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399 }, + { 11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831 }, + { -185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376 }, + }, + { + { -32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313 }, + { -18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958 }, + { -6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577 }, + }, + { + { -22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743 }, + { 29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684 }, + { -20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476 }, + }, + }, +}; diff --git a/taicpp/third_party/ed25519/sc.c b/taicpp/third_party/ed25519/sc.c new file mode 100644 index 0000000..ca5bad2 --- /dev/null +++ b/taicpp/third_party/ed25519/sc.c @@ -0,0 +1,809 @@ +#include "fixedint.h" +#include "sc.h" + +static uint64_t load_3(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + + return result; +} + +static uint64_t load_4(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + + return result; +} + +/* +Input: + s[0]+256*s[1]+...+256^63*s[63] = s + +Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. +*/ + +void sc_reduce(unsigned char *s) { + int64_t s0 = 2097151 & load_3(s); + int64_t s1 = 2097151 & (load_4(s + 2) >> 5); + int64_t s2 = 2097151 & (load_3(s + 5) >> 2); + int64_t s3 = 2097151 & (load_4(s + 7) >> 7); + int64_t s4 = 2097151 & (load_4(s + 10) >> 4); + int64_t s5 = 2097151 & (load_3(s + 13) >> 1); + int64_t s6 = 2097151 & (load_4(s + 15) >> 6); + int64_t s7 = 2097151 & (load_3(s + 18) >> 3); + int64_t s8 = 2097151 & load_3(s + 21); + int64_t s9 = 2097151 & (load_4(s + 23) >> 5); + int64_t s10 = 2097151 & (load_3(s + 26) >> 2); + int64_t s11 = 2097151 & (load_4(s + 28) >> 7); + int64_t s12 = 2097151 & (load_4(s + 31) >> 4); + int64_t s13 = 2097151 & (load_3(s + 34) >> 1); + int64_t s14 = 2097151 & (load_4(s + 36) >> 6); + int64_t s15 = 2097151 & (load_3(s + 39) >> 3); + int64_t s16 = 2097151 & load_3(s + 42); + int64_t s17 = 2097151 & (load_4(s + 44) >> 5); + int64_t s18 = 2097151 & (load_3(s + 47) >> 2); + int64_t s19 = 2097151 & (load_4(s + 49) >> 7); + int64_t s20 = 2097151 & (load_4(s + 52) >> 4); + int64_t s21 = 2097151 & (load_3(s + 55) >> 1); + int64_t s22 = 2097151 & (load_4(s + 57) >> 6); + int64_t s23 = (load_4(s + 60) >> 3); + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + s[0] = (unsigned char) (s0 >> 0); + s[1] = (unsigned char) (s0 >> 8); + s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); + s[3] = (unsigned char) (s1 >> 3); + s[4] = (unsigned char) (s1 >> 11); + s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); + s[6] = (unsigned char) (s2 >> 6); + s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); + s[8] = (unsigned char) (s3 >> 1); + s[9] = (unsigned char) (s3 >> 9); + s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); + s[11] = (unsigned char) (s4 >> 4); + s[12] = (unsigned char) (s4 >> 12); + s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); + s[14] = (unsigned char) (s5 >> 7); + s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); + s[16] = (unsigned char) (s6 >> 2); + s[17] = (unsigned char) (s6 >> 10); + s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); + s[19] = (unsigned char) (s7 >> 5); + s[20] = (unsigned char) (s7 >> 13); + s[21] = (unsigned char) (s8 >> 0); + s[22] = (unsigned char) (s8 >> 8); + s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); + s[24] = (unsigned char) (s9 >> 3); + s[25] = (unsigned char) (s9 >> 11); + s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); + s[27] = (unsigned char) (s10 >> 6); + s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); + s[29] = (unsigned char) (s11 >> 1); + s[30] = (unsigned char) (s11 >> 9); + s[31] = (unsigned char) (s11 >> 17); +} + + + +/* +Input: + a[0]+256*a[1]+...+256^31*a[31] = a + b[0]+256*b[1]+...+256^31*b[31] = b + c[0]+256*c[1]+...+256^31*c[31] = c + +Output: + s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l + where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) { + int64_t a0 = 2097151 & load_3(a); + int64_t a1 = 2097151 & (load_4(a + 2) >> 5); + int64_t a2 = 2097151 & (load_3(a + 5) >> 2); + int64_t a3 = 2097151 & (load_4(a + 7) >> 7); + int64_t a4 = 2097151 & (load_4(a + 10) >> 4); + int64_t a5 = 2097151 & (load_3(a + 13) >> 1); + int64_t a6 = 2097151 & (load_4(a + 15) >> 6); + int64_t a7 = 2097151 & (load_3(a + 18) >> 3); + int64_t a8 = 2097151 & load_3(a + 21); + int64_t a9 = 2097151 & (load_4(a + 23) >> 5); + int64_t a10 = 2097151 & (load_3(a + 26) >> 2); + int64_t a11 = (load_4(a + 28) >> 7); + int64_t b0 = 2097151 & load_3(b); + int64_t b1 = 2097151 & (load_4(b + 2) >> 5); + int64_t b2 = 2097151 & (load_3(b + 5) >> 2); + int64_t b3 = 2097151 & (load_4(b + 7) >> 7); + int64_t b4 = 2097151 & (load_4(b + 10) >> 4); + int64_t b5 = 2097151 & (load_3(b + 13) >> 1); + int64_t b6 = 2097151 & (load_4(b + 15) >> 6); + int64_t b7 = 2097151 & (load_3(b + 18) >> 3); + int64_t b8 = 2097151 & load_3(b + 21); + int64_t b9 = 2097151 & (load_4(b + 23) >> 5); + int64_t b10 = 2097151 & (load_3(b + 26) >> 2); + int64_t b11 = (load_4(b + 28) >> 7); + int64_t c0 = 2097151 & load_3(c); + int64_t c1 = 2097151 & (load_4(c + 2) >> 5); + int64_t c2 = 2097151 & (load_3(c + 5) >> 2); + int64_t c3 = 2097151 & (load_4(c + 7) >> 7); + int64_t c4 = 2097151 & (load_4(c + 10) >> 4); + int64_t c5 = 2097151 & (load_3(c + 13) >> 1); + int64_t c6 = 2097151 & (load_4(c + 15) >> 6); + int64_t c7 = 2097151 & (load_3(c + 18) >> 3); + int64_t c8 = 2097151 & load_3(c + 21); + int64_t c9 = 2097151 & (load_4(c + 23) >> 5); + int64_t c10 = 2097151 & (load_3(c + 26) >> 2); + int64_t c11 = (load_4(c + 28) >> 7); + int64_t s0; + int64_t s1; + int64_t s2; + int64_t s3; + int64_t s4; + int64_t s5; + int64_t s6; + int64_t s7; + int64_t s8; + int64_t s9; + int64_t s10; + int64_t s11; + int64_t s12; + int64_t s13; + int64_t s14; + int64_t s15; + int64_t s16; + int64_t s17; + int64_t s18; + int64_t s19; + int64_t s20; + int64_t s21; + int64_t s22; + int64_t s23; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + int64_t carry17; + int64_t carry18; + int64_t carry19; + int64_t carry20; + int64_t carry21; + int64_t carry22; + + s0 = c0 + a0 * b0; + s1 = c1 + a0 * b1 + a1 * b0; + s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; + s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; + s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; + s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; + s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; + s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; + s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; + s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; + s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; + s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; + s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; + s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; + s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; + s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; + s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; + s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; + s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; + s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; + s20 = a9 * b11 + a10 * b10 + a11 * b9; + s21 = a10 * b11 + a11 * b10; + s22 = a11 * b11; + s23 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry18 = (s18 + (1 << 20)) >> 21; + s19 += carry18; + s18 -= carry18 << 21; + carry20 = (s20 + (1 << 20)) >> 21; + s21 += carry20; + s20 -= carry20 << 21; + carry22 = (s22 + (1 << 20)) >> 21; + s23 += carry22; + s22 -= carry22 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + carry17 = (s17 + (1 << 20)) >> 21; + s18 += carry17; + s17 -= carry17 << 21; + carry19 = (s19 + (1 << 20)) >> 21; + s20 += carry19; + s19 -= carry19 << 21; + carry21 = (s21 + (1 << 20)) >> 21; + s22 += carry21; + s21 -= carry21 << 21; + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + s[0] = (unsigned char) (s0 >> 0); + s[1] = (unsigned char) (s0 >> 8); + s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); + s[3] = (unsigned char) (s1 >> 3); + s[4] = (unsigned char) (s1 >> 11); + s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); + s[6] = (unsigned char) (s2 >> 6); + s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); + s[8] = (unsigned char) (s3 >> 1); + s[9] = (unsigned char) (s3 >> 9); + s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); + s[11] = (unsigned char) (s4 >> 4); + s[12] = (unsigned char) (s4 >> 12); + s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); + s[14] = (unsigned char) (s5 >> 7); + s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); + s[16] = (unsigned char) (s6 >> 2); + s[17] = (unsigned char) (s6 >> 10); + s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); + s[19] = (unsigned char) (s7 >> 5); + s[20] = (unsigned char) (s7 >> 13); + s[21] = (unsigned char) (s8 >> 0); + s[22] = (unsigned char) (s8 >> 8); + s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); + s[24] = (unsigned char) (s9 >> 3); + s[25] = (unsigned char) (s9 >> 11); + s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); + s[27] = (unsigned char) (s10 >> 6); + s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); + s[29] = (unsigned char) (s11 >> 1); + s[30] = (unsigned char) (s11 >> 9); + s[31] = (unsigned char) (s11 >> 17); +} diff --git a/taicpp/third_party/ed25519/sc.h b/taicpp/third_party/ed25519/sc.h new file mode 100644 index 0000000..e29e7fa --- /dev/null +++ b/taicpp/third_party/ed25519/sc.h @@ -0,0 +1,12 @@ +#ifndef SC_H +#define SC_H + +/* +The set of scalars is \Z/l +where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_reduce(unsigned char *s); +void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c); + +#endif diff --git a/taicpp/third_party/qrcodegen/qrcodegen.cpp b/taicpp/third_party/qrcodegen/qrcodegen.cpp new file mode 100644 index 0000000..9aa91b4 --- /dev/null +++ b/taicpp/third_party/qrcodegen/qrcodegen.cpp @@ -0,0 +1,829 @@ +/* + * QR Code generator library (C++) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "qrcodegen.hpp" + +using std::int8_t; +using std::uint8_t; +using std::size_t; +using std::vector; + + +namespace qrcodegen { + +/*---- Class QrSegment ----*/ + +QrSegment::Mode::Mode(int mode, int cc0, int cc1, int cc2) : + modeBits(mode) { + numBitsCharCount[0] = cc0; + numBitsCharCount[1] = cc1; + numBitsCharCount[2] = cc2; +} + + +int QrSegment::Mode::getModeBits() const { + return modeBits; +} + + +int QrSegment::Mode::numCharCountBits(int ver) const { + return numBitsCharCount[(ver + 7) / 17]; +} + + +const QrSegment::Mode QrSegment::Mode::NUMERIC (0x1, 10, 12, 14); +const QrSegment::Mode QrSegment::Mode::ALPHANUMERIC(0x2, 9, 11, 13); +const QrSegment::Mode QrSegment::Mode::BYTE (0x4, 8, 16, 16); +const QrSegment::Mode QrSegment::Mode::KANJI (0x8, 8, 10, 12); +const QrSegment::Mode QrSegment::Mode::ECI (0x7, 0, 0, 0); + + +QrSegment QrSegment::makeBytes(const vector &data) { + if (data.size() > static_cast(INT_MAX)) + throw std::length_error("Data too long"); + BitBuffer bb; + for (uint8_t b : data) + bb.appendBits(b, 8); + return QrSegment(Mode::BYTE, static_cast(data.size()), std::move(bb)); +} + + +QrSegment QrSegment::makeNumeric(const char *digits) { + BitBuffer bb; + int accumData = 0; + int accumCount = 0; + int charCount = 0; + for (; *digits != '\0'; digits++, charCount++) { + char c = *digits; + if (c < '0' || c > '9') + throw std::domain_error("String contains non-numeric characters"); + accumData = accumData * 10 + (c - '0'); + accumCount++; + if (accumCount == 3) { + bb.appendBits(static_cast(accumData), 10); + accumData = 0; + accumCount = 0; + } + } + if (accumCount > 0) // 1 or 2 digits remaining + bb.appendBits(static_cast(accumData), accumCount * 3 + 1); + return QrSegment(Mode::NUMERIC, charCount, std::move(bb)); +} + + +QrSegment QrSegment::makeAlphanumeric(const char *text) { + BitBuffer bb; + int accumData = 0; + int accumCount = 0; + int charCount = 0; + for (; *text != '\0'; text++, charCount++) { + const char *temp = std::strchr(ALPHANUMERIC_CHARSET, *text); + if (temp == nullptr) + throw std::domain_error("String contains unencodable characters in alphanumeric mode"); + accumData = accumData * 45 + static_cast(temp - ALPHANUMERIC_CHARSET); + accumCount++; + if (accumCount == 2) { + bb.appendBits(static_cast(accumData), 11); + accumData = 0; + accumCount = 0; + } + } + if (accumCount > 0) // 1 character remaining + bb.appendBits(static_cast(accumData), 6); + return QrSegment(Mode::ALPHANUMERIC, charCount, std::move(bb)); +} + + +vector QrSegment::makeSegments(const char *text) { + // Select the most efficient segment encoding automatically + vector result; + if (*text == '\0'); // Leave result empty + else if (isNumeric(text)) + result.push_back(makeNumeric(text)); + else if (isAlphanumeric(text)) + result.push_back(makeAlphanumeric(text)); + else { + vector bytes; + for (; *text != '\0'; text++) + bytes.push_back(static_cast(*text)); + result.push_back(makeBytes(bytes)); + } + return result; +} + + +QrSegment QrSegment::makeEci(long assignVal) { + BitBuffer bb; + if (assignVal < 0) + throw std::domain_error("ECI assignment value out of range"); + else if (assignVal < (1 << 7)) + bb.appendBits(static_cast(assignVal), 8); + else if (assignVal < (1 << 14)) { + bb.appendBits(2, 2); + bb.appendBits(static_cast(assignVal), 14); + } else if (assignVal < 1000000L) { + bb.appendBits(6, 3); + bb.appendBits(static_cast(assignVal), 21); + } else + throw std::domain_error("ECI assignment value out of range"); + return QrSegment(Mode::ECI, 0, std::move(bb)); +} + + +QrSegment::QrSegment(const Mode &md, int numCh, const std::vector &dt) : + mode(&md), + numChars(numCh), + data(dt) { + if (numCh < 0) + throw std::domain_error("Invalid value"); +} + + +QrSegment::QrSegment(const Mode &md, int numCh, std::vector &&dt) : + mode(&md), + numChars(numCh), + data(std::move(dt)) { + if (numCh < 0) + throw std::domain_error("Invalid value"); +} + + +int QrSegment::getTotalBits(const vector &segs, int version) { + int result = 0; + for (const QrSegment &seg : segs) { + int ccbits = seg.mode->numCharCountBits(version); + if (seg.numChars >= (1L << ccbits)) + return -1; // The segment's length doesn't fit the field's bit width + if (4 + ccbits > INT_MAX - result) + return -1; // The sum will overflow an int type + result += 4 + ccbits; + if (seg.data.size() > static_cast(INT_MAX - result)) + return -1; // The sum will overflow an int type + result += static_cast(seg.data.size()); + } + return result; +} + + +bool QrSegment::isNumeric(const char *text) { + for (; *text != '\0'; text++) { + char c = *text; + if (c < '0' || c > '9') + return false; + } + return true; +} + + +bool QrSegment::isAlphanumeric(const char *text) { + for (; *text != '\0'; text++) { + if (std::strchr(ALPHANUMERIC_CHARSET, *text) == nullptr) + return false; + } + return true; +} + + +const QrSegment::Mode &QrSegment::getMode() const { + return *mode; +} + + +int QrSegment::getNumChars() const { + return numChars; +} + + +const std::vector &QrSegment::getData() const { + return data; +} + + +const char *QrSegment::ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; + + + +/*---- Class QrCode ----*/ + +int QrCode::getFormatBits(Ecc ecl) { + switch (ecl) { + case Ecc::LOW : return 1; + case Ecc::MEDIUM : return 0; + case Ecc::QUARTILE: return 3; + case Ecc::HIGH : return 2; + default: throw std::logic_error("Unreachable"); + } +} + + +QrCode QrCode::encodeText(const char *text, Ecc ecl) { + vector segs = QrSegment::makeSegments(text); + return encodeSegments(segs, ecl); +} + + +QrCode QrCode::encodeBinary(const vector &data, Ecc ecl) { + vector segs{QrSegment::makeBytes(data)}; + return encodeSegments(segs, ecl); +} + + +QrCode QrCode::encodeSegments(const vector &segs, Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl) { + if (!(MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= MAX_VERSION) || mask < -1 || mask > 7) + throw std::invalid_argument("Invalid value"); + + // Find the minimal version number to use + int version, dataUsedBits; + for (version = minVersion; ; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + dataUsedBits = QrSegment::getTotalBits(segs, version); + if (dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + break; // This version number is found to be suitable + if (version >= maxVersion) { // All versions in the range could not fit the given data + std::ostringstream sb; + if (dataUsedBits == -1) + sb << "Segment too long"; + else { + sb << "Data length = " << dataUsedBits << " bits, "; + sb << "Max capacity = " << dataCapacityBits << " bits"; + } + throw data_too_long(sb.str()); + } + } + assert(dataUsedBits != -1); + + // Increase the error correction level while the data still fits in the current version number + for (Ecc newEcl : {Ecc::MEDIUM, Ecc::QUARTILE, Ecc::HIGH}) { // From low to high + if (boostEcl && dataUsedBits <= getNumDataCodewords(version, newEcl) * 8) + ecl = newEcl; + } + + // Concatenate all segments to create the data bit string + BitBuffer bb; + for (const QrSegment &seg : segs) { + bb.appendBits(static_cast(seg.getMode().getModeBits()), 4); + bb.appendBits(static_cast(seg.getNumChars()), seg.getMode().numCharCountBits(version)); + bb.insert(bb.end(), seg.getData().begin(), seg.getData().end()); + } + assert(bb.size() == static_cast(dataUsedBits)); + + // Add terminator and pad up to a byte if applicable + size_t dataCapacityBits = static_cast(getNumDataCodewords(version, ecl)) * 8; + assert(bb.size() <= dataCapacityBits); + bb.appendBits(0, std::min(4, static_cast(dataCapacityBits - bb.size()))); + bb.appendBits(0, (8 - static_cast(bb.size() % 8)) % 8); + assert(bb.size() % 8 == 0); + + // Pad with alternating bytes until data capacity is reached + for (uint8_t padByte = 0xEC; bb.size() < dataCapacityBits; padByte ^= 0xEC ^ 0x11) + bb.appendBits(padByte, 8); + + // Pack bits into bytes in big endian + vector dataCodewords(bb.size() / 8); + for (size_t i = 0; i < bb.size(); i++) + dataCodewords.at(i >> 3) |= (bb.at(i) ? 1 : 0) << (7 - (i & 7)); + + // Create the QR Code object + return QrCode(version, ecl, dataCodewords, mask); +} + + +QrCode::QrCode(int ver, Ecc ecl, const vector &dataCodewords, int msk) : + // Initialize fields and check arguments + version(ver), + errorCorrectionLevel(ecl) { + if (ver < MIN_VERSION || ver > MAX_VERSION) + throw std::domain_error("Version value out of range"); + if (msk < -1 || msk > 7) + throw std::domain_error("Mask value out of range"); + size = ver * 4 + 17; + size_t sz = static_cast(size); + modules = vector >(sz, vector(sz)); // Initially all light + isFunction = vector >(sz, vector(sz)); + + // Compute ECC, draw modules + drawFunctionPatterns(); + const vector allCodewords = addEccAndInterleave(dataCodewords); + drawCodewords(allCodewords); + + // Do masking + if (msk == -1) { // Automatically choose best mask + long minPenalty = LONG_MAX; + for (int i = 0; i < 8; i++) { + applyMask(i); + drawFormatBits(i); + long penalty = getPenaltyScore(); + if (penalty < minPenalty) { + msk = i; + minPenalty = penalty; + } + applyMask(i); // Undoes the mask due to XOR + } + } + assert(0 <= msk && msk <= 7); + mask = msk; + applyMask(msk); // Apply the final choice of mask + drawFormatBits(msk); // Overwrite old format bits + + isFunction.clear(); + isFunction.shrink_to_fit(); +} + + +int QrCode::getVersion() const { + return version; +} + + +int QrCode::getSize() const { + return size; +} + + +QrCode::Ecc QrCode::getErrorCorrectionLevel() const { + return errorCorrectionLevel; +} + + +int QrCode::getMask() const { + return mask; +} + + +bool QrCode::getModule(int x, int y) const { + return 0 <= x && x < size && 0 <= y && y < size && module(x, y); +} + + +void QrCode::drawFunctionPatterns() { + // Draw horizontal and vertical timing patterns + for (int i = 0; i < size; i++) { + setFunctionModule(6, i, i % 2 == 0); + setFunctionModule(i, 6, i % 2 == 0); + } + + // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) + drawFinderPattern(3, 3); + drawFinderPattern(size - 4, 3); + drawFinderPattern(3, size - 4); + + // Draw numerous alignment patterns + const vector alignPatPos = getAlignmentPatternPositions(); + size_t numAlign = alignPatPos.size(); + for (size_t i = 0; i < numAlign; i++) { + for (size_t j = 0; j < numAlign; j++) { + // Don't draw on the three finder corners + if (!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))) + drawAlignmentPattern(alignPatPos.at(i), alignPatPos.at(j)); + } + } + + // Draw configuration data + drawFormatBits(0); // Dummy mask value; overwritten later in the constructor + drawVersion(); +} + + +void QrCode::drawFormatBits(int msk) { + // Calculate error correction code and pack bits + int data = getFormatBits(errorCorrectionLevel) << 3 | msk; // errCorrLvl is uint2, msk is uint3 + int rem = data; + for (int i = 0; i < 10; i++) + rem = (rem << 1) ^ ((rem >> 9) * 0x537); + int bits = (data << 10 | rem) ^ 0x5412; // uint15 + assert(bits >> 15 == 0); + + // Draw first copy + for (int i = 0; i <= 5; i++) + setFunctionModule(8, i, getBit(bits, i)); + setFunctionModule(8, 7, getBit(bits, 6)); + setFunctionModule(8, 8, getBit(bits, 7)); + setFunctionModule(7, 8, getBit(bits, 8)); + for (int i = 9; i < 15; i++) + setFunctionModule(14 - i, 8, getBit(bits, i)); + + // Draw second copy + for (int i = 0; i < 8; i++) + setFunctionModule(size - 1 - i, 8, getBit(bits, i)); + for (int i = 8; i < 15; i++) + setFunctionModule(8, size - 15 + i, getBit(bits, i)); + setFunctionModule(8, size - 8, true); // Always dark +} + + +void QrCode::drawVersion() { + if (version < 7) + return; + + // Calculate error correction code and pack bits + int rem = version; // version is uint6, in the range [7, 40] + for (int i = 0; i < 12; i++) + rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); + long bits = static_cast(version) << 12 | rem; // uint18 + assert(bits >> 18 == 0); + + // Draw two copies + for (int i = 0; i < 18; i++) { + bool bit = getBit(bits, i); + int a = size - 11 + i % 3; + int b = i / 3; + setFunctionModule(a, b, bit); + setFunctionModule(b, a, bit); + } +} + + +void QrCode::drawFinderPattern(int x, int y) { + for (int dy = -4; dy <= 4; dy++) { + for (int dx = -4; dx <= 4; dx++) { + int dist = std::max(std::abs(dx), std::abs(dy)); // Chebyshev/infinity norm + int xx = x + dx, yy = y + dy; + if (0 <= xx && xx < size && 0 <= yy && yy < size) + setFunctionModule(xx, yy, dist != 2 && dist != 4); + } + } +} + + +void QrCode::drawAlignmentPattern(int x, int y) { + for (int dy = -2; dy <= 2; dy++) { + for (int dx = -2; dx <= 2; dx++) + setFunctionModule(x + dx, y + dy, std::max(std::abs(dx), std::abs(dy)) != 1); + } +} + + +void QrCode::setFunctionModule(int x, int y, bool isDark) { + size_t ux = static_cast(x); + size_t uy = static_cast(y); + modules .at(uy).at(ux) = isDark; + isFunction.at(uy).at(ux) = true; +} + + +bool QrCode::module(int x, int y) const { + return modules.at(static_cast(y)).at(static_cast(x)); +} + + +vector QrCode::addEccAndInterleave(const vector &data) const { + if (data.size() != static_cast(getNumDataCodewords(version, errorCorrectionLevel))) + throw std::invalid_argument("Invalid argument"); + + // Calculate parameter numbers + int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[static_cast(errorCorrectionLevel)][version]; + int blockEccLen = ECC_CODEWORDS_PER_BLOCK [static_cast(errorCorrectionLevel)][version]; + int rawCodewords = getNumRawDataModules(version) / 8; + int numShortBlocks = numBlocks - rawCodewords % numBlocks; + int shortBlockLen = rawCodewords / numBlocks; + + // Split data into blocks and append ECC to each block + vector > blocks; + const vector rsDiv = reedSolomonComputeDivisor(blockEccLen); + for (int i = 0, k = 0; i < numBlocks; i++) { + vector dat(data.cbegin() + k, data.cbegin() + (k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1))); + k += static_cast(dat.size()); + const vector ecc = reedSolomonComputeRemainder(dat, rsDiv); + if (i < numShortBlocks) + dat.push_back(0); + dat.insert(dat.end(), ecc.cbegin(), ecc.cend()); + blocks.push_back(std::move(dat)); + } + + // Interleave (not concatenate) the bytes from every block into a single sequence + vector result; + for (size_t i = 0; i < blocks.at(0).size(); i++) { + for (size_t j = 0; j < blocks.size(); j++) { + // Skip the padding byte in short blocks + if (i != static_cast(shortBlockLen - blockEccLen) || j >= static_cast(numShortBlocks)) + result.push_back(blocks.at(j).at(i)); + } + } + assert(result.size() == static_cast(rawCodewords)); + return result; +} + + +void QrCode::drawCodewords(const vector &data) { + if (data.size() != static_cast(getNumRawDataModules(version) / 8)) + throw std::invalid_argument("Invalid argument"); + + size_t i = 0; // Bit index into the data + // Do the funny zigzag scan + for (int right = size - 1; right >= 1; right -= 2) { // Index of right column in each column pair + if (right == 6) + right = 5; + for (int vert = 0; vert < size; vert++) { // Vertical counter + for (int j = 0; j < 2; j++) { + size_t x = static_cast(right - j); // Actual x coordinate + bool upward = ((right + 1) & 2) == 0; + size_t y = static_cast(upward ? size - 1 - vert : vert); // Actual y coordinate + if (!isFunction.at(y).at(x) && i < data.size() * 8) { + modules.at(y).at(x) = getBit(data.at(i >> 3), 7 - static_cast(i & 7)); + i++; + } + // If this QR Code has any remainder bits (0 to 7), they were assigned as + // 0/false/light by the constructor and are left unchanged by this method + } + } + } + assert(i == data.size() * 8); +} + + +void QrCode::applyMask(int msk) { + if (msk < 0 || msk > 7) + throw std::domain_error("Mask value out of range"); + size_t sz = static_cast(size); + for (size_t y = 0; y < sz; y++) { + for (size_t x = 0; x < sz; x++) { + bool invert; + switch (msk) { + case 0: invert = (x + y) % 2 == 0; break; + case 1: invert = y % 2 == 0; break; + case 2: invert = x % 3 == 0; break; + case 3: invert = (x + y) % 3 == 0; break; + case 4: invert = (x / 3 + y / 2) % 2 == 0; break; + case 5: invert = x * y % 2 + x * y % 3 == 0; break; + case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0; break; + case 7: invert = ((x + y) % 2 + x * y % 3) % 2 == 0; break; + default: throw std::logic_error("Unreachable"); + } + modules.at(y).at(x) = modules.at(y).at(x) ^ (invert & !isFunction.at(y).at(x)); + } + } +} + + +long QrCode::getPenaltyScore() const { + long result = 0; + + // Adjacent modules in row having same color, and finder-like patterns + for (int y = 0; y < size; y++) { + bool runColor = false; + int runX = 0; + std::array runHistory = {}; + for (int x = 0; x < size; x++) { + if (module(x, y) == runColor) { + runX++; + if (runX == 5) + result += PENALTY_N1; + else if (runX > 5) + result++; + } else { + finderPenaltyAddHistory(runX, runHistory); + if (!runColor) + result += finderPenaltyCountPatterns(runHistory) * PENALTY_N3; + runColor = module(x, y); + runX = 1; + } + } + result += finderPenaltyTerminateAndCount(runColor, runX, runHistory) * PENALTY_N3; + } + // Adjacent modules in column having same color, and finder-like patterns + for (int x = 0; x < size; x++) { + bool runColor = false; + int runY = 0; + std::array runHistory = {}; + for (int y = 0; y < size; y++) { + if (module(x, y) == runColor) { + runY++; + if (runY == 5) + result += PENALTY_N1; + else if (runY > 5) + result++; + } else { + finderPenaltyAddHistory(runY, runHistory); + if (!runColor) + result += finderPenaltyCountPatterns(runHistory) * PENALTY_N3; + runColor = module(x, y); + runY = 1; + } + } + result += finderPenaltyTerminateAndCount(runColor, runY, runHistory) * PENALTY_N3; + } + + // 2*2 blocks of modules having same color + for (int y = 0; y < size - 1; y++) { + for (int x = 0; x < size - 1; x++) { + bool color = module(x, y); + if ( color == module(x + 1, y) && + color == module(x, y + 1) && + color == module(x + 1, y + 1)) + result += PENALTY_N2; + } + } + + // Balance of dark and light modules + int dark = 0; + for (const vector &row : modules) { + for (bool color : row) { + if (color) + dark++; + } + } + int total = size * size; // Note that size is odd, so dark/total != 1/2 + // Compute the smallest integer k >= 0 such that (45-5k)% <= dark/total <= (55+5k)% + int k = static_cast((std::abs(dark * 20L - total * 10L) + total - 1) / total) - 1; + assert(0 <= k && k <= 9); + result += k * PENALTY_N4; + assert(0 <= result && result <= 2568888L); // Non-tight upper bound based on default values of PENALTY_N1, ..., N4 + return result; +} + + +vector QrCode::getAlignmentPatternPositions() const { + if (version == 1) + return vector(); + else { + int numAlign = version / 7 + 2; + int step = (version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4) * 2; + vector result; + for (int i = 0, pos = size - 7; i < numAlign - 1; i++, pos -= step) + result.insert(result.begin(), pos); + result.insert(result.begin(), 6); + return result; + } +} + + +int QrCode::getNumRawDataModules(int ver) { + if (ver < MIN_VERSION || ver > MAX_VERSION) + throw std::domain_error("Version number out of range"); + int result = (16 * ver + 128) * ver + 64; + if (ver >= 2) { + int numAlign = ver / 7 + 2; + result -= (25 * numAlign - 10) * numAlign - 55; + if (ver >= 7) + result -= 36; + } + assert(208 <= result && result <= 29648); + return result; +} + + +int QrCode::getNumDataCodewords(int ver, Ecc ecl) { + return getNumRawDataModules(ver) / 8 + - ECC_CODEWORDS_PER_BLOCK [static_cast(ecl)][ver] + * NUM_ERROR_CORRECTION_BLOCKS[static_cast(ecl)][ver]; +} + + +vector QrCode::reedSolomonComputeDivisor(int degree) { + if (degree < 1 || degree > 255) + throw std::domain_error("Degree out of range"); + // Polynomial coefficients are stored from highest to lowest power, excluding the leading term which is always 1. + // For example the polynomial x^3 + 255x^2 + 8x + 93 is stored as the uint8 array {255, 8, 93}. + vector result(static_cast(degree)); + result.at(result.size() - 1) = 1; // Start off with the monomial x^0 + + // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), + // and drop the highest monomial term which is always 1x^degree. + // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). + uint8_t root = 1; + for (int i = 0; i < degree; i++) { + // Multiply the current product by (x - r^i) + for (size_t j = 0; j < result.size(); j++) { + result.at(j) = reedSolomonMultiply(result.at(j), root); + if (j + 1 < result.size()) + result.at(j) ^= result.at(j + 1); + } + root = reedSolomonMultiply(root, 0x02); + } + return result; +} + + +vector QrCode::reedSolomonComputeRemainder(const vector &data, const vector &divisor) { + vector result(divisor.size()); + for (uint8_t b : data) { // Polynomial division + uint8_t factor = b ^ result.at(0); + result.erase(result.begin()); + result.push_back(0); + for (size_t i = 0; i < result.size(); i++) + result.at(i) ^= reedSolomonMultiply(divisor.at(i), factor); + } + return result; +} + + +uint8_t QrCode::reedSolomonMultiply(uint8_t x, uint8_t y) { + // Russian peasant multiplication + int z = 0; + for (int i = 7; i >= 0; i--) { + z = (z << 1) ^ ((z >> 7) * 0x11D); + z ^= ((y >> i) & 1) * x; + } + assert(z >> 8 == 0); + return static_cast(z); +} + + +int QrCode::finderPenaltyCountPatterns(const std::array &runHistory) const { + int n = runHistory.at(1); + assert(n <= size * 3); + bool core = n > 0 && runHistory.at(2) == n && runHistory.at(3) == n * 3 && runHistory.at(4) == n && runHistory.at(5) == n; + return (core && runHistory.at(0) >= n * 4 && runHistory.at(6) >= n ? 1 : 0) + + (core && runHistory.at(6) >= n * 4 && runHistory.at(0) >= n ? 1 : 0); +} + + +int QrCode::finderPenaltyTerminateAndCount(bool currentRunColor, int currentRunLength, std::array &runHistory) const { + if (currentRunColor) { // Terminate dark run + finderPenaltyAddHistory(currentRunLength, runHistory); + currentRunLength = 0; + } + currentRunLength += size; // Add light border to final run + finderPenaltyAddHistory(currentRunLength, runHistory); + return finderPenaltyCountPatterns(runHistory); +} + + +void QrCode::finderPenaltyAddHistory(int currentRunLength, std::array &runHistory) const { + if (runHistory.at(0) == 0) + currentRunLength += size; // Add light border to initial run + std::copy_backward(runHistory.cbegin(), runHistory.cend() - 1, runHistory.end()); + runHistory.at(0) = currentRunLength; +} + + +bool QrCode::getBit(long x, int i) { + return ((x >> i) & 1) != 0; +} + + +/*---- Tables of constants ----*/ + +const int QrCode::PENALTY_N1 = 3; +const int QrCode::PENALTY_N2 = 3; +const int QrCode::PENALTY_N3 = 40; +const int QrCode::PENALTY_N4 = 10; + + +const int8_t QrCode::ECC_CODEWORDS_PER_BLOCK[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low + {-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium + {-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile + {-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High +}; + +const int8_t QrCode::NUM_ERROR_CORRECTION_BLOCKS[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low + {-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium + {-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile + {-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High +}; + + +data_too_long::data_too_long(const std::string &msg) : + std::length_error(msg) {} + + + +/*---- Class BitBuffer ----*/ + +BitBuffer::BitBuffer() + : std::vector() {} + + +void BitBuffer::appendBits(std::uint32_t val, int len) { + if (len < 0 || len > 31 || val >> len != 0) + throw std::domain_error("Value out of range"); + for (int i = len - 1; i >= 0; i--) // Append bit by bit + this->push_back(((val >> i) & 1) != 0); +} + +} diff --git a/taicpp/third_party/qrcodegen/qrcodegen.hpp b/taicpp/third_party/qrcodegen/qrcodegen.hpp new file mode 100644 index 0000000..9448982 --- /dev/null +++ b/taicpp/third_party/qrcodegen/qrcodegen.hpp @@ -0,0 +1,549 @@ +/* + * QR Code generator library (C++) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#pragma once + +#include +#include +#include +#include +#include + + +namespace qrcodegen { + +/* + * A segment of character/binary/control data in a QR Code symbol. + * Instances of this class are immutable. + * The mid-level way to create a segment is to take the payload data + * and call a static factory function such as QrSegment::makeNumeric(). + * The low-level way to create a segment is to custom-make the bit buffer + * and call the QrSegment() constructor with appropriate values. + * This segment class imposes no length restrictions, but QR Codes have restrictions. + * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. + * Any segment longer than this is meaningless for the purpose of generating QR Codes. + */ +class QrSegment final { + + /*---- Public helper enumeration ----*/ + + /* + * Describes how a segment's data bits are interpreted. Immutable. + */ + public: class Mode final { + + /*-- Constants --*/ + + public: static const Mode NUMERIC; + public: static const Mode ALPHANUMERIC; + public: static const Mode BYTE; + public: static const Mode KANJI; + public: static const Mode ECI; + + + /*-- Fields --*/ + + // The mode indicator bits, which is a uint4 value (range 0 to 15). + private: int modeBits; + + // Number of character count bits for three different version ranges. + private: int numBitsCharCount[3]; + + + /*-- Constructor --*/ + + private: Mode(int mode, int cc0, int cc1, int cc2); + + + /*-- Methods --*/ + + /* + * (Package-private) Returns the mode indicator bits, which is an unsigned 4-bit value (range 0 to 15). + */ + public: int getModeBits() const; + + /* + * (Package-private) Returns the bit width of the character count field for a segment in + * this mode in a QR Code at the given version number. The result is in the range [0, 16]. + */ + public: int numCharCountBits(int ver) const; + + }; + + + + /*---- Static factory functions (mid level) ----*/ + + /* + * Returns a segment representing the given binary data encoded in + * byte mode. All input byte vectors are acceptable. Any text string + * can be converted to UTF-8 bytes and encoded as a byte mode segment. + */ + public: static QrSegment makeBytes(const std::vector &data); + + + /* + * Returns a segment representing the given string of decimal digits encoded in numeric mode. + */ + public: static QrSegment makeNumeric(const char *digits); + + + /* + * Returns a segment representing the given text string encoded in alphanumeric mode. + * The characters allowed are: 0 to 9, A to Z (uppercase only), space, + * dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ + public: static QrSegment makeAlphanumeric(const char *text); + + + /* + * Returns a list of zero or more segments to represent the given text string. The result + * may use various segment modes and switch modes to optimize the length of the bit stream. + */ + public: static std::vector makeSegments(const char *text); + + + /* + * Returns a segment representing an Extended Channel Interpretation + * (ECI) designator with the given assignment value. + */ + public: static QrSegment makeEci(long assignVal); + + + /*---- Public static helper functions ----*/ + + /* + * Tests whether the given string can be encoded as a segment in numeric mode. + * A string is encodable iff each character is in the range 0 to 9. + */ + public: static bool isNumeric(const char *text); + + + /* + * Tests whether the given string can be encoded as a segment in alphanumeric mode. + * A string is encodable iff each character is in the following set: 0 to 9, A to Z + * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ + public: static bool isAlphanumeric(const char *text); + + + + /*---- Instance fields ----*/ + + /* The mode indicator of this segment. Accessed through getMode(). */ + private: const Mode *mode; + + /* The length of this segment's unencoded data. Measured in characters for + * numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. + * Always zero or positive. Not the same as the data's bit length. + * Accessed through getNumChars(). */ + private: int numChars; + + /* The data bits of this segment. Accessed through getData(). */ + private: std::vector data; + + + /*---- Constructors (low level) ----*/ + + /* + * Creates a new QR Code segment with the given attributes and data. + * The character count (numCh) must agree with the mode and the bit buffer length, + * but the constraint isn't checked. The given bit buffer is copied and stored. + */ + public: QrSegment(const Mode &md, int numCh, const std::vector &dt); + + + /* + * Creates a new QR Code segment with the given parameters and data. + * The character count (numCh) must agree with the mode and the bit buffer length, + * but the constraint isn't checked. The given bit buffer is moved and stored. + */ + public: QrSegment(const Mode &md, int numCh, std::vector &&dt); + + + /*---- Methods ----*/ + + /* + * Returns the mode field of this segment. + */ + public: const Mode &getMode() const; + + + /* + * Returns the character count field of this segment. + */ + public: int getNumChars() const; + + + /* + * Returns the data bits of this segment. + */ + public: const std::vector &getData() const; + + + // (Package-private) Calculates the number of bits needed to encode the given segments at + // the given version. Returns a non-negative number if successful. Otherwise returns -1 if a + // segment has too many characters to fit its length field, or the total bits exceeds INT_MAX. + public: static int getTotalBits(const std::vector &segs, int version); + + + /*---- Private constant ----*/ + + /* The set of all legal characters in alphanumeric mode, where + * each character value maps to the index in the string. */ + private: static const char *ALPHANUMERIC_CHARSET; + +}; + + + +/* + * A QR Code symbol, which is a type of two-dimension barcode. + * Invented by Denso Wave and described in the ISO/IEC 18004 standard. + * Instances of this class represent an immutable square grid of dark and light cells. + * The class provides static factory functions to create a QR Code from text or binary data. + * The class covers the QR Code Model 2 specification, supporting all versions (sizes) + * from 1 to 40, all 4 error correction levels, and 4 character encoding modes. + * + * Ways to create a QR Code object: + * - High level: Take the payload data and call QrCode::encodeText() or QrCode::encodeBinary(). + * - Mid level: Custom-make the list of segments and call QrCode::encodeSegments(). + * - Low level: Custom-make the array of data codeword bytes (including + * segment headers and final padding, excluding error correction codewords), + * supply the appropriate version number, and call the QrCode() constructor. + * (Note that all ways require supplying the desired error correction level.) + */ +class QrCode final { + + /*---- Public helper enumeration ----*/ + + /* + * The error correction level in a QR Code symbol. + */ + public: enum class Ecc { + LOW = 0 , // The QR Code can tolerate about 7% erroneous codewords + MEDIUM , // The QR Code can tolerate about 15% erroneous codewords + QUARTILE, // The QR Code can tolerate about 25% erroneous codewords + HIGH , // The QR Code can tolerate about 30% erroneous codewords + }; + + + // Returns a value in the range 0 to 3 (unsigned 2-bit integer). + private: static int getFormatBits(Ecc ecl); + + + + /*---- Static factory functions (high level) ----*/ + + /* + * Returns a QR Code representing the given Unicode text string at the given error correction level. + * As a conservative upper bound, this function is guaranteed to succeed for strings that have 2953 or fewer + * UTF-8 code units (not Unicode code points) if the low error correction level is used. The smallest possible + * QR Code version is automatically chosen for the output. The ECC level of the result may be higher than + * the ecl argument if it can be done without increasing the version. + */ + public: static QrCode encodeText(const char *text, Ecc ecl); + + + /* + * Returns a QR Code representing the given binary data at the given error correction level. + * This function always encodes using the binary segment mode, not any text mode. The maximum number of + * bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output. + * The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version. + */ + public: static QrCode encodeBinary(const std::vector &data, Ecc ecl); + + + /*---- Static factory functions (mid level) ----*/ + + /* + * Returns a QR Code representing the given segments with the given encoding parameters. + * The smallest possible QR Code version within the given range is automatically + * chosen for the output. Iff boostEcl is true, then the ECC level of the result + * may be higher than the ecl argument if it can be done without increasing the + * version. The mask number is either between 0 to 7 (inclusive) to force that + * mask, or -1 to automatically choose an appropriate mask (which may be slow). + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a mid-level API; the high-level API is encodeText() and encodeBinary(). + */ + public: static QrCode encodeSegments(const std::vector &segs, Ecc ecl, + int minVersion=1, int maxVersion=40, int mask=-1, bool boostEcl=true); // All optional parameters + + + + /*---- Instance fields ----*/ + + // Immutable scalar parameters: + + /* The version number of this QR Code, which is between 1 and 40 (inclusive). + * This determines the size of this barcode. */ + private: int version; + + /* The width and height of this QR Code, measured in modules, between + * 21 and 177 (inclusive). This is equal to version * 4 + 17. */ + private: int size; + + /* The error correction level used in this QR Code. */ + private: Ecc errorCorrectionLevel; + + /* The index of the mask pattern used in this QR Code, which is between 0 and 7 (inclusive). + * Even if a QR Code is created with automatic masking requested (mask = -1), + * the resulting object still has a mask value between 0 and 7. */ + private: int mask; + + // Private grids of modules/pixels, with dimensions of size*size: + + // The modules of this QR Code (false = light, true = dark). + // Immutable after constructor finishes. Accessed through getModule(). + private: std::vector > modules; + + // Indicates function modules that are not subjected to masking. Discarded when constructor finishes. + private: std::vector > isFunction; + + + + /*---- Constructor (low level) ----*/ + + /* + * Creates a new QR Code with the given version number, + * error correction level, data codeword bytes, and mask number. + * This is a low-level API that most users should not use directly. + * A mid-level API is the encodeSegments() function. + */ + public: QrCode(int ver, Ecc ecl, const std::vector &dataCodewords, int msk); + + + + /*---- Public instance methods ----*/ + + /* + * Returns this QR Code's version, in the range [1, 40]. + */ + public: int getVersion() const; + + + /* + * Returns this QR Code's size, in the range [21, 177]. + */ + public: int getSize() const; + + + /* + * Returns this QR Code's error correction level. + */ + public: Ecc getErrorCorrectionLevel() const; + + + /* + * Returns this QR Code's mask, in the range [0, 7]. + */ + public: int getMask() const; + + + /* + * Returns the color of the module (pixel) at the given coordinates, which is false + * for light or true for dark. The top left corner has the coordinates (x=0, y=0). + * If the given coordinates are out of bounds, then false (light) is returned. + */ + public: bool getModule(int x, int y) const; + + + + /*---- Private helper methods for constructor: Drawing function modules ----*/ + + // Reads this object's version field, and draws and marks all function modules. + private: void drawFunctionPatterns(); + + + // Draws two copies of the format bits (with its own error correction code) + // based on the given mask and this object's error correction level field. + private: void drawFormatBits(int msk); + + + // Draws two copies of the version bits (with its own error correction code), + // based on this object's version field, iff 7 <= version <= 40. + private: void drawVersion(); + + + // Draws a 9*9 finder pattern including the border separator, + // with the center module at (x, y). Modules can be out of bounds. + private: void drawFinderPattern(int x, int y); + + + // Draws a 5*5 alignment pattern, with the center module + // at (x, y). All modules must be in bounds. + private: void drawAlignmentPattern(int x, int y); + + + // Sets the color of a module and marks it as a function module. + // Only used by the constructor. Coordinates must be in bounds. + private: void setFunctionModule(int x, int y, bool isDark); + + + // Returns the color of the module at the given coordinates, which must be in range. + private: bool module(int x, int y) const; + + + /*---- Private helper methods for constructor: Codewords and masking ----*/ + + // Returns a new byte string representing the given data with the appropriate error correction + // codewords appended to it, based on this object's version and error correction level. + private: std::vector addEccAndInterleave(const std::vector &data) const; + + + // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire + // data area of this QR Code. Function modules need to be marked off before this is called. + private: void drawCodewords(const std::vector &data); + + + // XORs the codeword modules in this QR Code with the given mask pattern. + // The function modules must be marked and the codeword bits must be drawn + // before masking. Due to the arithmetic of XOR, calling applyMask() with + // the same mask value a second time will undo the mask. A final well-formed + // QR Code needs exactly one (not zero, two, etc.) mask applied. + private: void applyMask(int msk); + + + // Calculates and returns the penalty score based on state of this QR Code's current modules. + // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. + private: long getPenaltyScore() const; + + + + /*---- Private helper functions ----*/ + + // Returns an ascending list of positions of alignment patterns for this version number. + // Each position is in the range [0,177), and are used on both the x and y axes. + // This could be implemented as lookup table of 40 variable-length lists of unsigned bytes. + private: std::vector getAlignmentPatternPositions() const; + + + // Returns the number of data bits that can be stored in a QR Code of the given version number, after + // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. + // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. + private: static int getNumRawDataModules(int ver); + + + // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any + // QR Code of the given version number and error correction level, with remainder bits discarded. + // This stateless pure function could be implemented as a (40*4)-cell lookup table. + private: static int getNumDataCodewords(int ver, Ecc ecl); + + + // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be + // implemented as a lookup table over all possible parameter values, instead of as an algorithm. + private: static std::vector reedSolomonComputeDivisor(int degree); + + + // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials. + private: static std::vector reedSolomonComputeRemainder(const std::vector &data, const std::vector &divisor); + + + // Returns the product of the two given field elements modulo GF(2^8/0x11D). + // All inputs are valid. This could be implemented as a 256*256 lookup table. + private: static std::uint8_t reedSolomonMultiply(std::uint8_t x, std::uint8_t y); + + + // Can only be called immediately after a light run is added, and + // returns either 0, 1, or 2. A helper function for getPenaltyScore(). + private: int finderPenaltyCountPatterns(const std::array &runHistory) const; + + + // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore(). + private: int finderPenaltyTerminateAndCount(bool currentRunColor, int currentRunLength, std::array &runHistory) const; + + + // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore(). + private: void finderPenaltyAddHistory(int currentRunLength, std::array &runHistory) const; + + + // Returns true iff the i'th bit of x is set to 1. + private: static bool getBit(long x, int i); + + + /*---- Constants and tables ----*/ + + // The minimum version number supported in the QR Code Model 2 standard. + public: static constexpr int MIN_VERSION = 1; + + // The maximum version number supported in the QR Code Model 2 standard. + public: static constexpr int MAX_VERSION = 40; + + + // For use in getPenaltyScore(), when evaluating which mask is best. + private: static const int PENALTY_N1; + private: static const int PENALTY_N2; + private: static const int PENALTY_N3; + private: static const int PENALTY_N4; + + + private: static const std::int8_t ECC_CODEWORDS_PER_BLOCK[4][41]; + private: static const std::int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41]; + +}; + + + +/*---- Public exception class ----*/ + +/* + * Thrown when the supplied data does not fit any QR Code version. Ways to handle this exception include: + * - Decrease the error correction level if it was greater than Ecc::LOW. + * - If the encodeSegments() function was called with a maxVersion argument, then increase + * it if it was less than QrCode::MAX_VERSION. (This advice does not apply to the other + * factory functions because they search all versions up to QrCode::MAX_VERSION.) + * - Split the text data into better or optimal segments in order to reduce the number of bits required. + * - Change the text or binary data to be shorter. + * - Change the text to fit the character set of a particular segment mode (e.g. alphanumeric). + * - Propagate the error upward to the caller/user. + */ +class data_too_long : public std::length_error { + + public: explicit data_too_long(const std::string &msg); + +}; + + + +/* + * An appendable sequence of bits (0s and 1s). Mainly used by QrSegment. + */ +class BitBuffer final : public std::vector { + + /*---- Constructor ----*/ + + // Creates an empty bit buffer (length 0). + public: BitBuffer(); + + + + /*---- Method ----*/ + + // Appends the given number of low-order bits of the given value + // to this buffer. Requires 0 <= len <= 31 and val < 2^len. + public: void appendBits(std::uint32_t val, int len); + +}; + +}