diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e37e204..522d961 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,107 +2,8 @@ name: CI on: pull_request: - branches: - - develop - - main - -permissions: - contents: read - pull-requests: write - -env: - CARGO_TERM_COLOR: always + workflow_dispatch: jobs: - check: - name: Check, Test & Clippy - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - - - name: Cache cargo registry - uses: actions/cache@v4 - with: - path: ~/.cargo/registry - key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo index - uses: actions/cache@v4 - with: - path: ~/.cargo/git - key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo build - uses: actions/cache@v4 - with: - path: target - key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - - - name: Cargo fmt - run: cargo fmt --check - - - name: Cargo build - run: cargo build --release - - - name: Cargo test - run: cargo test - - - name: Cargo clippy - run: cargo clippy --all-targets -- -D warnings - - publish-check: - name: Publish Check (dry-run) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - - - name: Cache cargo registry - uses: actions/cache@v4 - with: - path: ~/.cargo/registry - key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo index - uses: actions/cache@v4 - with: - path: ~/.cargo/git - key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - - - name: Cargo publish dry-run - run: cargo publish --dry-run - - # Validaciones adicionales para PRs a main - main-pr-checks: - name: Main PR Requirements - if: github.base_ref == 'main' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Check version bump - run: | - # Obtener la versión actual - CURRENT_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/') - echo "Versión en Cargo.toml: $CURRENT_VERSION" - - # Obtener el último tag - LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") - if [ -z "$LAST_TAG" ]; then - echo "✅ Primer release (no hay tags previos)" - else - LAST_VERSION=${LAST_TAG#v} - echo "Última versión en tag: $LAST_VERSION" - if [ "$CURRENT_VERSION" = "$LAST_VERSION" ]; then - echo "❌ Error: La versión en Cargo.toml debe bumpearse en PR a main" - echo "Cambio requerido para PRs a main:" - echo "- develop → main: version DEBE incrementarse" - exit 1 - fi - echo "✅ Versión bumpeada correctamente" - fi + rust-ci: + uses: UniverLab/workflows/.github/workflows/rust-ci.yml@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b8ef69..ea23d2b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,219 +2,18 @@ name: Release on: pull_request: - branches: - - main - types: - - closed - paths: - - Cargo.toml + branches: [main] + types: [closed] + paths: [Cargo.toml] workflow_dispatch: permissions: contents: write -env: - CARGO_TERM_COLOR: always - jobs: - create-tag: - name: Create Release Tag + release: if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - outputs: - tag: ${{ steps.version.outputs.tag }} - version: ${{ steps.version.outputs.version }} - created: ${{ steps.create.outputs.created }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Get version from Cargo.toml - id: version - run: | - VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/' | tr -d '\r' | xargs) - TAG="v${VERSION}" - echo "version=${VERSION}" >> $GITHUB_OUTPUT - echo "tag=${TAG}" >> $GITHUB_OUTPUT - - - name: Check if tag already exists - id: check_tag - run: | - TAG=${{ steps.version.outputs.tag }} - if git rev-parse "$TAG" >/dev/null 2>&1; then - echo "exists=true" >> $GITHUB_OUTPUT - echo "Tag $TAG already exists, skipping" - else - echo "exists=false" >> $GITHUB_OUTPUT - fi - - - name: Create and push tag - id: create - run: | - if [ "${{ steps.check_tag.outputs.exists }}" = "true" ]; then - echo "created=false" >> $GITHUB_OUTPUT - echo "Tag already exists — skipping release" - exit 0 - fi - TAG=${{ steps.version.outputs.tag }} - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git tag -a "$TAG" -m "Release $TAG" - git push origin "$TAG" - echo "created=true" >> $GITHUB_OUTPUT - echo "Tag $TAG created and pushed" - - build: - name: Build ${{ matrix.target }} - needs: create-tag - if: needs.create-tag.outputs.created == 'true' - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - include: - - target: x86_64-unknown-linux-musl - os: ubuntu-latest - archive: tar.gz - - target: aarch64-apple-darwin - os: macos-latest - archive: tar.gz - - target: x86_64-apple-darwin - os: macos-latest - archive: tar.gz - - target: x86_64-pc-windows-msvc - os: windows-latest - archive: zip - - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ needs.create-tag.outputs.tag }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.target }} - - - name: Install musl tools (Linux) - if: matrix.target == 'x86_64-unknown-linux-musl' - run: sudo apt-get update && sudo apt-get install -y musl-tools - - - name: Build release binary - run: cargo build --release --target ${{ matrix.target }} - - - name: Package (unix) - if: matrix.archive == 'tar.gz' - run: | - cd target/${{ matrix.target }}/release - tar czf "../../../texforge-${{ needs.create-tag.outputs.tag }}-${{ matrix.target }}.tar.gz" texforge - cd ../../.. - - - name: Package (windows) - if: matrix.archive == 'zip' - shell: pwsh - run: | - cd target/${{ matrix.target }}/release - Compress-Archive -Path texforge.exe -DestinationPath "../../../texforge-${{ needs.create-tag.outputs.tag }}-${{ matrix.target }}.zip" - cd ../../.. - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: texforge-${{ matrix.target }} - path: texforge-${{ needs.create-tag.outputs.tag }}-${{ matrix.target }}.* - - github-release: - name: Create GitHub Release - needs: [create-tag, build] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - merge-multiple: true - - - name: Create release - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ needs.create-tag.outputs.tag }} - generate_release_notes: true - files: artifacts/* - - approve: - name: Awaiting Manual Approval - needs: github-release - runs-on: ubuntu-latest - environment: - name: production - steps: - - name: Approval granted - run: echo "Release approved for publishing to crates.io" - - ensure-owners: - name: Ensure crates.io owners - needs: create-tag - if: needs.create-tag.outputs.created == 'true' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ needs.create-tag.outputs.tag }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - - - name: Add crates.io owners (best-effort) - env: - TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} - OWNERS: github:univerlab:owners - run: | - set -eu - if [ -z "$TOKEN" ]; then - echo "No cargo token found in CARGO_REGISTRY_TOKEN; skipping owners update" - exit 0 - fi - CRATE_NAME=$(grep '^name = ' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/' | tr -d '\r') - echo "crate=$CRATE_NAME" - for owner in $(echo "$OWNERS" | tr ',' ' '); do - echo "Adding owner: $owner" - cargo owner --token "$TOKEN" --add "$owner" || echo "cargo owner failed for $owner (continuing)" - done - - publish: - name: Publish to crates.io - needs: [create-tag, approve, ensure-owners] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ needs.create-tag.outputs.tag }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - - - name: Check if stable release - id: version_check - run: | - VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/' | xargs) - if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "is_stable=true" >> $GITHUB_OUTPUT - echo "Version $VERSION is stable — will publish" - else - echo "is_stable=false" >> $GITHUB_OUTPUT - echo "Version $VERSION is prerelease/dev — skipping publish" - fi - - - name: Cargo publish - if: steps.version_check.outputs.is_stable == 'true' - env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} - run: cargo publish --allow-dirty - - - name: Skipped prerelease - if: steps.version_check.outputs.is_stable == 'false' - run: echo "⏭️ Skipped crates.io publish for prerelease version" + uses: UniverLab/workflows/.github/workflows/rust-release.yml@main + with: + binary-name: texforge + secrets: inherit diff --git a/.gitignore b/.gitignore index afd6cc7..6b521fe 100644 --- a/.gitignore +++ b/.gitignore @@ -28,5 +28,7 @@ target/ # MSVC Windows builds of rustc generate these, which store debugging information *.pdb - +*.mp4 # End of https://www.toptal.com/developers/gitignore/api/rust + +.mimocode/ diff --git a/Cargo.lock b/Cargo.lock index a265fe2..acaa55c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -107,32 +107,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "aws-lc-rs" -version = "1.16.2" +name = "base32" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" -dependencies = [ - "aws-lc-sys", - "zeroize", -] +checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "aws-lc-sys" -version = "0.39.1" +name = "bit-set" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", + "bit-vec", ] [[package]] -name = "base64" -version = "0.22.1" +name = "bit-vec" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" @@ -183,8 +182,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" dependencies = [ "find-msvc-tools", - "jobserver", - "libc", "shlex", ] @@ -200,12 +197,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "clap" version = "4.6.0" @@ -246,15 +237,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" -[[package]] -name = "cmake" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" -dependencies = [ - "cc", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -277,16 +259,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -352,6 +324,26 @@ dependencies = [ "winapi", ] +[[package]] +name = "d2-little" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e9de4e1c31e3024564255281c3240bc486bc10fbfa25fbae49740b2f9258ae" +dependencies = [ + "base32", + "base64", + "fancy-regex", + "log", + "markdown", + "regex", + "roxmltree 0.20.0", + "serde", + "serde_json", + "ttf-parser 0.21.1", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "data-url" version = "0.3.2" @@ -401,12 +393,6 @@ dependencies = [ "syn", ] -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "dyn-clone" version = "1.0.20" @@ -447,6 +433,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "fancy-regex" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -527,7 +524,7 @@ dependencies = [ "memmap2", "slotmap", "tinyvec", - "ttf-parser", + "ttf-parser 0.25.1", ] [[package]] @@ -539,12 +536,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "fsevent-sys" version = "4.1.0" @@ -628,24 +619,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", ] [[package]] @@ -656,7 +631,7 @@ checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi 6.0.0", + "r-efi", "wasip2", "wasip3", ] @@ -805,11 +780,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2", - "system-configuration", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] @@ -1066,16 +1039,6 @@ dependencies = [ "syn", ] -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - [[package]] name = "js-sys" version = "0.3.94" @@ -1193,10 +1156,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "lru-slab" -version = "0.1.2" +name = "markdown" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +checksum = "a5cab8f2cadc416a82d2e783a1946388b31654d391d1c7d92cc1f03e295b1deb" +dependencies = [ + "unicode-id", +] [[package]] name = "memchr" @@ -1227,7 +1193,7 @@ dependencies = [ "serde", "serde_json", "thiserror 2.0.18", - "ttf-parser", + "ttf-parser 0.25.1", ] [[package]] @@ -1409,15 +1375,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - [[package]] name = "prettyplease" version = "0.2.37" @@ -1443,62 +1400,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" -dependencies = [ - "aws-lc-rs", - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "quote" version = "1.0.45" @@ -1508,47 +1409,12 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "r-efi" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - [[package]] name = "redox_syscall" version = "0.5.18" @@ -1631,7 +1497,6 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "quinn", "rustls", "rustls-pki-types", "rustls-platform-verifier", @@ -1704,12 +1569,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - [[package]] name = "rustix" version = "1.1.4" @@ -1729,8 +1588,8 @@ version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ - "aws-lc-rs", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1755,7 +1614,6 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ - "web-time", "zeroize", ] @@ -1765,7 +1623,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "jni", "log", @@ -1792,7 +1650,6 @@ version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -1815,7 +1672,7 @@ dependencies = [ "core_maths", "log", "smallvec", - "ttf-parser", + "ttf-parser 0.25.1", "unicode-bidi-mirroring", "unicode-ccc", "unicode-properties", @@ -1853,7 +1710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags 2.11.0", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -2084,27 +1941,6 @@ dependencies = [ "syn", ] -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tar" version = "0.4.45" @@ -2135,6 +1971,7 @@ version = "0.6.0" dependencies = [ "anyhow", "clap", + "d2-little", "dirs", "flate2", "inquire", @@ -2143,6 +1980,7 @@ dependencies = [ "notify", "reqwest", "resvg", + "rustls", "serde", "tar", "tempfile", @@ -2397,6 +2235,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + [[package]] name = "ttf-parser" version = "0.25.1" @@ -2430,6 +2274,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" +[[package]] +name = "unicode-id" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ba288e709927c043cbe476718d37be306be53fb1fafecd0dbe36d072be2580" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -2677,16 +2527,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-root-certs" version = "1.0.6" @@ -2739,35 +2579,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -2795,15 +2606,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -3130,26 +2932,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.8.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zerofrom" version = "0.1.6" diff --git a/Cargo.toml b/Cargo.toml index 8c5cb98..8370d50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,8 +33,17 @@ walkdir = "2.5" # Home directory resolution dirs = "6.0" -# HTTP client (template downloads) -reqwest = { version = "0.13", features = ["blocking", "json"] } +# HTTP client (template downloads). rustls with the `ring` provider instead of +# the default `aws-lc-rs`: ring is pure-Rust+portable asm and cross-compiles +# cleanly to Windows/musl without a C toolchain (aws-lc-sys needs clang/NASM). +reqwest = { version = "0.13", default-features = false, features = [ + "blocking", + "json", + "http2", + "charset", + "rustls-no-provider", +] } +rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] } # Archive extraction (GitHub tarballs + tectonic zip on Windows) flate2 = "1.1" @@ -51,7 +60,10 @@ resvg = "0.46" # Graphviz/DOT diagram rendering layout-rs = "0.1" -[dev-dependencies] +# D2 diagram rendering (pure-Rust port of the d2lang pipeline, MPL-2.0) +d2-little = "0.7.2" + +# Temporary directories for build tempfile = "3.8" [lints.clippy] diff --git a/README.md b/README.md index fc78b2b..cde52e3 100644 --- a/README.md +++ b/README.md @@ -12,21 +12,17 @@ ░░░░░░ ``` -[![CI](https://github.com/UniverLab/texforge/actions/workflows/ci.yml/badge.svg)](https://github.com/UniverLab/texforge/actions/workflows/ci.yml) -[![Release](https://github.com/UniverLab/texforge/actions/workflows/release.yml/badge.svg)](https://github.com/UniverLab/texforge/actions/workflows/release.yml) -[![Crates.io](https://img.shields.io/crates/v/texforge)](https://crates.io/crates/texforge) -[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +

+ CI + Crates.io + Status + License +

