From 0f2557e655ea11a21d80ed4fe336e5883d70260f Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:07:26 +0000 Subject: [PATCH 01/20] Strip upstream telemetry/support services - Sentry: drop SDK, gradle plugin, expo plugin, metro wrapper; sentry.ts now local-only log helpers (same API) - PostHog: drop SDK; analytics.ts track() is a no-op - Chatwoot support upload, telemetry consent modal + settings toggle, privacy section removed - "OpenCode Connect" waitlist card removed - Update banner checks kjeldahl/opencode-mobile releases - build.yml: no Sentry/PostHog/Chatwoot secrets, no F-Droid job; release = signed APK only Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- .github/workflows/build.yml | 190 +------ .../workflows/sentry-noise-gate-report.yml | 90 ---- android/app/build.gradle | 2 - android/sentry.properties | 4 - app.json | 7 - app/(tabs)/settings.tsx | 48 -- app/_layout.tsx | 75 +-- app/connection/add.tsx | 267 +--------- metro.config.js | 21 +- package-lock.json | 478 +----------------- package.json | 2 - scripts/noise-gate-report.mjs | 398 --------------- scripts/noise-gate-report.test.mjs | 189 ------- src/components/TelemetryConsentModal.tsx | 254 ---------- src/lib/analytics.ts | 147 +----- src/lib/chatwoot.test.ts | 131 ----- src/lib/chatwoot.ts | 143 ------ src/lib/diagnostics.ts | 29 +- src/lib/persisted-keys.test.ts | 3 - src/lib/sentry-noise-production.test.ts | 168 ------ src/lib/sentry-noise.test.ts | 215 -------- src/lib/sentry-noise.ts | 252 --------- src/lib/sentry.ts | 301 ++--------- src/lib/telemetry.ts | 104 ---- src/lib/update-check.ts | 6 +- src/lib/waitlist-queue-storage.ts | 35 -- src/lib/waitlist-queue.test.ts | 244 --------- src/lib/waitlist.test.ts | 163 ------ src/lib/waitlist.ts | 349 ------------- 29 files changed, 53 insertions(+), 4262 deletions(-) delete mode 100644 .github/workflows/sentry-noise-gate-report.yml delete mode 100644 android/sentry.properties delete mode 100644 scripts/noise-gate-report.mjs delete mode 100644 scripts/noise-gate-report.test.mjs delete mode 100644 src/components/TelemetryConsentModal.tsx delete mode 100644 src/lib/chatwoot.test.ts delete mode 100644 src/lib/chatwoot.ts delete mode 100644 src/lib/sentry-noise-production.test.ts delete mode 100644 src/lib/sentry-noise.test.ts delete mode 100644 src/lib/sentry-noise.ts delete mode 100644 src/lib/telemetry.ts delete mode 100644 src/lib/waitlist-queue-storage.ts delete mode 100644 src/lib/waitlist-queue.test.ts delete mode 100644 src/lib/waitlist.test.ts delete mode 100644 src/lib/waitlist.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 858801d6..ca70e7ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,15 +34,6 @@ jobs: build: runs-on: ubuntu-latest - env: - EXPO_PUBLIC_SENTRY_DSN: ${{ secrets.EXPO_PUBLIC_SENTRY_DSN }} - EXPO_PUBLIC_POSTHOG_KEY: ${{ secrets.EXPO_PUBLIC_POSTHOG_KEY }} - EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER: ${{ secrets.EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - # No Sentry token (forks): skip the source-map upload, which otherwise fails the Gradle build. - SENTRY_DISABLE_AUTO_UPLOAD: ${{ secrets.SENTRY_AUTH_TOKEN == '' && 'true' || 'false' }} steps: - uses: actions/checkout@v6 @@ -73,20 +64,6 @@ jobs: - name: Install dependencies run: npm install --legacy-peer-deps - - name: Set Sentry release identifiers - # sentry.gradle (applied from android/app/build.gradle) defaults the - # upload's --release/--dist to `${applicationId}@${versionName}+${versionCode}`, - # which does NOT match the release/dist Sentry.init() reports at runtime - # (`opencode-mobile@${app.json version}`, see src/lib/sentry.ts). That - # mismatch made every uploaded source map land under a release Sentry - # never looks up, so symbolication silently failed. Pin the Gradle-side - # values to exactly what the app reports. - run: | - VERSION=$(node -p "require('./app.json').expo.version") - echo "SENTRY_RELEASE=opencode-mobile@${VERSION}" >> "$GITHUB_ENV" - echo "SENTRY_DIST=${VERSION}" >> "$GITHUB_ENV" - echo "Sentry release=opencode-mobile@${VERSION} dist=${VERSION}" - - name: Expo prebuild run: npx expo prebuild --platform android --no-install @@ -137,165 +114,8 @@ jobs: name: app-release path: android/app/build/outputs/apk/release/app-release.apk - # F-Droid rebuilds this app from source using the recipe in - # distribution/fdroid-submission/metadata.yml (Builds:), which applies - # fdroid/expo-application-patches and fdroid/expo-notifications-patches to - # strip Firebase Cloud Messaging / Play Install Referrer / Sentry before - # compiling. If we only ever publish the full-featured `app-release.apk` - # (built above, unpatched) and metadata.yml's `Binaries:` points at it, - # F-Droid's reproducible-build check compares its from-source (patched) - # rebuild against that (unpatched) reference binary and can never match — - # see issue #95. - # - # Fix: build a SECOND, additional artifact here — app-release-fdroid.apk — - # by applying the exact same patch set F-Droid's own recipe applies, then - # publish it as an extra GitHub Release asset. metadata.yml's `Binaries:` - # points at THIS asset, not app-release.apk. The main `build` job above is - # completely untouched: Play/GitHub/IzzyOnDroid users keep the full-featured - # binary (push notifications, Sentry crash reporting) unchanged. - # - # This job intentionally does NOT run `npx expo prebuild` — F-Droid's own - # Builds: recipe doesn't either; it patches the already-committed `android/` - # tree directly. Running prebuild here would regenerate android/app/build.gradle - # and could diverge from what F-Droid's build server produces from the same - # tracked source, defeating the byte-for-byte parity this job exists for. - # - # This job also intentionally receives NONE of the EXPO_PUBLIC_SENTRY_DSN / - # EXPO_PUBLIC_POSTHOG_KEY / EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER / SENTRY_* - # secrets that the main `build` job sets — F-Droid's isolated build - # environment has no access to this repo's secrets either, so baking any of - # them into the JS bundle here would itself be a source of reproducible-build - # divergence. - build-fdroid: - if: startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - - uses: actions/setup-node@v6 - with: - node-version: 20 - cache: npm - - # F-Droid's metadata.yml prebuild patch bumps the Kotlin/Java toolchain - # target from 17 to 21 (see the "Apply F-Droid source patches" step - # below). Install both so Gradle's toolchain auto-detection can resolve - # either, matching F-Droid's own multi-JDK build environment. - - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: 17 - - - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: 21 - - - name: Setup Android SDK - uses: android-actions/setup-android@v4 - - - name: Cache Gradle - uses: actions/cache@v5 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - android/.gradle - key: ${{ runner.os }}-gradle-fdroid-${{ hashFiles('android/**/*.gradle*', 'android/gradle/wrapper/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle-fdroid- - - - name: Install dependencies - run: npm install --legacy-peer-deps - - - name: Apply F-Droid source patches - # Mirrors distribution/fdroid-submission/metadata.yml `Builds:.prebuild` - # verbatim so this CI build and F-Droid's from-source rebuild patch the - # exact same lines/files. Keep these two in sync on any future change. - run: | - set -euxo pipefail - - # Drop the Sentry native gradle plugin apply (no SENTRY_* secrets - # are available in F-Droid's build environment either). - sed -i '/apply from.*sentry.gradle/d' android/app/build.gradle - - # F-Droid's build environment toolchains on JDK 21; bump the - # Kotlin/Java compile target used by RN's gradle plugin + expo-modules-core. - sed -i '/jvmToolchain\|JavaVersion/s/17/21/' \ - node_modules/@react-native/gradle-plugin/*/build.gradle.kts \ - node_modules/@react-native/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/JdkConfiguratorUtils.kt \ - node_modules/expo-modules-core/android/ExpoModulesCorePlugin.gradle - printf '\nkotlin.jvm.target.validation.mode=warning\n' >> android/gradle.properties - - # Strip Firebase Cloud Messaging from expo-notifications. - sed -i '/firebase/d' node_modules/expo-notifications/android/build.gradle - cp -a fdroid/expo-notifications-patches/. \ - node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/ - rm -f \ - node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/RemoteMessageSerializer.java \ - node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/triggers/FirebaseNotificationTrigger.kt - - # Strip Google Play Install Referrer (GMS-only API) from expo-application. - sed -i '/installreferrer/d' node_modules/expo-application/android/build.gradle - cp -a fdroid/expo-application-patches/. \ - node_modules/expo-application/android/src/main/java/expo/modules/application/ - - - name: Setup signing - run: | - if [[ -n "${{ secrets.KEYSTORE_BASE64 }}" ]]; then - echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > android/app/release.keystore - echo "RELEASE_STORE_FILE=release.keystore" >> "$GITHUB_ENV" - echo "RELEASE_STORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> "$GITHUB_ENV" - echo "RELEASE_KEY_ALIAS=${{ secrets.KEY_ALIAS }}" >> "$GITHUB_ENV" - echo "RELEASE_KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> "$GITHUB_ENV" - # Same production keystore as app-release.apk: F-Droid's - # AllowedAPKSigningKeys check requires this binary to carry the - # same signing certificate fingerprint. - echo "Signing: production keystore" - else - keytool -genkey -v -keystore android/app/debug.keystore -storepass android \ - -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \ - -dname "CN=Android Debug,O=Android,C=US" - echo "Signing: debug keystore (non-release build)" - fi - - - name: Build F-Droid-flavored APK - working-directory: android - run: ./gradlew assembleRelease - - - name: Re-sign APK v1+v2 only (drop v3/v4 for fdroidserver compatibility) - if: ${{ env.RELEASE_STORE_FILE != '' }} - run: | - # Same rationale as publish-fdroid.yml: androguard (used by - # fdroidserver) crashes parsing a v2+v3 signature block pair. Force - # v1+v2-only here deterministically. - APK=android/app/build/outputs/apk/release/app-release.apk - APKSIGNER=$(ls "$ANDROID_HOME"/build-tools/*/apksigner | sort -V | tail -1) - echo "Using $APKSIGNER" - "$APKSIGNER" sign \ - --ks android/app/release.keystore \ - --ks-pass "pass:${RELEASE_STORE_PASSWORD}" \ - --ks-key-alias "${RELEASE_KEY_ALIAS}" \ - --key-pass "pass:${RELEASE_KEY_PASSWORD}" \ - --v1-signing-enabled true \ - --v2-signing-enabled true \ - --v3-signing-enabled false \ - --v4-signing-enabled false \ - "$APK" - echo "=== signature schemes after re-sign ===" - "$APKSIGNER" verify -v "$APK" | grep -i "Verified using" || true - - - name: Rename artifact - run: cp android/app/build/outputs/apk/release/app-release.apk app-release-fdroid.apk - - - name: Upload F-Droid APK artifact - uses: actions/upload-artifact@v7 - with: - name: app-release-fdroid - path: app-release-fdroid.apk - release: - needs: [build, build-fdroid] + needs: [build] if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest permissions: @@ -305,14 +125,8 @@ jobs: with: name: app-release - - uses: actions/download-artifact@v8 - with: - name: app-release-fdroid - - name: Create Release uses: softprops/action-gh-release@v2 with: - files: | - app-release.apk - app-release-fdroid.apk + files: app-release.apk generate_release_notes: true diff --git a/.github/workflows/sentry-noise-gate-report.yml b/.github/workflows/sentry-noise-gate-report.yml deleted file mode 100644 index b29e5f19..00000000 --- a/.github/workflows/sentry-noise-gate-report.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Sentry noise-gate report - -# Grades the AGE-105 noise gate against the number it promised, with install-base -# uptake folded in — see scripts/noise-gate-report.mjs for why a raw event count -# cannot grade a gate that ships inside an app binary. -# -# It lives in CI rather than on a laptop for one blunt reason: neither credential -# it needs (Sentry org read token, Play service account) exists outside GitHub -# Secrets, so an agent picking up this measurement locally is stuck. Dispatch this -# instead and read the run summary: -# -# gh workflow run "Sentry noise-gate report" -f post=2026-08-21T00:00:00Z..now -# gh run watch && gh run view # table is in the job summary -# -# The scheduled Monday run exists so the trend is recorded even if nobody asks. - -on: - workflow_dispatch: - inputs: - pre: - description: "Baseline window START..END (rate before the rollout reached devices)" - required: false - # Post-box-bot-fix, pre-mobile-rollout. The only clean baseline that - # measures mobile alone: AGE-55 silenced openclaw-box-bot at 06:19Z and - # v0.4.14 reached production at 14:22Z on the same day. - default: "2026-08-14T07:00:00Z..2026-08-14T14:00:00Z" - post: - description: "Measured window START..END (default: trailing 7d)" - required: false - default: "" - project: - description: "Sentry project slug" - required: false - default: "opencode-mobile" - schedule: - # Mondays 15:00 UTC. Weekly, not daily: a window under ~24h ranks sources but - # cannot certify a monthly rate, and Play vitals land with a multi-day lag. - - cron: "0 15 * * 1" - -permissions: - contents: read - -concurrency: - group: sentry-noise-gate-report-${{ github.ref }} - cancel-in-progress: false - -jobs: - report: - # Upstream-only: needs upstream secrets/accounts; skip on forks. - if: github.repository == 'dzianisv/opencode-mobile' - runs-on: ubuntu-latest - timeout-minutes: 10 - steps: - - uses: actions/checkout@v6 - - - uses: actions/setup-node@v6 - with: - node-version: 24 - - # The grading model is the part that can be wrong silently, so it is tested - # before it is trusted — in the same job that publishes the number. - - name: Test the grading model - run: node --test scripts/noise-gate-report.test.mjs - - - name: Report - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_PRODUCT_INTELLIGENCE_TOKEN || secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG || 'vibetechnologies' }} - GOOGLE_PLAY_SERVICE_ACCOUNT_JSON: ${{ secrets.PLAY_STORE_SERVICE_ACCOUNT_JSON }} - run: | - set -euo pipefail - args=(--pre "${{ inputs.pre || '2026-08-14T07:00:00Z..2026-08-14T14:00:00Z' }}") - args+=(--project "${{ inputs.project || 'opencode-mobile' }}") - if [ -n "${{ inputs.post }}" ]; then args+=(--post "${{ inputs.post }}"); fi - node scripts/noise-gate-report.mjs "${args[@]}" - - - name: Raw org volume (per project, per outcome, with client_discard reasons) - if: always() - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_PRODUCT_INTELLIGENCE_TOKEN || secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG || 'vibetechnologies' }} - run: | - set -euo pipefail - { - echo '' - echo '### Raw org volume' - echo '```' - node scripts/sentry-volume-report.mjs --by-reason --since-rollout || true - echo '```' - } >> "$GITHUB_STEP_SUMMARY" diff --git a/android/app/build.gradle b/android/app/build.gradle index 79448afc..2c5fc3e4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -81,8 +81,6 @@ def enableMinifyInReleaseBuilds = (findProperty('android.enableMinifyInReleaseBu */ def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' -apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle") - android { ndkVersion rootProject.ext.ndkVersion diff --git a/android/sentry.properties b/android/sentry.properties deleted file mode 100644 index 08085a8d..00000000 --- a/android/sentry.properties +++ /dev/null @@ -1,4 +0,0 @@ -defaults.url=https://sentry.io/ -defaults.org=vibetechnologies -defaults.project=opencode-mobile -# Using SENTRY_AUTH_TOKEN environment variable \ No newline at end of file diff --git a/app.json b/app.json index bb8e16bd..ee6872a8 100644 --- a/app.json +++ b/app.json @@ -50,13 +50,6 @@ "expo-router", "expo-secure-store", "expo-local-authentication", - [ - "@sentry/react-native/expo", - { - "organization": "vibetechnologies", - "project": "opencode-mobile" - } - ], [ "expo-notifications", { diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx index af3a4559..a20030a6 100644 --- a/app/(tabs)/settings.tsx +++ b/app/(tabs)/settings.tsx @@ -21,8 +21,6 @@ import { granted as notificationsGranted, } from "../../src/lib/notifications" import type { Category } from "../../src/lib/notifications" -import { hasTelemetryConsent, setTelemetryConsent } from "../../src/lib/telemetry" -import { PRIVACY_POLICY_URL } from "../../src/lib/links" import { CURRENT_VERSION, checkForUpdate, type AvailableUpdate } from "../../src/lib/update-check" import type { LocalePreference } from "../../src/lib/i18n/locale-resolve" @@ -78,7 +76,6 @@ export default function SettingsScreen() { const { settings, hasBiometrics, updateSettings, lock } = useAuth() const { notifications, setNotification, locale, setLocale } = useSettings() const [osGranted, setOsGranted] = useState(null) - const [telemetryUpdating, setTelemetryUpdating] = useState(false) // Settings is where a user goes to ask "what am I running?". Answer it, and if // a newer build exists say so here too — the banner on the sessions list is @@ -97,26 +94,6 @@ export default function SettingsScreen() { } }, []) - // Telemetry consent: hasTelemetryConsent() returns null (unknown), true, or false. - // We initialise local state from in-memory value; updates call setTelemetryConsent(). - const [crashReporting, setCrashReporting] = useState(hasTelemetryConsent() ?? false) - - const handleCrashReportingToggle = useCallback( - async (value: boolean) => { - setTelemetryUpdating(true) - try { - await setTelemetryConsent(value) - setCrashReporting(value) - } catch { - setCrashReporting(hasTelemetryConsent() ?? false) - Alert.alert(t("settings.alerts.privacyNotSavedTitle"), t("settings.alerts.privacyNotSavedMessage")) - } finally { - setTelemetryUpdating(false) - } - }, - [t], - ) - // Check OS permission state on first toggle attempt const handleToggle = useCallback( async (category: Category, enabled: boolean) => { @@ -231,31 +208,6 @@ export default function SettingsScreen() { )} - - - } - /> - Linking.openURL(PRIVACY_POLICY_URL)} - right={} - /> - - ("loading") - useEffect(() => { + installCrashLogging() initAuth() loadConnections() useSettings.getState().load() @@ -52,29 +46,6 @@ function RootLayout() { else router.push("/") }) - // Load telemetry consent — initialise Sentry only if previously granted - loadTelemetryConsent() - .then((state) => { - if (state === "granted") { - import("../src/lib/sentry").then(({ initSentry }) => { - initSentry() - addBreadcrumb({ category: "app.lifecycle", message: "app started" }) - }) - initAnalytics() - trackAppOpened() - setConsentState("decided") - } else if (state === "denied") { - addBreadcrumb({ category: "app.lifecycle", message: "app started (telemetry off)" }) - setConsentState("decided") - } else { - setConsentState("unknown") - } - }) - .catch(() => { - // SecureStore unavailable — show modal so user can decide - setConsentState("unknown") - }) - return unsubNotifications }, []) @@ -96,30 +67,6 @@ function RootLayout() { return () => sub.remove() }, []) - // Retry any waitlist signup that couldn't reach the server when the user - // tapped Join (AGE-87). Runs at cold start and on every foreground, which is - // the cheapest reliable proxy for "connectivity may have come back" — it is a - // no-op (single storage read, no network) when the queue is empty, and it - // replaces the old silent mailto: fallback that lost 20 of 21 signups. - useEffect(() => { - const flush = () => { - void flushPendingSignups() - .then((outcome) => { - if (outcome.synced.length > 0) { - addBreadcrumb({ category: "waitlist", message: `retried ${outcome.synced.length} queued signup(s)` }) - } - }) - .catch(() => { - // Best effort: the entry stays queued for the next foreground. - }) - } - flush() - const sub = AppState.addEventListener("change", (next) => { - if (next === "active") flush() - }) - return () => sub.remove() - }, []) - // Connect/disconnect SSE and load catalog when client changes useEffect(() => { if (client && !sseStarted.current) { @@ -150,7 +97,7 @@ function RootLayout() { } }, [client]) - const isLoading = authLoading || connectionsLoading || consentState === "loading" + const isLoading = authLoading || connectionsLoading if (isLoading) { return ( @@ -213,21 +160,9 @@ function RootLayout() { - {/* Telemetry consent modal — shown once on first launch */} - { - await setTelemetryConsent(true) - setConsentState("decided") - }} - onDecline={async () => { - await setTelemetryConsent(false) - setConsentState("decided") - }} - /> ) } -export default wrap(RootLayout) +export default RootLayout diff --git a/app/connection/add.tsx b/app/connection/add.tsx index b8616086..e2b266a0 100644 --- a/app/connection/add.tsx +++ b/app/connection/add.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react" +import { useState } from "react" import { View, Text, @@ -9,7 +9,6 @@ import { useColorScheme, ActivityIndicator, Alert, - Linking, } from "react-native" import { router } from "expo-router" import { Ionicons } from "@expo/vector-icons" @@ -21,14 +20,6 @@ import { captureDiagnostic } from "../../src/lib/sentry" import { parseUrl } from "../../src/lib/diagnostics-classify" import { buildAuth } from "../../src/lib/auth" import { AnalyticsEvent, track } from "../../src/lib/analytics" -import { submitWaitlistSignup, buildWaitlistMailtoUrl, needsManualEscapeHatch, type QueuedSignup } from "../../src/lib/waitlist" -import { flushPendingSignups, queuePendingSignup, readPendingSignups, dropPendingSignup } from "../../src/lib/waitlist-queue-storage" -import appJson from "../../app.json" - -// Same read as sentry.ts: app.json is the single source of the user-visible -// version (package.json/gradle are kept in parity by `npm run check:versions`). -const APP_VERSION = (appJson as { expo?: { version?: string } }).expo?.version ?? "unknown" - export default function AddConnectionScreen() { const colorScheme = useColorScheme() const isDark = colorScheme === "dark" @@ -46,36 +37,6 @@ export default function AddConnectionScreen() { const [username, setUsername] = useState("") const [password, setPassword] = useState("") const [isConnecting, setIsConnecting] = useState(false) - const [waitlistEmail, setWaitlistEmail] = useState("") - // "queued" = the POST failed but the signup is persisted on-device and will - // be retried on the next foreground/connectivity (AGE-87). It is NOT "sent". - const [waitlistState, setWaitlistState] = useState<"idle" | "submitting" | "joined" | "queued">("idle") - const [pendingSignup, setPendingSignup] = useState(null) - - // Retry anything left over from a previous session as soon as this screen - // opens (the root layout also flushes on every foreground), then reflect the - // real state back to the user instead of pretending nothing is pending. - useEffect(() => { - let cancelled = false - void (async () => { - const outcome = await flushPendingSignups().catch(() => null) - if (cancelled) return - const pending = outcome ? outcome.pending : await readPendingSignups().catch(() => []) - if (cancelled) return - if (outcome && outcome.synced.length > 0 && pending.length === 0) { - setWaitlistState("joined") - return - } - if (pending.length > 0) { - setPendingSignup(pending[pending.length - 1]) - setWaitlistState((current) => (current === "idle" ? "queued" : current)) - } - })() - return () => { - cancelled = true - } - }, []) - const buildUrl = () => { if (mode === "advanced") return url.trim() const raw = ip.trim() @@ -244,74 +205,6 @@ export default function AddConnectionScreen() { ) } - const handleJoinWaitlist = async () => { - if (waitlistState === "submitting") return - const attemptedEmail = waitlistEmail - setWaitlistState("submitting") - const result = await submitWaitlistSignup(attemptedEmail) - if (result.ok) { - // Clear any earlier queued attempt for the same address so the flush - // doesn't re-post it. - void dropPendingSignup(result.email) - setPendingSignup(null) - setWaitlistState("joined") - return - } - - if (!result.retryable) { - // The server rejected this address; queueing it would retry forever. - setWaitlistState(pendingSignup ? "queued" : "idle") - Alert.alert(t("connection.add.waitlist.alertTitle"), result.error) - return - } - - // Offline / timeout / 5xx: persist and retry later instead of dumping the - // user into a mail composer they may never send (AGE-87). - const entry = await queuePendingSignup(result.email, result.error) - if (entry) { - setPendingSignup(entry) - setWaitlistState("queued") - return - } - - // Storage refused the write — we cannot promise to finish this later, so - // offer the manual email path explicitly rather than claiming success. - setWaitlistState("idle") - Alert.alert(t("connection.add.waitlist.alertTitle"), t("connection.add.waitlist.queueFailedMessage"), [ - { text: t("common.cancel"), style: "cancel" }, - { text: t("connection.add.waitlist.emailUsButton"), onPress: () => void openWaitlistMailto(result.email) }, - ]) - } - - // Last-resort, user-initiated only. Never opened automatically. - const openWaitlistMailto = async (email: string) => { - try { - await Linking.openURL(buildWaitlistMailtoUrl(email, APP_VERSION)) - } catch { - Alert.alert(t("connection.add.waitlist.alertTitle"), t("connection.add.waitlist.noMailAppMessage")) - } - } - - // Explicit "Retry" from the queued state — same code path the foreground - // flush uses, so there is only one retry implementation. - const handleRetryQueued = async () => { - setWaitlistState("submitting") - const outcome = await flushPendingSignups().catch(() => null) - if (outcome && outcome.pending.length === 0 && outcome.synced.length > 0) { - setPendingSignup(null) - setWaitlistState("joined") - return - } - if (outcome && outcome.pending.length === 0) { - // Nothing left pending and nothing synced: the address was rejected. - setPendingSignup(null) - setWaitlistState("idle") - return - } - if (outcome) setPendingSignup(outcome.pending[outcome.pending.length - 1]) - setWaitlistState("queued") - } - // Quick connect mode - simplified if (mode === "quick") { return ( @@ -431,83 +324,6 @@ export default function AddConnectionScreen() { - {/* OpenCode Connect — Coming Soon */} - - - - - - {t("connection.add.quick.connectCardTitle")} - - - {t("connection.add.quick.connectCardBadge")} - - - - - {t("connection.add.quick.connectCardDesc")} - - {waitlistState === "joined" ? ( - - - - {t("connection.add.waitlist.successText")} - - - ) : waitlistState === "queued" ? ( - - - - - {t("connection.add.waitlist.queuedText")} - - - {needsManualEscapeHatch(pendingSignup) && ( - void openWaitlistMailto(pendingSignup?.email ?? waitlistEmail)} - testID="waitlist-email-us" - > - {t("connection.add.waitlist.emailUsLink")} - - )} - void handleRetryQueued()} testID="waitlist-retry"> - {t("common.retry")} - - - ) : ( - <> - - - {waitlistState === "submitting" ? ( - - ) : ( - <> - - {t("connection.add.waitlist.joinButton")} - - )} - - - )} - - {/* Advanced mode link */} setMode("advanced")}> @@ -861,85 +677,4 @@ const styles = StyleSheet.create({ marginTop: 32, marginBottom: 8, }, - connectCard: { - backgroundColor: "#f0f0ff", - borderRadius: 12, - padding: 16, - marginTop: 24, - borderWidth: 1, - borderColor: "#c7d2fe", - }, - connectCardDark: { - backgroundColor: "#1e1b4b", - borderColor: "#3730a3", - }, - connectCardHeader: { - flexDirection: "row", - alignItems: "center", - gap: 12, - marginBottom: 8, - }, - connectCardTitles: { - flexDirection: "row", - alignItems: "center", - gap: 8, - flexWrap: "wrap", - }, - connectCardTitle: { - fontSize: 16, - fontWeight: "700", - color: "#0a0a0a", - }, - connectCardBadge: { - backgroundColor: "#6366f1", - paddingHorizontal: 8, - paddingVertical: 2, - borderRadius: 4, - }, - connectCardBadgeText: { - color: "#ffffff", - fontSize: 11, - fontWeight: "600", - }, - connectCardDesc: { - fontSize: 13, - color: "#666666", - lineHeight: 20, - }, - waitlistButton: { - flexDirection: "row", - alignItems: "center", - justifyContent: "center", - gap: 8, - padding: 12, - borderRadius: 8, - backgroundColor: "#6366f1", - marginTop: 12, - }, - waitlistButtonText: { - fontSize: 15, - fontWeight: "600", - color: "#ffffff", - }, - waitlistSuccess: { - flexDirection: "row", - alignItems: "center", - gap: 8, - marginTop: 12, - }, - waitlistSuccessText: { - flex: 1, - fontSize: 13, - color: "#0a0a0a", - lineHeight: 20, - }, - waitlistEscapeHatch: { - marginTop: 8, - paddingVertical: 4, - }, - waitlistEscapeHatchText: { - fontSize: 13, - fontWeight: "600", - color: "#6366f1", - }, }) diff --git a/metro.config.js b/metro.config.js index ba13333a..36a0531d 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,22 +1,7 @@ -// Metro bundler config. -// -// Wraps Expo's default Metro config with Sentry's config so the JS bundle -// gets a Debug ID embedded at build time (see -// https://docs.sentry.io/platforms/react-native/manual-setup/metro/). -// -// Why this matters: without this, Metro/Hermes produce bundles + source maps -// with NO debug ID. `android/sentry.gradle` (applied from -// android/app/build.gradle) then falls back to associating the uploaded -// source map with Sentry purely by `--release`/`--dist` string matching -// (see its `has-sourcemap-debugid.js` check). That legacy path is fragile — -// it silently breaks if the release/dist Gradle computes for the upload -// ever drifts from the release/dist the app reports at runtime via -// `Sentry.init()` (src/lib/sentry.ts). Debug ID matching sidesteps that -// entire class of bug: the bundle and its source map are linked by an -// embedded ID, independent of any release/dist string. -const { getSentryExpoConfig } = require("@sentry/react-native/metro") +// Metro bundler config: Expo's defaults. +const { getDefaultConfig } = require("expo/metro-config") /** @type {import('expo/metro-config').MetroConfig} */ -const config = getSentryExpoConfig(__dirname) +const config = getDefaultConfig(__dirname) module.exports = config diff --git a/package-lock.json b/package-lock.json index 7a846b5c..f5ee1e04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,17 @@ { "name": "@opencode-ai/mobile", - "version": "0.4.11", + "version": "0.4.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@opencode-ai/mobile", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@expo/vector-icons": "^15.0.3", "@gorhom/bottom-sheet": "5.2.8", "@react-native-async-storage/async-storage": "2.2.0", "@react-navigation/native": "^7.0.14", - "@sentry/react-native": "~6.22.0", "@tanstack/react-query": "^5.62.0", "expo": "^54.0.0", "expo-clipboard": "8.0.8", @@ -30,7 +29,6 @@ "expo-status-bar": "~3.0.9", "expo-store-review": "~9.0.9", "i18next": "^26.3.6", - "posthog-react-native": "^4.57.0", "react": "19.1.0", "react-i18next": "^17.0.10", "react-native": "0.81.5", @@ -2227,21 +2225,6 @@ "react-native": "*" } }, - "node_modules/@posthog/core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.43.1.tgz", - "integrity": "sha512-hGM8f5sp3we6Em/RQHXbmyYm554hUx9+9jhf92ZQgDS4/xW72KHyZiO9wcFye+qAx2cJAOhOCDIznmO1FV8IbA==", - "license": "MIT", - "dependencies": { - "@posthog/types": "^1.396.0" - } - }, - "node_modules/@posthog/types": { - "version": "1.396.0", - "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.396.0.tgz", - "integrity": "sha512-S0izvq+Hqvz2GPoYJO4x7fAtlCSHNN+JiugpBmQRdG7RrYW7kZ+GipmbTItjPSKuXoJx4KbEnxBvr6NHhoZV4w==", - "license": "MIT" - }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", @@ -2818,349 +2801,6 @@ "nanoid": "^3.3.11" } }, - "node_modules/@sentry-internal/browser-utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.55.0.tgz", - "integrity": "sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry-internal/feedback": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.55.0.tgz", - "integrity": "sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry-internal/replay": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.55.0.tgz", - "integrity": "sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==", - "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "8.55.0", - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry-internal/replay-canvas": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.55.0.tgz", - "integrity": "sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==", - "license": "MIT", - "dependencies": { - "@sentry-internal/replay": "8.55.0", - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.2.0.tgz", - "integrity": "sha512-GFpS3REqaHuyX4LCNqlneAQZIKyHb5ePiI1802n0fhtYjk68I1DTQ3PnbzYi50od/vAsTQVCknaS5F6tidNqTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@sentry/browser": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.55.0.tgz", - "integrity": "sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==", - "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "8.55.0", - "@sentry-internal/feedback": "8.55.0", - "@sentry-internal/replay": "8.55.0", - "@sentry-internal/replay-canvas": "8.55.0", - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/cli": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.53.0.tgz", - "integrity": "sha512-n2ZNb+5Z6AZKQSI0SusQ7ZzFL637mfw3Xh4C3PEyVSn9LiF683fX0TTq8OeGmNZQS4maYfS95IFD+XpydU0dEA==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "bin": { - "sentry-cli": "bin/sentry-cli" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@sentry/cli-darwin": "2.53.0", - "@sentry/cli-linux-arm": "2.53.0", - "@sentry/cli-linux-arm64": "2.53.0", - "@sentry/cli-linux-i686": "2.53.0", - "@sentry/cli-linux-x64": "2.53.0", - "@sentry/cli-win32-arm64": "2.53.0", - "@sentry/cli-win32-i686": "2.53.0", - "@sentry/cli-win32-x64": "2.53.0" - } - }, - "node_modules/@sentry/cli-darwin": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.53.0.tgz", - "integrity": "sha512-NNPfpILMwKgpHiyJubHHuauMKltkrgLQ5tvMdxNpxY60jBNdo5VJtpESp4XmXlnidzV4j1z61V4ozU6ttDgt5Q==", - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-arm": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.53.0.tgz", - "integrity": "sha512-NdRzQ15Ht83qG0/Lyu11ciy/Hu/oXbbtJUgwzACc7bWvHQA8xEwTsehWexqn1529Kfc5EjuZ0Wmj3MHmp+jOWw==", - "cpu": [ - "arm" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-arm64": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.53.0.tgz", - "integrity": "sha512-xY/CZ1dVazsSCvTXzKpAgXaRqfljVfdrFaYZRUaRPf1ZJRGa3dcrivoOhSIeG/p5NdYtMvslMPY9Gm2MT0M83A==", - "cpu": [ - "arm64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-i686": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.53.0.tgz", - "integrity": "sha512-0REmBibGAB4jtqt9S6JEsFF4QybzcXHPcHtJjgMi5T0ueh952uG9wLzjSxQErCsxTKF+fL8oG0Oz5yKBuCwCCQ==", - "cpu": [ - "x86", - "ia32" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-x64": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.53.0.tgz", - "integrity": "sha512-9UGJL+Vy5N/YL1EWPZ/dyXLkShlNaDNrzxx4G7mTS9ywjg+BIuemo6rnN7w43K1NOjObTVO6zY0FwumJ1pCyLg==", - "cpu": [ - "x64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-arm64": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.53.0.tgz", - "integrity": "sha512-G1kjOjrjMBY20rQcJV2GA8KQE74ufmROCDb2GXYRfjvb1fKAsm4Oh8N5+Tqi7xEHdjQoLPkE4CNW0aH68JSUDQ==", - "cpu": [ - "arm64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-i686": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.53.0.tgz", - "integrity": "sha512-qbGTZUzesuUaPtY9rPXdNfwLqOZKXrJRC1zUFn52hdo6B+Dmv0m/AHwRVFHZP53Tg1NCa8bDei2K/uzRN0dUZw==", - "cpu": [ - "x86", - "ia32" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-x64": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.53.0.tgz", - "integrity": "sha512-1TXYxYHtwgUq5KAJt3erRzzUtPqg7BlH9T7MdSPHjJatkrr/kwZqnVe2H6Arr/5NH891vOlIeSPHBdgJUAD69g==", - "cpu": [ - "x64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@sentry/cli/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@sentry/core": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.0.tgz", - "integrity": "sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==", - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/react": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.55.0.tgz", - "integrity": "sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA==", - "license": "MIT", - "dependencies": { - "@sentry/browser": "8.55.0", - "@sentry/core": "8.55.0", - "hoist-non-react-statics": "^3.3.2" - }, - "engines": { - "node": ">=14.18" - }, - "peerDependencies": { - "react": "^16.14.0 || 17.x || 18.x || 19.x" - } - }, - "node_modules/@sentry/react-native": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-6.22.0.tgz", - "integrity": "sha512-Xt8ZuYa7YsMTG7hFU8awfNpVWijH6kWdyqykML6qVohBmP2OS57oSAd4fAdCmbtaIbHs8Drux+uPtb/SdOy2Vg==", - "license": "MIT", - "dependencies": { - "@sentry/babel-plugin-component-annotate": "4.2.0", - "@sentry/browser": "8.55.0", - "@sentry/cli": "2.53.0", - "@sentry/core": "8.55.0", - "@sentry/react": "8.55.0", - "@sentry/types": "8.55.0", - "@sentry/utils": "8.55.0" - }, - "bin": { - "sentry-expo-upload-sourcemaps": "scripts/expo-upload-sourcemaps.js" - }, - "peerDependencies": { - "expo": ">=49.0.0", - "react": ">=17.0.0", - "react-native": ">=0.65.0" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "node_modules/@sentry/types": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.55.0.tgz", - "integrity": "sha512-6LRT0+r6NWQ+RtllrUW2yQfodST0cJnkOmdpHA75vONgBUhpKwiJ4H7AmgfoTET8w29pU6AnntaGOe0LJbOmog==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.55.0.tgz", - "integrity": "sha512-cYcl39+xcOivBpN9d8ZKbALl+DxZKo/8H0nueJZ0PO4JA+MJGhSm6oHakXxLPaiMoNLTX7yor8ndnQIuFg+vmQ==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, "node_modules/@sinclair/typebox": { "version": "0.27.10", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", @@ -7585,26 +7225,6 @@ "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-forge": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", @@ -8139,72 +7759,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/posthog-react-native": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/posthog-react-native/-/posthog-react-native-4.57.0.tgz", - "integrity": "sha512-HcTk59aanBZmtC1gE3ermZL8nxA+5ID2SnvPD8jU0LyXM110faxCcm7VIMjvpSdd2hqxCzz5/kUm4b/brmFI7Q==", - "license": "MIT", - "dependencies": { - "@posthog/core": "^1.43.0", - "@posthog/types": "^1.396.0" - }, - "peerDependencies": { - "@posthog/react-native-plugin": ">= 2.2.0", - "@react-native-async-storage/async-storage": ">=1.0.0", - "@react-navigation/native": ">= 5.0.0", - "expo-application": ">= 4.0.0", - "expo-device": ">= 4.0.0", - "expo-file-system": ">= 13.0.0", - "expo-localization": ">= 11.0.0", - "posthog-react-native-session-replay": ">= 1.6.0", - "react-native-device-info": ">= 10.0.0", - "react-native-localize": ">= 3.0.0", - "react-native-navigation": ">= 6.0.0", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-svg": ">= 15.0.0" - }, - "peerDependenciesMeta": { - "@posthog/react-native-plugin": { - "optional": true - }, - "@react-native-async-storage/async-storage": { - "optional": true - }, - "@react-navigation/native": { - "optional": true - }, - "expo-application": { - "optional": true - }, - "expo-device": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-localization": { - "optional": true - }, - "posthog-react-native-session-replay": { - "optional": true - }, - "react-native-device-info": { - "optional": true - }, - "react-native-localize": { - "optional": true - }, - "react-native-navigation": { - "optional": true - }, - "react-native-safe-area-context": { - "optional": true - }, - "react-native-svg": { - "optional": true - } - } - }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -8289,12 +7843,6 @@ "node": ">= 6" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9809,12 +9357,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -10334,16 +9876,6 @@ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", @@ -10358,12 +9890,6 @@ "node": ">=10" } }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index b24a7338..09bc0342 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "@gorhom/bottom-sheet": "5.2.8", "@react-native-async-storage/async-storage": "2.2.0", "@react-navigation/native": "^7.0.14", - "@sentry/react-native": "~6.22.0", "@tanstack/react-query": "^5.62.0", "expo": "^54.0.0", "expo-clipboard": "8.0.8", @@ -35,7 +34,6 @@ "expo-status-bar": "~3.0.9", "expo-store-review": "~9.0.9", "i18next": "^26.3.6", - "posthog-react-native": "^4.57.0", "react": "19.1.0", "react-i18next": "^17.0.10", "react-native": "0.81.5", diff --git a/scripts/noise-gate-report.mjs b/scripts/noise-gate-report.mjs deleted file mode 100644 index 26c69f3a..00000000 --- a/scripts/noise-gate-report.mjs +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/env node -/** - * Did the Sentry noise gate actually cut the volume? — the honest version. - * - * WHY THIS EXISTS - * --------------- - * `scripts/sentry-volume-report.mjs` answers "how many events/month is the org - * consuming". That number alone CANNOT grade the gate (AGE-105), because the gate - * ships inside an app binary and only runs on devices that installed it. - * - * On 2026-08-14 the gate went to Play production (versionCode 151). Replaying 90d - * of this project's real events through the gate drops 96.9% of them, which - * predicts ~87 events/month — but ONLY once every user is on a gated build. Play - * uptake takes days-to-weeks and never reaches 100%. - * - * So a naive read on 2026-08-17 ("still 2,000/month, the gate failed") is a - * measurement error, not a finding: if a third of the install base has upgraded, - * the honest expectation is ~2/3 of the baseline, and 2,000 is a PASS. The - * reverse mistake is just as easy — a drop caused by fewer users opening the app - * over a weekend, read as gate efficacy. - * - * This script folds Play's version share into the comparison: - * - * expected_post = baseline_rate x (1 - gated_share x efficacy) - * - * and grades the measured post rate against THAT, not against the endpoint. It - * also reports the endpoint (`fullUptakeProjection`) so the answer to "will this - * clear the 3,500/month org gate when uptake completes" is separate from "is it - * on track today". - * - * NOT A SUBSTITUTE FOR GATE LIVENESS. `client_discard/before_send > 0` proves the - * gate is running on real devices and is independent of install share — it shows - * up first. This script surfaces it and refuses to grade a window without it. - * - * USAGE - * SENTRY_AUTH_TOKEN=... GOOGLE_PLAY_SERVICE_ACCOUNT_JSON=... \ - * node scripts/noise-gate-report.mjs \ - * --pre 2026-08-14T07:00:00Z..2026-08-14T14:00:00Z \ - * --post 2026-08-17T00:00:00Z..now - * - * --json machine-readable - * --no-play skip Play (grades at gated_share=0, i.e. "no credit for uptake") - * --project SLUG default opencode-mobile - * - * Neither credential lives on a laptop. Run it through - * `.github/workflows/sentry-noise-gate-report.yml` (workflow_dispatch), which has - * both as repo secrets and writes the table to the run summary. - * - * Exit code is 0 for any *readable* result — an unmet target is a finding to - * report, not a crash. Non-zero only when the data cannot be obtained. - */ - -import { execFileSync } from "node:child_process" -import { readFile } from "node:fs/promises" -import { fileURLToPath } from "node:url" -import { dirname, join } from "node:path" - -import { gateRollout, parseRolloutHistory } from "./sentry-volume-report.mjs" - -/** Rollout instant of the first gated production build, or null if unrecorded. - * Never guessed: an unrecorded rollout must surface as UNGRADED, not as a - * window silently assumed to be post-gate. */ -async function gateRolloutAt() { - try { - const md = await readFile(new URL("../docs/playstore.md", import.meta.url), "utf8") - return gateRollout(parseRolloutHistory(md))?.at ?? null - } catch { - return null - } -} - -const HERE = dirname(fileURLToPath(import.meta.url)) -const MONTH_HOURS = 730 - -/** - * First Play versionCode containing the gate. v0.4.14 = internal 150 / production - * 151 (publish-play-store.yml sets versionCode = github.run_number + 100, so the - * gradle number is meaningless here). Anything >= this has the gate. - */ -export const GATE_FIRST_VERSION_CODE = Number(process.env.GATE_FIRST_VERSION_CODE || 150) - -/** - * Share of this project's real events the gate hard-drops, measured — not guessed - * — by replaying the 90d census (648 events, 11 issues) of `opencode-mobile` - * through the gate's own precedence in `src/lib/sentry-noise.test.ts`. 96.9%. - * Deliberately conservative: it counts only the transport drop-list, ignoring the - * dedup/rate-cap layers, which can only remove more. - */ -export const GATE_EFFICACY = Number(process.env.GATE_EFFICACY || 0.969) - -/** Org-wide monthly budget from AGE-71, and this project's own target from AGE-105. */ -export const ORG_MONTHLY_GATE = 3500 -export const PROJECT_MONTHLY_TARGET = 1500 - -/** - * Tolerance on the expectation. The inputs are two independent samples (Sentry - * hours, Play daily vitals) of a diurnal process, so demanding equality would - * make every read a failure. 25% above expectation is the line. - */ -export const TOLERANCE = Number(process.env.NOISE_GATE_TOLERANCE || 0.25) - -/** - * The whole point of the script, isolated and pure so it can be tested without a - * network: what SHOULD the post-deploy rate be, given how much of the install - * base is actually running the gate? - * - * @param {object} p - * @param {number} p.baselinePerHour submitted events/hour before the rollout - * @param {number} p.actualPerHour submitted events/hour in the measured window - * @param {number} p.gatedShare 0..1 share of active users on a gated build - * @param {number} [p.efficacy] share of events the gate drops on a gated device - * @param {boolean} [p.gateLive] did client_discard/before_send appear at all - */ -export function grade({ - baselinePerHour, - actualPerHour, - gatedShare, - efficacy = GATE_EFFICACY, - gateLive = true, - postPhase = "post", -}) { - const share = Math.min(Math.max(gatedShare ?? 0, 0), 1) - const expectedPerHour = baselinePerHour * (1 - share * efficacy) - const ceilingPerHour = expectedPerHour * (1 + TOLERANCE) - const fullUptakePerHour = baselinePerHour * (1 - efficacy) - const observedReduction = baselinePerHour > 0 ? 1 - actualPerHour / baselinePerHour : 0 - // What the gate must be doing on gated devices for the observed number to hold. - // Inverts the model instead of trusting the constant: reduction = share x eff. - const impliedEfficacy = share > 0 ? Math.min(Math.max(observedReduction / share, 0), 1) : null - - let verdict - let because - if (postPhase && postPhase !== "post") { - // A window that starts before the gate reached production contains devices - // that could not possibly have run it, so it dilutes the rate toward - // baseline and grades the gate as worse than it is. - verdict = "UNGRADED" - because = - `the post window is [${postPhase}] — it does not lie entirely after the gate's production rollout, ` + - "so it mixes gated and ungated devices. Re-run with a post window starting at the rollout instant." - } else if (!gateLive) { - verdict = "UNGRADED" - because = - "client_discard/before_send is 0 in this window — no device ran the gate, so nothing here measures it. " + - "Check the release actually reached users before reading the rate." - } else if (share === 0) { - verdict = "UNGRADED" - because = "Play reports 0% of active users on a gated build; the rate cannot be attributed to the gate yet." - } else if (actualPerHour <= ceilingPerHour) { - verdict = "ON_TRACK" - because = - `measured ${actualPerHour.toFixed(2)}/h is at or below the ${ceilingPerHour.toFixed(2)}/h ceiling implied by ` + - `${(share * 100).toFixed(1)}% uptake (expected ${expectedPerHour.toFixed(2)}/h +${(TOLERANCE * 100).toFixed(0)}%).` - } else { - verdict = "OFF_TRACK" - because = - `measured ${actualPerHour.toFixed(2)}/h exceeds the ${ceilingPerHour.toFixed(2)}/h ceiling for ` + - `${(share * 100).toFixed(1)}% uptake. Either the gate is not dropping what the replay said it would, or a new ` + - `noise class appeared. Name it — do not widen the drop-list blindly.` - } - - return { - verdict, - because, - postPhase, - gatedShare: share, - efficacy, - baselinePerMonth: baselinePerHour * MONTH_HOURS, - actualPerMonth: actualPerHour * MONTH_HOURS, - expectedPerMonth: expectedPerHour * MONTH_HOURS, - ceilingPerMonth: ceilingPerHour * MONTH_HOURS, - fullUptakeProjection: fullUptakePerHour * MONTH_HOURS, - observedReduction, - impliedEfficacy, - meetsProjectTargetAtFullUptake: fullUptakePerHour * MONTH_HOURS < PROJECT_MONTHLY_TARGET, - } -} - -/** - * Same question one level up: does the ORG clear its 3,500/month gate? - * - * `orgPerHour`/`projectPerHour` must come from the SAME window, and preferably the - * longest one available: the other projects here emit ~0.7 events/hour, so a 1-2h - * window routinely contains zero of them and would flatter the org total to "this - * project only". - */ -export function orgOutlook({ orgPerHour, projectPerHour, projectFullUptakePerMonth }) { - const otherPerMonth = Math.max(orgPerHour - projectPerHour, 0) * MONTH_HOURS - const projectedOrgPerMonth = otherPerMonth + projectFullUptakePerMonth - return { - orgPerMonthNow: orgPerHour * MONTH_HOURS, - otherProjectsPerMonth: otherPerMonth, - projectedOrgPerMonthAtFullUptake: projectedOrgPerMonth, - clearsOrgGate: projectedOrgPerMonth < ORG_MONTHLY_GATE, - headroom: ORG_MONTHLY_GATE - projectedOrgPerMonth, - } -} - -/** Share of active users on a build that contains the gate. */ -export function gatedShareFromPlay(playJson, firstGatedVersionCode = GATE_FIRST_VERSION_CODE) { - const versions = playJson?.versions ?? [] - const total = versions.reduce((s, v) => s + (v.users || 0), 0) - const gated = versions - .filter((v) => Number(v.versionCode) >= firstGatedVersionCode) - .reduce((s, v) => s + (v.users || 0), 0) - return { - gated, - total, - share: total > 0 ? gated / total : 0, - window: playJson?.window ?? null, - } -} - -function runJson(script, args) { - const out = execFileSync(process.execPath, [join(HERE, script), ...args], { - encoding: "utf8", - maxBuffer: 32 * 1024 * 1024, - stdio: ["ignore", "pipe", "pipe"], - }) - return JSON.parse(out) -} - -function parseArgs(argv) { - const out = { project: "opencode-mobile", play: true } - for (let i = 0; i < argv.length; i++) { - const a = argv[i] - if (a === "--pre") out.pre = argv[++i] - else if (a === "--post") out.post = argv[++i] - else if (a === "--project") out.project = argv[++i] - else if (a === "--json") out.json = true - else if (a === "--no-play") out.play = false - } - return out -} - -/** Documented pre-rollout baseline window (docs/analytics.md): starts after the - * AGE-55 box-bot fix landed (2026-08-14 06:19Z) and ends before the gate - * rollout (14:22Z). It is deliberately NOT "7 days before the rollout" — that - * spans the box-bot regime and would import ~22k/mo of dead volume into the - * org background estimate, making the outlook miss the gate by a mile for a - * reason that was already fixed. */ -export const BASELINE_WINDOW = "2026-08-14T07:00:00Z..2026-08-14T14:00:00Z" - -/** Fill in windows the caller did not pin, anchored on the rollout instant. - * - * The old default (`post = now-7d..now`) straddles the 2026-08-14 14:22Z - * rollout on every run before 08-21, so the grader's own default window mixed - * gated and ungated devices and diluted the measured rate toward baseline — - * i.e. it was biased toward reporting the gate as ineffective. The window may - * never start before the gate reached production. - */ -export function resolveWindows(args, rolloutAt, now = new Date()) { - const out = { ...args } - if (!out.pre) out.pre = BASELINE_WINDOW - if (!out.post) { - if (!rolloutAt) throw new Error("--post START..END is required (no rollout instant in docs/playstore.md)") - const weekAgo = new Date(now.getTime() - 7 * 86_400_000) - const start = weekAgo > rolloutAt ? weekAgo : rolloutAt - out.post = `${start.toISOString()}..now` - } - return out -} - -function pick(report, windowName, project) { - const w = report.windows.find((x) => x.name === windowName) - if (!w) throw new Error(`sentry-volume-report returned no window named ${windowName}`) - const p = w.projects.find((x) => x.project === project) - return { - hours: w.hours, - phase: w.phase ?? null, - orgPerHour: w.orgSubmitted / w.hours, - perHour: p ? p.submittedPerHour : 0, - submitted: p ? p.submitted : 0, - gateDropped: p ? p.gateDropped : 0, - backoffDropped: p ? p.backoffDropped : 0, - } -} - -const money = (n) => Math.round(n).toLocaleString("en-US") - -async function main() { - const args = resolveWindows(parseArgs(process.argv.slice(2)), await gateRolloutAt()) - - const volume = runJson("sentry-volume-report.mjs", [ - "--json", - "--window", - `pre=${args.pre}`, - "--window", - `post=${args.post}`, - ]) - const pre = pick(volume, "pre", args.project) - const post = pick(volume, "post", args.project) - - let play = null - let shareInfo = { gated: 0, total: 0, share: 0, window: null } - if (args.play) { - play = runJson("play-version-share.mjs", ["--json"]) - shareInfo = gatedShareFromPlay(play) - } - - const g = grade({ - baselinePerHour: pre.perHour, - actualPerHour: post.perHour, - gatedShare: shareInfo.share, - gateLive: post.gateDropped > 0, - postPhase: post.phase, - }) - // Other projects are a background rate, not something this gate changes, so - // estimate them from whichever window is long enough to contain any of them. - const bg = post.hours >= pre.hours ? post : pre - const org = orgOutlook({ - orgPerHour: bg.orgPerHour, - projectPerHour: bg.perHour, - projectFullUptakePerMonth: g.fullUptakeProjection, - }) - org.backgroundFrom = bg === post ? "post" : "pre" - org.backgroundHours = bg.hours - - const result = { - project: args.project, - generatedAt: new Date().toISOString(), - windows: { - pre: { ...pre, spec: args.pre }, - post: { ...post, spec: args.post }, - }, - uptake: shareInfo, - grade: g, - org, - } - - if (args.json) { - console.log(JSON.stringify(result, null, 2)) - return - } - - const lines = [] - lines.push(`## Noise-gate report — ${args.project}`) - lines.push("") - lines.push(`**${g.verdict}** — ${g.because}`) - lines.push("") - lines.push("| | events/month |") - lines.push("| --- | ---: |") - lines.push(`| baseline (pre, ${pre.hours}h) | ${money(g.baselinePerMonth)} |`) - lines.push(`| measured (post, ${post.hours}h) | ${money(g.actualPerMonth)} |`) - lines.push(`| expected at ${(g.gatedShare * 100).toFixed(1)}% uptake | ${money(g.expectedPerMonth)} |`) - lines.push(`| ceiling (+${(TOLERANCE * 100).toFixed(0)}%) | ${money(g.ceilingPerMonth)} |`) - lines.push(`| projection at 100% uptake | ${money(g.fullUptakeProjection)} |`) - lines.push(`| project target (AGE-105) | ${money(PROJECT_MONTHLY_TARGET)} |`) - lines.push("") - lines.push( - `Uptake: **${shareInfo.gated} of ${shareInfo.total}** active users on versionCode >= ${GATE_FIRST_VERSION_CODE}` + - ` = **${(shareInfo.share * 100).toFixed(1)}%**` + - (shareInfo.window ? ` (Play vitals ${shareInfo.window.start} → ${shareInfo.window.end})` : " (Play skipped)"), - ) - lines.push( - `Gate liveness: client_discard/before_send = **${post.gateDropped}** in the post window` + - ` (ratelimit_backoff ${post.backoffDropped} — that one is the org over quota, not us).`, - ) - if (g.impliedEfficacy !== null) { - lines.push( - `Implied on-device efficacy: **${(g.impliedEfficacy * 100).toFixed(1)}%** ` + - `(the replay predicted ${(g.efficacy * 100).toFixed(1)}%).`, - ) - } - lines.push("") - lines.push( - `Org outlook: other projects ${money(org.otherProjectsPerMonth)}/mo (from the ${org.backgroundFrom} window, ` + - `${org.backgroundHours}h) + this project at full uptake ${money(result.grade.fullUptakeProjection)}/mo = ` + - `**${money(org.projectedOrgPerMonthAtFullUptake)}/mo** vs the ${money(ORG_MONTHLY_GATE)}/mo org gate → ` + - `**${org.clearsOrgGate ? "clears" : "MISSES"}** (headroom ${money(org.headroom)}).`, - ) - lines.push("") - if (post.hours < 24) { - lines.push( - `⚠ The measured window is ${post.hours}h. Under ~24h a window can rank sources but cannot certify a monthly ` + - "rate — diurnal load is real. Treat the numbers above as directional.", - ) - lines.push("") - } - lines.push( - "Read `submitted` (accepted + rate_limited), never `accepted`: while the org is over quota, `accepted` is ~0 for " + - "every project and a broken org is indistinguishable from a fixed one.", - ) - - const text = lines.join("\n") - console.log(text) - if (process.env.GITHUB_STEP_SUMMARY) { - const { appendFileSync } = await import("node:fs") - appendFileSync(process.env.GITHUB_STEP_SUMMARY, `${text}\n`) - } -} - -if (import.meta.url === `file://${process.argv[1]}`) { - main().catch((err) => { - console.error(`noise-gate-report: ${err.message}`) - process.exit(1) - }) -} diff --git a/scripts/noise-gate-report.test.mjs b/scripts/noise-gate-report.test.mjs deleted file mode 100644 index 9f949623..00000000 --- a/scripts/noise-gate-report.test.mjs +++ /dev/null @@ -1,189 +0,0 @@ -import assert from "node:assert/strict" -import test from "node:test" - -import { - GATE_EFFICACY, - ORG_MONTHLY_GATE, - gatedShareFromPlay, - BASELINE_WINDOW, - resolveWindows, - grade, - orgOutlook, -} from "./noise-gate-report.mjs" - -const MONTH_HOURS = 730 -const BASELINE = 4.71 // measured pre-rollout rate for opencode-mobile, 2026-08-14 07:00-14:00Z - -test("partial uptake is not gate failure — the mistake this script exists to prevent", () => { - // A third of users upgraded. A naive read ("still ~2,200/mo, target is 1,500") - // would call this a failure; with 33% uptake it is exactly on model. - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE * (1 - 0.33 * GATE_EFFICACY), - gatedShare: 0.33, - }) - assert.equal(g.verdict, "ON_TRACK") - assert.ok(g.actualPerMonth > 2000, "the raw number is still far above the 1,500/mo target") - assert.ok(Math.abs(g.impliedEfficacy - GATE_EFFICACY) < 0.01) -}) - -test("full uptake at the replayed efficacy lands under the project target", () => { - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE * (1 - GATE_EFFICACY), - gatedShare: 1, - }) - assert.equal(g.verdict, "ON_TRACK") - assert.ok(g.meetsProjectTargetAtFullUptake) - assert.ok(g.fullUptakeProjection < 150, `expected ~107/mo, got ${g.fullUptakeProjection}`) -}) - -test("a real regression still fails even when uptake is low enough to excuse a lot", () => { - // 10% uptake excuses almost nothing; volume that did not move at all is fine, - // but volume that GREW is a finding. - const flat = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE, - gatedShare: 0.1, - }) - assert.equal(flat.verdict, "ON_TRACK", "flat volume at 10% uptake is within tolerance") - const worse = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE * 1.6, - gatedShare: 0.1, - }) - assert.equal(worse.verdict, "OFF_TRACK") - assert.match(worse.because, /new\s+noise class|not dropping/) -}) - -test("a gate that does nothing on device is caught once uptake is high", () => { - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE, - gatedShare: 0.9, - }) - assert.equal(g.verdict, "OFF_TRACK") - assert.equal(g.impliedEfficacy, 0, "0% of the drop happened, so implied efficacy is 0") -}) - -test("no before_send discards means the window measures nothing — refuse to grade it", () => { - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: 0.01, - gatedShare: 0.9, - gateLive: false, - }) - assert.equal(g.verdict, "UNGRADED") - assert.match(g.because, /before_send/) -}) - -test("zero uptake is ungraded, not a pass — a quiet weekend is not efficacy", () => { - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: 0.2, - gatedShare: 0, - }) - assert.equal(g.verdict, "UNGRADED") - assert.equal(g.impliedEfficacy, null) -}) - -test("uptake share counts only builds that contain the gate", () => { - const play = { - versions: [ - { versionCode: 151, users: 30 }, - { versionCode: 150, users: 10 }, - { versionCode: 149, users: 50 }, - { versionCode: 146, users: 10 }, - ], - window: { start: "2026-08-10", end: "2026-08-16" }, - } - const s = gatedShareFromPlay(play) - assert.equal(s.gated, 40) - assert.equal(s.total, 100) - assert.equal(s.share, 0.4) -}) - -test("no Play rows at all reads as 0% uptake, never as a divide-by-zero pass", () => { - const s = gatedShareFromPlay({ versions: [] }) - assert.equal(s.share, 0) - assert.equal(grade({ baselinePerHour: BASELINE, actualPerHour: 0, gatedShare: s.share }).verdict, "UNGRADED") -}) - -test("org outlook subtracts this project before projecting it forward", () => { - // org 5.43/h of which mobile is 4.71/h -> other projects 0.72/h ~= 526/mo - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE, - gatedShare: 0.5, - }) - const o = orgOutlook({ - orgPerHour: 5.43, - projectPerHour: BASELINE, - projectFullUptakePerMonth: g.fullUptakeProjection, - }) - assert.ok(Math.abs(o.otherProjectsPerMonth - 0.72 * MONTH_HOURS) < 1) - assert.ok(o.clearsOrgGate) - assert.ok(o.projectedOrgPerMonthAtFullUptake < ORG_MONTHLY_GATE) -}) - -test("org gate can still be missed by other projects even with a perfect mobile gate", () => { - const o = orgOutlook({ - orgPerHour: 6, - projectPerHour: 0.5, - projectFullUptakePerMonth: 100, - }) - assert.equal(o.clearsOrgGate, false) - assert.ok(o.headroom < 0) -}) - -test("a post window that straddles the rollout is UNGRADED, not a failing grade", () => { - // The old default post window (now-7d..now) started before the 08-14 14:22Z - // rollout on every run until 08-21, mixing devices that could not have run - // the gate into the "after" rate — which biases the verdict toward failure. - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: BASELINE * 0.9, - gatedShare: 0.4, - postPhase: "mixed", - }) - assert.equal(g.verdict, "UNGRADED") - assert.match(g.because, /mixes gated and ungated/) -}) - -test("an unrecorded rollout is UNGRADED — never assumed to be post-gate", () => { - const g = grade({ - baselinePerHour: BASELINE, - actualPerHour: 0.1, - gatedShare: 0.9, - postPhase: "unknown", - }) - assert.equal(g.verdict, "UNGRADED", "a great-looking number from an unattributable window is not a pass") -}) - -test("resolveWindows never starts the post window before the gate reached production", () => { - const rollout = new Date("2026-08-14T14:22:00Z") - // Run three days in: a naive 7d lookback would reach back to 08-10, four days - // before any device could have had the gate. - const w = resolveWindows({}, rollout, new Date("2026-08-17T00:00:00Z")) - assert.equal(w.post, `${rollout.toISOString()}..now`) - - // Well after rollout, a 7d lookback is entirely post-gate and is preferred: - // a longer window is what makes the other projects' background rate visible. - const later = resolveWindows({}, rollout, new Date("2026-09-01T00:00:00Z")) - assert.equal(later.post, "2026-08-25T00:00:00.000Z..now") -}) - -test("no rollout on record and no explicit post window is an error, not a default", () => { - assert.throws(() => resolveWindows({}, null), /--post/) -}) - -test("the default baseline excludes the box-bot era, which would swamp the org outlook", () => { - // A "7 days before the rollout" baseline spans the AGE-55 box-bot fix - // (2026-08-14 06:19Z) and drags ~22k/mo of already-fixed volume into the - // background estimate, so the org outlook MISSES for a dead reason. - const w = resolveWindows({}, new Date("2026-08-14T14:22:00Z"), new Date("2026-08-17T00:00:00Z")) - assert.equal(w.pre, BASELINE_WINDOW) - const [start, end] = BASELINE_WINDOW.split("..").map((s) => new Date(s)) - assert.ok(start >= new Date("2026-08-14T06:19:00Z"), "baseline must start after the box-bot fix") - assert.ok(end <= new Date("2026-08-14T14:22:00Z"), "baseline must end before the gate rollout") -}) diff --git a/src/components/TelemetryConsentModal.tsx b/src/components/TelemetryConsentModal.tsx deleted file mode 100644 index 8267ad01..00000000 --- a/src/components/TelemetryConsentModal.tsx +++ /dev/null @@ -1,254 +0,0 @@ -/** - * First-launch consent modal for crash reporting AND activation analytics. - * - * A single "Allow" decision gates both Sentry (crash reports) and PostHog - * (anonymous usage analytics) — see src/lib/telemetry.ts. There is no - * separate toggle for analytics, so this modal must disclose both. - * - * Shows once when the user hasn't yet made a consent decision. - * Matches the app's existing Settings screen visual conventions. - */ - -import { View, Text, TouchableOpacity, StyleSheet, useColorScheme, Modal, Linking } from "react-native" -import { Ionicons } from "@expo/vector-icons" -import { useTranslation } from "react-i18next" -import { PRIVACY_POLICY_URL } from "../lib/links" - -interface Props { - visible: boolean - onAllow: () => void - onDecline: () => void -} - -export function TelemetryConsentModal({ visible, onAllow, onDecline }: Props) { - const colorScheme = useColorScheme() - const isDark = colorScheme === "dark" - const { t } = useTranslation() - - return ( - - - - {/* Icon */} - - - - - {/* Title */} - {t("telemetryConsent.title")} - - {/* Body */} - {t("telemetryConsent.body")} - - {/* Detail bullets */} - - - - - - - - - {/* Privacy policy link */} - Linking.openURL(PRIVACY_POLICY_URL)}> - {t("telemetryConsent.privacyLink")} - - - {/* Actions */} - - - - {t("telemetryConsent.declineButton")} - - - - {t("telemetryConsent.allowButton")} - - - - {t("telemetryConsent.footnote")} - - - - ) -} - -function BulletRow({ - icon, - text, - isDark, - positive, -}: { - icon: "checkmark-circle" | "close-circle" - text: string - isDark: boolean - positive: boolean -}) { - return ( - - - {text} - - ) -} - -const styles = StyleSheet.create({ - overlay: { - flex: 1, - backgroundColor: "rgba(0,0,0,0.6)", - justifyContent: "center", - alignItems: "center", - padding: 24, - }, - card: { - backgroundColor: "#ffffff", - borderRadius: 20, - padding: 28, - width: "100%", - maxWidth: 440, - shadowColor: "#000", - shadowOffset: { width: 0, height: 8 }, - shadowOpacity: 0.24, - shadowRadius: 16, - elevation: 10, - }, - cardDark: { - backgroundColor: "#1a1a1a", - }, - iconWrap: { - width: 72, - height: 72, - borderRadius: 18, - backgroundColor: "#eff6ff", - justifyContent: "center", - alignItems: "center", - alignSelf: "center", - marginBottom: 16, - }, - iconWrapDark: { - backgroundColor: "#1e293b", - }, - title: { - fontSize: 22, - fontWeight: "700", - color: "#0a0a0a", - textAlign: "center", - marginBottom: 12, - }, - textDark: { - color: "#f8fafc", - }, - body: { - fontSize: 15, - color: "#374151", - textAlign: "center", - lineHeight: 22, - marginBottom: 20, - }, - bodyDark: { - color: "#94a3b8", - }, - bullets: { - marginBottom: 16, - }, - bulletRow: { - flexDirection: "row", - alignItems: "flex-start", - marginBottom: 8, - }, - bulletIcon: { - marginTop: 2, - marginRight: 10, - flexShrink: 0, - }, - bulletText: { - fontSize: 14, - color: "#374151", - flex: 1, - lineHeight: 20, - }, - privacyLink: { - color: "#3b82f6", - fontSize: 14, - textAlign: "center", - marginBottom: 24, - textDecorationLine: "underline", - }, - actions: { - flexDirection: "row", - gap: 12, - marginBottom: 16, - }, - btn: { - flex: 1, - paddingVertical: 14, - borderRadius: 12, - alignItems: "center", - justifyContent: "center", - }, - btnDecline: { - backgroundColor: "#f1f5f9", - }, - btnDeclineDark: { - backgroundColor: "#2a2a2a", - }, - btnDeclineText: { - color: "#374151", - fontWeight: "600", - fontSize: 16, - }, - btnDeclineTextDark: { - color: "#94a3b8", - }, - btnAllow: { - backgroundColor: "#3b82f6", - }, - btnAllowText: { - color: "#ffffff", - fontWeight: "700", - fontSize: 16, - }, - footnote: { - fontSize: 12, - color: "#9ca3af", - textAlign: "center", - }, - footnoteDark: { - color: "#64748b", - }, -}) diff --git a/src/lib/analytics.ts b/src/lib/analytics.ts index 47523941..89b9d62d 100644 --- a/src/lib/analytics.ts +++ b/src/lib/analytics.ts @@ -1,71 +1,8 @@ -// Centralised PostHog wrapper for activation-funnel analytics. -// -// Mirrors sentry.ts's shape and guarantees: -// 1. Strict no-op when no API key is configured (dev/CI builds need no secrets). -// 2. Strict no-op when the user has not granted telemetry consent — this -// module never calls PostHog.init/capture on its own; it is only ever -// driven by ./telemetry.ts, which gates BOTH Sentry and analytics behind -// the exact same "opencode_telemetry_consent" flag. -// 3. On consent REVOCATION, buffered-but-unsent events are DROPPED, not -// flushed: PostHog's shutdown() normally drains the queue over the -// network, and optOut() only blocks NEW captures (already-queued events -// would still be sent by the next flush). So ConsentGatedPostHog -// overrides the client's public fetch() transport; once revoked it -// answers every SDK request with a synthetic 200 without touching the -// network. shutdown() then "drains" the queue into that stub — clearing -// the persisted queue and stopping timers — while zero bytes leave the -// device. -// 4. No PII in event properties: never pass server URLs, tokens, prompts, -// or file contents. Only coarse, enumerated event names + small typed -// properties (booleans, enums, counts). -// -// Chosen SDK: PostHog (posthog-react-native), self-instantiated (no -// PostHogProvider / autocapture) so the app controls exactly what is sent — -// same "explicit event, no magic" posture as sentry.ts. - -import PostHog from "posthog-react-native" -import * as SecureStore from "expo-secure-store" -import { log } from "./logbuffer" +// Analytics stub. This fork sends no telemetry: upstream's PostHog wrapper is +// replaced by a no-op `track` so call sites stay unchanged. export { classifyConnectionError, type ConnectionErrorClass } from "./analytics-classify" -const API_KEY = process.env.EXPO_PUBLIC_POSTHOG_KEY -// EU by default (GDPR-friendly region for opencode's mostly-EU/self-hosted user base). -// Override with EXPO_PUBLIC_POSTHOG_HOST for a self-hosted instance. -const HOST = process.env.EXPO_PUBLIC_POSTHOG_HOST || "https://eu.i.posthog.com" - -const FIRST_OPEN_KEY = "opencode_analytics_first_open_done" - -// When true (set on consent revocation), the transport answers with a -// synthetic 200 instead of hitting the network, so queued events are -// discarded rather than uploaded. Reset when a new client is created. -let dropNetwork = false - -/** PostHog client whose transport is consent-gated: after revocation every - * request short-circuits to a fake success so nothing reaches the network. - * (Types derived from the base class to avoid importing the transitive - * @posthog/core package directly.) */ -class ConsentGatedPostHog extends PostHog { - fetch(url: string, options: Parameters[1]): ReturnType { - if (dropNetwork) { - return Promise.resolve({ - status: 200, - text: async () => "", - json: async () => ({ status: 1 }), - }) - } - return super.fetch(url, options) - } -} - -let client: ConsentGatedPostHog | null = null -let enabled = false -// app_opened must fire at most once per JS session, whichever path enables -// analytics first (cold start with prior consent, or the consent modal / -// Settings toggle mid-session). Also prevents a revoke -> re-grant in the -// same session from double-counting. -let appOpenedTracked = false - /** Activation-funnel events. Keep this list in 1:1 sync with the funnel steps * tracked in the product analytics dashboard. */ export enum AnalyticsEvent { @@ -105,84 +42,6 @@ export enum AnalyticsEvent { * post-activation noise. */ export type ConnectionTestSource = "onboarding" | "edit_test" | "sse" -export function initAnalytics() { - if (enabled) return - if (!API_KEY) { - log.info("analytics", "no API key configured — analytics disabled") - return - } - try { - dropNetwork = false - client = new ConsentGatedPostHog(API_KEY, { - host: HOST, - // We call track() explicitly at each funnel step — no implicit capture. - captureAppLifecycleEvents: false, - }) - // A previous revoke persisted the SDK-level opt-out flag; clear it so the - // re-granted client can enqueue again. No-op on a fresh install. - void client.optIn() - enabled = true - log.info("analytics", "initialized", `host=${HOST}`) - } catch (e) { - log.warn("analytics", "init failed", String(e)) - } -} - -/** Consent revoked: block new captures, DROP anything buffered (see header - * note 3 — the gated fetch turns shutdown's drain into a no-network discard), - * and tear the client down. */ -export async function shutdownAnalytics() { - if (!enabled || !client) return - enabled = false - const c = client - client = null - dropNetwork = true - try { - // Persist SDK-level opt-out first so even a re-created client (without - // consent) could not capture, then let shutdown clear queue + timers. - await c.optOut() - await c.shutdown() - } catch (e) { - log.warn("analytics", "shutdown failed", String(e)) - } - log.info("analytics", "disabled by user — buffered events dropped") -} - -export function analyticsEnabled(): boolean { - return enabled -} - -/** Flat, JSON-safe event properties — keep it to primitives so nothing - * accidentally nests an object that could carry a URL/token. */ export type AnalyticsProps = Record -/** No-op unless consent has been granted (initAnalytics() was called) and a - * key is configured. Never throws. */ -export function track(event: AnalyticsEvent, props?: AnalyticsProps) { - if (!enabled || !client) return - try { - client.capture(event, props) - } catch (e) { - log.warn("analytics", "capture failed", String(e)) - } -} - -/** Fire AppOpened with `is_first_open`, at most once per JS session. - * Called both from app start (consent already granted) and from the - * consent-grant transition (modal "Allow" / Settings toggle) — the session - * guard makes whichever happens first win. The "seen before" flag is only - * ever read/written once consent is granted (this function is itself a - * no-op without consent), so nothing is recorded locally pre-consent. */ -export async function trackAppOpened() { - if (!enabled || appOpenedTracked) return - appOpenedTracked = true - let isFirstOpen = false - try { - const seen = await SecureStore.getItemAsync(FIRST_OPEN_KEY) - isFirstOpen = !seen - if (isFirstOpen) await SecureStore.setItemAsync(FIRST_OPEN_KEY, "1") - } catch { - // SecureStore unavailable — still fire the event, just without the flag. - } - track(AnalyticsEvent.AppOpened, { is_first_open: isFirstOpen }) -} +export function track(_event: AnalyticsEvent, _props?: AnalyticsProps) {} diff --git a/src/lib/chatwoot.test.ts b/src/lib/chatwoot.test.ts deleted file mode 100644 index 50299a98..00000000 --- a/src/lib/chatwoot.test.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { test, beforeEach, afterEach } from "node:test" -import assert from "node:assert/strict" -import { chatwootConfigured, sendSupportReport } from "./chatwoot.ts" - -const INBOX = "inbox-token-abc" -const BASE = "https://support.example.com" - -const savedEnv = { ...process.env } - -beforeEach(() => { - process.env.EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER = INBOX - process.env.EXPO_PUBLIC_CHATWOOT_BASE_URL = BASE -}) - -afterEach(() => { - process.env = { ...savedEnv } -}) - -interface Call { - url: string - body: Record -} - -// Sequenced fetch mock: each entry answers one call, in order. -function mockFetch(responses: Array<{ status: number; json?: unknown }>) { - const calls: Call[] = [] - const fetchFn = (async (url: RequestInfo | URL, init?: RequestInit) => { - calls.push({ url: String(url), body: JSON.parse(String(init?.body ?? "{}")) }) - const next = responses[calls.length - 1] ?? { status: 500 } - return { - status: next.status, - json: async () => { - if (next.json === undefined) throw new Error("no body") - return next.json - }, - } as Response - }) as typeof fetch - return { fetchFn, calls } -} - -test("chatwootConfigured false without inbox identifier", () => { - delete process.env.EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER - assert.equal(chatwootConfigured(), false) -}) - -test("sendSupportReport returns false when unconfigured, makes no calls", async () => { - delete process.env.EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER - const { fetchFn, calls } = mockFetch([]) - assert.equal(await sendSupportReport("hello", { fetchFn }), false) - assert.equal(calls.length, 0) -}) - -test("happy path: contact -> conversation -> message, source_id saved", async () => { - const { fetchFn, calls } = mockFetch([ - { status: 200, json: { source_id: "src-1" } }, - { status: 200, json: { id: 42 } }, - { status: 200, json: {} }, - ]) - let saved: string | null = null - const ok = await sendSupportReport("report body", { - fetchFn, - loadSourceId: async () => null, - saveSourceId: async (id) => { - saved = id - }, - }) - assert.equal(ok, true) - assert.equal(saved, "src-1") - assert.deepEqual( - calls.map((c) => c.url), - [ - `${BASE}/public/api/v1/inboxes/${INBOX}/contacts`, - `${BASE}/public/api/v1/inboxes/${INBOX}/contacts/src-1/conversations`, - `${BASE}/public/api/v1/inboxes/${INBOX}/contacts/src-1/conversations/42/messages`, - ], - ) - assert.equal(calls[2].body.content, "report body") -}) - -test("stored source_id skips contact creation", async () => { - const { fetchFn, calls } = mockFetch([ - { status: 200, json: { id: 7 } }, - { status: 200, json: {} }, - ]) - const ok = await sendSupportReport("hi", { fetchFn, loadSourceId: async () => "src-old" }) - assert.equal(ok, true) - assert.equal(calls.length, 2) - assert.match(calls[0].url, /contacts\/src-old\/conversations$/) -}) - -test("stale source_id (404) recreates contact once and retries", async () => { - const { fetchFn, calls } = mockFetch([ - { status: 404, json: { error: "resource could not be found" } }, - { status: 200, json: { source_id: "src-new" } }, - { status: 200, json: { id: 9 } }, - { status: 200, json: {} }, - ]) - let saved: string | null = null - const ok = await sendSupportReport("hi", { - fetchFn, - loadSourceId: async () => "src-stale", - saveSourceId: async (id) => { - saved = id - }, - }) - assert.equal(ok, true) - assert.equal(saved, "src-new") - assert.equal(calls.length, 4) - assert.match(calls[3].url, /contacts\/src-new\/conversations\/9\/messages$/) -}) - -test("contact create failure throws", async () => { - const { fetchFn } = mockFetch([{ status: 500, json: { error: "boom" } }]) - await assert.rejects(() => sendSupportReport("hi", { fetchFn, loadSourceId: async () => null }), /http 500/) -}) - -test("non-404 conversation failure does not recreate contact", async () => { - const { fetchFn, calls } = mockFetch([{ status: 500 }]) - await assert.rejects(() => sendSupportReport("hi", { fetchFn, loadSourceId: async () => "src-x" }), /http 500/) - assert.equal(calls.length, 1) -}) - -test("base url trailing slash is normalised", async () => { - process.env.EXPO_PUBLIC_CHATWOOT_BASE_URL = `${BASE}///` - const { fetchFn, calls } = mockFetch([ - { status: 200, json: { id: 1 } }, - { status: 200, json: {} }, - ]) - await sendSupportReport("hi", { fetchFn, loadSourceId: async () => "s" }) - assert.equal(calls[0].url, `${BASE}/public/api/v1/inboxes/${INBOX}/contacts/s/conversations`) -}) diff --git a/src/lib/chatwoot.ts b/src/lib/chatwoot.ts deleted file mode 100644 index 75b8c02f..00000000 --- a/src/lib/chatwoot.ts +++ /dev/null @@ -1,143 +0,0 @@ -// Chatwoot support-feedback client using the PUBLIC client API -// (/public/api/v1/inboxes/{inbox_identifier}/...), which is designed for -// untrusted clients: the only value shipped in the binary is the inbox -// identifier. Never put an account-level api_access_token in this app — -// that token can read/write the whole support account. -// -// Contacts are created anonymously (no identifier), so Chatwoot's HMAC -// identifier-validation does not apply. The returned contact source_id is -// persisted via injected storage hooks so repeat reports from the same -// install land on the same contact. -// -// This module is dependency-injected and imports no React Native / Expo -// packages so it runs under `node --test`. - -const REQUEST_TIMEOUT_MS = 15_000 - -export interface ChatwootDeps { - fetchFn?: typeof fetch - loadSourceId?: () => Promise - saveSourceId?: (id: string) => Promise -} - -interface ChatwootConfig { - baseUrl: string - inboxIdentifier: string -} - -export function getChatwootConfig(): ChatwootConfig | null { - const inboxIdentifier = process.env.EXPO_PUBLIC_CHATWOOT_INBOX_IDENTIFIER - if (!inboxIdentifier) return null - const baseUrl = (process.env.EXPO_PUBLIC_CHATWOOT_BASE_URL || "https://support.agentlabs.cc").replace(/\/+$/, "") - return { baseUrl, inboxIdentifier } -} - -export function chatwootConfigured(): boolean { - return getChatwootConfig() !== null -} - -async function post( - fetchFn: typeof fetch, - url: string, - body: Record, -): Promise<{ status: number; json: Record | null }> { - const controller = new AbortController() - const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS) - try { - const res = await fetchFn(url, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), - signal: controller.signal, - }) - let json: Record | null = null - try { - json = (await res.json()) as Record - } catch { - // non-JSON error body - } - return { status: res.status, json } - } finally { - clearTimeout(timer) - } -} - -async function createContact(fetchFn: typeof fetch, cfg: ChatwootConfig): Promise { - const { status, json } = await post(fetchFn, `${cfg.baseUrl}/public/api/v1/inboxes/${cfg.inboxIdentifier}/contacts`, { - name: "OpenCode Mobile user", - }) - const sourceId = json?.source_id - if (status >= 400 || typeof sourceId !== "string" || !sourceId) { - throw new Error(`chatwoot contact create failed (http ${status})`) - } - return sourceId -} - -async function createConversation(fetchFn: typeof fetch, cfg: ChatwootConfig, sourceId: string): Promise { - const { status, json } = await post( - fetchFn, - `${cfg.baseUrl}/public/api/v1/inboxes/${cfg.inboxIdentifier}/contacts/${encodeURIComponent(sourceId)}/conversations`, - {}, - ) - const id = json?.id - if (status >= 400 || typeof id !== "number") { - const err = new Error(`chatwoot conversation create failed (http ${status})`) - ;(err as Error & { status?: number }).status = status - throw err - } - return id -} - -async function postMessage( - fetchFn: typeof fetch, - cfg: ChatwootConfig, - sourceId: string, - conversationId: number, - content: string, -): Promise { - const { status } = await post( - fetchFn, - `${cfg.baseUrl}/public/api/v1/inboxes/${cfg.inboxIdentifier}/contacts/${encodeURIComponent(sourceId)}/conversations/${conversationId}/messages`, - { content }, - ) - if (status >= 400) throw new Error(`chatwoot message post failed (http ${status})`) -} - -/** - * Send an already-scrubbed report to the support inbox as a new conversation. - * Returns true on success, false when Chatwoot is not configured. - * Throws on network/API failure — callers decide whether that is fatal - * (the in-app share path treats it as best-effort). - * - * Consent is NOT checked here; this module has no access to the consent - * store. Callers MUST gate on telemetry consent before invoking. - */ -export async function sendSupportReport(content: string, deps: ChatwootDeps = {}): Promise { - const cfg = getChatwootConfig() - if (!cfg) return false - const fetchFn = deps.fetchFn ?? fetch - - let sourceId = (await deps.loadSourceId?.().catch(() => null)) ?? null - let created = false - if (!sourceId) { - sourceId = await createContact(fetchFn, cfg) - created = true - } - - let conversationId: number - try { - conversationId = await createConversation(fetchFn, cfg, sourceId) - } catch (error) { - const status = (error as { status?: number }).status - // A persisted source_id can go stale (contact deleted server-side). - // Recreate the contact once and retry. - if (created || status !== 404) throw error - sourceId = await createContact(fetchFn, cfg) - created = true - conversationId = await createConversation(fetchFn, cfg, sourceId) - } - - await postMessage(fetchFn, cfg, sourceId, conversationId, content) - if (created) await deps.saveSourceId?.(sourceId).catch(() => undefined) - return true -} diff --git a/src/lib/diagnostics.ts b/src/lib/diagnostics.ts index 1cac275b..ff789c23 100644 --- a/src/lib/diagnostics.ts +++ b/src/lib/diagnostics.ts @@ -4,12 +4,9 @@ import { Platform, Share } from "react-native" import * as Clipboard from "expo-clipboard" import * as Device from "expo-device" -import * as SecureStore from "expo-secure-store" import appJson from "../../app.json" import { log, formatLogLines } from "./logbuffer" import { type Classification, type ProbeAttempt, type ParsedUrl, parseUrl, classify } from "./diagnostics-classify" -import { chatwootConfigured, sendSupportReport } from "./chatwoot" -import { hasTelemetryConsent, loadTelemetryConsent } from "./telemetry" import { redactHostAndUrls } from "./scrub" export type { Classification, ProbeAttempt } from "./diagnostics-classify" @@ -185,34 +182,10 @@ export function formatReportForSupport(report: DiagnosticReport): string { return redactHostAndUrls(formatReport(report), [report.host, ...seenHosts]) } -const CHATWOOT_SOURCE_KEY = "opencode_chatwoot_source_id" - -// Best-effort delivery of the scrubbed report to the Chatwoot support inbox. -// Only runs when the user has granted telemetry consent (same flag that -// gates Sentry/analytics) and the inbox is configured for this build. -async function sendReportToSupport(report: DiagnosticReport): Promise { - // Consent may not be loaded yet if a crash happens very early in startup — - // resolve it from the store rather than silently dropping the report. - if (hasTelemetryConsent() === null) await loadTelemetryConsent() - if (hasTelemetryConsent() !== true || !chatwootConfigured()) return - try { - await sendSupportReport(formatReportForSupport(report), { - loadSourceId: () => SecureStore.getItemAsync(CHATWOOT_SOURCE_KEY), - saveSourceId: (id) => SecureStore.setItemAsync(CHATWOOT_SOURCE_KEY, id), - }) - log.info("diag", "report delivered to support inbox") - } catch (e) { - log.warn("diag", "support delivery failed", String(e)) - } -} - // Copy the report to the clipboard and open the native share sheet. -// Works fully offline (unlike the Sentry auto-upload). When telemetry -// consent is granted, a scrubbed copy is also delivered to the support -// inbox so reports reach us even if the user cancels the share sheet. +// Works fully offline; nothing is sent anywhere unless the user shares it. export async function shareReport(report: DiagnosticReport): Promise { const text = formatReport(report) - void sendReportToSupport(report) try { await Clipboard.setStringAsync(text) } catch { diff --git a/src/lib/persisted-keys.test.ts b/src/lib/persisted-keys.test.ts index 2e1a07b0..17403b43 100644 --- a/src/lib/persisted-keys.test.ts +++ b/src/lib/persisted-keys.test.ts @@ -32,9 +32,6 @@ const ALLOWED_PERSISTED_KEYS = new Map([ ["AUTH_SETTINGS_KEY", "biometric/app-lock preference"], ["COUNT_KEY", "store-review: launch counter"], ["ASKED_KEY", "store-review: already-prompted flag"], - ["FIRST_OPEN_KEY", "analytics: first-open flag"], - ["CONSENT_KEY", "telemetry consent decision"], - ["CHATWOOT_SOURCE_KEY", "support contact id issued by Chatwoot"], ]) const SRC = path.join(import.meta.dirname, "..") diff --git a/src/lib/sentry-noise-production.test.ts b/src/lib/sentry-noise-production.test.ts deleted file mode 100644 index b80bdb5f..00000000 --- a/src/lib/sentry-noise-production.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// Replay of REAL production Sentry data through the AGE-105 noise gate. -// -// `sentry-noise.test.ts` proves the gate behaves as specified. This file proves -// the specification was aimed at the right targets — that the patterns match the -// event signatures `opencode-mobile` actually emits, at the volumes it actually -// emits them, and therefore that the gate lands under the org quota gate. -// -// Why freeze a census instead of querying Sentry in a test: the numbers below -// are the *justification* for the pattern lists. If someone later edits -// TRANSPORT_NOISE_PATTERNS or ALWAYS_SEND_PATTERNS and the projected volume -// leaves budget — or a genuine crash class stops being allowlisted — that is a -// regression, and it should fail here rather than on next month's Sentry bill. -// A live query would move under our feet and could never fail. -// -// Census: every issue in the `opencode-mobile` Sentry project over the 90 days -// ending 2026-08-14, sorted by event count, taken from -// GET /organizations/vibetechnologies/issues/?statsPeriod=90d&sort=freq. -// Reproduce with `node scripts/sentry-volume-report.mjs` + the issues endpoint. -// -// Volume context measured the same day (see docs/analytics.md): -// * `opencode-mobile` submitted = 2,812 events / 30d (~2,750/month) -// * org error quota 5,000/month, self-imposed gate 3,500/month (AGE-71) -// * AGE-105 target for this project: under 1,500/month -// -// NOTE: server-side levers were tested and are NOT available on this Sentry -// plan — per-key rate limits accept a PUT with HTTP 200 and silently discard -// the value, custom inbound filters are absent, spike protection returns 403. -// This client-side gate is the only control that exists, so its coverage is the -// whole safety margin. - -import { test } from "node:test" -import assert from "node:assert/strict" -import { eventText, isAlwaysSend, isTransportNoise } from "./sentry-noise.ts" - -type Observed = { - /** Sentry short id, so a failure is traceable to the real issue. */ - id: string - /** exception type as Sentry grouped it */ - type: string - /** exception value, verbatim (truncated exactly as Sentry stores it) */ - value: string - /** events in the 90d window */ - count: number - /** what the gate must decide, and why it is the correct decision */ - expect: "drop" | "always-send" | "capped" -} - -/** Frozen 90d production census (648 events across 11 issues). */ -const PRODUCTION_90D: Observed[] = [ - // --- client-side network conditions: already shown to the user as connection - // UI and already trended in PostHog as connection_failed{error_class}. --- - { id: "OPENCODE-MOBILE-3", type: "Error", value: "connect timeout", count: 462, expect: "drop" }, - { id: "OPENCODE-MOBILE-4", type: "Error", value: "connect server-unreachable", count: 157, expect: "drop" }, - { id: "OPENCODE-MOBILE-B", type: "Error", value: "Network request failed", count: 6, expect: "drop" }, - { id: "OPENCODE-MOBILE-7", type: "Error", value: "Request timed out after 30000ms", count: 3, expect: "drop" }, - - // --- genuine crash classes: must survive whatever the quota says. --- - { - id: "OPENCODE-MOBILE-A", - type: "Error", - value: - "Call to function 'ExponentImagePicker.launchImageLibraryAsync' has been rejected.\n→ Caused by: java.lang.IllegalStateException: Attempting to launch an unregistered ActivityResultLauncher with contract expo.modules.imagepicker.contracts.ImageLibraryC", - count: 5, - expect: "always-send", - }, - { - id: "OPENCODE-MOBILE-5", - type: "OutOfMemoryError", - value: "Failed to allocate a 126790640 byte allocation with 12451840 free bytes", - count: 4, - expect: "always-send", - }, - { - id: "OPENCODE-MOBILE-6", - type: "OutOfMemoryError", - value: "Failed to allocate a 8208 byte allocation with 1261584 free bytes", - count: 1, - expect: "always-send", - }, - { - id: "OPENCODE-MOBILE-8", - type: "ApplicationNotResponding", - value: "ANR", - count: 1, - expect: "always-send", - }, - { - id: "OPENCODE-MOBILE-9", - type: "IllegalStateException", - value: "The specified child already has a parent. You must call removeView() on the child's parent first.", - count: 1, - expect: "always-send", - }, - { - id: "OPENCODE-MOBILE-2", - type: "IllegalStateException", - value: "The specified child already has a parent. You must call removeView() on the child's parent first.", - count: 1, - expect: "always-send", - }, - - // --- reportable, but a storm of it must collapse: AGE-107 traced 498 of - // these to one user re-tapping Connect with a wrong password. Dedup + rate - // cap handle it; a hard drop would hide real server-side 401 regressions. --- - { id: "OPENCODE-MOBILE-1", type: "Error", value: "API Error: 401 - ", count: 7, expect: "capped" }, -] - -const asEvent = (o: Observed) => ({ - exception: { values: [{ type: o.type, value: o.value, mechanism: { handled: true } }] }, -}) - -function classify(o: Observed): Observed["expect"] { - const text = eventText(asEvent(o)) - // Mirrors NoiseGate.admit() precedence: allowlist wins over the drop-list. - if (isAlwaysSend(text)) return "always-send" - if (isTransportNoise(text)) return "drop" - return "capped" -} - -test("production replay: every observed issue is classified as intended", () => { - for (const o of PRODUCTION_90D) { - assert.equal( - classify(o), - o.expect, - `${o.id} (${o.count} events, ${o.type}: ${o.value.slice(0, 60)}) should be ${o.expect}`, - ) - } -}) - -test("production replay: no genuine crash class is ever filtered", () => { - // The failure mode this guards: hitting the volume target by silencing real - // crashes. A zero here would make the quota win meaningless. - const crashes = PRODUCTION_90D.filter((o) => o.expect === "always-send") - assert.ok(crashes.length >= 6, "census should still contain the observed crash classes") - for (const o of crashes) { - assert.equal(isAlwaysSend(eventText(asEvent(o))), true, `${o.id} must be allowlisted`) - assert.equal(classify(o), "always-send", `${o.id} must not be reachable by the drop-list`) - } -}) - -test("production replay: gate drops >=95% of observed volume", () => { - let dropped = 0 - let total = 0 - for (const o of PRODUCTION_90D) { - total += o.count - if (classify(o) === "drop") dropped += o.count - } - assert.equal(total, 648, "census total changed — re-derive the projections below") - const share = dropped / total - assert.ok(share >= 0.95, `expected >=95% of volume dropped, got ${(share * 100).toFixed(1)}%`) -}) - -test("production replay: projected monthly volume clears the AGE-105 target", () => { - const SUBMITTED_PER_MONTH = 2750 // measured 2026-08-14, pre-v0.4.14-uptake - const TARGET_PER_MONTH = 1500 // AGE-105 "done means" - let survivingShare = 0 - let total = 0 - for (const o of PRODUCTION_90D) { - total += o.count - if (classify(o) !== "drop") survivingShare += o.count - } - // Upper bound: assumes dedup + the hourly cap never fire, which they will. - const projected = SUBMITTED_PER_MONTH * (survivingShare / total) - assert.ok( - projected < TARGET_PER_MONTH, - `projected ${Math.round(projected)}/month must stay under ${TARGET_PER_MONTH}/month`, - ) -}) diff --git a/src/lib/sentry-noise.test.ts b/src/lib/sentry-noise.test.ts deleted file mode 100644 index a5f5eaec..00000000 --- a/src/lib/sentry-noise.test.ts +++ /dev/null @@ -1,215 +0,0 @@ -import { test } from "node:test" -import assert from "node:assert/strict" -import { - DEFAULT_GATE_LIMITS, - NoiseGate, - eventText, - fingerprint, - isAlwaysSend, - isFatalEvent, - isTransportNoise, -} from "./sentry-noise.ts" - -const T0 = 1_786_700_000_000 // fixed clock; every test drives time explicitly -const MIN = 60_000 -const HOUR = 60 * MIN - -// --- pattern lists ------------------------------------------------------- - -test("isTransportNoise: the three top AGE-105 noise producers are noise", () => { - assert.equal(isTransportNoise("connect timeout"), true) - assert.equal(isTransportNoise("connect server-unreachable"), true) - assert.equal(isTransportNoise("Network request failed"), true) - assert.equal(isTransportNoise("connect no-internet"), true) - assert.equal(isTransportNoise("Request timed out after 10000ms"), true) - assert.equal(isTransportNoise("fetch error: ECONNREFUSED"), true) -}) - -test("isTransportNoise: server-side and app-side failures are NOT noise", () => { - // health-failed means the box answered but is unhealthy — that is actionable. - assert.equal(isTransportNoise("connect health-failed"), false) - assert.equal(isTransportNoise("connect tls-error"), false) - assert.equal(isTransportNoise("API Error: 500 - boom"), false) - assert.equal(isTransportNoise("TypeError: undefined is not a function"), false) - assert.equal(isTransportNoise(""), false) -}) - -test("isTransportNoise: AGE-107 — a rejected credential is user config, not an app defect", () => { - // The server answered 401/403. Nothing on our side can fix a wrong password; - // it is already shown in the connection screen and already trended in - // PostHog as connection_failed{error_class:"unauthorized"}. - assert.equal(isTransportNoise("connect auth-failed"), true) - // ...but a genuine 401 from anywhere else still reports — only the - // classified diagnostic is dropped. - assert.equal(isTransportNoise("API Error: 401 - "), false) -}) - -test("isAlwaysSend: genuine crash classes bypass the gate", () => { - assert.equal(isAlwaysSend("OutOfMemoryError (okio.Buffer.readByteArray)"), true) - assert.equal(isAlwaysSend("IllegalStateException: no activity"), true) - assert.equal(isAlwaysSend("NullPointerException"), true) - assert.equal(isAlwaysSend("SIGSEGV"), true) - assert.equal(isAlwaysSend("connect timeout"), false) -}) - -// --- event flattening ---------------------------------------------------- - -test("eventText: prefers the exception type+value, falls back to message", () => { - assert.equal( - eventText({ exception: { values: [{ type: "Error", value: "connect timeout" }] } }), - "connect timeout", - ) - assert.equal( - eventText({ exception: { values: [{ type: "OutOfMemoryError", value: "Failed to allocate" }] } }), - "OutOfMemoryError: Failed to allocate", - ) - assert.equal(eventText({ message: "plain message" }), "plain message") - assert.equal(eventText({}), "") -}) - -test("isFatalEvent: fatal level or unhandled mechanism is fatal", () => { - assert.equal(isFatalEvent({ level: "fatal" }), true) - assert.equal( - isFatalEvent({ exception: { values: [{ value: "boom", mechanism: { handled: false } }] } }), - true, - ) - assert.equal( - isFatalEvent({ level: "error", exception: { values: [{ value: "boom", mechanism: { handled: true } }] } }), - false, - ) -}) - -// --- fingerprinting ------------------------------------------------------ - -test("fingerprint: the 401 retry loop collapses to a single key", () => { - const a = fingerprint('API Error: 401 - {"error":"token expired at 1786700000"}') - const b = fingerprint('API Error: 401 - {"error":"token expired at 1786700931"}') - const c = fingerprint("API Error: 401 - Unauthorized") - assert.equal(a, b) - assert.equal(a, c) -}) - -test("fingerprint: different statuses stay distinct", () => { - assert.notEqual(fingerprint("API Error: 401 - x"), fingerprint("API Error: 403 - x")) - assert.notEqual(fingerprint("API Error: 401 - x"), fingerprint("API Error: 500 - x")) -}) - -test("fingerprint: ids/urls/paths do not fragment one error into many", () => { - const a = fingerprint("Failed to load session 0f8c7a2b-1111-4d3e-9aaa-1234567890ab from https://box.example/v1/x") - const b = fingerprint("Failed to load session 7bb1c0de-2222-4d3e-9aaa-abcdef123456 from https://other.example/v1/y") - assert.equal(a, b) -}) - -test("fingerprint: genuinely different errors stay different", () => { - assert.notEqual(fingerprint("TypeError: x is not a function"), fingerprint("connect timeout")) -}) - -test("fingerprint: bounded length", () => { - assert.ok(fingerprint("z".repeat(500)).length <= 100) -}) - -// --- gate behaviour ------------------------------------------------------ - -test("gate: transport noise is dropped every time, forever", () => { - const gate = new NoiseGate() - for (let i = 0; i < 200; i++) { - const d = gate.admit("connect timeout", {}, T0 + i * MIN) - assert.equal(d.send, false) - assert.equal(d.reason, "transport-noise") - } - assert.equal(gate.takeDroppedCount(), 200) -}) - -test("gate: a 401 retry loop reports once per cooldown, not 498 times", () => { - const gate = new NoiseGate() - let sent = 0 - // 498 events over 3 hours — the exact shape of the AGE-105 single-user loop. - for (let i = 0; i < 498; i++) { - const at = T0 + Math.floor((i * 3 * HOUR) / 498) - if (gate.admit(`API Error: 401 - attempt ${i}`, {}, at).send) sent++ - } - assert.equal(sent, 1) - // ...and it re-opens once the 6h cooldown has elapsed. - assert.equal(gate.admit("API Error: 401 - later", {}, T0 + 6 * HOUR + MIN).send, true) -}) - -test("gate: cooldown boundary is exclusive-then-inclusive", () => { - const gate = new NoiseGate() - assert.equal(gate.admit("TypeError: boom", {}, T0).send, true) - assert.equal(gate.admit("TypeError: boom", {}, T0 + DEFAULT_GATE_LIMITS.cooldownMs - 1).send, false) - assert.equal(gate.admit("TypeError: boom", {}, T0 + DEFAULT_GATE_LIMITS.cooldownMs).send, true) -}) - -test("gate: at most maxNewPerHour distinct new issues open per hour", () => { - const gate = new NoiseGate() - let sent = 0 - for (let i = 0; i < 20; i++) { - if (gate.admit(`Distinct failure ${String.fromCharCode(97 + i)}`, {}, T0 + i * MIN).send) sent++ - } - assert.equal(sent, DEFAULT_GATE_LIMITS.maxNewPerHour) - // The window is rolling, so an hour later new issues can open again. - assert.equal(gate.admit("Distinct failure zz", {}, T0 + HOUR + MIN).send, true) -}) - -test("gate: total per hour never exceeds maxPerHour even across cooldowns", () => { - const gate = new NoiseGate({ cooldownMs: 0, maxNewPerHour: 1000 }) - let sent = 0 - for (let i = 0; i < 100; i++) { - if (gate.admit(`Failure ${i % 30}`, {}, T0 + i * 30_000).send) sent++ - } - // 100 events spread over 50 minutes — all inside one rolling hour. - assert.equal(sent, DEFAULT_GATE_LIMITS.maxPerHour) -}) - -test("gate: real crashes are never dropped, whatever the quota state", () => { - const gate = new NoiseGate() - // Exhaust every budget with ordinary errors first. - for (let i = 0; i < 50; i++) gate.admit(`Ordinary failure ${i}`, {}, T0 + i * MIN) - - const oom = gate.admit("OutOfMemoryError (okio.Buffer.readByteArray)", {}, T0 + 51 * MIN) - assert.equal(oom.send, true) - assert.equal(oom.reason, "always-send") - - // Repeats of a crash loop also survive — a relaunch-crash loop is a real signal. - const again = gate.admit("OutOfMemoryError (okio.Buffer.readByteArray)", {}, T0 + 52 * MIN) - assert.equal(again.send, true) - - const fatal = gate.admit("Some unhandled native failure", { fatal: true }, T0 + 53 * MIN) - assert.equal(fatal.send, true) - assert.equal(fatal.reason, "always-send") -}) - -test("gate: fingerprint state stays bounded (oldest evicted)", () => { - // Distinct, digit-free labels: fingerprint() maps every digit to '#', so - // numbered labels would all collapse into one key. - const label = (i: number) => - `failure ${i - .toString(26) - .split("") - .map((c) => String.fromCharCode(97 + parseInt(c, 26))) - .join("")}` - const gate = new NoiseGate({ maxNewPerHour: 1e6, maxPerHour: 1e6, maxTrackedFingerprints: 10 }) - for (let i = 0; i < 50; i++) gate.admit(label(i), {}, T0 + i) - - // The oldest fingerprints were evicted, so they are allowed to report again - // (bounded memory beats perfect dedup on a mobile client). - assert.equal(gate.admit(label(0), {}, T0 + MIN).send, true) - // A recently-seen one is still deduped. - assert.equal(gate.admit(label(49), {}, T0 + MIN).send, false) -}) - -test("gate: the AGE-105 mixed hour lands far under the old volume", () => { - const gate = new NoiseGate() - let sent = 0 - const at = (i: number) => T0 + i * 1000 - let i = 0 - // The observed mix, compressed into one hour. - for (let n = 0; n < 462; n++) if (gate.admit("connect timeout", {}, at(i++)).send) sent++ - for (let n = 0; n < 498; n++) if (gate.admit(`API Error: 401 - ${n}`, {}, at(i++)).send) sent++ - for (let n = 0; n < 157; n++) if (gate.admit("connect server-unreachable", {}, at(i++)).send) sent++ - for (let n = 0; n < 5; n++) if (gate.admit("Network request failed", {}, at(i++)).send) sent++ - for (let n = 0; n < 4; n++) if (gate.admit("OutOfMemoryError (okio.Buffer)", {}, at(i++)).send) sent++ - - // 1126 raw events -> 1 auth report + 4 real crashes. - assert.equal(sent, 5) -}) diff --git a/src/lib/sentry-noise.ts b/src/lib/sentry-noise.ts deleted file mode 100644 index cccdc227..00000000 --- a/src/lib/sentry-noise.ts +++ /dev/null @@ -1,252 +0,0 @@ -// Client-side Sentry noise gate (AGE-105). -// -// Why this exists: `opencode-mobile` became the #1 source of Sentry error -// volume in the org (~4,500 events/month against a 3,500/month org gate). -// Breaking that number down, the top three issues (~1,100 events) were NOT app -// defects: -// -// 462 events / 104 users Error: connect timeout -// 498 events / 1 user Error: API Error: 401 - … -// 157 events / 33 users Error: connect server-unreachable -// -// The `connect …` ones are `captureDiagnostic()` reports of client-side network -// conditions (user's LAN/VPN/self-hosted box is down). They are already shown to -// the user as UI state AND already counted, without PII, as the PostHog -// `connection_failed` event with an `error_class` property -// (see analytics-classify.ts + stores/connections.ts), so dropping them from -// Sentry loses no trend visibility — it just stops paying per-event for a graph -// we already have. -// -// The 401 storm was NOT an automated retry loop (AGE-107 traced it): it was one -// user manually re-tapping Connect for two months because v0.4.4's probe scored -// any HTTP response as a success and told them "connection actually works now" -// while their password was wrong. A wrong password is user config, not an app -// defect — it is already surfaced in the connection screen (now as -// `connect auth-failed`) and already trended in PostHog as -// `connection_failed{error_class:"unauthorized"}`, so it is dropped here too. -// -// Three layers, cheapest first (`admit()` applies them in order): -// 1. ALWAYS-SEND allowlist — genuine crash classes (OOM/ANR/native/fatal) -// bypass every limit below. Quota is worthless if it silences real crashes. -// 2. TRANSPORT drop-list — hard drop for client-side network conditions. -// Hard, not sampled: this gate runs per-install, so even "1 per device per -// day" multiplies by the install base back into thousands per month. -// 3. Dedup + rate cap — per-fingerprint cooldown plus new-fingerprint/hour and -// total/hour ceilings, mirroring the `openclaw-box-bot` shim (AGE-55) that -// took that project from 50.7 events/h to 0. This is what turns a retry -// loop into one report, and caps the blast radius of any future regression. -// -// This module is pure and dependency-free (no @sentry/react-native, no RN) so it -// runs under plain `node --test`, same convention as analytics-classify.ts / -// diagnostics-classify.ts / api-error.ts. - -/** Minimal structural shape of a Sentry event — avoids importing the SDK here - * so this module stays testable under plain node. */ -export type NoiseEventLike = { - level?: string - message?: string - exception?: { values?: Array<{ type?: string; value?: string; mechanism?: { handled?: boolean } }> } -} - -/** Client-side network and credential conditions. Unactionable server-side, - * already surfaced to the user as connection UI, and already trended in - * PostHog as `connection_failed{error_class}`. Dropped outright. */ -export const TRANSPORT_NOISE_PATTERNS: RegExp[] = [ - // captureDiagnostic() → new Error(`connect ${classification}`) - // `auth-failed` = the server answered 401/403: wrong password, user config. - // `health-failed` and `tls-error` are deliberately NOT here — a box that - // answers but is unhealthy, or a broken cert, is actionable. - /^connect (?:timeout|server-unreachable|no-internet|malformed-url|auth-failed)$/i, - // RN fetch failures surfacing through the global handler / rejection hook. - /network request failed/i, - /request timed out after/i, - /\b(?:ECONNREFUSED|ECONNRESET|ENOTFOUND|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH)\b/, - /aborted due to timeout/i, -] - -/** Real crash classes that must never be filtered, whatever the quota says. - * Kept deliberately narrow — everything not listed here is still *reported*, - * just deduped/rate-capped rather than dropped. */ -export const ALWAYS_SEND_PATTERNS: RegExp[] = [ - /OutOfMemoryError/i, - /\bANR\b/, - /Application Not Responding/i, - /IllegalStateException/, - /NullPointerException/, - /SIGSEGV|SIGABRT|SIGBUS|EXC_BAD_ACCESS/, - /native crash/i, -] - -export type NoiseReason = - | "always-send" - | "ok" - | "transport-noise" - | "cooldown" - | "new-fingerprint-cap" - | "hourly-cap" - -export type NoiseDecision = { send: boolean; reason: NoiseReason; fingerprint: string } - -export type NoiseGateLimits = { - /** Per-fingerprint silence window after one report is sent. */ - cooldownMs: number - /** Max *distinct* fingerprints allowed to open a new report per rolling hour. */ - maxNewPerHour: number - /** Absolute ceiling of events sent per rolling hour, allowlist excluded. */ - maxPerHour: number - /** Bound on retained fingerprint state (oldest evicted first). */ - maxTrackedFingerprints: number -} - -const HOUR_MS = 60 * 60 * 1000 - -/** Mirrors the box-bot shim: cooldown=6h, max_new/h=6, max/h=10. */ -export const DEFAULT_GATE_LIMITS: NoiseGateLimits = { - cooldownMs: 6 * HOUR_MS, - maxNewPerHour: 6, - maxPerHour: 10, - maxTrackedFingerprints: 200, -} - -/** Flatten an event to the text the pattern lists match against. */ -export function eventText(event: NoiseEventLike): string { - const values = event.exception?.values ?? [] - const parts: string[] = [] - for (const ex of values) { - const type = ex.type && ex.type !== "Error" ? `${ex.type}: ` : "" - if (ex.value || ex.type) parts.push(`${type}${ex.value ?? ""}`.trim()) - } - if (!parts.length && event.message) parts.push(event.message) - return parts.join(" | ").trim() -} - -/** True for events that must bypass every limit: allowlisted crash classes, - * fatal level, or an unhandled native mechanism. */ -export function isFatalEvent(event: NoiseEventLike): boolean { - if (event.level === "fatal") return true - return (event.exception?.values ?? []).some((ex) => ex.mechanism?.handled === false) -} - -export function isTransportNoise(text: string): boolean { - if (!text) return false - return TRANSPORT_NOISE_PATTERNS.some((p) => p.test(text)) -} - -export function isAlwaysSend(text: string): boolean { - if (!text) return false - return ALWAYS_SEND_PATTERNS.some((p) => p.test(text)) -} - -/** Collapse an error message to a stable dedup key. - * - * The point is that `API Error: 401 - {"error":"token expired at 17867…"}` - * fired 498 times by one token-refresh loop must map to ONE key. So: keep the - * first line, cut the variable tail off `API Error: - `, blank - * out URLs/paths/hex/uuids/numbers, then truncate. */ -export function fingerprint(text: string): string { - let s = (text || "").split("\n")[0].trim() - // HTTP status is the one number worth keeping: 401 and 500 are different bugs. - const apiErr = s.match(/API Error:\s*(\d{3})\b/i) - if (apiErr) return `api error: ${apiErr[1]}` - s = s - .replace(/|/gi, "") - .replace(/https?:\/\/\S+/gi, "") - .replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, "") - .replace(/\b[0-9a-f]{12,}\b/gi, "") - .replace(/\/[^\s"']*/g, "") - .replace(/\d+/g, "#") - .replace(/\s+/g, " ") - .trim() - .toLowerCase() - return s.slice(0, 100) -} - -/** - * Dedup + rate limiter. Deterministic: every method takes an explicit `now` - * (defaulting to `Date.now()`), so tests drive time instead of sleeping. - * State is in-memory and per app process — a restart legitimately re-opens the - * cooldown, since a crash-restart loop is itself worth one report per launch. - */ -export class NoiseGate { - private readonly limits: NoiseGateLimits - /** fingerprint -> last time it was SENT */ - private readonly lastSent = new Map() - /** timestamps of events sent in the current rolling hour */ - private sentTimes: number[] = [] - /** timestamps at which a *previously unseen* fingerprint was opened */ - private newFingerprintTimes: number[] = [] - private dropped = 0 - - constructor(limits: Partial = {}) { - this.limits = { ...DEFAULT_GATE_LIMITS, ...limits } - } - - /** Number of events dropped since the last `takeDroppedCount()`. */ - takeDroppedCount(): number { - const n = this.dropped - this.dropped = 0 - return n - } - - admit(text: string, opts: { fatal?: boolean } = {}, now: number = Date.now()): NoiseDecision { - const fp = fingerprint(text) - - if (opts.fatal || isAlwaysSend(text)) { - // Still recorded so the hourly window reflects reality, but never blocked. - this.touch(fp, now) - this.sentTimes.push(now) - this.prune(now) - return { send: true, reason: "always-send", fingerprint: fp } - } - - if (isTransportNoise(text)) return this.drop("transport-noise", fp) - - this.prune(now) - - const last = this.lastSent.get(fp) - if (last !== undefined && now - last < this.limits.cooldownMs) { - return this.drop("cooldown", fp) - } - if (this.sentTimes.length >= this.limits.maxPerHour) { - return this.drop("hourly-cap", fp) - } - if (last === undefined && this.newFingerprintTimes.length >= this.limits.maxNewPerHour) { - return this.drop("new-fingerprint-cap", fp) - } - - if (last === undefined) this.newFingerprintTimes.push(now) - this.touch(fp, now) - this.sentTimes.push(now) - this.evictIfNeeded() - return { send: true, reason: "ok", fingerprint: fp } - } - - /** Re-insert so Map iteration order stays least-recently-sent first. */ - private touch(fp: string, now: number) { - this.lastSent.delete(fp) - this.lastSent.set(fp, now) - } - - private drop(reason: NoiseReason, fp: string): NoiseDecision { - this.dropped++ - return { send: false, reason, fingerprint: fp } - } - - private prune(now: number) { - const hourAgo = now - HOUR_MS - this.sentTimes = this.sentTimes.filter((t) => t > hourAgo) - this.newFingerprintTimes = this.newFingerprintTimes.filter((t) => t > hourAgo) - const cutoff = now - this.limits.cooldownMs - for (const [fp, t] of this.lastSent) if (t <= cutoff) this.lastSent.delete(fp) - } - - private evictIfNeeded() { - while (this.lastSent.size > this.limits.maxTrackedFingerprints) { - // Map preserves insertion order and we re-set on each send, so the first - // key is the least recently sent. - const oldest = this.lastSent.keys().next() - if (oldest.done) break - this.lastSent.delete(oldest.value) - } - } -} diff --git a/src/lib/sentry.ts b/src/lib/sentry.ts index bb3c218b..15495cc4 100644 --- a/src/lib/sentry.ts +++ b/src/lib/sentry.ts @@ -1,101 +1,46 @@ -// Centralised Sentry wrapper. The goals here: -// 1. Capture every *unexpected* error: React render crashes, uncaught JS -// exceptions from the RN bridge, unhandled promise rejections, native -// crashes (handled by the Sentry RN SDK automatically). -// 2. Stay a strict no-op when no DSN is configured so dev/CI builds need no -// secrets and offline behaviour is unchanged. -// 3. Scrub URLs (basic-auth + query string) from every outgoing event so -// server addresses or tokens never leak to Sentry. -// 4. Provide small `addBreadcrumb` / `captureException` helpers so call sites -// get rich context without importing the Sentry SDK directly. -// 5. Keep event volume inside the org Sentry quota (AGE-105): a noise gate in -// `beforeSend` drops client-side network conditions and collapses retry -// loops, while genuine crashes pass through untouched. The decision logic -// lives in ./sentry-noise.ts so it is unit-testable without the RN SDK. +// Local-only crash logging. This fork sends no telemetry: the upstream Sentry +// wrapper is replaced by these no-op-or-log helpers so call sites stay the same. +// Uncaught errors still land in the in-memory log buffer, and therefore in any +// diagnostic report the user chooses to share. -import * as Sentry from "@sentry/react-native" -import appJson from "../../app.json" import { log } from "./logbuffer" -import { NoiseGate, eventText, isFatalEvent, isTransportNoise } from "./sentry-noise" import type { DiagnosticReport } from "./diagnostics" -const DSN = process.env.EXPO_PUBLIC_SENTRY_DSN -const APP_VERSION = (appJson as { expo?: { version?: string } }).expo?.version ?? "unknown" +export type Breadcrumb = { + category: string + message: string + level?: "debug" | "info" | "warning" | "error" + data?: Record +} + +export function addBreadcrumb(_crumb: Breadcrumb) {} -let enabled = false -let handlersInstalled = false +export function captureException( + err: unknown, + _context?: { tags?: Record; extra?: Record; level?: string }, +) { + log.error("crash", "captureException", toError(err).message) +} -// One gate per app process. Drops are counted and attached to the next event -// that does get through, so the quota saving stays visible in Sentry itself. -const noiseGate = new NoiseGate() +export function captureDiagnostic(report: DiagnosticReport) { + log.info("diag", "connect failed", report.classification) +} -export function initSentry() { - if (enabled) return - if (!DSN) { - log.info("sentry", "no DSN configured — telemetry disabled") - installGlobalHandlers() - return - } +function toError(value: unknown): Error { + if (value instanceof Error) return value + if (typeof value === "string") return new Error(value) try { - Sentry.init({ - dsn: DSN, - release: `opencode-mobile@${APP_VERSION}`, - dist: APP_VERSION, - // Performance tracing off by default; only error + crash capture. - tracesSampleRate: 0, - enableAutoSessionTracking: true, - // Don't ship default PII (IP, cookies). We attach what we want explicitly. - sendDefaultPii: false, - // Auto-capture uncaught JS exceptions AND unhandled promise rejections. - // The SDK enables these by default but we keep them on explicitly so a - // future config refactor can't silently drop coverage. - enableNative: true, - enableNativeCrashHandling: true, - enableAutoPerformanceTracing: false, - attachStacktrace: true, - maxBreadcrumbs: 100, - // Final pre-send stage: drop non-actionable noise (AGE-105), then strip - // URLs everywhere they could appear. - beforeSend(event) { - const filtered = applyNoiseGate(event) - return filtered ? scrubEvent(filtered) : null - }, - beforeBreadcrumb(crumb) { - // Console output can contain malformed server payloads, prompts, or code. - if (crumb.category === "console") return null - if (crumb.data && typeof crumb.data === "object") { - crumb.data = redactObject(crumb.data as Record) - } - if (typeof crumb.message === "string") crumb.message = redactString(crumb.message) - return crumb - }, - }) - enabled = true - Sentry.setTag("app.version", APP_VERSION) - log.info("sentry", "initialized", `release=opencode-mobile@${APP_VERSION}`) - } catch (e) { - log.warn("sentry", "init failed", String(e)) + return new Error(JSON.stringify(value)) + } catch { + return new Error(String(value)) } - installGlobalHandlers() } -export async function disableSentry() { - if (!enabled) return - enabled = false - await Sentry.close() - log.info("sentry", "disabled by user") -} +let installed = false -// Install belt-and-braces global handlers. The Sentry RN SDK already wires -// these via its ReactNativeErrorHandlers integration, but we layer our own on -// top so: -// * Errors still land in the in-memory log buffer (and therefore in any -// shared diagnostic report) even when Sentry is disabled. -// * Telemetry-disabled builds still leave a breadcrumb that something blew -// up, which is invaluable when triaging a user-shared report offline. -function installGlobalHandlers() { - if (handlersInstalled) return - handlersInstalled = true +export function installCrashLogging() { + if (installed) return + installed = true type GlobalErrorUtils = { getGlobalHandler?: () => (err: unknown, isFatal?: boolean) => void @@ -107,198 +52,18 @@ function installGlobalHandlers() { errorUtils.setGlobalHandler((err: unknown, isFatal?: boolean) => { const error = toError(err) log.error("crash", isFatal ? "FATAL" : "non-fatal", error.message, error.stack ?? "") - if (enabled) { - Sentry.captureException(error, (scope) => { - scope.setLevel(isFatal ? "fatal" : "error") - scope.setTag("crash.source", "js-global") - scope.setTag("crash.fatal", String(Boolean(isFatal))) - return scope - }) - } previous?.(err, isFatal) }) } - // Hermes/RN expose `onunhandledrejection` on the global object. type GlobalRejection = { onunhandledrejection?: (event: { reason?: unknown; promise?: unknown }) => void } const g = globalThis as unknown as GlobalRejection - const prevRej = g.onunhandledrejection + const prev = g.onunhandledrejection g.onunhandledrejection = (event) => { const error = toError(event?.reason) log.error("crash", "unhandled-rejection", error.message, error.stack ?? "") - if (enabled) { - Sentry.captureException(error, (scope) => { - scope.setLevel("error") - scope.setTag("crash.source", "promise-rejection") - return scope - }) - } - prevRej?.(event) - } -} - -function toError(value: unknown): Error { - if (value instanceof Error) return value - if (typeof value === "string") return new Error(value) - try { - return new Error(JSON.stringify(value)) - } catch { - return new Error(String(value)) - } -} - -// --- Noise gate (pure logic lives in ./sentry-noise for testability) ------ - -/** Returns the event to send, or null to drop it. Exported for the RN-side - * integration test; the pure rules are tested in sentry-noise.test.ts. */ -export function applyNoiseGate(event: T): T | null { - const text = eventText(event) - const decision = noiseGate.admit(text, { fatal: isFatalEvent(event) }) - if (!decision.send) { - log.info("sentry", "dropped event", decision.reason) - return null - } - const dropped = noiseGate.takeDroppedCount() - if (dropped > 0) { - event.tags = { ...event.tags, "noise.dropped_since_last": String(dropped) } - } - return event -} - -// --- Scrubbing (pure functions live in ./scrub for testability) ---------- - -export { scrubUrl } from "./scrub" - -function scrubEvent(event: T): T { - if (event.request?.url) event.request.url = "" - if (event.message) event.message = redactString(event.message) - if (event.exception?.values) { - for (const ex of event.exception.values) { - if (ex.value) ex.value = redactString(ex.value) - } - } - if (event.breadcrumbs) { - event.breadcrumbs = event.breadcrumbs.filter((crumb) => crumb.category !== "console") - for (const crumb of event.breadcrumbs) { - if (typeof crumb.message === "string") crumb.message = redactString(crumb.message) - if (crumb.data && typeof crumb.data === "object") { - crumb.data = redactObject(crumb.data as Record) - } - } - } - return event -} - -function redactString(value: string): string { - return value.replace(/https?:\/\/[^\s)\]}"']+/gi, "") -} - -function redactObject(value: Record): Record { - const redacted: Record = {} - for (const [key, item] of Object.entries(value)) { - if ( - /^(?:id|.*Id|.*ID|url|host|hostname|port|address|server|serverUrl|target|endpoint|authorization|auth|token|password|secret|apiKey|username|cookie)$/i.test( - key, - ) - ) { - redacted[key] = "" - continue - } - if (typeof item === "string") { - redacted[key] = redactString(item) - continue - } - if (Array.isArray(item)) { - redacted[key] = item.map((entry) => - typeof entry === "string" - ? redactString(entry) - : entry && typeof entry === "object" - ? redactObject(entry as Record) - : entry, - ) - continue - } - if (item && typeof item === "object") { - redacted[key] = redactObject(item as Record) - continue - } - redacted[key] = item + prev?.(event) } - return redacted } - -// --- Helpers exposed to the rest of the app ------------------------------ - -export type Breadcrumb = { - category: string - message: string - level?: "debug" | "info" | "warning" | "error" - data?: Record -} - -export function addBreadcrumb(crumb: Breadcrumb) { - if (!enabled) return - Sentry.addBreadcrumb({ - category: crumb.category, - message: crumb.message, - level: crumb.level ?? "info", - data: crumb.data, - timestamp: Date.now() / 1000, - }) -} - -export function captureException( - err: unknown, - context?: { tags?: Record; extra?: Record; level?: Sentry.SeverityLevel }, -) { - const error = toError(err) - log.error("sentry", "captureException", error.message) - if (!enabled) return - Sentry.withScope((scope) => { - if (context?.level) scope.setLevel(context.level) - if (context?.tags) for (const [k, v] of Object.entries(context.tags)) scope.setTag(k, v) - if (context?.extra) for (const [k, v] of Object.entries(context.extra)) scope.setExtra(k, v) - Sentry.captureException(error) - }) -} - -export function captureDiagnostic(report: DiagnosticReport) { - log.info("sentry", "capture", report.classification, enabled ? "(uploading)" : "(local only)") - if (!enabled) return - // Client-side network conditions (timeout / unreachable / no internet) and - // wrong credentials (auth-failed) are already shown to the user and already - // trended in PostHog as `connection_failed{error_class}`; they were the - // single largest consumer of the org Sentry quota (AGE-105 / AGE-107). Skip - // them here so we don't even build the event. `health-failed` / `tls-error` - // are genuinely actionable and still go. - if (isTransportNoise(`connect ${report.classification}`)) { - log.info("sentry", "skipped diagnostic upload (client-side network condition)", report.classification) - return - } - Sentry.withScope((scope) => { - scope.setTag("connect.classification", report.classification) - scope.setTag("connect.scheme", report.scheme ?? "n/a") - scope.setContext("connection", { - targetType: report.isHostname ? "hostname" : "ip-address", - }) - scope.setContext("probes", { - attempts: report.attempts.map((a) => ({ - name: a.name, - ok: a.ok, - status: a.status, - durationMs: a.durationMs, - })), - }) - scope.setContext("device", report.device) - Sentry.captureException(new Error(`connect ${report.classification}`)) - }) -} - -// React error boundaries are implemented as our own class component -// (see src/components/ErrorBoundary.tsx) so we can render a useful -// "Share diagnostic" fallback. We still expose Sentry.wrap as `wrap` -// for callers that just want auto-capture without a custom fallback. -export const wrap = Sentry.wrap -export const sentryEnabled = () => enabled diff --git a/src/lib/telemetry.ts b/src/lib/telemetry.ts deleted file mode 100644 index fdd335bc..00000000 --- a/src/lib/telemetry.ts +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Telemetry consent + initialisation gate. - * - * Wraps sentry.ts AND analytics.ts so that initSentry()/initAnalytics() are - * only called when the user has explicitly opted in. Both crash reporting - * and activation-funnel analytics share this single consent flag — there is - * no separate toggle for analytics. Consent state is persisted in - * expo-secure-store so it survives app restarts. - * - * Usage: - * import { loadTelemetryConsent, setTelemetryConsent, hasTelemetryConsent } from './telemetry' - * - * // On app start — call BEFORE trying to initialise Sentry/analytics. - * const state = await loadTelemetryConsent() // 'granted' | 'denied' | 'unknown' - * if (state === 'granted') { initSentry(); initAnalytics() } - * - * // After the user taps "Allow" in the consent modal: - * await setTelemetryConsent(true) // persists + calls initSentry()/initAnalytics() if not already done - * - * // Check in Settings screen: - * const current = hasTelemetryConsent() // boolean | null (null = not yet decided) - */ - -import * as SecureStore from "expo-secure-store" -import { disableSentry, initSentry, sentryEnabled } from "./sentry" -import { initAnalytics, shutdownAnalytics, analyticsEnabled, trackAppOpened } from "./analytics" - -const CONSENT_KEY = "opencode_telemetry_consent" - -export type ConsentState = "granted" | "denied" | "unknown" - -let _resolved: boolean | null = null // null = unknown, true = granted, false = denied -let transition = Promise.resolve() - -/** - * Load persisted consent from SecureStore. - * Returns 'unknown' if the user has never been asked. - */ -export async function loadTelemetryConsent(): Promise { - try { - const stored = await SecureStore.getItemAsync(CONSENT_KEY) - if (stored === "granted") { - _resolved = true - return "granted" - } - if (stored === "denied") { - _resolved = false - return "denied" - } - // No stored value — first launch - _resolved = null - return "unknown" - } catch { - _resolved = false - return "denied" - } -} - -/** - * Returns the in-memory resolved state (set by loadTelemetryConsent or setTelemetryConsent). - * null = consent decision not yet loaded. - * true = granted. - * false = denied. - */ -export function hasTelemetryConsent(): boolean | null { - return _resolved -} - -/** - * Persist the user's consent decision and, if granted and Sentry is not yet - * running, initialise it immediately. - */ -export function setTelemetryConsent(granted: boolean): Promise { - const next = transition.then(() => applyTelemetryConsent(granted)) - transition = next.catch(() => undefined) - return next -} - -async function applyTelemetryConsent(granted: boolean): Promise { - if (granted) { - await SecureStore.setItemAsync(CONSENT_KEY, "granted") - _resolved = true - if (!sentryEnabled()) initSentry() - if (!analyticsEnabled()) initAnalytics() - // First-ever session reaches here via the consent modal's "Allow" (app - // start skipped init because consent was still unknown), so app_opened - // must also fire on the grant transition — otherwise the true first - // session emits nothing and session 2 gets mislabeled is_first_open. - // trackAppOpened() is internally once-per-session, so a mid-session - // revoke -> re-grant cannot double-count. - void trackAppOpened() - return - } - - _resolved = false - await disableSentry() - await shutdownAnalytics() - try { - await SecureStore.setItemAsync(CONSENT_KEY, "denied") - } catch (error) { - await SecureStore.deleteItemAsync(CONSENT_KEY) - throw error - } -} diff --git a/src/lib/update-check.ts b/src/lib/update-check.ts index 70005a7c..ca32b62c 100644 --- a/src/lib/update-check.ts +++ b/src/lib/update-check.ts @@ -38,11 +38,11 @@ import { export type { AvailableUpdate } -/** Same source Sentry uses for `release`, so the two always agree. */ +/** The version in app.json; release tags (vX.Y.Z) must match it. */ export const CURRENT_VERSION = (appJson as { expo?: { version?: string } }).expo?.version ?? "unknown" -const RELEASES_API = "https://api.github.com/repos/dzianisv/opencode-mobile/releases/latest" -const RELEASES_PAGE = "https://github.com/dzianisv/opencode-mobile/releases/latest" +const RELEASES_API = "https://api.github.com/repos/kjeldahl/opencode-mobile/releases/latest" +const RELEASES_PAGE = "https://github.com/kjeldahl/opencode-mobile/releases/latest" const TIMEOUT_MS = 8000 const storage: UpdateStorage = { diff --git a/src/lib/waitlist-queue-storage.ts b/src/lib/waitlist-queue-storage.ts deleted file mode 100644 index d9e16be6..00000000 --- a/src/lib/waitlist-queue-storage.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Production wiring for the waitlist retry queue (AGE-87). -// -// Split out from waitlist-queue.ts so the queue logic stays importable by -// `node --test` (no react-native / AsyncStorage native module). This file is -// the only place that touches device storage. -// -// AsyncStorage (not SecureStore) on purpose: a pending waitlist email is not a -// credential, and this queue must survive a keychain that refuses to unlock — -// the whole point is that the signup is never silently lost. - -import AsyncStorage from "@react-native-async-storage/async-storage" -import { flushQueue, loadQueue, enqueueSignup, removeFromQueue, type FlushOutcome, type QueuedSignup, type QueueStorage } from "./waitlist" - -const storage: QueueStorage = { - getItem: (key) => AsyncStorage.getItem(key), - setItem: (key, value) => AsyncStorage.setItem(key, value), - removeItem: (key) => AsyncStorage.removeItem(key), -} - -export function queuePendingSignup(email: string, error?: string): Promise { - return enqueueSignup(storage, email, { error }) -} - -export function readPendingSignups(): Promise { - return loadQueue(storage) -} - -export function dropPendingSignup(email: string): Promise { - return removeFromQueue(storage, email) -} - -/** Best-effort retry of every pending signup. Safe to call on every foreground. */ -export function flushPendingSignups(): Promise { - return flushQueue(storage) -} diff --git a/src/lib/waitlist-queue.test.ts b/src/lib/waitlist-queue.test.ts deleted file mode 100644 index f1d5940c..00000000 --- a/src/lib/waitlist-queue.test.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { test } from "node:test" -import assert from "node:assert/strict" -import { - WAITLIST_QUEUE_KEY, - WAITLIST_QUEUE_MAX, - WAITLIST_QUEUE_TTL_MS, - enqueueSignup, - flushQueue, - loadQueue, - needsManualEscapeHatch, - pruneQueue, - removeFromQueue, - type QueueStorage, - type QueuedSignup, - type WaitlistResult, -} from "./waitlist.ts" - -// In-memory stand-in for AsyncStorage. `fail` makes every write throw, which is -// how a device with full/locked storage behaves. -function memoryStorage(initial?: string, opts: { failWrites?: boolean } = {}) { - const map = new Map() - if (initial !== undefined) map.set(WAITLIST_QUEUE_KEY, initial) - const storage: QueueStorage & { map: Map } = { - map, - async getItem(key) { - return map.get(key) ?? null - }, - async setItem(key, value) { - if (opts.failWrites) throw new Error("storage full") - map.set(key, value) - }, - async removeItem(key) { - if (opts.failWrites) throw new Error("storage full") - map.delete(key) - }, - } - return storage -} - -function stored(storage: { map: Map }): QueuedSignup[] { - const raw = storage.map.get(WAITLIST_QUEUE_KEY) - return raw ? (JSON.parse(raw) as QueuedSignup[]) : [] -} - -const ok = (email: string): WaitlistResult => ({ ok: true, email }) -const offline = (email: string): WaitlistResult => ({ ok: false, email, retryable: true, error: "Network request failed" }) -const rejected = (email: string): WaitlistResult => ({ ok: false, email, retryable: false, error: "Enter a valid email address." }) - -// --- enqueue --- - -test("enqueue persists a normalized signup with attempt 1", async () => { - const storage = memoryStorage() - const entry = await enqueueSignup(storage, " Dev@Example.COM ", { now: 1_000, error: "Network request failed" }) - assert.deepEqual(entry, { - email: "dev@example.com", - queuedAt: 1_000, - attempts: 1, - lastAttemptAt: 1_000, - lastError: "Network request failed", - }) - assert.deepEqual(stored(storage), [entry]) -}) - -test("enqueue dedupes by email and bumps attempts instead of growing the queue", async () => { - const storage = memoryStorage() - await enqueueSignup(storage, "dev@example.com", { now: 1_000 }) - const second = await enqueueSignup(storage, "DEV@example.com", { now: 2_000 }) - assert.equal(stored(storage).length, 1) - assert.equal(second?.attempts, 2) - assert.equal(second?.queuedAt, 1_000, "original queue time is preserved") - assert.equal(second?.lastAttemptAt, 2_000) -}) - -test("enqueue caps the queue at WAITLIST_QUEUE_MAX, keeping the newest", async () => { - const storage = memoryStorage() - for (let i = 0; i < WAITLIST_QUEUE_MAX + 3; i++) { - await enqueueSignup(storage, `user${i}@example.com`, { now: 1_000 + i }) - } - const queue = stored(storage) - assert.equal(queue.length, WAITLIST_QUEUE_MAX) - assert.equal(queue[queue.length - 1].email, `user${WAITLIST_QUEUE_MAX + 2}@example.com`) -}) - -test("enqueue refuses an invalid email — nothing is stored, caller must not claim success", async () => { - const storage = memoryStorage() - assert.equal(await enqueueSignup(storage, "not-an-email"), null) - assert.equal(storage.map.size, 0) -}) - -test("enqueue returns null when storage refuses the write (never lie about saving)", async () => { - const storage = memoryStorage(undefined, { failWrites: true }) - assert.equal(await enqueueSignup(storage, "dev@example.com", { now: 1 }), null) -}) - -// --- load resilience: a corrupt blob must not brick the screen --- - -test("load tolerates missing, corrupt, non-array and foreign-shaped payloads", async () => { - assert.deepEqual(await loadQueue(memoryStorage()), []) - assert.deepEqual(await loadQueue(memoryStorage("{not json")), []) - assert.deepEqual(await loadQueue(memoryStorage('{"email":"a@b.co"}')), []) - assert.deepEqual(await loadQueue(memoryStorage('[{"nope":1},null,3]')), []) - assert.deepEqual( - await loadQueue(memoryStorage('[{"email":"NOT normalized","queuedAt":1,"attempts":1}]')), - [], - "entries that were never normalized are dropped rather than replayed as garbage", - ) -}) - -test("load backfills lastAttemptAt for entries written before that field existed", async () => { - const storage = memoryStorage('[{"email":"dev@example.com","queuedAt":42,"attempts":1}]') - assert.deepEqual(await loadQueue(storage), [ - { email: "dev@example.com", queuedAt: 42, attempts: 1, lastAttemptAt: 42 }, - ]) -}) - -test("load survives a storage read that throws", async () => { - const storage: QueueStorage = { - async getItem() { - throw new Error("AsyncStorage unavailable") - }, - async setItem() {}, - async removeItem() {}, - } - assert.deepEqual(await loadQueue(storage), []) -}) - -// --- TTL --- - -test("entries older than the TTL are pruned", () => { - const fresh: QueuedSignup = { email: "a@b.co", queuedAt: 1_000, attempts: 1, lastAttemptAt: 1_000 } - const stale: QueuedSignup = { email: "c@d.co", queuedAt: 0, attempts: 9, lastAttemptAt: 0 } - assert.deepEqual(pruneQueue([fresh, stale], WAITLIST_QUEUE_TTL_MS + 500), [fresh]) -}) - -// --- flush: the AGE-87 acceptance test --- - -test("offline signup reaches the server on the next flush, with no mail client involved", async () => { - const storage = memoryStorage() - - // 1. User taps "Join Waitlist" on a plane: the POST fails, we queue it. - const failure = offline("dev@example.com") - assert.equal(failure.ok, false) - const queued = await enqueueSignup(storage, "dev@example.com", { now: 1_000, error: failure.error }) - assert.equal(queued?.attempts, 1) - - // 2. Still offline on the next foreground: kept, attempts bumped. - const attempted: string[] = [] - const stillOffline = await flushQueue(storage, { - now: 2_000, - submit: async (email) => { - attempted.push(email) - return offline(email) - }, - }) - assert.deepEqual(stillOffline.synced, []) - assert.deepEqual(stillOffline.pending.map((e) => e.attempts), [2]) - assert.deepEqual(stored(storage).map((e) => e.email), ["dev@example.com"]) - - // 3. Device reconnects: the queued signup lands in Brevo list 4 and the - // queue empties. No mailto: URL was ever built. - const reconnected = await flushQueue(storage, { - now: 3_000, - submit: async (email) => { - attempted.push(email) - return ok(email) - }, - }) - assert.deepEqual(reconnected.synced, ["dev@example.com"]) - assert.deepEqual(reconnected.pending, []) - assert.equal(storage.map.has(WAITLIST_QUEUE_KEY), false, "queue key is removed once empty") - assert.deepEqual(attempted, ["dev@example.com", "dev@example.com"]) -}) - -test("flush drops entries the server permanently rejects (4xx) instead of retrying forever", async () => { - const storage = memoryStorage() - await enqueueSignup(storage, "dev@example.com", { now: 1 }) - const outcome = await flushQueue(storage, { now: 2, submit: async (email) => rejected(email) }) - assert.deepEqual(outcome.rejected, ["dev@example.com"]) - assert.deepEqual(outcome.pending, []) - assert.deepEqual(stored(storage), []) -}) - -test("flush keeps the other entries when one submit throws", async () => { - const storage = memoryStorage() - await enqueueSignup(storage, "a@example.com", { now: 1 }) - await enqueueSignup(storage, "b@example.com", { now: 2 }) - const outcome = await flushQueue(storage, { - now: 3, - submit: async (email) => { - if (email === "a@example.com") throw new TypeError("boom") - return ok(email) - }, - }) - assert.deepEqual(outcome.synced, ["b@example.com"]) - assert.deepEqual(outcome.pending.map((e) => e.email), ["a@example.com"]) - assert.match(outcome.pending[0].lastError ?? "", /boom/) -}) - -test("flush prunes expired entries without submitting them", async () => { - const storage = memoryStorage() - await enqueueSignup(storage, "old@example.com", { now: 0 }) - let called = 0 - const outcome = await flushQueue(storage, { - now: WAITLIST_QUEUE_TTL_MS + 1, - submit: async (email) => { - called++ - return ok(email) - }, - }) - assert.equal(called, 0) - assert.deepEqual(outcome, { synced: [], rejected: [], pending: [] }) - assert.deepEqual(stored(storage), []) -}) - -test("flush on an empty queue is a no-op", async () => { - const storage = memoryStorage() - const outcome = await flushQueue(storage, { submit: async () => assert.fail("must not submit") }) - assert.deepEqual(outcome, { synced: [], rejected: [], pending: [] }) -}) - -// --- manual escape hatch policy --- - -test("the manual email escape hatch appears only after repeated failures", async () => { - const storage = memoryStorage() - let entry = await enqueueSignup(storage, "dev@example.com", { now: 1 }) - assert.equal(needsManualEscapeHatch(entry), false) - entry = await enqueueSignup(storage, "dev@example.com", { now: 2 }) - assert.equal(needsManualEscapeHatch(entry), false) - entry = await enqueueSignup(storage, "dev@example.com", { now: 3 }) - assert.equal(needsManualEscapeHatch(entry), true, "3rd failed attempt -> offer 'still not working? email us'") - assert.equal(needsManualEscapeHatch(null), false) -}) - -// --- explicit removal --- - -test("removeFromQueue drops just that email", async () => { - const storage = memoryStorage() - await enqueueSignup(storage, "a@example.com", { now: 1 }) - await enqueueSignup(storage, "b@example.com", { now: 2 }) - await removeFromQueue(storage, "a@example.com") - assert.deepEqual(stored(storage).map((e) => e.email), ["b@example.com"]) - await removeFromQueue(storage, "missing@example.com") // no-op, no throw - assert.deepEqual(stored(storage).map((e) => e.email), ["b@example.com"]) -}) diff --git a/src/lib/waitlist.test.ts b/src/lib/waitlist.test.ts deleted file mode 100644 index a42a70e2..00000000 --- a/src/lib/waitlist.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { test } from "node:test" -import assert from "node:assert/strict" -import { - WAITLIST_ENDPOINT, - WAITLIST_SOURCE, - normalizeWaitlistEmail, - buildWaitlistPayload, - buildWaitlistMailtoUrl, - isRetryableFailure, - submitWaitlistSignup, -} from "./waitlist.ts" - -// --- normalizeWaitlistEmail: mirror of the server's 400 rule --- - -test("normalize trims and lowercases like the server", () => { - assert.equal(normalizeWaitlistEmail(" Dev@Example.COM "), "dev@example.com") -}) - -test("normalize rejects what the server would 400 on", () => { - assert.equal(normalizeWaitlistEmail(""), null) - assert.equal(normalizeWaitlistEmail(" "), null) - assert.equal(normalizeWaitlistEmail("not-an-email"), null) - assert.equal(normalizeWaitlistEmail("a b@example.com"), null) - assert.equal(normalizeWaitlistEmail("no-tld@host"), null) - assert.equal(normalizeWaitlistEmail(`${"x".repeat(250)}@a.com`), null) // > 254 chars -}) - -// --- payload: the source tag is the whole point of #87 --- - -test("payload tags the signup with the opencode-connect source", () => { - assert.deepEqual(buildWaitlistPayload("dev@example.com"), { - email: "dev@example.com", - source: WAITLIST_SOURCE, - }) -}) - -// --- mailto URL: last-resort escape hatch only (AGE-87), byte-compatible --- - -test("mailto escape hatch preserves subject and embeds the email", () => { - const url = buildWaitlistMailtoUrl("dev@example.com") - assert.ok(url.startsWith("mailto:support@agentlabs.cc?")) - assert.ok(url.includes("subject=OpenCode%20Connect%20Waitlist")) - assert.ok(url.includes(encodeURIComponent("Email: dev@example.com"))) -}) - -test("mailto escape hatch works without an email", () => { - const url = buildWaitlistMailtoUrl("") - assert.ok(url.includes("body=Sign%20me%20up!")) - assert.ok(!url.includes("Email")) -}) - -// AGE-100: the reconciler has to be able to say which build produced a mailto -// signup. Pre-v0.4.8 sideloads (no signup API, unreachable by any release) -// send no App: line; a current build sending one means the retry queue leaked -// and that is a new defect, not the known stale cohort. -test("mailto escape hatch stamps the app version when given one", () => { - const url = buildWaitlistMailtoUrl("dev@example.com", "0.4.13") - assert.ok(url.includes(encodeURIComponent("App: OpenCode Mobile v0.4.13"))) - assert.ok(url.includes(encodeURIComponent("Email: dev@example.com"))) -}) - -test("mailto escape hatch omits the version line when the version is unknown", () => { - const url = buildWaitlistMailtoUrl("dev@example.com") - assert.ok(!url.includes("App%3A")) -}) - -// --- retry decision --- - -// 502 named explicitly: the server returns it when Brevo itself fails, and the -// signup must survive that by being queued and retried (AGE-87), not mailed. -test("retryable: transport failures and 5xx (incl. 502 Brevo failure) -> retry, 4xx -> fix input", () => { - assert.equal(isRetryableFailure({ kind: "network-error" }), true) - assert.equal(isRetryableFailure({ kind: "http", status: 500 }), true) - assert.equal(isRetryableFailure({ kind: "http", status: 502 }), true) - assert.equal(isRetryableFailure({ kind: "http", status: 503 }), true) - assert.equal(isRetryableFailure({ kind: "http", status: 400 }), false) - assert.equal(isRetryableFailure({ kind: "http", status: 429 }), false) -}) - -// --- submitWaitlistSignup with injected fetch --- - -type FetchCall = { url: string; init: { method: string; headers: Record; body: string; signal: AbortSignal } } - -function fakeFetch(response: { ok: boolean; status: number; body?: unknown }, calls: FetchCall[] = []) { - return async (url: string, init: FetchCall["init"]) => { - calls.push({ url, init }) - return { ok: response.ok, status: response.status, json: async () => response.body ?? null } - } -} - -test("submit posts the tagged payload to the beta-signup endpoint", async () => { - const calls: FetchCall[] = [] - const result = await submitWaitlistSignup(" Dev@Example.com ", { fetchFn: fakeFetch({ ok: true, status: 200, body: { ok: true } }, calls) }) - assert.deepEqual(result, { ok: true, email: "dev@example.com" }) - assert.equal(calls.length, 1) - assert.equal(calls[0].url, WAITLIST_ENDPOINT) - assert.equal(calls[0].init.method, "POST") - assert.equal(calls[0].init.headers["content-type"], "application/json") - assert.deepEqual(JSON.parse(calls[0].init.body), { email: "dev@example.com", source: WAITLIST_SOURCE }) - assert.ok(calls[0].init.signal instanceof AbortSignal) -}) - -test("submit rejects an invalid email locally without hitting the network", async () => { - const calls: FetchCall[] = [] - const result = await submitWaitlistSignup("nope", { fetchFn: fakeFetch({ ok: true, status: 200 }, calls) }) - assert.equal(calls.length, 0) - assert.deepEqual(result, { ok: false, email: "nope", retryable: false, error: "Enter a valid email address." }) -}) - -test("submit surfaces the server's 400 message and marks it non-retryable", async () => { - const result = await submitWaitlistSignup("dev@example.com", { - fetchFn: fakeFetch({ ok: false, status: 400, body: { error: "Enter a valid email address." } }), - }) - assert.deepEqual(result, { ok: false, email: "dev@example.com", retryable: false, error: "Enter a valid email address." }) -}) - -test("submit marks 5xx retryable (server broken, keep the signup alive)", async () => { - const result = await submitWaitlistSignup("dev@example.com", { - fetchFn: fakeFetch({ ok: false, status: 503, body: { error: "The waitlist is temporarily unavailable. Please try again later." } }), - }) - assert.equal(result.ok, false) - if (!result.ok) { - assert.equal(result.retryable, true) - assert.equal(result.error, "The waitlist is temporarily unavailable. Please try again later.") - } -}) - -test("submit marks a rejected fetch retryable (offline)", async () => { - const result = await submitWaitlistSignup("dev@example.com", { - fetchFn: async () => { - throw new TypeError("Network request failed") - }, - }) - assert.deepEqual(result, { ok: false, email: "dev@example.com", retryable: true, error: "Network request failed" }) -}) - -test("submit aborts after timeoutMs and marks it retryable", async () => { - const result = await submitWaitlistSignup("dev@example.com", { - timeoutMs: 20, - fetchFn: (_url, init) => - new Promise((_resolve, reject) => { - init.signal.addEventListener("abort", () => { - const err = new Error("Aborted") - err.name = "AbortError" - reject(err) - }) - }), - }) - assert.deepEqual(result, { ok: false, email: "dev@example.com", retryable: true, error: "timeout after 20ms" }) -}) - -test("submit tolerates a non-JSON error body", async () => { - const result = await submitWaitlistSignup("dev@example.com", { - fetchFn: async () => ({ - ok: false, - status: 502, - json: async () => { - throw new SyntaxError("Unexpected token") - }, - }), - }) - assert.deepEqual(result, { ok: false, email: "dev@example.com", retryable: true, error: "Signup failed (HTTP 502)." }) -}) diff --git a/src/lib/waitlist.ts b/src/lib/waitlist.ts deleted file mode 100644 index 11f9cb00..00000000 --- a/src/lib/waitlist.ts +++ /dev/null @@ -1,349 +0,0 @@ -// OpenCode Connect waitlist signup: pure payload/fallback logic. -// -// Kept free of react-native imports (Linking, Alert) so it's unit-testable -// with plain `node --test`, the same split used for buildAuth() in auth.ts -// and shouldRequestReview() in store-review-policy.ts. The screen injects -// nothing in production (global fetch is used); tests inject a fake fetch. -// -// Backend: the OpenCodeMobileSite beta-signup route (VibeBrowserProductPage -// repo, OpenCodeMobileSite/app/api/beta-signup/route.ts) validates `email` -// and adds it to a Brevo list. It ignores unknown body fields today, so the -// `source` tag we send is forward-compatible: harmless now, attributable as -// soon as the route starts reading it. - -export const WAITLIST_ENDPOINT = "https://opencode.agentlabs.cc/api/beta-signup" -export const WAITLIST_SOURCE = "opencode-connect-waitlist" -export const WAITLIST_TIMEOUT_MS = 8_000 -export const WAITLIST_FALLBACK_EMAIL = "support@agentlabs.cc" - -// Mirrors the server-side pattern in brevo-contact.ts so we reject locally -// exactly what the server would 400 on, instead of burning a round trip. -const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ - -/** Trim/lowercase like the server does; null when the server would 400. */ -export function normalizeWaitlistEmail(raw: string): string | null { - const email = raw.trim().toLowerCase() - if (!email || email.length > 254 || !emailPattern.test(email)) return null - return email -} - -export function buildWaitlistPayload(email: string): { email: string; source: string } { - return { email, source: WAITLIST_SOURCE } -} - -/** - * Last-resort, USER-INITIATED escape hatch (AGE-87). Never open this - * automatically: a failed signup is queued locally and retried - * (waitlist-queue.ts). This URL is only offered after retries keep failing, - * behind an explicit "still not working? email us" tap. - * - * `appVersion` stamps the build into the mail body (AGE-100). Without it the - * hourly reconciler that heals these mails - * (VibeBrowserProductPage/scripts/reconcile-waitlist-mailto.js) cannot tell a - * ~436-device pre-v0.4.8 sideload — which has no signup API at all and can - * never be fixed by shipping code — from a current build that still fell back, - * which would be a live defect. Absence of the line means "pre-v0.4.13 build". - */ -export function buildWaitlistMailtoUrl(email: string, appVersion?: string): string { - const subject = encodeURIComponent("OpenCode Connect Waitlist") - const lines = ["Sign me up!"] - if (email) lines.push("", `Email: ${email}`) - if (appVersion) lines.push("", `App: OpenCode Mobile v${appVersion}`) - const body = encodeURIComponent(lines.join("\n")) - return `mailto:${WAITLIST_FALLBACK_EMAIL}?subject=${subject}&body=${body}` -} - -export type WaitlistResult = - /** Signup persisted server-side. */ - | { ok: true; email: string } - /** Signup not persisted. `retryable` decides the UX: true -> the same - * request can succeed later, so queue it and retry on reconnect; - * false -> the input (or server validation) is wrong, ask the user to fix - * their email instead of queueing garbage forever. */ - | { ok: false; email: string; retryable: boolean; error: string } - -/** - * Retry decision, isolated for testability: - * - transport failure (offline, DNS, timeout) -> retry when connectivity returns - * - 5xx -> server broken through no fault of the user's -> retry - * - 4xx -> the server rejected this email; repeating it wouldn't help - */ -export function isRetryableFailure(outcome: { kind: "network-error" } | { kind: "http"; status: number }): boolean { - if (outcome.kind === "network-error") return true - return outcome.status >= 500 -} - -type FetchLike = ( - url: string, - init: { method: string; headers: Record; body: string; signal: AbortSignal }, -) => Promise<{ ok: boolean; status: number; json(): Promise }> - -export interface WaitlistDeps { - fetchFn?: FetchLike - timeoutMs?: number -} - -function serverError(body: unknown): string | undefined { - if (typeof body === "object" && body !== null && "error" in body && typeof body.error === "string") { - return body.error - } - return undefined -} - -export async function submitWaitlistSignup(rawEmail: string, deps: WaitlistDeps = {}): Promise { - const email = normalizeWaitlistEmail(rawEmail) - if (email === null) { - return { ok: false, email: rawEmail.trim(), retryable: false, error: "Enter a valid email address." } - } - - const fetchFn = deps.fetchFn ?? (fetch as unknown as FetchLike) - const timeoutMs = deps.timeoutMs ?? WAITLIST_TIMEOUT_MS - - // Same timeout pattern as timedFetch() in diagnostics.ts. - const controller = new AbortController() - const timer = setTimeout(() => controller.abort(), timeoutMs) - try { - const res = await fetchFn(WAITLIST_ENDPOINT, { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify(buildWaitlistPayload(email)), - signal: controller.signal, - }) - if (res.ok) return { ok: true, email } - const message = serverError(await res.json().catch(() => null)) - return { - ok: false, - email, - retryable: isRetryableFailure({ kind: "http", status: res.status }), - error: message || `Signup failed (HTTP ${res.status}).`, - } - } catch (error: unknown) { - const err = error as { name?: string; message?: string } - const aborted = err?.name === "AbortError" - return { - ok: false, - email, - retryable: isRetryableFailure({ kind: "network-error" }), - error: aborted ? `timeout after ${timeoutMs}ms` : err?.message || String(error), - } - } finally { - clearTimeout(timer) - } -} - -// --------------------------------------------------------------------------- -// Durable retry queue (AGE-87) -// --------------------------------------------------------------------------- -// -// Before this, a signup that hit a network error / 8s timeout / 5xx was handed -// straight to a `mailto:` composer. That is lossy by design: it depends on the -// user actually pressing send in their mail client, and on us reconciling the -// support inbox into Brevo list 4 forever (AGE-61's hourly reconciler). 20 of -// 21 signups were lost that way before that reconciler existed. -// -// Instead we persist the pending signup on the device and retry it on the next -// foreground / connectivity. `mailto:` survives only as a last-resort, -// USER-INITIATED escape hatch once retries are clearly not working. -// -// Lives in this file (rather than its own module) so it stays a dependency-free -// leaf that `node --test` can run directly, the same constraint that keeps -// react-native imports out of here. Storage and the clock are injected; the -// production AsyncStorage adapter is waitlist-queue-storage.ts. - -export const WAITLIST_QUEUE_KEY = "opencode.waitlist.pending.v1" - -/** Cap the queue so a broken device can't grow storage without bound. */ -export const WAITLIST_QUEUE_MAX = 5 - -/** After this many failed attempts the UI offers the manual email escape hatch. */ -export const WAITLIST_QUEUE_ATTEMPTS_BEFORE_MANUAL = 3 - -/** Entries older than this are dropped: the address is stale, the user moved on. */ -export const WAITLIST_QUEUE_TTL_MS = 30 * 24 * 60 * 60 * 1000 // 30 days - -export interface QueuedSignup { - /** Already normalized (trimmed/lowercased) by normalizeWaitlistEmail. */ - email: string - /** Epoch ms of the first attempt. */ - queuedAt: number - /** Number of failed submit attempts so far (>= 1 — enqueue follows a failure). */ - attempts: number - /** Epoch ms of the last attempt. */ - lastAttemptAt: number - /** Last transport/server error, for diagnostics only. */ - lastError?: string -} - -/** - * Minimal storage port. AsyncStorage satisfies this structurally, so does a - * plain Map in tests. Deliberately not typed against AsyncStorage so this file - * stays importable by `node --test`. - */ -export interface QueueStorage { - getItem(key: string): Promise - setItem(key: string, value: string): Promise - removeItem(key: string): Promise -} - -function isQueuedSignup(value: unknown): value is QueuedSignup { - if (typeof value !== "object" || value === null) return false - const entry = value as Record - return ( - typeof entry.email === "string" && - normalizeWaitlistEmail(entry.email) === entry.email && - typeof entry.queuedAt === "number" && - Number.isFinite(entry.queuedAt) && - typeof entry.attempts === "number" && - Number.isFinite(entry.attempts) - ) -} - -/** Reads the queue, tolerating absent/corrupt/foreign JSON (never throws). */ -export async function loadQueue(storage: QueueStorage): Promise { - let raw: string | null = null - try { - raw = await storage.getItem(WAITLIST_QUEUE_KEY) - } catch { - return [] - } - if (!raw) return [] - try { - const parsed: unknown = JSON.parse(raw) - if (!Array.isArray(parsed)) return [] - return parsed.filter(isQueuedSignup).map((entry) => ({ - ...entry, - lastAttemptAt: typeof entry.lastAttemptAt === "number" ? entry.lastAttemptAt : entry.queuedAt, - })) - } catch { - return [] - } -} - -async function saveQueue(storage: QueueStorage, queue: QueuedSignup[]): Promise { - try { - if (queue.length === 0) await storage.removeItem(WAITLIST_QUEUE_KEY) - else await storage.setItem(WAITLIST_QUEUE_KEY, JSON.stringify(queue)) - } catch { - // Storage unavailable: the retry is lost, but the caller already told the - // user the truth ("saved, we'll finish signing you up") only when this - // resolves. enqueueSignup() surfaces the failure via its return value. - throw new Error("waitlist queue storage unavailable") - } -} - -/** Drops entries past the TTL. Exported for the test that pins the policy. */ -export function pruneQueue(queue: QueuedSignup[], now: number): QueuedSignup[] { - return queue.filter((entry) => now - entry.queuedAt < WAITLIST_QUEUE_TTL_MS) -} - -/** - * Persists a failed signup for later retry. Dedupes by email (an impatient - * user tapping twice must not produce two entries) and keeps the newest - * WAITLIST_QUEUE_MAX entries. - * - * Returns the stored entry, or null when the email is invalid or storage - * refused the write — in that case the caller must NOT tell the user we saved it. - */ -export async function enqueueSignup( - storage: QueueStorage, - rawEmail: string, - options: { now?: number; error?: string } = {}, -): Promise { - const email = normalizeWaitlistEmail(rawEmail) - if (email === null) return null - const now = options.now ?? Date.now() - - const existing = pruneQueue(await loadQueue(storage), now) - const previous = existing.find((entry) => entry.email === email) - const entry: QueuedSignup = { - email, - queuedAt: previous?.queuedAt ?? now, - attempts: (previous?.attempts ?? 0) + 1, - lastAttemptAt: now, - ...(options.error ? { lastError: options.error } : {}), - } - const next = [...existing.filter((e) => e.email !== email), entry].slice(-WAITLIST_QUEUE_MAX) - try { - await saveQueue(storage, next) - } catch { - return null - } - return entry -} - -export async function removeFromQueue(storage: QueueStorage, email: string): Promise { - const queue = await loadQueue(storage) - const next = queue.filter((entry) => entry.email !== email) - if (next.length === queue.length) return - try { - await saveQueue(storage, next) - } catch { - // best effort - } -} - -export interface FlushOutcome { - /** Entries that reached the server (Brevo list 4). */ - synced: string[] - /** Entries the server permanently rejected (4xx) — dropped, retrying can't help. */ - rejected: string[] - /** Entries still pending after this flush. */ - pending: QueuedSignup[] -} - -export type SubmitFn = (email: string) => Promise - -/** - * Retries every pending signup once. Called on app foreground and when the - * waitlist screen mounts. - * - * - ok -> drop (it's in Brevo now) - * - 4xx -> drop (the server will never accept this address) - * - network/5xx -> keep, bump attempts (retry next foreground) - * - * Never throws: a flush is a background best-effort action. - */ -export async function flushQueue( - storage: QueueStorage, - options: { submit?: SubmitFn; now?: number } = {}, -): Promise { - const now = options.now ?? Date.now() - const submit = options.submit ?? ((email: string) => submitWaitlistSignup(email)) - - const queue = pruneQueue(await loadQueue(storage), now) - const synced: string[] = [] - const rejected: string[] = [] - const pending: QueuedSignup[] = [] - - for (const entry of queue) { - let result: WaitlistResult - try { - result = await submit(entry.email) - } catch (error: unknown) { - pending.push({ ...entry, attempts: entry.attempts + 1, lastAttemptAt: now, lastError: String(error) }) - continue - } - if (result.ok) { - synced.push(entry.email) - } else if (!result.retryable) { - rejected.push(entry.email) - } else { - pending.push({ ...entry, attempts: entry.attempts + 1, lastAttemptAt: now, lastError: result.error }) - } - } - - try { - await saveQueue(storage, pending) - } catch { - // Storage went away mid-flush; the in-memory outcome is still accurate. - } - return { synced, rejected, pending } -} - -/** - * True once an entry has failed enough times that we should stop implying - * "we'll handle it" and offer the manual email escape hatch instead. - */ -export function needsManualEscapeHatch(entry: QueuedSignup | null | undefined): boolean { - return !!entry && entry.attempts >= WAITLIST_QUEUE_ATTEMPTS_BEFORE_MANUAL -} From 0c630010c3c345809a38fb52a54d8963bb87b4fb Mon Sep 17 00:00:00 2001 From: duoyi88 Date: Sat, 29 Aug 2026 03:58:10 +0800 Subject: [PATCH 02/20] fix(android): keep composer above keyboard --- app/session/[id].tsx | 8 +++++++- src/lib/keyboard-offset.test.ts | 34 +++++++++++++++++++++++++++++++++ src/lib/keyboard-offset.ts | 11 +++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/lib/keyboard-offset.test.ts create mode 100644 src/lib/keyboard-offset.ts diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 97f885f0..dd3f6a98 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -39,6 +39,7 @@ import { useConnections } from "../../src/stores/connections" import { useAuth } from "../../src/stores/auth" import { useCatalog } from "../../src/stores/catalog" import { useSpeech } from "../../src/lib/speech" +import { keyboardVerticalOffset } from "../../src/lib/keyboard-offset" // --- Builtin slash commands --- const BUILTIN_COMMANDS: SlashCommand[] = [ @@ -605,8 +606,13 @@ export default function SessionScreen() { // bottom toolbar + input were left completely hidden behind the // keyboard (#147). "padding" restores avoidance without depending // on native resize. + // + // The view frame is local to the route content below the native + // header, while keyboard screenY is global. Offset by the complete + // header (safe-area inset + the standard 56 dp Android header) to + // reconcile those coordinate spaces. behavior="padding" - keyboardVerticalOffset={Platform.OS === "ios" ? 90 : 0} + keyboardVerticalOffset={keyboardVerticalOffset(Platform.OS, insets.top)} > {/* Session info pulldown */} { + assert.equal(keyboardVerticalOffset("ios", 0), IOS_KEYBOARD_VERTICAL_OFFSET) + assert.equal(keyboardVerticalOffset("ios", 61.29), IOS_KEYBOARD_VERTICAL_OFFSET) +}) + +test("Android offsets by the complete native header height", () => { + assert.equal(keyboardVerticalOffset("android", 61.293), 117.293) +}) + +test("Android includes header content when the top inset is zero or invalid", () => { + assert.equal(keyboardVerticalOffset("android", 0), ANDROID_HEADER_CONTENT_HEIGHT) + assert.equal(keyboardVerticalOffset("android", -20), ANDROID_HEADER_CONTENT_HEIGHT) +}) + +// Pixel 11 Pro / Android 17 regression guard. With only the 61.29 dp safe-area +// inset, the input overlapped the custom Trime IME by 106 px. Adding the +// standard 56 dp header content makes the computed padding equal IME height. +test("Android offset reconciles route-local and screen coordinates", () => { + const routeBottom = 741.65 + const keyboardScreenY = 507.67 + const keyboardHeight = 351.28 + const offset = keyboardVerticalOffset("android", 61.29) + const padding = routeBottom - (keyboardScreenY - offset) + + assert.ok(Math.abs(padding - keyboardHeight) < 0.01, `expected ~${keyboardHeight}, got ${padding}`) +}) diff --git a/src/lib/keyboard-offset.ts b/src/lib/keyboard-offset.ts new file mode 100644 index 00000000..b02fbbab --- /dev/null +++ b/src/lib/keyboard-offset.ts @@ -0,0 +1,11 @@ +// KeyboardAvoidingView computes its padding from a route-local view frame and +// a global keyboard screenY. On Android this route begins below the native +// stack header, so its vertical offset must include the complete header height. + +export const IOS_KEYBOARD_VERTICAL_OFFSET = 90 +export const ANDROID_HEADER_CONTENT_HEIGHT = 56 + +export function keyboardVerticalOffset(platform: string, insetTop: number): number { + if (platform === "ios") return IOS_KEYBOARD_VERTICAL_OFFSET + return Math.max(0, insetTop) + ANDROID_HEADER_CONTENT_HEIGHT +} From 9b9a03fbbad2b5ef681fb34b5f81ebb540a9aa5e Mon Sep 17 00:00:00 2001 From: duoyi88 Date: Sat, 29 Aug 2026 04:36:07 +0800 Subject: [PATCH 03/20] fix(android): reset composer after keyboard hides --- app/session/[id].tsx | 40 ++++++++++++++++++++++----------- src/lib/keyboard-offset.test.ts | 38 +++++++++++++++---------------- src/lib/keyboard-offset.ts | 16 ++++++++----- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/app/session/[id].tsx b/app/session/[id].tsx index dd3f6a98..d43989c6 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -8,6 +8,7 @@ import { StyleSheet, useColorScheme, KeyboardAvoidingView, + Keyboard, Platform, ActivityIndicator, Alert, @@ -39,7 +40,7 @@ import { useConnections } from "../../src/stores/connections" import { useAuth } from "../../src/stores/auth" import { useCatalog } from "../../src/stores/catalog" import { useSpeech } from "../../src/lib/speech" -import { keyboardVerticalOffset } from "../../src/lib/keyboard-offset" +import { keyboardPadding, keyboardVerticalOffset } from "../../src/lib/keyboard-offset" // --- Builtin slash commands --- const BUILTIN_COMMANDS: SlashCommand[] = [ @@ -86,6 +87,20 @@ export default function SessionScreen() { const [input, setInput] = useState("") const [attachments, setAttachments] = useState([]) const [showInfo, setShowInfo] = useState(false) + const [keyboardHeight, setKeyboardHeight] = useState(() => Keyboard.metrics()?.height ?? 0) + + useEffect(() => { + if (Platform.OS !== "android") return + const show = Keyboard.addListener("keyboardDidShow", (event) => setKeyboardHeight(event.endCoordinates.height)) + const hide = Keyboard.addListener("keyboardDidHide", () => setKeyboardHeight(0)) + // Close the render-to-effect race: listeners are attached first, then the + // current native metrics become the source of truth. + setKeyboardHeight(Keyboard.metrics()?.height ?? 0) + return () => { + show.remove() + hide.remove() + } + }, []) const { currentSession, @@ -593,25 +608,24 @@ export default function SessionScreen() { /> diff --git a/src/components/chat/QuestionPrompt.tsx b/src/components/chat/QuestionPrompt.tsx index d6aaeea4..dd499caf 100644 --- a/src/components/chat/QuestionPrompt.tsx +++ b/src/components/chat/QuestionPrompt.tsx @@ -1,7 +1,8 @@ import { useRef, useState } from "react" -import { View, Text, TextInput, TouchableOpacity, StyleSheet } from "react-native" +import { View, Text, TextInput, TouchableOpacity, ScrollView, StyleSheet } from "react-native" import { Ionicons } from "@expo/vector-icons" import { useTranslation } from "react-i18next" +import { QUESTION_BODY_SCROLL_PROPS } from "../../lib/session-layout" interface QuestionOption { label: string @@ -86,9 +87,8 @@ export function QuestionPrompt({ request, isDark, onReply, onReject }: Props) { {q.header || t("chat.questionPrompt.headerFallback")} - {q.question} - - + + {q.question} {q.options.map((opt) => { const selected = (answers[current] || []).includes(opt.label) return ( @@ -129,7 +129,7 @@ export function QuestionPrompt({ request, isDark, onReply, onReject }: Props) { {t("chat.questionPrompt.customAnswerLabel")} ))} - + @@ -158,6 +158,7 @@ export function QuestionPrompt({ request, isDark, onReply, onReject }: Props) { const s = StyleSheet.create({ card: { + flexShrink: 1, margin: 12, padding: 16, backgroundColor: "#f5f3ff", @@ -169,10 +170,11 @@ const s = StyleSheet.create({ header: { flexDirection: "row", alignItems: "center", gap: 8, marginBottom: 8 }, title: { fontSize: 15, fontWeight: "600", color: "#6d28d9" }, textWhite: { color: "#ffffff" }, - question: { fontSize: 14, lineHeight: 20, color: "#0a0a0a", marginBottom: 12 }, + body: { flexShrink: 1 }, + question: { fontSize: 14, lineHeight: 20, color: "#0a0a0a" }, metaDark: { color: "#666666" }, - options: { gap: 8 }, + options: { gap: 8, paddingBottom: 1 }, option: { padding: 12, borderRadius: 8, diff --git a/src/lib/session-layout.test.ts b/src/lib/session-layout.test.ts new file mode 100644 index 00000000..80b873bf --- /dev/null +++ b/src/lib/session-layout.test.ts @@ -0,0 +1,35 @@ +import { test } from "node:test" +import assert from "node:assert/strict" +import { + COMPOSER_MAX_HEIGHT, + COMPOSER_MIN_HEIGHT, + QUESTION_BODY_SCROLL_PROPS, + composerMaxHeight, +} from "./session-layout.ts" + +test("composer keeps its established cap while the Android IME is hidden", () => { + assert.equal(composerMaxHeight("android", 768, null, 39), COMPOSER_MAX_HEIGHT) + assert.equal(composerMaxHeight("ios", 768, 377, 39), COMPOSER_MAX_HEIGHT) +}) + +test("composer keeps multiple lines visible on compact Android IME geometry", () => { + assert.equal(composerMaxHeight("android", 768, 377, 39), COMPOSER_MIN_HEIGHT) + assert.equal(composerMaxHeight("android", 480, 250, 24), COMPOSER_MIN_HEIGHT) +}) + +test("composer preserves three draft lines at Android accessibility text scaling", () => { + assert.equal(composerMaxHeight("android", 768, 377, 39, 1.5), 110) +}) + +test("composer responds to keyboard resize without exceeding the established cap", () => { + assert.equal(composerMaxHeight("android", 900, 700, 24), COMPOSER_MAX_HEIGHT) + assert.equal(composerMaxHeight("android", 700, 380, 24), 106) +}) + +test("question body uses the only vertical overflow owner and retains navigation taps", () => { + assert.deepEqual(QUESTION_BODY_SCROLL_PROPS, { + keyboardShouldPersistTaps: "handled", + nestedScrollEnabled: true, + showsVerticalScrollIndicator: true, + }) +}) diff --git a/src/lib/session-layout.ts b/src/lib/session-layout.ts new file mode 100644 index 00000000..e996f1a3 --- /dev/null +++ b/src/lib/session-layout.ts @@ -0,0 +1,27 @@ +// Android keyboard offset/padding lives in ./keyboard-offset (#201). +export const COMPOSER_MAX_HEIGHT = 120 +export const COMPOSER_MIN_HEIGHT = 88 +const COMPOSER_LINE_HEIGHT = 20 +const COMPOSER_VERTICAL_PADDING = 20 + +export function composerMaxHeight( + platform: string, + windowHeight: number, + keyboardY: number | null, + insetTop: number, + fontScale = 1, +): number { + if (platform !== "android" || keyboardY === null) return COMPOSER_MAX_HEIGHT + + // Keep a three-line editor usable on compact IME-resized windows while + // reserving room for the question/transcript surface and composer controls. + const visibleHeight = Math.max(0, Math.min(windowHeight, keyboardY) - Math.max(0, insetTop)) + const scaledMinimum = Math.ceil(COMPOSER_LINE_HEIGHT * Math.max(1, fontScale) * 3 + COMPOSER_VERTICAL_PADDING) + return Math.min(COMPOSER_MAX_HEIGHT, Math.max(COMPOSER_MIN_HEIGHT, scaledMinimum, visibleHeight - 250)) +} + +export const QUESTION_BODY_SCROLL_PROPS = { + keyboardShouldPersistTaps: "handled", + nestedScrollEnabled: true, + showsVerticalScrollIndicator: true, +} as const From 71e63fe1402bda0afa302d3009d23d40088fb81b Mon Sep 17 00:00:00 2001 From: Joshua Castaneda Date: Sun, 20 Sep 2026 23:45:22 -0700 Subject: [PATCH 05/20] test(android): cover scaled composer minimum --- src/lib/session-layout.test.ts | 5 +++-- src/lib/session-layout.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lib/session-layout.test.ts b/src/lib/session-layout.test.ts index 80b873bf..4db66b78 100644 --- a/src/lib/session-layout.test.ts +++ b/src/lib/session-layout.test.ts @@ -17,8 +17,9 @@ test("composer keeps multiple lines visible on compact Android IME geometry", () assert.equal(composerMaxHeight("android", 480, 250, 24), COMPOSER_MIN_HEIGHT) }) -test("composer preserves three draft lines at Android accessibility text scaling", () => { - assert.equal(composerMaxHeight("android", 768, 377, 39, 1.5), 110) +test("composer preserves multiple draft lines at Android accessibility text scaling", () => { + assert.equal(composerMaxHeight("android", 768, 377, 39, 1.5), COMPOSER_MIN_HEIGHT) + assert.equal(composerMaxHeight("android", 768, 377, 39, 2), 100) }) test("composer responds to keyboard resize without exceeding the established cap", () => { diff --git a/src/lib/session-layout.ts b/src/lib/session-layout.ts index e996f1a3..833f0025 100644 --- a/src/lib/session-layout.ts +++ b/src/lib/session-layout.ts @@ -13,10 +13,10 @@ export function composerMaxHeight( ): number { if (platform !== "android" || keyboardY === null) return COMPOSER_MAX_HEIGHT - // Keep a three-line editor usable on compact IME-resized windows while + // Keep multiple scaled draft lines usable on compact IME-resized windows while // reserving room for the question/transcript surface and composer controls. const visibleHeight = Math.max(0, Math.min(windowHeight, keyboardY) - Math.max(0, insetTop)) - const scaledMinimum = Math.ceil(COMPOSER_LINE_HEIGHT * Math.max(1, fontScale) * 3 + COMPOSER_VERTICAL_PADDING) + const scaledMinimum = Math.ceil(COMPOSER_LINE_HEIGHT * Math.max(1, fontScale) * 2 + COMPOSER_VERTICAL_PADDING) return Math.min(COMPOSER_MAX_HEIGHT, Math.max(COMPOSER_MIN_HEIGHT, scaledMinimum, visibleHeight - 250)) } From b52629685feb7603e618870c29ed5687cb32e90c Mon Sep 17 00:00:00 2001 From: Joshua Castaneda Date: Sun, 20 Sep 2026 23:45:22 -0700 Subject: [PATCH 06/20] fix(android): keep connection form fields above keyboard Same approach as the chat composer (#201): pad by IME height from keyboardDidShow/Hide. Covers add (quick + advanced) and edit screens. Alternative to upstream #193 (adjustPan) / #216 (KAV padding, stale-padding risk). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/connection/[id].tsx | 9 ++++++++- app/connection/add.tsx | 13 +++++++++++-- src/lib/use-keyboard-height.ts | 23 +++++++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/lib/use-keyboard-height.ts diff --git a/app/connection/[id].tsx b/app/connection/[id].tsx index 49701d21..8b3b8ef0 100644 --- a/app/connection/[id].tsx +++ b/app/connection/[id].tsx @@ -20,6 +20,7 @@ import { probeConnection, shareReport } from "../../src/lib/diagnostics" import { captureDiagnostic } from "../../src/lib/sentry" import { parseUrl } from "../../src/lib/diagnostics-classify" import { buildAuth } from "../../src/lib/auth" +import { useKeyboardHeight } from "../../src/lib/use-keyboard-height" // labelKey (not literal text): this is a module-level constant evaluated // before i18next is guaranteed ready, so the label is resolved with t() at @@ -41,6 +42,7 @@ export default function EditConnectionScreen() { const { t } = useTranslation() const { connections, updateConnection, removeConnection, testConnection } = useConnections() + const keyboardHeight = useKeyboardHeight() const connection = connections.find((c) => c.id === id) @@ -181,8 +183,9 @@ export default function EditConnectionScreen() { } return ( + @@ -316,6 +319,7 @@ export default function EditConnectionScreen() { + ) } @@ -327,6 +331,9 @@ const styles = StyleSheet.create({ containerDark: { backgroundColor: "#0a0a0a", }, + scroll: { + flex: 1, + }, center: { justifyContent: "center", alignItems: "center", diff --git a/app/connection/add.tsx b/app/connection/add.tsx index e2b266a0..22d58873 100644 --- a/app/connection/add.tsx +++ b/app/connection/add.tsx @@ -19,6 +19,7 @@ import { probeConnection, shareReport } from "../../src/lib/diagnostics" import { captureDiagnostic } from "../../src/lib/sentry" import { parseUrl } from "../../src/lib/diagnostics-classify" import { buildAuth } from "../../src/lib/auth" +import { useKeyboardHeight } from "../../src/lib/use-keyboard-height" import { AnalyticsEvent, track } from "../../src/lib/analytics" export default function AddConnectionScreen() { const colorScheme = useColorScheme() @@ -26,6 +27,7 @@ export default function AddConnectionScreen() { const { t } = useTranslation() const { addConnection, testConnection } = useConnections() + const keyboardHeight = useKeyboardHeight() const [mode, setMode] = useState<"quick" | "advanced">("quick") const [type, setType] = useState("local") @@ -208,8 +210,9 @@ export default function AddConnectionScreen() { // Quick connect mode - simplified if (mode === "quick") { return ( + @@ -332,13 +335,15 @@ export default function AddConnectionScreen() { + ) } // Advanced mode - full options return ( + @@ -474,6 +479,7 @@ export default function AddConnectionScreen() { )} + ) } @@ -485,6 +491,9 @@ const styles = StyleSheet.create({ containerDark: { backgroundColor: "#0a0a0a", }, + scroll: { + flex: 1, + }, content: { padding: 16, paddingBottom: 32, diff --git a/src/lib/use-keyboard-height.ts b/src/lib/use-keyboard-height.ts new file mode 100644 index 00000000..d6c218a5 --- /dev/null +++ b/src/lib/use-keyboard-height.ts @@ -0,0 +1,23 @@ +import { useEffect, useState } from "react" +import { Keyboard, Platform } from "react-native" + +// Android IME height, 0 elsewhere. Under edge-to-edge Android no longer resizes +// the window for the keyboard, so screens pad themselves by this amount. Same +// listener pattern as the chat composer (#201): keyboardDidHide resets to 0, so +// no stale padding survives the keyboard closing. +export function useKeyboardHeight(): number { + const [height, setHeight] = useState(() => (Platform.OS === "android" ? (Keyboard.metrics()?.height ?? 0) : 0)) + + useEffect(() => { + if (Platform.OS !== "android") return + const show = Keyboard.addListener("keyboardDidShow", (event) => setHeight(event.endCoordinates.height)) + const hide = Keyboard.addListener("keyboardDidHide", () => setHeight(0)) + setHeight(Keyboard.metrics()?.height ?? 0) + return () => { + show.remove() + hide.remove() + } + }, []) + + return height +} From e1f2c298005d3373728e1b887efd1270314777c6 Mon Sep 17 00:00:00 2001 From: chliny Date: Tue, 18 Aug 2026 13:38:56 +0800 Subject: [PATCH 07/20] fix: preserve session-specific chat drafts --- app/session/[id].tsx | 25 ++++++++++++++++++++----- src/stores/sessions.ts | 17 +++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 7d3401fd..2e8a3243 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -87,7 +87,9 @@ export default function SessionScreen() { const flatListRef = useRef(null) const modelSheetRef = useRef(null) const variantSheetRef = useRef(null) - const [input, setInput] = useState("") + const [input, setInputState] = useState(() => (id ? useSessions.getState().drafts[id] || "" : "")) + const inputRef = useRef(input) + inputRef.current = input const [attachments, setAttachments] = useState([]) const [showInfo, setShowInfo] = useState(false) const [keyboard, setKeyboard] = useState(() => Keyboard.metrics() ?? null) @@ -116,6 +118,8 @@ export default function SessionScreen() { loadingMore, hasMore, selectSession, + setDraft, + clearDraft, sendMessage, abortSession, loadOlderMessages, @@ -123,6 +127,16 @@ export default function SessionScreen() { unrevertSession, } = useSessions() + const setInput = useCallback( + (value: string | ((current: string) => string)) => { + const next = typeof value === "function" ? value(inputRef.current) : value + inputRef.current = next + setInputState(next) + if (id) setDraft(id, next) + }, + [id, setDraft], + ) + // Derive sending state for this specific session const isSending = useSessions((s) => !!(currentSession && s.sending[currentSession.id])) @@ -216,9 +230,6 @@ export default function SessionScreen() { // handleMessageLongPress's deps — kept as a plain ref assignment (not // state) so the callback below stays referentially stable across // keystrokes for MessageBubble's custom memo comparator. - const inputRef = useRef(input) - inputRef.current = input - const applyRevertResult = useCallback((result: Awaited>) => { if (!result.ok) { if (result.reason === "unsupported") { @@ -287,6 +298,9 @@ export default function SessionScreen() { useFocusEffect( useCallback(() => { if (!id) return + const draft = useSessions.getState().drafts[id] || "" + inputRef.current = draft + setInputState(draft) selectSession(id, directory).then(() => { // Re-fetch pending permissions/questions from the server to recover from // missed SSE events or failed optimistic removals @@ -294,7 +308,7 @@ export default function SessionScreen() { const c = directory ? (connState.clientForDirectory(directory) ?? connState.client) : connState.client if (c) refreshPending(c, id) }) - }, [id, directory]), + }, [id, directory, selectSession]), ) // Sync model chip from latest assistant message @@ -439,6 +453,7 @@ export default function SessionScreen() { const text = input.trim() const files = [...attachments] setInput("") + if (id) clearDraft(id) setAttachments([]) // Server slash commands (no attachments for commands) diff --git a/src/stores/sessions.ts b/src/stores/sessions.ts index ccd21f33..26372bf2 100644 --- a/src/stores/sessions.ts +++ b/src/stores/sessions.ts @@ -33,6 +33,8 @@ interface SessionsState { isLoading: boolean // Per-session optimistic sending flag — bridging gap between user tap and SSE busy sending: Record + // Unsent composer text, isolated by session ID. + drafts: Record loadingMore: boolean hasMore: boolean error: string | null @@ -40,6 +42,8 @@ interface SessionsState { // Actions loadSessions: () => Promise selectSession: (sessionID: string, directory?: string) => Promise + setDraft: (sessionID: string, text: string) => void + clearDraft: (sessionID: string) => void loadOlderMessages: () => Promise createSession: (title?: string) => Promise deleteSession: (sessionID: string) => Promise @@ -93,10 +97,22 @@ export const useSessions = create((set, get) => ({ parts: {}, isLoading: false, sending: {}, + drafts: {}, loadingMore: false, hasMore: false, error: null, + setDraft: (sessionID, text) => + set((state) => ({ drafts: { ...state.drafts, [sessionID]: text } })), + + clearDraft: (sessionID) => + set((state) => { + if (!(sessionID in state.drafts)) return state + const drafts = { ...state.drafts } + delete drafts[sessionID] + return { drafts } + }), + loadSessions: async () => { const connState = useConnections.getState() // Use a directory-less client so the server returns sessions from ALL projects, @@ -245,6 +261,7 @@ export const useSessions = create((set, get) => ({ await client.session.delete(sessionID) set((state) => ({ sessions: state.sessions.filter((s) => s.id !== sessionID), + drafts: Object.fromEntries(Object.entries(state.drafts).filter(([id]) => id !== sessionID)), currentSession: state.currentSession?.id === sessionID ? null : state.currentSession, messages: state.currentSession?.id === sessionID ? [] : state.messages, parts: state.currentSession?.id === sessionID ? {} : state.parts, From 2d2b14c6e5300b885bc0695ea0f036eb35d540ba Mon Sep 17 00:00:00 2001 From: Dre4my_Legion Date: Sun, 27 Sep 2026 21:18:59 +0400 Subject: [PATCH 08/20] fix(diagnostics): distinguish 401 with no credentials sent (auth-required) from rejected credentials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The health probe only sends Authorization when a password is filled in. A 401/403 in that state says nothing about the saved password — the user may simply not have typed it yet — but classify() reported it as "the server rejected your credentials", sending people re-typing a perfectly good password (seen live against a self-hosted server that protects /global/health). - ProbeAttempt gains authProvided, set by probeConnection from the auth it sent - classify(): 401/403 + !authProvided -> new auth-required classification with an "enter the password" message instead of "rejected your credentials" - sentry-noise: auth-required joins the auth-failed drop family (user config) - tests for all four combinations --- src/lib/diagnostics-classify.test.ts | 43 ++++++++++++++++++++++++++-- src/lib/diagnostics-classify.ts | 17 +++++++++++ src/lib/diagnostics.ts | 1 + 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/lib/diagnostics-classify.test.ts b/src/lib/diagnostics-classify.test.ts index 16dee493..273dd8a7 100644 --- a/src/lib/diagnostics-classify.test.ts +++ b/src/lib/diagnostics-classify.test.ts @@ -135,7 +135,7 @@ test("root reachable but internet probe down still classifies as health-failed, test("health probe 401 -> auth-failed, and the summary tells the user to fix credentials", () => { const r = classify( okUrl, - probe({ ok: false, error: "HTTP 401", status: 401 }), // health + probe({ ok: false, error: "HTTP 401", status: 401, authProvided: true }), // health probe({ ok: true }), // internet probe({ ok: true, status: 401 }), // root reachable ) @@ -146,8 +146,45 @@ test("health probe 401 -> auth-failed, and the summary tells the user to fix cre assert.doesNotMatch(r.summary, /actually works/i) }) +// The probe only sends Authorization when a password is filled in. A 401 with +// NO credentials sent says nothing about the saved password — the user may +// just not have typed it yet. That must not be reported as "the server +// rejected your credentials", or they re-type a good password in a loop. +test("health probe 401 with no credentials sent -> auth-required, not auth-failed", () => { + const r = classify( + okUrl, + probe({ ok: false, error: "HTTP 401", status: 401 }), // health, authProvided unset + probe({ ok: true }), + probe({ ok: true, status: 401 }), + ) + assert.equal(r.classification, "auth-required") + assert.match(r.summary, /requires authentication/i) + assert.match(r.summary, /no credentials/i) + assert.doesNotMatch(r.summary, /rejected your credentials/i) +}) + +test("health probe 403 with no credentials sent -> auth-required too", () => { + const r = classify( + okUrl, + probe({ ok: false, status: 403 }), + probe({ ok: true }), + probe({ ok: true, status: 403 }), + ) + assert.equal(r.classification, "auth-required") +}) + +test("explicit authProvided: false is treated the same as unset", () => { + const r = classify( + okUrl, + probe({ ok: false, status: 401, authProvided: false }), + probe({ ok: true }), + probe({ ok: true, status: 401 }), + ) + assert.equal(r.classification, "auth-required") +}) + test("health probe 403 -> auth-failed too", () => { - const r = classify(okUrl, probe({ ok: false, status: 403 }), probe({ ok: true }), probe({ ok: true, status: 403 })) + const r = classify(okUrl, probe({ ok: false, status: 403, authProvided: true }), probe({ ok: true }), probe({ ok: true, status: 403 })) assert.equal(r.classification, "auth-failed") assert.match(r.summary, /403/) }) @@ -155,7 +192,7 @@ test("health probe 403 -> auth-failed too", () => { test("auth-failed wins even when the server root probe is unreachable", () => { // A 401 from /global/health already proves the server answered us; the // root probe's outcome must not downgrade this to server-unreachable. - const r = classify(okUrl, probe({ ok: false, status: 401 }), probe({ ok: true }), probe({ ok: false })) + const r = classify(okUrl, probe({ ok: false, status: 401, authProvided: true }), probe({ ok: true }), probe({ ok: false })) assert.equal(r.classification, "auth-failed") }) diff --git a/src/lib/diagnostics-classify.ts b/src/lib/diagnostics-classify.ts index ff1be6d3..2cc7e936 100644 --- a/src/lib/diagnostics-classify.ts +++ b/src/lib/diagnostics-classify.ts @@ -7,6 +7,7 @@ export type Classification = | "malformed-url" | "no-internet" | "server-unreachable" + | "auth-required" | "auth-failed" | "health-failed" | "tls-error" @@ -21,6 +22,7 @@ export interface ProbeAttempt { durationMs: number error?: string errorCause?: string + authProvided?: boolean } export interface ParsedUrl { @@ -67,6 +69,21 @@ export function classify( // as ok:true and told the user "connection actually works now" while the // password was wrong. `requireOk` (v0.4.8) stopped the lie; this makes the // remaining message actionable so the user stops retrying blind. + // 401/403 with no credentials sent is a different problem from rejected + // credentials: the probe never authenticated, so the server's answer says + // nothing about the saved password. This happens when the user runs the + // diagnostic before typing the password (Quick Connect, empty field) — + // telling them "the server rejected your credentials" sends them + // re-typing a password that may be perfectly fine. + if ((health.status === 401 || health.status === 403) && !health.authProvided) { + return { + classification: "auth-required", + summary: + `The server is running and requires authentication (HTTP ${health.status}), ` + + `but this probe sent no credentials. Enter the server password — and the username too, ` + + `if the server sets OPENCODE_SERVER_USERNAME (it defaults to "opencode") — then retry.`, + } + } if (health.status === 401 || health.status === 403) { return { classification: "auth-failed", diff --git a/src/lib/diagnostics.ts b/src/lib/diagnostics.ts index ff789c23..35036e05 100644 --- a/src/lib/diagnostics.ts +++ b/src/lib/diagnostics.ts @@ -87,6 +87,7 @@ export async function probeConnection(url: string, auth?: { username: string; pa timedFetch("server-root", `${base}/`, { headers }, { requireOk: false }), timedFetch("internet", INTERNET_CHECK_URL), ]) + health.authProvided = Boolean(auth?.password) } else { const skipped: ProbeAttempt = { name: "health", target: url, ok: false, durationMs: 0, error: "skipped: malformed url" } health = skipped From b7df0710327be0362c773c5e80927cf0dff4c3ec Mon Sep 17 00:00:00 2001 From: Joshua Castaneda Date: Wed, 30 Sep 2026 20:04:46 -0700 Subject: [PATCH 09/20] feat(chat): navigate previous and next message starts (#214) --- app/session/[id].tsx | 96 +++++++++- docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md | 95 ++++++++++ .../issue-214-keyboard-navigation.png | Bin 0 -> 246055 bytes .../issue-214-message-navigation.png | Bin 0 -> 220793 bytes src/lib/message-navigation.test.ts | 173 ++++++++++++++++++ src/lib/message-navigation.ts | 102 +++++++++++ 6 files changed, 457 insertions(+), 9 deletions(-) create mode 100644 docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md create mode 100644 docs/qa/screenshots/issue-214-keyboard-navigation.png create mode 100644 docs/qa/screenshots/issue-214-message-navigation.png create mode 100644 src/lib/message-navigation.test.ts create mode 100644 src/lib/message-navigation.ts diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 2e8a3243..8ccbcd95 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -13,6 +13,9 @@ import { ActivityIndicator, Alert, useWindowDimensions, + type CellRendererProps, + type NativeSyntheticEvent, + type NativeScrollEvent, } from "react-native" import { useLocalSearchParams, Stack, useRouter, useFocusEffect } from "expo-router" import { Ionicons } from "@expo/vector-icons" @@ -43,6 +46,7 @@ import { useCatalog } from "../../src/stores/catalog" import { useSpeech } from "../../src/lib/speech" import { keyboardPadding, keyboardVerticalOffset } from "../../src/lib/keyboard-offset" import { composerMaxHeight } from "../../src/lib/session-layout" +import { MessageNavigation } from "../../src/lib/message-navigation" // --- Builtin slash commands --- const BUILTIN_COMMANDS: SlashCommand[] = [ @@ -85,6 +89,9 @@ export default function SessionScreen() { const { t } = useTranslation() const flatListRef = useRef(null) + const navigation = useRef(new MessageNavigation()).current + const retry = useRef | undefined>(undefined) + const attempts = useRef(0) const modelSheetRef = useRef(null) const variantSheetRef = useRef(null) const [input, setInputState] = useState(() => (id ? useSessions.getState().drafts[id] || "" : "")) @@ -217,6 +224,7 @@ export default function SessionScreen() { const messageData = useMemo( () => (messages || []) + .filter((msg) => msg.role === "user" || msg.role === "assistant") .filter((msg) => !revertMessageID || msg.id.startsWith("temp-") || msg.id < revertMessageID) .map((msg) => ({ message: msg, @@ -226,6 +234,42 @@ export default function SessionScreen() { [messages, parts, revertMessageID], ) + navigation.sync(messageData.map((item) => item.message.id)) + + const seekMessage = useCallback(() => { + if (retry.current) clearTimeout(retry.current) + if (flatListRef.current && navigation.seek(flatListRef.current, attempts.current++)) { + retry.current = setTimeout(seekMessage, 100) + } + }, [navigation]) + + const MessageCell = useCallback((props: CellRendererProps<(typeof messageData)[number]>) => { + const key = props.item.message.id + const { onLayout, ...cell } = props + useEffect(() => () => { navigation.frames.delete(key) }, [key, navigation]) + return ( + { + navigation.frames.set(key, event.nativeEvent.layout) + onLayout?.(event) + if (navigation.target === key) seekMessage() + }}> + {props.children} + + ) + }, [navigation, seekMessage]) + + useEffect(() => { + navigation.manual() + navigation.frames.clear() + return () => { if (retry.current) clearTimeout(retry.current) } + }, [id, navigation]) + + const moveMessage = (direction: 1 | -1) => { + if (navigation.move(direction) === undefined) return + attempts.current = 0 + seekMessage() + } + // Tracks the latest composer text without pulling `input` into // handleMessageLongPress's deps — kept as a plain ref assignment (not // state) so the callback below stays referentially stable across @@ -285,8 +329,10 @@ export default function SessionScreen() { }, [applyRevertResult, t]) const scrollToBottom = useCallback((animated = true) => { + navigation.manual() + if (retry.current) clearTimeout(retry.current) flatListRef.current?.scrollToOffset({ offset: 0, animated }) - }, []) + }, [navigation]) // Re-select on every focus, not just mount. currentSession/messages/ // permissions are a single global store, and the native stack keeps screens @@ -488,10 +534,11 @@ export default function SessionScreen() { } // In inverted mode, offset 0 = bottom. Show scroll button when scrolled away from bottom. - const handleScroll = useCallback((event: any) => { - const { contentOffset } = event.nativeEvent + const handleScroll = useCallback((event: NativeSyntheticEvent) => { + const { contentOffset, layoutMeasurement } = event.nativeEvent + navigation.observe(contentOffset.y, layoutMeasurement.height) setShowScrollButton(contentOffset.y > 200) - }, []) + }, [navigation]) // Debounce: onEndReached can fire multiple times during a single scroll gesture const loadingTriggered = useRef(false) @@ -662,6 +709,8 @@ export default function SessionScreen() { if (hasMore && !loadingMore) loadOlderMessages() }} onScrollToTop={() => { + navigation.manual() + if (retry.current) clearTimeout(retry.current) flatListRef.current?.scrollToEnd({ animated: true }) }} onClose={() => setShowInfo(false)} @@ -710,6 +759,17 @@ export default function SessionScreen() { ref={flatListRef} data={messageData} inverted + CellRendererComponent={MessageCell} + onLayout={(event) => { + navigation.observe(navigation.offset, event.nativeEvent.layout.height) + }} + onScrollBeginDrag={() => { + navigation.manual() + if (retry.current) clearTimeout(retry.current) + }} + onScrollToIndexFailed={({ index, averageItemLength }) => { + flatListRef.current?.scrollToOffset({ offset: averageItemLength * index, animated: false }) + }} keyExtractor={(item) => item.message.id} renderItem={({ item }) => ( {t("session.empty.hint")} )} - {showScrollButton && ( - scrollToBottom(true)}> - - + {messageData.length > 0 && ( + + moveMessage(1)}> + + + moveMessage(-1)}> + + + {showScrollButton && ( + scrollToBottom(true)}> + + + + )} + {!showScrollButton && } + )} )} @@ -913,10 +988,13 @@ const s = StyleSheet.create({ messageList: { padding: 16, paddingBottom: 8 }, // Scroll button - scrollBtn: { + scrollControls: { position: "absolute", bottom: 16, right: 16, + gap: 4, + }, + scrollBtn: { width: 44, height: 44, borderRadius: 22, diff --git a/docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md b/docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md new file mode 100644 index 00000000..760e01cf --- /dev/null +++ b/docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md @@ -0,0 +1,95 @@ +# Issue 214: Message Navigation Validation + +## Scope + +Previous and Next use single carets immediately above double-caret Latest. +Targets are the starts of rendered user/assistant messages in the inverted +FlatList. Layout-only/system rows are not navigation targets. + +The change does not modify native keyboard handling, the composer, safe-area +configuration, server code, release metadata, or unrelated IME PR #208. + +## Automated Gates + +- `npm ci --legacy-peer-deps`: completed using the existing lockfile. +- `npm test`: 348 passed, zero failures (15 navigation regressions). +- `npm run typecheck`: passed. +- `npm run check:versions`: passed, existing 0.4.15 / versionCode 42 unchanged. +- `git diff --check`: passed. +- `npm run lint`: unavailable; package.json has no lint script despite the + contributing guide naming one. No lint pass is claimed. +- Android `./gradlew assembleRelease -PreactNativeArchitectures=arm64-v8a + --max-workers=2 --console=plain`: passed under a capacity lease, with SDK/JDK + environment configured and `SENTRY_DISABLE_AUTO_UPLOAD=true`. + +The first build reached signing and failed because the checkout lacked +`android/app/debug.keystore`. Generating the ignored development key using the +same setup as CI allowed the build to pass; no signing material is committed. + +## Physical Android Runtime + +Device: Pixel 8 Pro. The installed production package had a different signing +certificate, so it was preserved. A temporary external Gradle init script used +the supported `androidComponents.finalizeDsl` API to build a separate +`cc.agentlabs.opencode.navigation214` test package. No tracked Android source or +configuration changed. The JavaScript bundle contains the actual feature diff. + +The existing `tests/fixtures/mock-opencode-server.ts` supplied a separate test +connection via ADB reverse. The fixture was seeded through its REST API with +25 numbered user messages and 25 assistant responses, each containing 70 lines. +This is mock protocol coverage, not live AI/backend validation. + +Snapshot-driven ADB assertions passed these flows: + +1. From the newest response's partially visible end, Previous reaches user + Message 25 at the viewport top, then the older assistant's line 1, then user + Message 24. The repeated tap advances at exact message-start boundaries. +2. Next reaches the adjacent assistant's line 1, then user Message 25. +3. Manually scrolling into the middle of the long response discards the tap + anchor; Previous reaches Message 24 from the new viewport position. +4. With an unsent draft and keyboard open, tapping navigation preserves the + draft and composer `focused=true`; Android input-method state remains shown. +5. Latest reaches line 70 of the newest response and preserves the draft. +6. Seventeen consecutive Previous taps reach numbered Message 17 through every + intermediate message start, beyond the initial render window. Latest then + returns to the newest response end. + +The harness first needed two test-only corrections: keyboard capitalization +must be accounted for, and keyboard dismissal must not send a blind Back key +when the keyboard is already closed. Neither required a product change. + +Screenshots from the actual physical-device build: + +- [Message start and controls](screenshots/issue-214-message-navigation.png) +- [Keyboard, draft and controls](screenshots/issue-214-keyboard-navigation.png) + +The keyboard screenshot is not evidence that the composer is fully visible +above this device's IME. Existing keyboard layout work remains outside scope. + +## Independent Review + +An independent actual-diff code/behavior/UX review initially found three +issues: virtualized estimates could stall, completed targets could repin a +streaming response away from Latest, and resizing could leave a stale anchor. +All three were remediated and regression-tested. + +The independent final review ran the 15 focused tests, typecheck and diff check, +inspected installed React Native 0.81.5 list internals, the runtime harness and +both screenshots. Verdict: **PASS code/static compact-control UX; BLOCKED merge +readiness**. No remaining actionable correctness defect was established. + +## Blocked Gates + +- Mandatory vision CUA was actually attempted with Python 3.12 and the existing + runner against the isolated installed package. It exited 1 with: + `Set AZURE_OPENAI_API_KEY, AZURE_DEV_AI_API_KEY, OPENAI_API_KEY, XAI_API_KEY, or GEMINI_API_KEY`. + The documented `~/.env.d/azure-openai.env` file is absent. Deterministic ADB + assertions do not substitute for this gate. +- The documented live server's `/global/health` request timed out after 15 + seconds. No server/daemon changes or permission workarounds were attempted. +- Native rapid-tap callback ordering, live streaming/appends, and constrained + keyboard/composer layout remain incompletely validated. Pure regressions + cover rapid pending taps, growth/appends, resizing and manual cancellation. + +Do not merge or release until the mandatory CUA gate passes and remaining +runtime gaps have been checked. The focused PR remains draft while blocked. diff --git a/docs/qa/screenshots/issue-214-keyboard-navigation.png b/docs/qa/screenshots/issue-214-keyboard-navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0b7d50df9b2094216ddbffd0cd7b2182658fff GIT binary patch literal 246055 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⩔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�D0R}rd00%(+8=@-WNu<;Zkz!6eQpTpH zIN~n`wW}*D1!nTgbeo{@e*Ey^=Vug3EChx&%*sO;Xea|fKz!=z`|!36JjMruT~Veh zEM~!L$lMulApj&Oyvsmx z3?6<`iQqLl*7$gpL;d@iK0=cnn!vjHidB z+&^iaYHUS+iZI>6%14hprXnThFaITj!QUjF�wUdO`}M>W|z)k*lz7;N)zE;I?pA zmHJBE;UH3k#M&r7|0dA8WcbQ!K0%9x3)EDeJMw7g+s;~~Ni z6Z=bi4c=hkITIG%m6s_g1n9yym^fr(Z*&FY#k191HC93o!icwT`zW3?-8fFWeVvGX zvSwd|NS8K?neG!MoRN?DXllTE;ZpAc$ZlD@ zAV{PRnCY8t3rV7A(GR!_e!#544ajNL^FN&UHdm)ncb1~rCvxh<2`Bh#Kn@WIbo~ZQ zw}P2Sb}V*Lsj6i^2IQh(d@`rdCi($MvfOU?_vc)A)siWDDTdSxSEGrTrr#it-F@rv zEB+FMj@o`vsvmG=9dlAc)ZB4 z!`>RJkbyD6`@6NayREc=CCQAkiDc$qpR0$#L}t0n3z%HQuH%`65K?1qvnQdbpb$hL zG8~k1PfpSe6dezr2AQ%orPG&7Dc=ck3MNrrx6} zc+|XpZgW|l`+tTQ;H=Jao_Y=lHd(%iLMV6hrB6h+`VV&cIyB`Kz;RN*8KKhduQ4i} z5_>2;$N=M#@(y>~nvB&uF;{Nt=fd>kYyUhR z)JpX7=3vyRjfGO7c=N5HZGA1XB2aq55?px1bO#V-jbc-Y=st9XGUhrVi~gV2cGwit z!9tfF$(gI8V~=20PpUKXuggg&LFX;vcnK4;g=tV_aSNpE?YU@Tp8^PIt8YW*{fK_v zBcvILe71tWJKrJ7#di+>zRctTc}lWL0)vy)=u-ZxL$>)V{5T(BO7wUBj8hvELm@A` zdq==^uMypRxGyAz saEcQuFahYF{ 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 -ZyO~jn*Fb0f3Y=q7 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%0DE<)cNG?u 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

p_;kg42D%gxI=a%`M5UU!O@9Tn!_pOfEuCp=gX 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 literal 0 HcmV?d00001 diff --git a/docs/qa/screenshots/issue-214-message-navigation.png b/docs/qa/screenshots/issue-214-message-navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..ed25c056da06ade78bc60affb1e4c46a255d8006 GIT binary patch literal 220793 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

<0ux13zbIcmf>MSV&HFT%3#q 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

18V^NI{Rh19%@GT- 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

K3H(dM8g(q7UKXxU<|dosWVW$#IQW&^@W1 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 literal 0 HcmV?d00001 diff --git a/src/lib/message-navigation.test.ts b/src/lib/message-navigation.test.ts new file mode 100644 index 00000000..39fbca98 --- /dev/null +++ b/src/lib/message-navigation.test.ts @@ -0,0 +1,173 @@ +import { test } from "node:test" +import assert from "node:assert/strict" +import { MessageNavigation } from "./message-navigation.ts" + +function list() { + const nav = new MessageNavigation() + nav.sync(["new", "long", "old"]) + nav.height = 200 + nav.frames.set("new", { y: 0, height: 100 }) + nav.frames.set("long", { y: 100, height: 1000 }) + nav.frames.set("old", { y: 1100, height: 100 }) + return nav +} + +test("viewport top anchors a partially visible long message, not the newest visible row", () => { + const nav = list() + assert.equal(nav.current(), 1) + assert.equal(nav.move(1), 2) + assert.equal(nav.destination(), 1000) +}) + +test("exact message starts belong to that message, not its older neighbor", () => { + const nav = list() + nav.offset = 900 + assert.equal(nav.current(), 1) + assert.equal(nav.move(-1), 0) + assert.equal(nav.destination(), 0) +}) + +test("repeated taps advance before the native scroll callback arrives", () => { + const nav = list() + nav.offset = 1000 + assert.equal(nav.move(-1), 1) + assert.equal(nav.destination(), 900) + assert.equal(nav.move(-1), 0) + assert.equal(nav.move(-1), undefined) + assert.equal(nav.target, "new") +}) + +test("empty, unmeasured and oldest bounds are no-ops", () => { + const nav = new MessageNavigation() + assert.equal(nav.move(1), undefined) + nav.sync(["only"]) + assert.equal(nav.move(-1), undefined) + const measured = list() + measured.offset = 1000 + assert.equal(measured.move(1), undefined) +}) + +test("virtualized offscreen target resolves only after its actual layout arrives", () => { + const nav = list() + nav.frames.delete("old") + assert.equal(nav.move(1), 2) + assert.equal(nav.destination(), undefined) + nav.frames.set("old", { y: 1100, height: 500 }) + assert.equal(nav.destination(), 1400) +}) + +test("streaming growth and appends preserve pending target ID rather than stale index", () => { + const nav = list() + nav.move(1) + nav.sync(["appended", "new", "long", "old"]) + nav.frames.set("old", { y: 1500, height: 100 }) + assert.equal(nav.current(), 3) + assert.equal(nav.destination(), 1400) + assert.equal(nav.move(-1), 2) + assert.equal(nav.target, "long") +}) + +test("manual scroll discards tap anchor and derives the next target from viewport", () => { + const nav = list() + nav.move(1) + nav.manual() + nav.offset = 400 + assert.equal(nav.current(), 1) + assert.equal(nav.move(-1), 0) +}) + +test("revert/removal discards missing targets and layouts", () => { + const nav = list() + nav.move(1) + nav.sync(["new", "long"]) + assert.equal(nav.target, undefined) + assert.equal(nav.frames.has("old"), false) + assert.equal(nav.current(), 1) +}) + +test("layout-only zero-height rows cannot become viewport anchors", () => { + const nav = list() + nav.frames.set("long", { y: 100, height: 0 }) + assert.equal(nav.current(), 0) +}) + +test("viewport resizing changes the inverted top coordinate", () => { + const nav = list() + nav.height = 100 + assert.equal(nav.current(), 0) + nav.height = 200 + assert.equal(nav.current(), 1) +}) + +test("completed newest navigation does not top-pin subsequent streaming growth", () => { + const nav = list() + nav.move(-1) + nav.complete(nav.destination()!) + nav.frames.set("new", { y: 0, height: 500 }) + assert.equal(nav.destination(), undefined) + assert.equal(nav.target, undefined) + assert.equal(nav.current(), 0) +}) + +test("completed tap anchor is invalidated by keyboard resize and viewport scroll", () => { + const nav = list() + nav.move(1) + nav.complete(nav.destination()!) + nav.observe(1000, 200) + assert.equal(nav.current(), 2) + nav.observe(1000, 100) + assert.equal(nav.current(), 1) + assert.equal(nav.move(-1), 0) + nav.complete(0) + nav.observe(400, 200) + assert.equal(nav.current(), 1) +}) + +test("completed clamped short-message taps advance until a viewport change", () => { + const nav = list() + nav.move(-1) + nav.complete(0) + nav.observe(0, 200) + assert.equal(nav.current(), 0) + assert.equal(nav.move(-1), undefined) + nav.manual() + assert.equal(nav.current(), 1) +}) + +test("accepted virtualized estimates keep seeking, then settle to actual measured top", () => { + const nav = list() + nav.frames.delete("old") + const calls: unknown[] = [] + const driver = { + scrollToIndex(params: unknown) { calls.push(params) }, + scrollToOffset(params: { offset: number; animated: boolean }) { + calls.push(params) + nav.observe(params.offset, nav.height) + }, + } + nav.move(1) + assert.equal(nav.seek(driver, 0), true) + assert.deepEqual(calls[0], { index: 2, viewPosition: 1, animated: false }) + assert.equal(nav.seek(driver, 1), true) + assert.deepEqual(calls[1], { offset: 160, animated: false }) + nav.frames.set("old", { y: 1100, height: 500 }) + assert.equal(nav.seek(driver, 2), false) + assert.deepEqual(calls[2], { offset: 1400, animated: false }) + assert.equal(nav.target, undefined) + assert.equal(nav.current(), 2) +}) + +test("manual cancellation and retry exhaustion stop all seek side effects", () => { + const nav = list() + nav.frames.delete("old") + const driver = { + scrollToIndex() { assert.fail("cancelled seek must not scroll") }, + scrollToOffset() { assert.fail("cancelled seek must not scroll") }, + } + nav.move(1) + assert.equal(nav.seek(driver, 20), false) + assert.equal(nav.target, undefined) + nav.move(1) + nav.manual() + assert.equal(nav.seek(driver, 1), false) +}) diff --git a/src/lib/message-navigation.ts b/src/lib/message-navigation.ts new file mode 100644 index 00000000..e22e8dd6 --- /dev/null +++ b/src/lib/message-navigation.ts @@ -0,0 +1,102 @@ +// Inverted lists measure from the newest end; a cell's logical end is its +// visual top. Keep targets by ID because streaming can change list indices. +export class MessageNavigation { + ids: string[] = [] + frames = new Map() + offset = 0 + height = 0 + target: string | undefined + anchor: { id: string; offset: number; height: number } | undefined + + sync(ids: string[]) { + this.ids = ids + if (this.target && !ids.includes(this.target)) this.target = undefined + if (this.anchor && !ids.includes(this.anchor.id)) this.anchor = undefined + for (const id of this.frames.keys()) { + if (!ids.includes(id)) this.frames.delete(id) + } + } + + current() { + if (this.target) return this.ids.indexOf(this.target) + if (this.anchor) return this.ids.indexOf(this.anchor.id) + return this.visible() + } + + visible() { + const top = this.offset + this.height + // Include exact starts, but not the end of the older adjacent cell. + const visible = this.ids.findIndex((id) => { + const frame = this.frames.get(id) + return frame && frame.height > 0 && frame.y < top && frame.y + frame.height >= top - 1 + }) + if (visible >= 0) return visible + const nearest = this.ids.map((id, index) => ({ index, frame: this.frames.get(id) })) + .filter((item) => item.frame && item.frame.height > 0 && item.frame.y < top) + .sort((a, b) => b.frame!.y - a.frame!.y)[0] + return nearest?.index ?? -1 + } + + move(direction: 1 | -1) { + const current = this.current() + if (current < 0) return undefined + const index = current + direction + if (index < 0 || index >= this.ids.length) return undefined + this.target = this.ids[index] + return index + } + + destination() { + if (!this.target) return undefined + const frame = this.frames.get(this.target) + if (!frame || frame.height <= 0 || this.height <= 0) return undefined + return Math.max(0, frame.y + frame.height - this.height) + } + + manual() { + this.target = undefined + this.anchor = undefined + } + + observe(offset: number, height: number) { + this.offset = offset + this.height = height + if (this.anchor && (Math.abs(this.anchor.offset - offset) > 1 || this.anchor.height !== height)) { + this.anchor = undefined + } + } + + complete(offset: number) { + if (this.target) this.anchor = { id: this.target, offset, height: this.height } + this.target = undefined + } + + seek(list: { + scrollToOffset(params: { offset: number; animated: boolean }): void + scrollToIndex(params: { index: number; viewPosition: number; animated: boolean }): void + }, attempt: number) { + if (!this.target) return false + const index = this.ids.indexOf(this.target) + if (index < 0) return false + const offset = this.destination() + if (offset !== undefined) { + list.scrollToOffset({ offset, animated: false }) + this.complete(offset) + return false + } + if (attempt >= 20) { + this.manual() + return false + } + if (attempt === 0) { + list.scrollToIndex({ index, viewPosition: 1, animated: false }) + return true + } + // RN may accept estimated metrics without mounting the target. Advance + // the render window until a real target frame arrives, even without failure. + const visible = this.visible() + const direction = visible < 0 || index > visible ? 1 : -1 + list.scrollToOffset({ offset: Math.max(0, this.offset + direction * this.height * 0.8), animated: false }) + return true + } +} From dddbe510320f8dc03530ecd8b5db0a608647440b Mon Sep 17 00:00:00 2001 From: Joshua Castaneda Date: Thu, 1 Oct 2026 14:09:47 -0700 Subject: [PATCH 10/20] fix(chat): reserve message navigation gutter (#214) --- app/session/[id].tsx | 3 ++- ...ssage-navigation-layout.regression.test.ts | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/components/chat/message-navigation-layout.regression.test.ts diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 8ccbcd95..dca40433 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -985,7 +985,8 @@ const s = StyleSheet.create({ listWrap: { flex: 1, position: "relative" }, // Messages - messageList: { padding: 16, paddingBottom: 8 }, + // Reserve the controls' 44pt width + 16pt right inset + 16pt text gap. + messageList: { padding: 16, paddingBottom: 8, paddingRight: 76 }, // Scroll button scrollControls: { diff --git a/src/components/chat/message-navigation-layout.regression.test.ts b/src/components/chat/message-navigation-layout.regression.test.ts new file mode 100644 index 00000000..e92dd54f --- /dev/null +++ b/src/components/chat/message-navigation-layout.regression.test.ts @@ -0,0 +1,23 @@ +import { test } from "node:test" +import assert from "node:assert/strict" +import { readFileSync } from "node:fs" + +// Follow the existing source-level RN regression pattern: node:test cannot +// render native layouts. This guard fails on the original overlapping layout; +// changed-head device/keyboard acceptance is still required. +const source = readFileSync(new URL("../../../app/session/[id].tsx", import.meta.url), "utf8") + +test("message content reserves a gutter for the floating navigation controls", () => { + assert.match(source, /contentContainerStyle=\{s\.messageList\}/) + assert.match(source, //) + const content = source.match(/messageList:\s*\{([^}]+)\}/)?.[1] ?? "" + const controls = source.match(/scrollControls:\s*\{([^}]+)\}/)?.[1] ?? "" + const button = source.match(/scrollBtn:\s*\{([^}]+)\}/)?.[1] ?? "" + const padding = Number(content.match(/paddingRight:\s*(\d+)/)?.[1]) + const inset = Number(controls.match(/right:\s*(\d+)/)?.[1]) + const width = Number(button.match(/width:\s*(\d+)/)?.[1]) + const height = Number(button.match(/height:\s*(\d+)/)?.[1]) + + assert.ok(width >= 44 && height >= 44, "keep practical navigation hit targets") + assert.ok(padding >= inset + width + 16, "all message lines must clear the control rail and text gap") +}) From e935921956f1623479bc8e4f7b243771be394e5c Mon Sep 17 00:00:00 2001 From: Joshua Castaneda Date: Thu, 1 Oct 2026 20:13:08 -0700 Subject: [PATCH 11/20] fix(chat): retain navigation intent across delayed scroll events (#214) --- app/session/[id].tsx | 2 +- src/lib/message-navigation.test.ts | 44 ++++++++++++++++++++++++++++++ src/lib/message-navigation.ts | 12 +++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/app/session/[id].tsx b/app/session/[id].tsx index dca40433..38e4f54c 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -329,7 +329,7 @@ export default function SessionScreen() { }, [applyRevertResult, t]) const scrollToBottom = useCallback((animated = true) => { - navigation.manual() + navigation.manual(0) if (retry.current) clearTimeout(retry.current) flatListRef.current?.scrollToOffset({ offset: 0, animated }) }, [navigation]) diff --git a/src/lib/message-navigation.test.ts b/src/lib/message-navigation.test.ts index 39fbca98..88499e18 100644 --- a/src/lib/message-navigation.test.ts +++ b/src/lib/message-navigation.test.ts @@ -171,3 +171,47 @@ test("manual cancellation and retry exhaustion stop all seek side effects", () = nav.manual() assert.equal(nav.seek(driver, 1), false) }) + +test("delayed native offsets cannot discard the latest rapid-tap boundary", () => { + const nav = new MessageNavigation() + nav.sync(["reply3", "reply2", "reply1", "user3", "user2", "user1"]) + nav.observe(0, 200) + nav.ids.forEach((id, index) => nav.frames.set(id, { y: index * 600, height: 600 })) + const driver = { scrollToOffset() {}, scrollToIndex() {} } + assert.equal(nav.move(1), 1) + nav.seek(driver, 0) + assert.equal(nav.move(1), 2) + nav.seek(driver, 0) + // The callback for tap 1 arrives after tap 2 has issued its native scroll. + nav.observe(1000, 200) + assert.equal(nav.move(1), 3) + assert.equal(nav.target, "user3") +}) + +test("Latest resets the logical viewport before its native callback arrives", () => { + const nav = list() + nav.frames.set("new", { y: 0, height: 600 }) + nav.frames.set("long", { y: 600, height: 1000 }) + nav.frames.set("old", { y: 1600, height: 100 }) + nav.observe(1500, 200) + nav.manual(0) + nav.observe(1500, 200) // an older scroll event still queued during Latest + assert.equal(nav.offset, 0) + assert.equal(nav.move(1), 1) + assert.equal(nav.target, "long") +}) + +test("acknowledged navigation resumes scroll reanchoring and manual cancellation", () => { + const nav = list() + nav.move(1) + nav.complete(1000) + nav.observe(1000, 200) + nav.observe(400, 200) + assert.equal(nav.current(), 1) + nav.move(-1) + nav.complete(0) + nav.manual() + nav.observe(400, 200) + assert.equal(nav.current(), 1) + assert.equal(nav.expected, undefined) +}) diff --git a/src/lib/message-navigation.ts b/src/lib/message-navigation.ts index e22e8dd6..02e87645 100644 --- a/src/lib/message-navigation.ts +++ b/src/lib/message-navigation.ts @@ -5,6 +5,7 @@ export class MessageNavigation { frames = new Map() offset = 0 height = 0 + expected: number | undefined target: string | undefined anchor: { id: string; offset: number; height: number } | undefined @@ -53,12 +54,19 @@ export class MessageNavigation { return Math.max(0, frame.y + frame.height - this.height) } - manual() { + manual(offset?: number) { this.target = undefined this.anchor = undefined + this.expected = offset + if (offset !== undefined) this.offset = offset } observe(offset: number, height: number) { + if (this.height !== height) this.expected = undefined + // Earlier programmatic scroll callbacks can arrive after a newer tap. + // Keep its boundary until native scrolling acknowledges the latest command. + if (this.expected !== undefined && Math.abs(this.expected - offset) > 1) return + this.expected = undefined this.offset = offset this.height = height if (this.anchor && (Math.abs(this.anchor.offset - offset) > 1 || this.anchor.height !== height)) { @@ -68,6 +76,8 @@ export class MessageNavigation { complete(offset: number) { if (this.target) this.anchor = { id: this.target, offset, height: this.height } + this.expected = offset + this.offset = offset this.target = undefined } From 4b8def6e3a618c8fb08f64f392c606aa1b6fc4e4 Mon Sep 17 00:00:00 2001 From: Joshua Castaneda Date: Thu, 1 Oct 2026 22:05:12 -0700 Subject: [PATCH 12/20] fix(chat): mirror Android inverted-list navigation gutter (#214) --- app/session/[id].tsx | 10 ++++++++-- .../chat/message-navigation-layout.regression.test.ts | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 38e4f54c..8184103f 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -985,8 +985,14 @@ const s = StyleSheet.create({ listWrap: { flex: 1, position: "relative" }, // Messages - // Reserve the controls' 44pt width + 16pt right inset + 16pt text gap. - messageList: { padding: 16, paddingBottom: 8, paddingRight: 76 }, + // Reserve 44pt controls + 16pt inset + 16pt gap on the physical right. + // Android's inverted list flips both axes, so its content padding is mirrored. + messageList: { + padding: 16, + paddingBottom: 8, + paddingLeft: Platform.OS === "android" ? 76 : 16, + paddingRight: Platform.OS === "android" ? 16 : 76, + }, // Scroll button scrollControls: { diff --git a/src/components/chat/message-navigation-layout.regression.test.ts b/src/components/chat/message-navigation-layout.regression.test.ts index e92dd54f..bd4b1656 100644 --- a/src/components/chat/message-navigation-layout.regression.test.ts +++ b/src/components/chat/message-navigation-layout.regression.test.ts @@ -1,6 +1,7 @@ import { test } from "node:test" import assert from "node:assert/strict" import { readFileSync } from "node:fs" +import { runInNewContext } from "node:vm" // Follow the existing source-level RN regression pattern: node:test cannot // render native layouts. This guard fails on the original overlapping layout; @@ -13,11 +14,16 @@ test("message content reserves a gutter for the floating navigation controls", ( const content = source.match(/messageList:\s*\{([^}]+)\}/)?.[1] ?? "" const controls = source.match(/scrollControls:\s*\{([^}]+)\}/)?.[1] ?? "" const button = source.match(/scrollBtn:\s*\{([^}]+)\}/)?.[1] ?? "" - const padding = Number(content.match(/paddingRight:\s*(\d+)/)?.[1]) const inset = Number(controls.match(/right:\s*(\d+)/)?.[1]) const width = Number(button.match(/width:\s*(\d+)/)?.[1]) const height = Number(button.match(/height:\s*(\d+)/)?.[1]) assert.ok(width >= 44 && height >= 44, "keep practical navigation hit targets") - assert.ok(padding >= inset + width + 16, "all message lines must clear the control rail and text gap") + for (const os of ["android", "ios"]) { + const style = runInNewContext(`({${content}})`, { Platform: { OS: os } }) + // RN 0.81's Android inverted list uses scale:-1 (both axes), while iOS + // uses scaleY:-1. Content padding is transformed; the overlay is not. + const padding = os === "android" ? style.paddingLeft ?? style.padding : style.paddingRight ?? style.padding + assert.ok(padding >= inset + width + 16, `${os}: physical-right text must clear the control rail and gap`) + } }) From 978a52bb7f67a49010a5f25694486e0e6b5801cc Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:14:54 +0000 Subject: [PATCH 13/20] feat: Changes view per chat (branch / uncommitted / this turn) - sdk: vcs.get, vcs.diff(mode), typed FileDiff - stores/changes: per-dir branch+git diffs, per-session turn diff, 60s cache - app/changes/[id]: 3 tabs, file list w/ +/- counts, pull-to-refresh, refresh on turn end - app/changes/file: fullscreen wrapped diff (DiffRow from DiffView) - chat header chip + SessionInfo + session list counts from vcs data, not session.summary - patch parsing after chliny's patch-compute (upstream #192, MIT) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/(tabs)/index.tsx | 29 +++-- app/changes/[id].tsx | 174 ++++++++++++++++++++++++++++ app/changes/file.tsx | 70 +++++++++++ app/session/[id].tsx | 45 +++++++ src/components/chat/DiffView.tsx | 63 ++++++---- src/components/chat/SessionInfo.tsx | 24 ++-- src/components/chat/index.ts | 2 +- src/lib/changes.test.ts | 82 +++++++++++++ src/lib/changes.ts | 93 +++++++++++++++ src/lib/i18n/en.json | 23 ++++ src/lib/i18n/zh-Hans.json | 23 ++++ src/lib/sdk.ts | 32 ++++- src/stores/changes.ts | 98 ++++++++++++++++ 13 files changed, 716 insertions(+), 42 deletions(-) create mode 100644 app/changes/[id].tsx create mode 100644 app/changes/file.tsx create mode 100644 src/lib/changes.test.ts create mode 100644 src/lib/changes.ts create mode 100644 src/stores/changes.ts diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 7c69237e..9f877410 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -23,6 +23,7 @@ import { useSessions } from "../../src/stores/sessions" import { useConnections } from "../../src/stores/connections" import { useEvents } from "../../src/stores/events" import { useCatalog } from "../../src/stores/catalog" +import { useChanges, useHeadline } from "../../src/stores/changes" import type BottomSheet from "@gorhom/bottom-sheet" import type { Session, Project } from "../../src/lib/sdk" import { DirectorySwitcher, DirectoryBrowserSheet } from "../../src/components/chat" @@ -72,6 +73,8 @@ function SessionItem({ ]) } + const changes = useHeadline(session.directory) + // Extract short directory name from session const shortDir = session.directory ? session.directory.split("/").filter(Boolean).pop() : null @@ -91,11 +94,11 @@ function SessionItem({ {formatTime(session.time.updated, t)} - {/* summary is always present but files defaults to 0 until the - server populates it — only show the count when it's meaningful, - matching the SessionInfo panel's `summary.files > 0` guard (#55) */} - {session.summary && session.summary.files > 0 && - ` · ${t("sessionsList.filesCount", { count: session.summary.files })}`} + {/* Repo-level counts from the vcs diff (see stores/changes); + session.summary has been empty since opencode 1.15. */} + {changes && changes.files > 0 && ` · ${t("sessionsList.filesCount", { count: changes.files })} `} + {changes && changes.files > 0 && +{changes.additions} } + {changes && changes.files > 0 && -{changes.deletions}} {shortDir && ( @@ -260,16 +263,26 @@ export default function SessionsScreen() { }, [client, loadSessions, refreshProject]), ) + // Change counts for the most recent repos in the list (stale entries only; + // pull-to-refresh forces). + const changeDirs = useMemo( + () => [...new Set(sessions.map((session) => session.directory).filter(Boolean))].slice(0, 10), + [sessions], + ) + useEffect(() => { + if (client) void useChanges.getState().prefetch(changeDirs) + }, [client, changeDirs]) + const onRefresh = useCallback(async () => { setRefreshing(true) try { - await Promise.all([loadSessions(), refreshProject()]) + await Promise.all([loadSessions(), refreshProject(), useChanges.getState().prefetch(changeDirs, true)]) } catch (err) { console.error("Refresh failed:", err) } finally { setRefreshing(false) } - }, [loadSessions, refreshProject]) + }, [loadSessions, refreshProject, changeDirs]) const handleRename = useCallback((session: Session) => { setRenameText(session.title || "") @@ -990,6 +1003,8 @@ const styles = StyleSheet.create({ fontSize: 13, color: "#666666", }, + changesAdd: { color: "#16a34a", fontWeight: "600" }, + changesDel: { color: "#dc2626", fontWeight: "600" }, sessionMetaRow: { flexDirection: "row", alignItems: "center", diff --git a/app/changes/[id].tsx b/app/changes/[id].tsx new file mode 100644 index 00000000..1b3a5807 --- /dev/null +++ b/app/changes/[id].tsx @@ -0,0 +1,174 @@ +import { useCallback, useEffect, useMemo, useState } from "react" +import { View, Text, FlatList, TouchableOpacity, StyleSheet, useColorScheme, RefreshControl, ActivityIndicator } from "react-native" +import { Stack, router, useLocalSearchParams } from "expo-router" +import { Ionicons } from "@expo/vector-icons" +import { useTranslation } from "react-i18next" +import { useChanges, useOnTurnEnd, turnKey, vcsKey } from "../../src/stores/changes" +import { useConnections } from "../../src/stores/connections" +import { useSessions } from "../../src/stores/sessions" +import { lastUserMessageID, sortDiffs, splitPath, totals, type ChangeTab } from "../../src/lib/changes" +import type { FileDiff, VcsInfo } from "../../src/lib/sdk" + +const TABS: ChangeTab[] = ["branch", "git", "turn"] + +export default function ChangesScreen() { + const { id, directory, tab: initial } = useLocalSearchParams<{ id: string; directory?: string; tab?: ChangeTab }>() + const isDark = useColorScheme() === "dark" + const { t } = useTranslation() + const [tab, setTab] = useState(initial && TABS.includes(initial) ? initial : "branch") + const [info, setInfo] = useState(null) + + const messageID = useSessions((s) => (s.currentSession?.id === id ? lastUserMessageID(s.messages) : undefined)) + const { loadVcs, loadTurn } = useChanges() + const key = tab === "turn" ? turnKey(id) : directory ? vcsKey(directory, tab) : "" + const entry = useChanges((s) => s.entries[key]) + + const load = useCallback( + (which: ChangeTab, force?: boolean) => { + if (which === "turn") return loadTurn(id, directory, messageID, force) + if (!directory) return Promise.resolve() + return loadVcs(directory, which, force) + }, + [id, directory, messageID, loadTurn, loadVcs], + ) + + useEffect(() => { + void load(tab) + }, [tab, load]) + + useEffect(() => { + if (!directory) return + const client = useConnections.getState().clientForDirectory(directory) + client?.vcs + .get() + .then(setInfo) + .catch(() => setInfo(null)) + }, [directory]) + + useOnTurnEnd(id, () => { + for (const which of TABS) void load(which, true) + }) + + const diffs = useMemo(() => sortDiffs(entry?.diffs ?? []), [entry?.diffs]) + const sum = totals(diffs) + const onDefault = !!info?.branch && info.branch === info.default_branch + + const emptyText = + tab === "branch" ? (onDefault ? t("changes.empty.defaultBranch") : t("changes.empty.branch")) : t(`changes.empty.${tab}`) + + return ( + + + + + {TABS.map((item) => ( + setTab(item)} + testID={`changes-tab-${item}`} + > + {t(`changes.tabs.${item}`)} + + ))} + + + + + {tab === "branch" && info?.branch && info.default_branch + ? `${t("changes.branchVs", { branch: info.branch, base: info.default_branch })} · ` + : ""} + {t("changes.summary", { count: sum.files })} + + +{sum.additions} + -{sum.deletions} + + + {entry?.error && ( + + {t("changes.error", { message: entry.error })} + + )} + + item.file} + refreshControl={ void load(tab, true)} />} + renderItem={({ item }) => ( + router.push({ pathname: "/changes/file", params: { key, file: item.file } })} + /> + )} + ListEmptyComponent={ + entry?.loading || !entry ? ( + + ) : entry.error ? null : ( + {emptyText} + ) + } + contentContainerStyle={s.list} + testID="changes-list" + /> + + ) +} + +function FileRow({ diff, isDark, onPress }: { diff: FileDiff; isDark: boolean; onPress: () => void }) { + const { dir, name } = splitPath(diff.file) + const icon = diff.status === "added" ? "add-circle-outline" : diff.status === "deleted" ? "remove-circle-outline" : "document-text-outline" + const color = diff.status === "added" ? "#16a34a" : diff.status === "deleted" ? "#dc2626" : isDark ? "#a3a3a3" : "#666666" + return ( + + + + + {name} + + {dir ? ( + + {dir} + + ) : null} + + +{diff.additions} + -{diff.deletions} + + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: "#ffffff" }, + containerDark: { backgroundColor: "#0a0a0a" }, + tabs: { flexDirection: "row", borderBottomWidth: StyleSheet.hairlineWidth, borderBottomColor: "#e5e5e5" }, + tabsDark: { borderBottomColor: "#262626" }, + tab: { flex: 1, alignItems: "center", paddingVertical: 12, borderBottomWidth: 2, borderBottomColor: "transparent" }, + tabActive: { borderBottomColor: "#3b82f6" }, + tabText: { fontSize: 14, fontWeight: "500", color: "#0a0a0a" }, + tabTextActive: { color: "#3b82f6", fontWeight: "600" }, + textDark: { color: "#ffffff" }, + metaDark: { color: "#888888" }, + summary: { flexDirection: "row", alignItems: "center", gap: 8, paddingHorizontal: 16, paddingVertical: 10 }, + summaryText: { flex: 1, fontSize: 13, color: "#666666" }, + add: { fontSize: 12, fontWeight: "700", color: "#16a34a" }, + del: { fontSize: 12, fontWeight: "700", color: "#dc2626" }, + error: { color: "#ef4444", fontSize: 13, paddingHorizontal: 16, paddingBottom: 8 }, + list: { paddingBottom: 32, flexGrow: 1 }, + loading: { marginTop: 32 }, + empty: { textAlign: "center", marginTop: 32, paddingHorizontal: 24, fontSize: 14, color: "#666666" }, + row: { + flexDirection: "row", + alignItems: "center", + gap: 10, + paddingHorizontal: 16, + paddingVertical: 12, + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: "#eeeeee", + }, + rowDark: { borderBottomColor: "#1f1f1f" }, + rowText: { flex: 1 }, + name: { fontSize: 14, fontWeight: "500", color: "#0a0a0a" }, + dir: { fontSize: 12, color: "#888888", marginTop: 2 }, +}) diff --git a/app/changes/file.tsx b/app/changes/file.tsx new file mode 100644 index 00000000..3d62fe11 --- /dev/null +++ b/app/changes/file.tsx @@ -0,0 +1,70 @@ +import { useMemo } from "react" +import { View, Text, FlatList, StyleSheet, useColorScheme } from "react-native" +import { Stack, useLocalSearchParams } from "expo-router" +import { useTranslation } from "react-i18next" +import { useChanges } from "../../src/stores/changes" +import { parsePatch, splitPath } from "../../src/lib/changes" +import { DiffRow } from "../../src/components/chat" + +// Fullscreen diff of one file from the Changes view. Long lines wrap; the +// patch comes from the Changes store entry (`key`) the file list was showing. +export default function ChangeFileScreen() { + const { key, file } = useLocalSearchParams<{ key: string; file: string }>() + const isDark = useColorScheme() === "dark" + const { t } = useTranslation() + const diff = useChanges((s) => s.entries[key]?.diffs?.find((item) => item.file === file)) + const lines = useMemo(() => parsePatch(diff?.patch), [diff?.patch]) + const { dir, name } = splitPath(file ?? "") + + return ( + + + + + {dir} + {name} + + {diff && ( + <> + {diff.status && {t(`changes.status.${diff.status}`)}} + +{diff.additions} + -{diff.deletions} + + )} + + String(index)} + renderItem={({ item }) => } + initialNumToRender={60} + windowSize={11} + ListEmptyComponent={{t("changes.noPatch")}} + contentContainerStyle={s.list} + testID="change-file-diff" + /> + + ) +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: "#f8f8f8" }, + containerDark: { backgroundColor: "#1a1a1a" }, + header: { + flexDirection: "row", + alignItems: "center", + gap: 8, + paddingHorizontal: 12, + paddingVertical: 8, + backgroundColor: "#ffffff", + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: "#e5e5e5", + }, + headerDark: { backgroundColor: "#0a0a0a", borderBottomColor: "#262626" }, + path: { flex: 1, fontSize: 12, color: "#666666" }, + metaDark: { color: "#888888" }, + status: { fontSize: 12, color: "#666666" }, + add: { fontSize: 12, fontWeight: "700", color: "#16a34a" }, + del: { fontSize: 12, fontWeight: "700", color: "#dc2626" }, + list: { paddingVertical: 4, paddingBottom: 32 }, + empty: { textAlign: "center", marginTop: 32, paddingHorizontal: 24, fontSize: 14, color: "#666666" }, +}) diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 8184103f..76952507 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -47,6 +47,7 @@ import { useSpeech } from "../../src/lib/speech" import { keyboardPadding, keyboardVerticalOffset } from "../../src/lib/keyboard-offset" import { composerMaxHeight } from "../../src/lib/session-layout" import { MessageNavigation } from "../../src/lib/message-navigation" +import { useChanges, useHeadline, useOnTurnEnd } from "../../src/stores/changes" // --- Builtin slash commands --- const BUILTIN_COMMANDS: SlashCommand[] = [ @@ -174,6 +175,23 @@ export default function SessionScreen() { const questions = useEvents((s) => (sessionID ? s.questions[sessionID] : undefined)) || [] const shortDir = getShortDir(currentSession?.directory) + + // Branch/uncommitted change counts for this chat's repo; refreshed on focus + // and whenever the agent finishes a turn. + const changesDir = currentSession?.directory || directory + const changes = useHeadline(changesDir) + const refreshChanges = useCallback( + (force?: boolean) => { + if (changesDir) void useChanges.getState().prefetch([changesDir], force) + }, + [changesDir], + ) + useFocusEffect(useCallback(() => refreshChanges(), [refreshChanges])) + useOnTurnEnd(id, () => refreshChanges(true)) + const openChanges = useCallback(() => { + if (!id) return + router.push({ pathname: "/changes/[id]", params: { id, directory: changesDir ?? "" } }) + }, [id, changesDir, router]) const [showScrollButton, setShowScrollButton] = useState(false) // SSE reconnect banner @@ -663,6 +681,20 @@ export default function SessionScreen() { {shortDir} )} + + + {changes && changes.files > 0 && ( + <> + +{changes.additions} + -{changes.deletions} + + )} + setShowInfo((v) => !v)} hitSlop={8}> setShowInfo(false)} + changes={changes} + onChangesPress={openChanges} /> {/* SSE reconnect/connected banner */} @@ -1171,6 +1205,17 @@ const s = StyleSheet.create({ borderRadius: 6, }, dirBadgeDark: { backgroundColor: "#1a1a1a" }, + changesChip: { + flexDirection: "row", + alignItems: "center", + gap: 4, + backgroundColor: "#f5f5f5", + paddingHorizontal: 8, + paddingVertical: 4, + borderRadius: 6, + }, + changesAdd: { fontSize: 12, fontWeight: "600", color: "#16a34a" }, + changesDel: { fontSize: 12, fontWeight: "600", color: "#dc2626" }, dirText: { fontSize: 12, color: "#666666", fontWeight: "500" }, dirTextDark: { color: "#888888" }, diff --git a/src/components/chat/DiffView.tsx b/src/components/chat/DiffView.tsx index 00c66c09..c24a3382 100644 --- a/src/components/chat/DiffView.tsx +++ b/src/components/chat/DiffView.tsx @@ -1,6 +1,6 @@ import { View, Text, StyleSheet, Platform, ScrollView } from "react-native" import { WIDE_CONTENT_SCROLL_CONFIG } from "../../lib/scroll-config" -import { computeDiff } from "./diff-compute" +import { computeDiff, type DiffLine } from "./diff-compute" const mono = Platform.OS === "ios" ? "Menlo" : "monospace" @@ -20,29 +20,7 @@ export function DiffView({ before, after, isDark }: Props) { {lines.map((line, idx) => ( - - - {line.type === "add" ? "+" : line.type === "remove" ? "-" : " "} - - - {line.text} - - + ))} @@ -50,6 +28,39 @@ export function DiffView({ before, after, isDark }: Props) { ) } +// One diff line. `wrap` breaks long lines instead of relying on a horizontal +// scroll (the fullscreen Changes view). +export function DiffRow({ line, isDark, wrap }: { line: DiffLine; isDark: boolean; wrap?: boolean }) { + const hunk = line.type === "context" && line.text.startsWith("@@") + return ( + + + {line.type === "add" ? "+" : line.type === "remove" ? "-" : " "} + + + {line.text} + + + ) +} + const s = StyleSheet.create({ container: { borderRadius: 6, @@ -87,4 +98,8 @@ const s = StyleSheet.create({ textDark: { color: "#e5e5e5" }, addText: { color: "#16a34a" }, removeText: { color: "#dc2626" }, + hunk: { backgroundColor: "#eef2ff" }, + hunkDark: { backgroundColor: "#1e1b4b" }, + hunkText: { color: "#6366f1" }, + wrap: { flex: 1 }, }) diff --git a/src/components/chat/SessionInfo.tsx b/src/components/chat/SessionInfo.tsx index bb80b53b..78735e5e 100644 --- a/src/components/chat/SessionInfo.tsx +++ b/src/components/chat/SessionInfo.tsx @@ -4,6 +4,7 @@ import { Ionicons } from "@expo/vector-icons" import { useTranslation } from "react-i18next" import type { Message, Session } from "../../lib/sdk" import type { Provider } from "../../stores/catalog" +import type { ChangeTotals } from "../../lib/changes" interface Props { session: Session | null @@ -16,6 +17,10 @@ interface Props { onLoadAll: () => void onScrollToTop: () => void onClose: () => void + // Branch/uncommitted totals from the vcs diff (session.summary is empty + // since opencode 1.15). + changes?: ChangeTotals | null + onChangesPress?: () => void } function compact(n: number): string { @@ -51,6 +56,8 @@ export function SessionInfo({ onLoadAll, onScrollToTop, onClose, + changes, + onChangesPress, }: Props) { const { t } = useTranslation() // Match TUI: last assistant message tokens (context window), cumulative cost @@ -89,7 +96,6 @@ export function SessionInfo({ const hasTokens = stats.total > 0 const hasCost = stats.cost > 0 - const summary = session?.summary const created = session?.time.created const updated = session?.time.updated @@ -164,13 +170,15 @@ export function SessionInfo({ value={String(messages.length) + (hasMore ? "+" : "")} isDark={isDark} /> - {summary && summary.files > 0 && ( - + {changes && changes.files > 0 && ( + + + )} {session?.share?.url && ( diff --git a/src/components/chat/index.ts b/src/components/chat/index.ts index 4df6472f..c04c0d74 100644 --- a/src/components/chat/index.ts +++ b/src/components/chat/index.ts @@ -1,6 +1,6 @@ export { MessageBubble } from "./MessageBubble" export { ToolCallCard } from "./ToolCallCard" -export { DiffView } from "./DiffView" +export { DiffView, DiffRow } from "./DiffView" export { ReasoningBlock } from "./ReasoningBlock" export { PermissionPrompt } from "./PermissionPrompt" export { QuestionPrompt } from "./QuestionPrompt" diff --git a/src/lib/changes.test.ts b/src/lib/changes.test.ts new file mode 100644 index 00000000..24023060 --- /dev/null +++ b/src/lib/changes.test.ts @@ -0,0 +1,82 @@ +import { test } from "node:test" +import assert from "node:assert/strict" +import { headline, lastUserMessageID, parsePatch, sortDiffs, splitPath, totals } from "./changes.ts" + +const diff = (file: string, additions: number, deletions: number) => ({ file, additions, deletions }) + +test("totals sums files and line counts", () => { + assert.deepEqual(totals([diff("a", 3, 1), diff("b", 2, 0)]), { files: 2, additions: 5, deletions: 1 }) + assert.deepEqual(totals(undefined), { files: 0, additions: 0, deletions: 0 }) +}) + +test("headline prefers branch changes, falls back to uncommitted", () => { + assert.deepEqual(headline([diff("a", 1, 1)], [diff("b", 9, 9), diff("c", 1, 0)]), { files: 1, additions: 1, deletions: 1 }) + assert.deepEqual(headline([], [diff("b", 9, 9)]), { files: 1, additions: 9, deletions: 9 }) + assert.deepEqual(headline(undefined, undefined), { files: 0, additions: 0, deletions: 0 }) +}) + +test("sortDiffs orders by path without mutating", () => { + const input = [diff("src/b.ts", 0, 0), diff("README.md", 0, 0), diff("src/a.ts", 0, 0)] + assert.deepEqual(sortDiffs(input).map((d) => d.file), ["README.md", "src/a.ts", "src/b.ts"]) + assert.equal(input[0].file, "src/b.ts") +}) + +test("lastUserMessageID skips assistant and optimistic messages", () => { + const messages = [ + { id: "msg_1", role: "user" }, + { id: "msg_2", role: "assistant" }, + { id: "msg_3", role: "user" }, + { id: "msg_4", role: "assistant" }, + { id: "temp-5", role: "user" }, + ] + assert.equal(lastUserMessageID(messages), "msg_3") + assert.equal(lastUserMessageID([{ id: "msg_1", role: "assistant" }]), undefined) +}) + +test("splitPath separates directory and name", () => { + assert.deepEqual(splitPath("src/lib/a.ts"), { dir: "src/lib/", name: "a.ts" }) + assert.deepEqual(splitPath("a.ts"), { dir: "", name: "a.ts" }) +}) + +test("parsePatch reads a git diff, dropping file headers", () => { + const patch = [ + "diff --git a/src/a.ts b/src/a.ts", + "index 1111111..2222222 100644", + "--- a/src/a.ts", + "+++ b/src/a.ts", + "@@ -1,3 +1,3 @@", + " keep", + "-old", + "+new", + "\\ No newline at end of file", + ].join("\n") + assert.deepEqual(parsePatch(patch), [ + { type: "context", text: "@@ -1,3 +1,3 @@" }, + { type: "context", text: "keep" }, + { type: "remove", text: "old" }, + { type: "add", text: "new" }, + ]) +}) + +test("parsePatch reads jsdiff output and keeps removed lines that look like headers", () => { + const patch = [ + "Index: a.md", + "===================================================================", + "--- a.md", + "+++ a.md", + "@@ -1,2 +1,1 @@", + "--- a yaml rule", + "+++ added", + "", + ].join("\n") + assert.deepEqual(parsePatch(patch), [ + { type: "context", text: "@@ -1,2 +1,1 @@" }, + { type: "remove", text: "-- a yaml rule" }, + { type: "add", text: "++ added" }, + ]) +}) + +test("parsePatch handles missing patches", () => { + assert.deepEqual(parsePatch(undefined), []) + assert.deepEqual(parsePatch(""), []) +}) diff --git a/src/lib/changes.ts b/src/lib/changes.ts new file mode 100644 index 00000000..2c100dba --- /dev/null +++ b/src/lib/changes.ts @@ -0,0 +1,93 @@ +// Pure helpers for the Changes view (no React Native imports, so node:test can +// cover them). Patch parsing follows chliny's patch-compute from upstream +// PR #192 (MIT). +import type { DiffLine } from "../components/chat/diff-compute" +import type { FileDiff } from "./sdk" + +export type ChangeTab = "branch" | "git" | "turn" + +export interface ChangeTotals { + files: number + additions: number + deletions: number +} + +export function totals(diffs: FileDiff[] | undefined): ChangeTotals { + const list = diffs ?? [] + return { + files: list.length, + additions: list.reduce((sum, diff) => sum + (diff.additions || 0), 0), + deletions: list.reduce((sum, diff) => sum + (diff.deletions || 0), 0), + } +} + +// Counts for the session list and chat header: everything on the branch, or, +// on the default branch (where branch mode is empty), the uncommitted edits. +export function headline(branch: FileDiff[] | undefined, git: FileDiff[] | undefined): ChangeTotals { + if (branch && branch.length > 0) return totals(branch) + return totals(git) +} + +export function sortDiffs(diffs: FileDiff[]): FileDiff[] { + return [...diffs].sort((a, b) => a.file.localeCompare(b.file)) +} + +// Last user message, i.e. the start of the current turn. Temp (optimistic) +// ids are skipped: the server does not know them yet. +export function lastUserMessageID(messages: Array<{ id: string; role: string }>): string | undefined { + for (let i = messages.length - 1; i >= 0; i--) { + const message = messages[i] + if (message.role === "user" && !message.id.startsWith("temp-")) return message.id + } + return undefined +} + +export function splitPath(file: string): { dir: string; name: string } { + const index = file.lastIndexOf("/") + if (index === -1) return { dir: "", name: file } + return { dir: file.slice(0, index + 1), name: file.slice(index + 1) } +} + +const MAX_PATCH_LINES = 5000 + +// Unified diff (git or jsdiff output) to the DiffView line model. File +// headers (diff --git, index, ---/+++, Index:, ====) are dropped; hunk headers +// stay as context lines so the jumps between hunks remain visible. +export function parsePatch(patch: string | undefined): DiffLine[] { + if (!patch) return [] + const source = patch.split(/\r?\n/) + const lines: DiffLine[] = [] + let inHunk = false + for (const text of source) { + if (lines.length >= MAX_PATCH_LINES) { + lines.push({ type: "context", text: `… patch too large to display in full (${source.length} lines)` }) + break + } + if (text.startsWith("@@")) { + lines.push({ type: "context", text }) + inHunk = true + continue + } + if (!inHunk) continue + if (text.startsWith("diff --git ")) { + inHunk = false + continue + } + if (text.startsWith("\\")) continue + if (text.startsWith("+")) { + lines.push({ type: "add", text: text.slice(1) }) + continue + } + if (text.startsWith("-")) { + lines.push({ type: "remove", text: text.slice(1) }) + continue + } + if (text.startsWith(" ")) { + lines.push({ type: "context", text: text.slice(1) }) + continue + } + if (text === "") continue + inHunk = false + } + return lines +} diff --git a/src/lib/i18n/en.json b/src/lib/i18n/en.json index 13519f23..c0b6e9a5 100644 --- a/src/lib/i18n/en.json +++ b/src/lib/i18n/en.json @@ -451,5 +451,28 @@ "action": "Get it", "dismiss": "Not now", "upToDate": "Up to date" + }, + "changes": { + "title": "Changes", + "tabs": { + "branch": "Branch", + "git": "Uncommitted", + "turn": "This turn" + }, + "branchVs": "{{branch}} vs {{base}}", + "summary": "{{count}} files", + "empty": { + "branch": "No changes on this branch.", + "defaultBranch": "On the default branch: see Uncommitted.", + "git": "No uncommitted changes.", + "turn": "No changes in the last turn." + }, + "error": "Could not load changes: {{message}}", + "noPatch": "No diff available for this file (binary or too large).", + "status": { + "added": "added", + "deleted": "deleted", + "modified": "modified" + } } } diff --git a/src/lib/i18n/zh-Hans.json b/src/lib/i18n/zh-Hans.json index 9ba906f7..b363a210 100644 --- a/src/lib/i18n/zh-Hans.json +++ b/src/lib/i18n/zh-Hans.json @@ -451,5 +451,28 @@ "action": "去获取", "dismiss": "暂不", "upToDate": "已是最新" + }, + "changes": { + "title": "更改", + "tabs": { + "branch": "分支", + "git": "未提交", + "turn": "本轮" + }, + "branchVs": "{{branch}} 对比 {{base}}", + "summary": "{{count}} 个文件", + "empty": { + "branch": "此分支没有更改。", + "defaultBranch": "当前在默认分支:请查看“未提交”。", + "git": "没有未提交的更改。", + "turn": "上一轮没有更改。" + }, + "error": "无法加载更改:{{message}}", + "noPatch": "此文件没有可显示的差异(二进制或过大)。", + "status": { + "added": "新增", + "deleted": "删除", + "modified": "修改" + } } } diff --git a/src/lib/sdk.ts b/src/lib/sdk.ts index 89ffb68c..8d84849d 100644 --- a/src/lib/sdk.ts +++ b/src/lib/sdk.ts @@ -75,6 +75,24 @@ export interface Message { finish?: string } +// One file's change, as returned by /vcs/diff and /session/:id/diff. +export interface FileDiff { + file: string + patch?: string + additions: number + deletions: number + status?: "added" | "deleted" | "modified" +} + +// "git": working tree vs HEAD (uncommitted). "branch": working tree vs the +// merge-base with the default branch (everything on this branch). +export type VcsMode = "git" | "branch" + +export interface VcsInfo { + branch?: string + default_branch?: string +} + // API returns messages with parts embedded export interface MessageWithParts { info: Message @@ -337,6 +355,16 @@ export function createClient(config: ClientConfig) { }, }, + // Version control state of this client's directory. + vcs: { + get: () => request(config, "/vcs"), + diff: (mode: VcsMode) => { + const query = new URLSearchParams({ mode }) + if (config.directory) query.set("directory", config.directory) + return request(config, `/vcs/diff?${query.toString()}`) + }, + }, + path: { get: () => request<{ home: string; state: string; config: string; worktree: string; directory: string }>(config, "/path"), @@ -449,8 +477,8 @@ export function createClient(config: ClientConfig) { abort: (sessionID: string) => request(config, `/session/${sessionID}/abort`, { method: "POST" }), diff: (sessionID: string, messageID?: string) => { - const qs = messageID ? `?messageID=${messageID}` : "" - return request(config, `/session/${sessionID}/diff${qs}`) + const qs = messageID ? `?messageID=${encodeURIComponent(messageID)}` : "" + return request(config, `/session/${sessionID}/diff${qs}`) }, // Marks messageID (and everything after it) as pending revert. The diff --git a/src/stores/changes.ts b/src/stores/changes.ts new file mode 100644 index 00000000..ecb8a67a --- /dev/null +++ b/src/stores/changes.ts @@ -0,0 +1,98 @@ +import { useEffect, useMemo, useRef } from "react" +import { create } from "zustand" +import { useConnections } from "./connections" +import { useEvents } from "./events" +import type { FileDiff, VcsMode } from "../lib/sdk" +import { headline, type ChangeTotals } from "../lib/changes" + +// Diffs for the Changes view and the change counts in the session list and +// chat header. Branch/uncommitted diffs are per directory (every chat in a +// repo shares them); "this turn" is per session. + +export interface ChangeEntry { + diffs?: FileDiff[] + error?: string + loading: boolean + at: number +} + +const STALE_MS = 60_000 + +interface ChangesState { + entries: Record + loadVcs: (directory: string, mode: VcsMode, force?: boolean) => Promise + loadTurn: (sessionID: string, directory: string | undefined, messageID: string | undefined, force?: boolean) => Promise + // Branch + uncommitted diffs for each directory, skipping fresh entries. + prefetch: (directories: string[], force?: boolean) => Promise +} + +function base(): string { + return useConnections.getState().clientBase?.baseUrl ?? "" +} + +export function vcsKey(directory: string, mode: VcsMode): string { + return `${base()}|${mode}|${directory}` +} + +export function turnKey(sessionID: string): string { + return `${base()}|turn|${sessionID}` +} + +export const useChanges = create((set, get) => { + const load = async (key: string, force: boolean | undefined, fetch: () => Promise | null) => { + const current = get().entries[key] + if (current?.loading) return + if (!force && current && !current.error && Date.now() - current.at < STALE_MS) return + const request = fetch() + if (!request) return + set((state) => ({ entries: { ...state.entries, [key]: { ...current, loading: true, at: current?.at ?? 0 } } })) + const result = await request.then( + (diffs) => ({ diffs: Array.isArray(diffs) ? diffs : [], error: undefined }), + (err: unknown) => ({ diffs: current?.diffs, error: err instanceof Error ? err.message : String(err) }), + ) + set((state) => ({ entries: { ...state.entries, [key]: { ...result, loading: false, at: Date.now() } } })) + } + + return { + entries: {}, + + loadVcs: (directory, mode, force) => + load(vcsKey(directory, mode), force, () => { + const client = useConnections.getState().clientForDirectory(directory) + return client ? client.vcs.diff(mode) : null + }), + + loadTurn: (sessionID, directory, messageID, force) => + load(turnKey(sessionID), force, () => { + const conn = useConnections.getState() + const client = directory ? (conn.clientForDirectory(directory) ?? conn.client) : conn.client + return client ? client.session.diff(sessionID, messageID) : null + }), + + prefetch: async (directories, force) => { + const unique = [...new Set(directories.filter(Boolean))] + await Promise.all( + unique.flatMap((directory) => [get().loadVcs(directory, "branch", force), get().loadVcs(directory, "git", force)]), + ) + }, + } +}) + +export function useHeadline(directory: string | undefined): ChangeTotals | null { + const branch = useChanges((state) => (directory ? state.entries[vcsKey(directory, "branch")]?.diffs : undefined)) + const git = useChanges((state) => (directory ? state.entries[vcsKey(directory, "git")]?.diffs : undefined)) + return useMemo(() => (branch || git ? headline(branch, git) : null), [branch, git]) +} + +// Calls `run` when the session finishes a turn (busy/retry -> idle). +export function useOnTurnEnd(sessionID: string | undefined, run: () => void) { + const status = useEvents((state) => (sessionID ? state.sessionStatus[sessionID]?.type : undefined)) + const previous = useRef(status) + const latest = useRef(run) + latest.current = run + useEffect(() => { + const before = previous.current + previous.current = status + if (status === "idle" && before !== undefined && before !== "idle") latest.current() + }, [status]) +} From 065b7c6a878175f9c7dee6ecaf934cfed8dab320 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:16:55 +0000 Subject: [PATCH 14/20] feat: open a workspace from an opencode://connect link - app/connect.tsx: route target of opencode://connect?url=&name=&user=&dir=[&session=] (expo-router maps the link to /connect on cold and warm start) - known server URL: activate it, set dir as its default directory, open sessions/chat - new server: ask password once (SecureStore via addConnection), test, save, activate - lib/connect-link: parse/normalise; also accepts the intent:// form; ignores any password param - addConnection now resolves to the new id Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/connect.tsx | 216 +++++++++++++++++++++++++++++++++++ src/lib/connect-link.test.ts | 55 +++++++++ src/lib/connect-link.ts | 63 ++++++++++ src/lib/i18n/en.json | 14 +++ src/lib/i18n/zh-Hans.json | 14 +++ src/stores/connections.ts | 4 +- 6 files changed, 365 insertions(+), 1 deletion(-) create mode 100644 app/connect.tsx create mode 100644 src/lib/connect-link.test.ts create mode 100644 src/lib/connect-link.ts diff --git a/app/connect.tsx b/app/connect.tsx new file mode 100644 index 00000000..8087d397 --- /dev/null +++ b/app/connect.tsx @@ -0,0 +1,216 @@ +import { useEffect, useMemo, useRef, useState } from "react" +import { + View, + Text, + TextInput, + TouchableOpacity, + ScrollView, + StyleSheet, + useColorScheme, + ActivityIndicator, +} from "react-native" +import { Stack, router, useLocalSearchParams } from "expo-router" +import { Ionicons } from "@expo/vector-icons" +import { useTranslation } from "react-i18next" +import { useConnections } from "../src/stores/connections" +import { connectLinkFromParams, findConnection, type ConnectLink } from "../src/lib/connect-link" +import { useKeyboardHeight } from "../src/lib/use-keyboard-height" + +// Target of opencode://connect links (see src/lib/connect-link.ts). A known +// server is activated without questions; a new one asks for its password once, +// which then lives in SecureStore like any other connection's. +export default function ConnectScreen() { + const params = useLocalSearchParams() + const link = useMemo(() => connectLinkFromParams(params), [JSON.stringify(params)]) + const isDark = useColorScheme() === "dark" + const { t } = useTranslation() + const keyboardHeight = useKeyboardHeight() + + const existing = useConnections((s) => (link ? findConnection(s.connections, link.url) : undefined)) + const [name, setName] = useState(link?.name ?? "") + const [user, setUser] = useState(link?.user ?? "opencode") + const [password, setPassword] = useState("") + const [busy, setBusy] = useState(false) + const [error, setError] = useState(null) + const started = useRef(false) + + // Known server: switch to it right away. + useEffect(() => { + if (!link || !existing || started.current) return + started.current = true + void activateExisting(existing.id, link) + }, [link, existing]) + + const onConnect = async () => { + if (!link || busy) return + // The store update below makes `existing` match; don't let the effect + // above activate (and navigate) a second time. + started.current = true + setBusy(true) + setError(null) + const store = useConnections.getState() + const connection = { + name: name.trim() || link.name || hostOf(link.url), + type: "tunnel" as const, + url: link.url, + username: user.trim() || undefined, + directory: link.dir, + } + const result = await store.testConnection({ id: "", ...connection }, "onboarding", password || undefined) + if (!result.ok) { + started.current = false + setBusy(false) + setError(result.error || t("connect.failed")) + return + } + const id = await store.addConnection(connection, password || undefined) + await useConnections.getState().setActiveConnection(id) + open(link) + } + + if (!link) { + return ( + + + + {t("connect.invalid")} + router.replace("/")}> + {t("connect.home")} + + + ) + } + + if (existing) { + return ( + + + + {t("connect.opening", { name: existing.name })} + + ) + } + + return ( + + + + {t("connect.newIntro")} + + {t("connect.server")} + + {link.url} + + {link.dir && ( + <> + {t("connect.directory")} + + {link.dir} + + + )} + + {t("connect.name")} + + + {t("connect.user")} + + + {t("connect.password")} + + + {error && {error}} + + + {busy ? ( + + ) : ( + {t("connect.submit")} + )} + + + + ) +} + +async function activateExisting(id: string, link: ConnectLink) { + const store = useConnections.getState() + const current = store.connections.find((c) => c.id === id) + if (link.dir && current?.directory !== link.dir) await store.updateConnection(id, { directory: link.dir }) + if (useConnections.getState().activeConnection?.id !== id) await useConnections.getState().setActiveConnection(id) + open(link) +} + +// Sessions list, then the chat when the link names one. +function open(link: ConnectLink) { + router.replace("/") + if (!link.session) return + router.push({ pathname: "/session/[id]", params: { id: link.session, ...(link.dir ? { directory: link.dir } : {}) } }) +} + +function hostOf(url: string): string { + return url.replace(/^https?:\/\//, "").split("/")[0] +} + +const s = StyleSheet.create({ + container: { flex: 1, backgroundColor: "#ffffff" }, + containerDark: { backgroundColor: "#0a0a0a" }, + center: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16, padding: 24, backgroundColor: "#ffffff" }, + content: { padding: 16, paddingBottom: 32 }, + intro: { fontSize: 15, color: "#0a0a0a", marginBottom: 8 }, + hint: { fontSize: 14, color: "#666666", textAlign: "center" }, + label: { fontSize: 13, fontWeight: "600", color: "#666666", marginTop: 16, marginBottom: 6 }, + value: { fontSize: 14, color: "#0a0a0a" }, + textDark: { color: "#ffffff" }, + metaDark: { color: "#888888" }, + input: { + borderWidth: 1, + borderColor: "#e5e5e5", + borderRadius: 8, + padding: 12, + fontSize: 16, + color: "#0a0a0a", + backgroundColor: "#ffffff", + }, + inputDark: { borderColor: "#333333", color: "#ffffff", backgroundColor: "#1a1a1a" }, + error: { color: "#ef4444", fontSize: 13, marginTop: 12 }, + button: { + marginTop: 24, + backgroundColor: "#0a0a0a", + borderRadius: 8, + padding: 14, + alignItems: "center", + alignSelf: "stretch", + }, + buttonDark: { backgroundColor: "#ffffff" }, + buttonDisabled: { opacity: 0.6 }, + buttonText: { color: "#ffffff", fontSize: 16, fontWeight: "600" }, + buttonTextDark: { color: "#0a0a0a" }, +}) diff --git a/src/lib/connect-link.test.ts b/src/lib/connect-link.test.ts new file mode 100644 index 00000000..8547f3c7 --- /dev/null +++ b/src/lib/connect-link.test.ts @@ -0,0 +1,55 @@ +import { test } from "node:test" +import assert from "node:assert/strict" +import { connectLinkFromParams, findConnection, normalizeServerUrl, parseConnectLink } from "./connect-link.ts" + +const url = encodeURIComponent("https://Ruby-DCB.tail1234.ts.net/ws/alpha/") + +test("parses the opencode:// form", () => { + assert.deepEqual(parseConnectLink(`opencode://connect?url=${url}&name=alpha&user=opencode&dir=%2Fhome%2Fwork%2Frepo%2F&session=ses_1`), { + url: "https://ruby-dcb.tail1234.ts.net/ws/alpha", + name: "alpha", + user: "opencode", + dir: "/home/work/repo", + session: "ses_1", + }) +}) + +test("parses the intent:// form only when it targets the opencode scheme", () => { + const link = `intent://connect?url=${url}&name=alpha#Intent;scheme=opencode;package=it.kjeldahl.opencode;end` + assert.equal(parseConnectLink(link)?.url, "https://ruby-dcb.tail1234.ts.net/ws/alpha") + assert.equal(parseConnectLink(`intent://connect?url=${url}#Intent;scheme=https;end`), null) +}) + +test("rejects links without a usable http(s) url", () => { + assert.equal(parseConnectLink("opencode://connect?name=alpha"), null) + assert.equal(parseConnectLink("opencode://connect?url=ftp%3A%2F%2Fhost"), null) + assert.equal(parseConnectLink("opencode://session/abc"), null) +}) + +test("ignores a password parameter", () => { + const link = parseConnectLink(`opencode://connect?url=${url}&password=secret`) + assert.ok(link) + assert.equal(Object.values(link).includes("secret"), false) +}) + +test("reads expo-router params, empty values as absent", () => { + assert.deepEqual(connectLinkFromParams({ url: "http://10.0.0.2:4096", name: "", dir: ["/repo", "/other"] }), { + url: "http://10.0.0.2:4096", + name: undefined, + user: undefined, + dir: "/repo", + session: undefined, + }) +}) + +test("normalizeServerUrl drops trailing slash, query and fragment", () => { + assert.equal(normalizeServerUrl("HTTP://Host:4096/"), "http://host:4096") + assert.equal(normalizeServerUrl("https://host/a/b/?x=1#y"), "https://host/a/b") + assert.equal(normalizeServerUrl("host:4096"), null) +}) + +test("findConnection matches stored urls after normalising", () => { + const list = [{ id: "a", url: "http://host:4096/" }, { id: "b", url: "https://other" }] + assert.equal(findConnection(list, "http://host:4096")?.id, "a") + assert.equal(findConnection(list, "https://none"), undefined) +}) diff --git a/src/lib/connect-link.ts b/src/lib/connect-link.ts new file mode 100644 index 00000000..c84337d2 --- /dev/null +++ b/src/lib/connect-link.ts @@ -0,0 +1,63 @@ +// Workspace links from the forge hub: +// opencode://connect?url=&name=&user=opencode&dir=[&session=] +// Chrome opens the intent:// form reliably (and only in this app, via package=): +// intent://connect?url=...#Intent;scheme=opencode;package=it.kjeldahl.opencode;end +// Android hands the app the opencode:// form either way; the intent form is +// accepted here too so a pasted or forwarded link still works. The password is +// never part of a link. + +export interface ConnectLink { + url: string + name?: string + user?: string + dir?: string + session?: string +} + +export const APP_PACKAGE = "it.kjeldahl.opencode" + +type Params = Record + +function first(value: string | string[] | undefined): string | undefined { + const raw = Array.isArray(value) ? value[0] : value + const trimmed = raw?.trim() + return trimmed ? trimmed : undefined +} + +// Base URL normalised for comparison and storage: lower-case scheme and host, +// no trailing slash, no query or fragment. Null for anything but http(s). +export function normalizeServerUrl(raw: string | undefined): string | null { + const match = raw?.trim().match(/^(https?):\/\/([^/?#]+)([^?#]*)/i) + if (!match) return null + const path = match[3].replace(/\/+$/, "") + return `${match[1].toLowerCase()}://${match[2].toLowerCase()}${path}` +} + +// From expo-router search params (the /connect route). +export function connectLinkFromParams(params: Params): ConnectLink | null { + const url = normalizeServerUrl(first(params.url)) + if (!url) return null + return { + url, + name: first(params.name), + user: first(params.user), + dir: first(params.dir)?.replace(/\/+$/, "") || undefined, + session: first(params.session), + } +} + +// From a raw link string (opencode:// or intent://). +export function parseConnectLink(link: string): ConnectLink | null { + const match = link.trim().match(/^(opencode|intent):\/\/connect\/?\?([^#]*)(#.*)?$/i) + if (!match) return null + if (match[1].toLowerCase() === "intent" && !/;scheme=opencode;/i.test(match[3] ?? "")) return null + const params: Params = {} + for (const [key, value] of new URLSearchParams(match[2])) { + if (params[key] === undefined) params[key] = value + } + return connectLinkFromParams(params) +} + +export function findConnection(connections: T[], url: string): T | undefined { + return connections.find((connection) => normalizeServerUrl(connection.url) === url) +} diff --git a/src/lib/i18n/en.json b/src/lib/i18n/en.json index c0b6e9a5..54a807c4 100644 --- a/src/lib/i18n/en.json +++ b/src/lib/i18n/en.json @@ -474,5 +474,19 @@ "deleted": "deleted", "modified": "modified" } + }, + "connect": { + "title": "Open workspace", + "newIntro": "Add this workspace. The password is asked once and stored on this phone.", + "server": "Server", + "directory": "Repository", + "name": "Name", + "user": "Username", + "password": "Password", + "submit": "Connect", + "failed": "Could not connect.", + "opening": "Opening {{name}}…", + "invalid": "This link has no valid server URL.", + "home": "Go to sessions" } } diff --git a/src/lib/i18n/zh-Hans.json b/src/lib/i18n/zh-Hans.json index b363a210..063d95df 100644 --- a/src/lib/i18n/zh-Hans.json +++ b/src/lib/i18n/zh-Hans.json @@ -474,5 +474,19 @@ "deleted": "删除", "modified": "修改" } + }, + "connect": { + "title": "打开工作区", + "newIntro": "添加此工作区。密码只需输入一次,并保存在本机。", + "server": "服务器", + "directory": "仓库", + "name": "名称", + "user": "用户名", + "password": "密码", + "submit": "连接", + "failed": "无法连接。", + "opening": "正在打开 {{name}}…", + "invalid": "此链接没有有效的服务器地址。", + "home": "前往会话" } } diff --git a/src/stores/connections.ts b/src/stores/connections.ts index 2fb33de5..f9b6d8ab 100644 --- a/src/stores/connections.ts +++ b/src/stores/connections.ts @@ -38,7 +38,8 @@ interface ConnectionsState { // Actions loadConnections: () => Promise - addConnection: (connection: Omit, password?: string) => Promise + // Resolves to the new connection id. + addConnection: (connection: Omit, password?: string) => Promise removeConnection: (id: string) => Promise setActiveConnection: (id: string) => Promise // `source` distinguishes the activation funnel (onboarding) from the edit @@ -183,6 +184,7 @@ export const useConnections = create((set, get) => ({ } set({ connections, activeConnection, client, clientBase: base, currentProject: project, serverHome }) + return id }, removeConnection: async (id) => { From e2a0ec789dc7cb4de7ee5447e5f1db57b0d604ab Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:18:47 +0000 Subject: [PATCH 15/20] feat: new chats start in the right repo - fix: server projects carry `worktree`, not `path.absolute`; picking a server project created the chat in the default dir (Project type + lib/projects.projectDir) - new-chat sheet lists server projects first, git repos before the rest; non-git ones marked "no change tracking"; global "/" project hidden - FAB "New chat": connection default dir, else last-used project Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/(tabs)/index.tsx | 140 +++++++++++++++++++++----------------- src/lib/i18n/en.json | 3 +- src/lib/i18n/zh-Hans.json | 3 +- src/lib/projects.test.ts | 35 ++++++++++ src/lib/projects.ts | 39 +++++++++++ src/lib/sdk.ts | 8 ++- 6 files changed, 163 insertions(+), 65 deletions(-) create mode 100644 src/lib/projects.test.ts create mode 100644 src/lib/projects.ts diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 9f877410..49747e13 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -30,6 +30,7 @@ import { DirectorySwitcher, DirectoryBrowserSheet } from "../../src/components/c import { groupByDirectory } from "../../src/lib/session-grouping" import { UpdateBanner } from "../../src/components/UpdateBanner" import { nameOf } from "../../src/lib/path-utils" +import { newChatDir, newChatProjects, projectDir, projectName, tracksChanges } from "../../src/lib/projects" import { SETUP_GUIDE_URL } from "../../src/lib/links" function formatTime(timestamp: number, t: (key: string, opts?: Record) => string): string { @@ -150,14 +151,10 @@ function GroupHeader({ } // Get short directory name (last folder or project name) -function getShortPath( - project: { path?: { cwd?: string; root?: string; absolute?: string }; name?: string } | null | undefined, -): string { +function getShortPath(project: Project | null | undefined): string { if (!project) return "" if (project.name) return project.name - if (!project.path?.absolute) return "" - const parts = project.path.absolute.split("/").filter(Boolean) - return parts[parts.length - 1] || project.path.absolute + return projectDir(project)?.split("/").filter(Boolean).pop() || projectDir(project) || "" } export default function SessionsScreen() { @@ -244,6 +241,10 @@ export default function SessionsScreen() { .catch(() => setServerProjects([])) }, [showNewSession, client]) + const projects = useMemo(() => newChatProjects(serverProjects), [serverProjects]) + const projectDirs = useMemo(() => new Set(projects.map((p) => projectDir(p))), [projects]) + const currentDir = projectDir(currentProject) || activeConnection?.directory + const handleSwitchDirectory = useCallback( async (dir?: string) => { await switchDirectory(dir) @@ -438,7 +439,13 @@ export default function SessionsScreen() { }, []) const onFabPress = () => { - // Quick create in current project + // Quick create: the connection's default directory (set by workspace + // links), else the last project a chat was started in. + const dir = newChatDir(activeConnection?.directory, recentDirectories) + if (dir && dir !== activeConnection?.directory) { + onCreateInDirectory(dir) + return + } onCreateSession() } @@ -620,32 +627,75 @@ export default function SessionsScreen() { - {/* Current directory — tapping creates session immediately */} - - {t("sessionsList.newSessionModal.currentProjectLabel")} - - onCreateInDirectory()} - disabled={isCreating} - > - - - {currentProject?.path?.absolute || activeConnection?.directory || t("sessionsList.newSessionModal.serverDefault")} - - - + {/* Server projects first: git repos (change tracking) before the rest */} + {projects.length > 0 && ( + <> + + {t("sessionsList.newSessionModal.serverProjectsLabel")} + + {projects.map((p) => { + const dir = projectDir(p) + const isCurrent = dir === currentDir + return ( + onCreateInDirectory(dir)} + disabled={isCreating} + testID={`new-chat-project-${p.id}`} + > + + + + {projectName(p)} + + + {tracksChanges(p) ? dir : `${dir} · ${t("sessionsList.newSessionModal.noChangeTracking")}`} + + + {isCurrent && } + + ) + })} + + )} + + {/* Current directory, when it is not one of the projects above */} + {!projectDirs.has(currentDir ?? "") && ( + <> + 0 && { marginTop: 16 }]}> + {t("sessionsList.newSessionModal.currentProjectLabel")} + + onCreateInDirectory()} + disabled={isCreating} + > + + + {currentDir || t("sessionsList.newSessionModal.serverDefault")} + + + + + )} {/* Recent projects */} - {recentDirectories.length > 0 && ( + {recentDirectories.some((dir) => !projectDirs.has(dir)) && ( <> {t("sessionsList.newSessionModal.recentProjectsLabel")} - {recentDirectories.map((dir) => { + {recentDirectories.filter((dir) => !projectDirs.has(dir)).map((dir) => { const short = dir.split("/").filter(Boolean).pop() || dir - const isCurrent = - dir === (currentProject?.path?.absolute || activeConnection?.directory) + const isCurrent = dir === currentDir return ( )} - {/* Server-known projects (excluding current) */} - {serverProjects.filter((p) => p.path?.absolute !== currentProject?.path?.absolute).length > 0 && ( - <> - - {t("sessionsList.newSessionModal.serverProjectsLabel")} - - {serverProjects - .filter((p) => p.path?.absolute !== currentProject?.path?.absolute) - .map((p) => { - const short = p.name || p.path?.absolute?.split("/").filter(Boolean).pop() || p.id - return ( - onCreateInDirectory(p.path?.absolute)} - disabled={isCreating} - > - - - - {short} - - {p.path?.absolute && ( - - {p.path.absolute} - - )} - - - ) - })} - - )} - {/* Browse the server's filesystem instead of typing a path */} - openBrowser(currentProject?.path?.absolute || activeConnection?.directory || null, "create") + openBrowser(projectDir(currentProject) || activeConnection?.directory || null, "create") } disabled={isCreating} testID="browse-folders-button" @@ -875,7 +891,7 @@ export default function SessionsScreen() { isDark={isDark} onSwitch={handleSwitchDirectory} onBrowse={() => - openBrowser(activeConnection?.directory || currentProject?.path?.absolute || null, "switch") + openBrowser(activeConnection?.directory || projectDir(currentProject) || null, "switch") } /> diff --git a/src/lib/i18n/en.json b/src/lib/i18n/en.json index 54a807c4..1b57c616 100644 --- a/src/lib/i18n/en.json +++ b/src/lib/i18n/en.json @@ -285,7 +285,8 @@ "browseFoldersHint": "Explore the server's filesystem", "enterPathLabel": "Enter Path Manually", "createInButton": "Create in {{dir}}", - "createSessionButton": "Create Session" + "createSessionButton": "Create Session", + "noChangeTracking": "no change tracking" }, "renameModal": { "title": "Rename Session" diff --git a/src/lib/i18n/zh-Hans.json b/src/lib/i18n/zh-Hans.json index 063d95df..b06d1300 100644 --- a/src/lib/i18n/zh-Hans.json +++ b/src/lib/i18n/zh-Hans.json @@ -285,7 +285,8 @@ "browseFoldersHint": "浏览服务器的文件系统", "enterPathLabel": "手动输入路径", "createInButton": "在 {{dir}} 中创建", - "createSessionButton": "创建会话" + "createSessionButton": "创建会话", + "noChangeTracking": "无更改跟踪" }, "renameModal": { "title": "重命名会话" diff --git a/src/lib/projects.test.ts b/src/lib/projects.test.ts new file mode 100644 index 00000000..3111c873 --- /dev/null +++ b/src/lib/projects.test.ts @@ -0,0 +1,35 @@ +import { test } from "node:test" +import assert from "node:assert/strict" +import { newChatDir, newChatProjects, projectDir, projectName, tracksChanges } from "./projects.ts" + +const project = (id: string, worktree: string, extra: Record = {}) => ({ id, worktree, ...extra }) + +test("projectDir reads worktree, falls back to the legacy path shape", () => { + assert.equal(projectDir(project("a", "/home/u/repo/")), "/home/u/repo") + assert.equal(projectDir({ id: "b", path: { cwd: "", root: "", absolute: "/old" } }), "/old") + assert.equal(projectDir(project("g", "/")), undefined) + assert.equal(projectDir(null), undefined) +}) + +test("projectName prefers the name, then the last path segment", () => { + assert.equal(projectName(project("a", "/home/u/repo", { name: "Repo" })), "Repo") + assert.equal(projectName(project("a", "/home/u/repo")), "repo") + assert.equal(projectName({ id: "x" }), "x") +}) + +test("newChatProjects drops the global project and lists git repos first", () => { + const list = [ + project("global", "/"), + project("work", "/home/u/work", { time: { created: 0, updated: 9 } }), + project("old", "/home/u/old", { vcs: "git", time: { created: 0, updated: 1 } }), + project("new", "/home/u/new", { vcs: "git", time: { created: 0, updated: 5 } }), + ] + assert.deepEqual(newChatProjects(list).map((p) => p.id), ["new", "old", "work"]) + assert.equal(tracksChanges(list[1]), false) +}) + +test("newChatDir: connection default, then last used, then server default", () => { + assert.equal(newChatDir("/repo", ["/recent"]), "/repo") + assert.equal(newChatDir(undefined, ["/recent", "/older"]), "/recent") + assert.equal(newChatDir(undefined, []), undefined) +}) diff --git a/src/lib/projects.ts b/src/lib/projects.ts new file mode 100644 index 00000000..20467b9c --- /dev/null +++ b/src/lib/projects.ts @@ -0,0 +1,39 @@ +// Project helpers for the new-chat sheet (pure; see projects.test.ts). +import type { Project } from "./sdk" + +// The project's directory. Undefined for the server's catch-all "global" +// project (worktree "/"), which is not a place to start a chat. +export function projectDir(project: Project | null | undefined): string | undefined { + const dir = (project?.worktree || project?.path?.absolute)?.replace(/\/+$/, "") + return dir || undefined +} + +export function projectName(project: Project): string { + const dir = projectDir(project) + return project.name || dir?.split("/").filter(Boolean).pop() || project.id +} + +// Without git the server tracks no changes (no Changes view, no counts). +export function tracksChanges(project: Project): boolean { + return project.vcs === "git" +} + +// Projects a new chat can start in: git repos first (most recently updated +// first), then the rest. +export function newChatProjects(projects: Project[]): Project[] { + return projects + .filter((project) => !!projectDir(project)) + .sort((a, b) => { + const git = Number(tracksChanges(b)) - Number(tracksChanges(a)) + if (git !== 0) return git + const time = (b.time?.updated ?? 0) - (a.time?.updated ?? 0) + if (time !== 0) return time + return projectName(a).localeCompare(projectName(b)) + }) +} + +// Plain "New chat": the connection's default directory, else the last project +// a chat was started in, else the server's own default (undefined). +export function newChatDir(connectionDir: string | undefined, recent: string[]): string | undefined { + return connectionDir || recent[0] || undefined +} diff --git a/src/lib/sdk.ts b/src/lib/sdk.ts index 8d84849d..cf6de5b3 100644 --- a/src/lib/sdk.ts +++ b/src/lib/sdk.ts @@ -163,10 +163,16 @@ export interface Command { hints: string[] } +// Server shape is { id, worktree, vcs?, name?, time }. `path` is the shape this +// client used to assume; kept optional for older servers. Read the directory +// with projectDir() from ./projects. export interface Project { id: string name?: string - path: { + worktree?: string + vcs?: "git" + time?: { created: number; updated: number; initialized?: number } + path?: { cwd: string root: string absolute: string From fc98328e142e6f54a646d7a70852860e7bb9aeac Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:20:23 +0000 Subject: [PATCH 16/20] Drop leftover waitlist/telemetry strings; add forge fork notes Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/demo.tsx | 9 -------- docs/forge.md | 26 ++++++++++++++++++++++ src/lib/i18n/en.json | 46 +-------------------------------------- src/lib/i18n/zh-Hans.json | 46 +-------------------------------------- 4 files changed, 28 insertions(+), 99 deletions(-) create mode 100644 docs/forge.md diff --git a/app/demo.tsx b/app/demo.tsx index 6a590304..8ab03c0f 100644 --- a/app/demo.tsx +++ b/app/demo.tsx @@ -85,13 +85,6 @@ export default function DemoScreen() { > {t("demo.connectButton")} - - {t("demo.hostedCtaLink")} - Linking.openURL(SETUP_GUIDE_URL)} @@ -147,8 +140,6 @@ const s = StyleSheet.create({ alignItems: "center", }, connectButtonText: { color: "#ffffff", fontWeight: "600", fontSize: 15 }, - hostedCtaLink: { marginTop: 14 }, - hostedCtaLinkText: { fontSize: 14, fontWeight: "600", color: "#8b5cf6", textAlign: "center" }, setupGuideLink: { marginTop: 14 }, setupGuideLinkText: { fontSize: 14, fontWeight: "600", color: "#6366f1" }, }) diff --git a/docs/forge.md b/docs/forge.md new file mode 100644 index 00000000..b303a790 --- /dev/null +++ b/docs/forge.md @@ -0,0 +1,26 @@ +# OpenCode forge (fork notes) + +App ID `it.kjeldahl.opencode`, name "OpenCode forge"; installs next to the store app. +No telemetry: Sentry, PostHog, Chatwoot and the waitlist are removed. The update +banner checks `kjeldahl/opencode-mobile` releases, so tag `vX.Y.Z` = `app.json` version. + +## Workspace links (hub "Open in app") + +``` +opencode://connect?url=&name=&user=opencode&dir=[&session=] +intent://connect?url=...&name=...&user=...&dir=...#Intent;scheme=opencode;package=it.kjeldahl.opencode;end +``` + +- URL-encode every value. Never put the password in the link. +- Use the `intent://` form in web pages: Chrome opens it reliably and it targets this + app even when the store app (same `opencode` scheme) is installed. +- Known `url`: the app activates that connection, makes `dir` its default directory, + opens Sessions (or the chat when `session` is given). +- New `url`: the app asks for the password once (stored in SecureStore), tests, saves. + +## Changes view + +Per chat: Branch (`/vcs/diff?mode=branch`), Uncommitted (`/vcs/diff?mode=git`), +This turn (`/session//diff?messageID=`). Session list and chat +header counts come from the branch diff (uncommitted on the default branch), not +from `session.summary`. diff --git a/src/lib/i18n/en.json b/src/lib/i18n/en.json index 1b57c616..32bad586 100644 --- a/src/lib/i18n/en.json +++ b/src/lib/i18n/en.json @@ -12,7 +12,6 @@ "sections": { "security": "Security", "notifications": "Notifications", - "privacy": "Privacy", "about": "About" }, "security": { @@ -33,16 +32,6 @@ "notifications": { "disabledNotice": "Notifications are disabled at the system level. Enable them in Settings to receive alerts." }, - "privacy": { - "crashReporting": { - "label": "Crash Reports & Usage Analytics", - "description": "Share anonymous crash reports (Sentry) and usage analytics (PostHog) to help improve OpenCode. Diagnostic reports you share are also delivered to our support inbox. No code or prompts are included." - }, - "privacyPolicy": { - "label": "Privacy Policy", - "description": "What data we collect and how" - } - }, "about": { "version": "Version", "github": { @@ -66,8 +55,6 @@ "tagline": "Connect to your AI coding assistant from anywhere" }, "alerts": { - "privacyNotSavedTitle": "Privacy Setting Not Saved", - "privacyNotSavedMessage": "Crash reporting is off for this session, but your choice could not be saved. Please try again.", "notificationsDisabledTitle": "Notifications Disabled", "notificationsDisabledMessage": "Enable notifications for OpenCode in your device settings to receive alerts." } @@ -172,21 +159,8 @@ "helpProtocolMiddle": " for local and Tailscale addresses unless TLS is configured, then use ", "helpProtocolSuffix": ".", "helpRunningPrefix": "Make sure OpenCode is running:", - "connectCardTitle": "OpenCode Connect", - "connectCardBadge": "Coming Soon", - "connectCardDesc": "Bridge your phone to your opencode server — no tunnel setup, no firewall config. One-tap connect from anywhere.", "advancedLink": "Advanced options (tunnels, cloud, auth)" }, - "waitlist": { - "successText": "You're on the list — we'll email you when OpenCode Connect is ready.", - "joinButton": "Join Waitlist", - "alertTitle": "Join Waitlist", - "queuedText": "Saved on this device — we'll finish signing you up as soon as you're back online. You don't have to do anything.", - "emailUsLink": "Still not working? Email us instead", - "emailUsButton": "Email us", - "queueFailedMessage": "We couldn't reach the signup service or save your request on this device. You can email us instead and we'll add you by hand.", - "noMailAppMessage": "No email app is available. Please email support@agentlabs.cc with subject \"OpenCode Connect Waitlist\"." - }, "advanced": { "backToQuick": "Simple mode", "urlHintPrefix": "Local/Tailscale examples: ", @@ -326,23 +300,6 @@ "shareButton": "Share Report", "tryAgainButton": "Try Again" }, - "telemetryConsent": { - "title": "Help improve OpenCode?", - "body": "Share anonymous crash reports and usage analytics to help us find and fix bugs faster. Diagnostic reports you share are also delivered to our support inbox. No code, prompts, or server addresses are ever included.", - "bullets": { - "deviceInfo": "Device model, OS version, app version", - "stackTraces": "Stack traces of crashes (no variable values)", - "usageEvents": "Anonymous usage events (app opened, connection attempts, messages sent) — sent to PostHog EU", - "noCode": "Your code, prompts, or chat messages", - "noServerUrls": "Server URLs or authentication tokens" - }, - "privacyLink": "Read our full privacy policy", - "declineA11yLabel": "No thanks, decline crash reporting and analytics", - "declineButton": "No thanks", - "allowA11yLabel": "Allow anonymous crash reports and usage analytics", - "allowButton": "Allow", - "footnote": "You can change this at any time in Settings → Privacy." - }, "authGate": { "title": "OpenCode Locked", "subtitle": "Authenticate to access your sessions", @@ -443,8 +400,7 @@ "ctaTitle": "Like what you see?", "ctaSubtitle": "This was a scripted demo. Connect your own opencode server to do this for real.", "connectButton": "Connect your own server", - "setupGuideLink": "How to set up a server", - "hostedCtaLink": "No server? Join the OpenCode Connect waitlist — hosted, no setup" + "setupGuideLink": "How to set up a server" }, "update": { "available": "Update available", diff --git a/src/lib/i18n/zh-Hans.json b/src/lib/i18n/zh-Hans.json index b06d1300..d2b8165f 100644 --- a/src/lib/i18n/zh-Hans.json +++ b/src/lib/i18n/zh-Hans.json @@ -12,7 +12,6 @@ "sections": { "security": "安全", "notifications": "通知", - "privacy": "隐私", "about": "关于" }, "security": { @@ -33,16 +32,6 @@ "notifications": { "disabledNotice": "通知已在系统层面关闭。请在系统设置中启用通知以接收提醒。" }, - "privacy": { - "crashReporting": { - "label": "崩溃报告与使用分析", - "description": "分享匿名崩溃报告(Sentry)和使用分析(PostHog),帮助改进 OpenCode。您分享的诊断报告也会发送至我们的支持收件箱。不包含代码或提示词内容。" - }, - "privacyPolicy": { - "label": "隐私政策", - "description": "我们收集哪些数据及收集方式" - } - }, "about": { "version": "版本", "github": { @@ -66,8 +55,6 @@ "tagline": "随时随地连接您的 AI 编程助手" }, "alerts": { - "privacyNotSavedTitle": "隐私设置未保存", - "privacyNotSavedMessage": "本次会话已关闭崩溃报告,但您的选择未能保存。请重试。", "notificationsDisabledTitle": "通知已关闭", "notificationsDisabledMessage": "请在设备设置中为 OpenCode 启用通知以接收提醒。" } @@ -172,21 +159,8 @@ "helpProtocolMiddle": ",除非已配置 TLS,此时请使用 ", "helpProtocolSuffix": "。", "helpRunningPrefix": "请确保 OpenCode 正在运行:", - "connectCardTitle": "OpenCode Connect", - "connectCardBadge": "即将上线", - "connectCardDesc": "将手机桥接到您的 opencode 服务器 — 无需配置隧道或防火墙。一键连接,随时随地。", "advancedLink": "高级选项(隧道、云端、身份验证)" }, - "waitlist": { - "successText": "您已加入候补名单 — OpenCode Connect 准备就绪时我们会通过邮件通知您。", - "joinButton": "加入候补名单", - "alertTitle": "加入候补名单", - "queuedText": "已保存在此设备上 — 联网后我们会自动完成注册,你无需再做任何操作。", - "emailUsLink": "仍然无法注册?改为给我们发邮件", - "emailUsButton": "发送邮件", - "queueFailedMessage": "无法连接注册服务,也无法在此设备上保存你的请求。你可以改为给我们发邮件,我们会手动将你加入名单。", - "noMailAppMessage": "没有可用的邮件应用。请发送邮件至 support@agentlabs.cc,主题为 \"OpenCode Connect Waitlist\"。" - }, "advanced": { "backToQuick": "简易模式", "urlHintPrefix": "本地/Tailscale 示例:", @@ -326,23 +300,6 @@ "shareButton": "分享报告", "tryAgainButton": "重试" }, - "telemetryConsent": { - "title": "帮助改进 OpenCode?", - "body": "分享匿名崩溃报告和使用分析,帮助我们更快地发现并修复问题。您分享的诊断报告也会发送至我们的支持收件箱。绝不包含代码、提示词或服务器地址。", - "bullets": { - "deviceInfo": "设备型号、系统版本、应用版本", - "stackTraces": "崩溃堆栈跟踪(不含变量值)", - "usageEvents": "匿名使用事件(打开应用、连接尝试、发送消息)— 发送至 PostHog EU", - "noCode": "您的代码、提示词或聊天消息", - "noServerUrls": "服务器地址或身份验证令牌" - }, - "privacyLink": "阅读完整隐私政策", - "declineA11yLabel": "不用了,拒绝崩溃报告和使用分析", - "declineButton": "不用了", - "allowA11yLabel": "允许匿名崩溃报告和使用分析", - "allowButton": "允许", - "footnote": "您可以随时在设置 → 隐私中更改此设置。" - }, "authGate": { "title": "OpenCode 已锁定", "subtitle": "请验证身份以访问您的会话", @@ -443,8 +400,7 @@ "ctaTitle": "喜欢这个体验吗?", "ctaSubtitle": "这是一个脚本化的演示。连接您自己的 opencode 服务器即可真正体验。", "connectButton": "连接您自己的服务器", - "setupGuideLink": "如何设置服务器", - "hostedCtaLink": "没有服务器?加入 OpenCode Connect 候补名单 — 托管,无需搭建" + "setupGuideLink": "如何设置服务器" }, "update": { "available": "有可用更新", From 7f11378af84fcefec64d5657e377f44bd41f5c49 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:30:56 +0000 Subject: [PATCH 17/20] Changes: always send the chat's directory; Branch tab only off default branch - vcs.get / vcs.diff / session.diff put directory in the query; store never fetches without one (server would answer for ~/work) - Changes screen + header use session.directory of this chat, not a stale one - /vcs per directory decides: Branch tab and branch counts only when branch != default_branch (same as web app); else Uncommitted Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/changes/[id].tsx | 59 +++++++++++++++++++++------------------ app/session/[id].tsx | 2 +- docs/forge.md | 8 ++++-- src/lib/changes.test.ts | 19 +++++++++---- src/lib/changes.ts | 17 +++++++---- src/lib/i18n/en.json | 4 +-- src/lib/i18n/zh-Hans.json | 4 +-- src/lib/sdk.ts | 16 ++++++++--- src/stores/changes.ts | 42 ++++++++++++++++++++++------ 9 files changed, 112 insertions(+), 59 deletions(-) diff --git a/app/changes/[id].tsx b/app/changes/[id].tsx index 1b3a5807..5828ea7e 100644 --- a/app/changes/[id].tsx +++ b/app/changes/[id].tsx @@ -3,69 +3,70 @@ import { View, Text, FlatList, TouchableOpacity, StyleSheet, useColorScheme, Ref import { Stack, router, useLocalSearchParams } from "expo-router" import { Ionicons } from "@expo/vector-icons" import { useTranslation } from "react-i18next" -import { useChanges, useOnTurnEnd, turnKey, vcsKey } from "../../src/stores/changes" -import { useConnections } from "../../src/stores/connections" +import { useChanges, useOnTurnEnd, infoKey, turnKey, vcsKey } from "../../src/stores/changes" import { useSessions } from "../../src/stores/sessions" -import { lastUserMessageID, sortDiffs, splitPath, totals, type ChangeTab } from "../../src/lib/changes" -import type { FileDiff, VcsInfo } from "../../src/lib/sdk" +import { branchOffered, lastUserMessageID, sortDiffs, splitPath, totals, type ChangeTab } from "../../src/lib/changes" +import type { FileDiff } from "../../src/lib/sdk" const TABS: ChangeTab[] = ["branch", "git", "turn"] export default function ChangesScreen() { - const { id, directory, tab: initial } = useLocalSearchParams<{ id: string; directory?: string; tab?: ChangeTab }>() + const params = useLocalSearchParams<{ id: string; directory?: string; tab?: ChangeTab }>() + const id = params.id const isDark = useColorScheme() === "dark" const { t } = useTranslation() - const [tab, setTab] = useState(initial && TABS.includes(initial) ? initial : "branch") - const [info, setInfo] = useState(null) + // The chat's own folder. Never fall back to no directory: the server would + // answer for its default folder, i.e. silently the wrong repo. + const directory = useSessions((s) => (s.currentSession?.id === id ? s.currentSession.directory : undefined)) || params.directory || undefined const messageID = useSessions((s) => (s.currentSession?.id === id ? lastUserMessageID(s.messages) : undefined)) - const { loadVcs, loadTurn } = useChanges() + const info = useChanges((s) => (directory ? s.info[infoKey(directory)] : undefined)) + const { loadInfo, loadVcs, loadTurn } = useChanges() + + // Branch is offered only off the default branch (same rule as the web app). + const tabs = branchOffered(info) ? TABS : TABS.filter((item) => item !== "branch") + const [picked, setPicked] = useState(params.tab) + const tab = picked && tabs.includes(picked) ? picked : tabs[0] + const key = tab === "turn" ? turnKey(id) : directory ? vcsKey(directory, tab) : "" const entry = useChanges((s) => s.entries[key]) const load = useCallback( (which: ChangeTab, force?: boolean) => { - if (which === "turn") return loadTurn(id, directory, messageID, force) if (!directory) return Promise.resolve() + if (which === "turn") return loadTurn(id, directory, messageID, force) return loadVcs(directory, which, force) }, [id, directory, messageID, loadTurn, loadVcs], ) useEffect(() => { - void load(tab) - }, [tab, load]) + if (directory) void loadInfo(directory) + }, [directory, loadInfo]) useEffect(() => { - if (!directory) return - const client = useConnections.getState().clientForDirectory(directory) - client?.vcs - .get() - .then(setInfo) - .catch(() => setInfo(null)) - }, [directory]) + void load(tab) + }, [tab, load]) useOnTurnEnd(id, () => { - for (const which of TABS) void load(which, true) + if (directory) void loadInfo(directory) + for (const which of tabs) void load(which, true) }) const diffs = useMemo(() => sortDiffs(entry?.diffs ?? []), [entry?.diffs]) const sum = totals(diffs) - const onDefault = !!info?.branch && info.branch === info.default_branch - - const emptyText = - tab === "branch" ? (onDefault ? t("changes.empty.defaultBranch") : t("changes.empty.branch")) : t(`changes.empty.${tab}`) + const emptyText = t(`changes.empty.${tab}`) return ( - {TABS.map((item) => ( + {tabs.map((item) => ( setTab(item)} + onPress={() => setPicked(item)} testID={`changes-tab-${item}`} > {t(`changes.tabs.${item}`)} @@ -77,7 +78,9 @@ export default function ChangesScreen() { {tab === "branch" && info?.branch && info.default_branch ? `${t("changes.branchVs", { branch: info.branch, base: info.default_branch })} · ` - : ""} + : tab === "git" && info?.branch + ? `${info.branch} · ` + : ""} {t("changes.summary", { count: sum.files })} +{sum.additions} @@ -102,7 +105,9 @@ export default function ChangesScreen() { /> )} ListEmptyComponent={ - entry?.loading || !entry ? ( + !directory ? ( + {t("changes.noDirectory")} + ) : entry?.loading || !entry ? ( ) : entry.error ? null : ( {emptyText} diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 76952507..797c7ff6 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -178,7 +178,7 @@ export default function SessionScreen() { // Branch/uncommitted change counts for this chat's repo; refreshed on focus // and whenever the agent finishes a turn. - const changesDir = currentSession?.directory || directory + const changesDir = (currentSession?.id === id ? currentSession.directory : undefined) || directory const changes = useHeadline(changesDir) const refreshChanges = useCallback( (force?: boolean) => { diff --git a/docs/forge.md b/docs/forge.md index b303a790..d0930d51 100644 --- a/docs/forge.md +++ b/docs/forge.md @@ -21,6 +21,8 @@ intent://connect?url=...&name=...&user=...&dir=...#Intent;scheme=opencode;packag ## Changes view Per chat: Branch (`/vcs/diff?mode=branch`), Uncommitted (`/vcs/diff?mode=git`), -This turn (`/session//diff?messageID=`). Session list and chat -header counts come from the branch diff (uncommitted on the default branch), not -from `session.summary`. +This turn (`/session//diff?messageID=`). Every request carries the +chat's own `directory` (`session.directory`); without it the server answers for its +default folder. Branch is offered only when `/vcs` reports `branch != default_branch`. +Session list and chat header counts: branch diff when offered, else uncommitted; +never `session.summary`. diff --git a/src/lib/changes.test.ts b/src/lib/changes.test.ts index 24023060..ce0f73ae 100644 --- a/src/lib/changes.test.ts +++ b/src/lib/changes.test.ts @@ -1,6 +1,6 @@ import { test } from "node:test" import assert from "node:assert/strict" -import { headline, lastUserMessageID, parsePatch, sortDiffs, splitPath, totals } from "./changes.ts" +import { branchOffered, headline, lastUserMessageID, parsePatch, sortDiffs, splitPath, totals } from "./changes.ts" const diff = (file: string, additions: number, deletions: number) => ({ file, additions, deletions }) @@ -9,10 +9,19 @@ test("totals sums files and line counts", () => { assert.deepEqual(totals(undefined), { files: 0, additions: 0, deletions: 0 }) }) -test("headline prefers branch changes, falls back to uncommitted", () => { - assert.deepEqual(headline([diff("a", 1, 1)], [diff("b", 9, 9), diff("c", 1, 0)]), { files: 1, additions: 1, deletions: 1 }) - assert.deepEqual(headline([], [diff("b", 9, 9)]), { files: 1, additions: 9, deletions: 9 }) - assert.deepEqual(headline(undefined, undefined), { files: 0, additions: 0, deletions: 0 }) +test("branch is offered only off the default branch", () => { + assert.equal(branchOffered({ branch: "feat", default_branch: "main" }), true) + assert.equal(branchOffered({ branch: "main", default_branch: "main" }), false) + assert.equal(branchOffered({ branch: "feat" }), false) + assert.equal(branchOffered(null), false) +}) + +test("headline counts the branch off the default branch, else uncommitted", () => { + const branch = [diff("a", 1, 1)] + const git = [diff("b", 9, 9), diff("c", 1, 0)] + assert.deepEqual(headline({ branch: "feat", default_branch: "main" }, branch, git), { files: 1, additions: 1, deletions: 1 }) + assert.deepEqual(headline({ branch: "main", default_branch: "main" }, branch, git), { files: 2, additions: 10, deletions: 9 }) + assert.deepEqual(headline(undefined, undefined, undefined), { files: 0, additions: 0, deletions: 0 }) }) test("sortDiffs orders by path without mutating", () => { diff --git a/src/lib/changes.ts b/src/lib/changes.ts index 2c100dba..f8ce0f5c 100644 --- a/src/lib/changes.ts +++ b/src/lib/changes.ts @@ -2,7 +2,7 @@ // cover them). Patch parsing follows chliny's patch-compute from upstream // PR #192 (MIT). import type { DiffLine } from "../components/chat/diff-compute" -import type { FileDiff } from "./sdk" +import type { FileDiff, VcsInfo } from "./sdk" export type ChangeTab = "branch" | "git" | "turn" @@ -21,11 +21,16 @@ export function totals(diffs: FileDiff[] | undefined): ChangeTotals { } } -// Counts for the session list and chat header: everything on the branch, or, -// on the default branch (where branch mode is empty), the uncommitted edits. -export function headline(branch: FileDiff[] | undefined, git: FileDiff[] | undefined): ChangeTotals { - if (branch && branch.length > 0) return totals(branch) - return totals(git) +// "Branch" (vs the default branch) only means something off the default +// branch; on it the branch diff is empty. Same rule as the web app. +export function branchOffered(info: VcsInfo | null | undefined): boolean { + return !!info?.branch && !!info.default_branch && info.branch !== info.default_branch +} + +// Counts for the session list and chat header: everything on the branch, or +// the uncommitted edits when there is no branch to compare. +export function headline(info: VcsInfo | null | undefined, branch: FileDiff[] | undefined, git: FileDiff[] | undefined): ChangeTotals { + return branchOffered(info) ? totals(branch) : totals(git) } export function sortDiffs(diffs: FileDiff[]): FileDiff[] { diff --git a/src/lib/i18n/en.json b/src/lib/i18n/en.json index 32bad586..984b972f 100644 --- a/src/lib/i18n/en.json +++ b/src/lib/i18n/en.json @@ -420,7 +420,6 @@ "summary": "{{count}} files", "empty": { "branch": "No changes on this branch.", - "defaultBranch": "On the default branch: see Uncommitted.", "git": "No uncommitted changes.", "turn": "No changes in the last turn." }, @@ -430,7 +429,8 @@ "added": "added", "deleted": "deleted", "modified": "modified" - } + }, + "noDirectory": "This chat has no folder, so there are no changes to show." }, "connect": { "title": "Open workspace", diff --git a/src/lib/i18n/zh-Hans.json b/src/lib/i18n/zh-Hans.json index d2b8165f..1bcefb8f 100644 --- a/src/lib/i18n/zh-Hans.json +++ b/src/lib/i18n/zh-Hans.json @@ -420,7 +420,6 @@ "summary": "{{count}} 个文件", "empty": { "branch": "此分支没有更改。", - "defaultBranch": "当前在默认分支:请查看“未提交”。", "git": "没有未提交的更改。", "turn": "上一轮没有更改。" }, @@ -430,7 +429,8 @@ "added": "新增", "deleted": "删除", "modified": "修改" - } + }, + "noDirectory": "此会话没有文件夹,无法显示更改。" }, "connect": { "title": "打开工作区", diff --git a/src/lib/sdk.ts b/src/lib/sdk.ts index cf6de5b3..43796ba0 100644 --- a/src/lib/sdk.ts +++ b/src/lib/sdk.ts @@ -361,9 +361,14 @@ export function createClient(config: ClientConfig) { }, }, - // Version control state of this client's directory. + // Version control state of this client's directory. The directory also + // goes in the query: a request without one is answered (200) for the + // server's default folder, i.e. silently the wrong repo. vcs: { - get: () => request(config, "/vcs"), + get: () => { + const query = config.directory ? `?${new URLSearchParams({ directory: config.directory }).toString()}` : "" + return request(config, `/vcs${query}`) + }, diff: (mode: VcsMode) => { const query = new URLSearchParams({ mode }) if (config.directory) query.set("directory", config.directory) @@ -483,8 +488,11 @@ export function createClient(config: ClientConfig) { abort: (sessionID: string) => request(config, `/session/${sessionID}/abort`, { method: "POST" }), diff: (sessionID: string, messageID?: string) => { - const qs = messageID ? `?messageID=${encodeURIComponent(messageID)}` : "" - return request(config, `/session/${sessionID}/diff${qs}`) + const query = new URLSearchParams() + if (messageID) query.set("messageID", messageID) + if (config.directory) query.set("directory", config.directory) + const qs = query.toString() + return request(config, `/session/${sessionID}/diff${qs ? `?${qs}` : ""}`) }, // Marks messageID (and everything after it) as pending revert. The diff --git a/src/stores/changes.ts b/src/stores/changes.ts index ecb8a67a..d0fbc763 100644 --- a/src/stores/changes.ts +++ b/src/stores/changes.ts @@ -2,12 +2,13 @@ import { useEffect, useMemo, useRef } from "react" import { create } from "zustand" import { useConnections } from "./connections" import { useEvents } from "./events" -import type { FileDiff, VcsMode } from "../lib/sdk" -import { headline, type ChangeTotals } from "../lib/changes" +import type { FileDiff, VcsInfo, VcsMode } from "../lib/sdk" +import { branchOffered, headline, type ChangeTotals } from "../lib/changes" // Diffs for the Changes view and the change counts in the session list and // chat header. Branch/uncommitted diffs are per directory (every chat in a -// repo shares them); "this turn" is per session. +// repo shares them); "this turn" is per session. Every request carries the +// chat's own directory: without one the server answers for its default folder. export interface ChangeEntry { diffs?: FileDiff[] @@ -20,9 +21,13 @@ const STALE_MS = 60_000 interface ChangesState { entries: Record + // /vcs per directory (branch, default_branch); null when it failed. + info: Record + loadInfo: (directory: string) => Promise loadVcs: (directory: string, mode: VcsMode, force?: boolean) => Promise - loadTurn: (sessionID: string, directory: string | undefined, messageID: string | undefined, force?: boolean) => Promise - // Branch + uncommitted diffs for each directory, skipping fresh entries. + loadTurn: (sessionID: string, directory: string, messageID: string | undefined, force?: boolean) => Promise + // /vcs, then uncommitted (and branch, when off the default branch) diffs + // for each directory, skipping fresh entries. prefetch: (directories: string[], force?: boolean) => Promise } @@ -34,6 +39,10 @@ export function vcsKey(directory: string, mode: VcsMode): string { return `${base()}|${mode}|${directory}` } +export function infoKey(directory: string): string { + return `${base()}|${directory}` +} + export function turnKey(sessionID: string): string { return `${base()}|turn|${sessionID}` } @@ -55,6 +64,15 @@ export const useChanges = create((set, get) => { return { entries: {}, + info: {}, + + loadInfo: async (directory) => { + const client = useConnections.getState().clientForDirectory(directory) + if (!client) return null + const info = await client.vcs.get().catch(() => null) + set((state) => ({ info: { ...state.info, [infoKey(directory)]: info } })) + return info + }, loadVcs: (directory, mode, force) => load(vcsKey(directory, mode), force, () => { @@ -64,24 +82,30 @@ export const useChanges = create((set, get) => { loadTurn: (sessionID, directory, messageID, force) => load(turnKey(sessionID), force, () => { - const conn = useConnections.getState() - const client = directory ? (conn.clientForDirectory(directory) ?? conn.client) : conn.client + const client = useConnections.getState().clientForDirectory(directory) return client ? client.session.diff(sessionID, messageID) : null }), prefetch: async (directories, force) => { const unique = [...new Set(directories.filter(Boolean))] await Promise.all( - unique.flatMap((directory) => [get().loadVcs(directory, "branch", force), get().loadVcs(directory, "git", force)]), + unique.map(async (directory) => { + const info = await get().loadInfo(directory) + await Promise.all([ + get().loadVcs(directory, "git", force), + branchOffered(info) ? get().loadVcs(directory, "branch", force) : undefined, + ]) + }), ) }, } }) export function useHeadline(directory: string | undefined): ChangeTotals | null { + const info = useChanges((state) => (directory ? state.info[infoKey(directory)] : undefined)) const branch = useChanges((state) => (directory ? state.entries[vcsKey(directory, "branch")]?.diffs : undefined)) const git = useChanges((state) => (directory ? state.entries[vcsKey(directory, "git")]?.diffs : undefined)) - return useMemo(() => (branch || git ? headline(branch, git) : null), [branch, git]) + return useMemo(() => (branch || git ? headline(info, branch, git) : null), [info, branch, git]) } // Calls `run` when the session finishes a turn (busy/retry -> idle). From 376a4b5f34273242dd061c622d49eb9463d94291 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 14:52:17 +0000 Subject: [PATCH 18/20] e2e: Maestro flows target it.kjeldahl.opencode, no consent step Flows still launched cc.agentlabs.opencode (renamed in #2) and tapped the telemetry consent dialog this PR removes. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- .github/workflows/activation-e2e.yml | 2 +- .maestro/flows/activation-negative-401.yaml | 8 +------- .maestro/flows/activation-positive.yaml | 14 ++++---------- .maestro/flows/all-sessions.yaml | 7 +------ .maestro/flows/demo.yaml | 7 +------ .maestro/flows/diff-scroll.yaml | 7 +------ .maestro/flows/directory-picker.yaml | 7 +------ .maestro/flows/variant-picker.yaml | 7 +------ scripts/run-e2e-flows.sh | 2 +- 9 files changed, 12 insertions(+), 49 deletions(-) diff --git a/.github/workflows/activation-e2e.yml b/.github/workflows/activation-e2e.yml index cac7a48f..03170f5e 100644 --- a/.github/workflows/activation-e2e.yml +++ b/.github/workflows/activation-e2e.yml @@ -1,7 +1,7 @@ name: Activation E2E (Maestro) # Deterministic regression coverage for the activation flow (first open -> -# telemetry consent -> server URL entry -> connect -> send first message), +# server URL entry -> connect -> send first message), # including the connect-time-401 negative case tied to the 0%-7-day-retention # / GitHub issue #76 investigation. # diff --git a/.maestro/flows/activation-negative-401.yaml b/.maestro/flows/activation-negative-401.yaml index 3c0286f8..4207c964 100644 --- a/.maestro/flows/activation-negative-401.yaml +++ b/.maestro/flows/activation-negative-401.yaml @@ -1,4 +1,4 @@ -appId: cc.agentlabs.opencode +appId: it.kjeldahl.opencode name: Activation - negative path (connect-time 401 must surface a visible error) --- # Negative activation flow — regression test for the GitHub issue #76 failure @@ -38,12 +38,6 @@ name: Activation - negative path (connect-time 401 must surface a visible error) - launchApp: clearState: true -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" -- takeScreenshot: negative-S1_consent_dismissed - - assertVisible: text: "No Connection" - tapOn: diff --git a/.maestro/flows/activation-positive.yaml b/.maestro/flows/activation-positive.yaml index 42f03ed8..b5c06178 100644 --- a/.maestro/flows/activation-positive.yaml +++ b/.maestro/flows/activation-positive.yaml @@ -1,7 +1,7 @@ -appId: cc.agentlabs.opencode -name: Activation - positive path (consent -> connect -> send message) +appId: it.kjeldahl.opencode +name: Activation - positive path (connect -> send message) --- -# Positive activation flow: first launch -> telemetry consent -> quick connect +# Positive activation flow: first launch -> quick connect # to the mock opencode server (tests/fixtures/mock-opencode-server.ts, run # normally on the port below) -> connected indicator -> new session -> send a # message -> assert it sends (optimistic echo), WITHOUT waiting for the @@ -34,7 +34,7 @@ name: Activation - positive path (consent -> connect -> send message) # output in production; the bug they hit there was the 401-retry storm, not # a missing/undelivered reply). Asserting on the reply here would therefore # be asserting on a CI-harness limitation, not real app behavior — so this -# flow verifies everything reliably observable (consent, connect, session +# flow verifies everything reliably observable (connect, session # creation, message send) and stops short of the SSE round trip. If a real # fix for the underlying RN-Android streaming limitation ever lands (a native # SSE module, WebSocket transport, etc.), restore the extendedWaitUntil + @@ -43,12 +43,6 @@ name: Activation - positive path (consent -> connect -> send message) - launchApp: clearState: true -- takeScreenshot: positive-S1_launch_consent_modal -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" - - assertVisible: text: "No Connection" - takeScreenshot: positive-S2_empty_state diff --git a/.maestro/flows/all-sessions.yaml b/.maestro/flows/all-sessions.yaml index ec023cb2..7712c33f 100644 --- a/.maestro/flows/all-sessions.yaml +++ b/.maestro/flows/all-sessions.yaml @@ -1,4 +1,4 @@ -appId: cc.agentlabs.opencode +appId: it.kjeldahl.opencode name: All sessions across directories - list + open-across-project (regression #46/#48) --- # New-feature regression coverage for the "all sessions across all projects" @@ -31,11 +31,6 @@ name: All sessions across directories - list + open-across-project (regression # - launchApp: clearState: true -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" - - assertVisible: text: "No Connection" - tapOn: diff --git a/.maestro/flows/demo.yaml b/.maestro/flows/demo.yaml index 4ddbd97b..fc185834 100644 --- a/.maestro/flows/demo.yaml +++ b/.maestro/flows/demo.yaml @@ -1,4 +1,4 @@ -appId: cc.agentlabs.opencode +appId: it.kjeldahl.opencode name: Demo mode - offline scripted walkthrough (no server, zero-server activation) --- # Covers the "Try a demo" activation path added for the ~0% 7-day retention @@ -20,11 +20,6 @@ name: Demo mode - offline scripted walkthrough (no server, zero-server activatio - launchApp: clearState: true -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" - - assertVisible: text: "No Connection" - takeScreenshot: demo-S1_empty_state diff --git a/.maestro/flows/diff-scroll.yaml b/.maestro/flows/diff-scroll.yaml index a36e4133..5dc3549d 100644 --- a/.maestro/flows/diff-scroll.yaml +++ b/.maestro/flows/diff-scroll.yaml @@ -1,4 +1,4 @@ -appId: cc.agentlabs.opencode +appId: it.kjeldahl.opencode name: "DiffView + CodeBlock horizontal scroll - wide diff/code line reachable by swipe (closes #21)" --- # GitHub issue #21 ("QA: verify DiffView + CodeBlock horizontal-scroll @@ -39,11 +39,6 @@ name: "DiffView + CodeBlock horizontal scroll - wide diff/code line reachable by - launchApp: clearState: true -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" - - assertVisible: text: "No Connection" - tapOn: diff --git a/.maestro/flows/directory-picker.yaml b/.maestro/flows/directory-picker.yaml index 602310e7..04ffd212 100644 --- a/.maestro/flows/directory-picker.yaml +++ b/.maestro/flows/directory-picker.yaml @@ -1,4 +1,4 @@ -appId: cc.agentlabs.opencode +appId: it.kjeldahl.opencode name: Directory picker - browse server folders and create a session in one --- # New-feature regression coverage for DirectoryBrowserSheet @@ -19,11 +19,6 @@ name: Directory picker - browse server folders and create a session in one - launchApp: clearState: true -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" - - assertVisible: text: "No Connection" - tapOn: diff --git a/.maestro/flows/variant-picker.yaml b/.maestro/flows/variant-picker.yaml index 42c48920..341997a9 100644 --- a/.maestro/flows/variant-picker.yaml +++ b/.maestro/flows/variant-picker.yaml @@ -1,4 +1,4 @@ -appId: cc.agentlabs.opencode +appId: it.kjeldahl.opencode name: Variant picker - reasoning-effort chip renders, selects, and still sends --- # New-feature regression coverage for VariantPicker @@ -29,11 +29,6 @@ name: Variant picker - reasoning-effort chip renders, selects, and still sends - launchApp: clearState: true -- assertVisible: - id: "telemetry-consent-card" -- tapOn: - id: "telemetry-decline-button" - - assertVisible: text: "No Connection" - tapOn: diff --git a/scripts/run-e2e-flows.sh b/scripts/run-e2e-flows.sh index 6f4a40e4..9815b4d5 100755 --- a/scripts/run-e2e-flows.sh +++ b/scripts/run-e2e-flows.sh @@ -11,7 +11,7 @@ set -uo pipefail ROOT="$(pwd)" # capture BEFORE any cd, so diag paths are absolute APK="android/app/build/outputs/apk/release/app-release.apk" -# CORE = the activation coverage issue #90 verified green (consent -> connect +# CORE = the activation coverage issue #90 verified green (connect # -> send, and the connect-time-401 visible-error case). A failure here fails # the job — this is the suite's actual regression gate. # From 6184a30328b366b318e87ae0a7ac4c687486ce69 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 15:06:37 +0000 Subject: [PATCH 19/20] Revert "feat(chat): navigate previous and next message starts (#214)" This reverts commit b7df0710327be0362c773c5e80927cf0dff4c3ec. --- app/session/[id].tsx | 105 +-------- docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md | 95 -------- .../issue-214-keyboard-navigation.png | Bin 246055 -> 0 bytes .../issue-214-message-navigation.png | Bin 220793 -> 0 bytes ...ssage-navigation-layout.regression.test.ts | 29 --- src/lib/message-navigation.test.ts | 217 ------------------ src/lib/message-navigation.ts | 112 --------- 7 files changed, 10 insertions(+), 548 deletions(-) delete mode 100644 docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md delete mode 100644 docs/qa/screenshots/issue-214-keyboard-navigation.png delete mode 100644 docs/qa/screenshots/issue-214-message-navigation.png delete mode 100644 src/components/chat/message-navigation-layout.regression.test.ts delete mode 100644 src/lib/message-navigation.test.ts delete mode 100644 src/lib/message-navigation.ts diff --git a/app/session/[id].tsx b/app/session/[id].tsx index 797c7ff6..40356ac4 100644 --- a/app/session/[id].tsx +++ b/app/session/[id].tsx @@ -13,9 +13,6 @@ import { ActivityIndicator, Alert, useWindowDimensions, - type CellRendererProps, - type NativeSyntheticEvent, - type NativeScrollEvent, } from "react-native" import { useLocalSearchParams, Stack, useRouter, useFocusEffect } from "expo-router" import { Ionicons } from "@expo/vector-icons" @@ -46,7 +43,6 @@ import { useCatalog } from "../../src/stores/catalog" import { useSpeech } from "../../src/lib/speech" import { keyboardPadding, keyboardVerticalOffset } from "../../src/lib/keyboard-offset" import { composerMaxHeight } from "../../src/lib/session-layout" -import { MessageNavigation } from "../../src/lib/message-navigation" import { useChanges, useHeadline, useOnTurnEnd } from "../../src/stores/changes" // --- Builtin slash commands --- @@ -90,9 +86,6 @@ export default function SessionScreen() { const { t } = useTranslation() const flatListRef = useRef(null) - const navigation = useRef(new MessageNavigation()).current - const retry = useRef | undefined>(undefined) - const attempts = useRef(0) const modelSheetRef = useRef(null) const variantSheetRef = useRef(null) const [input, setInputState] = useState(() => (id ? useSessions.getState().drafts[id] || "" : "")) @@ -242,7 +235,6 @@ export default function SessionScreen() { const messageData = useMemo( () => (messages || []) - .filter((msg) => msg.role === "user" || msg.role === "assistant") .filter((msg) => !revertMessageID || msg.id.startsWith("temp-") || msg.id < revertMessageID) .map((msg) => ({ message: msg, @@ -252,42 +244,6 @@ export default function SessionScreen() { [messages, parts, revertMessageID], ) - navigation.sync(messageData.map((item) => item.message.id)) - - const seekMessage = useCallback(() => { - if (retry.current) clearTimeout(retry.current) - if (flatListRef.current && navigation.seek(flatListRef.current, attempts.current++)) { - retry.current = setTimeout(seekMessage, 100) - } - }, [navigation]) - - const MessageCell = useCallback((props: CellRendererProps<(typeof messageData)[number]>) => { - const key = props.item.message.id - const { onLayout, ...cell } = props - useEffect(() => () => { navigation.frames.delete(key) }, [key, navigation]) - return ( - { - navigation.frames.set(key, event.nativeEvent.layout) - onLayout?.(event) - if (navigation.target === key) seekMessage() - }}> - {props.children} - - ) - }, [navigation, seekMessage]) - - useEffect(() => { - navigation.manual() - navigation.frames.clear() - return () => { if (retry.current) clearTimeout(retry.current) } - }, [id, navigation]) - - const moveMessage = (direction: 1 | -1) => { - if (navigation.move(direction) === undefined) return - attempts.current = 0 - seekMessage() - } - // Tracks the latest composer text without pulling `input` into // handleMessageLongPress's deps — kept as a plain ref assignment (not // state) so the callback below stays referentially stable across @@ -347,10 +303,8 @@ export default function SessionScreen() { }, [applyRevertResult, t]) const scrollToBottom = useCallback((animated = true) => { - navigation.manual(0) - if (retry.current) clearTimeout(retry.current) flatListRef.current?.scrollToOffset({ offset: 0, animated }) - }, [navigation]) + }, []) // Re-select on every focus, not just mount. currentSession/messages/ // permissions are a single global store, and the native stack keeps screens @@ -552,11 +506,10 @@ export default function SessionScreen() { } // In inverted mode, offset 0 = bottom. Show scroll button when scrolled away from bottom. - const handleScroll = useCallback((event: NativeSyntheticEvent) => { - const { contentOffset, layoutMeasurement } = event.nativeEvent - navigation.observe(contentOffset.y, layoutMeasurement.height) + const handleScroll = useCallback((event: any) => { + const { contentOffset } = event.nativeEvent setShowScrollButton(contentOffset.y > 200) - }, [navigation]) + }, []) // Debounce: onEndReached can fire multiple times during a single scroll gesture const loadingTriggered = useRef(false) @@ -741,8 +694,6 @@ export default function SessionScreen() { if (hasMore && !loadingMore) loadOlderMessages() }} onScrollToTop={() => { - navigation.manual() - if (retry.current) clearTimeout(retry.current) flatListRef.current?.scrollToEnd({ animated: true }) }} onClose={() => setShowInfo(false)} @@ -793,17 +744,6 @@ export default function SessionScreen() { ref={flatListRef} data={messageData} inverted - CellRendererComponent={MessageCell} - onLayout={(event) => { - navigation.observe(navigation.offset, event.nativeEvent.layout.height) - }} - onScrollBeginDrag={() => { - navigation.manual() - if (retry.current) clearTimeout(retry.current) - }} - onScrollToIndexFailed={({ index, averageItemLength }) => { - flatListRef.current?.scrollToOffset({ offset: averageItemLength * index, animated: false }) - }} keyExtractor={(item) => item.message.id} renderItem={({ item }) => ( {t("session.empty.hint")} )} - {messageData.length > 0 && ( - - moveMessage(1)}> - - - moveMessage(-1)}> - - - {showScrollButton && ( - scrollToBottom(true)}> - - - - )} - {!showScrollButton && } - + {showScrollButton && ( + scrollToBottom(true)}> + + )} )} @@ -1019,23 +944,13 @@ const s = StyleSheet.create({ listWrap: { flex: 1, position: "relative" }, // Messages - // Reserve 44pt controls + 16pt inset + 16pt gap on the physical right. - // Android's inverted list flips both axes, so its content padding is mirrored. - messageList: { - padding: 16, - paddingBottom: 8, - paddingLeft: Platform.OS === "android" ? 76 : 16, - paddingRight: Platform.OS === "android" ? 16 : 76, - }, + messageList: { padding: 16, paddingBottom: 8 }, // Scroll button - scrollControls: { + scrollBtn: { position: "absolute", bottom: 16, right: 16, - gap: 4, - }, - scrollBtn: { width: 44, height: 44, borderRadius: 22, diff --git a/docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md b/docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md deleted file mode 100644 index 760e01cf..00000000 --- a/docs/qa/ISSUE-214-MESSAGE-NAVIGATION.md +++ /dev/null @@ -1,95 +0,0 @@ -# Issue 214: Message Navigation Validation - -## Scope - -Previous and Next use single carets immediately above double-caret Latest. -Targets are the starts of rendered user/assistant messages in the inverted -FlatList. Layout-only/system rows are not navigation targets. - -The change does not modify native keyboard handling, the composer, safe-area -configuration, server code, release metadata, or unrelated IME PR #208. - -## Automated Gates - -- `npm ci --legacy-peer-deps`: completed using the existing lockfile. -- `npm test`: 348 passed, zero failures (15 navigation regressions). -- `npm run typecheck`: passed. -- `npm run check:versions`: passed, existing 0.4.15 / versionCode 42 unchanged. -- `git diff --check`: passed. -- `npm run lint`: unavailable; package.json has no lint script despite the - contributing guide naming one. No lint pass is claimed. -- Android `./gradlew assembleRelease -PreactNativeArchitectures=arm64-v8a - --max-workers=2 --console=plain`: passed under a capacity lease, with SDK/JDK - environment configured and `SENTRY_DISABLE_AUTO_UPLOAD=true`. - -The first build reached signing and failed because the checkout lacked -`android/app/debug.keystore`. Generating the ignored development key using the -same setup as CI allowed the build to pass; no signing material is committed. - -## Physical Android Runtime - -Device: Pixel 8 Pro. The installed production package had a different signing -certificate, so it was preserved. A temporary external Gradle init script used -the supported `androidComponents.finalizeDsl` API to build a separate -`cc.agentlabs.opencode.navigation214` test package. No tracked Android source or -configuration changed. The JavaScript bundle contains the actual feature diff. - -The existing `tests/fixtures/mock-opencode-server.ts` supplied a separate test -connection via ADB reverse. The fixture was seeded through its REST API with -25 numbered user messages and 25 assistant responses, each containing 70 lines. -This is mock protocol coverage, not live AI/backend validation. - -Snapshot-driven ADB assertions passed these flows: - -1. From the newest response's partially visible end, Previous reaches user - Message 25 at the viewport top, then the older assistant's line 1, then user - Message 24. The repeated tap advances at exact message-start boundaries. -2. Next reaches the adjacent assistant's line 1, then user Message 25. -3. Manually scrolling into the middle of the long response discards the tap - anchor; Previous reaches Message 24 from the new viewport position. -4. With an unsent draft and keyboard open, tapping navigation preserves the - draft and composer `focused=true`; Android input-method state remains shown. -5. Latest reaches line 70 of the newest response and preserves the draft. -6. Seventeen consecutive Previous taps reach numbered Message 17 through every - intermediate message start, beyond the initial render window. Latest then - returns to the newest response end. - -The harness first needed two test-only corrections: keyboard capitalization -must be accounted for, and keyboard dismissal must not send a blind Back key -when the keyboard is already closed. Neither required a product change. - -Screenshots from the actual physical-device build: - -- [Message start and controls](screenshots/issue-214-message-navigation.png) -- [Keyboard, draft and controls](screenshots/issue-214-keyboard-navigation.png) - -The keyboard screenshot is not evidence that the composer is fully visible -above this device's IME. Existing keyboard layout work remains outside scope. - -## Independent Review - -An independent actual-diff code/behavior/UX review initially found three -issues: virtualized estimates could stall, completed targets could repin a -streaming response away from Latest, and resizing could leave a stale anchor. -All three were remediated and regression-tested. - -The independent final review ran the 15 focused tests, typecheck and diff check, -inspected installed React Native 0.81.5 list internals, the runtime harness and -both screenshots. Verdict: **PASS code/static compact-control UX; BLOCKED merge -readiness**. No remaining actionable correctness defect was established. - -## Blocked Gates - -- Mandatory vision CUA was actually attempted with Python 3.12 and the existing - runner against the isolated installed package. It exited 1 with: - `Set AZURE_OPENAI_API_KEY, AZURE_DEV_AI_API_KEY, OPENAI_API_KEY, XAI_API_KEY, or GEMINI_API_KEY`. - The documented `~/.env.d/azure-openai.env` file is absent. Deterministic ADB - assertions do not substitute for this gate. -- The documented live server's `/global/health` request timed out after 15 - seconds. No server/daemon changes or permission workarounds were attempted. -- Native rapid-tap callback ordering, live streaming/appends, and constrained - keyboard/composer layout remain incompletely validated. Pure regressions - cover rapid pending taps, growth/appends, resizing and manual cancellation. - -Do not merge or release until the mandatory CUA gate passes and remaining -runtime gaps have been checked. The focused PR remains draft while blocked. diff --git a/docs/qa/screenshots/issue-214-keyboard-navigation.png b/docs/qa/screenshots/issue-214-keyboard-navigation.png deleted file mode 100644 index 5c0b7d50df9b2094216ddbffd0cd7b2182658fff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246055 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⩔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�D0R}rd00%(+8=@-WNu<;Zkz!6eQpTpH zIN~n`wW}*D1!nTgbeo{@e*Ey^=Vug3EChx&%*sO;Xea|fKz!=z`|!36JjMruT~Veh zEM~!L$lMulApj&Oyvsmx z3?6<`iQqLl*7$gpL;d@iK0=cnn!vjHidB z+&^iaYHUS+iZI>6%14hprXnThFaITj!QUjF�wUdO`}M>W|z)k*lz7;N)zE;I?pA zmHJBE;UH3k#M&r7|0dA8WcbQ!K0%9x3)EDeJMw7g+s;~~Ni z6Z=bi4c=hkITIG%m6s_g1n9yym^fr(Z*&FY#k191HC93o!icwT`zW3?-8fFWeVvGX zvSwd|NS8K?neG!MoRN?DXllTE;ZpAc$ZlD@ zAV{PRnCY8t3rV7A(GR!_e!#544ajNL^FN&UHdm)ncb1~rCvxh<2`Bh#Kn@WIbo~ZQ zw}P2Sb}V*Lsj6i^2IQh(d@`rdCi($MvfOU?_vc)A)siWDDTdSxSEGrTrr#it-F@rv zEB+FMj@o`vsvmG=9dlAc)ZB4 z!`>RJkbyD6`@6NayREc=CCQAkiDc$qpR0$#L}t0n3z%HQuH%`65K?1qvnQdbpb$hL zG8~k1PfpSe6dezr2AQ%orPG&7Dc=ck3MNrrx6} zc+|XpZgW|l`+tTQ;H=Jao_Y=lHd(%iLMV6hrB6h+`VV&cIyB`Kz;RN*8KKhduQ4i} z5_>2;$N=M#@(y>~nvB&uF;{Nt=fd>kYyUhR z)JpX7=3vyRjfGO7c=N5HZGA1XB2aq55?px1bO#V-jbc-Y=st9XGUhrVi~gV2cGwit z!9tfF$(gI8V~=20PpUKXuggg&LFX;vcnK4;g=tV_aSNpE?YU@Tp8^PIt8YW*{fK_v zBcvILe71tWJKrJ7#di+>zRctTc}lWL0)vy)=u-ZxL$>)V{5T(BO7wUBj8hvELm@A` zdq==^uMypRxGyAz saEcQuFahYF{ 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 -ZyO~jn*Fb0f3Y=q7 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%0DE<)cNG?u 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

p_;kg42D%gxI=a%`M5UU!O@9Tn!_pOfEuCp=gX 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 diff --git a/docs/qa/screenshots/issue-214-message-navigation.png b/docs/qa/screenshots/issue-214-message-navigation.png deleted file mode 100644 index ed25c056da06ade78bc60affb1e4c46a255d8006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220793 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

<0ux13zbIcmf>MSV&HFT%3#q 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

3UXdk6p z9d#TW9M+(XlvEV7j{XiK$ApF-n!}M(r)s;{7zJrMC?SIl1BAAgvVm9=+)nrNzUSzBlK4CG{IpX2l=#$r(9 zlhbCea{8AbR!58*0hK}ML$uWslVm+CXa~2IqI&Hfr%_A<1+fqqho3*Sc2%6aqOcJ0 zyQf4l$8fb2y$+GRYwt~udA!uw|A%s^qGT0za6Bttj43dA3G{8EDMh+iV%KYIv&Gp! zz#+Gm?cz1qs+7Ux&z~S}PUv~XPbvFwIGJnS$V4{h*?qa*lb?t0>HU0t6f+YyGLk4= zVItj_n0o?cn7Cy^JEWogoN?L6lj$SOxD&9XbalZ*+-_#;!omV@#LfNuK=d!Xyr_t9Da1z#ZcSAW+ey{_$w@jF z7nk6_0|ZSVE_jIWkgvo*e^#7OazeMGMGu zHF>!zUWt^t`O2Ij1gPWgtr+M^$1hdbbzzkiSF%5U-bx7Hb~pS{rEWu~9(Al+gpgD((p3qx2~W~dboH;4+=_U-3%bV6EJ^MFK*7DWpYK!u*?2_vK%=!!r~ z9&`u&@T$cX6*433{}T`|LmbG;{xXS(f?!4>-eL{v={|vbJF#1%AAMlt*38@q#2zg( z{Gd7IFtL}Qh4oVME z{DKt*u^@);7?G~nq(TujHdXIrE(krcpIUn?!FN@6kt z$VX;2EI24=7YobDAO@^07UwV*m+bxL5HBS$aP}LFaSgK)m=B0cO9G}r0G&}%ps%<0 zA$TqTD`8%s9T2f;PZKkG2e2wrT*tk&pK4mua3*7;0gAiZh(-K)Yk6C1PGBW zArx2KF>(?bAop`lUmu?mM6*Y~jV`TxHtp&4sj%6B1Vvv~mvbrR0=m1qKh<*a-V4{- z4IlTq{IN@XzDWG5*WH3Z;I9*JI%#vMGLpxa7iUe?uxwj}$GreLz5)EXjReeBtFd<# z#-sLM$!^W`|Ku$FiYwxGTCwzvH$I5yuGHGp(+YEK=HsMW^)WYau2U;`e*hj3IpT8j zfA-=D0{=Z1;KjkF*t|H$wdr!T981HFLwbCrGV zQ}DuLCh}-T85~YB&9JXu)sA{?am~#Y!wAz(l}sMuxc1k{ODV5voox}| zDkyq;?9~-Z9bs25uhA%&J`5N#ff#ks-d+@_*Aw(^dvcahgG^rrn)4Eh8$BbVJ3cz~ zks_oOjtRb&a$MR)Ny}1%?*T*jz_1}8!TIK_)YNk@2r}Y~5vbY41Sf79r|O7+00T^B zLb<`q9}8*=zeL?5rn>AgjH$adMCgcQ0!FEc04VlTk5$=|WLO&56pEwmFy&N476gAs zoeNL1O61hss`lXG{_c^M2&yS)7)ZXpuQf)J#df-EZ-b73p<(Q)7h>?2u{2vhX}YQk z*AOEq@VAvCn?P-1I^I=cBJzEga!8Kd5I{GkQ_kUG80*R#E~^;g zCc2+xRck9VfVYxp)L-(*xRgAzF3G&vYB5e1&eM16@BPoA!-3DMZ6aXGf^C_}5pS<6 zL7df$u#RMoY{8&~kdDLhjDALWrHd5e)UPWHOcC415#m`(7@kg+S)N66{5)e%c;CCs zAPRtzn54C9WLgW@FA-rBW$cX&Ey zmJ;VBs5;6?P4^h5G2+yNR8dJ>%#PNo*<>7Z0{Qr_K+ZU+leZ6rQ~BKu28`TZ0PN($ z;{oz8Ipd%CnOr|V9w77^a$G5x5+X*i`+Sl{8+T&}tUgX(^z>;aOr^<`w`Q5WklI+f zu%zDMvkZ2OlX60Gshd1wG23Z1Q{@?D1F@#x911yL@DXXrnMw5~As%R=;%E@=h2RyX z$b^l3H=?AZjGTNIIGA+|6HyX<1FH5--yraed?^R(nt1Yapfn3@21nW7!zEsGU5DdM z4+0*EX|y$I70g2Wy2o5A&O6G;?7*0DR9%RRQkMVbodT1#)5Ks3He^XEh;N2N2@rh# z8n2XzLpM-NM5eHOTSGdgU>;)P#-DFL45qn9@N65Bo@g|54(?#wJ66|-@N#{o4jg-C zgc$WRDiZuqy6#N0W(;@a3KMgaD0M0;k59b1LJZ{)RwL>PShz>+7$ip{%_`toWpIZG zQ|gMDNikA$x*-E5%Od7#VZ3TS(}yriR827i0;T_o{Ha(ETTaM>0-w#WlZ7NV*xt4onpJ-3@~* z(WXneVO~yFb|&7Zi^u~nI6@4bF5Fyy(e^{)QpINYHdmYmV(`1927}o9giTorHdc&# z-X|v~r<8e~fAAooR@@Y;#pRJXGhjFdq{MkR>W-ORnSTwV;4i19z1O(%IGI%V(_!WI z0RJJBvhUPgDhLa1Sa9D9;p^+`1Ue&hK)QpHd;C_HmSRlI(Vch(tAjNYbCla@@r4*M zf6`+?TZzd9zIUfNK*XP}vXwI4YR8ch8<~=u6-*4At=u zX!Cl7oVMEXuPyGia-|gXT*8Iu0Yu>wc(v*X?hcsYenTQcsB#}pU5fSOK6z5^L{TBe zI5}stxoE#6H}ie+epb1uH(3x75jVT}qLAZ*(rbkyNB5}u#2kO(!G1;ACLlb#C`ai= zaoLjuAFpla=*N86!w;$b)>k!@p+C2ci~Y)3Dz6k7g%h<7_JfPk&e>fb4#pzL{F5&rTv>pKWQ-6LazwnCjPHWICIb%MmpTrFCfc z9@QvxGj5O(YNnG4SQ*oT<$J!!EhA=PrI`iz7kI`zypn38lg&%%BL2NC4T+m8oCUOY z_PU%rrHL9Dit#Fmf`B6?T?N`88`d9wbv*r$Da9E-?r^h_?jWhCdR#Bl)X%G#S*4#MVHTvRd->9(6Oxh}39)YD^|5b6 zZT^mD0@x1PgTTu@>r2@6ewB+|lw5qd|4krfJ=$iFiZcY{lAC2Blc8)yLZ<;lXc-{@1e4n}9;B?WDxS+7fxQvRq>X&90e~Z|4!0$l!M3pUw>S*?Crl9*Kvj#b};n z#4hh+hs(&zH(@She43*bI43}ItoY1g{(KnX2|hVClS!ESS+=S(>CDRxu^&B=h(}6* zW`@;RJ^f&l68{}6<-Z@P zZ63NUP}h1@ov#Or4(wiY2wXnO$tiY@?~$`3ftFV_zCH}A9D6O&bF}7BA&O7yMDN&S(96yhg@z>Uw&WVwkf%Ru z*RwDJ_ILVAXCS|-2g*>6r7Beh?!E*D7&#w30kDTzm=jH1 z2;$@qnxIX|3J_=vTwa$`FHwJNV(?kj5`k0>D-sHJ6VjG{^Fr@ZEZ@E4}{U(A6Hio`~ z;uA)IAst)hsCn}gAQmWr%ONP$Zy^_aP)E(A;L%XhF5IMg1lz=u%E{L^^_Ds2s`G@R zdAIj&t~3?a26cvuOXxe|*#UE~hjO*n?B|BVAgR>!wNF+b@m!T@Vvvt`EK}xG4t6x5 z${a%B&DEh*sd-if>F?ydf?trJyADjyh?$1|(|1Op63v54*#|ZLqkw`~mzdQ#n&}A0 zkF|tWcnLkLEd3Gh*!J?E#7(&oBQQN6cyBQcj zOu71c9^SqkR^vI=i3x-loC>5)6agMK7P1OQV2%C8n=5^}cP+!TqxH;nP{c>uQ`WBv zi-@QrYJ>bxC|G9GREU4yQM?X?ZN+RDF*ZZ8V_L4n@ zqTr&s&~(Vo{H9dn8afHqZ~wStuXRtACwdYF>b(!lc_2_vVv=s z^@gHF7-~Fumg6SM+;gFzK$(huD&(s=`W(*V#Q3m+H^NpRPmsI?~^8W zb(nb7wrWu3sU*aMfZ{!}n%NeS2=EUyZiCu%88SbDx9Y#^XfNvfJCV)~EMY6n2NbSd z!kP$e8Lw!*XU7VW3S-jcOBwVWq}pBLdhz9?B07Hv_;@I$@<~ z=br9P^&(&uM6@`pr%_|V2iaLi&(bjDwzVN-`)XEJ0@+=HKvp1XIs6HoCO17!%ziGW zU~|J^9U7KtTU)B0CuX&*Fv69ybwY*8@7F$tW4~1>dOA77PSWo$lI?uDB+HZSc1ZGx zLjY*j-BlX8S zU_srzxi%z)_NyT&eF`HVAKQkU`0w|UUAj+&p%u8oLrK}E+63Eh}GCNWh+ZoklCP}zQ6 zQStTn7YCEEDRUbRVN6mEp=Aqo>$%|@q31IHNmNTck2g2HwlCOhs#s1;!C!fSj8vQj zHREa-cPu7X4uAYLIHO8W>sdN5300!v#}B?tbsao}2tfx$Sg*>FGK~5L24l#UvNf&a zp)6Z=jLI4nNUe?wG{oEh$uzI1u5N@J!ntP{KWB_zS%Lbb9C4Wja^rC+DP4Tt`Q@{O z@VJ5;B~l&HIE6n=v&P_L>XcvQoW`>thQV2dIaBduCnN9W{{8i*AJQKvlHEFO@C>5* zSi$Pw*%e}n`r3%p#%O%95kx~Cc^8w@A5q1_3peJIb)p+`P`DZpD$N=|k(zDpHwHk@ zftjhjB?Ulh6mCc@lw}E1BIPD8KJC^vg8;b$t6Nn7;PZVvhbjCS5i)k-BI^z3ZNx#a<`gu;ZN=3oW-!UbB7+o?;+~F`F#sbr>QT zZOauj>l9CJyDBSNhj;+t+D1l4#}g-=?nc4djI0O?ZGfIqzP(k4Rg*T<*1#sqTokR; z&9K?hcekQgV=6d_3W)mTw}Y}F>>=(btAxGaaYIbehxYn4DxfE)qMem>@X>?kF^b11;QFhtK@m4 z-WefH=QQ*4SPuGZhvdyy?=9G%0$pht#_=VmOu0spJFP8`0+qVr<}?nKE>%GGvxp4kP?Xm z9=rM)4nhR(!*6}lWkfwjF^p*?>j2#-2f$4HuLBfNU$WsK@ViQVg~0z^OOl&dZpYtK z`7HjA{hxBoZ5|6Z?v`DO^WGf)Qd18wdg^23AxC|E{SgdB+(4)5=oE8a``T$Y#9Eg* zKOFI56mE^>fvt&noKqm4RuJN{VaIyr;aN;B#NCYcD-TpaJ;L2u37Y9IraY*Gs@idR zvS2XK*mAx>bqpN)Hx4OrF0wW@juPt)6P;@+*wO-ziHJvqH0{_;%<>UR6j~IwY7SuN zzZC+4N>*_L3|m2X&NTb@&Y~iTI<2I`U-SnAdt~&M$i~BkW$XF~UVz2vQ#ruGzz_lR z!05-z!>usEv22m(&kYIcb$vFf@haR|;>2hX2LCJ!!$V%a{A3VfcNzL@G$E;i2mOmz98lp_hSP}T|#VSzP`Sxda62`W%R7s$iBHz-N-*^~CYxzwx}WIXqRMY3MW@ zyJRe|-T18Omlmby>#Ra1t@XxJ1-DBnXxPM?U*u0uph^)(Pgy~s`<-WWh<(MtcFRu$ zfHF?bZyZWL2@Oi->eU-4M3p-`3GS2CYGZ(>3dF;S>zkJN_$vzFAPyu7tt7L25(#-H zW^vmT=hX?}fB{{{X?Hfee)=rEe;6sVnsgizO|u7>h(%Y`GIuX0Ilxb1Gp+`suv5C+ zLP`4i#lDDsJHW}GWBK2RTNlP-q(UDzGi3I~#wF^+=k58I?5KO4=8w4xRRxPR^|6c+ z_VP#@QC(|7Bmf)ITzN=P{(b`rMZl@)Or9@X8ReRv?CLTu>c0xu(djTL(ebd9CQ9O~ z8XTxj+di7Cfeh5psq8O^+*ti>SI7Og`A{mj3%-gf9w{bnE%q?eWz%^cLqK?xLR5L| zisLe%5CK$@XX`O&t_@#+?rX9J>=eSj=&-E2rqi_jUhCtygfu$RL;ZQzBMLA9>ydbm zCN5a(Q66O}iaZPno{5$((#T2thPRw?r_4veAYRe!!m@yX>!QK>Lu-|7Q?DI%xztE3 zzHj};9EKcSGP3ZwCs)xrI5E4*i*UN)=EizMp^Hl*IFZ5B2Y>%aEc7*$RQs{StSzn8 z#JdvXhd9v{RaJBL#l#*F?sAO4Q*1`xX_`)pXgJx4uT7P*MRSj!kg(ZyKi(1Pghx&i zk2Jy~Q~n?<5RZ|p7edw5cz9$O4xbvH9Cs5>=UEGReG+icro$?L=;N57T471x;N_JE z^lTtTu!p2J)nO4Xepol7~SHGA<^)&?|KDgpq6M+hZP zBYXc&0)xXd&e3bt|4bb16>p+;Jb&rZrQYrFcM5m=iM~XjrRI2$Uvi&?xGT1a*Qor# zX%z_7kKJhd2_s|Ueh4B2%tbIW-Xkbg&$TyKPtn&y`2h(ii2f#J_s#Pvm<~07^24x# z6Lc~XAh@?1|1Agj?+n4p<4fM6^oc}Gm^CqX?ySH;qK3-yTd%d!T-ZiPg3remE zrv_NwSkO6gRoFmHZS~m2oZn)ve~KA^TOnxC{B!HzETX(1HPNUaI9GY&v(kF-y)>{1 zZNhE^=z9P|?avt#8%s`jf3Nc{AS6n*u5$*U!_0AN-_OcM3I_~;Q>jBMip%9z2jeBQ zNh}Kxa^?BPPhx-GdTtarNs-Z>7aJkuckYjW#VLmknpMEqyCl17X0X9iDTYv|Ams1*P#~hQ-gzi^Nv}*n7dVh6&rrBjm6?pCTWyFF_+I1Qq1o@pr`(SB5`- zo`_UJN=D{&T%0UUm5F1!n>_~aX@t6xr2Y-N6lY3 z$$$s6Bq8Hh>{Ho`Y>}?@<0dLmJa}OPX3&bU)d@&?5VhSCW*aTy=wFAwP(}^x?cb53 z<{0+Se-y{9m5mo#O2 zBtF_x=uZ2uk;_PGLDuDM^tYrsR+t)l6H^}fY96#8*zjfyc0#3|6!9XYpZma5)-;fp zc%(9K*<$ilUWs~kwg0ncanGJTQ#M&1kfLzr+-(9m+IJwAQwD<_mrj-pC6JhAA$l7e z98@;>e4wUK#sff0NCkO~j(6VE7w5xngv)ac%Zm^4Jb`PZw_~ilquNC@-&H z1It%Uhrr2miqdh~V>5H5=khQn?t5;ypW1P)*MkR<)7!`!+}Z&o61Y)hdoHtcy4JfBw$2ZQK6Pip~ES%};3!*Svgv>FtD?84J&^n|Qzc9Y;M42k}`B zbf$ws8)cO#g7(cc@LscHcS2wPnlLWp*)TvzzQfmJD3M007nL* zRRx{o6iF0GW&)V>WSA7WR4N}%)0ewzf<2aSY;Nx7bF4v(19M?HP?;QU5`gG9+$L3U z7)Sft5KDPVmkk1CWs?spsq#MGF{HHN)T}^_6F5fkdJzQGFw1)ha!5n9l05sxe9?Z7 zR}7;2Af3Bzv}(j(4e7Ar^J8x|TCX5~e|%4TH0}{Nhk+`E15+*wM6`}TLI-J`^0cEgi)q=`!_fZ?YlxX z&lRNm66IMeFd`IBM4r}*OiEwErevE#FU$pn^kMHN3#{XY^7!)3*d@i}tS0L;_q!fg zkh5X{t^_sanJwLR3*f&J5cTnw5z-1E>Z<*I^Fq>1CkryfLPEtD{~10~37c@9uJs(k@nL9=)!^>3h3 zn6NrTp+frguQinbJ6%72VDDZzfEhN+5IRT%H+aIHD1U5= z^fn*2oWBg(=)rfb`!kzg+EgAdaSTIr2rbB;Ga?v0xKGFT*Tfs1H72vJPzfLZ5%!J> zMAjoyJr$v^z!L4~jsrbcO~$ix#X|HW%*N#&0d~kBr=X^6aWv0t62#X790Tx}h{T1iTo+;v<)6@e4 zMQO}n6@*2_hq37)cPQ(y+FFJ!c@peF0^s*OBV>3f^V_K%pZx-8k^@=I)F&n-9sz-K z2yaU9p5!YawADr4T!*E}E2spRDddph-LkYMi(EwlP(v~0Z3OoOsCh70SYXb$)yz?wSdoCYb9pRWxhOH;Mk|Qva zii&Ush*?IlrN4Iy`WL&u&Dac*?S_s_i@Szd_&MarLbxCGN#18QB)u23>$X~zB1Ey3)AS^^)Z?0j%0$24ZnSx-%X9-To zQwVh(buA&H$7ZUkrgq&h5O4sK&3f{kmhSDD@3qL|-$FATgcY)XBIkyjBtLWJuF*Zf_z-(=Nc5zPyOKS&u;JbpDylb4L*RWD zV*oUNiU|}}hA@&<#Qs_gy<-pi6&L3ru!!f1moN)aoiLH5PsXC#Tmt%q!avsGek9DN zSq#epDK`KerG_Ki-z%3QI`)Z)UvLzX zzZ#K|Jj1-!9J|*FAxLWp!!tIA?V;wpWj=GX82N~drmNdKf`HH@06;&XP=K{S(8}9^ zH(me(89D5p$GOnCeF>E%p(M}Phozm_Z2hq8?}5D0Tj)@5EwA#+7b}+hR*Out(x-cY z+bT;--z9#WI51Z_$dLCqy^eeXP_HN2h$i{gdml+iq}1Wp7x=N`U|>vibR5Jv{MDa< zMdo8KB(TN;{*=Z7*2al4a*%j@ zxu|gFjP28W)*>m4?#Z+kKw&HM{pO$~{CN2O0pj+aaplKJU>EgJMF)Uk0e?_C@-5S> z{;d04bp+zeS47#1Rj~Gw1=+aNkP4Ta3|qMc5e!oTt>LE6J%;^TjFrkX>+pM^=ib}MUaHD!R{&bPO)R+DEOPnhG z4-dTOac~ALq7FR27PZ=#q~I5o&aQtonwnkZSkQ&IG)sl1sw@KX4g_83JP$@h3 z1gv@0hHA5gt^@9mITrxkS7Yzm_k2%#3IuXwW5Aa79TpcEKw6bezS^366fer*iFh1^ zAO{-!+njxnT&);AX11X)>I{kz3BOh%C?c#(!ck=$oyGBHYXKG;A~Y8&(I{ZY&&?t1E2(JwC;yB z{Mo-Z2DL8$9jbL-oY?LL)C%7>g5drbkiNTY7Rt7^Z$YLf0b-5E=0j!v3XJ$%iNxXt zZ@suwoRB2O@Q()DC6Rdh5^t9vI|4XOjIsv!$5u3KQ8wY;v3O%fqgCd#_sL)?69IfoOqP9%&^dU!=JQWFXpv=i%(b(W(iMSI~XY zwIEXfwVmqms-K(7X{ZQJ^T}a@Fx&KoIw|t4pGnhG!T9Cy;(_?!F-;sSn528S)1 zXpnjr8+ANJ-rp-UU1F{`ivL4yIwa<&AdEbsPpe7;38$5z2_Bd5oS|FG`Kt zoXs#LiU%Di47PBRu%Xzk-WWt|gKPt5HD@1AWKIsYgW~M`hSZZ%^y7zr1*Bupw{52H#9`E|93KD#d1W_Zz&|#Vkru*5N`$EP@~x zqEdkP6EU?ycIn%OlKooc;`ct<6+lR52Oje^juv5vps?nHtbJ@$iW04VF}QzY5lD_O z4!S2fen4tiER#=zKLTkSp_l?fLJ|0E+425WwcDt)G5f9;}Sny$00@kj<>G=Zm*H)?tYzt8?N^%KB{d0E@bE67gsc`>t{kD`G7vZUY?si-Bs*M}JzBKZ z4*86AmmNMmg0sZvUvK!a2fc(8#ihb8WuCz4aL9Rpy5Lucjk0}0ALIOm-IWfI(dl4g zDc>ek$Slicnl+U;Zp>aZj2^(fVG%GV{+R@1=j_9-U#obu1<`&jySopYwrPCS;26^-|-vU{Yj z{(;jP0mHeN8GhzK+Uf&;NixeJYkC7{>O1J2Nn|TqlNw=T`}&Y!aW9Je9D-Nk^q0l* z{4VfK^j!Dk`v5nCaZPY=g0Qp~v~1N?9Xlg~%=HKEMoV3i>~RL^Rx0-&cmB;Hq#kNo zT0HTy#+u`X-?sF87yw_FfLf=5Os9H1hd$uh=Lq9x5oe#PM;Hjaz!ph>iz2ZOgLEex zY{T$0jpV)?mllwP>XA+0N4dnaKGeqOkXmJM56u>?Tz_kG?92%FnFHP>FZNto1u_tv z7#H~^CON+vr}rUs0FjkW#C;IJ;6K0WcL4`G9bE+Al>)X*4Jkn_rf8XNTlTdDus%k~ z*b?1|aKk?u{)dqHu~)J7qhVj5{CZqQ>Xml-B}t| zk2(5%RsuRD9NS|dL22XlSp7&&)sRa~9_uv%bPvq|Uqtl@^~tRLI&WoRbR7t_3=)4I z+DENu4pjSP3G?MDpP#RLOMqqK{m?^PGJUa#!Qz z&46_qc942QR^uQh1M1@@^3Sd>9CrW@&+*C%RSK%u#)-iY=G)hScc-o!jLRU8BG#rPti;_yWL%}^(9(6t zG3Cnfqaq`cJK}E2NCLjgK>L{_g93eQl>)2MT_6f^yD^LbJ-TRslot8&d}AwQ5mQh# zuqpzMS#%*8q_FF3Dl)ekv~mCda|Um~AU633Zgy`keO?oEgdCs11{$*dj5KB_fR?ER zwM0k&90R)Wg;YLs#v2ev6e%;o;fY*(y}WSGa~og6(~&IJ-xi8~GSo<|OUug6A#tjK z3mZA#QCLj^UBZPT({vJ*K9E1@&!5w~t8)r;8k8niL9feVOYH|~Mjnr{Klrnx=?wO% zm@#*4#UGW&d)QGce^zyD>smkYxwv?z_}&=_++d^%vi{P(?56Wygh7fQIy??8yJh-o zd7A3W%Ll&#TwV^ckU|2vjRTHq-D3ywXAanJLKG~YL4!9DFGLhCCLzmQHL&oLbhA|vEvjQO5t5v2XBhtk$U!+=1`pYdw6>U^kIXp`zy(1GGA^O%86>;} z)fBT&KlnHEtkeYk3NM^dd!2N0F^O@!W7sd)zo(wXz3Rs*4^*4qJ=(UknE7K6eM=y_ zWDp(oxPBAyZbGee|yCPG$L=iYGuU!tw^ z766SvG&gkF#L(1}2$+19;p`rc%x@wB1CF6xz9Pd1yRF(FnhNCC>$h1zADiCiHkFS# z$p<7*TKpd}mEb#V*n-o9?Y1PD24IPwmzalWYsi52&TY}NeT>kh>+sKuUxkg?GZ9A@u5J(8z9+yQO(NKOu(6xj z!jrpTrn=nbr}qN?HwS}2Ot%)Np0Hv9?+{gyjpPBKW$m$Z?G!v6XEEBL2AF0hVE`i;jn!UiORbaQz z-(iRHkw_Uyd1_KQXW%|Rc8`>GY{1fA80rc-rn{i|ptRl1(oe4_C9L#2EPuj5~M%U>{WooQDtU-GBpGl=B@ z`_3m`5$xYW1j`(UblExwktyYlEn%d4GV1=I@O6KBU3p@s`CZ`Jy$~t}sx`ZhfTJDH zzJbr=EeZH*TNnKi*Fyt;8SVrd#k|G3X_(y33NP6@ggfT)NgpxKT5e3rf0lTMCSDiv zrfZJ2BzC^TR=5ChpuZQb%eWBJEt_-IXwB!STf!#rt>Z#qkQa)8?p&{E!vr9c%+Kxq zmIL~U(710+vCQgNm7*A+pcegnMQQzU!@8;J@^MDl#fs*8R=GWaTpLSGz&o8E)&KRC zJE8`0n_eK1QgfW&N9tl4^IbB>a&SUg4BY8-GliC0`Y1qSYO?7OP%FzK^~S)8&hRyk zrx3iWRw>23ctN^}RRfRS6`%EIS$+KO2G;x`tuTZdIORFN8X5?h*ypyy^wpt8d)Tf8 z(bE9_CB(6dG=?B*$FcVlH4a?2L!AzzoZaa1Wm$iO@dMNEwfl747pB0+1pamr&L_d( zQauzpLko!ciBP_Hz`r}Gl}r~*h=P)ta?w_1bwI(2@L;=AoQqQu2f>$tIl#or;3|yn z@MQ=;p{vMKcByV=`|9*kc~b(7#06%hA;qdRvGNZHFnarL^lgDLMn(RYf!j}H|@yWPk~fw)*gjiZH9I!(|oP%Vv2 zQR$O?^*_snpJA~Z%jHqgNcez4^iw5+{WTy9vBmKlih82FGGcck3N%^VvXKt7v@&G= ztpe~kP<3Yk@_>5CE=I1mTv({1n{nBE;?=whD_VntOLBK%Zzc7rVJH&z_i~qg zS{norC&!_X#&4lVQ;OW^@|UN-Hm3jf8?%wkP6_Lb6xVm@GWD2>t{3oYLX`wTt${oF zRrIC+-0v(I1mZnxXM0ttT=ZT{dq9v^Z&l30>-iEG^b*?q7?M*6ZF(>LO@`f2|4AVX{v>N zGD-iCd=>j7L(U*BF(BI52hxsu4ZFO+grnvsv|IDuK_C{QZ*vu|9Y#gTA+GNzO_~A) z5fT_wb!%*a_T?@NDYCAWyC240KgNC|<$RS`NvIb`CO#sW(?lju#3x8ND!OD0aN7GU zxn*n``&4d|bwr>{LF(92@03ZutlS)?l@EbAM(o4{%H*{F&C=W29HqiN-vV7MOdqR? z)2QSq4|7RO!!v59Ij9|1L{FZpK`_EXg(Z`( zOFfG;jb$O6s3}PjS?uyY_Ry2&&@!h1mwq|9w%Cm%VTF-k9Kztn-dvK&lA?X6V#$)7 z0wQAyO_?*qaru=ErW(Sk*WDAKe#@FvAe;d8526_t1D=|k{xv^%&GZH0lV z_DsavBj!t*@c6~5-eB;|x_cfk~4~+En!Mw>?MO}6v zE^DB!ji~RinoXj4c9TRd3rFlx!A=rK67a^U?1td1Y3nCbkRHWzB*9TA_#Ma7*2x`6 zKN@EF%;-1()}}N}lL180^$@@(iM!45h>5j4%dIg^XQ`Hi0#zCH?xVu94_NwOFQo-| zPEh)G1->ujP9z>5YAa~FVjqa+d%%ZXT9kT5c0J-=2!H05MGSTqUD1uQ4Rt4IRREXaDn2~pEhF2W*DhqSv zE4S!gm^b(l%)alocD<57*{K)1rozt$rboJl>}^gK00*lECK43L<+nP0h|ZUTn1Or! zm=r=++f^=d*+@9RLl%M=qC73TQn6U)E&LZTKfF?-!BL<->^x4RTA)cZXJ28fAQbN7 zZ)lKL*XfMBkMMklemTiiUrVnxMY-D{k2ca_7X>vbP6t>T8bdKl_F+Kr2F12+sPLK0 zx$)IjF#MTa9t~+gM&gHFP12{yNh~>Ls3lhuMm{eM2I>;j708*YFXC>26#hocMG`^? zl$ADcYL%FiwGP@5HxhX$Hv|kHx7OIe!>6nCb#RYWR$vec7@L2V5Zd0HQBnyZ#D)10 zGl?S4|6z=tCkw#;DPe30XEDhEr+|(7+aepdf>YU|`n~6`OnSz3HH9BH5mouvQrqJ6 zQNzMlC{vEoRa9_?QWp@*S4T1Ml7}S(i0VGn0pyV_BLC&B1@p`8Z0#@6MyI|T*NtO3 zMH8$peG&Xo{a;#uOD~aEvFV z9T)<5_W~ir&yjC%#aALZi-9|q$h)y@>@`6%r6Jv~?r68U)AjuE$@ihXXsjK-+I^h$ zEM^nIUrE0o)v+(tTzbcVspM52A5;o44*U4wr=`IAzu3>&N)-KvvpVS`28eeYVYE1z zXOi}hyh%FqpUlIn23bet-Eq@ctLy`E!=0x^5zrQ|qXO;djG5Kk{U&9wO;|GZ&Qi)D zts-nV0RaJA@mcO#UlnapUEdYH#ss>L;*})sb;ik-SIIT^{S-srn-Y#{7#si?(qt*q zOw@{mv&Pmx&c7aTi{1dO_!_`f@j%r?bVxuYQc`bmEhwv+-9LoiqvhQ6h zNEDwXH0gc`oXzo!CB!vGXJ?GD-iT=s&{?A+8}#6XU*B!fQIt4Ra9U2se_)48WjQ}@ zSC^8$0-7|OCWo4|H@)Wtj^!+Fwjert2r0;x?~?apg6-&O4GU=g47;Ht%3Y|^xR{kh z1cBlE4UmkRKr3U;P*BXlEuk#GrSvk%2h5yb>>3Ln@FVMyOLtfy{4xqykZ1`Ob6o-V z5)Q+w%&C0?m}6&-MBXzEsFlSoTkV&`w^5XxPL6&Sl&7P zLuR`v@RMSmpIl}8iV|&(ZT&kmf{YqTZ7+uY=+&e5*0aSzJ~MzmOsY_xK>2I?nOQTA z^x@0A11FsZRT_a1yM-eYAsk*LkxrH%Q#ue++9@5?vMtS6dL@ID;JU zvHN$QR*W93AV48N8MfOGleE*N;j&@lS(OKr^fxrM)rv;}j>aQ!VukFu#13mIj>N>+ zEcwgu?oJRDvsO0}$PX#g=rd_KCNm|s_Hua>QZ@oQ+xt%xwlCM+FYMmI|5Ok4pv6}{ z0YtDdol_^>;pYI_n$N#5Ystv~AuyEYi|h|EN!j!CTJKK1%{_TIr&k?WgQ&vg)W$-E zZnq`XF~3Q;%R;xp;Ra_u{iUfFR$ z_x${y;RQjMw*fCIANZ3FrAj_DG5si+EW1CbajAH!deF?7XL{%J;p|0W1a2%v9q-iw zv9oJoK?HF^TsnaMbPi@k-z>Lj1@Av}=!eSm)zw>|rCDpY`D6mJ%d5Eis38PD@d7mf zy}-)X#6`FvtR`S8Ika)3g{|5>mMcx9Hx1eXBqnSaVF2Ue;)-r6pO@5o{VVp3klRyCMB8)lxe8P~?+@PJcHtt>uJ5EK0}uik zCW4qP*W1{UfkQN+4g|yBt7IRsYU4>;`(jh&#bZ%WYL%X(FlcE(f)7DDmmGn|QNl5a zGVTGuO92(e)o?w1O_1|t3C=5X7r=&n^(*ht{rBs)J3fqL5S3Sea{&1OIFbJ7l0rw~ zpwRs-!a(jgO*_NCXG=QLWr~kNG;)f2~@8nq}xkH{~q%1 z_gM7Kt?4!hin?h4WsNtd!Ks zefvt!UA%}A8f!JJXH5NxE7ec08a;IAf!6~$)iY<98?OC`tXvi`7M|t`NK;X&+K&!Bi=3G#6F+#er5dq4t`T_>d^ycp7R%GyC)BCayi<|5@zT|;%fm&ba7I)H zzn%>9v3{dViFoGd`|DSNr!X72DCMEo!`H@NtDqNMe8|puF?5D z9!j!tQlrb?{-ENuYhE!S)#rD4`1vSCHY_jBLfGBb@}1LWpQduPwN2~_5nR4(;_gFZ z>{2o%cZJ!E*8HWk%2%)~KVEm)^QS=K@&|7idJtKOZFJUsu*E@ZQ++G#=*VVg8Pi+L zR4NRbJGabjg2@Z!T3cRApMh{-_qw+C*=4dXn`~tq%t)a^= zNSzS=_t0VfbKZ)I{2nGF6aRVjHS(Mbl$0a(oBw_KFGazZu3fdJ$~$9ht^My+yVe?d zy@~(Y^<~phm~4|D?akymDTM5<9+JNdjxKV=-7qjR@Z{>96azFupB z@c`cFvc}dzChgUpFIU;y*DCL0dHbZ}OP65kyH$xvua&j;o|1dOuCBiBH|e1A>4LL4 z^?g}e4Glpn>x4_AXU*l~)dEC#c>_hrhdFf6gZr?}8maZ{>(egK)2l1WM2|@9h<0)N5RSGsVo{`eFH+GweNKXXwgy<84$1v?eDQB{CPc{_NXnd)?3D zOsx3X>yPTSRyg_=1?1k_;670xTP9JR_}0bY*{=DvGLyp=Jz<-zRY^xbuJhK4SjV_kQo(*2GQrMMro&_wSky%9LY7PYK=mzirz) zf%_Vc{i0pJ=#m80BwLnk-&X%83>^=+1GkEZ{QFRQ6pUeKs(OGcC&%7$qRlpKs`%hi z!0K_<-Dh&2jd9Z(EUxx6(pHo`u}UKIM(>coN~-Xv7f;Wdg}qM5p$mDK#}U?Fds3+S_|y0s*JYvk5h0lG4)B537NyeLw_BMImm7$TA*QmzJgX z9?c|uLN1Mu^RtPpz3RxdvR&U)n0(lq;Zf+*rF`yO(uTZT5!(;Z`j(MtIqbRL@_n0s zu@yPk%(?%Fe$&Zp&AY(ZLS_qGiWOHaR0R5~>ca-DJD0Iy&U^3mREM^t-~O_Wl#9ls;LbbBl5g!Ll#`DgR{1LfTP@f zFRz+s9L&sgGBUI(?h1S^)9jz>k_vvc=I^>}(gPR0Z&Ge^!+m`>!^LPkB`htKepGD^ zeL60`d^d|f$n2eZp7Up0-gD>nnu?`3#mo$AX%CsFquIG7vOjsklr`e7O3yU~3yxkN z_F-%@T|LQ8!|OTyN-vz zI`_!?)ZT$ZZ<`L^nX6D$*nNEHDEs^QH;j`H%}bxYDO#$nt&NMP+O$TU=Hb^TB}YU& zW~QcYzA|w^=eCYwpBka_bKdH zdok?T{Wh)|Rs7y0Gtn~Mx-B+-}Z@Fp6yw&pkB*-%(+Y8_R5hk;Xk`X z^9n|f3r%k-E#p0S>GTT94!*?g$QZp}Yg+coQ&Z47k2_IkYPGcYePy#EJsq99ckXb4 z@~}kmWBzjgKwkrgh(le5J?!L*et(@fA2#i~?L5r$ZqjedtF6+0dxanBWhx4+*Js|? z^h6XnAfnaEwx-*2mVKrBQnK7U=TJK)=sSUQ%7nl$@N5{$Q|AC9PMK)zxcz z52H<5Yip~OwW?1)EGYfFy}gYK28Q9NAEWw!v}Odp7uNPP^8wl`Aibu*lM=F{-RQ^# zLs@5cg*{I`;JWBL5*HtT0;$1k;aoKILO-=jl$3k-40nizQ47Yp2(SE5y_Yd~hTqgx zQ^$#6Z}8tAA6?if>VDH)%ucKm54t|kniQ5MBzqRZP+N6vdw~2(4p%E-h|5lenZhx6 z6DTi-tZY-EkC_=6XpBa4=<*jyZw@hb$iEYL%Jywq<5Q^a?P|LAzFFeG&Nx z;76tD61TncWdA|!9*2C9Gu3}ug5Mf=E^v7Fl)LRVlUTw|`3JlzN{0}uG?FrLtCr-4$bt~maNDqs^9=Z>? z(>p4dUTaG1bG10D?*rd;DqvOUBSQt(9~jQwfnI@bmA%1LziJ`y<4nlFOtv{jg$(XU?Z z-no+sYDsA{Gh%0FKL`~Tx)%27y&?vdFm0iDz^5VX=9^9L}Q zm=AfHj!QhP2QA05RZ8Eci+bAJ+wMi4;x-&^E;(e;OyfA$r&$xiEiqbnWaq&v6=`#C zj|_Eue6@4Oh1BAM*U;ihO0w|6iWTdM!H3XG*8VY2R(7};UQ=`AOz1mGXR(;adc7oiz@8?$nO!j(rISVDhLnBgowdvjfayCh#*Ddfv zh!AK|z>fZj-l#f3e;j&`{`jHG(Lx+C?t#Sc3+{TXd3$QQtC!O1! zb7&<`I!&V)@^ds|0#)zdx(B@dN{VidEgd{kBu}2CMy3x;jb1m~TFR`IdCkgQyLU$_ z^H`1jk{WExSc_YU`}GO5CY055XfpwqRfBB885WY*s!&?t>0+s(B;OAygX5>ss8mHmesK% zkDlw!oVNcKe*6A|c(y~5@oGDcymg2&6`voKhZ2XL0z-Q{(TQ^2t4f_B_LBiMT8)r< zuvYWyCAiojF%-CZ^f+bphbT0rHhVdQJ_u+?i+a>ws1#!zNs2(H>?@V6P{?LD< zddV;;RVHra%$>Q)(;6LIoGq<)*Rr^*tGlS@mhh(S9$kcjynJnV9W-P7dGq7dMaM>W zOP@w#9hllmUG4kb74K&#VN!{v3mYE}4(eVEc~{w`lba}h_e^eGV@8A_q9V4io?*SI znJ6^su`Q=VbBFVWI>z04D8BeuUr+0?&tqb2?DW;EI%}<)r{4;89NwBW#-H<^Dcxjpsna71^3LONNH@Ueo0-y zID;SSR|{Slew~@H-(yLzjx~sH|Q$ zdGGaW0klCuzvY9lO3(On`Ebj6O@3Y3AHw+;57wqK3GJ;igS@IXxuZn{_Ew#@L8bSCKfL4rZb>OL6_zX?&b`LsY6>L(Itn8 zmbTU>yZD`)VL=b3E*cXjO<;*rzW3fimyi4Ry~}>l%(A%Ef2^%ksyPy1Z8kX`ykdJ$ z>#V~d&C6IlgM~M3RO%xW>xZxkSGSu5nQkpCDT(+1Des2Gx%%3Zk2(hj??CBrVesb$ z#|}?!vgoe0Ez*iFIzDMszM7=1vHeu6UWA|D7HGbm(92A9t9WvZt(`2l`Xz@KnoXR! zi`Bh%``tC0uDzcQyKb%&68dr)*alh;TtW}KtJ^kF7lJRy5I=4?yP~n?o!q&*4_~J& z-e<;b^(m*zaF`-l^OspZagU&~Xs4UdkI=4T6VftoEIT0KvqfLoy+=P%*sHiENNHtbD9k-Onkf5}0+en&WT>zMOR)bYLc+gZJe0;v32 zOAZzKB{9cBZuF}(fDO&vPhbNoW^%lm-AHL}ZPo7)oho>}{;XM$*|BTq&%t-C1B(~j zBOfs&r=nT4I_zU@j>}B4%H6YOLqet&X1ShUusK^!?mTKw z|M>#Um?;Wil5*T|?rnYJ@fEnJrNRmoYo_^1ZGKouUC%rRO*2< zoM2=Yq)9h9@cA|aKN#9;X7)MJdP7XZ#o_aHLIdz3*&On+Ug&`3F=Hn;{AOiiQ{6b$ zh~l?LAm?odH>3Xq%CX*E<2r5p#r$POzDvU5arC%F$XweS@lJC+nP^`eaf`n3p8cGh zo^q-4$Ah0P9ow3}S~jGrQXZ*4yR{J1T2dUv^yY7~*_Q)92EU)->ns`IsMlLcQ}Mas zKBB*qd=Js7nl`MMBZ*pLw{%Jz7Un!($oNry1l5)>n$~ZxT2EFe++CJ|u4rF53Jyxg0BWT4iiOQVQ%8%x( zOwH=@d~07D)XmKdrl%xSG{q>$M9w&ih@3}rE5D{prt5$0ci9iAx=V0SpjzMJ7D=f_fxl+2@L0^5Ts6gX;V)jrI@(J-c z>Gg<~1aS!oMGfh8+cxQ=Qwd`1qGx?mw-pd!H$$d?8PK(E z-F9)^-qZ>$og77r<}A{R6Y(2q4l;Gk(#-7PhTYOv7V=R=^%4#74hOFz4D0G&V!$5I zrV8HaH%}}N)q^*)4(%CV`E%|fS-t*iuHen(FW*u%uDZ)>s;J+pC^3$T6FomLbGOQB zaK`PgZ+q^@V#*IAX}|XjOnYj?mUCvrP`CX3RimSIPgq&)pu9lSoM+;0FB`3F`S~kX zuj%J^O^%QMFf|aLq@%I@P}O?}rG-^zu3S0bb8!;sZAX{-QNCt~6n$ap$mEe=^QI^K zeB|S!r&hQsetmr$`P2tc@}xPKqod;mxM*N3B#n%?fTExU2uUN6Kg6y4h0G7R01rwi zJrRT#mX)oAyDf%pbbS04no1&5W<*)VQ3gm?j@kAyLOQhqFvdC*bsCCJzN-l_M~rqG z0t|GyAu{0{cELIm*UR$aI=`lK>ay1i}XBkd+tL?iGtR2P5kMLS#PlcDw$P_yD$3dI7de2 zGj1=~f^gwy-X9m&$sa+-taj*R$x$fi`-V=ZTR}hlcoTI%RJ76bci9gW2NT2nwNLXx z9>V;4usNFv6#HoiG&*`TkFNQIt@JudIdDQ>;R`}%SBS%Qq7@uc+1}=C0gAe$^TM1R z37?{)O`|9vqB;<1VF!_f9``Z&z1NB6CuP`%A|ts7DG9o^-b2=R@T@CZ@u1LY0|!U4 zU0fENROTVd?`T}p-> z9lvi*YFps8pgKIFS2Y(FSsr?n2GWaq&P6~(=*%cR@c9pU`bVs5)FmJ-IYq;sY|;f*TB8SGl18i zMt1ieV_IQ{WV2R@OP_3g9#bZ}GPrd0c&ENyJ`F`I8W`RMB7rVrPiU<0VUHa@PC`+n zu=_dmD>q^6kYIg8QywsL6|8Lf@oGirl_(#x5p7slQ+C|nf530X2gj*4-h1C!(Q?WNa=rWaICO48l6DuokI#ts zpWnQqb8&N5s5?3qLNn+UV-BQr$Gv<>4Ym_;+*RurYvM{LFozz4iq!ZZ@_pP~6FX#GTc{)vvg3-O4!?`KYtIq6w|ttDlv8{!F?QOa7f6&T=_Q z3v-}Ta&qxJPL{s0zcb>`EYOK+bBNz0Z@BkR2KVT?_RvC|K97>S!yW-A1^LdY+pQGh z2)i=c+WkQ1A(dz_>#9*qKu)gM&4uZ7ZcI-#H+LZNEb1xKrrnzNgi}qE&Efu$mvdSi zB(~AHN9D@&xn+K{6IbRVJ=^sq$>xXc?eB*~`!lqEz4KoPedu?l;6uExS&tpF;vr!l6gX!s`~IxThaqwmYw}k z(3g{H>R*+$;ynION+eru>Y|+Si~piTDhtENlP|Apf53M}%5xnv^EFi^vKBc7ubo`} z2mVQgzv5Z=;q;&)-vB?4SAh7y@Z!gxvOId^RT~Q_|J8t=8Vt+7r^-=4gZ%rUyFmHh z7hN9S{|}An)8b0X2GcckeK+ZtUVe{~aezeN)Sf3hxw#qk?yZM4^!3v+B`hKjHyeJs zzk1y^)>V`&rwJkW)pPIe`I2V!7cG`}-c(jmkx9(&(i^l0%yX*l=leFJ#6oQPM`Qszyi)A_;AepZD;=F&aiv$Uudw#)bPkhlU=Yc9Jflv-3&n_0G-Dh3!^(BnZkmI=Yj$t$y`n zeRxFdFq48wrO`%8W2Qq1OrDW}Y@(uS;p>iP+dwtZt+?gZjEKWwsNx5##xK8oY*YKL zJl{7+_)v;^v}?=9fh%Q~u2bb@WH3XW=DTujI01y-r0+(@1p6q5ksUbkenAT-U~eB{ zR29ubaBB*>-bD!Wa_mis5`VJChoJhD9U>xIAQpeuSY6TF>^j)$M#+WQK-ByZ^9U_r zoBdBv(OsBzefPmD$_75M>8CF*K9%P}dBa}U#otd-`1l=Z%QJnCZn>oYTJ}%Qz4{-4 zpMOCbwR&~07mPC6al{?A*EkIg#k~hiJ!~RutBfjv&_$(;F7;KLG#t_1RsQD8T~E(n zNtyb}p&EL6q^I?6o;Z=;*5aPrhaI+w%oR2^uAzW5@Lc#C<@0=Z=fM);a6U3|Qh#3j zjW$JIt@*dX0`I!{@ZpnDca1u|-Q9QM_$3S6M7E(o;3HDGn`CV4>;g7SNS!wSTw5zO zTk!U6`Jm4JjT__wK8xM_R#_ozH=&)|-PR8^DT9TTgy zUwbo1(*;7k&R?I)UQYhn8&uz-^g1EI!p^z-a(kh&ZErgm6<65x>GrsCa14Eat+@kP zErzTZGc04riWVKCvn%?n-6@zyU%}SCa?K{*dr_c`EyYq z@2Ah6wMef%^m%+o_q)To`Sm%0LYFLOx}TaDKB>x%3ykNmRBafE)w<^;m(X*<#^^fL zyh((4F_49o==Y8*y|L{RogXl0%MjLsODCW9;Vn_pQbp)jHkj_!z4K6w>Dz4|(&$|Txg8_*E_O17;D9G+mYq94oD?Y3IcnKjTp8wqb_EiBt_h<*WGoSa zZ=#G&H*N3u^0?FS*MrZXO7EnnM>Xc5T=m1N2#ex3h81h=!`Ba`Xnsphi zy+M3Vt9rh@qEOIt)8&|O!d)TVjDDkzu+!(yvw{*`Z$d**x?_F|_Wb$u~(#A$gm?{SpJZZIDlk%*`-RQ4l(&7st_0WdiQC zD8}xsl|QF~_TsB2(Al1C(zbNWuww;%j4(s77qi>uYC2-)_Sk2u0LGhF4|r0#ICK~@G`pP(O!;;OLdt! zZzr>;KJAs+xl=6l^4Hs|*RHMYJ%ICRi;VB{LX(Jv^CkzC3-lekgX>jvb-laFw(L6c z_LYtpFyXtMB}}O|77DB;y3NJTe?C%n$}Cge?QR0i%c#r~{6VkHU1(`t*hSvy&AN6J z8S&}Qzpd-~+&o;d|Jzi?R0i|+G`Ff0154NG1`&$Kty?bWe->Uj38khXMBCdaskVLT z!j|`wb+cC^?OH)$7h}CAXx7U3{z=hTtYtywZyl+ix>%!f;Tp#JAF5&uI;;=PPNK2w z26o|1ysoH1*T&vdmvH3NN$2)ZOYtHceuB5OD3AlJ#%T=Azop~gp^BNa_9NmRzkaEL z{{``bKFy=j?v`I3-BjKefdB6M`ZC4x2CTX0yg-vJ?%;6L^-q@z+Qua`o>&oAY&-NL zN(9vjmX5uVEK^mgR}^1o4CqM|gtVD14aFwzrX=cSZyl&FctAxncjdV(<;6K}13rWI zj0SEQ^x@${8L=u$4z6zbfL6D+W5JlIU7#>-`t64vxg`Gn9?WgNX^j)pyPI3lfj-DB_l!M%aSbzk>&&H1ajc640_-tSP6v8$hDF@Qb=c`^(b zXVUaM>R_aKUsJ;j2lmGxneADB-HR<=trGdw-82O*os6O63XdRk%V|K`XErKy6$PEq zp$qUGTb2k~n%V1}exk0f8|y5wdGq=3`Wdj;Ac@n7zPFi^zpkZvCxVhOL2lKU&pgjZ=GBx46R9uG3D;(%JIb zcemubckj~k^3p)7wz+9VDpc8k+^0Y$(@WtFe~t|c)1z&`ktzuPKQ=?U(fa?f8Ca^w-`AG}5Z-$@BvH3#JGIte>UY#NEPAoSDI`3OhS=S``OWnR4Mj~tZv`yK|EF-Qb_#e1Gz9CfLTQ#00RL!e(KHQ(ZNWv znBG^=0Nh)AU|{fqmX{ZAbF&aWyXY14bKjaizgJt}jcaOpa&XtV>4U~oJQy(J`?NO> z?vh`cq6nw;;*;h{2}I>PRw4iqfTyGa1@+3b=v6U)KX|23mlZgbF=AMp$ulyH1O|bv zO8S-rY)=nu| zT~exD|Ljoo?dADAT6U7h=A^57fmp46OEXM3WpbPPrjG@>dGtn`v-EpELR6^mKvz-e zAxs2o^sTg1Wn3Ol#7PtiwYw8P`RtY`A^a@_?l(Yr42H6wL43>&U?b#(ib->FO!@4e zm2yARB1of@woJsM3~1V(_13qv4DO08qG$S3yV9Va+g_`FU}?v-_|H)U+Xv9~=w=CH zvsKIWamU*b%lf{c00*j(z;Js1=FaCgx8ObAvy}hfJLGbaMGV^ec8N!T0pcl z^{ZdK2YnqpJL99XEzcJCr;w)?0<(Nk#Ta1uAa*Go(NYiM~D-uD6_Y}koZ2%nl zIZmBa_J1e56|uA1bt(QP(*@Hmh@=;MgSku6@84gnObT9yTP7iDdS!)AKVg5J47%9& z2rqQZRIOSZWYHxF1}?TQfU2n1?ITeT+_!6J*)P^%h6#ZSL1=KW8iiyl{#iPALGrilHCuj%bej^v4g*t2-P0>K79|rAt`syn`=+Pw$yIM#;VKEE4ylB^VmPFVD8UJ;ef>TZX$F4=mQmsYH?Yh!=pS!4 zIV~r~>cK7qFdvq>;}}L*74`qM9^HKeA3b*LyS(V+C+HgV`%^)M4I5<^mUSquSGmhu zeLR-tX!IwOKp8uWusH#r#8Nd#F^5 zN#Jtfus4ZAPGjK}3F04a2oB`ezDVGCaV$zpt1*8k_n?hr+N7>aGg*C&wHz8P+KKl< zj+?h2E5W^BOY8h(S-&g`a$v;&SRhr_J{#){W;Y^K+O#iC#bJn+R=oR5n5sAHjmMK( ztvO6El`fq|K%Pt9<@jg7d1b7O5HUbGzq*Zw88)JC>^$Rj$B%y zI38vbGN%%u%tK;+tk0}OaDDL6O!lbO*toHp{j!B?iDP*84ziqcSfDX%TwB-KN>=NY zR$#IG;Z`Vdyg%l(lRRNlOvuhSJ5Z{t(9wFgVEY;W+c2+mndEWECREkqPX1r$xz~&VV(o)Wc}J|#r-MWl1otA)YOX&+=HcG zqFe%(@bBx4?|>75si%_5wSeJTez(oB{D4d9A)GL`J*%E_qdq$Nmb}Qxbpgl27BFe~ zI75E0sN8DY4|Uk(t8O<_l^+n0@jpBM3$$hGqs07tiDt#-zQPnxb6mfal1et=y3BN`4J@90Sa*;c`7753Q77GCZy6;hdt?e$@yEc#N%@X;-@BE$qtu5!?;xyD? zKDOOcRqVFiB$=L(6W;@o&4g>nI)++iA`(Z<0tX)^0mm0diAQj-HCHbz5}DLS4D_`H zIf(rpDu4XY4;e+DQ&>v-dG()$j53&t*Q;_d`@;Iy7k&Z|N%U*>GTuvU2hF9y8dCRQ zliqSmbp&b`P{Fax+7;zOX(o_!>@R$seY+I(r#~?V7j^r-oKrjbbDjN@_@~A zbK)LQP7-=wML|}APr#vIiM@2{DB!py(wAR*a^j42Y5e*%_uADA7`&s!k|;QG&=VgY zk4!fLT!i88bc(kcy&aN^pXR{Tk2mwfho^4Gv$4leZr!YU#emK3xRvyWHxbioVnQf! z+5sXOi?p>9i#^U0f-_Yvdu%q8u;)#j`6D(3C_-|m_x$p$4@}pgC}5RJ;5jD&D$ys) zSP+iSnUiHTy*~q(;c-s5#ywx!XIqLfOc(9W-c>)`4fK~1)UVEo!F>G1(kR!#i?*Vs zes|)wUv2py|0x7xYs;hF zTI9mw`FV}rulU8M*T%^~8F90Y8)op{WF!NLZHiRi(9ric2llv+E48j801?@zV}ny5 zG1?5I61A6^=SX&|tZ`eIA-~xr{}`&T zVBn6a>^Y5F<**JoRb?@VNdpw=o6A8LjAd7OI;aW#3QF7v6>}TRt^B~OW~H|^MGupF zruRd}CzTHp?2+$~*W#?45v`-DnVOh!yYGsOvf=tVl7xXtVR7)3-LC$3#cdiinVb3RMD-os>ZanDmsd zQ>Se0GG1{R=!>-s=+N_x$;_R3sq4SY_Ui`Iwa+o*UPb*|3m|AH*N~PO^m~mJL&DHB?O)>4$7H*1jcCxI?v(=Tw!826!JsM-!{$!h;^%Al z_c;7I&IXfEL1f44=IvL5S)uKiG#0J(?owJ6SG@Wtt7!*W@g5XR{lrX{bYhvZtmYTYQs%alQsN&u7`9ega#Tml&lbxt<7g!L`2c4 z++{JVJ8$kUDfpM;3<~4LqhoAemO?L2%3~3>?a>Q0(~wKfh|$4n##4OPlU;|ui|ku7 zV`T~Cd!UlxVhXFXV?+l#4vap(30n)BS_n~Gob~W^z$&gTU?=a^O{R|15emx6j+nze zJ%yuPymt>_r+KukEG+!~`NiRt_F6no+3@j_B}7sDF%urRlKWN{23Po1R*F-}ki7t` z?9|xo!|53~UQ3{VEs)Xd3o*t&sQWz)~l<6XbZ$};|w^zsAh(xngWCKO5j z2j^8g7iyb+)%~>w!G!RaytUyuG5$ZejI}xWL=hZ$ICNOs2fI(paRXww_?4Oc)tgbS?nma=lJK z@fs2JNec@>P$crs?q$CWfBJ~n^6z=g^(P81Uvfl5vaf!rDEA-CJU%~iZ`SVF-o7B^ z-4sb-Y==^kyFB~F&W^DUha?phl@GO?gXy|-P71Q73?yGS)_&L5xkgUO?SQu^37q5XSTF{s_$TO0Sgz` zD^yBPEV2A2~A=Df&xTI|G!r1J;37_OiZ~toJO3VHT|h@Kmv8+a(sL|N5vKg zqKWbumQyM#ueOKg`HjIrc-ya>nZ2m-a3eT$bW}Y)FwmjpNq0PVRsRXxNa=fmV)>4i zM%NLX8eJcao;;xqp(&!^G@5PZ5AG4QTe@q%p1u0H4n&k~9Cf0)~e{4oq(*iV-(w1Xn5W6s;&!Idu>ie z5lfc0i3c3RhC1D+sul*(^duyVpg_BVg7v#UN0L*CJYp}h5;At@b%0>v{*@y@)ox#j z2OTf%Z#1au0?GJ78YO^%bRI+f!+=jp+sJ}B-WNib;G!X%d`EshV4_B zh@aiHK|VeU42#p0A-o)gGzpP0Imi?PD@=~KUFSYZQct{uxX#Y!`Pyf`HY3>_Kw0^6 z;4j+pC%Nqs6zmD_wBDNVymTrvJ@Ak2TY_5i=B4903?#BSwddq~w6&`Kv;j_1*1w`~ z3!`vi&1J26H~loR9#Vt4t;xJKjZ*H!dmJt$=Ipg?d!KsfFWtgkjXt-I@}cgAm(p?wqpH!ddOYTlX8$&3?mhIlwjwH z$;oYK1IwJ5Q`;S<&*>&Ut&CTYK=>wq!F<-0+>+xVrBH(wKSu({rZ5v3i%=eMM&?Va z*SX~Mbrr^;%Ids&?yDS~{V8JYJ_1j?E}_>dSbJl(_@w)vT7}8V(GvSD>R#cuxg(i2Um3~RYm(^Ln~t)El0_CyNkUBrVJ}lBo+bO<9bBh1ao)L z5b)!~MhcVZ**3XuVg=2@gM0lLPu{OX zbC6qxp|id?6y@3OpuCSIeR$_8G+a-WPRq<2`krOwoV^Cfs@Q4g6^J^Tkw^>_x+;3X z7XaHBs_`%W^pt4|WB27(`ze7)tRan>qq3d`2 zaIn-|$&U|4w76rq|3$?>qk6ldhR3h6{FZAnl-_LxT8=&x*a(~b>_dhfwZd2Ji(MnW z_V24xmg1kUwkN2Mg#ME5x(%IEg|~XE5FYud=2J7$#6zpE22YaU6BN`v+k%Nj^$ChPjRK|!9;whI{P-x)lm~z*VEP01%cC*#t@*Uj zsav=)VPVvOl&A2>Ln$#g4+qG!_WHq8=`wx{%V#VoEdd^t1q9eD_r?o5<|J_3-2|i- zU{JiOS3r>=Xp?cY>)oh8^p}Dx&5io?`H@P2cM~+OH=+J9+nazcU#t8ti?UC(ONRBT zNJlSwBLoL~gGddx>J^5uF=L9Ufji(EmF|Mt8&A{9V7vf2So`!=hl)Xc2C<82Hk=ms zfu|^HsKAivBqHC~svY0wN^sl+q$U*1VRjufy_k5b9#WUBfmc(KSlQXz;hGj$w)}}Y5{v#h5{Lge5(6EmErQH% zFzFMzP(7FF`erqWk>W3}4X+`T#8}6FvJ&s#zdv*=0zxVXB4j)spPp)i3J6fi`LNXz zJLAbP2B`9U-mDdbCnSUd%0~@xJ4yvras}oiiaVXmTRFjxG%oAnH4Ta!;giFhS@e{w zUq~3*9qe>CI)dtvK%GZE4SkzFuFq(T{vkEo&f3UkhI@$YL?e` z5?q+M|7(;HqCTj=8untXJU=_T6#y;u`o9vd>fH+X^M>xi6-}$-G;4YHUgAh~5f=O^ zAQ%wZ{aNbbjhPcRAV9;1Pd_1!Dz76VdMFkgWq1BL9B;$nD7fYJsp0P;%`;h{tOGX< z*S|%Y2b?_C7f-B{LTEzU_j((A?Uvb0EdW+~4jgDJ}ZKkwhQo6V8f#Ncc5o$9PRLFJSErUrcQY*oJh{k z{1FIPQfk1($h>kz{~?0s=6v9wzk5%+F;S50mkzHI3m)sF>R6l^mEOnkx`Mb>5wz|j zC&Inc;(MlKrMQ-sQ{&Igd%Z2)SzqevOfB-93%ipxMyf(|X%Oin$>B5z2KC>DK~XI~ zAw`5!K1OGH_2&J6XKq4MKW~3Nb?zIw;>43u@et~TtkT#%O=$LVg3X=RK!IFwXW2*jU1pMTe# zeI>A!5x=YbpD*Uao?(4vYRdnBS%vB~s@nzTtP!02Z_f^?K(`CT`5i7U^_A}Y+S)6S zIQ3b&wp0SdX#ex;6$hNb5|eklrmL0)b}8UD&UK5nYcR*({TZgZ{)+zu6AA#fZy6mW@G|?`2Ny4D=Z1<}@g~d;gYn?~f#u+BA|k9h zmI{a7X7L!mc8aolNtig^b$x`OBL!(nxk)8H*wY1&6<~bnNOz*hZr=`6C1ge~l2-kPU^^FZQM1@rbEjPE^zR*XM^anIq zDBBXsh5%P=aN@mwjb;Ie5VeK=4v5XCmM$Rh#s?-1lyl8JiD%nTHc>G7$7HA#Jw`P) zh{tYj5t0bg8%6`Yy_nvZM^a~p8}Olg01t)peGardkV{0dUvXgRNynLgvS(~CTH>#7 zXqd*M%@9e(BxTukYt^ZQlBIX4X&wC-fOEac>Jgt_l+bCcOqa{~BvwZgEZ=MhuU`ob z?I0E*=Jlr2EHse30$LN>RPw41d z`ZI!P5Hq`rYXQN+84e;SecIGiQkS*fA1X z*B0Y4$}^Djt66rvT640aT`Kz+RpjbKWvRi!=2cN%-VE{i#d=MVU`ynB_f8zfFj?(y zQe6e?5oOB%(et8IHvYCRFu>@Dck9PW#%=U4aL0Hc{UuQC7zoHvm;)kB)ja77lx34O zczQ>h=$28*nH!+?3o+sZvc6Xo!a#6yNBkjXd1tN2^9~yu8X1`*Y8Ak<9~?-Sb|(+4bgpcn6y)j_>Vlk4yLDm%Fm!bF07mF_B1BgcrO=>(exr3zTI3{K%cxRq9E< zyxVZ;c^x;EVXdr?xRuP)OEbw~9ISW|0f&<2KmaeH$7 zYFtZ*Ksq@uFKFA-)b#UcndV)(hzCKgSCSJGgWhdS=ouP%1D>Wg+dQ0lDG9n)Xw-ZY z6In}2?Vz^8`ST}pWHbn*j1b6-!_JO(n<#pwGupghHF!XIWPEZGr>SYOzrIcoN--FY zxS?8?mp5ib3lgzV5TU)Qb<&8^5n9}>J~IWUR>6zjFW8i%A0b!)CdP+?iRV(()sb33 zV)zK{FV?Fk*9l%K+$Irk!U<Ls zilN@aD#2JYY6Tx#AyOIx%+24;mxBWW!jD(;tRJApV>O*MH9< zhS0ytC7xzZO$+kM1GLF z@Mo&rlAfFg2949{A-rIg$1PB64kgemWfCBsKK%>6_Up%|Wsz zuz5MTSIXua4MMN!Loe8GIbf17-~K8Q2E6kHM(nRDeWID^-!A;T;XR(#3o_`3u=a>C z=j{QRUh`l{8fp>3<(_-!h{N?0+>nsf&0m9=b*xF!`P$>SFxu6Y%RF=QBP3^`5i)cm z&l)y2aR|t&WYg&x7>G-aJrxSwOFYgEU@37B>Q$V#p#6RQu#Q>H<1X+kqq~tk`MB}U z^|nTL;jn;A-m6Ydl|e=>N7Q~36E&I*dq+oYJ~!xRmq&EWbzx#1eqbO8sPA~eoE6oy zk$YXqXh3oCr=sb*w{L%(pPeAQhK8^syC4W(z81+_pzL&fT{bD7jUA*b?c1}2Z`Y91 zMpJBdKZ|>0MyJRXr(DpVDTTPXkKYmcD{&R`?2jxrP%^>Zn4yNlxtFBa7+mANpC3(2 z>F7{1$Wx<>HoVi^P=KU`5UQY--9_EmUeTh2pG3|v{vVg38Dz@PI5--BvC(ASqH*m; zlM1mQ+3HP}Z>oHIIdJC6v{#qEsG($(tcA8X&UkS__04R!9RZA>;L3<~deedRRP7Z= zi3VU>yqnYM2~5H%CgnD}j+p67QHOH-{qc(%2fv0q*n6u!(h_N_sg$S0@P(?bzWtV& z^HzK1Xj3>~WhHIye5GHkzuKYeX2IY{1rBIPD1iq<-Y`IGgutEpdduxUSz9yFYWB&3 zqg9V?Iy;{zc4){v~N+q39p z4+y@BoLCKJ5)rexVZxAw+8@;x`-OR_e~=S8lUw_j75t`Gy>gV=^-p&32uOdwTz-57 z0kB^a2-Lx)c&oCCyRQcK*QMz|IspWUe1tbH|k(PZ+1coL-;w?+B z2-7Gv1;xDF$EA{ZVcdQ9>2gbR7WHlG0&iZ#ZDNr=7twd?HlSy0zmB_^URo5ir$1VP z*V^%ENH$tpCW>Ar)49d3U}ehvVYMR-29s$wH}2jzB04vwqrAIsM{U)OUB;QM zfU~#2Yj-OW_$j!2A7>~wwPjF06+_=IY_LBYEj3p29-mtqSGBPIqhTJUFfF@rwEHEG zR59E^#eu>saL*)z8q++U+!2!+LCmg$1DiNot%!}1a-GAt=XLFF=NH?8JUB$%c00yx z?35g->f8lM1RW)zeHXfkMbkJ~%9P|$%^S~q`Y4trrawFtO2K!a$rwdP zfUH~1d(sEy8@-3TQ3PUhx)&-%*RJn%TMeQVV4j|Hx7{_O6mh#XI$8l0?x(&!1Zd_0 z^ZH_Bk3c67@V-RH!#SJuJ;c}*l9KIB)zxxl;30IJjiM^6uOrk7(;+4Rt=1u0bIYYKd>rq!PXVM%17uY0SJjF#n~~+j0`DyR*|b0C85v!J zKnK|bo;dJbd1X(NKeFL2&_Ts=`Bqae+mq2JKS&u7l0>XwI&(h<34iyBCQI1 zI3yXSiZn{EnVPN&7Q~D(F7{UxRg1vL646Q*ZlVh7<>smSa-@gLPTLbO8Ru7qy9D5VJU;(@V-qLf&Z81`Vh9B>kV=MRPv4^33krD4Qr^z{K|IRToZYXfkDlkz8GC{<3pG`X z8p)kP6}c-SfuZuCxST{FAQ8r8>-XWGL7X!4*sD(QmPHJZF+@Y-P-AGe{iF)Xt8}K_ zX&1d)D1&R6ozXiQ@a7Gf54+{f;E$vmu-NaQM~{r(D5fvGr4vHSx%+F2oDwpaJ4Y5In$ z9b^DW9pK|*_a@OP*7wy~ZPbRP23a1jm;Iv2!p|nUug_l8 ze+mc~{n=H+UVjNI*iN=`zbXbZXE&E~4763C8g#^A!=2fh?0V#a{q1#q!h_x)%0H^2 zZ=Wq3@9+^cQdEy?yLl*dcXbi|N^k|fpR1r3UJpV_DjM{!Nq9o^^n)vhU1jxT<6DYJ zc~QpNwx(jt^Izn0+M8Aje>kMD9}db3+AKWl7*2gVuk(0siP}gfG+Ebm=X5#wGVh2# zrMC9$ceO);)7D18xRI#9>2*%dA#ZKCksk8J+dX?GEdi5}CnJpvlUxgvo!}8?D+PWm z(5aK&Qc;yt%+NAJ-FB5%K1bOTY}Hjf+uBnF6=q*`!uF6-9rnAm2RzVvCSqVK@J_@# z(hE4ODop)~1t0VgDEc-3?uEMCsRccJW3Rk$thIRSGba}w^sn_#Yiwq7AB?}Sg9f{I zMtVGsqeahJmjYq4uKuN`iBLh*yIilycA_fHL$yRDkN7$+(sLxWL^++ZgXx!uh|XN0 z3__!uy&Nt#VQfpHoMJ)E|zc#4bBU&at}G2Ml^kq-$ruxVV>CJ&w+=|{^FhXGHp#wI%_u_UN0O;#)f|St3&yFW5awN z=D%@OLPUabFb`Xsb{|?-)*vM&E+vunw)wE4{^|aX$~$x zai*@l%u&9M<@&1j5?~da!ezLS+8%p89)97V8g6?xi)*A{%?D2;&Rf7?sJ9hDQV?)E zN}tj!p^oQjIGzm;Fv7|yLD|wBGrORS>1Q!{iUl{VcU#bi-bms34;~uO{j{$f#S1S2 z)!N!7{kVP+EsUXPVF<&dDxk8wDK8*bdiv-W%tIKjg*V2#~tpSPFDLij%u9$ zwSiyN;A?*v{-n;ew$cv>(0jj48)qLmWoYxLxLs9|qNoU!AVYRP+TUbPo%SEWT5V@x z_@3V09%K>8x?ZsL;cd3I4;lLKAwp2z597(nMn&EI2M?}%ZODUJ)55Kdx?p@^8T^uu zhIS7p|m`(TZt8!Y!Osxmn)mHX?E z;DB0BUgtoDd3aLcrT{1t1;IifFT_kl;i{SE=tFt$9$EeFREA90v#yQtDuK}SsCTnZ zJ8tu|3FGHJmFNtAH2^s$D2LKlqpl@X4R7zQHq0tl=%BNDSkCfknBwu6ZTg9>n4eIv zeoNBucn{;0wf_TO~+3mMXr>8L4*bZ84<9i#xou5E? z{;Kdm?&G-?ldZK_M*7gao}2=G^81nRMqTnN@WmGwtA#X0wVXFOIEtUik5I{tMnPe> zGMvY(S+?twXYS6&_q*kXq;N#4x0q#QgZ%UAfQ5xFU|gQI_!X`U+`I0N7c2Ygt8+$a zzGID$5P9Ip=g$?L_FkMBsefXg?=9U+E6vQzOgMmX%*=BR^FMHcSu|cBzFSFnp7&s3 zX$oKv6!mEh(yHgO?2gMJe`|WsAHO@a^qzKhiCH%XDv?F^BBkHKRELbMKIkQPr*6nX z#M04J0@I5Rc6M7c1r;JWC4%>C3-)3xtmQaVp{MTZKRuXEg(je~YS=$*-q7j%fGHrr ziC||(8fA8X)59!WM`WaE8vjvpWi^r{xvNYFF|ZK*YRqeZ#tk-!iU z7HXN@1Ix4nZN0AoUqzvlg?q9U^orMS?D!X0vcfO{xlcxeRd#ov5Jf}m>w=??^4Pv*)EYXIADL zY84XD1O2XZZHU9Wjo`8RiwifU>a42Dt3QQrGBA%gGLNgcGs4BJpCnuZMz=!9ED?g_5I@K_L)lch z`K>FexN7W)@sQVkf}9vujdBd(zVKzMjl}`AWYV&=UY|ZCpn9>cm|wHda)DoM`{>BG zrpBeZXTDt?T>%dlt`$D8Vmw{$c~9pxB197uEUcaRoiw%e^o=yES^>7L2(Bt7_DqTg z^37l-4N8H5STzpDz+Dg0^_;Zat$>?VukGW>T<&Y=VqYXaZ*2>Tg{D~7pf3}3MjJ}{ zbR58#4ot8`pq^5Jal+}5=TrMUjsw|9k9f5o-3_U40*3y?e0a6#)+Gm3jOLac4rSWa zGBeZOiumYgOFe1r=Np+S!=`Y=-`8>Z1^aeXbar78R8j z5D@2UHTkr!!BhVDq>RvU4OBs``>y~thD;1|7=h>iAO`W+-k(jbe(^~`sYvj*=^| zov9FXFLZe^(M%Gn$!vg0c3Nx%nr*mf-AO-GILV8tK=d#DKY)`J=+!a#@qp`3wN5NE(JRej;V5<&I1y$gqnbnzY;zu>B_jf_mI zjL=e6_PK@?^9RSE%WS$nBF`L9G-zX!Dsx>f+-`!;Re8xFGb37Pa5_8O+_$_}@lRp) z&``v(kC4#BuTwcN&$O;VS3stt@E$tR#^W9Owlfe3ArwNNL#*9xjsqD9B6&6A5SN25 z_fCK?xF9Y{;4*#vx??phcVGhA#ibs1m5B_P7?Woq859jScS&8ercqQH*pLnOmS_NZ z5{%>e>Jda9WyU;@!YuFi~W@~vA6|ofqb&*T5xC9lkFzI;3 z5%{06IP^^ZuG3!dG07dCG4V@UJMO5pr)Uey@T;iE1q&qoWQd8jGI>GY>?<86b^@EYa1MoCW#$-!azjLtv-WT$#6b zohrTB7yw_tru?AN;d>`5JnRQT*SN95Z`)|)*1RIdS;Y=N+GAxgIqX*+NygG}zV>R` zVhP`z`+<+h&+k-YfeUf&cX0%h67+#q_9q~X`)aCm@DqHB*A{!U_{llu_^)C*Uiq4| zYdu<027<80T$S)S=W_TTO{ipL9yunPh+GbrWXz%mEh+O7MTdvyIBetL(dh5;0{*7j z{a!w~^MxH0w%a@H)~Qz72iaAq>>uOg4)en+RY+&1ajhI_l@OSW?G5eh;|33Ty`N!d zl3BgA?lrGtt|*Z>oE>>KuN=XAZvr$qGqdXJ?+_=b=IVLjM$)UjIxd+nS{eq)w~t~< zOG=sns6)$^+Cd)u*4p8E3s1Jc!Ws|J_$$GamW{1Hf1?N&F512Jl6;v$%j~F=JJ(PP z?43K^!nwCSE5@QztNDtXlY#%FBo4hFXhD#KkJL=$75N$VeZA03HhsaI(p#u~*0u(6 zFm%L=v;#I?FsG*}^{CTLI&MaN%GU^gf~-GTG8S_B znv_d-r;)^NNfuf2>REs&Nnrt0h@2-{L?hEZ(z)>c3MM-ICOZH2#eGgvPOe=#~HBJr2y=Zl&ky_4S zoTx*!gJb%jxV0*J=f?1$%9(4ihxyx`@Ysy3G7Jxd&2YNS_vh z5=_d*hOy30ySj##OTf`qSs9!2k+rGAY|%v&57Hv+3cBE2-O-!5-9^!tHRV*ug0r!8t|UH!P%t%OyT`2vIBsZ?L#tzW==pPUtti$$vEdynjyckz|I`D7`w)XE zkth(7%6vZ8mgj&p+!PtDcgI5o9RTkzRA}kH*d^KuJ1IOq9v4jWT;|BDs3+x+%wF!e zg=W7=dB1bk3#|^=End_ffTJ3!-J1X>KY>!uKrdOdO!;R=PCS2ChJuFa#r|MLt6i+G zFJ4%JE9O@1Uc5%buZ}A3dos^gmHy!YgfI{&fDioGFW1PLKSun6u9aP7>U{a`9WG2) zR}&Y{ZXb2ptnx4cfIBrU6nHjebuFzF(?N!n$(q+xFhjf;VLto?#S#1scbdunV>wlwkLzWXff|sc&DEAv2QdU@p%QnhjSE+#P)y zR?9v2?YF2OV33-QmQ<;#-F1iQzHHS|Fzb+{;j+GnlBpl)VLAZO-Ck+{+W{u2U?e9h zeB0qc)5_mX#VnXJZQ|n}>J=m-48QQ~XXB)+UpGG}A^nWoKH>mH07=sL0J!!6;98uR zkpTjOFZ?tn!TGtbA$xj=TyHywo#!i*SmvKW0|apnktWx1f}dM&ia=g)8wg|{x*ooU zZ`{<86S5MY%>;OTp>9KpL+Z1=mEYUAlN@?}p8)$rb(gEAxl|yNav%4aKN5ZgZZNe}cU7 zk_RD`?L%m2?39C$%l>u9qQA9gO<}wFinF#(i;nMi?+m@j=qSI_(PVF{o^D1*vCy;6 zs4IRUZtGNiZsPf>`z;zz)vMd!HIvL*7xEB#@x2tr4h4J^u&@~&$Q5&s-2Ge3vKFC5 z@xVyrnRM>Fp3xVX`!{O(D8iuQz9)kWAP~W+0wfu-0fT5fC*A{}B`}?pnK?fw-_QtZ zK)*aSrMBhxy)g0;L#d7^2I#U<$6X`<;@6vN9od-=75rX3e!Ir@9?@2Pje>cS^si;J zkJ5>o04#%XPmyEbjRdQ9HF4>ix=^S`h1`x6md{{q0zUo4HT=>27(x^7UTO?O{lxLs zKziiF{mcNHdY{+g_XCUuj-lv!ma_%8-sfBJVpo23K>-O_$9%F$e=)#L8Ff$k&1X?h zvZWqvNUFATIXXb$ScdI1q@o@%9WzguqN0|vvs>oq6k+?`z5Au~=Ov0!gH!Y4?ZuV( zP_-GTnV*0bWNO~%?RhfKhNZZqhqY}2$^$W?n;Z%dq=54d)Z)MhTmjOMN5JX9on90O z-BE@UX85l<;qjPz>WTZS35~in=5j}C>5)UbWkm>%F+b!{^FL)+JTcT5xtGPGyt-$S z^UQ%VKi}>~#y49Vo9x=sYmfK@)jS-Z=Ah0PXv$57e&V3sU3ha|Yd1o}NkBPq!^#TB z=JLWFvIKCJdvcPELx4L-QsIZg7ao|ojWD1dz&6RmqC%Bsr|M8qGE5^wZ1LpWws2dB z*g&fXZXeJ&0z2KYk9Xto=#g~Riw%%ZVn2w!3C&wTsC1Yl`e;iF74W41_xH?bQ!;h@XBA;m9p#v_8PDh}9jTv9di$@W+HDCVKn$>_Ma@i{03QI(27)+Ud`KR#c6+ zYLoEmDUz3|m!_+>25zP!Sh&d669IetS3) zY7dZ%Dz%WYKCC2XZH;s7w)kCPByR+L6%FPhlPGlGzONZ~JUvHpZQk6JMue1>wh%y-C^x8A>Y;YeL*ZWsY#iPmhzWG*Bbl&iC z)@@4tifC~)4K>>^BKQ9JzEEY6LyMxnxh`sLI52*Ga# z9A&h5H3%I!X~wna=yE%voG7El@9+O71#dr03(;%3@J}LMK)~()&cwU&pG-W(|CayV z{O?RWwEtw{G5vQY-nIW^;-w@0^CSNEoBlgz@PF6zzhV~uzuZ#FDs^b$>0NLTCb{I2 zjD0ut1vw26v%V;i&Wn2RCWX*4FqG%=7XN@`Dz=p|Zc@bda`H&A^Ij+%LEKn-$=RzQ zRU=2oJd_wOFL+r|NC+5{4`8atM-8Hdt8(;oxo>mb5xPY>+A!)>vo;haLU?$*A8k0= zGlvi$Oaxqs0*Xq5_ogLt01+|(t_upcX7+~l)@bG&l{)E&yc?!~8garXO$0D$1-%J8 zme@d-lM2|QgmCCE;v_efHD6<_;^@cMC+BF0tQYrIu7+`^$nrqt3J7`2@bEPtWN8Hj zF-HnBXdkRTq!w{A>A&QOz7&700lixjghoIjMAku7bhHYQ<;%s~8m>10-stXGw?LVTZRh-kBb4hh=2l&@d$$;f!~oYo#lIatl- zEa^KJQlnOR3>ffWs44JCVikrH=&GQq4;%qSk4oh|BNAfb55%l60S}n$xBDy7bzMyS z!I>yFoPa)wa7#Y%dE;1_md)-08De$nE(+v;ADku6sOjd~J;}(e?Z6rdx~A5KOJN*b z+(V4m9IcTXuzK%-&6EASEBV=lmmvHvI40GvZoy~UX~LATnG<&-vQ}BlEwprVpk1u` z7}4wMM6F#qREd}Z9RMUSe~Q&jvf3$3j^2pXeU~bRNi&o)AF$PMS(eM2C5wT*;w$1_ zjgIg*vkYzWlj<<#GHUdi0>bke;_ta5&yZ#qSb9HyJ`T z9(bhdR-E$V+ScO(i}^f4re2jOx2cxBmH3Pw*R~OT)n$wfaxP@3|0kDMLJ?>NAmv}G z)R7UZBo6-mZc4ZV$v~x=O@bY24lI!<<`w!f1OhNSzYKH$ERprg;p`CDl&?^mGB{Dvsx{#K zN?%h}F0c2qY^{nACwG90;UOzW^7H+s=i*YR)h#wiQ{687vsQG82W|y~*I3y`UzU8u z^HE8<5+UQ|>Ny7wk0)hoWzWRZmAN-@|4w@vr+J*afZqU8E|p*y40gw5n&mjs1et$h z9eBL0hSKmaZa^6PwEji{!)HMB`4~787+od;h`M4*|NX^yE0S0jP}LB@$nhpX&MMz+ z2!O9Q*42I0ZBGKmM=K~O1YnUU-X&`r9IIY%8B3G8RCaP7mIh!HW<3W$4NWQJ)IDR1 z0!N^|{F1mv$GpY^xqB=@oY|qui_ccMTwN<}J5FwbqmEwc1*!H$XS8U4a)1S zlEI-6&-E5XlM&D)D{oppiltnu9oi`1?=Il=;#&OK)I^PfpTEAxf|)d7pPjKl+Q@oz zSX0FfX2K~{%czR91Sk-u*1Y>XLjNxfM&V@M@B4d-%dQ%ob}C8(#o2MM))EvCYbeJR zn3xXu)U}5z5gx<2Fc$34{98%MQ}|8+0i=O2;yUxza?!_sYXO?q3gDHQou%)qag6Jc zUWbPZlYu_TCDg;`m9qB`gf_T4QIH5>v!+UnflFz)-;gPX)eev}T6T@5JahpF=t25n zx&a^J0AZq(RiATo1g|1WXMTF%dc|Q)Ag~vVN;b32_wu!lxO+h5#@=9Y6*Wf&Crz^M zfpc|*<#+&uFCn~0?_wgrmM#s0Vw9{s;u0hgKmoNwTpMARgat)-ff%wFSU!xw8rwyw>({rhp%M!JABBpUc2d8mr%4DI zKKZ}_Rp5RO7#a%V1uku7rC$l7B99KGEsLg?$v6R31Ds&ih(_@1$g&mjpZ+xrSKnL@NGw-tC5&dG8i!nntFz|R^R#v7u zC3+Z#9zr?FHkAw>z_;@k8AnHoORgGSrJ0=~6<0bd?@jn=Djvu z>wFDv?rRWG8)vlr0kAeh4znSAL}Q9rF<3{@cM@-{Cghy!B-s&(J*Y-?8LV%q3sB6d z(tLH_)}$+bf4@}Q87RwB9oAxqG_#7VDL_5T4+`1*BV6U3JMzgMr?@)K5=T{$iGpb` z6$uaYL}0qKUn4fyzZ7u9{qQ^k{(dSen}7T&ql6&YT=lgakhY+feG0ISLf$R3RetSp zC@w%v*d)U)TvW_9`6n&?S;f-fsz=sk!!K!i1n5+7yJ9^9P%=EsTaSf{4*p+>6OpSf z7Pu4?=8twCpVerVJr^1I;?E0a$YjrYY6xTpkOYN2`r){$Ze4;BnVOBQ2mTCb_fVrQ zB-a*#GUMW$BezX?TmpN3b29E&p<9&r5J>wf;zwv{*MSE&R)Cs>qqTaj-@vFkNA_!K5Q7AmT^N z8Xx1F&`sMez;5JfF6;b{Zp>xrGb4Q4p~!7`72X$FYk7}f{aGsXEL^RPWfUV@xlFd)$SrR&&xXScurum${F>8oje$^KCF+VSN zTtViG6f+!WgF}^qAQExfF@r8ntj@(@c1ACh-;QBET5T!HTpNeH5+Zh|{1UX>5se@m zKwZ6H34N)4j7Un7+u0wi>#wcC1Y8Ow%Z9+hJ^?9pHHjquW`t0rG(7|K<_ z`ffIS1z~gPAp$3jR_2EL<@qQu@wc`jBiZM-XCr_1)Z;+*Dv)`NKIp4|(P!~T6Re-L(2_&GPr(zz=&VbAPXGc}q z0SzJyQhBC5FU4wk|1b95Ix4Gv+xxzdTTwwm1nE?emR3LzK~O@v1q1{H1f)9@=~Pmb zE@_ZbT2ex~Q@XqRor`<#v(I_nGsg42<2-MS@tk|_zZ?$aTGv{?HRpGJ=J&f7q%S4K zTx>q>0hBDd?D)w@*`9l!yFD-=@hZ7@H(Y;5vpkVhz|i_%OeHEr$Jr+qd`Cq`+ED^$ zx5SM9e?}8m{wru=-(r#6Pzd!R#nVVO?OJH0-vE}ad-eBZs0uRRhtU#S1s8$c+E}-m zH(85En1lWT&x?~obEI2S#yD%U5r!^|TO%2XN4Eq8p9WB0 zzkWS_FUS@eJL;r1Wo}R9`*Afq~ z`~KqQaIXR#qAzPOfOkyRu6=!P%^eOaWIotZo&!`FuJCdoDKERt;%9Zuz{JEJg4ZiU zp5TdrM1mksK2yj=cg?cIdg0lP#*=HO+AzoQX_&0@-RB5YJOxgyFlX6yZ!{OsJ;`i+ z<*Whsr=eO6`x|T|nvpja`j(AH6Ft47PA9A1(t_Dq!QevI^jtrPd06;sP&?v)r4&at zs|Ety(Z?+Z0m^X&sMbQW6<@cLB?9N;jjKsZLH?4kyx`{dnYRcd3I?WsrAo=!$$-c3 zBhajn`C{KL@UMOXM*VH1(6OMQAdsOs1_RDR&v+^!VDFP)k_awrgqVcP81aI6GM@>t zO-yWv`GB|Ymd|&1y0zzV_bB_J_ zG;H`A2LLGx&7Dw^Jbnn(ATb_Z!G}mYZRfL5yDD(-l7)|3r31kMB_Xxw?NOUm|-5-9hk%^IdoY1K~J-h!CkUc9_zR>~U zs`oeHnkC6<`bz&x0aBxl_I_vGu6I2&!U!T`_@T~aHi8M@SyJoL#+C`2*4gov+m0Z8 z7(86C)`q`UQDIZIEG|wdEav5yhsj%V2|8cZwKLE6VT$j;;z2dl)CC3-lQz$vCqBE) zSnRk%SD~WD{WRPxy<)p-Yx3$#`L4(1dt)>e?HYilJzO%YQIOf;7|6~XfTaOzlDiK_ z-yT~gDxbr^Slxdj~0)OcoQyypMSZqg^< zL2nATo(FW1sOo$@3qA~)hbLG=?=H4j%mp2)H38^Nbx-w7)4y5%gQcR9kt>X=5GIvb z>zG10_w)uZZ&$Wve$zicmsMnt?F80h|pvF7gl@5$4zN|_%UX+Z(Z zwV6~~u6~=Ot`{G*=!f}`{>hzUOa0_N@}98@8^Z@7CJrHt$dK)Cu1k+`YDB`%<(s*7 zz&yq3)KrR18o8{t^WL6{P>I%aTX;2yR;M!D`6W{h4@S>HCD)I>62E0T$xtU!#@oQf zXO@wWR-;!ZKGyaVmR;M&1Wk z*95HYgG#jmxw|Rr>LmNq2U#(Ku+|{W{FL;-2NIuD}vD;>9F(h?l48txXEsqm7N{_ zO?osKGCzzi|7cQXc>aL=)@gzX{_fLf&sbTX%f_+wg20}4cV%v;%m(vqLBZj{#IIj# z7Vw@$?NnQ&*vxl`l?VCWH?uyPQ6EnpSc{<9<586O`>f@2Kig_w8u)IJX-|25()>*a zn+VbJHpUH(^4A+P2$S94_%D+F$zhAyhv)l$$F4<%Y$%>GzytA-;kBO=m7?e0mpMVi zOXh;%?`R(!A?FH-<_h4adw`!N0)D!1=E+u-7nTD_t=EIhk{FpM_q@UOSZArvly2`s zrC}yF_}_;1DjyzPk8zM{{pA0o7w?b9OZDa?eWa zLBx}zU1aP)AJOf6`hbaPczS-$GTU4pZs!mGxSdVjksM%^r?P0c0u+_7zNcb$f>bMz zZ}ZskFpwjc>24mazGuDG*uY z`q;qSd-m755(DoZE9~TW%LqDP!a}94;}3qj>2Vth)VBh2(&M)7f|uIx@%zJU@gKV1pd=9&XsysEucyr)gQ!>T@iEW6`=< zW2ml(q@AUz$1r|m3ds85k^(N?1`Vk9Z@?>y?B1ImnhIwaH&Q#k{SVOM@B_)& zvh>Z@*pjgtPk+cHCgJ%1`~%a`S1vb+zGBZKn_KX*x7dHf46Ai8e8dFt1Yd6u#?qHz zSPi?*ui}_3i0FTa4QR2`T37L-^!Uj zIk9W{5`8$Er(6mZCldM9ig6W1%IoUQq#~dBCX+G8TBV@N(*X`e6X9w0L z8}}?|D4)`D{w@)+`Jt9~>*8-mL?c2ABwKc>!2UWc>m4@~e0|WB)$PhZsYVILkwMlGneM2m(f;yI* zu1i7kVuzRVrGM}~vO*?c3m6>5WyFQrDG&qUw?4OOmFHl1_V_f(Sba z>!jb|C}V%60F`(YJ8jMMAyPN9>v`4o6-V?HNS_=DQJ3~cIi@}p`pu*_t1ZVVx(L^o z)vj_T6$+m0z0^xVa_`iO3gI?wWOa>k0C$oqG7^;9;ruK%||-MD5%A0;{L}sm;;jxMcEaDuV5C53b z-1*a^vCgL#a9$9!ao@c=hBN>SjbZgy1068==Eql4yYJ&Kc{iVDs&H*NY`W-qi-^(8 zZ>Ar`XcE8dT4FSwmdONBJYX2=c1LNy9xlfJ`EyZkADS(gDr6O9Rk>lnfYA%y-MZtI zM1^MA6urlj^^$aP=Dd+zOP_l(L`c<%r=7{Nu#LB=Y*Sd&w^N9$vq7GWx^I=(ITQ1R ztUi1ME()`1o|HMRhVs#FI1Kbg`LPgIT&Z_!P60%)6pma@mh9t)#cR~{>(|F#as8D0_rBx*y*4kd_oup&F0#F;i6GY>BP*R5;BEQh68X#k zOY4O$rPpJ}w7?=`z`hgfrJt5>@*2O&wX4{lM7OsY7(_^!-|F9dA*FVXjLC0~UO%U3 z;pR@n(1RBXER4T}M;5(f<$9IXoGXG%pl}Iy@0D6JIGmpJFf3dsUsN1VmL(tRXr`K* zdSO$I(h|{~ya>wy|2k&O4)gMtKgm(wo686eimzBs=hMbz1Yt7j*{ z629sOO-Aw)J)nvW9z-fS>yx6|V!6Ly-;UWdezWfKn!wa zt5@qy6rdiC`;_SeD(z&PTaV^9_WRu)_`Jus`V{`^kFd+hUqy z8kL|TYTi{gmJd$?sY3Vk_(znG8!L1xgMTc6I?0FAWU?Z?vqM^Q+64CQMn)ws_;DJ3 ztTQ=ZY5I56-O~!0&COLX^ru0^8+A9>L#->SveT7hpO!X`dy^a{^+mC6{a>m^qZU=i znWa}vzdrwUa8H%|t~(nzoJv1=rX2jy2$GGsUx*vQseL_{oNT#>)Ad49J zdW-2i$l^$kEx=8AE@d0{`2({#1uI|j`6P(Mv6mi)P@`kH8v0t_!1 z#>Q9zSt&_K?r3S3tM2lv5>Nw>qwmDTo!%@5SOSQL_{e@c3F;b=pfeR}=g!z6g%eXOU0ZLF;NdRV zmq2P58|Y8bMJEVQXK@bH6`cch=eMZrj+3eZjNp7=nC71;)&K|xp%s<7hK3$2135-I z?exCEBI(gy;{0uNdwUSP_UuOsjr35}3*ElRPe!l03q!M*NgKfJ!6c$^YzBH=J?my- z$>gK9n2#U0nK*t8!O0qcfzzX)^w(eex@}*Y93wG7-Uel~{^)@dc9_ZH!~4cC*PxRk zx(#mrC%ND4`ce&xdkh49zivQa|3aCk>L+5Mx4uE1>T%}U+`>1uGX#D;0 zV)%+0%N+`K+TyN$ZJ9L5m9CEFj)N#4(XN%RQsEzF@#!b)Y1xql)43Qoqfz~SuGa$v z0Hl*w-y|T=fz2<+NKzP97{Crg(z3);xbZV~`>rS75eG3=lr$l>;;~z0rXnL2QHOXr z@6Pw|m>6=1Jx$yzgPThjG?eoXGB5pkq#2}`+x@mOK?ga(x7)Il$LQtcylpN8@mov= zjOp901rfFoYTxR|ik35QF8jmj+|+ptA=_{t;LQsN12#>n&qT<38-L zZy~26*_I|HFv)N_!dMOxT|}OPVTFkIww-U4^#UU>W_~*tZY%u$B)RZE+$jujrwGEG za%ue%m=s=uPZaN9g_G2Rpl;b3PJRxe73J#HEt#HemN11)040dM`Uz~z6qV8}Sj~4> zbf!#$3ohd9JM+Z1*kOwhnJD=;!-70we^3~~0CVkhg)3l^9LWa>qvEsz&VK=#g@C2V z`aa6$=9h0g0!+%U-6c|LeDFLVE5ozcRKtITnFZ2qW?K&)n!HrH4es>ueJBr@&7uJl zsNMox=ZltzI8l*TuM{1v_K^NqId|;+U;#a175?m*jcC89H1xF=Cx_Rv@dN!1*K1Q? z{jLVA?vYqt(Cz&^bc_HRvxgb+lPCAs2G3MHo1bjKv~GRSkZB{=t>OYS9X+|)GS)La zb1+sy{-R@5_Xzkt1}8lBPyI+~J)=ICVr}OdBi_Kt-ptt^F$Ep+-MM0wMDhm=1 zrqF>`j_#?cNL!4g7vNX0#6s*`M-TEnViHHRoXPc{e1Vfw?S3dhSWP_IBXt!!15B{9 zjgXL#2H57G`jVOOs5hTK>SpJU`t9@}k8lgtgj>sx%mKeZi(pox72D^UhM*lN6}1!}u*`jg!-ynq!k6 z930SLGxp=Lq0-j+o5nid+nRHGEB@^E9pkVGLUi09t8(~lITVsAH{EncKv$W!e~Dtpaqe;y*S=iqw~N>`5M4w4kagullg`+ zg=58OU%y^PMD35aP41cwXdJC_QzX1Gn434bd zaT_Wu!6QDXXflO?=nZfH6oiPF#p!w|_$~I=uRzN7@cf^2cL78a|N9))iiUF-Wwhrz zyJulxxRaARFjjF}bGSW5vNM{vE^JYDJXyevd8u@|$4kP6f`tJ2ZfsZ+ZYX18V~5)n zzqn*L*Sz-ZPB@H6aft@-0!e;MbS8;^w_b?O!i<7Fn0FrhU@3sMI$jkF@U<^m7Bb8* zRC*RG;PEtcmgISG*n%?5ypj# zA{S(LUAkZ)3$~w;#VuuJ9{9p;eGcxs0m3KPV4%ZP-+q6c8WPAoK_wKEaShAiKz2iM zZ}i{+Cy8|7_wU=miv8F!K06MM-S;wH(ML7+J?t!!Z~g1S!oU7!W%N4C_K}CH>a-c2 zc*AY2>0Wp)4A1Aez@vJ@lo#!5_NGGyO45|SrfKLQ*gnTipa!_)?hJ@9h`F(JNYY6;&Da{M= za8LdLFmetw{q;{4;BS~w7__yG^#n)v04R59xVUh^tQ*p^h>>|!DBbG%mI>1(P9|n& z_jW;z+x~{dK0aaZS6J}ydS41)t7D_@liZ@7ATwxl#xbwpMvsmC4QuL0Zb>yuL0E1_ zwusQ3A{VGjP_f;={*DO7`)?ldpApIbjf4IpA^Lwt!ydZruJSYc zC2gSZ-@GS`OCT$Ewv)GXt9HIRqK%*-4TbAmE5Qh77q!46M%k1g)+hJtoms4j$2 z?o0jVNFii$Uv$=UK}PY&*}44g%O`FSGMS)LdkHd;gw==i;Wa*2M9xJ+Q=qp=ZZF>G z1!u6NeOy#j02oEaRISbRQvip6g24CBzkYpZa3reNg~YPXB<*(|BIw7bPFOk5o4&44 z`L>Zw-gC0OB^E&R7nrrBoRz#DBm)43UAK;EdF01Ugx5^LjgG`7FNeK9h#pN>XbR^G znGK;=vaqtMhu;|;^}Hh5_xpER#{+WH1sTypZs?Z*&>;cK`mj@T9UVDIY7SaWxbjw8ksq;-%#}3!|q(^QpRrflR$g0eH<<*w1ExEnP5?>T2 z{q@``LGt?g`XX{NxfA#f!JEndaAzgo<%qI~{0k#7*PR{CcU9`XOh#8~AU~{bY7PISqIm#8 zHZbq3Sa+Ri4m9X@z-Y}4;^omTRtoqrT5DVAz+Q$efUeeFv0BpY2_rzpjz?-P8g*x?Dn$N6AA>xmb@My0f9E z?jJm7@%HlBZu*&!uwEJ;-!Ux)am~a`1!d@N@L^#j@E(TeFf8!P*E94vC50OPRd2?{ z*QQI8rzd2|DVjiVc6~n2YeqvO?*teW1Un*FC`<2r9VQ=G5*kYD>^u~2p+_&^7#0k} zZYq`)%OcPmd9{(HTTjo&-``MchN%g#u(af+g@>(w(tZ5)t?R3?at64_h(ln}Ft<_H zWe5PQ{h2`ht$^|mXzU+_Mox%_}~wA zV5+^~;eKf-^iZPtBJ4mZIta)ts6f5LF zNHsuYpprrVTkQ%y5=!TFIyjv=0Oy1{lgkiRlFN)QrqzLO0t1g9t{z!?JxSvG-`-W#Zc zzh247t)(AVf;nemVuMb#yJ2UZ4*JAdN=nN2Hxt+U0DuJ&vT?1-{K7d2sn<|W?O5)1 zWQrdRBsr?)79=*?uUo;cTX6Gs2X_z(1o+^MsoFnFOSD+%%vR7G!nuXajw zyImY`Rm8I~_uR8_qrv{YmlqgbI;EH*o{dVGiHK)o(S)3SUls!q`y)Z85?vCocD$Q1 zIA2?9I63lz3st>3DpWJ3RarPuXheCr{Z?PLiN{){Mv!v$w8(~nJS%XXgN$zd^(hRA zNs(7JpiZw|9*k37ih4beM+A3v@;ke=)O za{gZXm;1!mNPda?I`56zj#QmJOk4Bx_NL~LkJSbS-$yQq4%S?c5G;Ul)r!L{&Gh&%1ATJJ%^SWv`Jw(yL!f+ZFC%`9jr$ws@Fhnr zX!Rav{pv7fig#?R8?T}TsDTU>61j(S35zJ(_DrKV3qW2|6bhQZ9xdEJKN9*@CCho) z3!o7w?za*(e=eTViYfNv;~rHp?Mpa(B~H5J&@mDq?M?b*Q@LH`5`Jlg%*=I)-J7vXo~vs-ol zKzo+5X$SZ-ik=<=KEm{zPy@Kvob7$?y-znYk^imhdCDEL%zKj$d*|SwQ_cIMnGyKf{kTQbNp4dIdCG%d9TpS<`}Y&HB%TQdgM#sN zZq3ob;d1WE%F@r#ij+G#8BhH5kzk9bUm*4o* zmpE)7xw*T7@!$uINO89NB4ub@-3{2PctjWav#AMBv+UB>5x4ro0+~1pmtpsc^AD-Ed(1X0uL6fMS#RIst4q`d<^nP$+B0U5l_}TzQB_x`5)i-w4pNry{*4ze6m5v84A`}nay)ZI@Bt14TXk@6V9e*S&oG|1PagE#+et!!K@i#lh zm$I^#;=#@nfK$kFBh1Us|5<1>mC0pdtM*uQ3H-^OWn!?C#GN>Sm68viK3#n1)|kw9xEC4e4R_q+VlS3}eF%&b zOC=f?!d1M$R?woxGl0`j9ywCs>q=DPG=#Uq1)N}I0P1T<%>%^68l>y$l_;+1-qD?= z6>0ndS05e{bgC-af>)iqN{6nmmvy!mdkOmb`ku&CWkedzrKltM6q%1AEzx~KgOQro z&Md5BzV+Alx8VOn&B=*rvov)6QM=PH7JEMY9Q=U?K8+ZV&I~G`Jn88~?F{WlNRsqI zI$}8UYOY7?2dZFrUqYr*S}xpIVKkIch{G_8!QL$~Zd2`bZM?Ro<^qgTK}O#uIL*DM zzA;v@EHU0KUb++=r^NnpI3u<376StT)Kq_={=&fcTCO(?>S0f|#@J7%*-veZwKSnk z9mUz@W1Tz)@ro^QTCo~vq?8_gd_m!LIw& zz@ukUQa>S6!^_x zGv*Qyg#OhJg}#@TA{7+Eiz757l~6uHLrO|IP#`p97YEJZJvwe+6A>Dckb+WndZw4; z!v{Uj%{-%S9^`%0#Y4(-?Ecta5RCnWk-IC5A-CTcgW{{2U`F7*D)=?I%$EN`4OF^d z$SbfZFC3NG)>Cuu&^&)04J6K&XV=y;LX1D%EU3(8l%BbS%SIVUaq_Vv;fZ9~xj$pO z8?*E2RInS+z&ZQJTXsmeIE--hV6hE}b(YcFhe`59_%NB{GgI<$vSori4>3y4x%jUkJgu#=2B3iKQ zEXzfeD>b6#;WT2$UU{T+x0NYEmNN~GtLDdGssawrz{SBk5P6SO!*%}0nS z7i>Hw*sbXdl&hVPA6w0JdG^B#Ny*G=K1BC1vHZdo;0%{*6Oo=^t!l~|J1r(ATRveN zyg|IO6LzqDqc#Zr;g7lq7U$)TUqjjSgAYvgtX(xxhBtoG#^R{>Ck-4CUtdf_Hs1S z-BZ*bE*^(0HFe-43Ej>rv=!Dj=Hkk@U32cqx7F9HeZP0*39k@pGC5pv>48gXS@Cfe zrb}^l9Ut9~9}eH&2#;xHX!KvArfzOu+FK^Z!oWD#f?$T>jeQF=)IpsE0oblTvnQu? zd#<;iqCQr4Z}pI7=O3L4hQa7tu&ceqV>(1vj)T3c!oLv72X;)q+T8+0 zxSzPZjNucgbT*>$X{r(5vp+h=*jS@MWFy0695$S zQA#JCd{}hGX)}~RZy!CU5crk3{Y2vNP1Z0r9R;2X2|PWwD2e&n;OhZT)!(RJOQ{*H zD=+T+hl@*FKTaZed@+FRfGvE-*>dy#>)~C}V$&n(C3g9p*F}j?8I4rBsMwDuh-gd{ zDQ=-tJyU;LG}dicYSPkP+F>{>(W(dDjNjJz?&gJd8NwpSMXIXIqw%xV+E1LDKScSg zUtvOBtHWPEHx5&u!Zugd-c7m&i~gJG{Rz4peOvMO@3t8JAut8!P2d}^y15;61V0UJ zpb`{B<24`4*sLtIUU&~>(5vnSbm?fWchJFQWleK33=Q`79-hF70cR=}gvmm4{1?0k zAaZ;&h4@CUHL&u^46k!?e!uT8F(1$Fx+3v8x9n`lQ^*7gQySg5!YOTh(B@00sBYAPK+0L~p zxzYS)P%~gi?!@`!uX`96N0@fvX5*Fq@HT|^ffr3LM{fI}GAVNW^HQ1)tfQCOU;=(c zJ22c|J8UlVShSAmiG)NwL_fXxQ!Q5!u=&GcDk5+5X((Ob`!h-I|KvUvptG>>_H05( zM+TR^6#sG&w^L_6GkDF{dgDVwiUV>Dn2x30jg&4i(|lnF`SnjEt{c{L4Bau;C9`v3 z_vBNwYjB|8!Y~+ri{b8xS@pAIoE5pEWbmPOml*(@iftR;+qQ1}a{t4liyHV)?RgH8 zh=_>150xq~XsZc`M>dL`d9#*{sZj#XciNaIbsIFW{3M@G&n(#9UOPS6azG^fQeS@*)FDbJVp6Y&m;lq&nI?m?z0i#gcXc(mg22k4@bPvx zrF#ELU-)E5+qb4t)WR$zX%~JpuArZ>W=qN~4v%WQb$jLl$ZpkOFq5rOhE(~m4~%#; z`ulUD{_JmbqozYW#2yEF7uk?Q*5Kp$YNq1G>(`&DFt9EX={a=MD|{8XCJeEw3ZVH; zw+{iZ#hEJQaLxT#Es0v>5IntYjZSjl5LC{JVtXDAVn$uM0s|!Va=;cUz0{CmRpkS~ zI66wJ$oXxd5Q0FKoTTm7-PLc~uhtqDKIl%4o(yLn&Hb8AYg=AV70y2{ufXGBPi%_c zNCfV+Vf`Av+uGy`^z|F~q*`PxK;6(JnvDz#^BXQ%yAn#zU_4YPK*{hd?=KXu*~|1V z+hVV~Shgl1p!PaHWlEYh+-%I-P;I|OKdNret$0(?1}dg%>{3ePC0#gM2Fmtif775Y z*CsH1G;rY z@M70K@!5RoV%}M7jl!e0*6r@j1ve|f#&D*7Ceyja#Y6>h9$4)KK?>3jy$ybU0rU8q zWDgv#kCry&u7^iNOtuSU77H?<1RNDzFZTBJ6*rIPK3TT+7tYts(jM2UjhG=LYxd?L zHg>TRA$f3kJB8Q??VvOlUe&^n9({~9Uyw->3mW3>dOMlV=W@tQ_v{NxvujE#u7$0Q z%}>~0@!X5yx2rC-(O%frtY1;i8Sz0{)$MhqTfHD_xiHbW%p^hL#1&3uC&$txILQCH zbVz--1E;UgrUQgM=j~1@(8Flh+0|OcxD>#^F}4rtHUcHy>}2&dVv*9NT!@oqM+_YA z>av2bTGa`mM?BTR{bT5TKq*un>I3m&d1Z;3s}KXq1@Fj6XXP#bn`}ldm6|FIT4Qwv zSD{jSav<>PYOCY*GQabZz&cxwR=oAgeYL6GYa|1hDwdLxl8_n15gs#;F;tR!yr@22 zNe#W?jhu{Fp|~K-o2*I>ai2cTv~Tm8^d*Z;bgPt`Fw!O+-=_wtFs2gL+{)Gu`?AXx zdAZ>6%!#_IQ@DOQ-NcESF6e59kWAIXl+@;k%x=%5B#%2)4tuLE6E^;Yzqwu;@nPW^ zii>0D$kXUi!38sLVd4>)27kpIUFbryWnihXBk5vhB#$fTa`Zc=jcUnr!yajfpezg?Pvw@B6!8nnaIF@ig)>h+9O#@YzYU{)O%5@`K@~ zsC!PzE&>6aBR}M7IE^7c+}sZZ3C&PThN&POYId?zR4XD2CezqOwWv7Z@{*ENzf%|y8a#~xzcczj^R zuHU?5Tp|hLiRrNG%`ubD*EEM83qsHS{d<_*9RO3?P5$l>pb|JHjsoK(wf{hzrBos}!>Ygt(2cNq>v#NzoYo@ zb>aj1V(dTqfk^ ze9Aq_)FnPFLD`u6y6_9gWavF=xGfWn|>LK!BAC{vlMTr=r4& z-Sl5aRs(r!ka1Yb83QX*Li4!W+D$EFaE7E%O9aw+9j=rRP1wMzAJM%TOZ)@KGA){j zUFweF+?oyhvYKw0zT!&Mf)*%nlOtpqaa}R`kG3AL6y(x@R80uJic`g-zr-M98BvPSF(|QyIW33Ohu% zG&3={IDDY-7SHaR6yK?5U+yJY4r`W8zBg@Q{m5h+UC8daNvC|2&v^7vmz>dn&*$;- zR=nWw^#-rdfpo;ia!!sgtxtc9tlAsYTs9ov&pwxN;EFyPn zWDnu*C=LbZG`?&M8YKel1l|KlW}2knDo%WQ>LkR$VFsHygxTsv58;b>RXf+R4A%I7 z`{Hd*#0$H0CV24fF5f>lZS3m0fc&*ruYB(2gNH50^lS#3oxEXy1vUW&0- za1wZ#VtCm^B12y*>rk1p?w2@tsO)bv3gO~W#~Du5-^7TA88qBO&{K1OxCpqqM!fm> zrb}2@*q^jG+gI1dw-@liM;CW;DtKylrR>d{SMFw`7di_J^SVZ>r9T%d9p>EF@`y6J z-OKmTZz0D|a7bB~GPJO;9@PdKZXcGpy@&wcwS*)^`D>ZFqQh5Zd_lWTQ3Gm`g_l7o+&98L2!KkMma3jmB4D& zIfJVpgPoMy*r)3+4=9F3<>Wqe@qGHEHc+~AGl52tm#HGB@fI&H4!CqSEDwHwpZgHf zu{;xe{or7qf<0b|Yk|>+%LOTS;1>y@KGD(9L9^S7sAD0GPEP^s147zGmhG^gR6@D$pleohWwNrj-zRL{>q`Q!e2U+*PvAOo!+Jpe z%O-UlFBu!4z~3_{%ude5+0n4A>7=xCa+poFu&GSe;#Af2W)j2fq@P;JaIS6hwlusl zJ$072KZJ(*H-(NjvOEL#VJ}61}mICh7T!$HW-w-ze@S z{9CtE62E`{-Zcl^;$!RWU~o{m1j3K#!SA8j#l?3`p)KBRYr{8lcave!oJVJq)J9|> z(^3jq76y}a-{wN+&19m+V0s#kP4eV4?R1GSYYw+lj@Fnm@b#Hfq*(F>PvN-GUFT zw{5d^5WaBC)kzRh9VPtfW&F;~sia~qq zX2Qx`TM8{Nugu)t&yO7N3rjFxo=tMx90Fa>}N&Emhb@}WR%^Tb%vjH$=uYoS?;NSo_5u-e{Z_>g_!B6Mf$p1`q zUWHBr+B4{m2}~cTn|_HQt%bQE+?I0in$##+g@m2LhKAsLPOp1qrKQzyB!3KTPp|N& zrDKS2$Y0cO!K0;we*?>Wtq(c5p&5I#rp5CthA(N8CN~jzADvI~`3}Xi)CsOV6pVwg z(=i}q1mR>yL}4|xl1wsQhFR~$)Nn@mZ1m))RcPn+E<~A~U$YpOUITLV?mSWn>2?n< zGs!!S>r|uhRcY7w*OR-d&Q7pnot_CME#zog0O`vH{D`P%YSYM)h7I{un(LG;q)$Ke zw0p=eRa;%I__Q!yRWhXZsO9^QAB@>14%0qHSdcZ%aqB!(xy_!U2j`itp%`pdt)Cuo zLPzfp6{F5V*G{;XxPwzk15AOyE9?QPI$OgI7r&s2@R6kG%W~CmNPfOQE{zSR-UYkjB}1W#}S;4+fH|!Ra9i6aV$CEj&6-CPv41xs~cHz6d@TaAgUc4mk`3 za29d+*9~snKLC92mdKYRC)hzQIp=t;QpFsQVJwjl-=3AKVp$GeF+S4>oqRCRoD zwlm3DCqiGOomuLond;cD5ah$RJ(5Ab!IvCrMG=_PG&H06m0( zMJ^{Xq;EC#>%V_2+_e9@U4(B#*eE=uS*ShQg(&@i6o>~(FE1|-f@IJU z$|ymk5tlMfc37B;v|Vr*q6WY*1Xiiv!iIUy4DP3!sX}rqTN@iSP$xh_nhn$==QInr-!bMk?176BDrlJM5YwJgA?1~V|F%4Z6ylym>-tgNup@o)N8fORxN2asnqr`7toL<&1!kFfnM#V{cz?Ebo;aR>2F&x2lb<+T@%>yk+R}SH)|3ds`><+s?0)tQz#uCoid&b>a zpE!}B%2*ss(VP{UH{haz0QLz*@BD9@My8Wo`T~hHT0ia0{|^ zTURKGlYaXT+WbMQZfQYRNG%TvXX5R%l@%qRjB~%KMWitNvx7+?NUtS=<$XU)qm&lQ zL#;nq##&pyzEiGMysQEJT26fj?g#3k*9#Xw4M(|u{CFL%xpoV626^i9#?S*DSDtGI zWdYAs2XL*I2a1b5gm1x{zjFO>RZ~zzs;K>E!rS%3p`uoGtSflL(HGkOu#?Sd{Wp^ZtsvMPc7D&thX>pObf_zZugE)wS1~nN> ze$V@`lq$Y>gMwE7m{p~w_M+cWZIAVn)yD#6zDwp~6NCbRARP{0qe^a20|sUJ6--Rb zLi07qWA5DF9bPjjABWQh0bX2=ykPT|P9iQmER2eq``Tw-bHwG4(Z%k+#`bw$;-iYw z+^zAHgj`Iadv1c{;H7`%?=WWKEwA~F)0GnGS3`yDsLP?#D5N>l`BN>(*e%k3@4~}3 zc|r}rI3BsV!FRFpT6dOs;k2Rvy}w|n?5eig14_t&M7dwYtZabg_w@$SDe$#^cj?-4 zcyR@Qga~m5!7M#q;^8pZcv0sgj0)@i13WRq?|+0br=X#1*G}w5Q95 z)*LW8%R=MZlzwq=o$=}0ln=^SS*7vFE2MnH0jV))KP^;md|B&N{|a~qRGzUC7ZTfI z>a3D|$a`)n4#u?G^s(AhU&6&aJKaLxy#2d#*=U zJ}WD$7|@!p2i70J20o~E+zBi)i%gUY{B0l>)WR)+GTy!?Zf{RSLpyVz4_^m}638q= zd*#H4rXCS2w7p?>+348`mbV?p8vN!Ct0S7TUs$^yeeDkmxC*tP-7C` zCj`Dbd@%tOL>R&QfWcusT-(BAKdvni>28S+m5c8C`{O!BM(JU@JBx!8zdn%H9Bs{Y zv%4N^Fjlb{l&WwGF>zQAU;R49zOlFF)0-)TftsE<@jyct%N#w6U}5UW(IiDZgh@xy zP0=KPJX@nCkj2I85H*%oWBBjzt%XYCf`5l^d38X72`)0~+5;`~f|gdcNuiAPxa~ms zfk^tJ&A6DA{od7B(pfM7u#+C&8tZ^}5T zV{N*E>!-P@Aq4mD--oDRPq={V+udYFe)dg)i~hn zt;&`pL!)9e769TA3%afhYZ^3n#I1?Lk{L3WFBr}>FzzMn^Fww*ZK|{+Xo1xd1VpGp z(4Il6O5kDB!bcKFj@%Z7wWKU3uz=4s8(pZXG|YFwTd)RS?4b z7cBI^N1zruV+Td%tZF=~jhz7}I6Qoo@v((QJsw7e;2x9+?=G$}#+0MQe|_TcvCv{l zY~r)Ipt!8;91x<+7IMm3qZ9bK5N&c@CTUX6xDFNxkA^PwOon<2)L!e?oXoMD!>hi!-fxYMED3H={ifZ2v6B6EB(PvzxZX&yt$bN zHw+q_x1Stk^%KBoT3D}uB% zVwf8+<9L^;!ig~Pu&XW(tvXbY?!d2uH=A~fnj|1rA)k+eyTJDJ_vez0er+euy;8_r z2Glr+yzG26V-qr$cgbXdb%Bxu8ol>>KzuzmFd#&okcTeLk85jD#0t9j!N0QpN0v*t57o{`>z1%~$_JtzdIT9|Ed>B0DRv-aY|R0SqDRVT=PR86q!&^4qgY z&$D|MK?&gP3qlNND?b>$ACtmJIe&3Dqa)>w|q7)f!KuDvoT>+)mwgkem!1p`)>|>l3OBkCm@afyVG7}-g^VJsotLnXtV8c z{wmsmHMQQsj4L932g0p|U3TOMHI0}@bYBJ)x|J{YXpt;af~7BuI9P*`ZnlxtTgEqJGQGj-*=|DbaE zYGtyl_hQ*^1LR(P5kbBWlE{mdAr|{N@`H6Ox3eJol_I=>Z!>d@YbMA0k)F?%5p{rI zC$>vAX+YHh4b1DPhl+RJhldl01szAqixZ+wPx+tSYZBNBs2Un4z57Qk;T!l5rAvrt z#JLG7E;O$O3!T1&a5%XkgL=O}nA+J$MXmcaxcK6k*C+I?uIAKi-h`p*PmrRmgCfC{ zVi(l2jIl*^$ux zc>k_c3?n6y$m|Oe5zXzHch4pQgJp2Ll3kq4!6EH3$|o=|*OmmdY?ce?Cx1YigEHza zxZ8lu3z_?IouH}uJ!X~}hk4kvmT2*rpNi@cwcK=Ie*RtE-udB&NEH)cqzRhg{2b16 z+_94whIb%33{EdYhxD_#`6^VMTAAeb@dgLKLM)WaB{y3+W0b}!jN!ctvz!KqkGczi zJQI&XV6AF0B-#-V-qRo&JxlYlQ+iU=>aRAg9G(g=X=E_8L{H~sp%)Vqt$PjgF+#yJ zki?NNK0qAH@?d=vmfzVer(Yb;37w^}A0yuJ@LE(l9M4ed^zkF{2HVO@kQ_921D~#3 z-iSYa79+o_8P^5|(i&*Lye~!C{Goi%+;5NFaSr1|6D6A7ZeYLfDj+vsomn=l*(Z2s zYGDD5m$zR6KR|Fx$`HsCbSiBe0j8zmhIPrJawEP~*saMZU`y{w@OoA7H(CaeJ4e;= zH+=D+Fl`nRp;LX3rj#9oTwTfE_g9@BYKOO9nSohfv1!#6a6n|j84QN!E{pl#yzaKWqw*3~k|`;-i3TOAnbH^H&^bJwU(TMWN4?|vez7vq6c4{-1d{=_ws9voNK z%_3(w$7*Yn2v7$EL!Ou_{p$B@5C_Dfz~X#8aR`!UMS-boodmti!_#vIMDS1CG`u|w z$FFS2Vi}>Ad?-Ti@ET9wDOV=zQvsnH*sT=P6Tnqxn%$BBA`L%khQk4Ht4{tkcWY!~ zXsTqy$m?!@@KyTrW+Sbx?k*FzKnsGy8DZZr6|q25T)Y*gR>Y{jfDM6(51348dylD< z|3yvxx!{`=(;gFu6;VBHpAIVy- z{9Hq=GeN|UK>tZfyGD^QHI{#Ko2z@(nX=I9B5?oJNO@G{a)fzP9*BNa~CQS&(NLzli#|IMc9*KVQ? z9wz{9cp1}Qv_HoKkA&|!rRzQc=-XF^3tx3&Si@$%t8;k2Otwq&6WlHaJI+U_A zJy5%O_*%o)M#|D^>&?Ww@(RV0oNJFBg^3FQjn2%xL`+^m4wOAAM21X7t}$rkegDQr zBe$1!#*B2pR1TYbu1NjM^K-Y4d>`4E>`pbUIr{U$ttiwrT>&PD!1nzQ&Y3a zFSAG|e6ZF2peBYzNu=U%Z;eIj*k<}y6JvH039hVQ{u9?zz2$K?)u~W z3a9utX?OXL&~){Bh4z$Y_cuf*ic&M9haxs)!2@xl*})V%5XsHP!f;}i;B^(j{E6PW z8Bisrz@U)C9>pD%u`)ZH8S}QhoRq6j=?=7Rc4A*tvKcZj|Dj+JQpdu}u z0*XpYcPWSFAUASoRZ(hULv($a!-cXxNkzF(Yk#aZW!wa4D;oH6zp>%;mm*K`WL z@AE#-{oMEOx~`MVg#e(KOUg4Z|Has-PI}hH8D35Oc1q2d4Ge634ULxXfc`4``KRfm z6Wo80GzQbVszV%-fy>#65o9Qn4w1C&Xx>gW6~~@Wyo2(Zq=A8yfuDLme25C-T?CN^ zYF};m^u&s+CDOn3eg{B?9Gt;^A<|%z$jvRdxHJn`GJ>x8+mcW}(0Ys;fu3iNq23On zCIp>c+YQA%hJOqe=xB^LXELc*(?JV!5qtRqn;}nIf-nU%s;U}Acmw02)YLLZCB(}- z;Gzuz3FJx+-Jd%+Wb_&lPu4|r#Ka7Ot7aAk#H<|-cZR8>zWqpjS6VwUBhSmN52Avo z^1x`v=hnleHZs^MA$oga;S)`3`4EP77wTp|hH`5%09dOwOizy}j$=1bUjjGzmvu-< zr|SoxK7e9gY_c3b8!L3UHie|SRWSeBEMS#B0*}1BypS=}I=E>{0w4yWn}h8|D)TKc zR?$|E+0JA`IOF%c1K-CnC010L{>cJ>r}{;m*%y$8~!$4-hJ;{T-i&ap*RDBv98#E#WOY9ra0ED*1;f{jTi_G2c9p~)^v^{zX#f_nYV~i z>o~yz<lS3uy_0JxAVDOrt8OnCQX4kNb- zxZ>^|9#+*pFQ@*E_#*zM!~_Z18GPB3=>@pGf!}@TLrJT4G1hG)NhC?S-~Jc`yEX{N zf5+tam+tEzI%U*;-U|V@t$H%2rH%tN5CLT z#IRU+m|YkV6&3&XPouX*SV+*MJx~X(ZjBn;95>(NT$~TFFBlcA$>s zx&l7zP_Tkmg!ibU*Av|o`?6g)Oqcp8VxYt>Gk|~|B-R=DeN06N0E5P^^~rHVpk}+9 zGLgPbCn17Z3KX9qmPe;ZXTo;J{sqK3gYHKpuPdDyu#vXU;u4U)J90>@kfoaaBPu=J z>m^A)l0yV#G$<}3Sj}F*E!Y_FEc3+&6;%q#%AS0u83P9iDCo596UeHl3{pE)kmpR& zVbpr&z@vrFS!T)L=Kmuh=r_?c!y0Ry0l5IsJ<;*X)u0MAjU<>YerPw-d=)`hvW#jI zvhB@5lk~by4*&uvQawO|0w`eRKrs%;M?d=UMtojcQoZ-!fqwtjw*-`mv``U9N?CM@ zq**vKCX}2E$WM?4#tTYZrkH_d&ibGcq z|HV+CkagxVb@~Le87t_4g?SvP$pX6J+#09%q+)&(IXtXF4y_+@ih4x5r8``{l!bdI zX6?5mvhFgBY9Gk+F2JUSTtN3XXAuon_xn&7U<2w%U)sw?R9xU?53)>S6RK6oNX|g& z(h$A>3%Lf6M$D1>S(3RzYh?HWV7wAc`_{*nYoV18U1$C##e**hMT(Sgnrc9w; zt+>4-g~gr)30hCl;V#7FJ2BA7+B&Rf6zNYaY%#h z&MyUP4YrQzvoHGZlhp$t00YbV208|h*LXGNJ5}DzN|%l8$b7Xf5{@+`pBTSe%&K#3 zZ{7^yb8*AT;i3pTqOC;Q{26)y0yAxklz$?Dyk3QA^&^cTpY>sy4P_vxBh6-`>$(N- z!-2zyKUNHO0Gy40nWW~<^yW9Jlw%57Mlf7}qSnW_TL|Hts*I(8;}whHeKKunRC>)9 z0(7X4B}|kq$stwmS~0volyhgYj4{YVSx4JefYNsD1*EHTsv$ddh@Qzbqwc=W*0oiq z6RH^SKM%}+AdPJ6jc4Vuh^@g)(`VTtHRybUIR4Tqq%}!qCZZ>Tv-=HjPxM}MJlx?k zUXME}D*CH`eu!EYn707~=b<8WB+%LP zSe8GUaMa$6yeI4U^4+@w?yjQ2u@m;7nSXupEkI=mCml@q3P9)aYTVK5J?F~d;WTQ8 zfjfxnEoO38CCgd_xR!TF$JLyQ2hWeEBzHB+o?8_EdBX%QkP_C}%O*6?A_Rz7by^2V z(-#$vWv;s=R%DX5*i)ww;UyHI_?>D54nHz$cpv2CxYLLeTTQqwT!{xv>(XFIce`iQ z149Hz>OKRK6wiR9Yll23tp%<* zh+M?M0gL|RFJHfcpKoMazCLOoUq9Z2@4%x_^HW!%C?(P{Q7yM80U0VJX`Idx*W*zJ zKz?P#1atw%!R5@4Ud>*rqP*-;kR!A?gLmQ=8T&z=3v&+v7mS@0V17V*=vHw$;s=Eqv_GGx z%hO%Gew}t;ZJ!Ccef+?fy4rK-N@|$TjrqWun1Ff;!O@UEcKbFt)_RtVpxcn@_VmjI ztXs1%#DkV`xibh&fOq?@{pa%1Kt35EgZc{-6Gr7iOT?t+aw`f>sEMyeYzoSYtS}n_ zIVKtk;#zCKgC#inZU)s^15d@_Dh1i})YL>h*(v`sSNmumP!u}D^!pC|%0OVQCPsQ7|)${``ePx#OggUUveYUg#&v*?OlMq;jg=va`WUKl^ZD;sqZr`HYR^ zsNp58YMj#B2)qZ>r?Ht?_s?O_D2`1}-_4*{fH|~;#IDF-ZB0!a++M2AQ-BtQ3j4YA zbX)9X)t3OL6B`eZ$13=QJ%mZvHE7zGODclc2PO|7NCme82z^$XJXq1Jx9iQ~aCLV_ zbS!Z3xCyOv)W%&7xlC(FCb zAnN6T2cU0;wiCIm>%!Z_-tDj{VD&(j8TOd_I{dx5ZQsftu}De5C3WbhiD+u9luV36 z0Y3a9$ijzt!r01)G{-IZAh7$B;8prKHMJRc>}dE%Hd0200cre=AMYktL*W7hS8AEe z=GHqZw)aP9PA5t>LJ1S=1%=s|fG5VqnEw@FBP8$-%jFv|lo(44oobygfVl=Z7Raq2 zj6Xn+H+n|pXTcc*(sf@*eu)_nw1*b|db^;;r9cO{d$oU|;E}+8g@UQ(Gul41HaAzF z952MQ^Fe1UMF+Cau0qwYTtI+qy@0^M)|+|u2JiLQv|WWaSao+x4@CHy4FUO8X5SWg z?DsCpBsJ9nO!!QFq*^3K=gkm6&sjAfY5W9jZP!zpEP=F^mZ)jb2wdaH>q2Y&lviWP}U1+A0zxZ zwBjL6jS?Z{8y#x?4VqY_=Pro%uVkGA=(8cVgb+$@Ih%4?n$ylC2WM#DC|AQkoeJXZ z>=TmIGlFhNMB~FC0}l?6g1QD7w0CC$__KYuj2!l1lnJ2Zv!6ff$gN~IML(VvK)eqH z5&hR|Hej~j9_FMS21t`oTXHMYYDQsVcZWQ>aRa=i-1O<@z))|k`ckblv~Cb}ASi{r%(*Qf3((dTDI(4xCJ`z_7>*2Jlf? z&i`xF;`Iklz5h}y=wDiAk?h0UY#Dx$k*YxT3d;8^Q`d`o?#C9tOZ5D^kHrdYhoO>G zMrsWBk;&kez zjC1Xp|2wAL19>&~j~+Gk8!x2qZEt?-;#wnqYV;QBmrTo$HYN}Qi7YCUa%$eL2Jb_x z&)Z-+7|tAxx$P3z7w!+4L=X{;1s#|;;lLM)#pVu)f zUUVXyj+|Vp>Ht!!n{EN&4IA(+;g`Jb;mmw>hpVm5?t(NR{5~GdSPRy1a{>zs$c?V9 zbV=()a-+BZ9V^KU?;4qNL*a3Bx-@LVParpnxyE39;fd_CCsHN?`1sGRR$WkS>&mSk zV(yZyF%@Z&0e*cmd83Xk<6Q4In8jM3b?dqMR70mSfIW|^KJEHvJi8cUgtadp4TV_ zaO9gy21eqWb5g!HwTp5EZ#+nQuQ-~*w9cVRO8hArd|pu0!D*_UpRQi>pFgvZv`DI% z{5JF=RtNP@>pYjCbJi~@1kY^dp8aP=djDSr3;%Zj_Fu!x|Mt85r=#Nkn&0KOT=R1t zDJ*1U5-?(X$n$vc8)QZx8LKbq93ajUa_Z`@k&tN3-;*Z-Q3nE~qnyF1tESF}PnqL+ z_mx6E|7ja=m4l*uZDWHU{*08Qq;pLTL?>r{3VC_^npD2bH2NO&W-B{81xo#Ve2{ah zp<;L25ZBHQ@?=CB>F!aE2JrYu=j7x(0kn*RtEU!`u`Da+CI;RsTKH1mpO^ecy?EClP5TQz1?T%ZMU9nPqwC_b1RJD*O;9hW(#~Oti+nV2#MtfuNFt8Zh!Oyc7 zCK(%l7Zhs>XUb34er<4w=WpY4iy14B((hAdW@gVUIJVpnfkf&oLmoMC+EzJ%VBE2? zvd7R`-mE=@xxH3HK(^S)v5JwnJLo-75O1miAuP7<@E*p(6#n(rTr3Jv+rTI?{l-iG ztu$Lw;3Vor8L&GJXh9cq;eu0TOI8TS>wwKq2@6SSp~B(-ZjBYqK5Z{|P+@^vKv4Z% zfhzxi0KM_9YyMqNpMC@fW$P5#h0a=_eTIt62yJZkg~ZFW#=GQv7rN?Xy6ZPoS!MT8 zZ8J_;vg#zb{|zK$GLu&Q@5lL|RFj>I1KzMXZ&jHrbQm zI!Clo_~dENUcVN2wiX>>3(hiYR4=2w^NiD|6)bcogT)%n2=2%1uJIJxrdpzv`iP5z zsm6uuQYLg5dgYs&-phA5q=&jw032odiY?p|17#kdW4gr|jgq3AA(SV+a9qli)aMq* zcU&-_M4@(9v^7UcFCglqQJuGMU-xDSEe#MT3C}Yc#>iU96^WhWfAxxzR(0>j0t`WT z|1{Wm@9la0v}1>|Z`VKS_}53Od*o(FGHG83VQGi3O;+60CTX;w z0z)^wGbU1zgz@YXfXftn$V<PP3OZ)|C5cjoP_# zH0*FJ8(b^Z(bm?QtRq{8o8%qJ*_=-@g3o54{J%`}H3H=fDYQ$YWQODTN-yLfI{W~l z!*8c8vzWs5;bWl{wpyEPF`jtRNFW=g7A>Siw$}|jO zlEu%xV7?)j)k}WOUs|q&dkvmU94O@=pc|MP8OHZRVhyL&fCGRL!>1@UI&cyGTvMa} z(?P}2r3@hjMn{Q!ZgWny$JhTfomT$zB0fmJJSuXb`cFFcZ8r0&ctOseCX*8InbYka zbPYCR`rKxHrmhZg(;@+H@FnyYCl=qq0+zFOkQ0VR2XZ@aYN93PGFM$SZE3-7LncmK zJp!;(z$IJmhPEVOYNLPA#!$Q<;oiOtIto!Av5#0+47pH(&DK@%uf;I;J~B$;-h@)+jQ4JYqAu zitK5JJBDy-xPkRf7Gy;$WYa@bK&(W}E68Zi*j9V;1Py!)YuvC^OvZk-OIMJ1X#Mr=$t2cE@7DbI#VbVT_=me~8-r|6&b{hHUJz?@P7>D{+)W0#oQ#Z&+#wGo z-sx0bxiuf`z2J6FqnJ0t_tTp3(qLgWSg#hDqJu*sy-j(cp$haZZl62LidMHCSAr}G zmD!y~tbQl}0^Kj+y{H6(Hgj}Z)6JQfz3twzzVG9LWmW{dhf5G!dvFeQgLV%Kv~~51 z*%E+8J%TEzO?e0Tc{!R0nV8D{xVUt^?hQl)Uv=JLyZP8QrAK#bd_2#1{3$u=Rckbz zv9ToNMLQgDLteCUzQOu(;U9>WEv9jNT6JG6f<R|iNGhX;KU_6E7MeFy{ zKY<5{h62Ba`Xq6_`Q}wmf>TTaL6-A~NEW-I29Qc)FxE8#sB{Tb?z`A(hl zV4b6P+|t?#Nj;z7TJF+Q?g)Ob*RRvRULIIAUg~>SHlKD;OS?mL`uC6xDW~a|o7!M~ zV>vO9|8-hf!g}waSa=*g1K7g<`t6^6_wliMQKz;Cq>l$JXYx+}O&_nX#~UAKpm@|) z*d?oV>sC02`P_N=tRs1&N8kGC5vP2(^ghyVGQQq~< z&AP_mD`*Jl+g9NeHnMFrw8setDGEhSKGJ6Q#C+h#`c3AyU|7C3eiO`?KJ2}`wB6k2 z$k1Bk$xEOXdVf&T>~Ajcuxtta7O)>rWxE*H9hdsX!RAga*5Y8#TC>`%_390_1lg-s zP^@}g(43&;-JjC1-tO*bje^Y)EbLTMWT^pKy>sv0@3B)0K;IxkI#}e>+}zFeA`v+O z`z$4YR!+|D`UqC9N2XJEGDXg(%$jd+8Mr+6I{5@~uX-8jZY>saETa+gbjMLEr)>BA zP;eBT2UzGXT;3EH_|KtWpQ#O^nuLUwn5x>u*cJ=j6AAD*$az03jYZ1yO%@#kwLDOy z)gEUBnN~Vw?>Z7+VC&-*eAuyK)xY7C#ffVKA2%rez=bB`n{;Yhstl(0&2{#uQ*Iz` zp>^>zQTi_BEW%T6R-Dqd@>0E&@VV{w6~9@V)sA@XU<9_hD>q6LE!HrckB%snSL^-A zJ~LFPLZkI3lpPda~-sQ1F9DWjcjiAwi0oebc0mX`8(CspXQ(ktdnoB{?~ zFTLH+({tmotvPU8F;(!H8bzRNAO)mA?wVNv8nv8wykU6xWcJzCRFu%j1JU9Y5}I0g zU%;vlUJPaO!CXhJ#_WM;K@8BEyNKZ9douZAt~rsO@1`!2 z*!fk@3Vf?VX!kF}g;@%yx4yx_*WgtEOMr7)S)tnPCAfdVq&3d*<<`lu0kS4sUA+LO z_$Z$_1c#bKTikPI7#-f_vB!s`kOT|k-_YBE5$xJh9uRb~vBTSzcwowPAGo1QDC;8* z!itmPLa})yGa8)j)Ji49Nc}Vw=NPp-hUmG~AAw0ydHU z#jDm9$A>R~t$dg)wvX-%q%K7k{W%DdZSe5+u7hYusbpXDqhkkzA%LXP@#*Ogkoe7S zy~hWQ++?e$Yu8?r$4E&DnjG6Q85rn+Sbk@&hYkgW8glM|*13^I@140hR&Fk-?lC56 zs5sbd)Nzn<OQE)bJQc6qba}(;W^J=t&i`Zq ztiS5V1PN9+E*z}&YB-G_Y`+<*h{5JAQC2>jpAN;;TIgDzcv{z=H){e3E1)KiHPIr3 zpYJW784(W~xApP%B}iNQl#_JrCCe>#O}V<=BY0p1K63OPxJOK#1LRuDcFD2bO# zpZT7b{>dHJ%y{$dWy@9HDliV)&Z1%3xM;gIcMclx5C<%1fAondu@)c6H_I>7el1dl zmOv#4BrpVVL~zWDy*$A?+#z`(B0{a#o%#ajq9xvF^eT#9@=HYvcLAb6kk6bzt%mDx z&5J?M^wSc{1bV)2quyJgF4w+=2pztqnK%yfuL#F zIwAZ$$7Iq^TfNuy62s>^U}3@?#s#i( z@6Qc~nCY>~c=!$C8}>V<;2r_e@2jieRZPZvWE?IZnkoL(u_~{1=a=1T^T*6gIxry_ zCp)z!0OtI?@o-MgB}ki+FrM|@L7Cw_@UH4gU04w|94xLLEFpn|EIeog_S+nBC|SJV zQh-AF`?pVzAoBnpNa=%v(9;bY;VrGtc*}!dybiV;8JXSMP^fk)cY1_r#mGLhKYC89 z{6m_D_gh1CJZqBJEy{)JVvDa}*u3i{x{I!iz+S5v# zSw+QVM}>2ysj1>$LoQ-t*MW|W(dk4pN=+GJs;c%kL&p~eF0QW=igB&eU-@U^v@DW1 z4a32!*Ce451h*rDOf($iL6SZ$1_#|jkc^?T7e2VjIB@}iEm^}(kY}_pt)cHw05>7A zuWY1~^%dt)$m)6U(!QwcENTSr==8rlh#FtgQ2CGgs=|?&2_Ul}1Y_YQUsW-Y6h|JZs zyYI=BC$iaYNt#^PINJYXy;@ew1rCdOv)_8aVKMqj_h4rF?+m3)QPx+^#p6BTu$UTX zWfREo8BwgycXaP9GHml(Lx$(4>}*^5Q4fztKlHkZk;v(|=QMO7FJ+)WvoE7Ggk|Uq z6+99anv;kV?R;?S$Av2)la=Teulhl)a2{i!Twh9wTH2SIrZr;tMvNW3?DGz^V z<>3+YSc~an;cKaxpaosN?wO&OqrQlv7sGouF~lFTru9@B@`sscE!pLxvHuYc4mZs> zJL?k56=kadwC!3eK0XU>RoQ=LO~VYh)YnJ+;kJV?eEbCct1}P&k$DVniOm_)8NNz< zD{sJ2e!y@G{9O7&b6pN#Jm~(k{F=}uFA3S+#6C_qxA7(Br~eBVzPy;D&{b3(4n>Ip=W zesqbswpwv|qEoggEKxy;ae)49_k0$UYyz>|+vvq!t1jEqsRkJk9JSu$;UIqfT87bb z$sFr83u(oX^iVU)qc%dVdK`w%Q&}W$>?|NT4GBn2`TpIyz`NLDkw4~dOF<5d2nkO1 zCY@uaCPOuLZXT)UB}W2~11^le3wcl-29WbDP!ej!PYdgsu_;5r>+dE&fobH?KPaDa1lT=tn>* z_p&rZ9}<207U63ucCb`-swO9fhAxd(z`}lbG7`&<=k=h*x zW)`vJ3MT@s!Yd7gmG+L*^2>S z{(9%1$JTdFvw*M+x6xR&%2Xy;)rWhvV)>DP%VI|^!@g|agE zW%OlQ^)pl)-KeZ={RNp6Nb_xW)=;`ooa%Re%h$Xz);dWjQs@Nrdma5iDKs|Gfx^Mb zU!VCZbM4wX6BG;}W4^*+y%wfqyAKf;hK!q^^UToKi&X!h-)SxgfPnRu<@XspU#lV^ zmvtpDC51xs(a$&~eoyn244gRzb+IbQOMr)f1vU<^v}Ew0=J3cdD7IXt#kk|+75Mg- zq-YmA)lNx~>?gJ^^F|)X1n%aA?FIxFV8_nj29Fo|D4IJ<4PmVMCQX5DC4NAskOm$o&)|Kh&qN* z4@f-Dp*Tz?uu$7$-+L0PePg?3L)11+G zy1=5bZ;b*{Kd60`1ijgW?UBA; zj3SbGNjvuG5o#qqQhMx}jZJwo#DA!$>Q*zLuzzrF4+DFFNJ*J%BXhF@B7XyliSI+5 z{H%ruIqu-^A730)AIi+j&Ar}fh7EbIFvn!$nEsaPSu7BGZ*=3Ee7hl%8MiV>@@TXu zxa;s9{R%NWCFJrMFL<@UaPU)`=C_Mf(0#z@E)ynmwqtbS`oI(%n4j-Qe z&nbBJ$utxz)8v~Oof@=%=FF_!i`+&*ZEymj|uUqZs7 z_2KfTpO(vSQ>THfWTpBdE-o&hI%ET#n>bi*kX(EV@ww{FTA;BD@gm_u*Je2>k2O9cqlvAfHm~#r ztBAverf@R=x(n_t2Is+ZEa#>_;IWY=Ueg~bV`qnIFLh9bDmZoyuBY|nIy#OR8>jfRwXO73@F|O-+3s%;#J3iH6`9`_*OP45)?F{b3nvynI(D96ujyw@{->1rI6WeS^>DdQmK!YM`bxZxuDk` zck97REIdg0;kv^AnEDthkJ>H<0y!47C@K-(_v-4%)o2mqdPIu33n@)J`n+bnxryuZ ztgI#YZ?(0*-WM;1T@ETJkxZt>c5v22ZYp7%n;KAei!)vffz1W{Rh7rL^?A9!hRE}j z`K$hMxvPD4mIUPvH=De_zs>vEn}^)?k>y+)&dLhi^VOsPwF#?bE~HD0;x}Gnp6kin z+lO$W#4BrQ(hh-7k=5lAdA7Q&u`gW;g;NV>y&N7vyU%k%AU??9zW5NJ?a(cHm5>tY zisJ$a)oHBD8-k}Nk86c|;ogjWESue#-0Jy02X^9GkEDZ}#WH$X_6l8qN@K>&2a|`1{G9ZRh}I^#n)di) zxFs*pD?#VCMlC2UgK0BkAImQJbIXDwWT#WCR#(8| z3h}urLhdSMe`@PBYTzucwbP1^B`WznJ3Wo2&^zHgvDCjg0TJgevS$lTwa`v@h6729 zpPJ&SgL?}a3QnF!=5uCo>9!40rQps_N6!Tyx$fiBEKaAAyK*_@;a`UaC5ygnntZ2z zh0>@}&@klJjI#|AgG>>ZVNg8MUCmxzUjA{rD4>yv&lD+Q__Ct)s=K?Niy4N-oSx^l zx*eU@*~T?F;hF4m6KtJb{@@a^Nv>MW{I-(Px(NM;X_^q|@tGW1uR{;4&WGja5fXzl zlSCT+n1LaCXi(nwg^%quP-mc0l8;mh3|K)X^WAjXcAaMs{$M^%(*5va36_{syqp!%`!~;4y^IU#E&x&R3EWF=NAf~!>coDe4cg}2rw)M= zM>({M0s2JL)0SU8A}jO5^zQd29)|;b(GdGYR*yj5&z}`)i9MiQ8pfy<*D|f{^q3gB zv~34sX3Ce;kSf=Dd8X$)%6LZX9C&=B&l1)_z_e)T%0ND|x}9N0%QW0_b&MNtnN1y5 zx=j2Hn6?@{_NJ78fN6Nkub|Jx6?*0JMl}RwoaHiyoCQoHhW_HWDMny92n-Pnm+W4R zi|g97Bw7?PTHtMutpB0ki-NfmO}=-aj00G>@%;(8Mp1saqGQ4sCzFf=Arl27+_l*i zq`noW4q!iU!2Z$2<({~pc3K9{?Ck6$_))2qlJPm-v)x%z*5ib69yG<3OGn}MH+Pcy z4n~q;oXk(Xb7}4)yX%08*_Sxt=g&z93|(z^ZVV5qB}#)eLit2lPJJf0H8Z|#dK5K^ zO?Gk)LcH&efNow=XJkqq8DtQa?;W+Gx62KO}0_^Y{yHfM^_Gd@eJ49Wu=tF^s1SuOrN}`;BRc}k{ z4uvbB3$&jQ>H(Ihd5gt7^a6mBO5|m@e(RRck00il^hX3FQs%oW53z{*6wJ*$JuV7J ze&O>ama)1Z*pqqV@>Uu1?0Vd9^PEl4EOL+GGof7R*81l-{Y zU%|u$$|rIT4x!wY&F7G+4U%(5@?M4F%}j@tRf&~^V0bpqx34rAiu0$)FhbNaOREdyO zaRCO>prx@Uxp3ja-ne_zi%xcEeS;{;V{Q&lNL184UP}#h>(0=#%q;n^*kee)eU>g= z7_2(@nDf1rTGQE~A`H#gpdeY34`?VHvYz4lCyl|2LL$ZVJy-B0Saqlqd)ZT4$o}Ng za~8x(zsF1!vLR;KEpqL6S7wy=o2h63QhvV0;+;Qee3Kv!swVe<(}M zf37{=>*lKji^UttYX0V&_Is{#(i>xy0!KT8C#F-+24UvD-mgRUxp88060&Y2GPRMg zsRQ%U%KhQQmfe+Msf)N|NRJz?9aUEtc&_jdUr5ftZk>&BLWhxrR6GU}4-Hi$dDML< z=fE(XOxGtP?G1$>PRH$6Ysha1ZOk4fXk_&Ln5S&Nx(&Z2k9PE=_KHv;E0Nh0` zTP*fmQ^RAOh7%&jX{3j%JtYOgj6LDv3S2WT($4Jf5GTeGZT$Va1{S0z%!mVyEAGq6 zM{jO!GFq*ivp<-(|M9N#I;(!#qgVV!j8Aiupm{v8TzD!mTg%yeygVjJM5j_L?AR6z zCt6w=D<)NAdzu{4IN)k`1-gK-gwCYp@{mPV{I_o?4TtMK>HMLQAX!dZO#UXAx^*;HGmlGG&d=}z$t?W;T zEWyIppjkg{rO=@PNvcAZpad=)`MM(4fbUnzNa5zbx78`9=_=uXj9D83X94SVdTzN> zEj>y}Ia);-WBm#;!VKU7b%T?#a^Bl4 zP|i5%lsVuKp`#y?y#t-*LY}Ui{-C%_KFDM6;*wTnS>$w3;3r-)&Ge*;DZ6DVufRRI|~V) z<87nz{c9~T6{>nFJT@Eng1(V83Bq~UIMJ73_$O49IW@4-U{VtL#@CF7f50Jb-@#ys zGis40*UHGGcjpRWKqCvDkX(w9bTnUxg_^0JKq9YSh^K6QWg}OpMz&m0pqL5#$X~y*Er@ed-g007)#j3 z!+316Mz)2*jo?#(4gjLk7xXiQ@aIfbnG#*Sp}q?vBS`y!49roG@x#xbn{`e?sK#;$ zE{g?lJc$s1DH;U@o{7oqeaM);Nf_z|LFle<1R`g4p;0o$gBkD2K(fU244%P%KmtT1 z@I@(OrOD>HyVEyE6jgQSUz?a@m;+zP`<#EzHvc$c*7r*vAr!v4zX%Nmcn}?k0m`oQ zP4es{$PdFl8vy?Uk3lW0^B_%du#&g~`ysTP{UajeXG$A#c!I1{=E;$S>A|wx-xe__ zxx#W`n-j%o3nfUH)*YY`eeUNH>_8toe{!54a?Gc7^H<=@(_N=cm{ToW6G!^ke5d<> zTtE~utK9C6yaxZ1XB}D&6r2HvCX(;bcuLw7n4yH};ug{MM?_T3`Zim--E)>=&t${@ zLVk6V-)xMpmgwDscHQaGtQgE|AejmcnoBZicCv#7nP(Bx@bROJVcfDbVDal*>V0x) z`m^}uD4+*n`d@%xXQvtPjTebtk(yVmN|@+@7x`L&M1B1B7vl7h|fu>p8P-gd{C zk4C&9x3uiQ8?yVBpUX@&syyN|e1`rM8r2{szQe+D69%r}PmBq@asi`Zk!mnd0xX3) zy=hDD*|U&eJ3TCZq|+W!AvAVxUdJuCZTnE;!QWFUHFpW>c(?{PvZ`GK^wbwgy_VAv z;lXJ%#J9!xXR zQgmo2CbX##8|KJqdrFl7PLR4@l`fbl)XNxO1_FNhe5U#3VH}HvE~?$t)zQ`}s7eA7 z>-%;n$v1BUi-Pp_R8&+lTQf5f_zo0qwTY)Z;d|qyw=Vc73Z>ak1 zgl#1#@Gf6I`3Pezld5~OSA@I8%6dBZ79?4xCI(WZLihSO`!F57;QjFH z`Kh3WUms%U2H~}j!PIBY&>H#mFmRU8;nkylmDz=du^XX5X;!lf7qh;6n(HN&&*i0U z#Re(6)!^BIR}sH#mp{|-+o|7#uf_^L-(iY}M! zldYG)qad|mgWDRP9;!$93mw7v#iEZcg9R6nDCKi$SlHGl`>?p(l;oy)ii=nYvLTx` znV>Y#UM`iHRdBQK4TMbTyow)*$8P*VpyFe6*3b$pbv&wH~i?v9o74ZY$p- zmreu1 z3LPW`8bs~sZMs3G&4p0uSli@30VD?8tuWc&9|07ZKCK>OTeANR5Mo$Z^@*aw0p1hu z4Atx(XMP*YzMP#+eF^NoV15FC&L;tP-$k_+C<)-J0`$-pK@Y*asxc00fn1IgBE$ys z&CW84?>s&xJ%O&71wA`_k1U1@p6Hmqpr$MB@4WwCfj6T6zk@egSTg)?vW)<+X6==J z|9%y+w;|x*4#!NQ6RDrq6P+E0f?;}-|p_-dR@kBxj*j$4$eX4K+{8UfBMGTmPim!sn#+%9C(9out4T0__4q0NO-h& zVA(d%3+VH6peO;@An_&P&SY03c%2~@kxs0{)cPEn#t)LXk6@e#iOmf8V*e3sj8^JE z_*iYbbP1a?K6Yb${h9UNpNm*qbgbQqFxr{18&B^Z{EXzIpzCTQfIpP%1TkgYaID(JU@zlyZgT`!%s z?b}fm+A00XOKRi=T&++7h9E$lJVha{$XlyqNmj>1?2b6l&OkZC^nOeIY7{udz`q3p z#bM8Z0T~Q;%4ME9Fc*yeG0TdRc;2hsz}7`P+b;4LN1h!>jboT)T_vy(D<$K$h zNiK_O0a5DUZsri#g+I7=}ji8$>9H(3~#<3lU+ zVYf5d0=K`{jWQQVNnR8Wq-WJr{Q4dHM@70)-kw>rjkTHC=32jw{%dV*1iA#fd<0jT zKN`Ko`~b1)hkpSlr(cdif5hprj?Ip+iLGAOqoD*{`t<%u{@z_UDPg(OWxBAVK>Ocr z%jb9`WWPWC^gMfrrl;^R$btRR|&nK@$q=$ zm7)8YE&>3ULc{WtPR#Np6qp%h6@Hcc%0>s%cF=B2))yfdwYJDAXxm;47OYG-0Qmuo z++`3BAYC2kZ?+d?mi)YI*kTXKP9*vI>8tlDHX4l?&)LBz&d4+a$h>wV84A+oZ<-(p z&}yPD-n?Of$-WPl1u<+CF3?GYHXkR#koaVQ7e_Y|-1}BHq3?v;h};17E`& z8_sIM!uMzZr6ZJCl0=MTl9XtCyw;cCZT>|*)EFq)pxef~KGMY<0>^Y8v_CO$Nm2X` zyJo8+F3RW=pIp!1go5HGr_yPNGM^)&th^CULy5Ti&8ka7@o{8pt07 zV>zpKKz#MOQa&^UYUJpmaAh-y8}7GSEOLDVc?7D9(gPy3@CbaV-#kj}Xb?X= zm|EyMoPeq27<7l6ZF$!K-*A}^)pub2F`CGuK-F42)!`;z$N5zn#$;;wi%&JCl4Bfe z+v95$ydZk|5|C#!o3{22+#bDrr$;3%v#wpkqW{ODiQ9Prh66vIz52FNaw9mAd|HU! z#&Li8ZXAuOm>4m=TCt|_KFla;Y9jr4tTCrlW)lsJ{xl-E5RIVW06rgS4xoscc&+4^ zxTKx8(Q6eIR8ff^UCBXK(hH8b$r3`T+EdDBbIW(=B2548<@`q&aocS1xpw`)fXI1+ z2=IZbUF_>~l^zYf*LxuEfBgQvsgXcpLf7OgIR!&>YZUVBFHcGs-NIJR12P!+nKy$ErzX5rQDtVE4t(xc!CENkx72v-5V6AvcNsGS{4A9D_?~1g&t}t-Rw?(g zXh=pCnG^A&Ap4_@Kcp_B`a413jBt&R5^X;OlRv`nekj|wduH#gw5I#Zl7%(1BFjKca| zh8-LLi@*CxKF*lY$Ppe)ux_lnd_3C1IY^X%v)R;?lmZlUm7LO>8=k8?^F-&T;U*jh zHwovJEOqGH;-fo3-bR|3S?<9hAueq|;O0$m$7TF!-)`1_08Q~!n3dg$ra<1qZ=vH> z2LetLa`{p=bGgnw7Sad>aZz>7!XSV|CVS{CdW*naXA)^;=p<@tw&-sAeu>|l-PW*K z?V;nJ0)Bi++Akr`2WB>ClwaHyiT)rLo%M*Z@1y0t#T%n}Ex*;>a8HxG1QnwjF!Z64^u4Szi2g4X3i3@P!-0Kd3*CQVZbW2d5*$ zW%p;A!pU#wpttxYRGV}cnyKh> z^TbO6tX9?6BO@XPQ_>Jw%*rrkjXmT&zaPG#S`uPVDJ!SikoERH<}PExToG%czd-ci z_TuNBOcfLg5DKr;lU;V<9u;*^ip=O5C6a4%0!mWd6u$auq;x(`KNDIYNX-S(BA`I< zOr{&L!K>sV4C1QiN{5p=mO7MJ6bbK){(W+77<1&a%jz|%X9y-}EJ1FJ4*9h|VEP0r z(cjXMRr^28xm_WH1%H-tTZoe5^_%ubo7uqaQw6Usem+W9>;u*Xgd zz5d~o=7@pK%(rjeEGXr&BwBU`2t*6|65mrl-5GTB(vS)@iV7_#3l8X-eh5q^sPiDg z@hW)JVM8-^;(b(baBx_({_ihnV7S2wD@8R23l+z0E)2k>9$cPHbhj zQsdEKKtf9)J_}JDTu}fIZfei@sV}45Y@{AuRpqAZBXlKY*5R@B+CxpviLIkX``auj zM)r5{bXU^B74>yTLVrMpLJMuwEDSB@`lODVG=ZHm=+7;aKGh)n-=zv0I}Dw9Mfz4| zxC;X;V~DveMYh5=cXulb3`?%wOyP9{doXV({FMJ3?AugV#`$YQkQGPE;6b`fcBM-!|Jek8MEB=|NKjn5E+P zSK%#p3Nm(98On=$k|iERMlN`zr@`KED=JqQLc#wdSD2#2tPto3@T}-MfIH^LSEwan z`93ny46}Ax=u$#0NX^eSg;OUvrl!QrFNlFPSp2=y@MuSg()R;Daz5No#}S?7ga-1@ z$y_I=A8#n#3GM=`u5Cw?-}q1vx|a1|rJy;}`6*DXj}MX4COO^|AEm>53O)j+t9#bIh8AUgO+@f67BiXLUDVS=e23I#<2#&9tK z->Kul4|6nixill`lz;P4X2T8OI-AkR-I3jSJlf)%xe53i&Od=M;T^adjA(nk;9#va zs#wNT;Dm#_y~0U?F+fYUOG<#RdvR+%Pt#Wlwq?y{G7eb7RICc+Gz)z>GUR^PL|oyJ z=iH9uIa|GS;tkSW8G1KyD?coZ2(@pA9A~o=OMx^^2WIx7!dTP0vu9suxhsO6)I8gM z7!GKOGP-5Z*4DcZ)`mt#$=$z$S>T2k*a_CfkYbshJYWpfmCPVmy;rtGxy>%I{Al_4 zb7KCE8?IC3*haM*cGqDP=Z0F>&2!Gda{Hdz&{`noQ|Hlc{AoggP0wf0$N#e^Rq!qR zQ)qSzg5#y))t`ak0cwE?l3G-Jpr4STTBOd?$_9Th)8(CT(h6SlY=v@RkJGF6$c3ah zX_?L+I495&@jiI~>rNBLzF3i|RjUpQk69F-MdHFl)J{54whiVA1hlL3L%jx0=y<4VBr- zk{sMN?Z=1X(F+_X3Z>I>Zwz)TgfDTI#V1)>6)(0rEslH`%oi9yt6^0|fF zz1@oc!QPukW7+@x-ltTeK}g6HDx^ZD%pqi!Ib%pTg=C&($}AydmU+xPlex^Z%p~)e zdA2`?e%HP4dp~=vz1H)r{XBa;>v#QkT~~wiJdWdge1`Y?^_HncqF3I$`H(oDD*5Sq zeufbZAi=+C9_Hx&TQvB;5)H;tunjjgT|C&KM4YZ0CgZ(PQWN zH37=nB(!OpfX~|ySSrEH;wH5qZ+oLJZHHSM>6YDBa}spP3**^q`I!$2avZ6#ma~N(QlTE>|y&^WG!wX|AUweF>i{Crvr2G zv1z&ebh9NmiisA_`J{Yi3GH5tR5(?VkqskCGKEB*E1wV41r3S6E&c&MN}L3dGjyS? z6K~-o{U0R=Jm$BzrjQlxJHb7?tUmbUtirX1`)AJzJfRwq>Sev3ul}%L82B4#6|6|IqQkxl=UOZa#=fxCF5+&B1nid zKBe=s3lp%Lc=Ow9TYs}7%9~(eFd>2ZiEwmh*=yUvzai4CWk`s0DP=tZalB@X&8baf zcOP<>VEJ=i+g-*O(HDYZZz?5rn+igtJyxLr{j)c#1%%3Kh&D>AolW2PfX+A78VtGf z=Z~0R@z%n3fHeO8VT$~gG|OUo%PEn&e7i3qhIoS0JNiQK?aPr6=|4>w?m_GsMxd&N zF%0O8Jl_0a8;5YK0R+LL#3&Em4@>oI^6(lpKxj0YDds zlfOo-`Gp)DJ~nRX8Sce0>q4}y)x1>Ce9!FK_ONeIh(%#-mCgEZdg-WL0!X9l~VGojSa&UA^unu^h0vz)e{}aGb zs_)Z>ix)wc(NlQ+(!}qV`z!7`xrK!SkObM4=*{5c>uUxXMq>I*AYeX=W$lt-B*f!% zNIZ}|3Vxa9*@(KjI(L0VM4<-P(MTgOd^k&%4tTj&fkyrZnB52Uaab`Od@e0^Dvm?~fc z)i=fr4DJSTbH2_mFDD%txj_RZWqX0V*O}L!1>ebDTemw8%RU!CJg`e7+|Mpb)K$Dcn2-j5iX-c&8yL6<9#kQ?&%xtHLo+3vRE&@s(+|W6 z()uyvMpl!Nbm`u)(=YArV)_rRf-*yn&;>|Q9Q`B$frE5z=|8d_|7L8~KBO_qDlw=vwDF+JR4A2m+zg$K% zgfGQ2O})LoNB!Y3AS0`9_k&l+MCHz_nz6Af@PWRiD@NY62waDc2Q7k|n~(ij(*HD*ST!W7fJ z=9JXv%h>;y)X1s*PfGNZHp)~4LFa5Q;rV`&c zM0k0ff*Nh7Y&&g;zePsu?%whvW+tigtn>n#7921xU%p_XrVr!i=dIuTs*m0M(^Ogb z%8rdX;q$lsekN!PE`GTeY4=i_+PrREB)NVg&g{)KJ3-)C#mUm8vm*LIl7PPeOU@Xq zBz7EL%zv14mlLmlGr#dqwlv9$f4GXbFfUDbd!7FC5*&wrrF21;m|SS7PyhLd@gEYz zhyPu4c>X^`hd)sN@mKu&5B(Rb^55U-{};EEuoUPA@2>Bd`Vwhg5FRcvhA;3 z6cMk#PA;UPsr+Pk^Y(3h3~vzhl7-2^kR<&R&es&3pI-%F*(`TZ0ZJ-Z@-=+bcKZsi zL+GQ|Z-~d+8Vqz7rqpPg}BF#BRXdqxYC z9{t{v{^Aqw?(bVp_2_%$H>sF>Uy(i&RS2X(o@_ zqwRs4$Z`JUINJKvHzaiICiO3@Of@1ZlQY7s#zVw@H@5Dg;*17fz}b}MDSxYKsLG$^ zm0y!l&Sj;8Ojr;!G@N{EZ&xy465A8}Sen*m+uh%P9{CkW=*om_aqUjNzKn>1!X==N zxC1->##1Uh68S(1D#+NncMV6+JQqqdYbfotwei48(EnyZ@(cUljA^6ys+8Ztb`~-) z&34~h`t=JR%|)MJG*sZdHq_QucwS!4cC`F`oFaoYf~%B@;<8kldi!=v#PKt$S;O}r z#*3?fU;ftU&;14_)TrjMTU1o!kmhy)7(lFcc9$SzI=g5_4641|{l$*XB4g657C5VQ zAT}2gX^DE0E8YD3xbH~9kE;gPPjD?J$c%{6xdPw$m_(~C?P1oCYSX}VNSpgTvZBpB zR1vO$GKJ7dkgPOBnzq*ipxuazGhry779Y&FsmdJ~icMuu-%P8? zJ5~RDwa3uRVjND6oUv;T z_)kJ^K3r#VI#|AGGA1dEjJ?2B1@;;&n1Q^pwysMMHfJ{MuDBu1hUYCDFB|7*4^<&p zFPRbGVx^^nG1V(I;r4$;Q=eNyP0SD8fRI3Mn5D?|h~X(pO5Qtvg-oO82UGe`g+JiM z2sC5)or5$!>Lswxhyko?t}nxP&8g1Q_-CG8${HWTA|F!4{QkWN6(bJnCQ~Oayf{B9 zy1n-*Fd7@V4B1O46ofy3ASu~XUV#Oz3km1Gd!<%P!-l^_0?01$^RIrEJ|7eZvx(Zp z%uIW>aQuhXfMakMxMn)uu5fWoae1T^OH53;&q?%2p&QK6CoKg8w6hi=!}^x;D^MsN zACZ9-?h=R(TO&Cx>o&IHAMral@N|Ja9xm!H_}_ptef%nU^SnLsKsE(98H|+RQSjRN zLAIxY5vzEbNih^m4h|4HFGR#+7ZM1Wk~ExqcA*0)Bc{jji>Yuf`o5VK_o4e@qpJEz zLx$nOamvtQh7`1iouEnj{rmSXgclTM)SHSiRJh>^Kjce&{%?I51Gj^)*zg!ANpvGg zIZSRzim58H_zYKxtN9#pWJAef}yf z<>2rz6@06gNz3Bm;;ve+yqpBLm!fnvQtIv7A<%pz&^p}a90Xd2YMusKA2i!+X>N%` z5ZPBN-{Bu%<&5?f7b~pz@vlH@^$xef(7|(Sivyy76LPMptvyp!rFj7tx2|~HNqKpz zKWEho7>Wrpu`6hQt;d5~_vq^!<#>TU5b(&v@T16w2I?_Hq5_fdBpe7P&`JT~KK0K>de8sBHLPiEmUh^%pWQuztkFm3kit?{NK6>2%26Ajpp{u6 z9Mgi!XEt@5^=C(CWv3aEV3SSMFci7(K)ySOIq6Y18COjat)k@-z%~gR?_lG`e%W%J z+nm=0?3wH-UMZYoRdcY7_UB9?|E_>fi?*F3;TlByaGOza?T4%# z`*V2K^lU_+vwFs>??c=XzP5Ib!UY|SZ;*9*d~6I&@TzWiqEAQk6A=+A{%RDC#~Bbu z&vnr}nLV+b$3N>Kh~Xjl4nmG6%{^+xchw7TX1p~sYfP4EVbZC8Q7CwpZq@><(3d~m zx2HsIi@a z^~fcdQ_x+*LAtuS_tlAiob}tIP((zu@ZXU1p@qK4<5m8Qx021>x_U|F;?Fdc3Y*>~ zuR1#L+8QBtH3`#=2PuC`;>*> zD>p}+B>##m-NIZ}OF^`A!`N!*kB;exJmYf;N8$Aiw-G%lTqbC7!I}4^aVso`-+rh6 z`1?nA#6OI!=l6e)ubAgvQ8dheRitH~1v%Q!ssN6#nZ~6R2<-DA97m8D?d@CI;Nyc@ zO38Nfx94RI5Px0-xEd((A*h*}<_nyVB*MZn(3Y8lnHme4$hz+CGgD20^$ottz0z0C zo$~OH_>pL@JVmR4jU2vQosNcJog3KBFSsmv`@d==iV;7X>dkddwmfJp*1?JS16 zdKBO%ML`mOK{?*PbQETs0;6Tk+&@gKI3|V-hfKcWaOzZ z)J5GrEYEUcFuANYL3&sN87GiyO$(Qdc&h1y6n-Gp0TK#|JFoREHpNCNB5;frxsdV% z1h>eM4I4~w_p2wJ|KsEBEo`zfjy}OaLBj|Rg!k?{o{($p?cD%_RHm2TQK;tfSP=Cn zl3vXb4ZP~^X+<<<`tvKMp&<#%&ssA5*WPUC^kl5_aSaTQY#>y?%Bl$6G`}_Q{sk<| zYCZhGW{Kcn;YF7qMxYEi2IR=(0V0>j?2O1@yMafpk;~zg<`onuncD_);+k+~8YG4r zd97e$*U$Hu5q{c$9=xW897QLZelmV?MOo#}-G#H@ki4^hw~!@H)eb52sK(jQy^H23dg!g-8*4X{cFel<=>8T+@7w=V)gRpA;T zp`p}CXM8h-7)X9m#CvD^;yp!&@kdGe$a8cYOY06e&uJy z9=D2$N*tJ7h#!3oTq{MJHrVgvF&wrNAB=V$W_r^PEA{arW3*G7$jw`cUm6k8;G!PXcKFn4$jv&4(n z>B{wiIWq}onfAeU?A^+2h(;!G{n^@D9?o~9QJ5|A>{;`fBD1N75TTA7Y{+?V{refj z+EFVuGpLVQc&v4D+<_h15bNBij80sKMn|zc@1PF1T4!%Pr|;AAa;uBUlC}hpw480O zq4T;Jt-J`(QIB~>fDn6MCM_bZ&`5`~9sme$CXZIDDZ!kaskE3^sN2*r2jCbWFS5h4 zjMRppYq)h!qfBYGZ0Z+2B4#YHS9WwM1sQrMB*rk}!-vPf;>3hCF3JU7Bxnbv)j<9P7z+}b znD_^Mc=IF9(^~IeVb`CsPs6TjYc=uC_&`y60XNncLU3!5$X^DyS^bhE#@``^QVvs} z$vUli=aYjIi)3eb--Fn_7#*7hFZlVMCY`0911LIsPY4#b^O%OHzxpBNkGX=flvpJ(eR4uQL?%H008Rq`F=OFWP=BVgXojlGCv*rF6`_a#dE7 z5hF0%S9ULAUofDpIGzqWF?5io<3C{r9moBOo%Qsedi-4biJeEieT7sot?J)(rlQh2 zH`y7ldn2rCW;*QPVh&t%hHD9O;|}>!Q;JH8I>yC60jZ)`awY=4K1!z&^{EXdP=hI! zM}nawUbWmZ^fT|l7aT(3xXcp8RS^i(Qttch`)jgJ6k&`4tcvsM7|@0AuEs^Ra6m2= z93!Z>3c>Q%gZnomQmAHH_nsPkF>Vc?gqW^#s3<;i<;maJbg=?zc`q*?AFJ(UzJwFm zox71OiEHnB2yhQz=neQ#l*{?cQIP9d?iFzC3~UQ-vPWx}Rr?F_@%B?cf}M4`5<*o6 zLO*?a_w(mQ0@gpl*Lw5+1YhSh(NNO_rn2!!fYeRg_|i2;z%VLYz!!(>8E=JEC=*LT z_$dhD2930kz{VM;fv{LhX5nFRKi#*xZ~QuWM}~)mmZiDlDt0M|QyokySyxq5RWD#f zrUQpy(o$Vr$78i67;T%;ZpOi$HW07#@$`BPgOCZp8LGr*lQem;pnJ*cM(#K_%}Pz- z9L*e^VfJNEK5B^LX>xN943xC~nMxG@wZ? zA+!p?*Tri0;BH4Nr_#V6T%C_vC+v+*aejV-1mjju+0xzyk)_guB#lmtDbo}xI1z4J z)a1yEzKdX?jnk8`_9NTN``Vf;b;4%w;`8T^Q4Si58dsrcS{aQcggBieM%97fP)jXD z{Mdg!ie7=1vag=KdZS(La9i!UvK;&@B_)sQexxmN7Qxsa;7pFuqY3`Pe-p1CTKrAC zmXl*w^8~khbJOI`1@$!aaP0U62&pc4Snq-+GkI z$WK}uZp@GyAO_OKZ1rbFVZd?etSsN(*ypu#zp!QUr2YYqlRE10AVE40j5=x;0UN^A z!`Qcer_qe#`oF&VPO@-I)X9KWajvD&;9(;b)jL(JqwZvAulDu=gCIh3mMqP~L(e*< z;IixbuqhVgF`apAuABoC=-a?vT>m{N-u7cCS9kCmHT(w1y2Ord3F8aP@(&-r|0!F; z&3)Dj(CRnuiXWJ3C4v9YK3jP}QOdE$CKcd|&eIjinW}|&^YhKw=F7teI@8U8?jVQM z?Z^N*WJ2PtWyrj?x{O~mUE@}P19C{~Y4O2p>`A;=(SnxiL21Q<4GkoKe6NAEWnZcK z>X^o#KIK?=FAs>Hh+2vjw)$#}D|sU4SY)8WiP2o=J76c>_TO><^V8BuDJc{v{q}yW zylPo@A3VT=eiD0ixNzgTrUV;5>emvIEZ#V>y1$-JMbq>$+!OmT=zl$ z^F_a-{lX;$DT1+e}-r@=elf$?JL!o3P9K zQsT{*Ckt1)iX<*czhC&i#)f2DBSWYTK6_kP7}jpSbw0U&gpd~@+j`MDOD&Ath?Z6q zURK`imT8(KN|pAn?G!silSf{`oj={e?^0d8E-kI9dLASm*-ERM%fpypO+*NS5G3fu zSf%1+*fYj#$ngmFhPwU5`*U!zl(OPAE=kO zLqsk~Qdr0Ga71k@E$k|;@}0(84xtL}VS=oKUB zL^>|06&{&UUxz#QYf-jam81Oy-9Z4@i4lk0;?s=65Hd=r@HQLqPh#(l_Y9u3g&W=x zg^OzWSEo|jj2oG$+yN;x7L);-(*yD?;#N4s`W5Ocjf`W~R0a%v?nKwVk~uRbtM z-3CF@6=*A9{fhw%VZEf|3@*rq^?x?*Bi!l`5@d#z|LT6d>p2$p>_Vhn7%eBY+gb61 zb8BL#Pz|)f#7>8Qlq-QZCB8-dZ2raH1nkqZgLe8zvsndRvw>pJS%a0_BQla9#y0sj zl)1WsS(8R)^lA`&nNd{p!iPrm&<9( zd_F07HS*(Ig4L?>Yv2=B)aHa;v)h?L7{_`A$_PSoF-&-cXWOISfY8rkKB1ykSxzp2 zJvAhrg7McH7EVpin1MxkI4oqh3^0a~XRC+R0oV=c2u^@e|d@oU0)6 zro|&A&6!qi?1_7qf9!E7&Mp%mG+y2Wvp#v6^elbs@X8h4m}zt0NtbUj%yT}$t2jBX zM$p?ZHimh9-y{7BW~6G=829<1vWEb}YrXm?D6)_(E>yf%uU$hS4I7LaVbRW>mv4?o z6c(p%T$VOINIyIv*M>W-Xo*x4!F5g?@a2x^zJ-qz-=y9YaQw598^5Ne*?bq;F#yVB z7rlNFM@dGuK+Re}dWACJT}sMZg^dj5oO#EpQQ5bQraBpyEmP^A?(wLQhHu@pn!c}f zT*x%1>UO?8oYy|DeVUw{+?}Bm$W8z`E^NG6ly`;lK{+C}w1!vpMZh>}N!I{O@or^% zK|!AWek7}*Le?gUQF#UfTj3ICeD{3TreRNV=o%L!h#t5;?9EGp;rIoDu~^7JcX_L@ z4_!C5e6@n|yoIGFxYO~c`4v|$a2WMJY5G|BKCS4vB~uybC0@Q7>pLLrJMWLiZ2S4I z%;#4=4nRMZdOdzj0J>00c#iI0a@B)IzUzxt*7m+)Y;>i0%4@s9sdd4Bv;Z_|GgumT z^K%kaSAXbLlYT+++P!_as5W1q2ii&D0<5*N+{aK@!lxv$Jqwd(lnYcY!Vn+j!GeZ2LKsZ$bOA7D4Jd3K!g_3P_>CP(Gx zim?$H0l~B#zha$3H1dEiadSjCtqmHS^bR`J=g;TKD~Djma^;F%Q(s6R-QT9gM=H|+ zRG1w1GNA>prtco(N z8ua}Aa+)pzmQ837VeV`i=B^EmjY(&HWLSk3mn6y)8Yn>`1r82nZFG4;0xfV|ccP-p z`bj9Y*vad^YBMgVJI!?ps8+KyT7@Z{MrRkEMrWtUgh@p_eARj(x&@b<>*?HGb!gP5 z9T|jy@#Z%%aRn73e+*VXJeZWIRPzbi#2CXLgQo3ShXqf1hcoYn-!_5of&xchXpouc z@^8e$TUm__X8=1bpA>wjFlMeBE!VRq*0hN)4oG@OC3OCR{{)JqBE4OeFw zDWv2^SEot780-1z$_=T(L3;+$oX^LRNh>cc6E2-v*=5AmW;rZyXgZJW-p(7 zw31-((Lvya9I(LPpdLB%;lXF@S-*G$`4-nSt>?S3gK4Yd%}OCCZ7%9Dd~vd1B!vZ67{D~Zzju7GF0%tnJ@?iRb~Qsd$oVnchw$flsh%_ zWi-#ufG5&(ZcZMxX`RHe8J^m%I|Stp7&IB~O+gZA2fuU9ThfFk0IpF(f_7&-Ip4lP zcH^ErhMwl(K=mCU3@}3Ih*#=7(`|X<4G_({59CyCKZJCfL^Dn;Ek-|5<$fDZ+x4hM zLzwB2x%KEGEfa&(B9RU7H}6@~t6x^;KqiO0JsFtE5b>VXnPRi$W?x)j}+ zC}T`#s#8eGkpF?a9g)Yo+JbKgQ?HzU}U#nLi6G7Ya)v(9; z@>nDPiC+^$l)G|_lU+f<3V;bHz;AZf%s?{-Md!*%o7%WWiIL5s(hZ1HezE5KbadD> z%rd&#lHoEb`;zPdK=`HRdVf%EEpT4Ym{-o+O|C^Yq)?oEgA#6XZVsiUMhcZN_Vy~j zYj3Xwz`5dueP7Lu@jfY7*+@cMv0%Z+-g^VuegjxqBlTRNQ8A2R-ogDs#ad9#^c8r& zIKOAmjMj4c>Bh&~!>d=xMlis8=>|3*rOe%{qJc5>gZbDc&iq)?(g7DP7`z{=EXV0k zA1e>@-&&-(n`v~o8-y$u_{`xa7f+*5!|K=BOLsSqfo zs9g%H-p!@K=LSoB8^bK`{jFtqAQwq`a>WvWj^AYO~!$}j!=4Am7|{gXV~dtkM?K4 zqfZ29uRr{jl>X7=UVqZG-3d26^oC?QpR&C8(lU~w-9(v#FEW&w4K8!Q770VeTMJqO z1_$T=w_g&jANv8U;bz_9qVJ;XuXb z%2NIDeNyFV3OhUo3q|hfSh#YM`_B8I`t#>IvcTBik`FLIUQhrP?m#~he)6O+xOAX+ z=nM`uK4lB3SWs_=o7}~TL65Oko)ZVgtS|1L&~U^VYqkW_8i^L`Qd7(8{D(er;-=NB zTaO;0Rx3F!!gLb(K;RWnh_?@ckEc=q3D9H^jqs3Vl^Sr%mlHpEJ+1mD&iYg(8RY6p z4SYv3gzsnqt3m=~hB92tg3S9tKXLWy1kI&aN(!52wH$Ia@jG7Q;r+n=FY3;ZAKqZ+ z>pOexj755YZxf_T+b1F(IgcJ5x?$O>RNB!5koWNH(Ba`3HvJR7-B^bjYlSCRyWZ;u zG5eA*Y|h>TBaVz5)>yN+QZm(U1hmKXf&433Y&{uxcztL4i#=^&v`?%z*h_PfAcFK0 z$HUt(SpIHbItiedM|lW7OPUw-^7{VfuW0qhA0E2GXLBUq2>uE#4R02rVtT&+{TIA{ zYbyUyt^Qk5`u`V6DIJ;%Zku^QgnE0b`gD$X`zRUh(FHppOS;gqJ7|c|ha^-cA}2+XqECkgrzc7bFKm z#Jm;S5w*IcPH8-BhqDR`EU;i2tgT|6aR7k;E((y|prbFFGrZ;tdpub5y@Tp+d&#>V z-pFjxx4I(g;DF^O1W%wV*pG*1K>{ZX%1)&F0LaYbm%vX0vN&xL5Z z4n`v9Z!wPIMw^w=2X8EmFTmWV#F`Py%nbXH^KnAgiQ4!vE%nq5UOPJ2%3?xqf{s;F zQR$WSk!&Gbuz5(?+EFM3lG3BYq0?o+4vgq)K-WNgcwjvifdN(GKWDsq3HG%vP@FNL zdoxfjuxVh{sZYEi9kh!+U~dm+ra-!p<$UO1uMwSKa&xQ2*W8-EC^nPKKKldd-5UL{ zVc<51Llhzo`m4RSI7-u^A6NfjEH~RX6&yij`47+lO+aZbFF(+NBILPEOM= zeBfdL9%Y!v&TRYb7gLSokLDA$%B@L z)yY&_8v`zOrbhW$-|JcRHEyC(QG(PDi@ttUcAwy-nR>u?Y;*hgkfq8~UQe~KFd*lC z{p*bHrK5FL1-8uPs4*Dfg3QH-V?4?mINALcZ=V$E%iMzg6p>w6E$@RKSDxPOyayy- z$Dmxsow(x)e+6x@FR%dd5C)i-sFm@K8rO3YAA*A!9Acr%fI=OVMGSYZWTJJ(e=0SXk*E7*NtCm^AEp|9@?|NBFf z17wDGlP)ztwiP+|emn>bY&PeZK^yoitBWqFY!n9nYkv&g5QPu;WRL`}tn8}hqnSY1 z5&^a3f^v4E*F&F_B)!3{f?vO!(<`fnZqd=9Ao)uKEGq~v$+8rh@;D7{MkJL9NP6m( zb{hD$vIM#7K|hB_KsCy0I(7{u3zY_WFZEA}9tY78gC%)|ea)maY3VO^@~ih#?tce{((nzKS$QWp#DG#Kf1c zhl?%(Q$2HS7{*&Kjt}QiE|47oNeLpe&TVjHfPfAqYgHJ-Wr=}$0fu)btECI5W{l2c z8E56GRS0Nda@<$hTs_^Ih=)wd!zR5WsS&{@=cZ92>s#EB@B zO5Se?U=G|ctz^3b8ekYc#1$Z zl>#>YWMm=or0wCkvNm_RU`z`5sT&0b@k>6jppHe1U%SHux%?k-)*fg~Ack zuirGzCq=~k$Ce;(RR~AlriFHpZ+I2p zy4r1@P5;22duxf%aOVBO3WH)}I;M`!_P6eCIpgtxETh0++8vx#Wd2`bcGACV&kXn8 zM*dy-;w+bR^5Ace`7^buuc1DK?Qrbx;P#XqFAonS7!Lz)64pqnj9x&Szy3uO_Z$pF zC^EKfg2|dAtEMzVi+tGoG?3n+(Ll6ii^ssE6=0J!ZcSIo9mQ=<8cFLW=JzBE`{!53 zuMZbFdc$dc_iQfe1)v(?Q|=ya>@XY3HOxvQs=Zh(D4H=~b_`IDgpCsz)3^%8Bc3-& z$;`D#H`}x!yEK4+8ACiWWc+{~sXXv{hE=`Y~)oBLoC zH$&O^9_y?6WRL*UAQIr{sOANTEvB5;INsl?b|07yB#a|7PYeNX8~9u+x(y$?!#Mj#ST$T>9EKy)y5QkZq6kNJh6(S2EXP`aD-J@v=c_3|5=} z;OILn7no`bK!p_*y;uiFCSsyU6x&EI$o`jzvroh*z|T)m=a=3!LSBKz{x)WCJRtou z%(MI``SFPuHJ@>F0+`|#urTHZWcEf34GcK4M%^KK%mau^7$^$<2j4&>&Ja2Vy0F@o z79pEhs26FaqlBf~F<}E152LxY_4TXSf~4l<)&RLFvkbNVIPPE`&UD5emeaD!n?w-{N82VwaUar(7 zf&UDdK`%f>j0&;l$EDy&XTPZlLrOqNJ*XJ}s*Tm%{SZaG8m=HbZ~ha)b#cKG(g3|I zXr~mpr2*4>7GQgX4_>O5d~nxol14^QP>CV3eghzcLtw;OzuMG?&z}S4=6oszB!&GP zUM?9cIXVc*3uRVRR8)HmB-x58D)eH*Y?1`Rq@Ke17_7VJQyOIdx2rVSG+%!Fw?y;* zSczt%Krat(Y)x;PuKPNOJ)|?WPACiY*iDZqfZ^+cJPc4Ofe$US3q_Ht$@j29|9AQTX(+O8uFw35lqPL8quHelVkqq`SIK-eOOdv4e28ujQ!1A zV(x7=)MI!Em_c+x_$l~Qz!#Bl#`%+nF*#6$E<0IR=C3IJbSq^s39YvAHkGUteU}q#VWiANo)?D*hlgY|3<%S0b zU0t+6LGffu5c2Xr2r)y&7h4#2h%}oTZY$9}Nvhg=6*-oj|NmTuX-jL_8CP}Tf^7RV ztjs+TjG3%vyhhP$NB^Xrt3ZxUEbL+jbubvH&L9Z}8E@9lhIGW;2kox&NtT0Bo>Zg~ zU%Z(@#I2WZbyw&b8d9BooeokA_W?6AZ^9}@ne^!_uBOqSiJI?y z#7-~NYXm)6b!eo0H3aF6Ovehub7*)RuGnqa5mwq&`WO!vjMr3K&;Zy1R3As8G47yVL&tlh)z==Jk< z)X(Lm*N_EwRPeway0++02}2@_Z@a^WULXU*)>vEYefDCe6&p50q+^!*S8bONj)yaE|Xx2#&j@l<0E zK!8p)Bi?23R^cC__U+G`^ZyWMUa3KsQ1Lc7Us22GOin_V20U z@hfwOnuRG*k&zj1%+bKzl+sUo3xZ{B{>x<6HJwm`u6^9Vhpada=Dx=<_!NVD}3Gj1=@lvHzz}RFu{OK z;CqL2rg=bbZEYU6%+QTGkb=sF%RiU@zpcFVCeU0gOHVVsf!mjnJe?CY5CW?eYF>>& z%WN=4W~%Q6tz{~}rnYblPc9@R@u=B;AX}ieh{xuG@?=oRdbT=!WNmT*mY`IsG#|*V zkSm<(3ymNkS}rm~MFEl72PB0uM*C6%|3%-LxUVJj{z^Rr0vTq`5&#rnwtW=~liNaI0pYVcZYWQzE3RbLFdzUKG$+?|GK(dKPoVv6Ro=^iY zs!{Xu=65eH^rrCww=G^OvLBhkgK61)R%m(Ic!xCKrFWtM}vR$z|)%oaPR9)?~^<7zIO zSLCIPcpLd8K?fMf9^h;^7guqRZ@;6YUT#GIj^jAkJ-;zCJA)djw3nH~F-*s}A_1aT zQm`zEDuZXFO*E3jIq-poD>8b4b>g4x;hw7$#|Sv%&1CIuGG4o8x=II=@%C%4_zZ!B zyjH64KM@#%P7qK(+Dwn2AwiE@E+k%>gCDm9p7P;Fcj8la!({^mcaWWya%1`$XZj3vXlfm8tF@ukk$}`z-i=ICj1KTyc z!|p14?ZboKh&YQG*5z+Lf=Nt~7>|{Wtx}FA8gt=`5WfSRG>sY@D{c$dh|+0v7vG*Z z4FaoDr1Mib)S-uen(zu|LyAp~FaU_${~|p-$3Z!N-R)pbZhz$SNVr`j|FI1rObpy> zqMNPXGe8p$T5Dtgc)XS44Q>B}KzQ*srkXZTzv2UstK0MZ>pC^AB!UB~P}CzZ45;S; zW=Ze{pe6wPyu^RJn=xivemQ9YWdL}HYvZIq z%>Y?mZz>mu%Xd%^iGTq!S#$^cW#YA{&Mc8}7OBr5^JO{o`OL0kT1=eyc2*62gWckp zeU9k_F=wj0sH0szJX`lAlx_`}s3woi!1(YNLf45GYC=wNgzf>Z(g`RZV0?rL`~XVC zZwlfmkMWTT!=Z~p@V5KaU#x@AO_>DdCYxO{Xkc9-xRU1PH{}vFeNcr;c5F2>U_!>G z2&8IM*pZ?xjK;SFn>fj)ubh%;wvMh4=bWnB0;?}T2MkWY%_S1o(Q+ER8|hK2m0+I7 z!o7?2v)r1I6q+FTZYd!i1q(jI)3rr|{WAVFVk4`UM?%ITJwXg#BvtufBV4c4g(2?9E6J-GcQA*hY_m5`%2r zV5;l;KqEwX7e>fy!=|B;vDZ-lEA3_3K@PpUM`Z##_5HZ0ovpd9U@w3Ffpvx{!_IHd zPXy1)@+!@CXw}zyn+reB3F+%)r{sJqIGb;jZav)*Q~AQ@7B-^w$Tn?wndx8wJ~Zum zGz`V(hS)AZh~EVq9G5~%adsXfE zd)zP$jm4f6M8M#YksijF0(mS(p_=-ts)H;?QlDAVmG=D#NBcrQt8PbqC@+r`sQ#ZS zEyK<$TQ1NcQ&a7Qu!XzP+3i=`+ocl@^_BX;4-XMe7WbapKQ)UyI;`-Rr($7QP4_P{ z!ueZG>#zv(m02y{DKb65&VO~}yuHH1<8ycUU^ho7_`}tkXYsw34sO(49}JQbm=w77 zlK2T;J;sxIQGuwgX9~p1XVnEnrUgXJB9wz_fbw-S@;kokP0zlYz6OF<1@ZCMkGqn) zqb;oQ<)STak9Sy3mzDMO_09IaO=hO24I8DS=+>Cl?_%8o0vPZ7x=-Ty%T>V3l{E&gWIzXEe{3B1ij*mFg2_nl8!U zJC|V%a#r4nmWHOsMgvHiv-&gQIuI&Q<}lcGn}IsvlNnJG&qfoMOr%v<(AT_2LW~g& zT06EZ!)o~vh2$VFlsBJg?T+HiXSH1?r$~`_x+?%wNTxBOPnRpd`Z|C`LRLXR^Kq_z z2j5g-wF&O4`wY&nF>jq{tnBUm8fjj#{P@Z0*}?V^ofx`v;_m3%mdhf_TZg>yzz5b- zx0vgtADZ5?p8YdiNgsF+nX_k4y1@9auWdHppzGo7J6w4$hhDRXxs&hd>FJT?2no7s z+$cRXsdjuB)bauT?BOC#&mk`#A6Czzmez{IP=?CD!Fl7Dc3tj3GS1$`O^`PJ*^OXa zh#n>u|JY`w7dc&OK3iz4HueFD=3eJI^1>79jeAGKVlN`nNXV$>%xbqO<>SA6^9S?q zao2OEbiBMmIh94dpyI6eqI!VUbLdkh9R=CkL%kdC8f;S|KXTcw7qrwk*SdFkIO(^B zN8UG|FmH-ocwIcqrr&YZ7U|af8`uhL@Z|wwhjeA*g>*@+ddk)9gsSC z4NS6h#I#A6sQeTjg(PpgBZsA*cp{I3Lo8}9Slv1qrD#=EI_^FHXk%bHCYG^1%OO|# zt$oYjYj*HwNPeX8EiP{wd;8wo*DEz?F{fJTqwdQO8s*#9(+;P#omr+1b02N253u*P zPQN(s%y;DzmR_~zk))E+ro>BYNvzICPeoi~@ zH7T^O0#%AMhm^HM{9}Rrj^@#NOAbZVvl1D84daTHvC8~AQe~sd77%p2!S&mZapCA- z)i#1n;^WKZ${jv%nFPe&<+Aj#68k!xX*3YL^Uhq$D98^XOTf=a$9JsILDG z$mAlN4!i!0j0_c$5)u_F%1vs_`@%Qf#0=wmUx)}*eDQg0?X%tXpeW8^^{p}cRe~v< zCxEqOwcox}Je49IU<_%TtNp(kI?^C>D*4kF)=3A%WUU+Fl_?Y@a6Z%Q;yn! zYOpOago|RrPs;f=6{6U5D^Av1E}JaQm=3!|w4`Saqht=vO3SBw%^C6sew0~8Uc41> zu)@8wCk)ehmgKg|rz>QvgvmThrmv#;uj^|b|MdJ^O4h2gZPpn!i?1Yv&&^@A^z(}h z-(Jq~W{S3EiiAu@Cwv)fuYYcROnirFpCJ}JQ0RDI63ri*?B%5j_vnOGW=m=+m*#tQ z)nb!i7_ki%$-$a^#HsIMnc65R9urz#R`7G7Rh5oEy_|+?xd{wE% z=5D>E8+~?%f3Pfe*JRS=Zamnmb}$4{!CK*qVx?Vbx&n50t%uA!++7Ux^X`Izu6c9FVF+An`{TTb%=!mp?3p~~}u5neB4{mAZ-;svz zO3B7X3O+Zh#hm3wGL1Jr!)q0X>uPz!%b*r0IdkSUx+mG=S^FWVY||rHVl94TqV?c5 zF&AUnZDuf~XJP5l`wWtag;DDhV^;T=ylx`P=)~lho&@0*R^7&H@Fy!&+Od5xO2{uL z@P(0-`~%t>x3_xbH$sDhzi8KGhqb+upK849=ceuS;|IOnFK?pI4{L6Q)mqoZ%iE#o zx8(M;a5&_3C>mZ|bde z6Va^FtDNB7-Bo`SAKO+`f6mUKA4Ke|JRBNqZI#SYo3-uzaM)aT{Ay-T*KB6m)HpSw zrAG1)WT`ZWQ8&sHY=S_ka;g00p{<-mBN|K9TIk;uX zE+sK>;Ro$3X#~3j8gBN@2{#!!KBw5cygVES*!_{**VqTIVq`X4kk9LpdRb0KbW)!~ z1}u*kb2w~y=Bl^)-_q>)r(|z7Jg22}ERd7o-AWkNvz?dw1Yvk#APrFg?KHh~sL#vx zsB^#&$;QXuF4q`<(zr8SQENWCoZ=p<%~zl9Omn!A9+b54N^wx0hC^i0 z*Qd{C2eO7=t3TngSxbfAAC}4!vpaQq<}$#UE5m=3cf4J!e~q%bWBJcR>yuda7AJ+m&LCiW`5^aOUWo<01T@kq<*PB1Y_{pYW0AwRS! zXkf==Hq2;ws3LnAxDT8AkK~<@SK-ECZpp@a3VZL;hCzO~CE2|!bL@<-9`5cTV}pWt z?jE5|)`Iy8Y50ll(K$+^WkJpD?fuYN9ok`D#Ku;7{TfSHq`$wxm&kIilX-c3)h5RF zS3PrM{#|aXrLNyU@_E{uTJ46Ht)P_T|JMf_5`EpiHcrJNg7HJx!L*0b} z?=^d*(-GTq(C(Po2Mr9u`;i12FYLk59CM=%fmYQ7%4yQ*ovr>a)*y`}=p%1WGDDefpJ}8f|!dc>7$L zXyNNY1sNV@`S^In+hQrwM+wjkg$Wp9d@D0B#Xu2~GzpATx#Tcy+weEkl?8dr`2vo8m^q8O-{uCX(yyAK20s)SHl zHT6xaJ@ATQefwK>>%X!0ol#MB+m#-&5~Ps`4tZgu|s1|0Mx`&^{rN5oLbm-Utos{Oj%pMPtj{_UF=Zb3&aeEA$Z zTT6`m!|=$_CFF0^fBy)w3je(>$SV9_Z3dsJ98%Qh&wvvu#{CWuLlx*7C{W~>v?ee zGBMNl86567Xi=R;aV8FvED2clDM8a=z$V&>2@A^{)P)+8MrS)un}`Jb=pP zM|Np^-(Y*_oQE|gQ4)-dnoxr&wXXc?{UXd+rn#l12U3t?!*A#IcPtAA?vp4r05r|Y zR3U_qEZ$siX=>_(l3!Lpz{5DPxgme&gQTl;Jg6;&au7ak)_5REvkA4 z4Lvoi3mqk;mLC&awSHAamhHq&XbNIk13ZLvdZ8U1sY8#592L5ljbN#*x-Ea16cY9 zZe4Kq(c{OF%-CYI@+*u_R5fecQx7#FUgCq>|LiD%Me!hsCBfqn&XdZZA(dTkYTxCt zW9()vJG(B5;i9G%bRTxYvZRBOpny9lQ$0sB7w$@?cCnJ@*0`C8UaS!{Z%PfMaMxsZ z+P$mS`k!i-2l-O-8v76t6En%w>_;ZOVTi}uIr9M`gm&g`fYq{@V)u1eDD_-Nm`P60 zXG7{fA8jd8R`o=mc5_s8^u%akK|zt-R1{bRDGYRu@>x&x$V*InX{z)jqD{pL!Rll1-AQfN=o{qyqi9&hwrr*aFp z-)9P14dz|4q1EZDU&>t3ZG;i>)cMYYgX;eF3(3#I8?AT+1s?!SW4Dc)!U&5zANvfS zBG1Ps3Fn)yBcv=e!vE9da0ibmdNv@{uxmeauGrf<=?v}7lz~EqZ~)p+FX%~=CtbiL zXs$G)SnW^K++(}`rGSwQl)5m>Dl$Gy+-F zFbRCS_%Au4$z!vUhaR%P4s|S);<7~-%M_z{%&06CpyI^u7D+3-5+=8__&2DlD(R#s^~v(aSRiL{u5 zO9*}sawC8y+AxjKRh`pKT6G^GK=Q|RwF*U!P&tE?SXiLy4I@@XC zxn9|av?q;T>PElDIpPzZl;6)*h#PGF`LpK*F^PN=M*f~}J2LtM3|Wob8z8@`8ZiT$0{_rW-gqykD`$r1+B(vka*dOVeQ&0_un zc-a`VpoVrT1I*$8sC|N{J>qRZPHu^n4m)Q~MQB*N1!0s}RzZPn!(-3Z{kpx@cHU_& ztw`6xD0kbEnF7<)32kog5nN8u=n)%u5)KC~<<@7DH!-G#nN~xQ(Kl@a4z}AjWyNrC z*DQgpqPhM#YQE>)^KDS=>FjPWSqv1A6?^SR65;41JV1pO%`PKi&#d*sFK~572c{Zz ze7qqfXXj8H&pY*4rYl9J6yGK)C1b~UD@J79#=3?9xKs!)5Ij8rPC8B;3JW89@dJ2X zMtNYUv7AGQ8)8q`Nv2vB=|M9VPV$&ng2WeGry_ zl5V77wjv4-lQH|U)GPt=HPRD~R<3o?Lc%5;I^E_e1Ma2WRhvN?KnFlVnSm)n@{a6$ z?%qhQdQvBPkLLx@VR*I4k$Tu^h>Lq*mgS*K?X1GyR1^a%f6tAg@gnnJns#z^0Q`r$ zHNF=89i5cku*wy?i`3TMLhM;Vk=%NQJ)q%Rh`uq=#G%as?sQ&ymvk;qp~( z9KQdCwlhxr!HpXWFtq^qxQ#{e&q6p4MV->cHO;(G)@Lzmy-t%D5yFW3E%!|c=li(U ze6RiN04y-7vyR#`lL4n`bk)XIPo95Z*-X(`0>kAEfe~ynYg*ju8$2jh%MEgmz9(227-j*e0N`}Jm%+5 zupdSjJs+1`?^cwgDp1|CcW0d|u$#`_Fz!yHJayv4bFB@vY`>?N$cTnr2CthL%M*v# zh0Rvo#rl!>xQGqcXa^H~%9F+ow}s+#CYhPG{k+?+8eC!zMG2KTeYr7mp^z4KOdRV( z_6%qX8G#Nd)Z;UgF!wO^-Ov59?!`1CeoHI+x!x>HC&(x(%Wc>lvSG*s$|Le=d}n7a zYzH|SzUgVA+c}JCS*kMdt@Yo9-dKYJ<)wjicp}-jxb&RRdXR_BkD#-$I6TlZzn#$V z2jZ#q9?m-7cn?=jZg+uRUqvobEdNomUwJG_Hpo^Je0K9@5)RSU=!FaEu4;Co`JsJ7 z<(0=I?GK0UXC^bs$BF2ZQc0vjlE~e$C8rD#i63TySFQK?zYoY+aH4OkQOVcWtJ>f2 z02;NdwkeXa80ZI}_%kXT@xQ-5TvW}XPbfFR#ya%iC0MCnY5h zxp0OdDLXZWJ&I@OJi5v*aUm)FN%;V#>gJHWSE_3~v);A{6hZP~QZ=N*lyGZCDje-Z z5BC<#YP`h7Bbh`h0w0a;T^rMU?9K74%Am=WOsS83n9fB8tnWgMj0UqzTWL-KmT38; zvKCd-Qkmr1n@5*t7Vp|~Q%2l89nEb;?R_XeRsFtgWZ*`Pk`#w40TvGs!-3>*2!6sSg!jEHerhk$hb9Q zga}Hq&00V=W$KhFKq&oWJJlbxu3zopo2BkJEK@xZ6w+W{01h!i1%>)$AJlVpWV#Fv zc>Bt}a|yrngIPUub?;QN)VWmSMDAw;kUnLuLtdquS{V?-1ue8 z+T&H8Kc|dZUz?F6!$PKPuKTmU&@2Itw=_5*5vl>|$C)x=ep#xSp^H_{m7$>utlW8q zHXpi-8k~$%Mc(+SI|{SyEC>;tiC}HRK~y$2#vV$$(9#r^9@q}VP!1T#vjM(G%s?UM z?#BGiUwETsuj*-&ayK> zU%h5&zBv3wz-^7f#MIP{^YATs(5O5plDiQE-|`6;Fn-hi)gYt~(R^l+)@Z9NFxF8r zq(3MV|5%>mF%n<7J?&mF@T_7!OQd4C;Yh<_oV&!qj-}lT!nRR4m7}{;I)8h&Y=y$F ziB0pd+R@Mym?l=fAPl-+8@0?(=kXZ?5pwyDSZidf2RWsGnS6CnQA1fWx<6M*!kTr8 zx;8;%-TwlQmlT=g?^*4B7nlj&_gM_*(emu%}Y z5jfMErN)QEx6;uaN$wXpjGi#!+SagaIy#8n+Xg`LgXDt|=jHllRj(hX_x17`yq3P1 zxsCf`_0n9or%I8sT?IZ*(mgJUdfjQ!Vx-L0^T})wcx^s~vD@!;dCYFyu!092qAP?a zSw->U+SHg{G~qx8tA~|>3C2DzU%o`}=sw}_;66grVOyyinCsctY9M+Pbm-IP49d`S;8x%G@x;TW{QoJ`gA!_^DI$Gz(^CQSbg3vf;s6=I${BKSpQ9(EgQjZzA`D=%P=J(1# zw1DkkDM9LQ!tCH`oD0>P8o*#BBlS~Ou*rs)8w1J*POzRkPiFb6j#^d@{nX>&8%aW@ zVuH2X&Rh*UY)?3CQ*~_UvLK^7bmclkmWh<=pnJ+2;nGynM>9nUdtr=oS=sZmdFTUO zLlLMZL**{DGrn@U0Ub&^^39%j3+ld=^okzk!=yv;RcwK){Cs^)2$@XeqUemaZx^tG zT=5>nBrH@{^bWjR1?VVfwADhN=sL`hW-V^v52mfEc84JDQBdZQdggf_x<`~eYeE-@ zd+jCkWIWn8YG+|ii(B3aQ#`014&#{2O0gd@~yh83VP(-x?cPn00^ zOtXEqIUG210}pbINjtySN71ykl6%inqcYWI^-lBQts*~sFpSD>mW%S5b=*mnljJ|s z0IWde8J%MH%}ss90DJUjx$1ngM_}XIJNwe0yg+Xg^fCbR^E;Dmc+<2BCJpY(GOMV= z)^@M7e_T2Q=t!Vp7r6Pl36Hke?N;eEmZk|A4Rh8eC*xib9be?RC>^OEN1lrjW_!Dp z2csGKRncNvaGXKSI0twQJk;&nIjRp<6L_k;7KicN?Cf1-9cC|2!|@8)UUF=SSjLx zqB))XsZH#DYry)Mt(a4EwTEln?QXjZQw_TiaNQp6OvykwrK^jZoogWpYb(#kyRvw} zRaSQ;;V?%{A?VtRF!Z7pfS=ruElW^3)YC{6tE5*NUp6Fgxw8 zR=Db+ROi={gQe}Oy({$M6&D?a-8Xb!NGY#~KEG_!|7n>1gh?XfP>34-8RfyC*T)ej zsyC&O=Q+nX9ORN;v+ntW?w&k=qYgaLGC>?t)ZsX}IACFhc3S9#F0O!0cn*2>ck%yf zHOm#8eoJ2m+a$YUjG5<-L)c_l7+6<(<%+x0mfssJwoHYZL4!kEdkqUqI)%uo7d4AE zra8{FIMttKV{u5*(hEhxC%?yQ_DpgRZs9zO0;RitoTx!AfSoMYRp$4gBY-^zeA-W4 z>T}Ae9RvbA{IGqpO)#ceDlB&Zbl6f04Q$U(0ypwrtpt4iX!2n`fJ)9Q*~hZlHii5a z;ZctS*yiqqRNF6&kx#6vY4k4hnka-|#$&0gIl-SypY#G}Cttf*k`F58M&&S}X4f0* zDkCc+j9&&x!AhT_rlup8?p8R~RTx*_T(znsnCBr{U=$ZepwJ)KlxLSF-?H2t$CRM2 zk8a#<8n#-2Qm4k|q8WfNe+E@M-(e>?Gq>o$6C z>GT&b&I(wTF<$$Y#Hd%Pxip|}u#DaKL1k5{)iTVi7%!GP*UixTgG`aHqR;OQ7EWdH zUZ|6dIOFt09A-a42|fck<~wZB{>|ka?$!m|P2T@=$s~C;b*n`b`RwChVE8SBlFP`D z2C9}0?e)rN? z@QJZ07YWmWf?xsHm4#5+c9PSVoT?;tpUEfUta>u4^}Sq!Y?*FcyLK0V(O$rLsByNw`_JFTMt<= z7nU|5bmy-+l3u{er|E|k0W}4p9R*`rFUI4iV@NEKx@)fnEA z;N}$f_M%wpZ^v^ChgC3A5z-oX{4_jw<}B6;go^}mFnG1Zik$n65Vh5Z2R=w&s6rwoSTxu_OMBBVn=ZTnrT25BJhtp1has z@+EcE5P$XRRnjYTvAqjAVQGc_Bm2TL9gFkc5def8HwXqZK6^8>eh0l*$%!h zkoD2FhZ-SNR<_xF8fcn~tDfnus|^i!mGm~3_>Pyzd5m79c~Xh{`Xrc9N`2=OAHlY~ zTkBl;k6z0Atd8t4Tt!~km^EFz~iZRnLY6}1X2e5#lJpc^mJFgM8H{(R*oI+Z(TnBMJ z1@}+{V_?MqM)FPU!wLj&n=kTP_Vu55$*n8h4YM4?6k=i`idaEn!ZFco44gmz(~jZ> zz09&QuF>lGP8jJGV0#<1STtJF;>%9yJsRuWnYlX77aeo-L@TA+gQxTZBU1=9o4RBi zpfAW;)*aYbSgtrcXbhOV4r0`vBJ=YPx8ni=D$Sxv(RXL}Vs&I-uF2gf9?^@|hX` zRsKS(jP@Y-Wo{-jX5N04?SSDDx~SK?8f2A70C%4tt)vblm@W%bqOBzR) zwmG$n9=>}Q)Dj7Cf~o0&mzLH*10KP0erz?sWob?Frljiilvo9g-+;gnn7F{p$74Pv zOPF}(7Gvh&G1?(;P3p}0ABm!v*R;Re41Ez}lPS8Obp`0d!4fW;k73|L;2P%z%0!Ef z+K^A;F!%C(RIVhA_zrV@gVTpeX~q)6ZCa4(k5s&(h{rXQ;jDzu8c)Rv?su^=g^UB2upicnb1Lme1 z(Y|P@*?$%>u3>m;EUzGMsX=x!`k1bP2OkLfN2AA9;M~+kg zPd2RJOsG1~5A;UVp)lFucpH^Lj*!04)8`S4=9`OEJ5x~x;vUJ*6TB)0T}G;Gq6{}QTG;;m&>V=AGk~S!ANAgz^5dWp z>0l6erl|Hj{jr>kGi{F_cj7c|`pO0F^&_BF5=OLdJ$B*D9DS~Eo(0aZ{P>=QAAgfx z5oZmj9Mn#$8RwuTnXA1XF*FCfcG6ro3(Y`j>*OD(|5I@)=7V+3(LAW0#xdXLH5wA_X zN?5`3BespXp(#M(vH?X{eXw&0WOm8`1Y!7cbrit&{;w0TZEQolf8fN|l=QLNPa1

18V^NI{Rh19%@GT- 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

K3H(dM8g(q7UKXxU<|dosWVW$#IQW&^@W1 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 diff --git a/src/components/chat/message-navigation-layout.regression.test.ts b/src/components/chat/message-navigation-layout.regression.test.ts deleted file mode 100644 index bd4b1656..00000000 --- a/src/components/chat/message-navigation-layout.regression.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { test } from "node:test" -import assert from "node:assert/strict" -import { readFileSync } from "node:fs" -import { runInNewContext } from "node:vm" - -// Follow the existing source-level RN regression pattern: node:test cannot -// render native layouts. This guard fails on the original overlapping layout; -// changed-head device/keyboard acceptance is still required. -const source = readFileSync(new URL("../../../app/session/[id].tsx", import.meta.url), "utf8") - -test("message content reserves a gutter for the floating navigation controls", () => { - assert.match(source, /contentContainerStyle=\{s\.messageList\}/) - assert.match(source, //) - const content = source.match(/messageList:\s*\{([^}]+)\}/)?.[1] ?? "" - const controls = source.match(/scrollControls:\s*\{([^}]+)\}/)?.[1] ?? "" - const button = source.match(/scrollBtn:\s*\{([^}]+)\}/)?.[1] ?? "" - const inset = Number(controls.match(/right:\s*(\d+)/)?.[1]) - const width = Number(button.match(/width:\s*(\d+)/)?.[1]) - const height = Number(button.match(/height:\s*(\d+)/)?.[1]) - - assert.ok(width >= 44 && height >= 44, "keep practical navigation hit targets") - for (const os of ["android", "ios"]) { - const style = runInNewContext(`({${content}})`, { Platform: { OS: os } }) - // RN 0.81's Android inverted list uses scale:-1 (both axes), while iOS - // uses scaleY:-1. Content padding is transformed; the overlay is not. - const padding = os === "android" ? style.paddingLeft ?? style.padding : style.paddingRight ?? style.padding - assert.ok(padding >= inset + width + 16, `${os}: physical-right text must clear the control rail and gap`) - } -}) diff --git a/src/lib/message-navigation.test.ts b/src/lib/message-navigation.test.ts deleted file mode 100644 index 88499e18..00000000 --- a/src/lib/message-navigation.test.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { test } from "node:test" -import assert from "node:assert/strict" -import { MessageNavigation } from "./message-navigation.ts" - -function list() { - const nav = new MessageNavigation() - nav.sync(["new", "long", "old"]) - nav.height = 200 - nav.frames.set("new", { y: 0, height: 100 }) - nav.frames.set("long", { y: 100, height: 1000 }) - nav.frames.set("old", { y: 1100, height: 100 }) - return nav -} - -test("viewport top anchors a partially visible long message, not the newest visible row", () => { - const nav = list() - assert.equal(nav.current(), 1) - assert.equal(nav.move(1), 2) - assert.equal(nav.destination(), 1000) -}) - -test("exact message starts belong to that message, not its older neighbor", () => { - const nav = list() - nav.offset = 900 - assert.equal(nav.current(), 1) - assert.equal(nav.move(-1), 0) - assert.equal(nav.destination(), 0) -}) - -test("repeated taps advance before the native scroll callback arrives", () => { - const nav = list() - nav.offset = 1000 - assert.equal(nav.move(-1), 1) - assert.equal(nav.destination(), 900) - assert.equal(nav.move(-1), 0) - assert.equal(nav.move(-1), undefined) - assert.equal(nav.target, "new") -}) - -test("empty, unmeasured and oldest bounds are no-ops", () => { - const nav = new MessageNavigation() - assert.equal(nav.move(1), undefined) - nav.sync(["only"]) - assert.equal(nav.move(-1), undefined) - const measured = list() - measured.offset = 1000 - assert.equal(measured.move(1), undefined) -}) - -test("virtualized offscreen target resolves only after its actual layout arrives", () => { - const nav = list() - nav.frames.delete("old") - assert.equal(nav.move(1), 2) - assert.equal(nav.destination(), undefined) - nav.frames.set("old", { y: 1100, height: 500 }) - assert.equal(nav.destination(), 1400) -}) - -test("streaming growth and appends preserve pending target ID rather than stale index", () => { - const nav = list() - nav.move(1) - nav.sync(["appended", "new", "long", "old"]) - nav.frames.set("old", { y: 1500, height: 100 }) - assert.equal(nav.current(), 3) - assert.equal(nav.destination(), 1400) - assert.equal(nav.move(-1), 2) - assert.equal(nav.target, "long") -}) - -test("manual scroll discards tap anchor and derives the next target from viewport", () => { - const nav = list() - nav.move(1) - nav.manual() - nav.offset = 400 - assert.equal(nav.current(), 1) - assert.equal(nav.move(-1), 0) -}) - -test("revert/removal discards missing targets and layouts", () => { - const nav = list() - nav.move(1) - nav.sync(["new", "long"]) - assert.equal(nav.target, undefined) - assert.equal(nav.frames.has("old"), false) - assert.equal(nav.current(), 1) -}) - -test("layout-only zero-height rows cannot become viewport anchors", () => { - const nav = list() - nav.frames.set("long", { y: 100, height: 0 }) - assert.equal(nav.current(), 0) -}) - -test("viewport resizing changes the inverted top coordinate", () => { - const nav = list() - nav.height = 100 - assert.equal(nav.current(), 0) - nav.height = 200 - assert.equal(nav.current(), 1) -}) - -test("completed newest navigation does not top-pin subsequent streaming growth", () => { - const nav = list() - nav.move(-1) - nav.complete(nav.destination()!) - nav.frames.set("new", { y: 0, height: 500 }) - assert.equal(nav.destination(), undefined) - assert.equal(nav.target, undefined) - assert.equal(nav.current(), 0) -}) - -test("completed tap anchor is invalidated by keyboard resize and viewport scroll", () => { - const nav = list() - nav.move(1) - nav.complete(nav.destination()!) - nav.observe(1000, 200) - assert.equal(nav.current(), 2) - nav.observe(1000, 100) - assert.equal(nav.current(), 1) - assert.equal(nav.move(-1), 0) - nav.complete(0) - nav.observe(400, 200) - assert.equal(nav.current(), 1) -}) - -test("completed clamped short-message taps advance until a viewport change", () => { - const nav = list() - nav.move(-1) - nav.complete(0) - nav.observe(0, 200) - assert.equal(nav.current(), 0) - assert.equal(nav.move(-1), undefined) - nav.manual() - assert.equal(nav.current(), 1) -}) - -test("accepted virtualized estimates keep seeking, then settle to actual measured top", () => { - const nav = list() - nav.frames.delete("old") - const calls: unknown[] = [] - const driver = { - scrollToIndex(params: unknown) { calls.push(params) }, - scrollToOffset(params: { offset: number; animated: boolean }) { - calls.push(params) - nav.observe(params.offset, nav.height) - }, - } - nav.move(1) - assert.equal(nav.seek(driver, 0), true) - assert.deepEqual(calls[0], { index: 2, viewPosition: 1, animated: false }) - assert.equal(nav.seek(driver, 1), true) - assert.deepEqual(calls[1], { offset: 160, animated: false }) - nav.frames.set("old", { y: 1100, height: 500 }) - assert.equal(nav.seek(driver, 2), false) - assert.deepEqual(calls[2], { offset: 1400, animated: false }) - assert.equal(nav.target, undefined) - assert.equal(nav.current(), 2) -}) - -test("manual cancellation and retry exhaustion stop all seek side effects", () => { - const nav = list() - nav.frames.delete("old") - const driver = { - scrollToIndex() { assert.fail("cancelled seek must not scroll") }, - scrollToOffset() { assert.fail("cancelled seek must not scroll") }, - } - nav.move(1) - assert.equal(nav.seek(driver, 20), false) - assert.equal(nav.target, undefined) - nav.move(1) - nav.manual() - assert.equal(nav.seek(driver, 1), false) -}) - -test("delayed native offsets cannot discard the latest rapid-tap boundary", () => { - const nav = new MessageNavigation() - nav.sync(["reply3", "reply2", "reply1", "user3", "user2", "user1"]) - nav.observe(0, 200) - nav.ids.forEach((id, index) => nav.frames.set(id, { y: index * 600, height: 600 })) - const driver = { scrollToOffset() {}, scrollToIndex() {} } - assert.equal(nav.move(1), 1) - nav.seek(driver, 0) - assert.equal(nav.move(1), 2) - nav.seek(driver, 0) - // The callback for tap 1 arrives after tap 2 has issued its native scroll. - nav.observe(1000, 200) - assert.equal(nav.move(1), 3) - assert.equal(nav.target, "user3") -}) - -test("Latest resets the logical viewport before its native callback arrives", () => { - const nav = list() - nav.frames.set("new", { y: 0, height: 600 }) - nav.frames.set("long", { y: 600, height: 1000 }) - nav.frames.set("old", { y: 1600, height: 100 }) - nav.observe(1500, 200) - nav.manual(0) - nav.observe(1500, 200) // an older scroll event still queued during Latest - assert.equal(nav.offset, 0) - assert.equal(nav.move(1), 1) - assert.equal(nav.target, "long") -}) - -test("acknowledged navigation resumes scroll reanchoring and manual cancellation", () => { - const nav = list() - nav.move(1) - nav.complete(1000) - nav.observe(1000, 200) - nav.observe(400, 200) - assert.equal(nav.current(), 1) - nav.move(-1) - nav.complete(0) - nav.manual() - nav.observe(400, 200) - assert.equal(nav.current(), 1) - assert.equal(nav.expected, undefined) -}) diff --git a/src/lib/message-navigation.ts b/src/lib/message-navigation.ts deleted file mode 100644 index 02e87645..00000000 --- a/src/lib/message-navigation.ts +++ /dev/null @@ -1,112 +0,0 @@ -// Inverted lists measure from the newest end; a cell's logical end is its -// visual top. Keep targets by ID because streaming can change list indices. -export class MessageNavigation { - ids: string[] = [] - frames = new Map() - offset = 0 - height = 0 - expected: number | undefined - target: string | undefined - anchor: { id: string; offset: number; height: number } | undefined - - sync(ids: string[]) { - this.ids = ids - if (this.target && !ids.includes(this.target)) this.target = undefined - if (this.anchor && !ids.includes(this.anchor.id)) this.anchor = undefined - for (const id of this.frames.keys()) { - if (!ids.includes(id)) this.frames.delete(id) - } - } - - current() { - if (this.target) return this.ids.indexOf(this.target) - if (this.anchor) return this.ids.indexOf(this.anchor.id) - return this.visible() - } - - visible() { - const top = this.offset + this.height - // Include exact starts, but not the end of the older adjacent cell. - const visible = this.ids.findIndex((id) => { - const frame = this.frames.get(id) - return frame && frame.height > 0 && frame.y < top && frame.y + frame.height >= top - 1 - }) - if (visible >= 0) return visible - const nearest = this.ids.map((id, index) => ({ index, frame: this.frames.get(id) })) - .filter((item) => item.frame && item.frame.height > 0 && item.frame.y < top) - .sort((a, b) => b.frame!.y - a.frame!.y)[0] - return nearest?.index ?? -1 - } - - move(direction: 1 | -1) { - const current = this.current() - if (current < 0) return undefined - const index = current + direction - if (index < 0 || index >= this.ids.length) return undefined - this.target = this.ids[index] - return index - } - - destination() { - if (!this.target) return undefined - const frame = this.frames.get(this.target) - if (!frame || frame.height <= 0 || this.height <= 0) return undefined - return Math.max(0, frame.y + frame.height - this.height) - } - - manual(offset?: number) { - this.target = undefined - this.anchor = undefined - this.expected = offset - if (offset !== undefined) this.offset = offset - } - - observe(offset: number, height: number) { - if (this.height !== height) this.expected = undefined - // Earlier programmatic scroll callbacks can arrive after a newer tap. - // Keep its boundary until native scrolling acknowledges the latest command. - if (this.expected !== undefined && Math.abs(this.expected - offset) > 1) return - this.expected = undefined - this.offset = offset - this.height = height - if (this.anchor && (Math.abs(this.anchor.offset - offset) > 1 || this.anchor.height !== height)) { - this.anchor = undefined - } - } - - complete(offset: number) { - if (this.target) this.anchor = { id: this.target, offset, height: this.height } - this.expected = offset - this.offset = offset - this.target = undefined - } - - seek(list: { - scrollToOffset(params: { offset: number; animated: boolean }): void - scrollToIndex(params: { index: number; viewPosition: number; animated: boolean }): void - }, attempt: number) { - if (!this.target) return false - const index = this.ids.indexOf(this.target) - if (index < 0) return false - const offset = this.destination() - if (offset !== undefined) { - list.scrollToOffset({ offset, animated: false }) - this.complete(offset) - return false - } - if (attempt >= 20) { - this.manual() - return false - } - if (attempt === 0) { - list.scrollToIndex({ index, viewPosition: 1, animated: false }) - return true - } - // RN may accept estimated metrics without mounting the target. Advance - // the render window until a real target frame arrives, even without failure. - const visible = this.visible() - const direction = visible < 0 || index > visible ? 1 : -1 - list.scrollToOffset({ offset: Math.max(0, this.offset + direction * this.height * 0.8), animated: false }) - return true - } -} From d7ce300221d5934555a8810d9055d733f97a8710 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 15:07:29 +0000 Subject: [PATCH 20/20] Changes: prev/next file arrows in the diff header Steps through the file list in the Changes tab's order; shows n/total. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01CMhKDuSQR5gY2R74cqrY1W --- app/changes/file.tsx | 48 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/app/changes/file.tsx b/app/changes/file.tsx index 3d62fe11..444768f5 100644 --- a/app/changes/file.tsx +++ b/app/changes/file.tsx @@ -1,24 +1,57 @@ import { useMemo } from "react" -import { View, Text, FlatList, StyleSheet, useColorScheme } from "react-native" -import { Stack, useLocalSearchParams } from "expo-router" +import { View, Text, FlatList, StyleSheet, TouchableOpacity, useColorScheme } from "react-native" +import { Stack, router, useLocalSearchParams } from "expo-router" +import { Ionicons } from "@expo/vector-icons" import { useTranslation } from "react-i18next" import { useChanges } from "../../src/stores/changes" -import { parsePatch, splitPath } from "../../src/lib/changes" +import { parsePatch, sortDiffs, splitPath } from "../../src/lib/changes" import { DiffRow } from "../../src/components/chat" // Fullscreen diff of one file from the Changes view. Long lines wrap; the -// patch comes from the Changes store entry (`key`) the file list was showing. +// patch comes from the Changes store entry (`key`) the file list was showing; +// the header arrows step through that list in the same order. export default function ChangeFileScreen() { const { key, file } = useLocalSearchParams<{ key: string; file: string }>() const isDark = useColorScheme() === "dark" const { t } = useTranslation() - const diff = useChanges((s) => s.entries[key]?.diffs?.find((item) => item.file === file)) + const diffs = useChanges((s) => s.entries[key]?.diffs) + const files = useMemo(() => sortDiffs(diffs ?? []), [diffs]) + const index = files.findIndex((item) => item.file === file) + const diff = index === -1 ? undefined : files[index] + const go = (step: number) => { + const next = files[index + step] + if (next) router.setParams({ file: next.file }) + } + const color = (enabled: boolean) => (enabled ? (isDark ? "#ffffff" : "#0a0a0a") : isDark ? "#444444" : "#cccccc") const lines = useMemo(() => parsePatch(diff?.patch), [diff?.patch]) const { dir, name } = splitPath(file ?? "") return ( - + + files.length > 1 ? ( + + go(-1)} disabled={index <= 0} hitSlop={8} testID="change-file-prev"> + 0)} /> + + + {index + 1}/{files.length} + + go(1)} + disabled={index === -1 || index >= files.length - 1} + hitSlop={8} + testID="change-file-next" + > + + + + ) : undefined, + }} + /> {dir} @@ -33,6 +66,7 @@ export default function ChangeFileScreen() { )} String(index)} renderItem={({ item }) => } @@ -61,6 +95,8 @@ const s = StyleSheet.create({ }, headerDark: { backgroundColor: "#0a0a0a", borderBottomColor: "#262626" }, path: { flex: 1, fontSize: 12, color: "#666666" }, + nav: { flexDirection: "row", alignItems: "center", gap: 12 }, + count: { fontSize: 13, color: "#666666", minWidth: 32, textAlign: "center" }, metaDark: { color: "#888888" }, status: { fontSize: 12, color: "#666666" }, add: { fontSize: 12, fontWeight: "700", color: "#16a34a" },

3UXdk6p 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