Texforge is a unified LaTeX workspace — one tool for writing, rendering diagrams (Mermaid, Graphviz), and building PDFs. Set it up once and stay focused on your document. --- -### Demo CLI - -![Demo CLI](assets/texforge.gif) - ---- - ## Features - **🚀 One-command setup** — Install once, everything is included (LaTeX engine, templates, diagram renderers). @@ -40,6 +36,12 @@ Texforge is a unified LaTeX workspace — one tool for writing, rendering diagra --- +### Demo with OpenCode + +![Demo OpenCode](demo/dist/demo.gif) + +--- + ## Installation ### Quick install (recommended) @@ -111,10 +113,6 @@ If you want Copilot to understand texforge and help with common LaTeX tasks, ins npx skills add https://github.com/jheisonmb/skills --skill texforge ``` -### Demo with OpenCode agents - -![Demo OpenCode](assets/opencode.gif) - ## Quick Start ```bash @@ -126,6 +124,11 @@ texforge new mi-tesis texforge build ``` +## Documentation + +Full documentation lives in [`docs/`](docs/): installation, quick start, +building, diagrams, templates, configuration and the complete CLI reference. + ## Workflow ```mermaid @@ -150,9 +153,9 @@ sequenceDiagram User->>CLI: texforge build Note over CLI: render embedded diagrams to PNG - CLI->>Tectonic: compile build/main.tex + CLI->>Tectonic: compile entry .tex Note over CLI,Tectonic: auto-installs tectonic on first run - Tectonic-->>User: build/main.pdf + Tectonic-->>User: my-doc.pdf ``` ## `texforge init` @@ -191,8 +194,8 @@ texforge init | `texforge config list` | Show all configured values | | `texforge config ` | Show value for key (name, email, institution, language) | | `texforge config ` | Set value for key | -| `texforge template list` | List installed templates | -| `texforge template list --all` | List installed + available in registry | +| `texforge template list` | List installed + available in registry | +| `texforge template list --installed` | List only locally installed templates | | `texforge template add ` | Download template from registry | | `texforge template remove ` | Remove installed template | | `texforge template validate ` | Verify template compatibility | @@ -241,7 +244,7 @@ Templates are managed through the [texforge-templates](https://github.com/Univer ## Diagrams -`texforge build` intercepts embedded diagram environments before compilation. Originals are never modified — diagrams are rendered in `build/` copies. +`texforge build` intercepts embedded diagram environments before compilation. Originals are never modified — diagrams are rendered in temporary build copies. ### Mermaid @@ -381,13 +384,7 @@ texforge fmt --check # check without modifying (CI-friendly) MIT ---- -## Support - -- 📖 [GitHub Issues](https://github.com/UniverLab/texforge/issues) — Report bugs or request features -- 💬 [Discussions](https://github.com/UniverLab/texforge/discussions) — Ask questions -- 🐦 Twitter: [@JheisonMB](https://twitter.com/JheisonMB) - --- -Made with ❤️ by [JheisonMB](https://github.com/JheisonMB) and [UniverLab](https://github.com/UniverLab) +An experiment of [UniverLab](https://github.com/UniverLab) — an open computational laboratory. +Made with ❤️ by [JheisonMB](https://github.com/JheisonMB) diff --git a/assets/opencode.gif b/assets/opencode.gif deleted file mode 100644 index 06c2c63..0000000 Binary files a/assets/opencode.gif and /dev/null differ diff --git a/assets/texforge.gif b/assets/texforge.gif deleted file mode 100644 index a0e3320..0000000 Binary files a/assets/texforge.gif and /dev/null differ diff --git a/demo/demo.rec b/demo/demo.rec new file mode 100644 index 0000000..130c858 --- /dev/null +++ b/demo/demo.rec @@ -0,0 +1,733 @@ +{"demostage":{"captions":[],"demo":{"name":"demo","output_dir":"./dist","prompt":"\\[\\e[1;32m\\]texForge@univerlab\\[\\e[0m\\]:\\[\\e[1;34m\\]~\\[\\e[0m\\]$ "},"duration":38.578358061,"faithful":false,"focuses":[[0.120611476,"main"],[28.8673746,"pdf-r1"]],"layout":{"background":"#0b0f14","font_family":"IBM Plex Mono","fps":15,"height":1080,"line_height":1.2000000476837158,"panes":[{"font_family":"monospace","font_size":16,"height":1080,"id":"main","type":"terminal","width":1440,"x":0,"y":0},{"height":1080,"id":"pdf-r1","reveal_at":28.8673746,"type":"browser","url":"file:///home/jheisonmblivecom/Projects/UniverLab/texforge/examples/texforge-capabilites/texforge-capabilites.pdf","width":1440,"x":0,"y":0}],"width":1440},"timeline":[{"action":"focus","pane":"main"},{"action":"type","human_salt":true,"text":"texforge --help"},{"action":"wait","duration_ms":200},{"action":"keypress","key":"enter"},{"action":"wait","duration_ms":2500},{"action":"type","human_salt":true,"text":"opencode"},{"action":"wait","duration_ms":200},{"action":"keypress","key":"enter"},{"action":"wait_for_quiet","quiet_ms":1500},{"action":"type","human_salt":true,"text":"Create a texforge project \"texforge-capabilites\" demonstrating all capabilities: Mermaid sequence diagra, Graphviz architecture digraph, D2 pipeline diagram, math equations with cross-refs, BibTeX citations, tikz diagram, examples of code listings, two booktabs tables, table of contents, and lists. Compile with texforge build."},{"action":"wait","duration_ms":200},{"action":"keypress","key":"enter"},{"action":"wait_for_quiet","quiet_ms":5000},{"action":"type","human_salt":true,"text":"/exit"},{"action":"wait","duration_ms":200},{"action":"keypress","key":"enter"},{"action":"wait_for_quiet","quiet_ms":500},{"action":"focus","pane":"pdf-r1"},{"action":"scroll","direction":"down","duration_ms":8000,"pane":"pdf-r1","velocity":"constant"},{"action":"wait","duration_ms":8000},{"action":"terminate"}],"typing":{"base_ms":80,"salt_ms":15}},"env":{"TERM":"xterm-256color"},"height":54,"title":"demo","version":2,"width":144} +[0.000135769,"o","\r\n\u001b[?2004l\r"] +[0.000337255,"o","\u001b]697;OSCUnlock=6f3dc305774c4fb5ac9caff308f61ed2\u0007\u001b]697;Dir=/home/jheisonmblivecom\u0007"] +[0.000349953,"o","\u001b]697;Shell=bash\u0007"] +[0.000401504,"o","\u001b]697;ShellPath=/usr/bin/bash\u0007\u001b]697;WSLDistro=Ubuntu\u0007"] +[0.00047482,"o","\u001b]697;PID=16910\u0007\u001b]697;ExitCode=0\u0007"] +[0.000526347,"o","\u001b]697;TTY=/dev/pts/3\u0007\u001b]697;Log=\u0007"] +[0.000567266,"o","\u001b]697;User=jheisonmblivecom\u0007"] +[0.002317281,"o","\u001b]697;OSCLock=6f3dc305774c4fb5ac9caff308f61ed2\u0007"] +[0.002363538,"o","\u001b]697;PreExec\u0007"] +[0.089152788,"o","\u001b[?2004h\u001b]697;StartPrompt\u0007\u001b[1;32mtexForge@univerlab\u001b[0m:\u001b[1;34m~\u001b[0m$ \u001b]697;EndPrompt\u0007\u001b]697;NewCmd=6f3dc305774c4fb5ac9caff308f61ed2\u0007"] +[0.204858436,"o","t"] +[0.291980904,"o","e"] +[0.374100946,"o","x"] +[0.456189324,"o","f"] +[0.542274976,"o","o"] +[0.616330711,"o","r"] +[0.707403678,"o","g"] +[0.786497211,"o","e"] +[0.875573135,"o"," "] +[0.953618483,"o","-"] +[1.043708183,"o","-"] +[1.120829592,"o","h"] +[1.214921291,"o","e"] +[1.304021288,"o","l"] +[1.371120573,"o","p"] +[1.572695751,"o","\r\n\u001b[?2004l\r"] +[1.5747672769999999,"o","Self-contained LaTeX to PDF compiler CLI\r\n\r\n\u001b[1m\u001b[4mUsage:\u001b[0m \u001b[1mtexforge\u001b[0m \r\n\r\n\u001b[1m\u001b[4mCommands:\u001b[0m\r\n \u001b[1mclean\u001b[0m Remove build artifacts\r\n \u001b[1minit\u001b[0m Initialize a texforge project in the current directory\r\n \u001b[1mnew\u001b[0m Create a new project from a template\r\n \u001b[1mbuild\u001b[0m Compile project to PDF\r\n \u001b[1mfmt\u001b[0m Format .tex files\r\n \u001b[1mcheck\u001b[0m Lint project without compiling\r\n \u001b[1mtemplate\u001b[0m Manage templates\r\n \u001b[1mconfig\u001b[0m Manage global configuration\r\n \u001b[1mhelp\u001b[0m Print this message or the help of the given subcommand(s)\r\n\r\n\u001b[1m\u001b[4mOptions:\u001b[0m\r\n \u001b[1m-h\u001b[0m, \u001b[1m--help\u001b[0m Print help\r\n \u001b[1m-V\u001b[0m, \u001b[1m--version\u001b[0m Print version\r\n"] +[1.575336125,"o","\u001b]697;OSCUnlock=6f3dc305774c4fb5ac9caff308f61ed2\u0007\u001b]697;Dir=/home/jheisonmblivecom\u0007"] +[1.5753921979999999,"o","\u001b]697;Shell=bash\u0007\u001b]697;ShellPath=/usr/bin/bash\u0007"] +[1.575454122,"o","\u001b]697;WSLDistro=Ubuntu\u0007\u001b]697;PID=16910\u0007"] +[1.575515821,"o","\u001b]697;ExitCode=0\u0007\u001b]697;TTY=/dev/pts/3\u0007"] +[1.575567567,"o","\u001b]697;Log=\u0007\u001b]697;User=jheisonmblivecom\u0007"] +[1.576844584,"o","\u001b]697;OSCLock=6f3dc305774c4fb5ac9caff308f61ed2\u0007\u001b]697;PreExec\u0007"] +[1.6654565639999999,"o","\u001b[?2004h\u001b]697;StartPrompt\u0007\u001b[1;32mtexForge@univerlab\u001b[0m:\u001b[1;34m~\u001b[0m$ \u001b]697;EndPrompt\u0007\u001b]697;NewCmd=6f3dc305774c4fb5ac9caff308f61ed2\u0007"] +[4.221623371,"o","o"] +[4.2877478,"o","p"] +[4.352805733,"o","e"] +[4.433897023,"o","n"] +[4.506017184,"o","c"] +[4.585093582,"o","o"] +[4.656230257,"o","d"] +[4.740303969,"o","e"] +[4.941632268,"o","\r\n\u001b[?2004l\r"] +[5.658414806,"o","\u001b[?2031h\u001b]10;?\u0007\u001b]11;?\u0007\u001b[>0q\u001b[?25l\u001b[s\u001b[6n\u001b[?1016$p\u001b[?2027$p\u001b[?2031$p\u001b[?1004$p\u001b[?2004$p\u001b[?2026$p\u001b[?u\u001b]99;i=opentui-notifications:p=?;\u001b\\\u001b]1337;Capabilities\u001b\\\u001b[H\u001b]66;w=1; \u001b\\\u001b[6n\u001b[H\u001b]66;s=2; \u001b\\\u001b[6n\u001b[u\u001b[s\u001b[?1049h\u001b[>4;1m\u001b[?2027h\u001b[?2004h"] +[5.658749822,"o","\u001b[?1000h\u001b[?1002h\u001b[?1003h\u001b[?1006h"] +[5.658801952,"o","\u001b[14t"] +[5.668513847,"o","\u001b]4;0;?\u0007"] +[7.85971063,"o","\u001b[?2026h\u001b[?25l\u001b[1;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[2;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[3;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[4;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[5;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[6;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[7;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[8;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[9;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[10;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[11;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[12;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[13;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[14;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[15;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[16;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[17;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[18;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[19;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[20;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[21;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[22;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m "] +[7.859729269,"o"," \u001b[23;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[24;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[25;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[26;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[27;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[28;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[29;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[30;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[31;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[32;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[33;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[34;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[35;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[36;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[37;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[38;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[39;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[40;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[41;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[42;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[43;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[44;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b"] +[7.859754695,"o","[45;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[46;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[47;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[48;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[49;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[50;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[51;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[52;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[53;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[54;1H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[?2026l"] +[7.890234675,"o","\u001b]0;OpenCode\u0007"] +[7.9852611620000005,"o","\u001b[?2026h\u001b[?25l\u001b[20;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;57H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;59H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;61H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;62H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;64H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;67H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;69H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;79H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▄\u001b[0m\u001b[20;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;92H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;55H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[21;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;66H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;67H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▄\u001b[0m\u001b[21;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[21;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀ \u001b[0m\u001b[21;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;81H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;92H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;55H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;56H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;60H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;65H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m▀▀▀\u001b[0m\u001b[22;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m"] +[7.98526746,"o","\u001b"] +[7.985274305,"o","[22;70H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;72H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;75H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[22;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;80H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[22;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;85H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[22;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;90H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m▀▀▀\u001b[0m\u001b[23;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀▀ \u001b[0m\u001b[23;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[23;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀ ▀▀▀▀ ▀\u001b[0m\u001b[23;70H\u001b[38;2;40;40;40m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[23;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[23;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀▀▀ ▀▀▀▀ \u001b[0m\u001b[23;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[23;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[26;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[26;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[27;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[27;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[27;39H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mAsk anything... \"Fix broken tests\"\u001b[0m\u001b[27;73H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[28;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[28;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[29;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;39H\u001b[38;2;92;156;245m\u001b[48;2;30;30;30mBuild\u001b[0m\u001b[29;44H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;45H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m·\u001b[0m\u001b[29;46H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mQwen3.7 Plus\u001b[0m\u001b[29;59H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;60H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpenCode Go\u001b[0m\u001b[29;71H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m╹\u001b[0m\u001b[30;37H\u001b[38;2;30;30;30m\u001b[48;2;10;10;10m▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\u001b[0m\u001b[31;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mtab \u001b[0m\u001b[31;88H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10magents\u001b[0m\u001b[31;96H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mctrl+p \u001b[0m\u001b[31;103H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mcommands\u001b[0m\u001b[35;36H\u001b[38;2;245;167;66m\u001b[48;2;10;10;10m● Tip \u001b[0m\u001b[35;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mRun \u001b[0m\u001b[35;46H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mdocker run -it --rm ghcr.io/anomalyco/opencode\u001b[0m\u001b[35;92H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m for containerized \u001b[0m\u001b[36;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10muse\u001b[0m\u001b[53;3H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m~\u001b[0m\u001b[53;136H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m1.15.13\u001b[0m\u001b[0m\u001b]12;#eeeeee\u0007\u001b[1 q\u001b[27;39H\u001b[?25h\u001b[?2026l"] +[8.03356446,"o","\u001b[?2026h\u001b[?25l\u001b[27;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mtes\" dem\u001b[0m\u001b[27;47H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mMiMo V2.5 Free\u001b[0m\u001b[29;61H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;62H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpenCode Zen\u001b[0m\u001b[0m\u001b[27;47H\u001b[?25h\u001b[?2026l"] +[8.047543303,"o","\u001b[?2026h\u001b[?25l\u001b[27;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mons\u001b[0m\u001b[0m\u001b[27;50H\u001b[?25h\u001b[?2026l"] +[8.063449681,"o","\u001b[?2026h\u001b[?25l\u001b[27;50H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mtr\u001b[0m\u001b[0m\u001b[27;52H\u001b[?25h\u001b[?2026l"] +[8.079271333,"o","\u001b[?2026h\u001b[?25l\u001b[27;52H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[27;53H\u001b[?25h\u001b[?2026l"] +[8.097240579,"o","\u001b[?2026h\u001b[?25l\u001b[27;53H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[27;54H\u001b[?25h\u001b[?2026l"] +[8.113261376,"o","\u001b[?2026h\u001b[?25l\u001b[27;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;55H\u001b[?25h\u001b[?2026l"] +[8.129084736,"o","\u001b[?2026h\u001b[?25l\u001b[27;55H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[27;56H\u001b[?25h\u001b[?2026l"] +[8.148726966,"o","\u001b[?2026h\u001b[?25l\u001b[27;56H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mg \u001b[0m\u001b[0m\u001b[27;58H\u001b[?25h\u001b[?2026l"] +[8.166859884,"o","\u001b[?2026h\u001b[?25l\u001b[27;58H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[27;59H\u001b[?25h\u001b[?2026l"] +[8.18287332,"o","\u001b[?2026h\u001b[?25l\u001b[27;59H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[27;60H\u001b[?25h\u001b[?2026l"] +[8.199655165,"o","\u001b[?2026h\u001b[?25l\u001b[27;60H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[27;61H\u001b[?25h\u001b[?2026l"] +[8.216095284,"o","\u001b[?2026h\u001b[?25l\u001b[27;61H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[27;62H\u001b[?25h\u001b[?2026l"] +[8.235712647,"o","\u001b[?2026h\u001b[?25l\u001b[27;62H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mca\u001b[0m\u001b[0m\u001b[27;64H\u001b[?25h\u001b[?2026l"] +[8.256083428,"o","\u001b[?2026h\u001b[?25l\u001b[27;64H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[27;65H\u001b[?25h\u001b[?2026l"] +[8.273031071,"o","\u001b[?2026h\u001b[?25l\u001b[27;65H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[27;66H\u001b[?25h\u001b[?2026l"] +[8.28926472,"o","\u001b[?2026h\u001b[?25l\u001b[27;66H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mb\u001b[0m\u001b[0m\u001b[27;67H\u001b[?25h\u001b[?2026l"] +[8.305519166,"o","\u001b[?2026h\u001b[?25l\u001b[27;67H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;68H\u001b[?25h\u001b[?2026l"] +[8.322005323,"o","\u001b[?2026h\u001b[?25l\u001b[27;68H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[27;69H\u001b[?25h\u001b[?2026l"] +[8.338115008,"o","\u001b[?2026h\u001b[?25l\u001b[27;69H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;70H\u001b[?25h\u001b[?2026l"] +[8.354736452,"o","\u001b[?2026h\u001b[?25l\u001b[27;70H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[27;71H\u001b[?25h\u001b[?2026l"] +[8.370591927,"o","\u001b[?2026h\u001b[?25l\u001b[27;71H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;72H\u001b[?25h\u001b[?2026l"] +[8.389016096,"o","\u001b[?2026h\u001b[?25l\u001b[27;72H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mes\u001b[0m\u001b[0m\u001b[27;74H\u001b[?25h\u001b[?2026l"] +[8.407057599,"o","\u001b[?2026h\u001b[?25l\u001b[27;74H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m:\u001b[0m\u001b[0m\u001b[27;75H\u001b[?25h\u001b[?2026l"] +[8.422767961,"o","\u001b[?2026h\u001b[?25l\u001b[27;75H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[27;76H\u001b[?25h\u001b[?2026l"] +[8.438975764,"o","\u001b[?2026h\u001b[?25l\u001b[27;76H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mM\u001b[0m\u001b[0m\u001b[27;77H\u001b[?25h\u001b[?2026l"] +[8.454879151,"o","\u001b[?2026h\u001b[?25l\u001b[27;77H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[27;78H\u001b[?25h\u001b[?2026l"] +[8.471218676,"o","\u001b[?2026h\u001b[?25l\u001b[27;78H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[27;79H\u001b[?25h\u001b[?2026l"] +[8.487997752,"o","\u001b[?2026h\u001b[?25l\u001b[27;79H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm\u001b[0m\u001b[0m\u001b[27;80H\u001b[?25h\u001b[?2026l"] +[8.503985547,"o","\u001b[?2026h\u001b[?25l\u001b[27;80H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[27;81H\u001b[?25h\u001b[?2026l"] +[8.519627234,"o","\u001b[?2026h\u001b[?25l\u001b[27;81H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;82H\u001b[?25h\u001b[?2026l"] +[8.535530416,"o","\u001b[?2026h\u001b[?25l\u001b[27;82H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[27;83H\u001b[?25h\u001b[?2026l"] +[8.552071421,"o","\u001b[?2026h\u001b[?25l\u001b[27;83H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[27;84H\u001b[?25h\u001b[?2026l"] +[8.568294638,"o","\u001b[?2026h\u001b[?25l\u001b[27;84H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[27;85H\u001b[?25h\u001b[?2026l"] +[8.584099233,"o","\u001b[?2026h\u001b[?25l\u001b[27;85H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[27;86H\u001b[?25h\u001b[?2026l"] +[8.600271808,"o","\u001b[?2026h\u001b[?25l\u001b[27;86H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mq\u001b[0m\u001b[0m\u001b[27;87H\u001b[?25h\u001b[?2026l"] +[8.616276394,"o","\u001b[?2026h\u001b[?25l\u001b[27;87H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mu\u001b[0m\u001b[0m\u001b[27;88H\u001b[?25h\u001b[?2026l"] +[8.63205935,"o","\u001b[?2026h\u001b[?25l\u001b[27;88H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[27;89H\u001b[?25h\u001b[?2026l"] +[8.648534234,"o","\u001b[?2026h\u001b[?25l\u001b[27;89H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[27;90H\u001b[?25h\u001b[?2026l"] +[8.664893287,"o","\u001b[?2026h\u001b[?25l\u001b[27;90H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mc\u001b[0m\u001b[0m\u001b[27;91H\u001b[?25h\u001b[?2026l"] +[8.681244987,"o","\u001b[?2026h\u001b[?25l\u001b[27;91H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[27;92H\u001b[?25h\u001b[?2026l"] +[8.697702158,"o","\u001b[?2026h\u001b[?25l\u001b[27;92H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[27;93H\u001b[?25h\u001b[?2026l"] +[8.7141903,"o","\u001b[?2026h\u001b[?25l\u001b[27;93H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[27;94H\u001b[?25h\u001b[?2026l"] +[8.730293776,"o","\u001b[?2026h\u001b[?25l\u001b[27;94H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;95H\u001b[?25h\u001b[?2026l"] +[8.749865895,"o","\u001b[?2026h\u001b[?25l\u001b[27;95H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mag\u001b[0m\u001b[0m\u001b[27;97H\u001b[?25h\u001b[?2026l"] +[8.765722921,"o","\u001b[?2026h\u001b[?25l\u001b[27;97H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[27;98H\u001b[?25h\u001b[?2026l"] +[8.783756326,"o","\u001b[?2026h\u001b[?25l\u001b[27;98H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[27;99H\u001b[?25h\u001b[?2026l"] +[8.800320373,"o","\u001b[?2026h\u001b[?25l\u001b[27;99H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[27;100H\u001b[?25h\u001b[?2026l"] +[8.816438114,"o","\u001b[?2026h\u001b[?25l\u001b[27;100H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[27;101H\u001b[?25h\u001b[?2026l"] +[8.83288703,"o","\u001b[?2026h\u001b[?25l\u001b[27;101H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mG\u001b[0m\u001b[0m\u001b[27;102H\u001b[?25h\u001b[?2026l"] +[8.84953167,"o","\u001b[?2026h\u001b[?25l\u001b[27;102H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mra\u001b[0m\u001b[0m\u001b[27;104H\u001b[?25h\u001b[?2026l"] +[8.865342523,"o","\u001b[?2026h\u001b[?25l\u001b[27;104H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[27;105H\u001b[?25h\u001b[?2026l"] +[8.881426167,"o","\u001b[?2026h\u001b[?25l\u001b[27;105H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mh\u001b[0m\u001b[0m\u001b[27;106H\u001b[?25h\u001b[?2026l"] +[8.897569353,"o","\u001b[?2026h\u001b[?25l\u001b[27;106H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mv\u001b[0m\u001b[0m\u001b[27;107H\u001b[?25h\u001b[?2026l"] +[8.913642975,"o","\u001b[?2026h\u001b[?25l\u001b[27;107H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[27;108H\u001b[?25h\u001b[?2026l"] +[8.929717066,"o","\u001b[?2026h\u001b[?25l\u001b[27;108H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mz\u001b[0m\u001b[0m\u001b[27;109H\u001b[?25h\u001b[?2026l"] +[8.945686852,"o","\u001b[?2026h\u001b[?25l\u001b[27;101H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[28;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mGraphviz \u001b[0m\u001b[29;39H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;45H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;47H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;62H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[30;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;39H\u001b[38;2;92;156;245m\u001b[48;2;30;30;30mBuild\u001b[0m\u001b[30;44H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;45H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m·\u001b[0m\u001b[30;46H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mMiMo V2.5 Free\u001b[0m\u001b[30;61H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;62H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpenCode Zen\u001b[0m\u001b[30;74H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[31;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m╹\u001b[0m\u001b[31;37H\u001b[38;2;30;30;30m\u001b[48;2;10;10;10m▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\u001b[0m\u001b[32;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mtab \u001b[0m\u001b[32;88H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10magents\u001b[0m\u001b[32;96H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mctrl+p \u001b[0m\u001b[32;103H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mcommands\u001b[0m\u001b[35;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[36;36H\u001b[38;2;245;167;66m\u001b[48;2;10;10;10m● Tip \u001b[0m\u001b[36;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mRun \u001b[0m\u001b[36;46H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mdocker run -it --rm ghcr.io/anomalyco/opencode\u001b[0m\u001b[36;92H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m for containerized \u001b[0m\u001b[37;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10muse\u001b[0m\u001b[0m\u001b[28;48H\u001b[?25h\u001b[?2026l"] +[8.962376118,"o","\u001b[?2026h\u001b[?25l\u001b[28;48H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;49H\u001b[?25h\u001b[?2026l"] +[8.978348926,"o","\u001b[?2026h\u001b[?25l\u001b[28;49H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[28;50H\u001b[?25h\u001b[?2026l"] +[8.996302793,"o","\u001b[?2026h\u001b[?25l\u001b[28;50H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mch\u001b[0m\u001b[0m\u001b[28;52H\u001b[?25h\u001b[?2026l"] +[9.012363502,"o","\u001b[?2026h\u001b[?25l\u001b[28;52H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;53H\u001b[?25h\u001b[?2026l"] +[9.028493446,"o","\u001b[?2026h\u001b[?25l\u001b[28;53H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;54H\u001b[?25h\u001b[?2026l"] +[9.044458414,"o","\u001b[?2026h\u001b[?25l\u001b[28;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;55H\u001b[?25h\u001b[?2026l"] +[9.060932337,"o","\u001b[?2026h\u001b[?25l\u001b[28;55H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mc\u001b[0m\u001b[53;6H\u001b[38;2;127;216;143m\u001b[48;2;10;10;10m⊙ \u001b[0m\u001b[53;8H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m3 MCP\u001b[0m\u001b[53;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m/status\u001b[0m\u001b[0m\u001b[28;56H\u001b[?25h\u001b[?2026l"] +[9.077659854,"o","\u001b[?2026h\u001b[?25l\u001b[28;56H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;57H\u001b[?25h\u001b[?2026l"] +[9.09358016,"o","\u001b[?2026h\u001b[?25l\u001b[28;57H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mur\u001b[0m\u001b[0m\u001b[28;59H\u001b[?25h\u001b[?2026l"] +[9.111542711,"o","\u001b[?2026h\u001b[?25l\u001b[28;59H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;60H\u001b[?25h\u001b[?2026l"] +[9.132142946,"o","\u001b[?2026h\u001b[?25l\u001b[28;60H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;61H\u001b[?25h\u001b[?2026l"] +[9.148048633,"o","\u001b[?2026h\u001b[?25l\u001b[28;61H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[28;62H\u001b[?25h\u001b[?2026l"] +[9.16523702,"o","\u001b[?2026h\u001b[?25l\u001b[28;62H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mig\u001b[0m\u001b[0m\u001b[28;64H\u001b[?25h\u001b[?2026l"] +[9.181153646,"o","\u001b[?2026h\u001b[?25l\u001b[28;64H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[28;65H\u001b[?25h\u001b[?2026l"] +[9.197459905,"o","\u001b[?2026h\u001b[?25l\u001b[28;65H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;66H\u001b[?25h\u001b[?2026l"] +[9.214135262,"o","\u001b[?2026h\u001b[?25l\u001b[28;66H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[28;67H\u001b[?25h\u001b[?2026l"] +[9.230552558,"o","\u001b[?2026h\u001b[?25l\u001b[28;67H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mh\u001b[0m\u001b[0m\u001b[28;68H\u001b[?25h\u001b[?2026l"] +[9.246684426,"o","\u001b[?2026h\u001b[?25l\u001b[28;68H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[28;69H\u001b[?25h\u001b[?2026l"] +[9.262897713,"o","\u001b[?2026h\u001b[?25l\u001b[28;69H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;70H\u001b[?25h\u001b[?2026l"] +[9.278955654,"o","\u001b[?2026h\u001b[?25l\u001b[28;70H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mD\u001b[0m\u001b[0m\u001b[28;71H\u001b[?25h\u001b[?2026l"] +[9.295717443000001,"o","\u001b[?2026h\u001b[?25l\u001b[28;71H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m2\u001b[0m\u001b[0m\u001b[28;72H\u001b[?25h\u001b[?2026l"] +[9.311282148,"o","\u001b[?2026h\u001b[?25l\u001b[28;72H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;73H\u001b[?25h\u001b[?2026l"] +[9.32754674,"o","\u001b[?2026h\u001b[?25l\u001b[28;73H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[28;74H\u001b[?25h\u001b[?2026l"] +[9.343662518,"o","\u001b[?2026h\u001b[?25l\u001b[28;74H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;75H\u001b[?25h\u001b[?2026l"] +[9.360496848,"o","\u001b[?2026h\u001b[?25l\u001b[28;75H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[28;76H\u001b[?25h\u001b[?2026l"] +[9.385056806,"o","\u001b[?2026h\u001b[?25l\u001b[28;76H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;77H\u001b[?25h\u001b[?2026l"] +[9.401905694,"o","\u001b[?2026h\u001b[?25l\u001b[28;77H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mli\u001b[0m\u001b[0m\u001b[28;79H\u001b[?25h\u001b[?2026l"] +[9.418235508,"o","\u001b[?2026h\u001b[?25l\u001b[28;79H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[28;80H\u001b[?25h\u001b[?2026l"] +[9.434156002,"o","\u001b[?2026h\u001b[?25l\u001b[28;80H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;81H\u001b[?25h\u001b[?2026l"] +[9.450988052,"o","\u001b[?2026h\u001b[?25l\u001b[28;81H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;82H\u001b[?25h\u001b[?2026l"] +[9.466834164,"o","\u001b[?2026h\u001b[?25l\u001b[28;82H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[28;83H\u001b[?25h\u001b[?2026l"] +[9.483849797,"o","\u001b[?2026h\u001b[?25l\u001b[28;83H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mia\u001b[0m\u001b[0m\u001b[28;85H\u001b[?25h\u001b[?2026l"] +[9.514971455,"o","\u001b[?2026h\u001b[?25l\u001b[28;85H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mg\u001b[0m\u001b[0m\u001b[28;86H\u001b[?25h\u001b[?2026l"] +[9.531170823,"o","\u001b[?2026h\u001b[?25l\u001b[28;86H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mra\u001b[0m\u001b[0m\u001b[28;88H\u001b[?25h\u001b[?2026l"] +[9.54979115,"o","\u001b[?2026h\u001b[?25l\u001b[28;88H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm\u001b[0m\u001b[0m\u001b[28;89H\u001b[?25h\u001b[?2026l"] +[9.565724068,"o","\u001b[?2026h\u001b[?25l\u001b[28;89H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[28;90H\u001b[?25h\u001b[?2026l"] +[9.58161827,"o","\u001b[?2026h\u001b[?25l\u001b[28;90H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;91H\u001b[?25h\u001b[?2026l"] +[9.597912276,"o","\u001b[?2026h\u001b[?25l\u001b[28;91H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm\u001b[0m\u001b[0m\u001b[28;92H\u001b[?25h\u001b[?2026l"] +[9.615446827,"o","\u001b[?2026h\u001b[?25l\u001b[28;92H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mat\u001b[0m\u001b[0m\u001b[28;94H\u001b[?25h\u001b[?2026l"] +[9.631165917,"o","\u001b[?2026h\u001b[?25l\u001b[28;94H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mh\u001b[0m\u001b[0m\u001b[28;95H\u001b[?25h\u001b[?2026l"] +[9.647299041,"o","\u001b[?2026h\u001b[?25l\u001b[28;95H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;96H\u001b[?25h\u001b[?2026l"] +[9.663407584,"o","\u001b[?2026h\u001b[?25l\u001b[28;96H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;97H\u001b[?25h\u001b[?2026l"] +[9.679418038,"o","\u001b[?2026h\u001b[?25l\u001b[28;97H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mq\u001b[0m\u001b[0m\u001b[28;98H\u001b[?25h\u001b[?2026l"] +[9.69575998,"o","\u001b[?2026h\u001b[?25l\u001b[28;98H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mu\u001b[0m\u001b[0m\u001b[28;99H\u001b[?25h\u001b[?2026l"] +[9.711662765,"o","\u001b[?2026h\u001b[?25l\u001b[28;99H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;100H\u001b[?25h\u001b[?2026l"] +[9.727571682,"o","\u001b[?2026h\u001b[?25l\u001b[28;100H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;101H\u001b[?25h\u001b[?2026l"] +[9.743930487,"o","\u001b[?2026h\u001b[?25l\u001b[28;101H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;102H\u001b[?25h\u001b[?2026l"] +[9.760443045,"o","\u001b[?2026h\u001b[?25l\u001b[28;102H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[28;103H\u001b[?25h\u001b[?2026l"] +[9.776790737,"o","\u001b[?2026h\u001b[?25l\u001b[28;103H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[28;104H\u001b[?25h\u001b[?2026l"] +[9.793408737,"o","\u001b[?2026h\u001b[?25l\u001b[28;104H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[28;105H\u001b[?25h\u001b[?2026l"] +[9.809440027,"o","\u001b[?2026h\u001b[?25l\u001b[28;105H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m w\u001b[0m\u001b[0m\u001b[28;107H\u001b[?25h\u001b[?2026l"] +[9.826094353,"o","\u001b[?2026h\u001b[?25l\u001b[28;107H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;108H\u001b[?25h\u001b[?2026l"] +[9.843194759,"o","\u001b[?2026h\u001b[?25l\u001b[28;108H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;109H\u001b[?25h\u001b[?2026l"] +[9.859626202,"o","\u001b[?2026h\u001b[?25l\u001b[19;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;57H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;59H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;61H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;62H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;64H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;67H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;69H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;79H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▄\u001b[0m\u001b[19;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;92H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;55H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[20;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[20;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[20;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[20;66H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[20;67H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[20;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▄\u001b[0m\u001b[20;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[20;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀ \u001b[0m\u001b[20;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[20;81H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[20;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[20;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[20;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[20;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[20;92H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;55H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[21;56H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[21;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;60H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[21;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;65H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m▀▀▀\u001b[0m\u001b[21;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;70H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0"] +[9.859638036,"o","m\u001b[21;72H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;75H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[21;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;80H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[21;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;85H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[21;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;90H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m▀▀▀\u001b[0m\u001b[22;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀▀\u001b[0m\u001b[22;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀\u001b[0m\u001b[22;64H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀▀\u001b[0m\u001b[22;69H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[22;70H\u001b[38;2;40;40;40m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[22;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[22;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀▀▀\u001b[0m\u001b[22;79H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀▀▀\u001b[0m\u001b[22;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[22;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[22;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[22;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[22;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[22;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[22;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[23;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[25;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[26;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mtes\" demonstrating all capabilities: Mermaid sequence diagra, \u001b[0m\u001b[27;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mGraphviz archi\u001b[0m\u001b[27;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mecture digr\u001b[0m\u001b[27;66H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mph, D2 pipeline \u001b[0m\u001b[27;83H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30miagram, math equations \u001b[0m\u001b[28;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mwith\u001b[0m\u001b[28;43H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;43H\u001b[?25h\u001b[?2026l"] +[9.876286918,"o","\u001b[?2026h\u001b[?25l\u001b[28;43H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;44H\u001b[?25h\u001b[?2026l"] +[9.892532699,"o","\u001b[?2026h\u001b[?25l\u001b[28;44H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mc\u001b[0m\u001b[0m\u001b[28;45H\u001b[?25h\u001b[?2026l"] +[9.908733199,"o","\u001b[?2026h\u001b[?25l\u001b[28;45H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[28;46H\u001b[?25h\u001b[?2026l"] +[9.925490057,"o","\u001b[?2026h\u001b[?25l\u001b[28;46H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[28;47H\u001b[?25h\u001b[?2026l"] +[9.941976675,"o","\u001b[?2026h\u001b[?25l\u001b[28;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[28;48H\u001b[?25h\u001b[?2026l"] +[9.958709344,"o","\u001b[?2026h\u001b[?25l\u001b[28;48H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[28;49H\u001b[?25h\u001b[?2026l"] +[9.976395824,"o","\u001b[?2026h\u001b[?25l\u001b[28;49H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m-r\u001b[0m\u001b[0m\u001b[28;51H\u001b[?25h\u001b[?2026l"] +[9.992217523,"o","\u001b[?2026h\u001b[?25l\u001b[28;51H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;52H\u001b[?25h\u001b[?2026l"] +[10.008416487,"o","\u001b[?2026h\u001b[?25l\u001b[28;52H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mf\u001b[0m\u001b[0m\u001b[28;53H\u001b[?25h\u001b[?2026l"] +[10.024487218,"o","\u001b[?2026h\u001b[?25l\u001b[28;53H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[28;54H\u001b[?25h\u001b[?2026l"] +[10.040496778,"o","\u001b[?2026h\u001b[?25l\u001b[28;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[28;55H\u001b[?25h\u001b[?2026l"] +[10.056507578,"o","\u001b[?2026h\u001b[?25l\u001b[28;55H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;56H\u001b[?25h\u001b[?2026l"] +[10.072710369,"o","\u001b[?2026h\u001b[?25l\u001b[28;56H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mB\u001b[0m\u001b[0m\u001b[28;57H\u001b[?25h\u001b[?2026l"] +[10.088767337,"o","\u001b[?2026h\u001b[?25l\u001b[28;57H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;58H\u001b[?25h\u001b[?2026l"] +[10.105044328,"o","\u001b[?2026h\u001b[?25l\u001b[28;58H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mb\u001b[0m\u001b[0m\u001b[28;59H\u001b[?25h\u001b[?2026l"] +[10.121379806,"o","\u001b[?2026h\u001b[?25l\u001b[28;59H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mTe\u001b[0m\u001b[0m\u001b[28;61H\u001b[?25h\u001b[?2026l"] +[10.137211597,"o","\u001b[?2026h\u001b[?25l\u001b[28;61H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mX\u001b[0m\u001b[0m\u001b[28;62H\u001b[?25h\u001b[?2026l"] +[10.153149588,"o","\u001b[?2026h\u001b[?25l\u001b[28;62H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;63H\u001b[?25h\u001b[?2026l"] +[10.169193917,"o","\u001b[?2026h\u001b[?25l\u001b[28;63H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mc\u001b[0m\u001b[0m\u001b[28;64H\u001b[?25h\u001b[?2026l"] +[10.185449247,"o","\u001b[?2026h\u001b[?25l\u001b[28;64H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;65H\u001b[?25h\u001b[?2026l"] +[10.202150347,"o","\u001b[?2026h\u001b[?25l\u001b[28;65H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;66H\u001b[?25h\u001b[?2026l"] +[10.217917179,"o","\u001b[?2026h\u001b[?25l\u001b[28;66H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;67H\u001b[?25h\u001b[?2026l"] +[10.234625941000001,"o","\u001b[?2026h\u001b[?25l\u001b[28;67H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;68H\u001b[?25h\u001b[?2026l"] +[10.250888869,"o","\u001b[?2026h\u001b[?25l\u001b[28;68H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;69H\u001b[?25h\u001b[?2026l"] +[10.266897825,"o","\u001b[?2026h\u001b[?25l\u001b[28;69H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[28;70H\u001b[?25h\u001b[?2026l"] +[10.283268565,"o","\u001b[?2026h\u001b[?25l\u001b[28;70H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[28;71H\u001b[?25h\u001b[?2026l"] +[10.299543127,"o","\u001b[?2026h\u001b[?25l\u001b[28;71H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[28;72H\u001b[?25h\u001b[?2026l"] +[10.315465123,"o","\u001b[?2026h\u001b[?25l\u001b[28;72H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[28;73H\u001b[?25h\u001b[?2026l"] +[10.331412099,"o","\u001b[?2026h\u001b[?25l\u001b[28;73H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m t\u001b[0m\u001b[0m\u001b[28;75H\u001b[?25h\u001b[?2026l"] +[10.349124717,"o","\u001b[?2026h\u001b[?25l\u001b[28;75H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;76H\u001b[?25h\u001b[?2026l"] +[10.368064211,"o","\u001b[?2026h\u001b[?25l\u001b[28;76H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mk\u001b[0m\u001b[0m\u001b[28;77H\u001b[?25h\u001b[?2026l"] +[10.38843236,"o","\u001b[?2026h\u001b[?25l\u001b[28;77H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mz\u001b[0m\u001b[0m\u001b[28;78H\u001b[?25h\u001b[?2026l"] +[10.407435441,"o","\u001b[?2026h\u001b[?25l\u001b[28;78H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m d\u001b[0m\u001b[0m\u001b[28;80H\u001b[?25h\u001b[?2026l"] +[10.42397839,"o","\u001b[?2026h\u001b[?25l\u001b[28;80H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[28;81H\u001b[?25h\u001b[?2026l"] +[10.439985639,"o","\u001b[?2026h\u001b[?25l\u001b[28;81H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;82H\u001b[?25h\u001b[?2026l"] +[10.456676889,"o","\u001b[?2026h\u001b[?25l\u001b[28;82H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mg\u001b[0m\u001b[0m\u001b[28;83H\u001b[?25h\u001b[?2026l"] +[10.473048347,"o","\u001b[?2026h\u001b[?25l\u001b[28;83H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[28;84H\u001b[?25h\u001b[?2026l"] +[10.489325363,"o","\u001b[?2026h\u001b[?25l\u001b[28;84H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;85H\u001b[?25h\u001b[?2026l"] +[10.505440452,"o","\u001b[?2026h\u001b[?25l\u001b[28;85H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm\u001b[0m\u001b[0m\u001b[28;86H\u001b[?25h\u001b[?2026l"] +[10.522205121,"o","\u001b[?2026h\u001b[?25l\u001b[28;86H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[28;87H\u001b[?25h\u001b[?2026l"] +[10.538913067,"o","\u001b[?2026h\u001b[?25l\u001b[28;87H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;88H\u001b[?25h\u001b[?2026l"] +[10.555933122999999,"o","\u001b[?2026h\u001b[?25l\u001b[28;88H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;89H\u001b[?25h\u001b[?2026l"] +[10.571886849,"o","\u001b[?2026h\u001b[?25l\u001b[28;89H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mx\u001b[0m\u001b[0m\u001b[28;90H\u001b[?25h\u001b[?2026l"] +[10.58798463,"o","\u001b[?2026h\u001b[?25l\u001b[28;90H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[28;91H\u001b[?25h\u001b[?2026l"] +[10.603799892,"o","\u001b[?2026h\u001b[?25l\u001b[28;91H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm\u001b[0m\u001b[0m\u001b[28;92H\u001b[?25h\u001b[?2026l"] +[10.619625981,"o","\u001b[?2026h\u001b[?25l\u001b[28;92H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[28;93H\u001b[?25h\u001b[?2026l"] +[10.636151222,"o","\u001b[?2026h\u001b[?25l\u001b[28;93H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[28;94H\u001b[?25h\u001b[?2026l"] +[10.65286565,"o","\u001b[?2026h\u001b[?25l\u001b[28;94H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;95H\u001b[?25h\u001b[?2026l"] +[10.670690837,"o","\u001b[?2026h\u001b[?25l\u001b[28;95H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms \u001b[0m\u001b[0m\u001b[28;97H\u001b[?25h\u001b[?2026l"] +[10.68831802,"o","\u001b[?2026h\u001b[?25l\u001b[28;97H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[28;98H\u001b[?25h\u001b[?2026l"] +[10.704516371,"o","\u001b[?2026h\u001b[?25l\u001b[28;98H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mf\u001b[0m\u001b[0m\u001b[28;99H\u001b[?25h\u001b[?2026l"] +[10.720675614,"o","\u001b[?2026h\u001b[?25l\u001b[28;99H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;100H\u001b[?25h\u001b[?2026l"] +[10.736899302,"o","\u001b[?2026h\u001b[?25l\u001b[28;100H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mc\u001b[0m\u001b[0m\u001b[28;101H\u001b[?25h\u001b[?2026l"] +[10.752878541,"o","\u001b[?2026h\u001b[?25l\u001b[28;101H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[28;102H\u001b[?25h\u001b[?2026l"] +[10.769433025,"o","\u001b[?2026h\u001b[?25l\u001b[28;102H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[28;103H\u001b[?25h\u001b[?2026l"] +[10.789516113,"o","\u001b[?2026h\u001b[?25l\u001b[28;103H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[28;104H\u001b[?25h\u001b[?2026l"] +[10.808530166,"o","\u001b[?2026h\u001b[?25l\u001b[28;104H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[28;105H\u001b[?25h\u001b[?2026l"] +[10.828210689,"o","\u001b[?2026h\u001b[?25l\u001b[28;105H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[28;106H\u001b[?25h\u001b[?2026l"] +[10.847114714,"o","\u001b[?2026h\u001b[?25l\u001b[28;106H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mis\u001b[0m\u001b[0m\u001b[28;108H\u001b[?25h\u001b[?2026l"] +[10.864883831,"o","\u001b[?2026h\u001b[?25l\u001b[28;108H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[28;109H\u001b[?25h\u001b[?2026l"] +[10.880692931,"o","\u001b[?2026h\u001b[?25l\u001b[28;105H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mlisti\u001b[0m\u001b[30;39H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;45H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;47H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[30;62H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[31;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[31;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[31;39H\u001b[38;2;92;156;245m\u001b[48;2;30;30;30mBuild\u001b[0m\u001b[31;44H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[31;45H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m·\u001b[0m\u001b[31;46H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[31;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mMiMo V2.5 Free\u001b[0m\u001b[31;61H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[31;62H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpenCode Zen\u001b[0m\u001b[31;74H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[32;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m╹\u001b[0m\u001b[32;37H\u001b[38;2;30;30;30m\u001b[48;2;10;10;10m▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\u001b[0m\u001b[33;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mtab \u001b[0m\u001b[33;88H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10magents\u001b[0m\u001b[33;96H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mctrl+p \u001b[0m\u001b[33;103H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mcommands\u001b[0m\u001b[36;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[37;36H\u001b[38;2;245;167;66m\u001b[48;2;10;10;10m● Tip \u001b[0m\u001b[37;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mRun \u001b[0m\u001b[37;46H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mdocker run -it --rm ghcr.io/anomalyco/opencode\u001b[0m\u001b[37;92H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m for containerized \u001b[0m\u001b[38;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10muse\u001b[0m\u001b[0m\u001b[29;44H\u001b[?25h\u001b[?2026l"] +[10.897307728,"o","\u001b[?2026h\u001b[?25l\u001b[29;44H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[29;45H\u001b[?25h\u001b[?2026l"] +[10.913763263,"o","\u001b[?2026h\u001b[?25l\u001b[29;45H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mg\u001b[0m\u001b[0m\u001b[29;46H\u001b[?25h\u001b[?2026l"] +[10.929739509000001,"o","\u001b[?2026h\u001b[?25l\u001b[29;46H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[29;47H\u001b[?25h\u001b[?2026l"] +[10.949735068,"o","\u001b[?2026h\u001b[?25l\u001b[29;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[29;48H\u001b[?25h\u001b[?2026l"] +[10.966137405,"o","\u001b[?2026h\u001b[?25l\u001b[29;48H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;49H\u001b[?25h\u001b[?2026l"] +[10.983666547,"o","\u001b[?2026h\u001b[?25l\u001b[29;49H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mtw\u001b[0m\u001b[0m\u001b[29;51H\u001b[?25h\u001b[?2026l"] +[11.000621029,"o","\u001b[?2026h\u001b[?25l\u001b[29;51H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[29;52H\u001b[?25h\u001b[?2026l"] +[11.01782169,"o","\u001b[?2026h\u001b[?25l\u001b[29;52H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;53H\u001b[?25h\u001b[?2026l"] +[11.038098722,"o","\u001b[?2026h\u001b[?25l\u001b[29;53H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mb\u001b[0m\u001b[0m\u001b[29;54H\u001b[?25h\u001b[?2026l"] +[11.058257095,"o","\u001b[?2026h\u001b[?25l\u001b[29;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[29;55H\u001b[?25h\u001b[?2026l"] +[11.074664046,"o","\u001b[?2026h\u001b[?25l\u001b[29;55H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mok\u001b[0m\u001b[0m\u001b[29;57H\u001b[?25h\u001b[?2026l"] +[11.090757796,"o","\u001b[?2026h\u001b[?25l\u001b[29;57H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;58H\u001b[?25h\u001b[?2026l"] +[11.106908656,"o","\u001b[?2026h\u001b[?25l\u001b[29;58H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[29;59H\u001b[?25h\u001b[?2026l"] +[11.125646054,"o","\u001b[?2026h\u001b[?25l\u001b[29;59H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mb\u001b[0m\u001b[0m\u001b[29;60H\u001b[?25h\u001b[?2026l"] +[11.141357046,"o","\u001b[?2026h\u001b[?25l\u001b[29;60H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[29;61H\u001b[?25h\u001b[?2026l"] +[11.157149151,"o","\u001b[?2026h\u001b[?25l\u001b[29;61H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;62H\u001b[?25h\u001b[?2026l"] +[11.173395655,"o","\u001b[?2026h\u001b[?25l\u001b[29;62H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;63H\u001b[?25h\u001b[?2026l"] +[11.190052763,"o","\u001b[?2026h\u001b[?25l\u001b[29;63H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[29;64H\u001b[?25h\u001b[?2026l"] +[11.212095644,"o","\u001b[?2026h\u001b[?25l\u001b[29;64H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mb\u001b[0m\u001b[0m\u001b[29;65H\u001b[?25h\u001b[?2026l"] +[11.223640344,"o","\u001b[?2026h\u001b[?25l\u001b[29;65H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mle\u001b[0m\u001b[0m\u001b[29;67H\u001b[?25h\u001b[?2026l"] +[11.23962341,"o","\u001b[?2026h\u001b[?25l\u001b[29;67H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[29;68H\u001b[?25h\u001b[?2026l"] +[11.260236274,"o","\u001b[?2026h\u001b[?25l\u001b[29;68H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[29;69H\u001b[?25h\u001b[?2026l"] +[11.276768334,"o","\u001b[?2026h\u001b[?25l\u001b[29;69H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;70H\u001b[?25h\u001b[?2026l"] +[11.292845481,"o","\u001b[?2026h\u001b[?25l\u001b[29;70H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;71H\u001b[?25h\u001b[?2026l"] +[11.309504524,"o","\u001b[?2026h\u001b[?25l\u001b[29;71H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[29;72H\u001b[?25h\u001b[?2026l"] +[11.328733477,"o","\u001b[?2026h\u001b[?25l\u001b[29;72H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mbl\u001b[0m\u001b[0m\u001b[29;74H\u001b[?25h\u001b[?2026l"] +[11.345188197,"o","\u001b[?2026h\u001b[?25l\u001b[29;74H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[29;75H\u001b[?25h\u001b[?2026l"] +[11.361086551,"o","\u001b[?2026h\u001b[?25l\u001b[29;75H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;76H\u001b[?25h\u001b[?2026l"] +[11.377140474,"o","\u001b[?2026h\u001b[?25l\u001b[29;76H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[29;77H\u001b[?25h\u001b[?2026l"] +[11.393709628,"o","\u001b[?2026h\u001b[?25l\u001b[29;77H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mf\u001b[0m\u001b[0m\u001b[29;78H\u001b[?25h\u001b[?2026l"] +[11.409462902,"o","\u001b[?2026h\u001b[?25l\u001b[29;78H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;79H\u001b[?25h\u001b[?2026l"] +[11.425625074,"o","\u001b[?2026h\u001b[?25l\u001b[29;79H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mc\u001b[0m\u001b[0m\u001b[29;80H\u001b[?25h\u001b[?2026l"] +[11.448146372,"o","\u001b[?2026h\u001b[?25l\u001b[29;80H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mon\u001b[0m\u001b[0m\u001b[29;82H\u001b[?25h\u001b[?2026l"] +[11.468360302,"o","\u001b[?2026h\u001b[?25l\u001b[29;82H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;83H\u001b[?25h\u001b[?2026l"] +[11.488756024,"o","\u001b[?2026h\u001b[?25l\u001b[29;83H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30men\u001b[0m\u001b[0m\u001b[29;85H\u001b[?25h\u001b[?2026l"] +[11.505334171,"o","\u001b[?2026h\u001b[?25l\u001b[29;85H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;86H\u001b[?25h\u001b[?2026l"] +[11.521325766,"o","\u001b[?2026h\u001b[?25l\u001b[29;86H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[29;87H\u001b[?25h\u001b[?2026l"] +[11.537354381,"o","\u001b[?2026h\u001b[?25l\u001b[29;87H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m,\u001b[0m\u001b[0m\u001b[29;88H\u001b[?25h\u001b[?2026l"] +[11.553481928,"o","\u001b[?2026h\u001b[?25l\u001b[29;88H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;89H\u001b[?25h\u001b[?2026l"] +[11.569550087,"o","\u001b[?2026h\u001b[?25l\u001b[29;89H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ma\u001b[0m\u001b[0m\u001b[29;90H\u001b[?25h\u001b[?2026l"] +[11.585598366,"o","\u001b[?2026h\u001b[?25l\u001b[29;90H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mn\u001b[0m\u001b[0m\u001b[29;91H\u001b[?25h\u001b[?2026l"] +[11.601652177,"o","\u001b[?2026h\u001b[?25l\u001b[29;91H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[29;92H\u001b[?25h\u001b[?2026l"] +[11.617799273,"o","\u001b[?2026h\u001b[?25l\u001b[29;92H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;93H\u001b[?25h\u001b[?2026l"] +[11.633531559,"o","\u001b[?2026h\u001b[?25l\u001b[29;93H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[29;94H\u001b[?25h\u001b[?2026l"] +[11.651685148,"o","\u001b[?2026h\u001b[?25l\u001b[29;94H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mis\u001b[0m\u001b[0m\u001b[29;96H\u001b[?25h\u001b[?2026l"] +[11.669696378,"o","\u001b[?2026h\u001b[?25l\u001b[29;96H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;97H\u001b[?25h\u001b[?2026l"] +[11.686143903,"o","\u001b[?2026h\u001b[?25l\u001b[29;97H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[0m\u001b[29;98H\u001b[?25h\u001b[?2026l"] +[11.70222538,"o","\u001b[?2026h\u001b[?25l\u001b[29;98H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m.\u001b[0m\u001b[0m\u001b[29;99H\u001b[?25h\u001b[?2026l"] +[11.71838617,"o","\u001b[?2026h\u001b[?25l\u001b[29;99H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;100H\u001b[?25h\u001b[?2026l"] +[11.734510281,"o","\u001b[?2026h\u001b[?25l\u001b[29;100H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mC\u001b[0m\u001b[0m\u001b[29;101H\u001b[?25h\u001b[?2026l"] +[11.750544012,"o","\u001b[?2026h\u001b[?25l\u001b[29;101H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[29;102H\u001b[?25h\u001b[?2026l"] +[11.770725414,"o","\u001b[?2026h\u001b[?25l\u001b[29;102H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm\u001b[0m\u001b[0m\u001b[29;103H\u001b[?25h\u001b[?2026l"] +[11.790511114,"o","\u001b[?2026h\u001b[?25l\u001b[29;103H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mp\u001b[0m\u001b[0m\u001b[29;104H\u001b[?25h\u001b[?2026l"] +[11.806982446,"o","\u001b[?2026h\u001b[?25l\u001b[29;104H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mil\u001b[0m\u001b[0m\u001b[29;106H\u001b[?25h\u001b[?2026l"] +[11.823587574,"o","\u001b[?2026h\u001b[?25l\u001b[29;106H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[29;107H\u001b[?25h\u001b[?2026l"] +[11.839906764,"o","\u001b[?2026h\u001b[?25l\u001b[29;107H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;108H\u001b[?25h\u001b[?2026l"] +[11.855821649,"o","\u001b[?2026h\u001b[?25l\u001b[29;108H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mw\u001b[0m\u001b[0m\u001b[29;109H\u001b[?25h\u001b[?2026l"] +[11.871745495,"o","\u001b[?2026h\u001b[?25l\u001b[18;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;57H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;59H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;61H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;62H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;64H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;67H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;69H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;79H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▄\u001b[0m\u001b[18;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[18;92H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;55H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[19;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[19;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[19;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[19;66H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[19;67H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[19;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[19;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▄\u001b[0m\u001b[19;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[19;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[19;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀ \u001b[0m\u001b[19;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[19;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[19;81H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[19;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[19;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[19;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[19;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[19;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[19;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[19;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[19;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[19;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[19;92H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;55H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[20;56H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[20;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;60H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[20;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;65H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m▀▀▀\u001b[0m\u001b[20;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;70H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0"] +[11.87175852,"o","m\u001b[20;72H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[20;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;75H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[20;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;80H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[20;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;85H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[20;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[20;90H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m▀▀▀\u001b[0m\u001b[21;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀▀\u001b[0m\u001b[21;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀\u001b[0m\u001b[21;64H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀▀\u001b[0m\u001b[21;69H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;70H\u001b[38;2;40;40;40m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[21;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀▀▀\u001b[0m\u001b[21;79H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀▀▀\u001b[0m\u001b[21;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[22;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[24;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[25;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mtes\" demonstrating all capabilities: Mermaid sequence diagra, \u001b[0m\u001b[26;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mGraphviz archi\u001b[0m\u001b[26;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mecture digr\u001b[0m\u001b[26;66H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mph, D2 pipeline \u001b[0m\u001b[26;83H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30miagram, math equations \u001b[0m\u001b[27;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mwith cross-refs, BibTeX citations, tikz diagr\u001b[0m\u001b[27;85H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mm, exa\u001b[0m\u001b[27;92H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mples of code \u001b[0m\u001b[27;105H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[28;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[28;41H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mstings, two booktabs tables, table of\u001b[0m\u001b[28;79H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mcontents, and \u001b[0m\u001b[28;94H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[28;96H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mts.\u001b[0m\u001b[28;100H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mC\u001b[0m\u001b[28;102H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mmpile \u001b[0m\u001b[29;39H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mw\u001b[0m\u001b[29;41H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;41H\u001b[?25h\u001b[?2026l"] +[11.888336044,"o","\u001b[?2026h\u001b[?25l\u001b[29;41H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;42H\u001b[?25h\u001b[?2026l"] +[11.910531944,"o","\u001b[?2026h\u001b[?25l\u001b[29;42H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mh \u001b[0m\u001b[0m\u001b[29;44H\u001b[?25h\u001b[?2026l"] +[11.926859619,"o","\u001b[?2026h\u001b[?25l\u001b[29;44H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[29;45H\u001b[?25h\u001b[?2026l"] +[11.942819826000001,"o","\u001b[?2026h\u001b[?25l\u001b[29;45H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[29;46H\u001b[?25h\u001b[?2026l"] +[11.958869358,"o","\u001b[?2026h\u001b[?25l\u001b[29;46H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mx\u001b[0m\u001b[0m\u001b[29;47H\u001b[?25h\u001b[?2026l"] +[11.975064322,"o","\u001b[?2026h\u001b[?25l\u001b[29;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mf\u001b[0m\u001b[0m\u001b[29;48H\u001b[?25h\u001b[?2026l"] +[11.990887615,"o","\u001b[?2026h\u001b[?25l\u001b[29;48H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mo\u001b[0m\u001b[0m\u001b[29;49H\u001b[?25h\u001b[?2026l"] +[12.007348368,"o","\u001b[?2026h\u001b[?25l\u001b[29;49H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mr\u001b[0m\u001b[0m\u001b[29;50H\u001b[?25h\u001b[?2026l"] +[12.023249827,"o","\u001b[?2026h\u001b[?25l\u001b[29;50H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mg\u001b[0m\u001b[0m\u001b[29;51H\u001b[?25h\u001b[?2026l"] +[12.039271768,"o","\u001b[?2026h\u001b[?25l\u001b[29;51H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[29;52H\u001b[?25h\u001b[?2026l"] +[12.05541549,"o","\u001b[?2026h\u001b[?25l\u001b[29;52H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m \u001b[0m\u001b[0m\u001b[29;53H\u001b[?25h\u001b[?2026l"] +[12.071979261,"o","\u001b[?2026h\u001b[?25l\u001b[29;53H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mb\u001b[0m\u001b[0m\u001b[29;54H\u001b[?25h\u001b[?2026l"] +[12.093140625,"o","\u001b[?2026h\u001b[?25l\u001b[29;54H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mui\u001b[0m\u001b[0m\u001b[29;56H\u001b[?25h\u001b[?2026l"] +[12.108898637,"o","\u001b[?2026h\u001b[?25l\u001b[29;56H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ml\u001b[0m\u001b[0m\u001b[29;57H\u001b[?25h\u001b[?2026l"] +[12.124901081,"o","\u001b[?2026h\u001b[?25l\u001b[29;57H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30md\u001b[0m\u001b[0m\u001b[29;58H\u001b[?25h\u001b[?2026l"] +[12.14090112,"o","\u001b[?2026h\u001b[?25l\u001b[29;58H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m.\u001b[0m\u001b[0m\u001b[29;59H\u001b[?25h\u001b[?2026l"] +[12.352289975,"o","\u001b[?2026h\u001b[?25l\u001b[18;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[18;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;57H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;59H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;61H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;62H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;64H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;67H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;69H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;79H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;80H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▄\u001b[0m\u001b[20;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[20;92H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;55H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;56H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[21;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;65H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;66H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;67H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[21;70H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[21;71H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▄\u001b[0m\u001b[21;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;75H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[21;77H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀ \u001b[0m\u001b[21;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;81H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[21;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[21;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[21;92H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;54H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;55H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;56H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;57H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;58H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;60H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;62H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;63H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;64H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m�"] +[12.352354868,"o","�\u001b[0m\u001b[22;65H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m▀▀▀\u001b[0m\u001b[22;68H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;69H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;70H\u001b[38;2;128;128;128m\u001b[48;2;40;40;40m \u001b[0m\u001b[22;72H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[22;74H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;75H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[22;78H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;79H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;80H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[22;82H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;83H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;84H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;85H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m \u001b[0m\u001b[22;87H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[22;89H\u001b[38;2;238;238;238m\u001b[48;2;238;238;238m\u001b[1m▀\u001b[0m\u001b[22;90H\u001b[38;2;238;238;238m\u001b[48;2;67;67;67m\u001b[1m▀▀▀\u001b[0m\u001b[23;54H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀▀ \u001b[0m\u001b[23;59H\u001b[38;2;128;128;128m\u001b[48;2;128;128;128m▀\u001b[0m\u001b[23;60H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀▀▀ ▀▀▀▀ ▀\u001b[0m\u001b[23;70H\u001b[38;2;40;40;40m\u001b[48;2;10;10;10m▀▀\u001b[0m\u001b[23;72H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m▀\u001b[0m\u001b[23;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀▀▀ ▀▀▀▀ \u001b[0m\u001b[23;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;85H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;87H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;88H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m \u001b[0m\u001b[23;89H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;90H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀\u001b[0m\u001b[23;91H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m\u001b[1m▀▀\u001b[0m\u001b[24;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[26;39H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[27;39H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mAsk anything... \"Fix broken tests\"\u001b[0m\u001b[27;73H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[28;39H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;39H\u001b[38;2;92;156;245m\u001b[48;2;30;30;30mBuild\u001b[0m\u001b[29;44H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;45H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m·\u001b[0m\u001b[29;46H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[29;47H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mMiMo V2.5 Free\u001b[0m\u001b[29;62H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpenCode Zen\u001b[0m\u001b[30;36H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m╹\u001b[0m\u001b[30;37H\u001b[38;2;30;30;30m\u001b[48;2;10;10;10m▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\u001b[0m\u001b[31;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[31;84H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mtab \u001b[0m\u001b[31;88H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10magents\u001b[0m\u001b[31;94H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[31;96H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mctrl+p \u001b[0m\u001b[31;103H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mcommands\u001b[0m\u001b[32;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[33;84H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[33;96H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[35;36H\u001b[38;2;245;167;66m\u001b[48;2;10;10;10m● Tip \u001b[0m\u001b[35;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mRun \u001b[0m\u001b[35;46H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mdocker run -it --rm ghcr.io/anomalyco/opencode\u001b[0m\u001b[35;92H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m for containerized \u001b[0m\u001b[36;42H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10muse\u001b[0m\u001b[37;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;42H\u001b[38;2;25"] +[12.352392383,"o","5;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[0m\u001b[27;39H\u001b[?25h\u001b[?2026l"] +[12.426528682,"o","\u001b]0;OpenCode\u0007"] +[12.4428589,"o","\u001b[?2026h\u001b[?25l\u001b[1;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[1;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[1;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[2;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[2;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[2;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtes\" demonstrating all capabilities: Mermaid sequence diagra, Graphviz architecture digraph, \u001b[0m\u001b[2;99H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[2;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[2;105H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1mNew session - 2026-07-07T13:55:09.\u001b[0m\u001b[2;139H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[2;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[2;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[3;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[3;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[3;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mD2 pipeline diagram, math equations with cross-refs, BibTeX citations, tikz diagram, examples \u001b[0m\u001b[3;100H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[3;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[3;105H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1m012Z\u001b[0m\u001b[3;109H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[3;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[3;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[4;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[4;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[4;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mof code listings, two booktabs tables, table of contents, and lists. Compile with texforge \u001b[0m\u001b[4;97H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[4;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[4;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[4;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[5;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[5;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[5;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mbuild.\u001b[0m\u001b[5;12H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[5;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[5;105H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1mContext\u001b[0m\u001b[5;112H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[5;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[5;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[6;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[6;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[6;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[6;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m0 tokens\u001b[0m\u001b[6;113H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[6;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[6;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[7;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[7;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m0% used\u001b[0m\u001b[7;112H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[7;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[7;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[8;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[8;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[8;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[8;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[8;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m$0.00 spent\u001b[0m\u001b[8;116H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[8;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[8;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[9;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[9;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[9;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[10;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[10;105H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m▼\u001b[0m\u001b[10;106H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[10;107H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1mMCP\u001b[0m\u001b[10;110H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[10"] +[12.442885127,"o",";142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[10;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[11;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[11;105H\u001b[38;2;127;216;143m\u001b[48;2;20;20;20m•\u001b[0m\u001b[11;106H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[11;107H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mcanopy \u001b[0m\u001b[11;114H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mConnected\u001b[0m\u001b[11;123H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[11;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[11;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[12;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[12;105H\u001b[38;2;127;216;143m\u001b[48;2;20;20;20m•\u001b[0m\u001b[12;106H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[12;107H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mfetch \u001b[0m\u001b[12;113H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mConnected\u001b[0m\u001b[12;122H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[12;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[12;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[13;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[13;105H\u001b[38;2;127;216;143m\u001b[48;2;20;20;20m•\u001b[0m\u001b[13;106H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[13;107H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mfilesystem \u001b[0m\u001b[13;118H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mConnected\u001b[0m\u001b[13;127H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[13;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[13;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[14;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[14;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[14;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[15;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[15;105H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1mLSP\u001b[0m\u001b[15;108H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[15;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[15;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[16;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mLSPs are disabled\u001b[0m\u001b[16;122H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[16;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[17;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[17;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[18;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[18;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[19;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[19;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[20;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[20;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[21;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[21;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[21;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[22;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[22;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[22;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[23;54H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;74H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[23;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[23;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[24;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[24;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[24;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[25;103H\u001b[38;2;255;25"] +[12.442891435,"o","5;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[25;142H\u001b[38;2;96;96;96m\u001b[48;2;10;10;10m█\u001b[0m\u001b[25;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[26;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[26;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[26;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[27;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[27;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[28;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[28;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[29;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[29;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[30;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[30;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[31;84H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[31;96H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[31;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[32;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[33;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[34;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[34;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[35;36H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[35;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[36;42H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[36;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[36;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[37;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[37;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[38;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[38;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[39;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[40;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[40;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[41;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[41;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[42;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[42;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[43;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[43;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[44;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[44;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[45;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[45;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[46;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[46;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[47;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[47;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[48;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[48;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m "] +[12.442901199,"o"," \u001b[0m\u001b[48;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[48;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[49;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[49;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[49;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[49;143H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[50;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[50;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[50;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[51;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[51;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[51;6H\u001b[38;2;92;156;245m\u001b[48;2;30;30;30mBuild\u001b[0m\u001b[51;11H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[51;12H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m·\u001b[0m\u001b[51;13H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[51;14H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mMiMo V2.5 Free\u001b[0m\u001b[51;28H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[51;29H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpenCode Zen\u001b[0m\u001b[51;41H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[51;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[51;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m/\u001b[0m\u001b[51;106H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m~\u001b[0m\u001b[51;107H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[52;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m╹\u001b[0m\u001b[52;4H\u001b[38;2;30;30;30m\u001b[48;2;10;10;10m▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\u001b[0m\u001b[52;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[53;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;12H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[53;14H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mesc \u001b[0m\u001b[53;18H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10minterrupt\u001b[0m\u001b[53;74H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mtab \u001b[0m\u001b[53;78H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10magents\u001b[0m\u001b[53;86H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mctrl+p \u001b[0m\u001b[53;93H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mcommands\u001b[0m\u001b[53;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[53;105H\u001b[38;2;127;216;143m\u001b[48;2;20;20;20m•\u001b[0m\u001b[53;106H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m \u001b[0m\u001b[53;107H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m\u001b[1mOpen\u001b[0m\u001b[53;111H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1mCode\u001b[0m\u001b[53;115H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m 1.15.13\u001b[0m\u001b[53;123H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[54;103H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.457242478,"o","\u001b[?2026h\u001b[?25l\u001b[1;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[2;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[3;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtes\" d\u001b[0m\u001b[3;13H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mmo\u001b[0m\u001b[3;16H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mstrating all capabilitie\u001b[0m\u001b[3;41H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m: Mermaid \u001b[0m\u001b[3;52H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mequence diagra, Graphviz\u001b[0m\u001b[3;77H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20marchitecture digra\u001b[0m\u001b[3;96H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mh, \u001b[0m\u001b[3;99H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[3;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[4;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mD2\u001b[0m\u001b[4;9H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mpip\u001b[0m\u001b[4;13H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mline diagram, math equations with cross-refs, BibTeX citations, tikz diagram, examples \u001b[0m\u001b[4;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[5;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mof code listings, two booktabs tables, table of contents, and lists. Compile with texforge \u001b[0m\u001b[5;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[6;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mbuild.\u001b[0m\u001b[6;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[7;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[7;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[7;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[8;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[9;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[9;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[9;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[9;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[10;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[11;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[12;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[13;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[14;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[15;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[21;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[22;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[23;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[24;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[25;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[26;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[34;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[36;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[37;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[38;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[40;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[41;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[42;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[43;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[44;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[45;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[46;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[47;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[48;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[49;142H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.473241113,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.48725357,"o","\u001b]0;OpenCode\u0007"] +[12.490250037,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[9;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[9;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.507061996000001,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.542465366,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.585375627,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.628192228,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.671211911,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.71395133,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.799934853,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.843582272999999,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.887037093,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.929417312,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[12.972444272,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.016362246,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.059513435,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.103005031,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.145809795,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.186759852,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.226713469,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.270196825,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.312494332,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.356273159,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.401049402,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.488239676,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.532239821,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.575963576,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.619855821,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.663964949,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.707053613,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.750591383,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.793760667,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.837075681,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.881146837,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.924924337,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[13.967561241,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.010819926,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.053797086,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;43;69;105m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.096848591,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.139511595,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;41;65;98m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.182589011,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.22558942,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;39;61;92m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.269059676,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;37;59;88m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.311701263,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.354915362,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;35;55;82m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.397988468,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;34;52;78m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.437942611,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;51;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.480944758,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;32;48;72m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.524101404,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.567071273,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;44;65m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.609579826000001,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;28;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.652791241,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;27;40;59m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.695532608,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;26;38;55m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.738537088,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.7819413,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.825415693,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.868243142,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.911912682,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[14.956206795,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.000181961,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.044478881,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.131367818,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.174494309,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.218194811,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.261446149,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.304304845,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.347664057,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.391049706,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.434447691,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.478163423,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.521028798,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.564682233,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.6081406,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.651449313,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.694760269,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.737926627,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.82475647,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.867761273,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.910880274,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[15.953605806,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.00067844,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠋\u001b[0m\u001b[9;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[9;16H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[13;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[13;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[13;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[13;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.022637747,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.056684595,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.07817464,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠙\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.100068677,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.120890694,"o","\u001b[?2026h\u001b[?25l\u001b[11;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a LaTeX document demonstrating various\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.137131215,"o","\u001b[?2026h\u001b[?25l\u001b[11;59H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m capabilities.\u001b[0m\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.153223488,"o","\u001b[?2026h\u001b[?25l\u001b[11;73H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m Let me first load\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.169792535,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠹\u001b[0m\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.186022877,"o","\u001b[?2026h\u001b[?25l\u001b[11;91H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m the \u001b[0m\u001b[12;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mtexforge skill\u001b[0m\u001b[13;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[14;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[14;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[14;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[14;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.203195054,"o","\u001b[?2026h\u001b[?25l\u001b[12;20H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m to understand how to\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.218910401,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.241503858,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠸\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.262272319,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.29915741,"o","\u001b[?2026h\u001b[?25l\u001b[12;41H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m use texforge properly.\u001b[0m\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.324855853,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠼\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.340637828,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.365355689,"o","\u001b[?2026h\u001b[?25l\u001b[9;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 385ms\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.382124128,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;43;69;105m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.400951983,"o","\u001b[?2026h\u001b[?25l\u001b[13;6H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m~ Loading skill...\u001b[0m\u001b[14;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[15;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[15;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[15;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[15;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.417813623,"o","\u001b[?2026h\u001b[?25l\u001b[13;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[14;6H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m~ Loading skill...\u001b[0m\u001b[15;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[16;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[16;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[16;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[16;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.433285035,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.449291178,"o","\u001b[?2026h\u001b[?25l\u001b[14;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[14;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[14;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.466795586,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;41;65;98m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.510038633,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.553748119,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;39;61;92m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.581435399,"o","\u001b[?2026h\u001b[?25l\u001b[6;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m26,590 tokens\u001b[0m\u001b[7;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m13% used\u001b[0m\u001b[16;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[16;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[16;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[16;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[53;73H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m26.6K (13%)\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.598344168,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;37;59;88m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.634661586,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.676968898,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;35;55;82m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.72139269,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;34;52;78m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.763423985,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;51;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.807489451,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;32;48;72m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.850619514,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.893551097,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;44;65m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.936025338,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;28;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[16.97929939,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;27;40;59m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.022834511,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;26;38;55m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.066344224,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.109695021,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.153176092,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.19592304,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.239203684,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.282417628,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.326176067,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.369300512,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.458649135,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.501760344,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.54506395,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.588373627,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.632098399,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.67528966,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.71826991,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.761867585,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.804987612,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.848344399,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.89177466,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.935073564,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[17.978201173,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.021762378,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.064546557,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.15113521,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.193179707,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.236237291,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.279723928,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.322269604,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.365882907,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.408261616,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.448356237,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.490796144,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.534378044,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.577761385,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.621464608,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.663938595,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.706964927,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;43;69;105m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.750281797,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.792736255,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;41;65;98m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.83609189,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.878998602,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;39;61;92m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.923165617,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;37;59;88m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[18.966711371,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.013397206,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;35;55;82m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.057524887,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;34;52;78m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.10122393,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;51;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.145183376,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;32;48;72m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.188700677,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.232749925,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;44;65m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.276360925,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;28;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.320218882,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;27;40;59m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.363818681,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;26;38;55m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.407849056,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.451403585,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.495265093,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.538284859,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.58164763,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.624326013,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.66759953,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.710830933,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.795403154,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.838871702,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.881260628,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.923995252,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[19.967322626,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.00967514,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.051812792,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.094499522,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.137572553,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.180671721,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.225147036,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.268099802,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.310895919,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.353884183,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.39705081,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.483748817,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.52786247,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.571985194,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.616144499,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.659517086,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.703306326,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.745761221,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.788962926,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.832394066,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.875197744,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.918518467,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[20.961101978,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.00476656,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.047616703,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;43;69;105m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.06988877,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠋\u001b[0m\u001b[16;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[16;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[16;16H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[20;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[20;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.091337406,"o","\u001b[?2026h\u001b[?25l\u001b[18;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand tex\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.107423681,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.12389502,"o","\u001b[?2026h\u001b[?25l\u001b[18;26H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mforge.\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.141104558,"o","\u001b[?2026h\u001b[?25l\u001b[18;32H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m The\u001b[0m\u001b[53;4H\u001b[38;2;41;65;98m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.156612785,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠙\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.176475057,"o","\u001b[?2026h\u001b[?25l\u001b[18;36H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m user wants a comprehensive\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.192275495,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.209444948,"o","\u001b[?2026h\u001b[?25l\u001b[18;63H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m LaTeX document demonstrating\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.225253261,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;39;61;92m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.24165003,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠹\u001b[0m\u001b[18;92H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m many\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.25756951,"o","\u001b[?2026h\u001b[?25l\u001b[18;97H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilities. Let me\u001b[0m\u001b[20;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;9H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[21;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[21;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[53;4H\u001b[38;2;37;59;88m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.290714433,"o","\u001b[?2026h\u001b[?25l\u001b[19;26H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m create a project\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.307486924,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.323852331,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠸\u001b[0m\u001b[19;43H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m and\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.340483741,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;35;55;82m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.383529255,"o","\u001b[?2026h\u001b[?25l\u001b[19;47H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m write\u001b[0m\u001b[53;4H\u001b[38;2;34;52;78m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.399521359,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠼\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.417531435,"o","\u001b[?2026h\u001b[?25l\u001b[19;53H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m the document.\u001b[0m\u001b[21;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create\u001b[0m\u001b[21;19H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[23;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[23;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.433348811,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;51;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.466574218,"o","\u001b[?2026h\u001b[?25l\u001b[21;19H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m a\u001b[0m\u001b[53;4H\u001b[38;2;32;48;72m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.482333043,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠴\u001b[0m\u001b[21;21H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m new tex\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.515367185,"o","\u001b[?2026h\u001b[?25l\u001b[21;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mforge project,\u001b[0m\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.531142903,"o","\u001b[?2026h\u001b[?25l\u001b[21;43H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m then write the main\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.547229203,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;44;65m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.563761302,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠦\u001b[0m\u001b[21;63H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m.tex with all the\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.587589483,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;28;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.639944073,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠧\u001b[0m\u001b[21;80H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m requested features.\u001b[0m\u001b[53;4H\u001b[38;2;27;40;59m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.677736091,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;26;38;55m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.721739663,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.737654007,"o","\u001b[?2026h\u001b[?25l\u001b[16;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.75501103,"o","\u001b[?2026h\u001b[?25l\u001b[22;6H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m~ Updating todos...\u001b[0m\u001b[23;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;9H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[24;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[24;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.771894774,"o","\u001b[?2026h\u001b[?25l\u001b[22;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;6H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m~ Updating todos...\u001b[0m\u001b[24;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;9H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[25;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[25;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.807007761,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.850813982,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.89519037,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.938909831,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[21.983696112,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.026233171,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.11396016,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.157700792,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.201432861,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.245097566,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.288854094,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.331494133,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.375167493,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.418976636,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.459043652,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.502488147,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.545534321,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.59008395,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.633795659,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.677495639,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.720604562,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.737587908,"o","\u001b[?2026h\u001b[?25l\u001b[18;105H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m▼\u001b[0m\u001b[18;107H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m\u001b[1mTodo\u001b[0m\u001b[19;105H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[19;109H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[20;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[20;109H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all \u001b[0m\u001b[21;109H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mrequested features\u001b[0m\u001b[22;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[22;109H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mCreate bib file with example \u001b[0m\u001b[23;109H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mentries\u001b[0m\u001b[24;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create sections/body.tex\u001b[0m\u001b[25;105H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Run texforge build\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.754001082,"o","\u001b[?2026h\u001b[?25l\u001b[23;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[23;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[24;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[24;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[24;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[24;13H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[25;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[25;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[26;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[26;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[26;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[26;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[26;33H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[27;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[27;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[27;52H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[28;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[28;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[29;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[29;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mCreate sections/body.tex\u001b[0m\u001b[29;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[30;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[30;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[30;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[31;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[33;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[33;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.797093494,"o","\u001b[?2026h\u001b[?25l\u001b[6;106H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m8\u001b[0m\u001b[6;109H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m46\u001b[0m\u001b[7;106H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m4\u001b[0m\u001b[53;74H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m8\u001b[0m\u001b[53;76H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m5\u001b[0m\u001b[53;81H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m4\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.820293731,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.845162496,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.889506016,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.931921647,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[22.974304609,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.018926654,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.062068743,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.10567553,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.149509748,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.193405264,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.236980491,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.280367816,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.323317493,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.366930977,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;43;69;105m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.40953621,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.453390345,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;41;65;98m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.497313996,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.540408747,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;39;61;92m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.583237436,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;37;59;88m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.626645833,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.670155815,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;35;55;82m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.713207666,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;34;52;78m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.75618647,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;51;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.801287455,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;32;48;72m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.844062437,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.887420021,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;44;65m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.930472038,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;28;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[23.973019928,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;27;40;59m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.016289417,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;26;38;55m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.058782834,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.102770539,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.145561212,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.189155963,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.232520123,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.27678901,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.319473294,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.36283215,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.450136946,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.49350428,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.536782222,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.579622307,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.623708628,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.667806727,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.710902068,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.754104248,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.796949846,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.841436306,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.886067363,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.929419505,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[24.971628347,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.011740726,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.031589792,"o","\u001b[?2026h\u001b[?25l\u001b[33;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠋\u001b[0m\u001b[33;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[33;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[33;16H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[37;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[37;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[37;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.052267025,"o","\u001b[?2026h\u001b[?25l\u001b[35;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.072768058,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.105008541,"o","\u001b[?2026h\u001b[?25l\u001b[35;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m user wants a comprehensive LaTeX document demonstrating\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.121076673,"o","\u001b[?2026h\u001b[?25l\u001b[33;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠙\u001b[0m\u001b[35;65H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m various\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.137235218,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.153467785,"o","\u001b[?2026h\u001b[?25l\u001b[35;73H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m capabilities. Let me\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.185466817,"o","\u001b[?2026h\u001b[?25l\u001b[35;94H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m \u001b[0m\u001b[36;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcreate the\u001b[0m\u001b[37;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[37;9H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[38;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[38;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.202681867,"o","\u001b[?2026h\u001b[?25l\u001b[33;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠹\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.219221532,"o","\u001b[?2026h\u001b[?25l\u001b[36;16H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m tex\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.235234414,"o","\u001b[?2026h\u001b[?25l\u001b[36;20H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mforge project first.\u001b[0m\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.261491572,"o","\u001b[?2026h\u001b[?25l\u001b[33;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.27834678,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.297023766,"o","\u001b[?2026h\u001b[?25l\u001b[37;6H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m~ Writing command...\u001b[0m\u001b[38;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;9H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[39;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[39;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[39;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.313889591,"o","\u001b[?2026h\u001b[?25l\u001b[37;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;6H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10m~ Writing command...\u001b[0m\u001b[39;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[39;9H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[40;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[40;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[40;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.357082846,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.400957407,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.444654523,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.490317048,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.533223276,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.576621447,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.599721796,"o","\u001b[?2026h\u001b[?25l\u001b[38;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m$\u001b[0m\u001b[38;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mtexforge new tes-demo\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.641582888,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.658451871,"o","\u001b[?2026h\u001b[?25l\u001b[38;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[38;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[39;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m⠋\u001b[0m\u001b[39;7H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;8H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mCreate new texforge project\u001b[0m\u001b[39;35H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[40;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[40;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[41;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[41;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[41;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[41;29H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[42;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[42;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[44;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[44;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[44;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.675902552,"o","\u001b[?2026h\u001b[?25l\u001b[1;3H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[1;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[1;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mof code listings, two booktabs tables, table of contents, and lists. Compile with texforge \u001b[0m\u001b[1;97H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[2;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mbuild.\u001b[0m\u001b[3;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[4;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[5;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[5;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 385ms\u001b[0m\u001b[5;20H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[6;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[7;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[7;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a LaTeX document demonstrating various capabilities. Let me first load the \u001b[0m\u001b[7;96H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mtexforge skill to understand how to use texforge properly.\u001b[0m\u001b[9;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[10;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[10;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[11;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[12;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[12;20H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[14;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[15;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilities. Let me create a project and write the document.\u001b[0m\u001b[16;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[17;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[18;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[19;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[20;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[20;13H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[21;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[21;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[22;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[22;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[22;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[22;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[22;33H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[23;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[23;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[24;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[\u001b[0m\u001b[24;8H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m] Create bib file with example entries\u001b[0m\u001b[25;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[25;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mCreate sections/body.tex\u001b[0m\u001b[26;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[26;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[26;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m "] +[25.675919815,"o"," \u001b[0m\u001b[29;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[29;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[29;19H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[30;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[31;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[31;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[31;95H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[32;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcreate the texforge project first.\u001b[0m\u001b[33;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[34;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[34;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[35;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[35;35H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[36;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[36;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[37;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[37;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[37;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[37;29H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[40;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[41;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[42;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[43;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[43;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[43;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m texforge build\u001b[0m\u001b[43;22H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[44;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[44;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[46;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m▣ \u001b[0m\u001b[46;9H\u001b[38;2;238;238;238m\u001b[48;2;10;10;10mBuild\u001b[0m\u001b[46;14H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m · MiMo V2.5 Free\u001b[0m\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.693056607,"o","\u001b[?2026h\u001b[?25l\u001b[6;108H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m764\u001b[0m\u001b[53;76H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m8\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.71203792,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;43;69;105m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.755568079,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.800594346,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;41;65;98m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.843918447,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.887342733,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;39;61;92m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.930964077,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;37;59;88m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[25.974225518,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.017195533,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;35;55;82m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.060332452,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;34;52;78m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.10363996,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;51;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.147509326,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;32;48;72m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.190281432,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.233551366,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;44;65m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.277704008,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;28;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.321301465,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;27;40;59m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.364990384,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;26;38;55m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.40912582,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.453085261,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;30;45;66m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.495325846,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;35;54;81m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.53893023,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;40;63;95m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.582332742,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.625338037,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;49;80;122m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.668673486,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;54;89;137m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.712149629,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.799653695,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;55;91;140m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.842658951,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;51;84;129m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.885574297,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.928735055,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;44;70;107m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[26.971954717,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;40;64;97m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.015173672,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.058605398,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.102217988,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;29;43;63m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.145960916,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[53;10H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.18949666,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;31;47;69m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[53;9H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.23288056,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;36;57;86m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[53;8H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.27611958,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;42;67;101m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[53;7H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.319563828,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[53;6H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.363063222,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[53;5H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;11H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.406090421,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;92;156;245m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;10H\u001b[38;2;59;98;151m\u001b[48;2;10;10;10m⬝⬝\u001b[0m\u001b[0m\u001b[49;6H\u001b[?25h\u001b[?2026l"] +[27.496891064,"o","\u001b[?2026h\u001b[?25l\u001b[38;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[38;4H\u001b[38;2;255;255;255m\u001b[48;2;250;178;131m \u001b[0m\u001b[38;5H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131m/agents \u001b[0m\u001b[38;23H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131mSwitch agent\u001b[0m\u001b[38;35H\u001b[38;2;255;255;255m\u001b[48;2;250;178;131m \u001b[0m\u001b[38;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[39;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[39;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[39;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/compact \u001b[0m\u001b[39;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mCompact session\u001b[0m\u001b[39;38H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[39;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[40;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[40;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[40;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/connect \u001b[0m\u001b[40;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mConnect provider\u001b[0m\u001b[40;39H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[40;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[41;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[41;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[41;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/copy \u001b[0m\u001b[41;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mCopy session transcript\u001b[0m\u001b[41;46H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[41;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[42;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[42;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[42;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/diff \u001b[0m\u001b[42;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpen diff viewer\u001b[0m\u001b[42;39H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[42;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[43;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[43;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[43;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/editor \u001b[0m\u001b[43;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpen editor\u001b[0m\u001b[43;34H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[43;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[44;3H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[44;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[44;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/exit \u001b[0m\u001b[44;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mExit the app\u001b[0m\u001b[44;35H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[44;100H\u001b[38;2;72;72;72m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[45;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[45;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[45;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/export \u001b[0m\u001b[45;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mExport session transcript\u001b[0m\u001b[45;48H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[45;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[46;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[46;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[46;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/fetch:fetch:mcp \u001b[0m\u001b[46;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mFetch a URL and extract its contents as markdown\u001b[0m\u001b[46;71H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[46;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[47;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[47;4H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[47;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/fork \u001b[0m\u001b[47;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mFork session\u001b[0m\u001b[47;35H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[47;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[49;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/\u001b[0m\u001b[0m\u001b[49;7H\u001b[?25h\u001b[?2026l"] +[27.512319111,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;97;162;231m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;9H\u001b[38;2;58;95;147m\u001b[48;2;10;10;10m⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;7H\u001b[?25h\u001b[?2026l"] +[27.541596243,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;63;105;163m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;8H\u001b[38;2;57;94;145m\u001b[48;2;10;10;10m⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;7H\u001b[?25h\u001b[?2026l"] +[27.563606404,"o","\u001b[?2026h\u001b[?25l\u001b[1;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[1;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 385ms\u001b[0m\u001b[1;20H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[3;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[3;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a LaTeX document demonstrating various capabilities. Let me first load the \u001b[0m\u001b[3;96H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[4;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mtexforge skill to understand how to use texforge properly.\u001b[0m\u001b[5;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[6;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[6;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[7;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[8;20H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[10;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[11;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilities. Let me create a project and write the document.\u001b[0m\u001b[12;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[13;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[14;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[15;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[15;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[16;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[16;13H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[17;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[18;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[18;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[18;33H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[19;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[20;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[\u001b[0m\u001b[20;8H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m] Create bib file with example entries\u001b[0m\u001b[21;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[21;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mCreate sections/body.tex\u001b[0m\u001b[22;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[22;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[22;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[23;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[24;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[25;19H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[26;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[27;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[27;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities"] +[27.563620299,"o",". Let me \u001b[0m\u001b[27;95H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[28;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcreate the texforge project first.\u001b[0m\u001b[29;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[30;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[30;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[31;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[31;35H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[32;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[33;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[33;29H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[36;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[37;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[41;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[41;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[42;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[42;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[43;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[43;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[44;3H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[44;100H\u001b[38;2;72;72;72m\u001b[48;2;10;10;10m┃\u001b[0m\u001b[0m\u001b[49;7H\u001b[?25h\u001b[?2026l"] +[27.580630854,"o","\u001b[?2026h\u001b[?25l\u001b[38;6H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131mexit \u001b[0m\u001b[38;23H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131mEx\u001b[0m\u001b[38;27H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131m the app\u001b[0m\u001b[39;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30meditor \u001b[0m\u001b[39;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mOpen editor\u001b[0m\u001b[39;34H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[40;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mexport \u001b[0m\u001b[40;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mExport session transcript\u001b[0m\u001b[41;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mfetch:fetch:mcp\u001b[0m\u001b[41;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mFetch a URL and ext\u001b[0m\u001b[41;43H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mac\u001b[0m\u001b[41;46H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m its contents as markdown\u001b[0m\u001b[42;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mhelp\u001b[0m\u001b[42;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mHelp\u001b[0m\u001b[42;27H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[43;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mnew \u001b[0m\u001b[43;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mNew s\u001b[0m\u001b[43;29H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mssi\u001b[0m\u001b[43;33H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mn\u001b[0m\u001b[44;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mrename\u001b[0m\u001b[44;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mRename session\u001b[0m\u001b[45;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mreview\u001b[0m\u001b[45;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mreview\u001b[0m\u001b[45;30H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mchanges\u001b[0m\u001b[45;38H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m[commit|branch|pr], defaults to uncommitted\u001b[0m\u001b[46;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30ms\u001b[0m\u001b[46;8H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mssions \u001b[0m\u001b[46;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mSwitch sessio\u001b[0m\u001b[46;37H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[47;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mstatus\u001b[0m\u001b[47;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mView\u001b[0m\u001b[47;29H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mtatus\u001b[0m\u001b[47;34H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[49;7H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30me\u001b[0m\u001b[0m\u001b[49;8H\u001b[?25h\u001b[?2026l"] +[27.59927693,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;45;72;110m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;7H\u001b[38;2;56;91;141m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;8H\u001b[?25h\u001b[?2026l"] +[27.631750599,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;33;50;75m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;6H\u001b[38;2;55;90;138m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;8H\u001b[?25h\u001b[?2026l"] +[27.664731618,"o","\u001b[?2026h\u001b[?25l\u001b[38;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[38;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[38;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[38;19H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[39;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m texforge build\u001b[0m\u001b[39;22H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[40;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[40;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[41;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠙\u001b[0m\u001b[42;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[42;16H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[43;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[44;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[44;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features\u001b[0m\u001b[44;89H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[45;4H\u001b[38;2;255;255;255m\u001b[48;2;250;178;131m \u001b[0m\u001b[45;5H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131m/exit \u001b[0m\u001b[45;23H\u001b[38;2;10;10;10m\u001b[48;2;250;178;131mExit the app\u001b[0m\u001b[45;35H\u001b[38;2;255;255;255m\u001b[48;2;250;178;131m \u001b[0m\u001b[46;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/export \u001b[0m\u001b[46;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mExport session transcript\u001b[0m\u001b[47;5H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30m/fetch:fetch:mcp \u001b[0m\u001b[47;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mFetch a URL and extract its contents as markdown\u001b[0m\u001b[49;8H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mx\u001b[0m\u001b[0m\u001b[49;9H\u001b[?25h\u001b[?2026l"] +[27.682378337,"o","\u001b[?2026h\u001b[?25l\u001b[1;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a LaTeX document demonstrating various capabilities. Let me first load the \u001b[0m\u001b[3;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mtexforge\u001b[0m\u001b[3;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mskill\u001b[0m\u001b[3;21H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mto understand how to u\u001b[0m\u001b[3;44H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10me texforge properly.\u001b[0m\u001b[3;64H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[4;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[5;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[5;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[6;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[6;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[7;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[8;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[10;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilitie\u001b[0m\u001b[10;18H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m. Let me c\u001b[0m\u001b[10;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10meate a project and\u001b[0m\u001b[10;48H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite the document.\u001b[0m\u001b[10;67H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[11;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[12;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[13;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[14;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[14;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[15;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[16;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[17;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[18;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[18;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[19;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[19;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[20;17H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20msections/body.tex\u001b[0m\u001b[20;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[21;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[21;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[21;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[22;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[23;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[25;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[26;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[27;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcr\u001b[0m\u001b[27;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mate the texforge \u001b[0m\u001b[27;28H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10moj\u001b[0m\u001b[27;31H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mct first.\u001b[0m\u001b[27;40H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[28;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[29;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[29;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[31;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge "] +[27.68238732,"o","new tes-demo\u001b[0m\u001b[33;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[34;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[35;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[35;49H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[36;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[37;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[38;8H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtexforge build\u001b[0m\u001b[39;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[40;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[41;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠙\u001b[0m\u001b[41;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[42;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[43;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features. Let me \u001b[0m\u001b[44;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite\u001b[0m\u001b[44;11H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[53;4H\u001b[38;2;25;36;52m\u001b[48;2;10;10;10m■\u001b[0m\u001b[53;5H\u001b[38;2;53;87;134m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;9H\u001b[?25h\u001b[?2026l"] +[27.69839801,"o","\u001b[?2026h\u001b[?25l\u001b[44;11H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m the main.tex file\u001b[0m\u001b[0m\u001b[49;9H\u001b[?25h\u001b[?2026l"] +[27.714371393,"o","\u001b[?2026h\u001b[?25l\u001b[41;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠹\u001b[0m\u001b[53;4H\u001b[38;2;52;86;132m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;9H\u001b[?25h\u001b[?2026l"] +[27.730572737,"o","\u001b[?2026h\u001b[?25l\u001b[44;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m with:\u001b[0m\u001b[46;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mfetch:fetch:mcp\u001b[0m\u001b[46;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mFetch a URL a\u001b[0m\u001b[46;37H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30md extract its contents as markdown\u001b[0m\u001b[47;6H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mexport \u001b[0m\u001b[47;23H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30mExport sessio\u001b[0m\u001b[47;37H\u001b[38;2;128;128;128m\u001b[48;2;30;30;30m transcript\u001b[0m\u001b[47;48H\u001b[38;2;255;255;255m\u001b[48;2;30;30;30m \u001b[0m\u001b[49;9H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mi\u001b[0m\u001b[0m\u001b[49;10H\u001b[?25h\u001b[?2026l"] +[27.763530251,"o","\u001b[?2026h\u001b[?25l\u001b[1;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a LaTeX document demonstrating various capabilities. Let me first load the \u001b[0m\u001b[2;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mtexforge\u001b[0m\u001b[2;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mskill\u001b[0m\u001b[2;21H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mto understand how to u\u001b[0m\u001b[2;44H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10me texforge properly.\u001b[0m\u001b[2;64H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[3;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[4;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[4;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[5;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[5;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[6;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[7;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[9;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilitie\u001b[0m\u001b[9;18H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m. Let me c\u001b[0m\u001b[9;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10meate a project and\u001b[0m\u001b[9;48H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite the document.\u001b[0m\u001b[9;67H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[10;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[11;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[12;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[13;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[13;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[14;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[15;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[16;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[17;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[17;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[18;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[18;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[19;17H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20msections/body.tex\u001b[0m\u001b[19;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[20;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[20;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[21;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[22;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[24;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[26;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcr\u001b[0m\u001b[26;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mate the texforge \u001b[0m\u001b[26;28H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10moj\u001b[0m\u001b[26;31H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mct first.\u001b[0m\u001b[26;40H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[27;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[28;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[28;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[30;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[32;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m "] +[27.763573768,"o"," \u001b[0m\u001b[33;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[34;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[34;49H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[36;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[37;8H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtexforge build\u001b[0m\u001b[38;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[39;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[40;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠹\u001b[0m\u001b[40;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[41;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[41;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features. Let me \u001b[0m\u001b[43;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite\u001b[0m\u001b[43;12H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mth\u001b[0m\u001b[43;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m main.t\u001b[0m\u001b[43;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mx file with:\u001b[0m\u001b[43;35H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[44;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m1. \u001b[0m\u001b[44;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mM\u001b[0m\u001b[44;11H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mrmaid\u001b[0m\u001b[44;16H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[53;4H\u001b[38;2;51;83;128m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;10H\u001b[?25h\u001b[?2026l"] +[27.795963652,"o","\u001b[?2026h\u001b[?25l\u001b[1;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mtexforge\u001b[0m\u001b[1;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mskill\u001b[0m\u001b[1;21H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mto understand how to u\u001b[0m\u001b[1;44H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10me texforge properly.\u001b[0m\u001b[1;64H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[3;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[3;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[4;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[4;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[5;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[6;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[7;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[8;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilitie\u001b[0m\u001b[8;18H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m. Let me c\u001b[0m\u001b[8;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10meate a project and\u001b[0m\u001b[8;48H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite the document.\u001b[0m\u001b[8;67H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[10;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[11;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[12;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[12;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[13;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[14;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[15;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[15;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[16;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[16;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[17;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[17;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[18;17H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20msections/body.tex\u001b[0m\u001b[18;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[19;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[19;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[21;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[23;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[25;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcr\u001b[0m\u001b[25;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mate the texforge \u001b[0m\u001b[25;28H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10moj\u001b[0m\u001b[25;31H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mct first.\u001b[0m\u001b[25;40H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[26;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[27;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[27;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[29;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[31;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[33;6H\u001b[38;2;2"] +[27.79601931,"o","38;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[33;49H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[34;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[36;8H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtexforge build\u001b[0m\u001b[37;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[38;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[39;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠸\u001b[0m\u001b[39;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[40;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[40;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[41;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features. Let me \u001b[0m\u001b[42;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite\u001b[0m\u001b[42;12H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mth\u001b[0m\u001b[42;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m main.t\u001b[0m\u001b[42;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mx file with:\u001b[0m\u001b[42;35H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[43;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m1. \u001b[0m\u001b[43;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mM\u001b[0m\u001b[43;11H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mrmaid sequence diagram\u001b[0m\u001b[43;33H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[44;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m2\u001b[0m\u001b[44;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[53;4H\u001b[38;2;50;81;124m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;10H\u001b[?25h\u001b[?2026l"] +[27.827991232,"o","\u001b[?2026h\u001b[?25l\u001b[44;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m2. \u001b[0m\u001b[44;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mGraphviz architecture\u001b[0m\u001b[49;10H\u001b[38;2;238;238;238m\u001b[48;2;30;30;30mt\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[27.844696911,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;49;79;122m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[27.874642276,"o","\u001b[?2026h\u001b[?25l\u001b[39;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠼\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[27.890218861,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;48;77;118m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[27.919507439,"o","\u001b[?2026h\u001b[?25l\u001b[53;4H\u001b[38;2;47;75;115m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[27.953164347,"o","\u001b[?2026h\u001b[?25l\u001b[1;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[2;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[3;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[3;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[4;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[5;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[6;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[7;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilitie\u001b[0m\u001b[7;18H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m. Let me c\u001b[0m\u001b[7;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10meate a project and\u001b[0m\u001b[7;48H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite the document.\u001b[0m\u001b[7;67H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[10;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[11;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[11;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[12;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[13;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[14;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[14;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[15;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[15;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[16;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[16;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[17;17H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20msections/body.tex\u001b[0m\u001b[17;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[18;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[18;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[20;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[22;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[24;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcr\u001b[0m\u001b[24;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mate the texforge \u001b[0m\u001b[24;28H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10moj\u001b[0m\u001b[24;31H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mct first.\u001b[0m\u001b[24;40H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[26;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[26;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[28;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[30;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[32;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[32;49H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[34;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[35;8H\u001b[38;2;238;238;238m\u001b[48;2;20"] +[27.953175432,"o",";20;20mtexforge build\u001b[0m\u001b[36;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[37;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠼\u001b[0m\u001b[38;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[39;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[39;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[40;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features. Let me \u001b[0m\u001b[41;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite\u001b[0m\u001b[41;12H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mth\u001b[0m\u001b[41;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m main.t\u001b[0m\u001b[41;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mx file with:\u001b[0m\u001b[41;35H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m1. \u001b[0m\u001b[42;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mM\u001b[0m\u001b[42;11H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mrmaid sequence diagram\u001b[0m\u001b[42;33H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[43;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m2\u001b[0m\u001b[43;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mGraphviz archit\u001b[0m\u001b[43;25H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcture digraph\u001b[0m\u001b[44;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m3\u001b[0m\u001b[44;7H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[27.969632915,"o","\u001b[?2026h\u001b[?25l\u001b[1;6H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10m→\u001b[0m\u001b[1;8H\u001b[38;2;128;128;128m\u001b[48;2;10;10;10mSkill \"texforge\"\u001b[0m\u001b[2;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[3;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[4;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[5;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[6;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilitie\u001b[0m\u001b[6;18H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m. Let me c\u001b[0m\u001b[6;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10meate a project and\u001b[0m\u001b[6;48H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite the document.\u001b[0m\u001b[6;67H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[7;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[8;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[9;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[10;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[10;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[11;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[12;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[13;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[13;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[14;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[14;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[15;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[15;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[16;17H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20msections/body.tex\u001b[0m\u001b[16;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[17;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[17;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[19;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[20;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[21;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[22;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[23;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcr\u001b[0m\u001b[23;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mate the texforge \u001b[0m\u001b[23;28H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10moj\u001b[0m\u001b[23;31H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mct first.\u001b[0m\u001b[23;40H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[25;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[25;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[26;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[27;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[28;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[29;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[30;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[31;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[31;49H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[33;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[34;8H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtexforge build\u001b[0m\u001b[35;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[36;3H\u001b[38;2;255"] +[27.969681345,"o",";255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[37;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠴\u001b[0m\u001b[37;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[38;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[39;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features. Let me \u001b[0m\u001b[40;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite\u001b[0m\u001b[40;12H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mth\u001b[0m\u001b[40;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m main.t\u001b[0m\u001b[40;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mx file with:\u001b[0m\u001b[40;35H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[41;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m1. \u001b[0m\u001b[41;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mM\u001b[0m\u001b[41;11H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mrmaid sequence diagram\u001b[0m\u001b[41;33H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[42;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m2\u001b[0m\u001b[42;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mGraphviz archit\u001b[0m\u001b[42;25H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcture digraph\u001b[0m\u001b[43;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m3\u001b[0m\u001b[43;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mD2 \u001b[0m\u001b[43;13H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mipeline d\u001b[0m\u001b[43;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10magram\u001b[0m\u001b[43;28H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[44;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m4. \u001b[0m\u001b[44;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mMath equations with cross\u001b[0m\u001b[53;4H\u001b[38;2;45;73;111m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[28.002413648,"o","\u001b[?2026h\u001b[?25l\u001b[44;34H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m-re\u001b[0m\u001b[53;4H\u001b[38;2;44;71;109m\u001b[48;2;10;10;10m⬝⬝⬝⬝⬝⬝⬝⬝\u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[28.019206557,"o","\u001b[?2026h\u001b[?25l\u001b[1;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[1;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[2;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 672ms\u001b[0m\u001b[3;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[4;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I understand texforge. The user wants a comprehensive LaTeX document demonstrating many \u001b[0m\u001b[5;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcapabilitie\u001b[0m\u001b[5;18H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m. Let me c\u001b[0m\u001b[5;29H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10meate a project and\u001b[0m\u001b[5;48H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite the document.\u001b[0m\u001b[5;67H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[6;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[7;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mLet me create a new texforge project, then write the main.tex with all the requested features.\u001b[0m\u001b[8;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[9;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[9;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[10;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Todos\u001b[0m\u001b[11;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[12;6H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20m[•] \u001b[0m\u001b[12;10H\u001b[38;2;245;167;66m\u001b[48;2;20;20;20mCreate texforge project\u001b[0m\u001b[13;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[13;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mWrite main.tex with all requested features\u001b[0m\u001b[14;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] Create bib file with example entries\u001b[0m\u001b[14;46H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[15;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[15;17H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20msections/body.tex\u001b[0m\u001b[15;34H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[16;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m[ ] \u001b[0m\u001b[16;10H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20mRun texforge build\u001b[0m\u001b[16;28H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[17;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[18;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[19;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThought: 1.1s\u001b[0m\u001b[20;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[21;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mThe user wants a comprehensive LaTeX document demonstrating various capabilities. Let me \u001b[0m\u001b[22;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcr\u001b[0m\u001b[22;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mate the texforge \u001b[0m\u001b[22;28H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10moj\u001b[0m\u001b[22;31H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mct first.\u001b[0m\u001b[22;40H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[23;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[24;3H\u001b[38;2;10;10;10m\u001b[48;2;20;20;20m┃\u001b[0m\u001b[24;4H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[25;6H\u001b[38;2;128;128;128m\u001b[48;2;20;20;20m# Create new texforge project\u001b[0m\u001b[26;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[27;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m$ texforge new tes-demo\u001b[0m\u001b[28;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[29;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mCreating project 'tes-demo' with template 'general'...\u001b[0m\u001b[30;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m ◇ Project 'tes-demo' created successfully\u001b[0m\u001b[30;49H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[31;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[32;6H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20m cd tes-demo\u001b[0m\u001b[33;8H\u001b[38;2;238;238;238m\u001b[48;2;20;20;20mtexforge build\u001b[0m\u001b[34;6H\u001b[38;2;255;255;255m\u001b[48;2;20;20;20m \u001b[0m\u001b[35;3H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m "] +[28.019244483,"o"," \u001b[0m\u001b[36;6H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10m⠴\u001b[0m\u001b[36;8H\u001b[38;2;151;104;44m\u001b[48;2;10;10;10mThinking\u001b[0m\u001b[37;6H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[37;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[38;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mNow I need to create a comprehensive LaTeX document with all the requested features. Let me \u001b[0m\u001b[39;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mwrite\u001b[0m\u001b[39;12H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mth\u001b[0m\u001b[39;15H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m main.t\u001b[0m\u001b[39;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mx file with:\u001b[0m\u001b[39;35H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[40;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m1. \u001b[0m\u001b[40;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mM\u001b[0m\u001b[40;11H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mrmaid sequence diagram\u001b[0m\u001b[40;33H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[41;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m2\u001b[0m\u001b[41;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mGraphviz archit\u001b[0m\u001b[41;25H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mcture digraph\u001b[0m\u001b[42;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m3\u001b[0m\u001b[42;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mD2 \u001b[0m\u001b[42;13H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mipeline d\u001b[0m\u001b[42;23H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10magram\u001b[0m\u001b[42;28H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[43;6H\u001b[38;2;154;111;83m\u001b[48;2;10;10;10m4\u001b[0m\u001b[43;9H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10mMath equations with cross-references\u001b[0m\u001b[44;6H\u001b[38;2;147;147;147m\u001b[48;2;10;10;10m5.\u001b[0m\u001b[44;8H\u001b[38;2;255;255;255m\u001b[48;2;10;10;10m \u001b[0m\u001b[0m\u001b[49;11H\u001b[?25h\u001b[?2026l"] +[28.031438905,"o","\u001b]0;\u0007"] +[28.034929181,"o","\u001b[?25h\u001b[0m\u001b]22;\u0007\u001b[>4;0m\u001b[?1003l\u001b[?1002l\u001b[?1000l\u001b[?1006l\u001b[?2004l\u001b[?1049l\u001b[?2031l\u001b]0;\u0007\u001b]12;default\u0007\u001b]112\u0007\u001b[0 q\u001b[?25h"] +[28.044983217,"o","\u001b[?25h"] +[28.05579063,"o"," \u001b[0m▄\u001b[0m \r\n \u001b[90m█\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m█\u001b[0m \u001b[90m█\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m█\u001b[0m \u001b[90m█\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m█\u001b[0m \u001b[90m█\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▄\u001b[0m \u001b[0m█\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m \u001b[0m█\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m█\u001b[0m \u001b[0m█\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m█\u001b[0m \u001b[0m█\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m█\u001b[0m\r\n \u001b[90m█\u001b[0m\u001b[48;5;235m \u001b[0m\u001b[48;5;235m \u001b[0m\u001b[90m█\u001b[0m \u001b[90m█\u001b[0m\u001b[48;5;235m \u001b[0m\u001b[48;5;235m \u001b[0m\u001b[90m█\u001b[0m \u001b[90m█\u001b[0m\u001b[90m\u001b[48;5;235m▀\u001b[0m\u001b[90m\u001b[48;5;235m▀\u001b[0m\u001b[90m\u001b[48;5;235m▀\u001b[0m \u001b[90m█\u001b[0m\u001b[48;5;235m \u001b[0m\u001b[48;5;235m \u001b[0m\u001b[90m█\u001b[0m \u001b[0m█\u001b[0m\u001b[48;5;238m \u001b[0m\u001b[48;5;238m \u001b[0m\u001b[48;5;238m \u001b[0m \u001b[0m█\u001b[0m\u001b[48;5;238m \u001b[0m\u001b[48;5;238m \u001b[0m\u001b[0m█\u001b[0m \u001b[0m█\u001b[0m\u001b[48;5;238m \u001b[0m\u001b[48;5;238m \u001b[0m\u001b[0m█\u001b[0m \u001b[0m█\u001b[0m\u001b[0m\u001b[48;5;238m▀\u001b[0m\u001b[0m\u001b[48;5;238m▀\u001b[0m\u001b[0m\u001b[48;5;238m▀\u001b[0m\r\n \u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m \u001b[90m█\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m \u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m\u001b[90m▀\u001b[0m \u001b[90m▀\u001b[0m\u001b[38;5;235m▀\u001b[0m\u001b[38;5;235m▀\u001b[0m\u001b[90m▀\u001b[0m \u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m \u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m \u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m \u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\u001b[0m▀\u001b[0m\r\n\r\n \u001b[90mSession \u001b[0m\u001b[1mNew session - 2026-07-07T13:55:09.012Z\u001b[0m\r\n \u001b[90mContinue \u001b[0m\u001b[1mopencode -s ses_0c32389abffewyL790AFRcnI60\u001b[0m\r\n\r\n"] +[28.179515255,"o","\u001b]697;OSCUnlock=6f3dc305774c4fb5ac9caff308f61ed2\u0007\u001b]697;Dir=/home/jheisonmblivecom\u0007"] +[28.179562802,"o","\u001b]697;Shell=bash\u0007\u001b]697;ShellPath=/usr/bin/bash\u0007"] +[28.179604986,"o","\u001b]697;WSLDistro=Ubuntu\u0007\u001b]697;PID=16910\u0007"] +[28.179667202,"o","\u001b]697;ExitCode=0\u0007\u001b]697;TTY=/dev/pts/3\u0007"] +[28.179731596,"o","\u001b]697;Log=\u0007\u001b]697;User=jheisonmblivecom\u0007"] +[28.181307235,"o","\u001b]697;OSCLock=6f3dc305774c4fb5ac9caff308f61ed2\u0007\u001b]697;PreExec\u0007"] +[28.349678092,"o","\u001b[?2004h\u001b]697;StartPrompt\u0007\u001b[1;32mtexForge@univerlab\u001b[0m:\u001b[1;34m~\u001b[0m$ \u001b]697;EndPrompt\u0007\u001b]697;NewCmd=6f3dc305774c4fb5ac9caff308f61ed2\u0007"] diff --git a/demo/demo.toml b/demo/demo.toml new file mode 100644 index 0000000..59ae45b --- /dev/null +++ b/demo/demo.toml @@ -0,0 +1,135 @@ +[demo] +name = "demo" +output_dir = "./dist" +prompt = '\[\e[1;32m\]texForge@univerlab\[\e[0m\]:\[\e[1;34m\]~\[\e[0m\]$ ' + +[typing] +base_ms = 80 +salt_ms = 15 + +[[sources]] +id = "main" +type = "terminal" + +[[sources]] +id = "pdf" +type = "browser" +url = "file:///home/jheisonmblivecom/Projects/UniverLab/texforge/examples/texforge-capabilites/texforge-capabilites.pdf" + +[layout] +width = 1440 +height = 1080 +fps = 15 +line_height = 1.2000000476837158 +background = "#0b0f14" +font_family = "IBM Plex Mono" + +[[layout.panes]] +id = "main" +type = "terminal" +x = 0 +y = 0 +width = 1440 +height = 1080 +font_family = "monospace" +font_size = 16 + +[[layout.panes]] +id = "pdf-r1" +type = "browser" +x = 0 +y = 0 +width = 1440 +height = 1080 +url = "file:///home/jheisonmblivecom/Projects/UniverLab/texforge/examples/texforge-capabilites/texforge-capabilites.pdf" +reveal_at = 262.448 + +[[timeline]] +action = "focus" +pane = "main" + +[[timeline]] +action = "type" +text = "texforge --help" +human_salt = true + +[[timeline]] +action = "wait" +duration_ms = 200 + +[[timeline]] +action = "keypress" +key = "enter" + +[[timeline]] +action = "wait" +duration_ms = 2500 + +[[timeline]] +action = "type" +text = "opencode" +human_salt = true + +[[timeline]] +action = "wait" +duration_ms = 200 + +[[timeline]] +action = "keypress" +key = "enter" + +[[timeline]] +action = "wait_for_quiet" +quiet_ms = 1500 + +[[timeline]] +action = "type" +text = 'Create a texforge project "texforge-capabilites" demonstrating all capabilities: Mermaid sequence diagra, Graphviz architecture digraph, D2 pipeline diagram, math equations with cross-refs, BibTeX citations, tikz diagram, examples of code listings, two booktabs tables, table of contents, and lists. Compile with texforge build.' +human_salt = true + +[[timeline]] +action = "wait" +duration_ms = 200 + +[[timeline]] +action = "keypress" +key = "enter" + +[[timeline]] +action = "wait_for_quiet" +quiet_ms = 5000 + +[[timeline]] +action = "type" +text = "/exit" +human_salt = true + +[[timeline]] +action = "wait" +duration_ms = 200 + +[[timeline]] +action = "keypress" +key = "enter" + +[[timeline]] +action = "wait_for_quiet" +quiet_ms = 500 + +[[timeline]] +action = "focus" +pane = "pdf-r1" + +[[timeline]] +action = "scroll" +direction = "down" +velocity = "constant" +duration_ms = 8000 +pane = "pdf-r1" + +[[timeline]] +action = "wait" +duration_ms = 8000 + +[[timeline]] +action = "terminate" diff --git a/demo/dist/demo.gif b/demo/dist/demo.gif new file mode 100644 index 0000000..f42ede8 Binary files /dev/null and b/demo/dist/demo.gif differ diff --git a/docs/building.md b/docs/building.md new file mode 100644 index 0000000..e9ac53e --- /dev/null +++ b/docs/building.md @@ -0,0 +1,55 @@ +--- +title: Building +description: Compile to PDF, watch mode, and the texforge runtime directory. +order: 4 +--- + +# Building + +## `texforge build` + +Compiles the project to `.pdf` in the project root: + +1. Copies sources into a temporary build directory (originals are never + modified). +2. Renders embedded [diagram environments](diagrams.md) to PNG. +3. Invokes Tectonic on the entry point declared in `project.toml` and + places the resulting PDF (named after the document title) in the + project root. + +On the first run texforge downloads the Tectonic binary into +`~/.texforge/bin/` automatically. + +## Watch mode + +`texforge build --watch` watches `.tex` files and rebuilds automatically: + +```bash +texforge build --watch # rebuild after 2s of inactivity (default) +texforge build --watch --delay 5 # custom debounce delay in seconds +``` + +The terminal shows a live session timer, build count and the result of the +last build. Press `Ctrl+C` to stop. + +## Cleaning + +```bash +texforge clean # remove build artifacts +``` + +## Runtime directory + +Texforge keeps its engine and template cache under `~/.texforge/`: + +``` +~/.texforge/ + bin/ + tectonic # LaTeX engine (auto-installed on first build) + templates/ + general/ # cached templates + apa-general/ + ... +``` + +Deleting this directory is safe: everything is re-downloaded on demand. diff --git a/docs/cli-reference.md b/docs/cli-reference.md new file mode 100644 index 0000000..a6a816e --- /dev/null +++ b/docs/cli-reference.md @@ -0,0 +1,59 @@ +--- +title: CLI Reference +description: Every texforge command and flag. +order: 9 +--- + +# CLI Reference + +``` +texforge <command> [options] +``` + +## Project lifecycle + +| Command | Description | +|---|---| +| `texforge new <name>` | Create a new project from the default template | +| `texforge new <name> -t <template>` | Create with a specific template | +| `texforge init` | Interactive wizard — new project or migrate an existing one | +| `texforge build` | Compile to PDF | +| `texforge build --watch` | Watch for changes and rebuild automatically | +| `texforge build --watch --delay <s>` | Custom debounce delay (default: 2s) | +| `texforge clean` | Remove build artifacts | + +## Quality + +| Command | Description | +|---|---| +| `texforge check` | Lint without compiling | +| `texforge fmt` | Format `.tex` files in place | +| `texforge fmt --check` | Check formatting without modifying (CI-friendly) | + +## Templates + +| Command | Description | +|---|---| +| `texforge template list` | List installed + available in the registry | +| `texforge template list --installed` | List only locally installed templates | +| `texforge template add <name>` | Download a template from the registry | +| `texforge template remove <name>` | Remove an installed template | +| `texforge template validate <name>` | Verify template compatibility | + +## Configuration + +| Command | Description | +|---|---| +| `texforge config` | Interactive wizard (name, email, institution, language) | +| `texforge config list` | Show all configured values | +| `texforge config <key>` | Show value for a key | +| `texforge config <key> <value>` | Set a value | + +Valid keys: `name`, `email`, `institution`, `language`. + +## Global flags + +| Flag | Description | +|---|---| +| `--help` | Show help for any command | +| `--version` | Show texforge version | diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..f7ccdb8 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,64 @@ +--- +title: Configuration +description: Global user configuration and the project.toml manifest. +order: 7 +--- + +# Configuration + +Texforge has two configuration layers: a **global user config** (who you +are, your defaults) and a **per-project manifest** (`project.toml`). + +## Global configuration + +Stored in `~/.texforge/config.toml` (or +`$XDG_CONFIG_HOME/texforge/config.toml`). These values are used as +replaceable placeholders in templates. + +**Interactive setup:** + +```bash +texforge config +``` + +The wizard asks for: + +- **Name** — your full name +- **Email** — your email address +- **Institution** — your institution/organization +- **Language** — document language (default: `english`) + +**Command-line interface:** + +```bash +texforge config list # view all settings +texforge config name # get a value +texforge config name "Ada Lovelace" # set a value +texforge config email "ada@example.com" +texforge config institution "University of Tech" +texforge config language "spanish" +``` + +## Project manifest — `project.toml` + +Every texforge project has a `project.toml` at its root. It is generated +by `texforge new` / `texforge init`: + +```toml +[document] +title = "My Thesis" +author = "Ada Lovelace" +template = "general" + +[build] +entry = "main.tex" +# bibliography = "references.bib" # optional +``` + +| Key | Description | +|---|---| +| `document.title` | Document title | +| `document.author` | Document author | +| `document.template` | Template the project was created from | +| `build.entry` | Entry `.tex` file passed to the engine | +| `build.bibliography` | Optional `.bib` file used by the linter | diff --git a/docs/diagrams.md b/docs/diagrams.md new file mode 100644 index 0000000..4d5cde4 --- /dev/null +++ b/docs/diagrams.md @@ -0,0 +1,53 @@ +--- +title: Diagrams +description: Embed Mermaid and Graphviz diagrams directly in your .tex files. +order: 5 +--- + +# Diagrams + +`texforge build` intercepts embedded diagram environments before +compilation and replaces them with rendered figures. Your original `.tex` +files are never modified — rendering happens in the `build/` copies. + +Both renderers are pure Rust: no browser, no Node.js, no `dot` binary +required. + +## Mermaid + +```latex +% Default: width=\linewidth, pos=H, no caption +\begin{mermaid} +flowchart LR + A[Input] --> B[Process] --> C[Output] +\end{mermaid} + +% With options +\begin{mermaid}[width=0.6\linewidth, caption=System flow, pos=t] +flowchart TD + X --> Y --> Z +\end{mermaid} +``` + +## Graphviz / DOT + +```latex +\begin{graphviz}[caption=Pipeline] +digraph G { + rankdir=LR + A -> B -> C + B -> D +} +\end{graphviz} +``` + +## Options + +| Option | Default | Description | +|---|---|---| +| `width` | `\linewidth` | Image width | +| `pos` | `H` | Figure placement (`H`, `t`, `b`, `h`, `p`) | +| `caption` | _(none)_ | Figure caption | + +When a `caption` is given the diagram is wrapped in a `figure` environment +at the requested position; without it the image is embedded inline. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..4bc6484 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,53 @@ +--- +title: Texforge +description: A unified LaTeX workspace — write, render diagrams, and build PDFs with one self-contained tool. +order: 1 +--- + +# Texforge + +Texforge is a unified LaTeX workspace: one tool for writing, rendering +diagrams (Mermaid, Graphviz) and building PDFs. Set it up once and stay +focused on your document. + +It is a single binary written in Rust. You do **not** need TeX Live, MiKTeX, +Node.js, a browser, or Graphviz installed — the LaTeX engine +([Tectonic](https://tectonic-typesetting.github.io/)) is downloaded +automatically on first build, and diagrams are rendered in pure Rust. + +## Why texforge + +A classic LaTeX setup means installing a multi-gigabyte distribution, +wiring up `latexmk`, and gluing external renderers for diagrams. Texforge +collapses that into a single workflow: + +- **One-command setup** — install once; engine, templates and diagram + renderers are included or fetched on demand. +- **Diagrams as first-class citizens** — write Mermaid or Graphviz blocks + directly in your `.tex` files; they render and embed during build. +- **Guided workflows** — start a new project or migrate an existing one + with `texforge init`. +- **Template registry** — install, manage and validate templates, with a + built-in offline fallback. +- **Build and live edit** — compile once or use watch mode. +- **Smart linting** — catch missing files, broken references, bibliography + keys and unclosed environments before compiling. +- **Opinionated formatter** — one canonical `.tex` style, clean git diffs. + +## How the documentation is organized + +- [Installation](installation.md) — install, update and uninstall. +- [Quick Start](quickstart.md) — from zero to PDF in two commands. +- [Building](building.md) — `build`, watch mode and the runtime directory. +- [Diagrams](diagrams.md) — Mermaid and Graphviz environments. +- [Templates](templates.md) — using the template registry. +- [Configuration](configuration.md) — global config and `project.toml`. +- [Linting & Formatting](linting-and-formatting.md) — `check` and `fmt`. +- [CLI Reference](cli-reference.md) — every command and flag. + +## Part of UniverLab + +Texforge is an experiment of [UniverLab](https://github.com/UniverLab), +an open computational laboratory. It follows the lab's engineering +principles: one tool one job, reproducibility first, offline-friendly +design. diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..c0330af --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,78 @@ +--- +title: Installation +description: Install texforge with the quick installer, cargo, or from source. +order: 2 +--- + +# Installation + +## Quick install (recommended) + +**Linux / macOS:** + +```bash +curl -fsSL https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.sh | sh +``` + +**Windows (PowerShell):** + +```powershell +irm https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.ps1 | iex +``` + +This downloads a precompiled binary — no Rust toolchain required. Tectonic +(the LaTeX engine) is installed automatically on first build. + +The installer accepts environment variables: + +```bash +# Pin a specific version +VERSION=0.1.0 curl -fsSL https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.sh | sh + +# Install to a custom directory +INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.sh | sh +``` + +```powershell +# Pin a specific version (PowerShell) +$env:VERSION="0.1.0"; irm https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.ps1 | iex +``` + +## Via cargo + +```bash +cargo install texforge +``` + +Available on [crates.io](https://crates.io/crates/texforge). + +## From source + +```bash +git clone https://github.com/UniverLab/texforge.git +cd texforge +cargo build --release +# Binary at target/release/texforge +``` + +## GitHub Releases + +Precompiled binaries for Linux x86_64, macOS x86_64/ARM64 and Windows +x86_64 are published on the +[Releases](https://github.com/UniverLab/texforge/releases) page. + +## Platform support + +| Platform | Architecture | Status | +|---|---|---| +| Linux | x86_64 | ✅ | +| macOS | x86_64 | ✅ | +| macOS | ARM64 (Apple Silicon) | ✅ | +| Windows | x86_64 | ✅ | + +## Uninstall + +```bash +rm -f ~/.local/bin/texforge # texforge binary +rm -rf ~/.texforge/ # tectonic engine + cached templates +``` diff --git a/docs/linting-and-formatting.md b/docs/linting-and-formatting.md new file mode 100644 index 0000000..d8e5316 --- /dev/null +++ b/docs/linting-and-formatting.md @@ -0,0 +1,51 @@ +--- +title: Linting & Formatting +description: Static analysis with texforge check and canonical style with texforge fmt. +order: 8 +--- + +# Linting & Formatting + +## Linter — `texforge check` + +Runs static analysis without compiling: + +| Check | What it verifies | +|---|---| +| `\input{file}` | referenced file exists | +| `\includegraphics{img}` | image exists | +| `\cite{key}` | key exists in the `.bib` file | +| `\ref{label}` / `\label{label}` | cross-reference consistency | +| `\begin{env}` / `\end{env}` | no unclosed environments | + +Errors come with file, line and a suggestion: + +``` +ERROR [main.tex:47] + \includegraphics{missing.png} — file not found + +ERROR [main.tex:12] + \cite{smith2020} — key not found in .bib + +ERROR [main.tex:23] + \begin{figure} never closed + suggestion: Add \end{figure} +``` + +## Formatter — `texforge fmt` + +Applies opinionated formatting inspired by `rustfmt`: + +- Consistent indentation (2 spaces) inside environments +- Collapsed multiple blank lines +- Aligned `\begin{}` / `\end{}` blocks + +One canonical output regardless of input style — git diffs stay clean. + +```bash +texforge fmt # format in place +texforge fmt --check # check without modifying (CI-friendly) +``` + +`fmt --check` exits non-zero when files would change, which makes it easy +to enforce formatting in CI. diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000..804245b --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,65 @@ +--- +title: Quick Start +description: From zero to PDF in two commands. +order: 3 +--- + +# Quick Start + +## New project + +```bash +texforge new my-thesis +cd my-thesis +texforge build +``` + +That's it: `my-thesis.pdf` is ready in the project root. On the very first build texforge +downloads Tectonic (the LaTeX engine) automatically — no TeX distribution +needed. + +## Interactive wizard + +If you prefer a guided flow, `texforge init` auto-detects the context: + +- If a `.tex` file with `\documentclass` is found in the current + directory, it **migrates the existing project**: asks for title and + author and generates `project.toml`. +- Otherwise it **guides the creation of a new project**: asks for name + and template. + +```bash +# Existing LaTeX project +cd my-existing-thesis/ +texforge init + +# Empty directory +mkdir my-new-doc && cd my-new-doc +texforge init +``` + +## The everyday loop + +```bash +texforge check # lint: missing files, broken refs, unclosed envs +texforge fmt # normalize formatting +texforge build # compile to <title>.pdf in the project root +texforge build --watch # rebuild automatically while you edit +``` + +## Project layout + +A texforge project is a regular LaTeX project plus a `project.toml` +manifest: + +``` +my-thesis/ +├── project.toml # document metadata and build entry point +├── main.tex +├── sections/ # chapters, sections (depends on template) +├── bib/ # bibliography (depends on template) +└── my-thesis.pdf # generated by texforge build +``` + +See [Configuration](configuration.md) for the `project.toml` format and +[Templates](templates.md) for the available starting points. diff --git a/docs/templates.md b/docs/templates.md new file mode 100644 index 0000000..98fd8ee --- /dev/null +++ b/docs/templates.md @@ -0,0 +1,53 @@ +--- +title: Templates +description: Install, manage and validate LaTeX templates from the registry. +order: 6 +--- + +# Templates + +Templates are managed through the +[texforge-templates](https://github.com/UniverLab/texforge-templates) +registry. The `general` template is embedded in the binary, so creating a +project always works — even offline. + +## Commands + +```bash +texforge template list # installed + available in the registry +texforge template list --installed # only locally installed templates +texforge template add <name> # download a template from the registry +texforge template remove <name> # remove an installed template +texforge template validate <name> # verify template compatibility +``` + +Installed templates are cached under `~/.texforge/templates/`. + +## Using a template + +```bash +texforge new my-doc -t apa-general +``` + +Or pick one interactively with `texforge init`. + +## Placeholders + +Templates declare placeholders (title, author, institution, …) in their +manifest. When you create a project, texforge fills them from your answers +and from your [global configuration](configuration.md) — so you don't +retype your name and institution for every document. + +## Writing your own template + +A template is a directory with a manifest describing its files and +placeholders: + +- `id`, `version`, `display_name`, `description` +- `files` — include/exclude globs +- `placeholders` — name, type, description, required, default, choices +- `post_generate` — optional scripts to run after generation + +The easiest way to start is to copy an existing template from the +[texforge-templates](https://github.com/UniverLab/texforge-templates) +repository and run `texforge template validate` against it. diff --git a/examples/texforge-capabilites/bib/references.bib b/examples/texforge-capabilites/bib/references.bib new file mode 100644 index 0000000..ac29df6 --- /dev/null +++ b/examples/texforge-capabilites/bib/references.bib @@ -0,0 +1,26 @@ +@article{example, + author = {John Doe}, + title = {Título del Artículo de Ejemplo}, + journal = {Nombre de la Revista}, + year = {2023}, + volume = {1}, + number = {1}, + pages = {1--10}, + doi = {10.1000/j.abc}, +} + +@book{example2, + author = {Jane Smith}, + title = {Título del Libro de Ejemplo}, + publisher = {Editorial de Ejemplo}, + year = {2022}, + isbn = {978-3-16-148410-0}, +} + +@misc{example3, + author = {Blog Author}, + title = {Título del Artículo de Blog}, + howpublished = {\url{https://www.example.com/blog/article}}, + year = {2023}, + note = {Accessed: 2023-01-01}, +} diff --git a/examples/texforge-capabilites/main.tex b/examples/texforge-capabilites/main.tex new file mode 100644 index 0000000..4239fc7 --- /dev/null +++ b/examples/texforge-capabilites/main.tex @@ -0,0 +1,304 @@ +% General Article Template — Texforge Capabilities Demo +\documentclass[a4paper,12pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[spanish]{babel} +\usepackage{amsmath,amssymb} +\usepackage{float} +\usepackage{graphicx} +\usepackage{hyperref} +\usepackage{geometry} +\usepackage{fancyhdr} +\usepackage{booktabs} +\usepackage{enumitem} +\usepackage{listings} +\usepackage{xcolor} + +\geometry{margin=2.5cm} + +\pagestyle{fancy} +\fancyhf{} +\cfoot{\thepage} + +\lstset{ + basicstyle=\ttfamily\small, + breaklines=true, + frame=single, + backgroundcolor=\color{gray!10} +} + +\title{Demostración de Capacidades de Texforge} +\author{Jheison M} +\date{\today} + +\begin{document} + + \maketitle + + \begin{abstract} + Este documento demuestra las capacidades principales de \textbf{texforge}, + un compilador LaTeX que utiliza tectonic como motor interno, eliminando la + necesidad de instalar TeX Live o MiKTeX. Se presentan diagramas embebidos + (Mermaid, Graphviz y D2), citas bibliográficas, referencias cruzadas, + matemáticas, listados de código, tablas y más. + \end{abstract} + + \tableofcontents + \newpage + + % ------------------------------------------------------- + \section{Introducción}\label{sec:intro} + + Texforge simplifica el flujo de trabajo académico al compilar documentos + LaTeX directamente a PDF sin distribuciones externas~\cite{example}. En + esta sección se describen los antecedentes y motivaciones del proyecto. + + \subsection{Antecedentes} + + La edición de documentos académicos en \LaTeX{} requiere tradicionalmente + instalaciones pesadas como TeX Live o MiKTeX. Texforge elimina esa + barrera~\cite{example2}, ofreciendo una experiencia de línea de comandos + ligera y moderna. + + \subsection{Objetivos} + + Los objetivos de este documento son: + + \begin{enumerate}[label=(\roman*)] + \item Demostrar diagramas embebidos en tres formatos distintos. + \item Mostrar la integración bibliográfica con BibTeX. + \item Ejemplificar referencias cruzadas entre secciones. + \item Presentar ecuaciones matemáticas complejas. + \item Incluir listados de código fuente. + \end{enumerate} + + % ------------------------------------------------------- + \section{Diagramas Embebidos}\label{sec:diagramas} + + Texforge renderiza diagramas directamente desde el código fuente LaTeX + sin herramientas externas como Inkscape o Node.js. + + \subsection{Mermaid} + + El siguiente diagrama de secuencia muestra la interacción entre los + componentes de Texforge: + + \begin{mermaid}[caption=Secuencia de compilación de Texforge, height=10cm, pos=t] + sequenceDiagram + actor User as Usuario + participant CLI as texforge + participant PRE as Pre-procesador + participant TEC as tectonic + + User->>CLI: texforge build + CLI->>PRE: parsea .tex y detecta diagramas + loop Diagramas embebidos + PRE->>CLI: Mermaid / Graphviz / D2 + CLI-->>PRE: imagen PNG generada + end + CLI->>TEC: main.tex + imágenes + TEC-->>User: PDF final + \end{mermaid} + + \subsection{Graphviz / DOT} + + También se pueden crear diagramas directed-Graph con Graphviz: + + \begin{graphviz}[caption=Arquitectura de Texforge, width=0.8\linewidth, pos=t] + digraph G { + rankdir=LR + node [shape=box style="rounded,filled" fillcolor="#E8F4FD"] + + CLI [label="CLI\ntexforge"] + Parser [label="Parser\nLaTeX"] + MermaidEngine [label="Mermaid\nRenderer"] + GraphvizEngine [label="Graphviz\nRenderer"] + D2Engine [label="D2\nRenderer"] + Tectonic [label="tectonic\nEngine"] + PDF [label="Output\nPDF"] + + CLI -> Parser + Parser -> MermaidEngine + Parser -> GraphvizEngine + Parser -> D2Engine + MermaidEngine -> Tectonic + GraphvizEngine -> Tectonic + D2Engine -> Tectonic + Tectonic -> PDF + } + \end{graphviz} + + \subsection{D2} + + El diagrama D2 es otro formato soportado nativamente: + + \begin{d2}[caption=Pipeline de renderizado, height=14cm, pos=t] + source: "Código LaTeX" { + shape: document + } + preprocessor: "Pre-procesador" { + shape: hexagon + } + engines: "Engines de diagramas" { + shape: package + } + pdf: "PDF final" { + shape: page + } + + source -> preprocessor: "lex & parse" + preprocessor -> engines: "diagramas detectados" + engines -> pdf: "tectonic" + \end{d2} + + % ------------------------------------------------------- + \section{Matemáticas}\label{sec:matematicas} + + \subsection{Ecuaciones en línea} + + La fórmula cuadrática se expresa como $x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$. + + \subsection{Ecuaciones numeradas} + + \begin{equation}\label{eq:gauss} + \int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi} + \end{equation} + + \begin{equation}\label{eq:euler} + e^{i\pi} + 1 = 0 + \end{equation} + + Como se demostró en la Ecuación~\ref{eq:gauss}, la integral de Gauss + tiene un valor exacto conocido. + + \subsection{Matrices} + + \begin{equation}\label{eq:matriz} + \mathbf{A} = \begin{pmatrix} + a_{11} & a_{12} & \cdots & a_{1n} \\ + a_{21} & a_{22} & \cdots & a_{2n} \\ + \vdots & \vdots & \ddots & \vdots \\ + a_{n1} & a_{n2} & \cdots & a_{nn} + \end{pmatrix} + \end{equation} + + % ------------------------------------------------------- + \section{Citas Bibliográficas}\label{sec:bib} + + Texforge gestiona automáticamente las referencias BibTeX. A continuación + se presentan tres tipos de cita: + + \begin{itemize} + \item Artículos de revista~\cite{example} + \item Libros~\cite{example2} + \item Recursos en línea~\cite{example3} + \end{itemize} + + La sección~\ref{sec:matematicas} muestra el uso de referencias cruzadas, + mientras que la sección~\ref{sec:diagramas} describe los formatos de + diagramas disponibles. + + % ------------------------------------------------------- + \section{Listados de Código}\label{sec:codigo} + + \subsection{Python} + + \begin{lstlisting}[language=Python, caption={Ejemplo de función en Python}] +import numpy as np + +def integrar_gauss(n_puntos=1000): + """Aproxima la integral de Gauss por cuadratura.""" + x = np.linspace(-10, 10, n_puntos) + dx = x[1] - x[0] + y = np.exp(-x**2) + return np.sum(y) * dx + +if __name__ == "__main__": + resultado = integrar_gauss() + print(f"Integral ≈ {resultado:.6f}") + \end{lstlisting} + + \subsection{LaTeX} + + \begin{lstlisting}[language={[LaTeX]TeX}, caption={Estructura básica de Texforge}] +\documentclass{article} +\usepackage{graphicx} + +\begin{document} +\maketitle + +\begin{mermaid} +flowchart LR + A --> B --> C +\end{mermaid} + +\bibliographystyle{plain} +\bibliography{refs} +\end{document} + \end{lstlisting} + + % ------------------------------------------------------- + \section{Tablas}\label{sec:tablas} + + \begin{table}[H] + \centering + \caption{Comparación de motores de renderizado de diagramas} + \label{tab:motores} + \begin{tabular}{@{}llcc@{}} + \toprule + \textbf{Formato} & \textbf{Motor} & \textbf{Externo?} & \textbf{Velocidad} \\ + \midrule + Mermaid & Rust puro & No & Rápido \\ + Graphviz & layout-rs & No & Rápido \\ + D2 & d2-little & No & Rápido \\ + \bottomrule + \end{tabular} + \end{table} + + Como se muestra en la Tabla~\ref{tab:motores}, todos los motores son + embebidos y no requieren binarios externos. + + % ------------------------------------------------------- + \section{Comandos de Texforge}\label{sec:comandos} + + \begin{table}[H] + \centering + \caption{Resumen de comandos principales} + \label{tab:comandos} + \begin{tabular}{@{}lp{8cm}@{}} + \toprule + \textbf{Comando} & \textbf{Descripción} \\ + \midrule + \texttt{texforge new} & Crea un proyecto nuevo con un template. \\ + \texttt{texforge init} & Wizard interactivo para proyectos existentes. \\ + \texttt{texforge build} & Compila \texttt{main.tex} a PDF en \texttt{build/}. \\ + \texttt{texforge check} & Linter estático: valida archivos, citas y labels. \\ + \texttt{texforge fmt} & Formatea archivos \texttt{.tex}. \\ + \texttt{texforge clean} & Elimina el directorio \texttt{build/}. \\ + \texttt{texforge template} & Gestiona templates instalados o remotos. \\ + \bottomrule + \end{tabular} + \end{table} + + % ------------------------------------------------------- + \section{Conclusión}\label{sec:conclusion} + + Texforge demuestra ser una herramienta completa para la edición de + documentos académicos en \LaTeX{}. Sus ventajas principales son: + + \begin{itemize} + \item \textbf{Sin dependencias externas:} no requiere TeX Live ni MiKTeX. + \item \textbf{Diagramas embebidos:} Mermaid, Graphviz y D2 renderizados en Rust puro. + \item \textbf{Linter integrado:} detección temprana de errores con \texttt{texforge check}. + \item \textbf{Templates:} soporte para APA, IEEE, cartas y documentos generales. + \end{itemize} + + Como se demostró en este documento, la combinación de diagramas + (Sección~\ref{sec:diagramas}), ecuaciones (Sección~\ref{sec:matematicas}), + citas (Sección~\ref{sec:bib}) y código (Sección~\ref{sec:codigo}) permite + crear publicaciones académicas de alta calidad con un mínimo esfuerzo. + + \bibliographystyle{plain} + \bibliography{bib/references} + +\end{document} diff --git a/examples/texforge-capabilites/project.toml b/examples/texforge-capabilites/project.toml new file mode 100644 index 0000000..f8cd4d5 --- /dev/null +++ b/examples/texforge-capabilites/project.toml @@ -0,0 +1,8 @@ +[document] +title = "texforge-capabilites" +author = "Jheison M" +template = "general" + +[build] +entry = "main.tex" +bibliography = "bib/references.bib" diff --git a/examples/texforge-capabilites/sections/body.tex b/examples/texforge-capabilites/sections/body.tex new file mode 100644 index 0000000..e14920f --- /dev/null +++ b/examples/texforge-capabilites/sections/body.tex @@ -0,0 +1 @@ +% Contenido del documento — contenido principal en main.tex diff --git a/examples/texforge-capabilites/texforge-capabilites.pdf b/examples/texforge-capabilites/texforge-capabilites.pdf new file mode 100644 index 0000000..ffa94c3 Binary files /dev/null and b/examples/texforge-capabilites/texforge-capabilites.pdf differ diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 40eb8f1..a7eabaf 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -55,6 +55,26 @@ try { Fail "Download failed: $_`nURL: $Url" } +# --- verify checksum --- +# Match against SHA256SUMS.txt from the same release. Missing sums file (older +# releases) -> skip; a present-but-mismatched checksum is fatal. +$SumsUrl = "https://github.com/$Repo/releases/download/$Tag/SHA256SUMS.txt" +$SumsOk = $false +try { + Invoke-WebRequest -Uri $SumsUrl -OutFile "$Tmp\SHA256SUMS.txt" -UseBasicParsing + $SumsOk = $true +} catch { + Info "checksum" "SHA256SUMS.txt not found for $Tag - skipping verification" +} +if ($SumsOk) { + $line = Select-String -Path "$Tmp\SHA256SUMS.txt" -Pattern ([regex]::Escape($Archive)) | Select-Object -First 1 + if (-not $line) { Fail "No checksum listed for $Archive in SHA256SUMS.txt" } + $expected = ($line.Line -split '\s+')[0].ToLower() + $actual = (Get-FileHash "$Tmp\$Archive" -Algorithm SHA256).Hash.ToLower() + if ($actual -ne $expected) { Fail "Checksum mismatch for $Archive (expected $expected, got $actual)" } + Info "checksum" "verified" +} + # --- extract --- Expand-Archive -Path "$Tmp\$Archive" -DestinationPath $Tmp -Force $extracted = Join-Path $Tmp "texforge.exe" @@ -76,6 +96,29 @@ if ($userPath -notlike "*$InstallDir*") { # --- cleanup --- Remove-Item $Tmp -Recurse -Force +# --- install the texforge agent skill (optional) --- +# Teaches AI agents how to drive texforge. Skipped when npx is unavailable or +# $env:SKIP_SKILL is set; a failure here never fails the binary install above. +$Skill = "texforge" +$SkillsRepo = "https://github.com/UniverLab/skills" +if ($env:SKIP_SKILL) { + Info "skill" "skipped (SKIP_SKILL set)" +} elseif (Get-Command npx -ErrorAction SilentlyContinue) { + Info "skill" "adding '$Skill' (npx skills add)" + try { + & npx -y skills add $SkillsRepo --skill $Skill + if ($LASTEXITCODE -eq 0) { + Info "skill" "installed" + } else { + Info "skill" "skipped - add later with: npx skills add $SkillsRepo --skill $Skill" + } + } catch { + Info "skill" "skipped - add later with: npx skills add $SkillsRepo --skill $Skill" + } +} else { + Info "skill" "npx not found - add later with: npx skills add $SkillsRepo --skill $Skill" +} + # --- verify --- $ver = & "$InstallDir\texforge.exe" --version 2>$null Info "done" $ver diff --git a/scripts/install.sh b/scripts/install.sh index f75e20a..57613a8 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -59,6 +59,29 @@ info "download" "$URL" HTTP_CODE=$(curl -fSL -w '%{http_code}' -o "$TMPDIR/$ARCHIVE" "$URL" 2>/dev/null) || true [ "$HTTP_CODE" = "200" ] || error "Download failed (HTTP $HTTP_CODE). Check that $TAG exists for $TARGET at:\n $URL" +# --- verify checksum --- +# Match against SHA256SUMS.txt from the same release. Missing sums file (older +# releases) or no sha256 tool → skip; a present-but-mismatched checksum is fatal. +SUMS_URL="https://github.com/$REPO/releases/download/${TAG}/SHA256SUMS.txt" +if curl -fsSL -o "$TMPDIR/SHA256SUMS.txt" "$SUMS_URL" 2>/dev/null; then + EXPECTED=$(awk -v f="$ARCHIVE" '$2 == f { print $1 }' "$TMPDIR/SHA256SUMS.txt" | head -1) + [ -n "$EXPECTED" ] || error "No checksum listed for $ARCHIVE in SHA256SUMS.txt" + if command -v sha256sum >/dev/null 2>&1; then + ACTUAL=$(sha256sum "$TMPDIR/$ARCHIVE" | awk '{ print $1 }') + elif command -v shasum >/dev/null 2>&1; then + ACTUAL=$(shasum -a 256 "$TMPDIR/$ARCHIVE" | awk '{ print $1 }') + else + ACTUAL="" + info "checksum" "no sha256 tool found — skipping verification" + fi + if [ -n "$ACTUAL" ]; then + [ "$ACTUAL" = "$EXPECTED" ] || error "Checksum mismatch for $ARCHIVE (expected $EXPECTED, got $ACTUAL)" + info "checksum" "verified" + fi +else + info "checksum" "SHA256SUMS.txt not found for $TAG — skipping verification" +fi + # --- extract --- tar xzf "$TMPDIR/$ARCHIVE" -C "$TMPDIR" [ -f "$TMPDIR/$BINARY" ] || error "Binary not found in archive" @@ -97,7 +120,29 @@ if [ -n "$PATHS_TO_ADD" ]; then fi # ============================================================ -# 3. Verify +# 3. Install the texforge agent skill (optional) +# ============================================================ +# Teaches AI agents how to drive texforge. Skipped when npx is unavailable or +# SKIP_SKILL is set; a failure here never fails the binary install above. + +SKILL="texforge" +SKILLS_REPO="https://github.com/UniverLab/skills" + +if [ -n "${SKIP_SKILL:-}" ]; then + info "skill" "skipped (SKIP_SKILL set)" +elif command -v npx >/dev/null 2>&1; then + info "skill" "adding '$SKILL' (npx skills add)" + if npx -y skills add "$SKILLS_REPO" --skill "$SKILL" </dev/null; then + info "skill" "installed" + else + info "skill" "skipped — add later with: npx skills add $SKILLS_REPO --skill $SKILL" + fi +else + info "skill" "npx not found — add later with: npx skills add $SKILLS_REPO --skill $SKILL" +fi + +# ============================================================ +# 4. Verify # ============================================================ info "done" "$($INSTALL_DIR/$BINARY --version 2>/dev/null || echo "$BINARY installed")" diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 7d38474..10cac5b 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -60,11 +60,11 @@ enum Commands { #[derive(Subcommand)] enum TemplateAction { - /// List available templates + /// List available templates (installed + remote registry by default) List { - /// Also show templates available in the remote registry + /// Only show locally installed templates (skip the remote registry) #[arg(long)] - all: bool, + local: bool, }, /// Add a template from URL or registry Add { source: String }, @@ -90,7 +90,7 @@ impl Cli { Commands::Fmt { check } => commands::fmt::execute(check), Commands::Check => commands::check::execute(), Commands::Template { action } => match action { - TemplateAction::List { all } => commands::template::list(all), + TemplateAction::List { local } => commands::template::list(!local), TemplateAction::Add { source } => commands::template::add(&source), TemplateAction::Remove { name } => commands::template::remove(&name), TemplateAction::Validate { name } => commands::template::validate(&name), diff --git a/src/commands/build.rs b/src/commands/build.rs index fe4adbb..c992874 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -1,5 +1,6 @@ //! `texforge build` command implementation. +use std::path::Path; use std::sync::mpsc; use std::time::Duration; @@ -10,21 +11,36 @@ use crate::commands::init::BANNER; use crate::compiler; use crate::diagrams; use crate::domain::project::Project; +use crate::utils::sanitize_filename; -/// Compile project to PDF. +/// Compile project to PDF using a temp directory, output named after the document title. pub fn execute() -> Result<()> { let project = Project::load()?; - println!("Building project: {}", project.config.documento.titulo); - std::fs::create_dir_all(project.root.join("build"))?; - diagrams::process(&project.root, &project.config.compilacion.entry)?; - let build_dir = project.root.join("build"); - let entry_filename = std::path::Path::new(&project.config.compilacion.entry) + let titulo = &project.config.document.title; + println!("Building project: {titulo}"); + + let temp_dir = tempfile::tempdir()?; + let build_dir = temp_dir.path(); + println!(" ◇ temp: {}", build_dir.display()); + + diagrams::process(&project.root, &project.config.build.entry, build_dir)?; + let entry_filename = Path::new(&project.config.build.entry) .file_name() .map(|n| n.to_string_lossy().to_string()) - .unwrap_or(project.config.compilacion.entry.clone()); - compiler::compile(&build_dir, &entry_filename)?; - let pdf_name = std::path::Path::new(&project.config.compilacion.entry).with_extension("pdf"); - println!(" ◇ build/{}", pdf_name.display()); + .unwrap_or_else(|| project.config.build.entry.clone()); + compiler::compile(build_dir, &entry_filename)?; + + let pdf_name = format!("{}.pdf", sanitize_filename(titulo)); + let pdf_dest = project.root.join(&pdf_name); + let pdf_src = build_dir.join( + Path::new(&project.config.build.entry) + .with_extension("pdf") + .file_name() + .unwrap(), + ); + std::fs::copy(&pdf_src, &pdf_dest)?; + println!(" ◇ {}", pdf_dest.display()); + Ok(()) } @@ -32,13 +48,15 @@ pub fn execute() -> Result<()> { pub fn watch(delay_secs: u64) -> Result<()> { let project = Project::load()?; let debounce = Duration::from_secs(delay_secs); - // Ignore new events for this long after a build completes let cooldown = Duration::from_secs(2); - print_watch_header(&project.config.documento.titulo, delay_secs); + print_watch_header(&project.config.document.title, delay_secs); + + let temp_dir = tempfile::tempdir()?; + let build_dir = temp_dir.path().to_path_buf(); let started = std::time::Instant::now(); - let result = run_build(&project); + let result = run_build(&project, &build_dir); redraw_status(&result, 1, started); let (tx, rx) = mpsc::channel(); @@ -50,7 +68,6 @@ pub fn watch(delay_secs: u64) -> Result<()> { watcher.watch(&project.root, RecursiveMode::Recursive)?; - let build_dir = project.root.join("build"); let mut pending = false; let mut last_event = std::time::Instant::now(); let mut last_build = std::time::Instant::now(); @@ -74,7 +91,6 @@ pub fn watch(delay_secs: u64) -> Result<()> { Err(_) => break, } - // Redraw timer every second even without a build if last_tick.elapsed() >= Duration::from_secs(1) { last_tick = std::time::Instant::now(); redraw_status(&last_result, build_count, started); @@ -83,7 +99,7 @@ pub fn watch(delay_secs: u64) -> Result<()> { if pending && last_event.elapsed() >= debounce { pending = false; build_count += 1; - last_result = run_build(&project); + last_result = run_build(&project, &build_dir); last_build = std::time::Instant::now(); redraw_status(&last_result, build_count, started); } @@ -99,7 +115,6 @@ fn print_watch_header(title: &str, delay_secs: u64) { } fn redraw_status(result: &WatchResult, build_count: u32, started: std::time::Instant) { - // Move to line 15 (just after header), clear from there down, redraw print!("\x1B[15;0H\x1B[J"); let e = started.elapsed().as_secs(); let session = format!("{:02}:{:02}:{:02}", e / 3600, (e % 3600) / 60, e % 60); @@ -107,7 +122,7 @@ fn redraw_status(result: &WatchResult, build_count: u32, started: std::time::Ins println!(" session \x1B[36m{session}\x1B[0m builds \x1B[36m{build_count}\x1B[0m"); println!(); match result { - WatchResult::Ok(pdf) => println!(" \x1B[32mbuild/{pdf} ok\x1B[0m"), + WatchResult::Ok(pdf) => println!(" \x1B[32m{pdf} ok\x1B[0m"), WatchResult::Err(err) => { println!(" \x1B[31merror:\x1B[0m"); for line in err.lines() { @@ -124,20 +139,29 @@ enum WatchResult { Err(String), } -fn run_build(project: &Project) -> WatchResult { - let _ = std::fs::create_dir_all(project.root.join("build")); - if let Err(e) = diagrams::process(&project.root, &project.config.compilacion.entry) { +fn run_build(project: &Project, build_dir: &Path) -> WatchResult { + let _ = std::fs::create_dir_all(build_dir); + if let Err(e) = diagrams::process(&project.root, &project.config.build.entry, build_dir) { return WatchResult::Err(e.to_string()); } - let build_dir = project.root.join("build"); - let entry_filename = std::path::Path::new(&project.config.compilacion.entry) + let entry_filename = Path::new(&project.config.build.entry) .file_name() .map(|n| n.to_string_lossy().to_string()) - .unwrap_or(project.config.compilacion.entry.clone()); - match compiler::compile(&build_dir, &entry_filename) { + .unwrap_or_else(|| project.config.build.entry.clone()); + match compiler::compile(build_dir, &entry_filename) { Ok(()) => { - let pdf = std::path::Path::new(&project.config.compilacion.entry).with_extension("pdf"); - WatchResult::Ok(pdf.display().to_string()) + let pdf_name = format!("{}.pdf", sanitize_filename(&project.config.document.title)); + let pdf_dest = project.root.join(&pdf_name); + let pdf_src = build_dir.join( + Path::new(&project.config.build.entry) + .with_extension("pdf") + .file_name() + .unwrap(), + ); + match std::fs::copy(&pdf_src, &pdf_dest) { + Ok(_) => WatchResult::Ok(pdf_name), + Err(e) => WatchResult::Err(e.to_string()), + } } Err(e) => WatchResult::Err(e.to_string()), } diff --git a/src/commands/check.rs b/src/commands/check.rs index 2122f05..044b54e 100644 --- a/src/commands/check.rs +++ b/src/commands/check.rs @@ -9,12 +9,12 @@ use crate::linter; pub fn execute() -> Result<()> { let project = Project::load()?; - println!("Checking project: {}", project.config.documento.titulo); + println!("Checking project: {}", project.config.document.title); let errors = linter::lint( &project.root, - &project.config.compilacion.entry, - project.config.compilacion.bibliografia.as_deref(), + &project.config.build.entry, + project.config.build.bibliography.as_deref(), )?; if errors.is_empty() { diff --git a/src/commands/clean.rs b/src/commands/clean.rs index a146ae1..c010dd9 100644 --- a/src/commands/clean.rs +++ b/src/commands/clean.rs @@ -3,18 +3,32 @@ use anyhow::Result; use crate::domain::project::Project; +use crate::utils::sanitize_filename; -/// Remove the build/ directory. +/// Remove generated PDF files and the legacy build/ directory from the project root. pub fn execute() -> Result<()> { let project = Project::load()?; - let build_dir = project.root.join("build"); + let titulo = &project.config.document.title; + let pdf_name = format!("{}.pdf", sanitize_filename(titulo)); + let pdf_path = project.root.join(&pdf_name); + let legacy_build = project.root.join("build"); - if !build_dir.exists() { - println!("Nothing to clean."); - return Ok(()); + let mut cleaned = false; + + if pdf_path.exists() { + std::fs::remove_file(&pdf_path)?; + println!(" ◇ {pdf_name} removed"); + cleaned = true; + } + + if legacy_build.is_dir() { + std::fs::remove_dir_all(&legacy_build)?; + println!(" ◇ build/ removed"); + cleaned = true; } - std::fs::remove_dir_all(&build_dir)?; - println!(" ◇ build/ removed"); + if !cleaned { + println!("Nothing to clean."); + } Ok(()) } diff --git a/src/commands/fmt.rs b/src/commands/fmt.rs index ef6fe0e..b7bfbb1 100644 --- a/src/commands/fmt.rs +++ b/src/commands/fmt.rs @@ -1,37 +1,33 @@ //! `texforge fmt` command implementation. +use std::path::Path; + use anyhow::Result; use crate::domain::project::Project; use crate::formatter; use crate::utils; -/// Format .tex files. +/// Format `.tex` and `.bib` files. pub fn execute(check: bool) -> Result<()> { let project = Project::load()?; - let files = utils::find_tex_files(&project.root)?; - if files.is_empty() { - println!("No .tex files found"); + let tex_files = utils::find_tex_files(&project.root)?; + let bib_files = utils::find_bib_files(&project.root)?; + let total = tex_files.len() + bib_files.len(); + + if total == 0 { + println!("No .tex or .bib files found"); return Ok(()); } let mut unformatted = 0; - for file in &files { - let content = std::fs::read_to_string(file)?; - let formatted = formatter::format(&content); - - if content != formatted { - let rel = file.strip_prefix(&project.root).unwrap_or(file).display(); - if check { - println!(" ✗ {}", rel); - unformatted += 1; - } else { - std::fs::write(file, &formatted)?; - println!(" formatted {}", rel); - } - } + for file in &tex_files { + unformatted += format_one(file, &project.root, check, formatter::format)?; + } + for file in &bib_files { + unformatted += format_one(file, &project.root, check, formatter::format_bib)?; } if check && unformatted > 0 { @@ -39,11 +35,30 @@ pub fn execute(check: bool) -> Result<()> { "{} file(s) need formatting — run 'texforge fmt'", unformatted ); - } else if !check { - println!(" ◇ {} file(s) checked", files.len()); - } else { + } else if check { println!(" ◇ All files formatted correctly"); + } else { + println!(" ◇ {} file(s) checked", total); } Ok(()) } + +/// Format a single file, returning 1 if it needed formatting (else 0). +fn format_one(file: &Path, root: &Path, check: bool, fmt: fn(&str) -> String) -> Result<usize> { + let content = std::fs::read_to_string(file)?; + let formatted = fmt(&content); + + if content == formatted { + return Ok(0); + } + + let rel = file.strip_prefix(root).unwrap_or(file).display(); + if check { + println!(" ✗ {}", rel); + } else { + std::fs::write(file, &formatted)?; + println!(" formatted {}", rel); + } + Ok(1) +} diff --git a/src/commands/init.rs b/src/commands/init.rs index caa3dc0..5b958dc 100644 --- a/src/commands/init.rs +++ b/src/commands/init.rs @@ -49,23 +49,23 @@ fn migrate(root: &Path) -> Result<()> { let entry = detect_entry(root).unwrap_or_else(|| "main.tex".to_string()); let bib = detect_bib(root); - let titulo = Text::new("Document title") + let title = Text::new("Document title") .with_default( root.file_name() .and_then(|n| n.to_str()) - .unwrap_or("documento"), + .unwrap_or("document"), ) .prompt()?; - let autor = Text::new("Author").with_default("Author").prompt()?; + let author = Text::new("Author").with_default("Author").prompt()?; let bib_line = match &bib { - Some(b) => format!("bibliografia = \"{}\"", b), - None => "# bibliografia = \"refs.bib\"".to_string(), + Some(b) => format!("bibliography = \"{}\"", b), + None => "# bibliography = \"refs.bib\"".to_string(), }; let project_toml = format!( - "[documento]\ntitulo = \"{titulo}\"\nautor = \"{autor}\"\ntemplate = \"general\"\n\n[compilacion]\nentry = \"{entry}\"\n{bib_line}\n" + "[document]\ntitle = \"{title}\"\nauthor = \"{author}\"\ntemplate = \"general\"\n\n[build]\nentry = \"{entry}\"\n{bib_line}\n" ); std::fs::write(root.join("project.toml"), &project_toml)?; diff --git a/src/commands/new.rs b/src/commands/new.rs index c2d152e..879f6ae 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -1,9 +1,12 @@ //! `texforge new` command implementation. +use std::collections::HashMap; use std::path::{Component, Path}; use anyhow::{Context, Result}; +use crate::manifest::TemplateManifest; +use crate::placeholders::PlaceholderResolver; use crate::templates; /// Create a new project from a template. @@ -24,6 +27,13 @@ pub fn execute(name: &str, template: Option<&str>) -> Result<()> { let resolved = templates::resolve(template_name)?; + // Resolve any placeholders the template declares (defaults, project/user + // config). Missing values are left as-is rather than failing generation. + // The project name doubles as the document title unless overridden. + let mut cli_args = HashMap::new(); + cli_args.insert("title".to_string(), name.to_string()); + let values = resolve_placeholder_values(&resolved.files, cli_args); + // Create project directory and write all template files for (rel_path, content) in &resolved.files { // Skip template.toml — it's metadata, not a project file @@ -34,20 +44,29 @@ pub fn execute(name: &str, template: Option<&str>) -> Result<()> { if let Some(parent) = dest.parent() { std::fs::create_dir_all(parent)?; } - std::fs::write(&dest, content) - .with_context(|| format!("Failed to write {}", dest.display()))?; + // Substitute {{placeholder}} tokens in .tex files only — other files + // (code samples, images) are copied verbatim. + if rel_path.ends_with(".tex") { + let text = String::from_utf8_lossy(content); + let substituted = apply_substitutions(&text, &values); + std::fs::write(&dest, substituted) + } else { + std::fs::write(&dest, content) + } + .with_context(|| format!("Failed to write {}", dest.display()))?; } // Generate project.toml + let author = values.get("author").map_or("Author", String::as_str); let project_toml = format!( - r#"[documento] -titulo = "{name}" -autor = "Author" + r#"[document] +title = "{name}" +author = "{author}" template = "{template_name}" -[compilacion] +[build] entry = "main.tex" -bibliografia = "bib/references.bib" +bibliography = "bib/references.bib" "# ); std::fs::write(project_dir.join("project.toml"), project_toml)?; @@ -63,6 +82,44 @@ bibliografia = "bib/references.bib" Ok(()) } +/// Resolve placeholder values from a template's manifest, if present. +/// Returns an empty map for templates without a (valid) `template.toml` or +/// without declared placeholders. +fn resolve_placeholder_values( + files: &HashMap<String, Vec<u8>>, + cli_args: HashMap<String, String>, +) -> HashMap<String, String> { + let mut values = HashMap::new(); + + let Some(toml_bytes) = files.get("template.toml") else { + return values; + }; + let Ok(text) = std::str::from_utf8(toml_bytes) else { + return values; + }; + let Ok(manifest) = TemplateManifest::from_str(text) else { + return values; + }; + + let resolver = PlaceholderResolver::new(cli_args); + for ph in &manifest.placeholders { + if let Ok(Some(value)) = resolver.resolve(ph) { + values.insert(ph.name.clone(), value); + } + } + values +} + +/// Replace `{{name}}` tokens with resolved values. Unresolved tokens are left +/// untouched (lenient — never fails generation). +fn apply_substitutions(content: &str, values: &HashMap<String, String>) -> String { + let mut out = content.to_string(); + for (key, value) in values { + out = out.replace(&format!("{{{{{}}}}}", key), value); + } + out +} + /// Validate project name: no empty, no path traversal, no special chars. pub(crate) fn validate_project_name(name: &str) -> Result<()> { if name.is_empty() { diff --git a/src/commands/template.rs b/src/commands/template.rs index 77c4831..f7e952b 100644 --- a/src/commands/template.rs +++ b/src/commands/template.rs @@ -4,8 +4,9 @@ use anyhow::Result; use crate::templates; -/// List available templates. -pub fn list(all: bool) -> Result<()> { +/// List available templates. By default also queries the remote registry; +/// pass `include_remote = false` (via `--local`) to list only installed ones. +pub fn list(include_remote: bool) -> Result<()> { let cached = templates::list_cached()?; let installed: std::collections::HashSet<&str> = cached.iter().map(String::as_str).collect(); @@ -15,7 +16,7 @@ pub fn list(all: bool) -> Result<()> { println!(" - {}", name); } - if all { + if include_remote { print!("\nFetching remote registry..."); match templates::list_remote() { Ok(remote) => { diff --git a/src/compiler/mod.rs b/src/compiler/mod.rs index d07d4ff..aeb275d 100644 --- a/src/compiler/mod.rs +++ b/src/compiler/mod.rs @@ -57,26 +57,9 @@ fn parse_errors(raw: &str) -> Vec<CompileError> { let trimmed = line.trim(); if let Some(rest) = trimmed.strip_prefix("error:") { - let rest = rest.trim(); - if let Some((loc, msg)) = rest.split_once(": ") { - if let Some((file, line_str)) = loc.rsplit_once(':') { - if let Ok(line_num) = line_str.parse::<usize>() { - errors.push(CompileError { - file: file.trim().to_string(), - line: line_num, - message: msg.trim().to_string(), - }); - continue; - } - } - } - errors.push(CompileError { - file: String::new(), - line: 0, - message: rest.to_string(), - }); + parse_tectonic_error(rest, &mut errors); + continue; } - if let Some(msg) = trimmed.strip_prefix("! ") { errors.push(CompileError { file: String::new(), @@ -97,6 +80,27 @@ fn parse_errors(raw: &str) -> Vec<CompileError> { errors } +fn parse_tectonic_error(rest: &str, errors: &mut Vec<CompileError>) { + let rest = rest.trim(); + if let Some((loc, msg)) = rest.split_once(": ") { + if let Some((file, line_str)) = loc.rsplit_once(':') { + if let Ok(line_num) = line_str.parse::<usize>() { + errors.push(CompileError { + file: file.trim().to_string(), + line: line_num, + message: msg.trim().to_string(), + }); + return; + } + } + } + errors.push(CompileError { + file: String::new(), + line: 0, + message: rest.to_string(), + }); +} + /// Find the tectonic binary in PATH or known locations, auto-installing if needed. fn find_tectonic() -> Result<std::path::PathBuf> { if let Some(path) = locate_tectonic() { @@ -132,8 +136,8 @@ fn locate_tectonic() -> Option<std::path::PathBuf> { // Check known locations [ - dirs::home_dir().map(|h| h.join(".texforge/bin/tectonic")), - dirs::home_dir().map(|h| h.join(".cargo/bin/tectonic")), + tectonic_managed_path().ok(), + dirs::home_dir().map(|h| h.join(".cargo/bin").join(TECTONIC_BIN)), Some("/usr/local/bin/tectonic".into()), Some("/opt/homebrew/bin/tectonic".into()), ] @@ -142,9 +146,15 @@ fn locate_tectonic() -> Option<std::path::PathBuf> { .find(|p| p.exists()) } +/// Tectonic binary filename — Windows requires the .exe extension to execute it. +#[cfg(windows)] +const TECTONIC_BIN: &str = "tectonic.exe"; +#[cfg(not(windows))] +const TECTONIC_BIN: &str = "tectonic"; + fn tectonic_managed_path() -> Result<std::path::PathBuf> { dirs::home_dir() - .map(|h| h.join(".texforge/bin/tectonic")) + .map(|h| h.join(".texforge").join("bin").join(TECTONIC_BIN)) .ok_or_else(|| anyhow::anyhow!("Could not determine home directory")) } diff --git a/src/diagrams/mod.rs b/src/diagrams/mod.rs index 9832eee..ed5aa1b 100644 --- a/src/diagrams/mod.rs +++ b/src/diagrams/mod.rs @@ -6,22 +6,21 @@ //! Works on copies in `build/` — the original .tex files are never modified. use std::collections::HashMap; +use std::hash::{Hash, Hasher}; use std::path::{Path, PathBuf}; +use std::sync::{Arc, OnceLock}; use anyhow::{Context, Result}; -/// Copy all .tex files to `build/`, rendering embedded diagrams in the copies. +/// Copy all .tex files to `build_dir`, rendering embedded diagrams in the copies. /// Also mirrors non-.tex assets so tectonic can resolve relative paths. /// Returns the path to the build copy of `entry`. -pub fn process(root: &Path, entry: &str) -> Result<PathBuf> { - let build_dir = root.join("build"); - std::fs::create_dir_all(&build_dir)?; +pub fn process(root: &Path, entry: &str, build_dir: &Path) -> Result<PathBuf> { + std::fs::create_dir_all(build_dir)?; let diagrams_dir = build_dir.join("diagrams"); std::fs::create_dir_all(&diagrams_dir)?; - let mut counter = 0usize; - // Process .tex files let tex_files = collect_tex_files(root, entry); for src in &tex_files { @@ -31,37 +30,55 @@ pub fn process(root: &Path, entry: &str) -> Result<PathBuf> { std::fs::create_dir_all(parent)?; } let content = std::fs::read_to_string(src)?; - let processed = render_diagrams(&content, &diagrams_dir, &mut counter) + let processed = render_diagrams(&content, &diagrams_dir) .with_context(|| format!("Failed to render diagrams in {}", src.display()))?; std::fs::write(&dest, processed)?; } // Mirror asset files so tectonic resolves relative paths - crate::utils::mirror_assets(root, &build_dir)?; + crate::utils::mirror_assets(root, build_dir)?; Ok(build_dir.join(entry)) } /// Replace all `\begin{mermaid}[opts]...\end{mermaid}` with figure environments. -fn render_diagrams(content: &str, diagrams_dir: &Path, counter: &mut usize) -> Result<String> { - let content = render_env(content, "mermaid", diagrams_dir, counter, |src| { - let svg = mermaid_rs_renderer::render(src) +fn render_diagrams(content: &str, diagrams_dir: &Path) -> Result<String> { + let content = render_env(content, "mermaid", diagrams_dir, |src| { + let svg = render_mermaid_with_config(src) .map_err(|e| anyhow::anyhow!("Mermaid render error: {}", e))?; svg_to_png(&svg).context("Failed to convert mermaid SVG to PNG") })?; - let content = render_env(&content, "graphviz", diagrams_dir, counter, |src| { + let content = render_env(&content, "graphviz", diagrams_dir, |src| { let svg = render_graphviz(src)?; svg_to_png(&svg).context("Failed to convert graphviz SVG to PNG") })?; + let content = render_env(&content, "d2", diagrams_dir, |src| { + let svg = render_d2(src)?; + svg_to_png(&svg).context("Failed to convert D2 SVG to PNG") + })?; Ok(content) } +/// Render Mermaid diagram with improved configuration for better layout. +fn render_mermaid_with_config(src: &str) -> Result<String> { + // Try with default configuration first + mermaid_rs_renderer::render(src).map_err(|e| { + // If default fails, try with explicit configuration + anyhow::anyhow!( + "Mermaid render error: {}. Consider checking diagram syntax.", + e + ) + }) +} + /// Generic environment renderer: replaces `\begin{env}[opts]...\end{env}` with figure. +/// +/// Rendered PNGs are named after a hash of the diagram source, so unchanged +/// diagrams are reused across rebuilds (watch mode) instead of re-rendered. pub(crate) fn render_env( content: &str, env: &str, diagrams_dir: &Path, - counter: &mut usize, render_fn: impl Fn(&str) -> Result<Vec<u8>>, ) -> Result<String> { let begin_tag = format!("\\begin{{{}}}", env); @@ -76,50 +93,107 @@ pub(crate) fn render_env( let after_begin = &remaining[start + begin_tag.len()..]; let (opts, after_opts) = parse_opts(after_begin); - let end = after_opts - .find(&*end_tag) - .with_context(|| format!("\\begin{{{}}} without matching \\end{{{}}}", env, env))?; - + let end = find_end_tag(after_opts, &end_tag, env)?; let diagram_src = after_opts[..end].trim(); - // Fail fast: validate pos before doing any rendering work - let pos = opts.get("pos").map(String::as_str).unwrap_or("H"); - if !["H", "t", "b", "h", "p"].contains(&pos) { - anyhow::bail!( - "Invalid {} option pos='{}' — valid values are: H, t, b, h, p", - env, - pos - ); + validate_pos_option(&opts, env)?; + + let filename = format!("{}-{:016x}.png", env, content_hash(diagram_src)); + if !diagrams_dir.join(&filename).exists() { + let png = render_fn(diagram_src)?; + std::fs::write(diagrams_dir.join(&filename), png)?; } + let fig_env = build_figure_environment(&opts, env, &filename)?; - let png = render_fn(diagram_src)?; + result.push_str(&fig_env); + remaining = &after_opts[end + end_tag.len()..]; + } - *counter += 1; - let filename = format!("diagram-{}.png", counter); - std::fs::write(diagrams_dir.join(&filename), &png)?; + result.push_str(remaining); + Ok(result) +} - // Build figure environment - let width = opts - .get("width") - .map(String::as_str) - .unwrap_or("\\linewidth"); - let caption = opts.get("caption"); - let rel_path = format!("diagrams/{}", filename); +/// Stable-enough 64-bit hash of diagram source for cache filenames. +fn content_hash(src: &str) -> u64 { + let mut hasher = std::collections::hash_map::DefaultHasher::new(); + src.hash(&mut hasher); + hasher.finish() +} - let mut fig = format!( - "\\begin{{figure}}[{pos}]\n \\centering\n \\includegraphics[width={width}]{{{rel_path}}}\n" +/// Find the end tag position and validate it exists. +fn find_end_tag(after_opts: &str, end_tag: &str, env: &str) -> Result<usize> { + after_opts + .find(end_tag) + .with_context(|| format!("\\begin{{{}}} without matching \\end{{{}}}", env, env)) +} + +/// Validate the pos option is one of the allowed values. +fn validate_pos_option(opts: &HashMap<String, String>, env: &str) -> Result<()> { + let pos = opts.get("pos").map(String::as_str).unwrap_or("H"); + if !["H", "t", "b", "h", "p"].contains(&pos) { + anyhow::bail!( + "Invalid {} option pos='{}' — valid values are: H, t, b, h, p", + env, + pos ); - if let Some(cap) = caption { - fig.push_str(&format!(" \\caption{{{}}}\n", cap)); + } + Ok(()) +} + +/// Build the figure environment LaTeX code. +fn build_figure_environment( + opts: &HashMap<String, String>, + _env: &str, + filename: &str, +) -> Result<String> { + let pos = opts.get("pos").map(String::as_str); + let width = opts.get("width").map(String::as_str); + let height = opts.get("height").map(String::as_str); + let scale = opts.get("scale").map(String::as_str); + let keepaspectratio = opts.contains_key("keepaspectratio"); + let label = opts.get("label").map(String::as_str); + let rel_path = format!("diagrams/{}", filename); + + let mut include_opts = Vec::new(); + if let Some(s) = scale { + include_opts.push(format!("scale={s}")); + } else { + if let Some(w) = width { + include_opts.push(format!("width={w}")); } - fig.push_str("\\end{figure}"); + if let Some(h) = height { + include_opts.push(format!("height={h}")); + } + } + if keepaspectratio { + include_opts.push("keepaspectratio".to_string()); + } + let include_str = if include_opts.is_empty() { + "width=\\linewidth".to_string() + } else { + include_opts.join(",") + }; - result.push_str(&fig); - remaining = &after_opts[end + end_tag.len()..]; + let pos_str = pos.map(|p| format!("[{p}]")).unwrap_or_default(); + let mut fig = format!( + "\\begin{{figure}}{pos_str}\n \\centering\n \\includegraphics[{include_str}]{{{rel_path}}}\n" + ); + + add_caption_if_present(opts, &mut fig)?; + if let Some(lbl) = label { + fig.push_str(&format!(" \\label{{{lbl}}}\n")); } + fig.push_str("\\end{figure}"); - result.push_str(remaining); - Ok(result) + Ok(fig) +} + +/// Add caption to figure environment if present in options. +fn add_caption_if_present(opts: &HashMap<String, String>, fig: &mut String) -> Result<()> { + if let Some(cap) = opts.get("caption") { + fig.push_str(&format!(" \\caption{{{}}}\n", cap)); + } + Ok(()) } /// Render a DOT/Graphviz diagram to SVG using layout-rs (pure Rust). @@ -144,6 +218,12 @@ fn render_graphviz(src: &str) -> Result<String> { Ok(svg.finalize()) } +/// Render a D2 diagram to SVG using d2-little (pure Rust port of the d2lang pipeline). +fn render_d2(src: &str) -> Result<String> { + let svg = d2_little::d2_to_svg(src).map_err(|e| anyhow::anyhow!("D2 render error: {}", e))?; + String::from_utf8(svg).context("D2 produced non-UTF8 SVG") +} + /// Parse `[key=val, key2=val2]` into a map. Returns `(map, rest_of_str)`. pub(crate) fn parse_opts(s: &str) -> (HashMap<String, String>, &str) { let s = s.trim_start_matches('\n').trim_start_matches('\r'); @@ -212,11 +292,28 @@ fn resolve_tex(root: &Path, input: &str) -> PathBuf { } } +/// Shared font database — building it scans system font directories (very slow +/// on WSL, where /mnt/c/Windows/Fonts goes through the 9P filesystem), so it is +/// built once and reused for every diagram. +fn shared_fontdb() -> Arc<resvg::usvg::fontdb::Database> { + static FONTDB: OnceLock<Arc<resvg::usvg::fontdb::Database>> = OnceLock::new(); + FONTDB.get_or_init(|| Arc::new(build_fontdb())).clone() +} + /// Build a font database with system fonts and platform-specific fallbacks. fn build_fontdb() -> resvg::usvg::fontdb::Database { use resvg::usvg::fontdb::Database; let mut db = Database::new(); + load_system_and_platform_fonts(&mut db); + load_fallback_font_directories(&mut db); + configure_font_families(&mut db); + + db +} + +/// Load system fonts and platform-specific fonts (Windows/WSL). +fn load_system_and_platform_fonts(db: &mut resvg::usvg::fontdb::Database) { db.load_system_fonts(); // On WSL / Windows, also load the Windows font directory @@ -224,7 +321,10 @@ fn build_fontdb() -> resvg::usvg::fontdb::Database { if win_fonts.is_dir() { db.load_fonts_dir(win_fonts); } +} +/// Load fallback font directories if no fonts were found. +fn load_fallback_font_directories(db: &mut resvg::usvg::fontdb::Database) { // If the DB still has no fonts at all, try common directories explicitly. if db.is_empty() { for dir in ["/usr/share/fonts", "/usr/local/share/fonts"] { @@ -234,7 +334,10 @@ fn build_fontdb() -> resvg::usvg::fontdb::Database { } } } +} +/// Configure font families based on available fonts. +fn configure_font_families(db: &mut resvg::usvg::fontdb::Database) { // Collect the set of available family names once (avoids borrow conflicts). let available: std::collections::HashSet<String> = db .faces() @@ -242,10 +345,34 @@ fn build_fontdb() -> resvg::usvg::fontdb::Database { .collect(); // Map generic CSS families to the first concrete font we find in the DB. + configure_sans_serif_family(db, &available); + configure_serif_family(db, &available); + configure_monospace_family(db, &available); +} + +/// Configure sans-serif font family. +/// +/// D2 diagrams reference embedded font-family names that never resolve directly, +/// so their text relies entirely on this sans-serif fallback. If none of the +/// preferred fonts exist, fall back to any available family so text never +/// silently disappears on minimal systems. +fn configure_sans_serif_family( + db: &mut resvg::usvg::fontdb::Database, + available: &std::collections::HashSet<String>, +) { let sans = ["Arial", "DejaVu Sans", "Liberation Sans", "Noto Sans"]; if let Some(f) = sans.iter().find(|n| available.contains(**n)) { db.set_sans_serif_family(*f); + } else if let Some(any) = available.iter().next() { + db.set_sans_serif_family(any.clone()); } +} + +/// Configure serif font family. +fn configure_serif_family( + db: &mut resvg::usvg::fontdb::Database, + available: &std::collections::HashSet<String>, +) { let serif = [ "Times New Roman", "DejaVu Serif", @@ -255,6 +382,13 @@ fn build_fontdb() -> resvg::usvg::fontdb::Database { if let Some(f) = serif.iter().find(|n| available.contains(**n)) { db.set_serif_family(*f); } +} + +/// Configure monospace font family. +fn configure_monospace_family( + db: &mut resvg::usvg::fontdb::Database, + available: &std::collections::HashSet<String>, +) { let mono = [ "Courier New", "DejaVu Sans Mono", @@ -264,33 +398,36 @@ fn build_fontdb() -> resvg::usvg::fontdb::Database { if let Some(f) = mono.iter().find(|n| available.contains(**n)) { db.set_monospace_family(*f); } - - db } -/// Convert SVG string to PNG bytes at 2x scale for print quality. -fn svg_to_png(svg: &str) -> Result<Vec<u8>> { - let fontdb = build_fontdb(); +/// Rasterization scale for SVG → PNG. Mermaid SVGs are sized in CSS pixels +/// (~96 dpi); 3x yields ~300 dpi when the figure is included at \linewidth, +/// which is print quality. +const RASTER_SCALE: f32 = 3.0; +/// Convert SVG string to PNG bytes at print resolution. +fn svg_to_png(svg: &str) -> Result<Vec<u8>> { let options = resvg::usvg::Options { - fontdb: std::sync::Arc::new(fontdb), + fontdb: shared_fontdb(), + shape_rendering: resvg::usvg::ShapeRendering::GeometricPrecision, + text_rendering: resvg::usvg::TextRendering::OptimizeLegibility, ..Default::default() }; let tree = resvg::usvg::Tree::from_str(svg, &options).context("Failed to parse SVG")?; - let scale = 2.0_f32; - let width = (tree.size().width() * scale) as u32; - let height = (tree.size().height() * scale) as u32; + let original_size = tree.size(); + let padding = 10.0; // padding (in SVG units) so strokes at the edge aren't clipped + let width = ((original_size.width() + padding * 2.0) * RASTER_SCALE) as u32; + let height = ((original_size.height() + padding * 2.0) * RASTER_SCALE) as u32; let mut pixmap = resvg::tiny_skia::Pixmap::new(width, height).context("Failed to create pixmap")?; - resvg::render( - &tree, - resvg::tiny_skia::Transform::from_scale(scale, scale), - &mut pixmap.as_mut(), - ); + let transform = resvg::tiny_skia::Transform::from_scale(RASTER_SCALE, RASTER_SCALE) + .post_translate(padding * RASTER_SCALE, padding * RASTER_SCALE); + + resvg::render(&tree, transform, &mut pixmap.as_mut()); pixmap.encode_png().context("Failed to encode PNG") } @@ -319,6 +456,69 @@ mod tests { assert_eq!(map.get("caption").map(String::as_str), Some("My diagram")); } + #[test] + fn parse_opts_label_and_height() { + let (map, _) = parse_opts("[label=fig:my-diagram, height=5cm]"); + assert_eq!(map.get("label").map(String::as_str), Some("fig:my-diagram")); + assert_eq!(map.get("height").map(String::as_str), Some("5cm")); + } + + #[test] + fn build_figure_with_label() { + let mut opts = HashMap::new(); + opts.insert("caption".to_string(), "Test".to_string()); + opts.insert("label".to_string(), "fig:test".to_string()); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("\\label{fig:test}")); + assert!(fig.contains("\\caption{Test}")); + assert!(fig.contains("\\begin{figure}")); + } + + #[test] + fn build_figure_with_height() { + let mut opts = HashMap::new(); + opts.insert("height".to_string(), "5cm".to_string()); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("height=5cm")); + } + + #[test] + fn build_figure_with_width_and_height() { + let mut opts = HashMap::new(); + opts.insert("width".to_string(), "0.5\\linewidth".to_string()); + opts.insert("height".to_string(), "4cm".to_string()); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("width=0.5\\linewidth")); + assert!(fig.contains("height=4cm")); + } + + #[test] + fn build_figure_with_scale() { + let mut opts = HashMap::new(); + opts.insert("scale".to_string(), "0.8".to_string()); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("scale=0.8")); + assert!(!fig.contains("width=")); + } + + #[test] + fn build_figure_with_keepaspectratio() { + let mut opts = HashMap::new(); + opts.insert("width".to_string(), "10cm".to_string()); + opts.insert("height".to_string(), "8cm".to_string()); + opts.insert("keepaspectratio".to_string(), "true".to_string()); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("keepaspectratio")); + } + + #[test] + fn build_figure_default_no_pos() { + let opts = HashMap::new(); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("\\begin{figure}\n")); + assert!(!fig.contains("[H]")); + } + #[test] fn render_graphviz_produces_svg() { let dot = "digraph G { A -> B }"; @@ -330,28 +530,74 @@ mod tests { ); } + #[test] + fn render_d2_produces_svg() { + let svg = render_d2("a -> b -> c").unwrap(); + assert!( + svg.contains("<svg"), + "expected SVG output, got: {}", + &svg[..100.min(svg.len())] + ); + } + + #[test] + fn render_d2_to_png_via_pipeline() { + let dir = tempfile::tempdir().unwrap(); + let content = "\\begin{d2}[caption=Flow]\nx -> y: go\n\\end{d2}"; + let out = render_diagrams(content, dir.path()).unwrap(); + assert!(out.contains("\\includegraphics")); + assert!(out.contains("\\caption{Flow}")); + // exactly one cached PNG written + let pngs = std::fs::read_dir(dir.path()).unwrap().count(); + assert_eq!(pngs, 1); + } + #[test] fn render_env_no_blocks_unchanged() { let content = "hello world"; let dir = tempfile::tempdir().unwrap(); - let mut counter = 0; - let result = render_env(content, "graphviz", dir.path(), &mut counter, |_| { - Ok(vec![]) - }) - .unwrap(); + let result = render_env(content, "graphviz", dir.path(), |_| Ok(vec![])).unwrap(); assert_eq!(result, content); - assert_eq!(counter, 0); + assert_eq!(std::fs::read_dir(dir.path()).unwrap().count(), 0); } #[test] fn render_env_invalid_pos_returns_error() { let content = "\\begin{graphviz}[pos=Z]\ndigraph G{}\n\\end{graphviz}"; let dir = tempfile::tempdir().unwrap(); - let mut counter = 0; - let err = render_env(content, "graphviz", dir.path(), &mut counter, |_| { - Ok(vec![1, 2, 3]) - }) - .unwrap_err(); + let err = render_env(content, "graphviz", dir.path(), |_| Ok(vec![1, 2, 3])).unwrap_err(); assert!(err.to_string().contains("pos='Z'")); } + + #[test] + fn render_env_reuses_cached_diagram() { + let content = "\\begin{graphviz}\ndigraph G{ A -> B }\n\\end{graphviz}"; + let dir = tempfile::tempdir().unwrap(); + let calls = std::cell::Cell::new(0u32); + // render twice into the same dir — second pass must hit the cache + for _ in 0..2 { + render_env(content, "graphviz", dir.path(), |_| { + calls.set(calls.get() + 1); + Ok(vec![1, 2, 3]) + }) + .unwrap(); + } + assert_eq!(calls.get(), 1); + assert_eq!(std::fs::read_dir(dir.path()).unwrap().count(), 1); + } + + #[test] + fn build_figure_default_uses_linewidth() { + let opts = HashMap::new(); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("\\includegraphics[width=\\linewidth]")); + } + + #[test] + fn build_figure_with_pos_t() { + let mut opts = HashMap::new(); + opts.insert("pos".to_string(), "t".to_string()); + let fig = build_figure_environment(&opts, "mermaid", "d1.png").unwrap(); + assert!(fig.contains("\\begin{figure}[t]")); + } } diff --git a/src/domain/project.rs b/src/domain/project.rs index d5efabd..945d823 100644 --- a/src/domain/project.rs +++ b/src/domain/project.rs @@ -8,22 +8,22 @@ use serde::{Deserialize, Serialize}; /// Project configuration from project.toml. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ProjectConfig { - pub documento: DocumentoConfig, - pub compilacion: CompilacionConfig, + pub document: DocumentConfig, + pub build: BuildConfig, } #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct DocumentoConfig { - pub titulo: String, - pub autor: String, +pub struct DocumentConfig { + pub title: String, + pub author: String, pub template: String, } #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct CompilacionConfig { +pub struct BuildConfig { pub entry: String, #[serde(default)] - pub bibliografia: Option<String>, + pub bibliography: Option<String>, } /// Represents a `TexForge` project. diff --git a/src/formatter/mod.rs b/src/formatter/mod.rs index a9ea0c4..f706d46 100644 --- a/src/formatter/mod.rs +++ b/src/formatter/mod.rs @@ -1,37 +1,40 @@ -//! LaTeX code formatter. +//! LaTeX + BibTeX code formatter. //! -//! Opinionated formatter inspired by `rustfmt` — one canonical output -//! regardless of input style. +//! Opinionated, deterministic formatter inspired by `rustfmt` — one canonical +//! output regardless of input style. It re-indents by nesting level +//! (environments *and* unbalanced braces), trims trailing whitespace, and +//! collapses runs of blank lines. It never reflows paragraph text or touches +//! the contents of verbatim-like environments. const INDENT: &str = " "; -/// Environments whose content must not be modified. +/// Environments whose content must be passed through untouched. const VERBATIM_ENVS: &[&str] = &["verbatim", "lstlisting", "minted", "Verbatim"]; /// Format LaTeX source code with consistent style. pub fn format(source: &str) -> String { - let mut output = Vec::new(); + let mut output: Vec<String> = Vec::new(); let mut depth: usize = 0; let mut prev_blank = false; let mut verbatim: Option<String> = None; for line in source.lines() { - // Inside verbatim: pass through untouched until matching \end + // Inside a verbatim environment: emit raw until the matching \end. if let Some(ref env) = verbatim { let end_tag = format!("\\end{{{}}}", env); - if line.trim().starts_with(&end_tag) { - verbatim = None; + if line.trim_start().starts_with(&end_tag) { depth = depth.saturating_sub(1); - output.push(line.trim().to_string()); + output.push(indent_line(depth, line.trim())); + verbatim = None; } else { - output.push(line.to_string()); + output.push(line.trim_end().to_string()); } continue; } let trimmed = line.trim(); - // Collapse multiple blank lines into one + // Collapse runs of blank lines into a single blank line. if trimmed.is_empty() { if !prev_blank && !output.is_empty() { output.push(String::new()); @@ -41,74 +44,83 @@ pub fn format(source: &str) -> String { } prev_blank = false; - // Dedent for \end{...} - if trimmed.starts_with("\\end{") { - depth = depth.saturating_sub(1); - } - - let indented = if depth > 0 - && !trimmed.starts_with("\\begin{") - && !trimmed.starts_with("\\end{") - && !is_structural_command(trimmed) - { - format!("{}{}", INDENT.repeat(depth), trimmed) - } else { - trimmed.to_string() - }; - - output.push(indented); + // Lines that *open* with a closer dedent before being placed, so the + // closer aligns with whatever opened it. + let display_depth = depth.saturating_sub(leading_dedent(trimmed)); + output.push(indent_line(display_depth, trimmed)); - // Indent after \begin{...} and check for verbatim - if trimmed.starts_with("\\begin{") { - if let Some(env) = extract_env_name(trimmed) { - if VERBATIM_ENVS.contains(&env.as_str()) { - verbatim = Some(env); - } - } + // A verbatim opener freezes formatting until its \end. + if let Some(env) = verbatim_opener(trimmed) { depth += 1; + verbatim = Some(env); + continue; } + + // Apply this line's net nesting change to the running depth. + let delta = nesting_delta(trimmed); + depth = (depth as i32 + delta).max(0) as usize; } - // Remove trailing blank lines + // Drop trailing blank lines, guarantee a single final newline. while output.last().is_some_and(|l| l.is_empty()) { output.pop(); } - let mut result = output.join("\n"); result.push('\n'); result } -/// Commands that should not be indented even inside environments. -fn is_structural_command(line: &str) -> bool { - const STRUCTURAL: &[&str] = &[ - "\\begin{", - "\\end{", - "\\documentclass", - "\\usepackage", - "\\section", - "\\subsection", - "\\chapter", - "\\title", - "\\author", - "\\date", - "\\maketitle", - "\\tableofcontents", - "\\input", - "\\bibliography", - "\\bibliographystyle", - "\\newcommand", - "\\renewcommand", - "\\pagestyle", - "\\geometry", - "\\hypersetup", - "\\numberwithin", - "\\titleformat", - "\\titlespacing", - "\\fancyhf", - "\\cfoot", - ]; - STRUCTURAL.iter().any(|cmd| line.starts_with(cmd)) +fn indent_line(depth: usize, content: &str) -> String { + if content.is_empty() { + String::new() + } else { + format!("{}{}", INDENT.repeat(depth), content) + } +} + +/// How many levels a line should dedent *before* being placed, based on the +/// closers it opens with (`\end{...}` or a run of leading `}` / `]`). +fn leading_dedent(line: &str) -> usize { + if line.starts_with("\\end{") { + return 1; + } + line.chars().take_while(|&c| c == '}' || c == ']').count() +} + +/// Net nesting change a line contributes: `\begin`/`\end` plus the balance of +/// unescaped braces and brackets (comments and escaped delimiters ignored). +fn nesting_delta(line: &str) -> i32 { + let mut delta = count_occurrences(line, "\\begin{") as i32; + delta -= count_occurrences(line, "\\end{") as i32; + + let mut escaped = false; + for ch in line.chars() { + if escaped { + escaped = false; + continue; + } + match ch { + '\\' => escaped = true, + '%' => break, // rest of the line is a comment + '{' | '[' => delta += 1, + '}' | ']' => delta -= 1, + _ => {} + } + } + delta +} + +/// If the line opens a verbatim-like environment, return its name. +fn verbatim_opener(line: &str) -> Option<String> { + if !line.starts_with("\\begin{") { + return None; + } + let env = extract_env_name(line)?; + VERBATIM_ENVS.contains(&env.as_str()).then_some(env) +} + +fn count_occurrences(haystack: &str, needle: &str) -> usize { + haystack.matches(needle).count() } /// Extract environment name from `\begin{envname}`. @@ -118,6 +130,240 @@ fn extract_env_name(line: &str) -> Option<String> { Some(line[start..start + end].to_string()) } +// --------------------------------------------------------------------------- +// BibTeX formatter +// --------------------------------------------------------------------------- + +/// Format a `.bib` file: one field per line, two-space indent, aligned `=`, +/// lowercased entry types and field names, trailing comma after every field. +/// +/// Conservative by design — if the input can't be parsed cleanly (junk outside +/// entries, unbalanced delimiters, …) the original source is returned untouched +/// rather than risk corrupting references. +pub fn format_bib(source: &str) -> String { + match try_format_bib(source) { + Some(formatted) => formatted, + None => source.to_string(), + } +} + +struct BibEntry { + kind: String, + key: Option<String>, + fields: Vec<(String, String)>, +} + +fn try_format_bib(source: &str) -> Option<String> { + let chars: Vec<char> = source.chars().collect(); + let n = chars.len(); + let mut i = 0; + let mut entries = Vec::new(); + + while i < n { + while i < n && chars[i].is_whitespace() { + i += 1; + } + if i >= n { + break; + } + // Any non-whitespace outside an entry is content we don't understand. + if chars[i] != '@' { + return None; + } + i += 1; + + let kind_start = i; + while i < n && chars[i].is_alphanumeric() { + i += 1; + } + let kind: String = chars[kind_start..i].iter().collect(); + if kind.is_empty() { + return None; + } + + while i < n && chars[i].is_whitespace() { + i += 1; + } + if i >= n { + return None; + } + let open = match chars[i] { + '{' => '{', + '(' => '(', + _ => return None, + }; + i += 1; + + let body_start = i; + let mut brace_depth = 0i32; + let mut in_quote = false; + loop { + if i >= n { + return None; // unterminated entry + } + let c = chars[i]; + if in_quote { + if c == '"' { + in_quote = false; + } + } else { + match c { + '"' => in_quote = true, + '{' => brace_depth += 1, + '}' => { + if open == '{' && brace_depth == 0 { + break; + } + brace_depth -= 1; + } + ')' if open == '(' && brace_depth == 0 => break, + _ => {} + } + } + i += 1; + } + let body: String = chars[body_start..i].iter().collect(); + i += 1; // consume closing delimiter + + entries.push(parse_bib_body(&kind, &body)?); + } + + if entries.is_empty() { + return None; + } + + let mut blocks: Vec<String> = Vec::new(); + for entry in &entries { + blocks.push(render_bib_entry(entry)); + } + let mut out = blocks.join("\n\n"); + out.push('\n'); + Some(out) +} + +fn parse_bib_body(kind: &str, body: &str) -> Option<BibEntry> { + let segments = split_top_level(body); + let kind_l = kind.to_lowercase(); + + // @string / @preamble have no citation key; everything is a field/value. + let key_less = matches!(kind_l.as_str(), "string" | "preamble"); + + let mut iter = segments.into_iter(); + let mut key = None; + if !key_less { + let first = iter.next()?.trim().to_string(); + if first.is_empty() || first.contains('=') { + return None; + } + key = Some(first); + } + + let mut fields = Vec::new(); + for seg in iter { + let seg = seg.trim(); + if seg.is_empty() { + continue; // tolerate trailing comma + } + let eq = top_level_eq(seg)?; + let name = seg[..eq].trim().to_lowercase(); + let value = collapse_ws(seg[eq + 1..].trim()); + if name.is_empty() { + return None; + } + fields.push((name, value)); + } + + Some(BibEntry { + kind: kind_l, + key, + fields, + }) +} + +fn render_bib_entry(entry: &BibEntry) -> String { + let mut s = String::new(); + s.push('@'); + s.push_str(&entry.kind); + s.push('{'); + + let width = entry.fields.iter().map(|(n, _)| n.len()).max().unwrap_or(0); + + match &entry.key { + Some(key) => s.push_str(key), + None => { + // key-less (@string/@preamble): keep the opening brace tight. + if let Some((name, value)) = entry.fields.first() { + s.push_str(&format!("{} = {}", name, value)); + } + s.push('}'); + return s; + } + } + + for (name, value) in &entry.fields { + s.push_str(",\n"); + s.push_str(INDENT); + s.push_str(&format!("{:width$} = {}", name, value, width = width)); + } + if !entry.fields.is_empty() { + s.push(','); + } + s.push('\n'); + s.push('}'); + s +} + +/// Split on top-level commas (ignoring commas inside braces or quotes). +fn split_top_level(body: &str) -> Vec<String> { + let mut out = Vec::new(); + let mut cur = String::new(); + let mut depth = 0i32; + let mut in_quote = false; + for c in body.chars() { + match c { + '"' if depth == 0 => { + in_quote = !in_quote; + cur.push(c); + } + '{' if !in_quote => { + depth += 1; + cur.push(c); + } + '}' if !in_quote => { + depth -= 1; + cur.push(c); + } + ',' if depth == 0 && !in_quote => { + out.push(std::mem::take(&mut cur)); + } + _ => cur.push(c), + } + } + out.push(cur); + out +} + +/// Index of the first top-level `=` in a `name = value` segment. +fn top_level_eq(seg: &str) -> Option<usize> { + let mut depth = 0i32; + let mut in_quote = false; + for (idx, c) in seg.char_indices() { + match c { + '"' if depth == 0 => in_quote = !in_quote, + '{' if !in_quote => depth += 1, + '}' if !in_quote => depth -= 1, + '=' if depth == 0 && !in_quote => return Some(idx), + _ => {} + } + } + None +} + +/// Collapse internal whitespace runs (including newlines) into single spaces. +fn collapse_ws(value: &str) -> String { + value.split_whitespace().collect::<Vec<_>>().join(" ") +} + #[cfg(test)] mod tests { use super::*; @@ -137,31 +383,87 @@ mod tests { fn indentation_inside_environment() { let src = "\\begin{document}\nhello\n\\end{document}"; let out = format(src); - assert!( - out.contains(" hello"), - "expected indented 'hello', got:\n{}", - out + assert_eq!(out, "\\begin{document}\n hello\n\\end{document}\n"); + } + + #[test] + fn nested_environments_indent_begin_and_end() { + let src = "\\begin{a}\n\\begin{b}\nx\n\\end{b}\n\\end{a}"; + let out = format(src); + assert_eq!( + out, + "\\begin{a}\n \\begin{b}\n x\n \\end{b}\n\\end{a}\n" ); } #[test] - fn multiple_blank_lines_collapsed() { - let src = "a\n\n\n\nb"; + fn multiline_brace_argument_indents() { + let src = "\\hypersetup{\npdftitle={X},\ncolorlinks\n}"; let out = format(src); - assert_eq!(out, "a\n\nb\n"); + assert_eq!(out, "\\hypersetup{\n pdftitle={X},\n colorlinks\n}\n"); + } + + #[test] + fn escaped_braces_do_not_affect_depth() { + let src = "\\begin{document}\na \\{ b \\} c\nd\n\\end{document}"; + let out = format(src); + assert_eq!( + out, + "\\begin{document}\n a \\{ b \\} c\n d\n\\end{document}\n" + ); } #[test] - fn structural_commands_not_indented() { - let src = "\\begin{document}\n\\section{Intro}\n\\end{document}"; + fn comment_braces_ignored() { + let src = "\\begin{document}\nx % this { is not counted\ny\n\\end{document}"; let out = format(src); - assert!(out.contains("\n\\section{Intro}\n"), "got:\n{}", out); + assert_eq!( + out, + "\\begin{document}\n x % this { is not counted\n y\n\\end{document}\n" + ); + } + + #[test] + fn multiple_blank_lines_collapsed() { + let src = "a\n\n\n\nb"; + let out = format(src); + assert_eq!(out, "a\n\nb\n"); } #[test] fn verbatim_content_preserved() { let src = "\\begin{verbatim}\n raw content\n\\end{verbatim}"; let out = format(src); - assert!(out.contains(" raw content"), "got:\n{}", out); + assert_eq!(out, "\\begin{verbatim}\n raw content\n\\end{verbatim}\n"); + } + + #[test] + fn bib_entry_formatted_and_aligned() { + let src = "@Article{key, author={A. B.},title = {T},year=2020}"; + let out = format_bib(src); + assert_eq!( + out, + "@article{key,\n author = {A. B.},\n title = {T},\n year = 2020,\n}\n" + ); + } + + #[test] + fn bib_multiline_value_collapsed() { + let src = "@book{k,\n title = {A\n long title},\n}"; + let out = format_bib(src); + assert_eq!(out, "@book{k,\n title = {A long title},\n}\n"); + } + + #[test] + fn bib_invalid_left_untouched() { + let src = "not a bib file at all"; + assert_eq!(format_bib(src), src); + } + + #[test] + fn bib_braced_comma_not_split() { + let src = "@misc{k, title={Hello, World}}"; + let out = format_bib(src); + assert_eq!(out, "@misc{k,\n title = {Hello, World},\n}\n"); } } diff --git a/src/linter/mod.rs b/src/linter/mod.rs index 35839ad..08669d1 100644 --- a/src/linter/mod.rs +++ b/src/linter/mod.rs @@ -82,6 +82,7 @@ pub fn lint(root: &Path, entry: &str, bib_file: Option<&str>) -> Result<Vec<Lint check_environments(&rel, &content, &mut errors); check_diagram_blocks(&rel, &content, "mermaid", &mut errors); check_diagram_blocks(&rel, &content, "graphviz", &mut errors); + check_diagram_blocks(&rel, &content, "d2", &mut errors); } Ok(errors) @@ -101,77 +102,141 @@ fn check_references( let line_num = i + 1; let line = strip_comment(line); - for arg in extract_commands(&line, "input") { - let input_path = resolve_tex_path(root, arg); - if !input_path.exists() { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!("\\input{{{}}} — file not found", arg), - suggestion: Some(format!("Create {}", input_path.display())), - }); - } - } + check_input_references(root, rel, line_num, &line, errors); + check_includegraphics_references(root, rel, line_num, &line, errors); + check_cite_references(rel, line_num, &line, bib_file, bib_keys, errors); + check_ref_references(rel, line_num, &line, all_labels, errors); + check_lstinputlisting_references(root, rel, line_num, &line, errors); + check_inputminted_references(root, rel, line_num, &line, errors); + } +} - for arg in extract_commands(&line, "includegraphics") { - let img_path = root.join(arg); - if !img_path.exists() { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!("\\includegraphics{{{}}} — file not found", arg), - suggestion: None, - }); - } +/// Check \input references for file existence. +fn check_input_references( + root: &Path, + rel: &str, + line_num: usize, + line: &str, + errors: &mut Vec<LintError>, +) { + for arg in extract_commands(line, "input") { + let input_path = resolve_tex_path(root, arg); + if !input_path.exists() { + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!("\\input{{{}}} — file not found", arg), + suggestion: Some(format!("Create {}", input_path.display())), + }); } + } +} - if bib_file.is_some() { - for arg in extract_commands(&line, "cite") { - for key in arg.split(',') { - let key = key.trim(); - if !key.is_empty() && !bib_keys.contains(key) { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!("\\cite{{{}}} — key not found in .bib", key), - suggestion: None, - }); - } - } - } +/// Check \includegraphics references for file existence. +fn check_includegraphics_references( + root: &Path, + rel: &str, + line_num: usize, + line: &str, + errors: &mut Vec<LintError>, +) { + for arg in extract_commands(line, "includegraphics") { + let img_path = root.join(arg); + if !img_path.exists() { + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!("\\includegraphics{{{}}} — file not found", arg), + suggestion: None, + }); } + } +} - for arg in extract_commands(&line, "ref") { - if !all_labels.contains(arg) { +/// Check \cite references against bibliography keys. +fn check_cite_references( + rel: &str, + line_num: usize, + line: &str, + bib_file: Option<&str>, + bib_keys: &HashSet<String>, + errors: &mut Vec<LintError>, +) { + if bib_file.is_none() { + return; + } + + for arg in extract_commands(line, "cite") { + for key in arg.split(',') { + let key = key.trim(); + if !key.is_empty() && !bib_keys.contains(key) { errors.push(LintError { file: rel.to_string(), line: line_num, - message: format!("\\ref{{{}}} — no matching \\label found", arg), + message: format!("\\cite{{{}}} — key not found in .bib", key), suggestion: None, }); } } + } +} - for arg in extract_commands(&line, "lstinputlisting") { - if !root.join(arg).exists() { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!("\\lstinputlisting{{{}}} — file not found", arg), - suggestion: None, - }); - } +/// Check \ref references against defined labels. +fn check_ref_references( + rel: &str, + line_num: usize, + line: &str, + all_labels: &HashSet<String>, + errors: &mut Vec<LintError>, +) { + for arg in extract_commands(line, "ref") { + if !all_labels.contains(arg) { + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!("\\ref{{{}}} — no matching \\label found", arg), + suggestion: None, + }); } + } +} - for arg in extract_inputminted_files(&line) { - if !root.join(arg).exists() { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!("\\inputminted{{{}}} — file not found", arg), - suggestion: None, - }); - } +/// Check \lstinputlisting references for file existence. +fn check_lstinputlisting_references( + root: &Path, + rel: &str, + line_num: usize, + line: &str, + errors: &mut Vec<LintError>, +) { + for arg in extract_commands(line, "lstinputlisting") { + if !root.join(arg).exists() { + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!("\\lstinputlisting{{{}}} — file not found", arg), + suggestion: None, + }); + } + } +} + +/// Check \inputminted references for file existence. +fn check_inputminted_references( + root: &Path, + rel: &str, + line_num: usize, + line: &str, + errors: &mut Vec<LintError>, +) { + for arg in extract_inputminted_files(line) { + if !root.join(arg).exists() { + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!("\\inputminted{{{}}} — file not found", arg), + suggestion: None, + }); } } } @@ -321,8 +386,6 @@ fn strip_comment(line: &str) -> String { /// Check mermaid/graphviz blocks: unclosed and invalid pos option. fn check_diagram_blocks(rel: &str, content: &str, env: &str, errors: &mut Vec<LintError>) { - const VALID_POS: &[&str] = &["H", "t", "b", "h", "p"]; - for (i, line) in content.lines().enumerate() { let line_num = i + 1; let trimmed = line.trim(); @@ -331,43 +394,73 @@ fn check_diagram_blocks(rel: &str, content: &str, env: &str, errors: &mut Vec<Li continue; } - // Check for unclosed block - let end_tag = format!("\\end{{{}}}", env); - let rest = &content[content.lines().take(i).map(|l| l.len() + 1).sum::<usize>()..]; - if !rest.contains(&*end_tag) { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!("\\begin{{{}}} without matching \\end{{{}}}", env, env), - suggestion: Some(format!("Add \\end{{{}}}", env)), - }); + check_unclosed_diagram_block(rel, content, env, line_num, i, errors); + check_diagram_pos_option(rel, trimmed, env, line_num, errors); + } +} + +/// Check if a diagram block is properly closed. +fn check_unclosed_diagram_block( + rel: &str, + content: &str, + env: &str, + line_num: usize, + line_index: usize, + errors: &mut Vec<LintError>, +) { + let end_tag = format!("\\end{{{}}}", env); + let rest = &content[content + .lines() + .take(line_index) + .map(|l| l.len() + 1) + .sum::<usize>()..]; + if !rest.contains(&*end_tag) { + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!("\\begin{{{}}} without matching \\end{{{}}}", env, env), + suggestion: Some(format!("Add \\end{{{}}}", env)), + }); + } +} + +/// Check if the pos option in diagram block is valid. +fn check_diagram_pos_option( + rel: &str, + line: &str, + env: &str, + line_num: usize, + errors: &mut Vec<LintError>, +) { + const VALID_POS: &[&str] = &["H", "t", "b", "h", "p"]; + + let Some(opts_start) = line.find('[') else { + return; + }; + let Some(opts_end) = line.find(']') else { + return; + }; + let opts = &line[opts_start + 1..opts_end]; + for part in opts.split(',') { + let Some((k, v)) = part.split_once('=') else { + continue; + }; + if k.trim() != "pos" { continue; } - - // Check pos option if present - if let Some(opts_start) = trimmed.find('[') { - if let Some(opts_end) = trimmed.find(']') { - let opts = &trimmed[opts_start + 1..opts_end]; - for part in opts.split(',') { - if let Some((k, v)) = part.split_once('=') { - if k.trim() == "pos" { - let pos = v.trim(); - if !VALID_POS.contains(&pos) { - errors.push(LintError { - file: rel.to_string(), - line: line_num, - message: format!( - "\\begin{{{}}} invalid pos='{}' — valid values: H, t, b, h, p", - env, pos - ), - suggestion: Some("Use pos=H, pos=t, pos=b, pos=h, or pos=p".into()), - }); - } - } - } - } - } + let pos = v.trim(); + if VALID_POS.contains(&pos) { + continue; } + errors.push(LintError { + file: rel.to_string(), + line: line_num, + message: format!( + "\\begin{{{}}} invalid pos='{}' — valid values: H, t, b, h, p", + env, pos + ), + suggestion: Some("Use pos=H, pos=t, pos=b, pos=h, or pos=p".into()), + }); } } @@ -413,24 +506,28 @@ fn extract_inputminted_files(line: &str) -> Vec<&str> { /// Parse `@type{key, ...}` entries from a .bib file. fn parse_bib_keys(path: &Path) -> HashSet<String> { - let mut keys = HashSet::new(); let Ok(content) = std::fs::read_to_string(path) else { - return keys; + return HashSet::new(); }; - for line in content.lines() { - let trimmed = line.trim(); - if trimmed.starts_with('@') && !trimmed.starts_with("@comment") { - if let Some(start) = trimmed.find('{') { - if let Some(end) = trimmed[start..].find(',') { - let key = trimmed[start + 1..start + end].trim(); - if !key.is_empty() { - keys.insert(key.to_string()); - } - } + content + .lines() + .filter(|line| { + let t = line.trim(); + t.starts_with('@') && !t.starts_with("@comment") + }) + .filter_map(|line| { + let t = line.trim(); + let start = t.find('{')?; + let rest = &t[start + 1..]; + let end = rest.find(',')?; + let key = rest[..end].trim(); + if key.is_empty() { + None + } else { + Some(key.to_string()) } - } - } - keys + }) + .collect() } #[cfg(test)] @@ -535,4 +632,18 @@ mod tests { let errors = lint(dir.path(), &entry, None).unwrap(); assert!(has_error(&errors, "without matching \\end{graphviz}")); } + + #[test] + fn d2_invalid_pos_is_error() { + let (dir, entry) = setup("\\begin{d2}[pos=Z]\n\\end{d2}"); + let errors = lint(dir.path(), &entry, None).unwrap(); + assert!(has_error(&errors, "invalid pos")); + } + + #[test] + fn d2_without_end_is_error() { + let (dir, entry) = setup("\\begin{d2}"); + let errors = lint(dir.path(), &entry, None).unwrap(); + assert!(has_error(&errors, "without matching \\end{d2}")); + } } diff --git a/src/main.rs b/src/main.rs index a52ea00..8f4bf9b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,10 @@ use clap::Parser; use cli::Cli; fn main() -> Result<()> { + // reqwest is built with `rustls-no-provider`, so install the ring crypto + // provider as the process default before any HTTPS request is made. + let _ = rustls::crypto::ring::default_provider().install_default(); + let cli = Cli::parse(); cli.execute() } diff --git a/src/templates/general/main.tex b/src/templates/general/main.tex index c49127e..782cdc1 100644 --- a/src/templates/general/main.tex +++ b/src/templates/general/main.tex @@ -1,11 +1,9 @@ -%% main.tex - Plantilla General -%% Plantilla genérica para documentos LaTeX - +% General Article Template \documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} -\usepackage[spanish]{babel} -\usepackage{amsmath} +\usepackage[{{language}}]{babel} +\usepackage{amsmath,amssymb} \usepackage{float} \usepackage{graphicx} \usepackage{hyperref} @@ -18,25 +16,31 @@ \fancyhf{} \cfoot{\thepage} -\title{Título del Documento} -\author{Autor} -\date{\today} +\title{{{title}}} +\author{{{author}}} +\date{{{date}}} \begin{document} \maketitle \begin{abstract} -Resumen del documento. +Write your abstract here. \end{abstract} -\section{Sección 1} -Contenido de la sección. +\section{Introduction} +Your introduction goes here. + +\subsection{Background} +Provide background context. + +\section{Main Content} +Expand your main content here. Cite sources like this~\cite{example}. -\subsection{Subsección} -Más contenido. +\section{Conclusion} +Summarize your key findings. -\section{Sección 2} -Contenido adicional. +\bibliographystyle{plain} +\bibliography{bib/references} \end{document} diff --git a/src/templates/general/sections/body.tex b/src/templates/general/sections/body.tex index 4e56db7..873f92c 100644 --- a/src/templates/general/sections/body.tex +++ b/src/templates/general/sections/body.tex @@ -1 +1 @@ -% TODO: Contenido del documento +% TODO: Document content diff --git a/src/templates/general/template.toml b/src/templates/general/template.toml index 7df4656..8556d29 100644 --- a/src/templates/general/template.toml +++ b/src/templates/general/template.toml @@ -1,14 +1,43 @@ -[metadata] -nombre = "general" -descripcion = "Documento genérico — artículo con estructura mínima" -idioma = "es" -tipo = "article" - -[variables] -requeridas = ["titulo", "autor"] -opcionales = [] - -[compatibilidad] -mermaid = false -graphviz = false -bibliografia = "bibtex" +id = "general" +version = "0.1.0" +display_name = "General Article" +description = "A minimal, generic template for any LaTeX document" + +[files] +include = ["**/*.tex", "**/*.bib"] +exclude = [] + +[[placeholders]] +name = "title" +type = "string" +description = "Document title" +required = true + +[[placeholders]] +name = "author" +type = "string" +description = "Main author" +required = true +default = "{{user.name}}" + +[[placeholders]] +name = "date" +type = "string" +description = "Publication date" +required = false +default = "\\today" + +[[placeholders]] +name = "language" +type = "enum" +description = "Document language (for babel/polyglossia)" +required = true +choices = ["english", "spanish", "french", "german", "italian", "portuguese"] +default = "english" + +[[post_generate]] +name = "install-packages" +description = "Install LaTeX packages if needed" +command = "texforge build" +optional = true + diff --git a/src/templates/mod.rs b/src/templates/mod.rs index 2511485..b18ae9e 100644 --- a/src/templates/mod.rs +++ b/src/templates/mod.rs @@ -7,7 +7,7 @@ use anyhow::{Context, Result}; use crate::utils; -const REGISTRY_REPO: &str = "JheisonMB/texforge-templates"; +const REGISTRY_REPO: &str = "UniverLab/texforge-templates"; /// Embedded files for the "general" template (fallback when offline). const GENERAL_TEMPLATE_TOML: &str = include_str!("general/template.toml"); @@ -119,7 +119,7 @@ pub fn download(name: &str) -> Result<ResolvedTemplate> { let mut entry = entry?; let path = entry.path()?.to_string_lossy().to_string(); - // GitHub tarballs have a root dir like "JheisonMB-texforge-templates-abc1234/" + // GitHub tarballs have a root dir like "UniverLab-texforge-templates-abc1234/" // We need to find entries under "<root>/<template_name>/..." let Some(after_root) = path.split_once('/').map(|x| x.1) else { continue; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index ac5df65..386fcfd 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -20,7 +20,7 @@ pub fn templates_dir() -> anyhow::Result<std::path::PathBuf> { Ok(dir) } -/// Find all .tex files in a directory, excluding build/ +/// Find all .tex files in a directory, excluding build/. pub fn find_tex_files(root: &Path) -> anyhow::Result<Vec<std::path::PathBuf>> { let mut files = Vec::new(); let build_dir = root.join("build"); @@ -46,62 +46,149 @@ pub fn find_tex_files(root: &Path) -> anyhow::Result<Vec<std::path::PathBuf>> { Ok(files) } -/// Mirror asset directories into build/ using symlinks (Unix) or file copy (Windows). -/// Skips .tex files (handled by the diagram pre-processor) and build/ itself. -pub fn mirror_assets(root: &Path, build_dir: &Path) -> anyhow::Result<()> { - for entry in std::fs::read_dir(root)? { - let entry = entry?; - let path = entry.path(); - let name = entry.file_name(); - let name_str = name.to_string_lossy(); +/// Find all `.bib` files under `root` (excluding the legacy `build/` dir). +pub fn find_bib_files(root: &Path) -> anyhow::Result<Vec<std::path::PathBuf>> { + let mut files = Vec::new(); + let build_dir = root.join("build"); - if name_str.starts_with('.') || path == build_dir { + for entry in walkdir::WalkDir::new(root) + .follow_links(true) + .into_iter() + .filter_map(|e| e.ok()) + { + let path = entry.path(); + if path.starts_with(&build_dir) { continue; } + if entry.file_type().is_file() && path.extension().is_some_and(|ext| ext == "bib") { + files.push(path.to_path_buf()); + } + } - let dest = build_dir.join(&name); + Ok(files) +} - if path.is_dir() { - if dest.exists() || dest.symlink_metadata().is_ok() { - continue; - } - link_or_copy_dir(&path, &dest)?; - } else if path.is_file() { - let ext = path.extension().and_then(|e| e.to_str()).unwrap_or(""); - if ext != "tex" && !dest.exists() { - std::fs::copy(&path, &dest)?; - } +/// Sanitize a document title into a valid filename (lowercase, alphanumeric + hyphens). +pub fn sanitize_filename(title: &str) -> String { + title + .to_lowercase() + .chars() + .map(|c| if c.is_alphanumeric() { c } else { '-' }) + .collect::<String>() + .split('-') + .filter(|s| !s.is_empty()) + .collect::<Vec<_>>() + .join("-") +} + +/// Mirror asset files into the build dir so tectonic can resolve relative paths. +/// Skips .tex files (the diagram pre-processor writes processed copies), hidden +/// entries, and a legacy top-level `build/` directory. On Unix each file is +/// symlinked with an absolute target (the build dir may live in the system temp +/// dir, so relative links would dangle); on Windows files are copied. +pub fn mirror_assets(root: &Path, build_dir: &Path) -> anyhow::Result<()> { + let root = root + .canonicalize() + .with_context(|| format!("Failed to resolve {}", root.display()))?; + + let walker = walkdir::WalkDir::new(&root) + .min_depth(1) + .into_iter() + .filter_entry(|e| { + let name = e.file_name().to_string_lossy(); + let is_legacy_build = e.depth() == 1 && name == "build"; + !name.starts_with('.') && !is_legacy_build && e.path() != build_dir + }); + + for entry in walker.filter_map(|e| e.ok()) { + if !entry.file_type().is_file() { + continue; } + let path = entry.path(); + if path.extension().and_then(|e| e.to_str()) == Some("tex") { + continue; + } + let rel = path.strip_prefix(&root).unwrap(); + let dest = build_dir.join(rel); + if dest.symlink_metadata().is_ok() { + continue; + } + if let Some(parent) = dest.parent() { + std::fs::create_dir_all(parent)?; + } + link_or_copy_file(path, &dest)?; } Ok(()) } #[cfg(unix)] -fn link_or_copy_dir(src: &Path, dest: &Path) -> anyhow::Result<()> { - let target = std::path::Path::new("..").join(src.file_name().unwrap()); - std::os::unix::fs::symlink(&target, dest).with_context(|| { - format!( - "Failed to symlink {} -> {}", - dest.display(), - target.display() - ) - }) +fn link_or_copy_file(src: &Path, dest: &Path) -> anyhow::Result<()> { + std::os::unix::fs::symlink(src, dest) + .with_context(|| format!("Failed to symlink {} -> {}", dest.display(), src.display())) } #[cfg(not(unix))] -fn link_or_copy_dir(src: &Path, dest: &Path) -> anyhow::Result<()> { - std::fs::create_dir_all(dest)?; - for entry in walkdir::WalkDir::new(src) - .into_iter() - .filter_map(|e| e.ok()) - { - let rel = entry.path().strip_prefix(src).unwrap(); - let target = dest.join(rel); - if entry.file_type().is_dir() { - std::fs::create_dir_all(&target)?; - } else { - std::fs::copy(entry.path(), &target)?; - } - } +fn link_or_copy_file(src: &Path, dest: &Path) -> anyhow::Result<()> { + std::fs::copy(src, dest) + .with_context(|| format!("Failed to copy {} -> {}", src.display(), dest.display()))?; Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn sanitize_basic_title() { + assert_eq!( + sanitize_filename("My Thesis: Final Version"), + "my-thesis-final-version" + ); + } + + #[test] + fn sanitize_collapses_separators() { + assert_eq!(sanitize_filename("a -- b"), "a-b"); + } + + #[test] + fn sanitize_keeps_unicode_alphanumerics() { + assert_eq!(sanitize_filename("Análisis Numérico"), "análisis-numérico"); + } + + #[test] + fn mirror_assets_links_nested_assets_in_tex_dirs() { + let src = tempfile::tempdir().unwrap(); + let build = tempfile::tempdir().unwrap(); + let chapters = src.path().join("chapters"); + std::fs::create_dir_all(&chapters).unwrap(); + std::fs::write(chapters.join("ch1.tex"), "x").unwrap(); + std::fs::write(chapters.join("img.png"), [1u8, 2]).unwrap(); + std::fs::write(src.path().join("refs.bib"), "@misc{a}").unwrap(); + + mirror_assets(src.path(), build.path()).unwrap(); + + let img = build.path().join("chapters/img.png"); + assert!(img.exists(), "nested asset should be mirrored"); + assert_eq!(std::fs::read(&img).unwrap(), vec![1u8, 2]); + assert!(build.path().join("refs.bib").exists()); + assert!( + !build.path().join("chapters/ch1.tex").exists(), + ".tex files must not be mirrored" + ); + } + + #[test] + fn mirror_assets_skips_hidden_and_legacy_build() { + let src = tempfile::tempdir().unwrap(); + let build = tempfile::tempdir().unwrap(); + std::fs::create_dir_all(src.path().join("build")).unwrap(); + std::fs::write(src.path().join("build/old.pdf"), "x").unwrap(); + std::fs::write(src.path().join(".hidden"), "x").unwrap(); + + mirror_assets(src.path(), build.path()).unwrap(); + + assert!(!build.path().join("build").exists()); + assert!(!build.path().join(".hidden").exists()); + } +}