diff --git a/.github/workflows/sample-application.yml b/.github/workflows/sample-application.yml index 3ec82a6e31..7745cef597 100644 --- a/.github/workflows/sample-application.yml +++ b/.github/workflows/sample-application.yml @@ -14,6 +14,12 @@ concurrency: env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} RN_SENTRY_POD_NAME: RNSentry + IOS_APP_ARCHIVE_PATH: sentry-react-native-sample.app.zip + ANDROID_APP_ARCHIVE_PATH: sentry-react-native-sample.apk.zip + REACT_NATIVE_SAMPLE_PATH: samples/react-native + IOS_DEVICE: 'iPhone 16' + IOS_VERSION: '18.1' + ANDROID_API_LEVEL: '30' jobs: diff_check: @@ -66,7 +72,7 @@ jobs: - uses: ruby/setup-ruby@v1 if: ${{ matrix.platform == 'ios' || matrix.platform == 'macos' }} with: - working-directory: ${{ matrix.platform == 'ios' && ' samples/react-native' || ' samples/react-native-macos' }} + working-directory: ${{ matrix.platform == 'ios' && env.REACT_NATIVE_SAMPLE_PATH || ' samples/react-native-macos' }} ruby-version: '3.3.0' # based on what is used in the sample bundler-cache: true # runs 'bundle install' and caches installed gems automatically cache-version: 1 # cache the installed gems @@ -106,8 +112,10 @@ jobs: - name: Build Android App if: ${{ matrix.platform == 'android' }} - working-directory: samples/react-native/android + working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android run: | + ../scripts/set-aos-dsn.mjs + if [[ ${{ matrix.rn-architecture }} == 'new' ]]; then perl -i -pe's/newArchEnabled=false/newArchEnabled=true/g' gradle.properties echo 'New Architecture enabled' @@ -119,12 +127,17 @@ jobs: fi [[ "${{ matrix.build-type }}" == "production" ]] && CONFIG='Release' || CONFIG='Debug' echo "Building $CONFIG" - ./gradlew ":app:assemble$CONFIG" -PreactNativeArchitectures=x86 + [[ "${{ matrix.build-type }}" == "production" ]] && TEST_TYPE='release' || TEST_TYPE='debug' + echo "Building $TEST_TYPE" + + ./gradlew ":app:assemble$CONFIG" app:assembleAndroidTest -DtestBuildType=$TEST_TYPE -PreactNativeArchitectures=x86 - name: Build iOS App if: ${{ matrix.platform == 'ios' }} - working-directory: samples/react-native/ios + working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/ios run: | + ../scripts/set-ios-dsn.mjs + [[ "${{ matrix.build-type }}" == "production" ]] && CONFIG='Release' || CONFIG='Debug' echo "Building $CONFIG" mkdir -p "DerivedData" @@ -160,9 +173,150 @@ jobs: | tee xcodebuild.log \ | xcbeautify --quieter --is-ci --disable-colored-output + - name: Archive iOS App + if: ${{ matrix.platform == 'ios' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }} + run: | + cd ${{ env.REACT_NATIVE_SAMPLE_PATH }}/ios/DerivedData/Build/Products/Release-iphonesimulator + zip -r \ + ${{ github.workspace }}/${{ env.IOS_APP_ARCHIVE_PATH }} \ + sentryreactnativesample.app + + - name: Archive Android App + if: ${{ matrix.platform == 'android' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' }} + run: | + mv ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android/app/build/outputs/apk/release/app-release.apk app.apk + mv ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk app-androidTest.apk + zip -j \ + ${{ env.ANDROID_APP_ARCHIVE_PATH }} \ + app.apk \ + app-androidTest.apk + + - name: Upload iOS APP + if: ${{ matrix.platform == 'ios' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }} + uses: actions/upload-artifact@v4 + with: + name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-${{ matrix.platform }} + path: ${{ env.IOS_APP_ARCHIVE_PATH }} + retention-days: 1 + + - name: Upload Android APK + if: ${{ matrix.platform == 'android' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' }} + uses: actions/upload-artifact@v4 + with: + name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.platform }} + path: ${{ env.ANDROID_APP_ARCHIVE_PATH }} + retention-days: 1 + - name: Upload logs if: ${{ always() }} uses: actions/upload-artifact@v4 with: name: build-sample-${{ matrix.rn-architecture }}-${{ matrix.platform }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-logs - path: samples/react-native/${{ matrix.platform }}/*.log + path: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/${{ matrix.platform }}/*.log + + test: + name: Test ${{ matrix.platform }} ${{ matrix.build-type }} + runs-on: ${{ matrix.runs-on }} + needs: [diff_check, build] + if: ${{ needs.diff_check.outputs.skip_ci != 'true' }} + strategy: + # we want that the matrix keeps running, default is to cancel them if it fails. + fail-fast: false + matrix: + include: + - platform: ios + runs-on: macos-15 + rn-architecture: 'new' + ios-use-frameworks: 'no-frameworks' + build-type: 'production' + + - platform: android + runs-on: ubuntu-latest + rn-architecture: 'new' + build-type: 'production' + + steps: + - uses: actions/checkout@v4 + + - name: Download iOS App Archive + if: ${{ matrix.platform == 'ios' }} + uses: actions/download-artifact@v4 + with: + name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-${{ matrix.platform }} + path: ${{ env.REACT_NATIVE_SAMPLE_PATH }} + + - name: Download Android APK + if: ${{ matrix.platform == 'android' }} + uses: actions/download-artifact@v4 + with: + name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.platform }} + path: ${{ env.REACT_NATIVE_SAMPLE_PATH }} + + - name: Unzip iOS App Archive + if: ${{ matrix.platform == 'ios' }} + working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} + run: unzip ${{ env.IOS_APP_ARCHIVE_PATH }} + + - name: Unzip Android APK + if: ${{ matrix.platform == 'android' }} + working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} + run: unzip ${{ env.ANDROID_APP_ARCHIVE_PATH }} + + - name: Enable Corepack + run: | + npm install -g corepack@0.29.4 + corepack enable + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'yarn' + cache-dependency-path: yarn.lock + + - name: Install JS Dependencies + run: yarn install + + - name: Install Detox + run: npm install -g detox-cli@20.0.0 + + - name: Install Apple Simulator Utilities + if: ${{ matrix.platform == 'ios' }} + run: | + brew tap wix/brew + brew install applesimutils + + - uses: futureware-tech/simulator-action@dab10d813144ef59b48d401cd95da151222ef8cd # pin@v4 + if: ${{ matrix.platform == 'ios' }} + with: + # the same envs are used by Detox ci.sim configuration + model: ${{ env.IOS_DEVICE }} + os_version: ${{ env.IOS_VERSION }} + + - name: Run Detox iOS Tests + if: ${{ matrix.platform == 'ios' }} + working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} + run: detox test --configuration ci.sim + + - name: Run tests on Android + if: ${{ matrix.platform == 'android' }} + env: + # used by Detox ci.android configuration + ANDROID_AVD_NAME: 'test' # test is default reactivecircus/android-emulator-runner name + uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d # pin@v2.33.0 + with: + api-level: ${{ env.ANDROID_API_LEVEL }} + force-avd-creation: false + disable-animations: true + disable-spellchecker: true + target: 'aosp_atd' + channel: canary # Necessary for ATDs + emulator-options: > + -no-window + -no-snapshot-save + -gpu swiftshader_indirect + -noaudio + -no-boot-anim + -camera-back none + -camera-front none + -timezone US/Pacific + working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }} + script: detox test --configuration ci.android diff --git a/samples/react-native/.detoxrc.js b/samples/react-native/.detoxrc.js new file mode 100644 index 0000000000..fea1bf8b0c --- /dev/null +++ b/samples/react-native/.detoxrc.js @@ -0,0 +1,141 @@ +const process = require('process'); + +const TEST_TIMEOUT = 2 * 60 * 1000; // 2 minutes + +/** @type {Detox.DetoxConfig} */ +const testRunnerIos = { + args: { + $0: 'jest', + config: 'e2e/jest.config.ios.js', + }, + jest: { + setupTimeout: TEST_TIMEOUT, + }, +}; + +const testRunnerAos = { + args: { + $0: 'jest', + config: 'e2e/jest.config.android.js', + }, + jest: { + setupTimeout: TEST_TIMEOUT, + }, +}; + +module.exports = { + testRunner: {}, + apps: { + 'ios.debug': { + type: 'ios.app', + binaryPath: + 'ios/build/Build/Products/Debug-iphonesimulator/sentryreactnativesample.app', + build: + 'xcodebuild -workspace ios/sentryreactnativesample.xcworkspace -scheme sentryreactnativesample -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build', + }, + 'ios.release': { + type: 'ios.app', + binaryPath: + 'ios/build/Build/Products/Release-iphonesimulator/sentryreactnativesample.app', + build: + 'xcodebuild -workspace ios/sentryreactnativesample.xcworkspace -scheme sentryreactnativesample -configuration Release -sdk iphonesimulator -derivedDataPath ios/build', + }, + 'android.debug': { + type: 'android.apk', + binaryPath: 'android/app/build/outputs/apk/debug/app-debug.apk', + build: + 'cd android && ./gradlew app:assembleDebug app:assembleAndroidTest -DtestBuildType=debug', + reversePorts: [8081], + }, + 'android.release': { + type: 'android.apk', + binaryPath: 'android/app/build/outputs/apk/release/app-release.apk', + build: + 'cd android && ./gradlew app:assembleRelease app:assembleAndroidTest -DtestBuildType=release', + }, + 'ci.android': { + type: 'android.apk', + binaryPath: 'app.apk', + testBinaryPath: 'app-androidTest.apk', + }, + 'ci.ios': { + type: 'ios.app', + binaryPath: 'sentryreactnativesample.app', + }, + }, + devices: { + simulator: { + type: 'ios.simulator', + device: { + type: 'iPhone 16', + }, + }, + attached: { + type: 'android.attached', + device: { + adbName: '.*', + }, + }, + emulator: { + type: 'android.emulator', + device: { + avdName: 'Pixel_9_API_35', + }, + }, + 'ci.emulator': { + type: 'android.emulator', + device: { + avdName: process.env.ANDROID_AVD_NAME, + }, + }, + 'ci.simulator': { + type: 'ios.simulator', + device: { + type: process.env.IOS_DEVICE, + os: process.env.IOS_VERSION, + }, + }, + }, + configurations: { + 'ios.sim.debug': { + device: 'simulator', + app: 'ios.debug', + testRunner: testRunnerIos, + }, + 'ios.sim.release': { + device: 'simulator', + app: 'ios.release', + testRunner: testRunnerIos, + }, + 'android.att.debug': { + device: 'attached', + app: 'android.debug', + testRunner: testRunnerAos, + }, + 'android.att.release': { + device: 'attached', + app: 'android.release', + testRunner: testRunnerAos, + }, + 'android.emu.debug': { + device: 'emulator', + app: 'android.debug', + testRunner: testRunnerAos, + }, + 'android.emu.release': { + device: 'emulator', + app: 'android.release', + testRunner: testRunnerAos, + }, + 'ci.android': { + device: 'ci.emulator', + app: 'ci.android', + testRunner: testRunnerAos, + }, + 'ci.sim': { + device: 'ci.simulator', + app: 'ci.ios', + testRunner: testRunnerIos, + }, + }, +}; diff --git a/samples/react-native/Gemfile.lock b/samples/react-native/Gemfile.lock index d191c93895..45632413cc 100644 --- a/samples/react-native/Gemfile.lock +++ b/samples/react-native/Gemfile.lock @@ -273,6 +273,7 @@ GEM PLATFORMS arm64-darwin-22 arm64-darwin-23 + arm64-darwin-24 x86_64-darwin-20 DEPENDENCIES diff --git a/samples/react-native/android/app/build.gradle b/samples/react-native/android/app/build.gradle index 6c0d4a7ca1..1652764dfe 100644 --- a/samples/react-native/android/app/build.gradle +++ b/samples/react-native/android/app/build.gradle @@ -139,6 +139,10 @@ android { versionCode 39 versionName "6.7.0-alpha.0" buildConfigField "boolean", "SENTRY_DISABLE_NATIVE_START", System.getenv('SENTRY_DISABLE_NATIVE_START') ?: String.valueOf(sentryDisableNativeStart) + + // Detox + testBuildType System.getProperty('testBuildType', 'debug') + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } signingConfigs { @@ -193,11 +197,15 @@ android { signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro" } } } dependencies { + androidTestImplementation('com.wix:detox:+') + implementation 'androidx.appcompat:appcompat:1.7.0' + // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") diff --git a/samples/react-native/android/app/proguard-rules.pro b/samples/react-native/android/app/proguard-rules.pro index 11b025724a..f4ada6b5a1 100644 --- a/samples/react-native/android/app/proguard-rules.pro +++ b/samples/react-native/android/app/proguard-rules.pro @@ -8,3 +8,7 @@ # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: + +# Detox Release tests were failing on missing kotlin.Result +# It should be covered by node_modules/detox/android/detox/proguard-rules-app.pro but it seems missing +-keep class kotlin.** { *; } diff --git a/samples/react-native/android/app/src/androidTest/java/io/sentry/reactnative/sample/DetoxTest.java b/samples/react-native/android/app/src/androidTest/java/io/sentry/reactnative/sample/DetoxTest.java new file mode 100644 index 0000000000..28b9b28d1c --- /dev/null +++ b/samples/react-native/android/app/src/androidTest/java/io/sentry/reactnative/sample/DetoxTest.java @@ -0,0 +1,28 @@ +package io.sentry.reactnative.sample; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.rule.ActivityTestRule; +import com.wix.detox.Detox; +import com.wix.detox.config.DetoxConfig; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class DetoxTest { + @Rule + public ActivityTestRule mActivityRule = + new ActivityTestRule<>(MainActivity.class, false, false); + + @Test + public void runDetoxTests() { + DetoxConfig detoxConfig = new DetoxConfig(); + detoxConfig.idlePolicyConfig.masterTimeoutSec = 90; + detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60; + detoxConfig.rnContextLoadTimeoutSec = (BuildConfig.DEBUG ? 180 : 60); + + Detox.runTests(mActivityRule, detoxConfig); + } +} diff --git a/samples/react-native/android/app/src/main/AndroidManifest.xml b/samples/react-native/android/app/src/main/AndroidManifest.xml index e1892528b8..095bdca459 100644 --- a/samples/react-native/android/app/src/main/AndroidManifest.xml +++ b/samples/react-native/android/app/src/main/AndroidManifest.xml @@ -9,7 +9,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme" - android:supportsRtl="true"> + android:supportsRtl="true" + android:networkSecurityConfig="@xml/network_security_config"> + + + 10.0.2.2 + localhost + + diff --git a/samples/react-native/android/build.gradle b/samples/react-native/android/build.gradle index c6979c3c43..c2b68ea82b 100644 --- a/samples/react-native/android/build.gradle +++ b/samples/react-native/android/build.gradle @@ -20,4 +20,12 @@ buildscript { } } +allprojects { + repositories { + maven { + url("$rootDir/../node_modules/detox/Detox-android") + } + } +} + apply plugin: "com.facebook.react.rootproject" diff --git a/samples/react-native/e2e/captureMessage.test.android.ts b/samples/react-native/e2e/captureMessage.test.android.ts new file mode 100644 index 0000000000..a56d3704bc --- /dev/null +++ b/samples/react-native/e2e/captureMessage.test.android.ts @@ -0,0 +1,49 @@ +import { describe, it, beforeAll, expect } from '@jest/globals'; +import { Envelope } from '@sentry/core'; +import { device } from 'detox'; +import { + createSentryServer, + containingEvent, +} from './utils/mockedSentryServer'; +import { HEADER, ITEMS } from './utils/consts'; +import { tap } from './utils/tap'; + +describe('Capture message', () => { + let sentryServer = createSentryServer(); + sentryServer.start(); + + let envelope: Envelope; + + beforeAll(async () => { + await device.launchApp(); + + const envelopePromise = sentryServer.waitForEnvelope(containingEvent); + await tap('Capture message'); + envelope = await envelopePromise; + }); + + afterAll(async () => { + await sentryServer.close(); + }); + + it('envelope contains message event', async () => { + const item = (envelope[ITEMS] as [{ type?: string }, unknown][]).find( + i => i[HEADER].type === 'event', + ); + + expect(item).toEqual([ + { + content_type: 'application/json', + length: expect.any(Number), + type: 'event', + }, + expect.objectContaining({ + level: 'info', + message: { + message: 'Captured message', + }, + platform: 'javascript', + }), + ]); + }); +}); diff --git a/samples/react-native/e2e/captureMessage.test.ios.ts b/samples/react-native/e2e/captureMessage.test.ios.ts new file mode 100644 index 0000000000..25c953b707 --- /dev/null +++ b/samples/react-native/e2e/captureMessage.test.ios.ts @@ -0,0 +1,46 @@ +import { describe, it, beforeAll, expect } from '@jest/globals'; +import { Envelope } from '@sentry/core'; +import { device } from 'detox'; +import { + createSentryServer, + containingEvent, +} from './utils/mockedSentryServer'; +import { HEADER, ITEMS } from './utils/consts'; +import { tap } from './utils/tap'; + +describe('Capture message', () => { + let sentryServer = createSentryServer(); + sentryServer.start(); + + let envelope: Envelope; + + beforeAll(async () => { + await device.launchApp(); + + const envelopePromise = sentryServer.waitForEnvelope(containingEvent); + await tap('Capture message'); + envelope = await envelopePromise; + }); + + afterAll(async () => { + await sentryServer.close(); + }); + + it('envelope contains message event', async () => { + const item = (envelope[ITEMS] as [{ type?: string }, unknown][]).find( + i => i[HEADER].type === 'event', + ); + + expect(item).toEqual([ + { + length: expect.any(Number), + type: 'event', + }, + expect.objectContaining({ + level: 'info', + message: 'Captured message', + platform: 'javascript', + }), + ]); + }); +}); diff --git a/samples/react-native/e2e/envelopeHeader.test.android.ts b/samples/react-native/e2e/envelopeHeader.test.android.ts new file mode 100644 index 0000000000..26700f9245 --- /dev/null +++ b/samples/react-native/e2e/envelopeHeader.test.android.ts @@ -0,0 +1,63 @@ +import { describe, it, beforeAll, expect } from '@jest/globals'; +import { Envelope } from '@sentry/core'; +import { device } from 'detox'; +import { + createSentryServer, + containingEvent, +} from './utils/mockedSentryServer'; +import { HEADER } from './utils/consts'; +import { tap } from './utils/tap'; + +describe('Capture message', () => { + let sentryServer = createSentryServer(); + sentryServer.start(); + + let envelope: Envelope; + + beforeAll(async () => { + await device.launchApp(); + + const envelopePromise = sentryServer.waitForEnvelope(containingEvent); + + await tap('Capture message'); + envelope = await envelopePromise; + }); + + afterAll(async () => { + await sentryServer.close(); + }); + + it('contains event_id and sent_at in the envelope header', async () => { + expect(envelope[HEADER]).toEqual( + expect.objectContaining({ + event_id: expect.any(String), + sent_at: expect.any(String), + }), + ); + }); + + it('contains sdk info in the envelope header', async () => { + expect(envelope[HEADER]).toEqual( + expect.objectContaining({ + sdk: { + name: 'sentry.javascript.react-native', + version: expect.any(String), + }, + sent_at: expect.any(String), + }), + ); + }); + + it('contains trace info in the envelope header', async () => { + expect(envelope[HEADER]).toEqual( + expect.objectContaining({ + trace: { + environment: expect.any(String), + public_key: expect.any(String), + replay_id: expect.any(String), + trace_id: expect.any(String), + }, + }), + ); + }); +}); diff --git a/samples/react-native/e2e/envelopeHeader.test.ios.ts b/samples/react-native/e2e/envelopeHeader.test.ios.ts new file mode 100644 index 0000000000..4b72f76e18 --- /dev/null +++ b/samples/react-native/e2e/envelopeHeader.test.ios.ts @@ -0,0 +1,69 @@ +import { describe, it, beforeAll, expect } from '@jest/globals'; +import { Envelope } from '@sentry/core'; +import { device } from 'detox'; +import { + createSentryServer, + containingEvent, +} from './utils/mockedSentryServer'; +import { HEADER } from './utils/consts'; +import { tap } from './utils/tap'; + +describe('Capture message', () => { + let sentryServer = createSentryServer(); + sentryServer.start(); + + let envelope: Envelope; + + beforeAll(async () => { + await device.launchApp(); + + const envelopePromise = sentryServer.waitForEnvelope(containingEvent); + + await tap('Capture message'); + envelope = await envelopePromise; + }); + + afterAll(async () => { + await sentryServer.close(); + }); + + it('contains event_id and sent_at in the envelope header', async () => { + expect(envelope[HEADER]).toEqual( + expect.objectContaining({ + event_id: expect.any(String), + sent_at: expect.any(String), + }), + ); + }); + + it('contains sdk info in the envelope header', async () => { + expect(envelope[HEADER]).toEqual( + expect.objectContaining({ + sdk: { + features: [], + integrations: [], + name: 'sentry.javascript.react-native', + packages: [], + version: expect.any(String), + }, + sent_at: expect.any(String), + }), + ); + }); + + it('contains trace info in the envelope header', async () => { + expect(envelope[HEADER]).toEqual( + expect.objectContaining({ + trace: { + environment: expect.any(String), + public_key: expect.any(String), + replay_id: expect.any(String), + sample_rate: '1', + sampled: '1', + trace_id: expect.any(String), + transaction: 'ErrorsScreen', + }, + }), + ); + }); +}); diff --git a/samples/react-native/e2e/jest.config.android.js b/samples/react-native/e2e/jest.config.android.js new file mode 100644 index 0000000000..2d755851a0 --- /dev/null +++ b/samples/react-native/e2e/jest.config.android.js @@ -0,0 +1,16 @@ +/** @type {import('@jest/types').Config.InitialOptions} */ +module.exports = { + preset: 'ts-jest', + rootDir: '..', + testMatch: [ + '/e2e/**/*.test.ts', + '/e2e/**/*.test.android.ts', + ], + testTimeout: 120000, + maxWorkers: 1, + globalSetup: 'detox/runners/jest/globalSetup', + globalTeardown: 'detox/runners/jest/globalTeardown', + reporters: ['detox/runners/jest/reporter'], + testEnvironment: 'detox/runners/jest/testEnvironment', + verbose: true, +}; diff --git a/samples/react-native/e2e/jest.config.ios.js b/samples/react-native/e2e/jest.config.ios.js new file mode 100644 index 0000000000..62034bc390 --- /dev/null +++ b/samples/react-native/e2e/jest.config.ios.js @@ -0,0 +1,13 @@ +/** @type {import('@jest/types').Config.InitialOptions} */ +module.exports = { + preset: 'ts-jest', + rootDir: '..', + testMatch: ['/e2e/**/*.test.ts', '/e2e/**/*.test.ios.ts'], + testTimeout: 120000, + maxWorkers: 1, + globalSetup: 'detox/runners/jest/globalSetup', + globalTeardown: 'detox/runners/jest/globalTeardown', + reporters: ['detox/runners/jest/reporter'], + testEnvironment: 'detox/runners/jest/testEnvironment', + verbose: true, +}; diff --git a/samples/react-native/e2e/utils/consts.ts b/samples/react-native/e2e/utils/consts.ts new file mode 100644 index 0000000000..9a751a5fa4 --- /dev/null +++ b/samples/react-native/e2e/utils/consts.ts @@ -0,0 +1,2 @@ +export const HEADER = 0; +export const ITEMS = 1; diff --git a/samples/react-native/e2e/utils/mockedSentryServer.ts b/samples/react-native/e2e/utils/mockedSentryServer.ts new file mode 100644 index 0000000000..40667b0f9d --- /dev/null +++ b/samples/react-native/e2e/utils/mockedSentryServer.ts @@ -0,0 +1,84 @@ +import { IncomingMessage, ServerResponse, createServer } from 'node:http'; +import { createGunzip } from 'node:zlib'; +import { Envelope } from '@sentry/core'; +import { parseEnvelope } from './parseEnvelope'; + +type RecordedRequest = { + path: string | undefined; + headers: Record; + body: Buffer; + envelope: Envelope; +}; + +export function createSentryServer({ port = 8961 } = {}): { + waitForEnvelope: ( + predicate: (envelope: Envelope) => boolean, + ) => Promise; + close: () => Promise; + start: () => void; +} { + let onNextRequestCallback: (request: RecordedRequest) => void = () => {}; + const requests: RecordedRequest[] = []; + + const server = createServer((req: IncomingMessage, res: ServerResponse) => { + let body: Buffer = Buffer.from([]); + + const gunzip = createGunzip(); + req.pipe(gunzip); + + gunzip.on('data', (chunk: Buffer) => { + body = Buffer.concat([body, chunk]); + }); + + gunzip.on('end', () => { + const request = { + path: req.url, + headers: req.headers, + body: body, + envelope: parseEnvelope(body), + }; + requests.push(request); + + body = Buffer.from([]); + + res.writeHead(200); + res.end('OK'); + + onNextRequestCallback(request); + }); + }); + + return { + start: () => { + server.listen(port); + }, + waitForEnvelope: async ( + predicate: (envelope: Envelope) => boolean, + ): Promise => { + return new Promise((resolve, reject) => { + onNextRequestCallback = (request: RecordedRequest) => { + try { + if (predicate(request.envelope)) { + resolve(request.envelope); + return; + } + } catch (e) { + reject(e); + return; + } + }; + }); + }, + close: async () => { + await new Promise(resolve => { + server.close(() => resolve()); + }); + }, + }; +} + +export function containingEvent(envelope: Envelope) { + return envelope[1].some( + item => (item[0] as { type?: string }).type === 'event', + ); +} diff --git a/samples/react-native/e2e/utils/parseEnvelope.ts b/samples/react-native/e2e/utils/parseEnvelope.ts new file mode 100644 index 0000000000..e6b29b201e --- /dev/null +++ b/samples/react-native/e2e/utils/parseEnvelope.ts @@ -0,0 +1,74 @@ +import { + Envelope, + BaseEnvelopeHeaders, + BaseEnvelopeItemHeaders, +} from '@sentry/core'; + +/** + * Parses an envelope + */ +export function parseEnvelope(env: string | Uint8Array): Envelope { + let buffer = typeof env === 'string' ? encodeUTF8(env) : env; + + function readBinary(length?: number): Uint8Array { + if (!length) { + throw new Error('Binary Envelope Items must have a length to be read'); + } + const bin = buffer.subarray(0, length); + // Replace the buffer with the remaining data excluding trailing newline + buffer = buffer.subarray(length + 1); + return bin; + } + + function readJson(): T { + let i = buffer.indexOf(0xa); + // If we couldn't find a newline, we must have found the end of the buffer + if (i < 0) { + i = buffer.length; + } + + return JSON.parse(decodeUTF8(readBinary(i))) as T; + } + + const envelopeHeader = readJson(); + + const items: [any, any][] = []; + + while (buffer.length) { + const itemHeader = readJson(); + const isBinaryAttachment = + itemHeader.type === 'attachment' && + itemHeader.content_type !== 'application/json'; + // TODO: Parse when needed for the tests + const isReplayVideo = (itemHeader.type as string) === 'replay_video'; + + try { + let item: any = {}; + if (isReplayVideo || isBinaryAttachment) { + item = readBinary(itemHeader.length); + } else { + item = readJson(); + } + items.push([itemHeader, item]); + } catch (e) { + console.error(e, 'itemHeader', itemHeader, 'buffer', buffer.toString()); + throw e; + } + } + + return [envelopeHeader, items]; +} + +/** + * Encode a string to UTF8 array. + */ +function encodeUTF8(input: string): Uint8Array { + return new TextEncoder().encode(input); +} + +/** + * Decode a UTF8 array to string. + */ +function decodeUTF8(input: Uint8Array): string { + return new TextDecoder().decode(input); +} diff --git a/samples/react-native/e2e/utils/tap.ts b/samples/react-native/e2e/utils/tap.ts new file mode 100644 index 0000000000..3b12d61e31 --- /dev/null +++ b/samples/react-native/e2e/utils/tap.ts @@ -0,0 +1,14 @@ +import { element, by } from 'detox'; + +export const tap = async (text: string) => { + await element(by.text(createFlexibleRegex(text))).tap(); +}; + +/** + * Creates regex that matches case insensitive and allows flexible spacing between words + */ +function createFlexibleRegex(input: string) { + const words = input.trim().split(/\s+/); + const pattern = words.join('\\s*'); + return new RegExp(pattern, 'i'); +} diff --git a/samples/react-native/package.json b/samples/react-native/package.json index 2cdee52a1d..c2697d9959 100644 --- a/samples/react-native/package.json +++ b/samples/react-native/package.json @@ -25,6 +25,7 @@ "@react-navigation/native": "^7.0.3", "@react-navigation/native-stack": "^7.0.3", "@react-navigation/stack": "^7.0.3", + "@sentry/core": "8.54.0", "@sentry/react-native": "6.7.0-alpha.0", "delay": "^6.0.0", "react": "18.3.1", @@ -53,6 +54,8 @@ "@react-native/metro-config": "0.76.3", "@react-native/typescript-config": "0.76.3", "@sentry/babel-plugin-component-annotate": "^2.18.0", + "@types/jest": "^29.5.14", + "@types/node": "^22.13.1", "@types/react": "^18.2.65", "@types/react-native-vector-icons": "^6.4.18", "@types/react-test-renderer": "^18.0.0", @@ -60,12 +63,14 @@ "@typescript-eslint/parser": "^7.18.0", "babel-jest": "^29.2.1", "babel-plugin-module-resolver": "^5.0.0", + "detox": "^20.33.0", "eslint": "^8.19.0", "jest": "^29.6.3", "patch-package": "^8.0.0", "prettier": "2.8.8", "react-test-renderer": "18.3.1", "sentry-react-native-samples-utils": "workspace:^", + "ts-jest": "^29.2.5", "typescript": "5.0.4" }, "engines": { diff --git a/samples/react-native/request-body.txt b/samples/react-native/request-body.txt new file mode 100644 index 0000000000..1681519903 --- /dev/null +++ b/samples/react-native/request-body.txt @@ -0,0 +1,77 @@ +{"sdk":{"packages":[],"features":[],"integrations":[],"name":"sentry.javascript.react-native","version":"6.7.0-alpha.0"},"sent_at":"2025-02-11T13:02:15.028Z","trace":{"replay_id":"bc2567f9d6724810b7d85d788da38093","public_key":"1df17bd4e543fdb31351dee1768bb679","sampled":"1","sample_rate":"1","environment":"dev","transaction":"ErrorsScreen","trace_id":"c38b08a558b946ee8417946ff281bdf6"},"event_id":"ac5ac611cf204aa3a4517d42cd8770c9"} +{"type":"event","length":11139} +{"exception":{"values":[{"value":"Captured message","stacktrace":{"frames":[{"lineno":2925,"colno":22,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"dispatchEvent","in_app":false},{"lineno":2792,"colno":33,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"batchedUpdates$1","in_app":false},{"lineno":22998,"colno":17,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"batchedUpdates","in_app":false},{"lineno":2956,"colno":39,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"batchedUpdates$1$argument_0","in_app":false},{"lineno":2909,"colno":22,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"runExtractedPluginEventsInBatch","in_app":false},{"lineno":2844,"colno":24,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"runEventsInBatch","in_app":false},{"lineno":982,"colno":19,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"forEachAccumulated","in_app":false},{"lineno":2828,"colno":40,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"executeDispatchesAndReleaseTopLevel","in_app":false},{"lineno":2819,"colno":32,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"executeDispatchesAndRelease","in_app":false},{"lineno":198,"colno":23,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"executeDispatchesInOrder","in_app":false},{"lineno":167,"colno":16,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js","function":"executeDispatch","in_app":false},{"lineno":520,"colno":27,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Pressability/Pressability.js","function":"responderEventHandlers.onResponderRelease","in_app":false},{"lineno":697,"colno":40,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Pressability/Pressability.js","function":"_receiveSignal","in_app":false},{"lineno":758,"colno":17,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/node_modules/react-native/Libraries/Pressability/Pressability.js","function":"_performTransitionSideEffects","in_app":false},{"lineno":52,"colno":33,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/samples/react-native/src/Screens/ErrorsScreen.tsx","function":"Button.props.onPress","in_app":true,"pre_context":[" "," "," {"],"context_line":" Sentry.captureMessage('Captured message');","post_context":[" }}"," />"," {"]},{"lineno":37,"colno":55,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/packages/core/node_modules/@sentry/core/build/cjs/exports.js","function":"captureMessage","in_app":false},{"lineno":537,"colno":40,"filename":"/Users/krystofwoldrich/repos/sentry-react-native/packages/core/node_modules/@sentry/core/build/cjs/scope.js","function":"ScopeClass#captureMessage","in_app":false}]},"mechanism":{"type":"generic","handled":true,"synthetic":true}}]},"message":"Captured message","level":"info","event_id":"ac5ac611cf204aa3a4517d42cd8770c9","request":{"headers":{}},"timestamp":1739278934.824,"environment":"dev","sdk":{"integrations":["ReactNativeErrorHandlers","NativeLinkedErrors","InboundFilters","FunctionToString","Breadcrumbs","HttpContext","Release","EventOrigin","SdkInfo","ReactNativeInfo","RewriteFrames","DeviceContext","ModulesLoader","Screenshot","ViewHierarchy","HermesProfiling","AppStart","NativeFrames","StallTracking","UserInteraction","ReactNativeTracing","HttpClient","Spotlight","MobileReplay","DebugSymbolicator","ReactNavigation","ReactNativeProfiler","TouchEventBoundary"],"name":"sentry.javascript.react-native","version":"6.7.0-alpha.0","packages":[{"name":"sentry.cocoa.react-native","version":"8.44.0"},{"name":"npm:@sentry/react-native","version":"6.7.0-alpha.0"}]},"contexts":{"trace":{"span_id":"8bb5c2ccf3da3e0c","trace_id":"c38b08a558b946ee8417946ff281bdf6"},"os":{"build":"24C101","rooted":false,"kernel_version":"Darwin Kernel Version 24.2.0: Fri Dec 6 19:01:59 PST 2024; root:xnu-11215.61.5~2/RELEASE_ARM64_T6000","name":"iOS","version":"18.2"},"device":{"simulator":true,"model_id":"simulator","arch":"arm64","free_memory":162365440,"family":"iOS","model":"iPhone17,3","memory_size":34359738368,"locale":"en_AT","processor_count":10,"usable_memory":19360628736,"thermal_state":"nominal"},"app":{"view_names":["ErrorsScreen-jgVgu8ZmTVg9hyaOFDAmZ"],"app_id":"CBF93CD0-CB43-34F9-B61A-40182EF30658","app_version":"6.7.0","app_identifier":"io.sentry.reactnative.sample","app_start_time":"2025-02-11T13:02:12Z","device_app_hash":"7df688a92dcca30f5ce9bd31826de49ba100d81d","app_build":"44","build_type":"simulator","app_memory":198000640,"app_name":"sentryreactnativesample","in_foreground":true},"react_native_context":{"turbo_module":true,"fabric":true,"react_native_version":"0.76.3","expo":false,"js_engine":"hermes","hermes_version":"for RN 0.76.3","hermes_debug_info":true},"state":{"state":{"type":"redux","value":{"counter":0}},"__sentry_override_normalization_depth__":6}},"breadcrumbs":[{"type":"debug","level":"info","category":"started","message":"Breadcrumb Tracking","timestamp":1739278932.937},{"type":"navigation","level":"info","category":"device.orientation","data":{"position":"portrait"},"timestamp":1739278932.977},{"type":"navigation","level":"info","category":"app.lifecycle","data":{"state":"foreground"},"timestamp":1739278933.022},{"type":"navigation","level":"info","category":"ui.lifecycle","data":{"screen":"UIViewController","beingPresented":"false","window_windowLevel":"0.000000","window_isKeyWindow":"true","window":"; layer = >","is_window_rootViewController":"true"},"timestamp":1739278933.029},{"type":"navigation","level":"info","category":"ui.lifecycle","data":{"screen":"UIViewController","beingPresented":"false","window_windowLevel":"1001.000000","window_isKeyWindow":"false","window":"; backgroundColor = UIExtendedSRGBColorSpace 0.25 0.25 0.25 1; layer = >","is_window_rootViewController":"true"},"timestamp":1739278933.091},{"timestamp":1739278933.389,"category":"console","data":{"arguments":["Running \"sentry-react-native-sample\" with {\"rootTag\":1,\"initialProps\":{\"concurrentRoot\":true},\"fabric\":true}"],"logger":"console"},"level":"debug","message":"Running \"sentry-react-native-sample\" with {\"rootTag\":1,\"initialProps\":{\"concurrentRoot\":true},\"fabric\":true}"},{"timestamp":1739278933.558,"category":"redux.action","data":{"type":"@@redux/INITa.f.o.b.d"},"type":"info","level":"info"},{"timestamp":1739278933.731,"category":"navigation","type":"navigation","message":"Navigation to ErrorsScreen","data":{"to":"ErrorsScreen"},"level":"info"},{"type":"navigation","level":"info","category":"ui.lifecycle","data":{"screen":"RNSNavigationController","window":"; layer = >","parentViewController":"UIViewController","beingPresented":"false","window_isKeyWindow":"true","window_windowLevel":"0.000000","is_window_rootViewController":"false"},"timestamp":1739278933.838},{"type":"navigation","level":"info","category":"ui.lifecycle","data":{"screen":"RNSScreen","window":"; layer = >","title":"BottomTabs","parentViewController":"RNSNavigationController","beingPresented":"false","window_isKeyWindow":"true","window_windowLevel":"0.000000","is_window_rootViewController":"false"},"timestamp":1739278933.846},{"type":"navigation","level":"info","category":"ui.lifecycle","data":{"screen":"RNSNavigationController","window":"; layer = >","parentViewController":"RNSScreen","beingPresented":"false","window_isKeyWindow":"true","window_windowLevel":"0.000000","is_window_rootViewController":"false"},"timestamp":1739278933.848},{"type":"navigation","level":"info","category":"ui.lifecycle","data":{"screen":"RNSScreen","window":"; layer = >","title":"Errors","parentViewController":"RNSNavigationController","beingPresented":"false","window_isKeyWindow":"true","window_windowLevel":"0.000000","is_window_rootViewController":"false"},"timestamp":1739278933.848},{"timestamp":1739278934.815,"category":"touch","data":{"path":[{"name":"Text"},{"name":"View"},{"name":"Animated(View)"},{"name":"TouchableOpacity"},{"name":"Button","element":"NativeButton","file":"ErrorsScreen.tsx"},{"name":"ScrollView","element":"ScrollView","file":"ErrorsScreen.tsx"},{"name":"DebugContainer"},{"name":"Animated(Anonymous)"},{"name":"Screen"},{"name":"View"},{"name":"profiler(ErrorsTab)"},{"name":"View"},{"name":"Animated(View)"},{"name":"View"},{"name":"Animated(View)"},{"name":"Screen"},{"name":"View"},{"name":"BottomTabsNavigator","file":"App.tsx"},{"name":"DebugContainer"},{"name":"Animated(Anonymous)"}]},"level":"info","message":"Touch event within element: Text","type":"user"}],"release":"io.sentry.reactnative.sample@6.7.0+44","dist":"44","tags":{"hermes":"true","event.origin":"javascript","event.environment":"javascript"},"platform":"javascript","user":{"id":"84294C0D-C864-438F-8CBA-5B8182C6FD53"}} +{"filename":"view-hierarchy.json","length":16602,"type":"attachment","attachment_type":"event.view_hierarchy","content_type":"application\/json"} +{"rendering_system":"UIKIT","windows":[{"type":"UIWindow","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UITransitionView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UIDropShadowView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTSurfaceHostingProxyRootView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"view_controller":"UIViewController","children":[{"type":"RCTSurfaceView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTRootComponentView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RNCSafeAreaProviderComponentView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RNSScreenStackView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UILayoutContainerView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"view_controller":"RNSNavigationController","children":[{"type":"UINavigationTransitionView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UIViewControllerWrapperView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RNSScreenView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"view_controller":"RNSScreen","children":[{"type":"RNSScreenContentWrapper","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[]},{"type":"RNSScreenStackView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UILayoutContainerView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"view_controller":"RNSNavigationController","children":[{"type":"UINavigationTransitionView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UIViewControllerWrapperView","width":393,"height":769,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RNSScreenView","width":393,"height":671.333,"x":0,"y":97.6667,"alpha":1,"visible":true,"view_controller":"RNSScreen","children":[{"type":"RNSScreenContentWrapper","width":393,"height":671.333,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTScrollViewComponentView","width":393,"height":671.333,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTEnhancedScrollView","width":393,"height":671.333,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UIView","width":373,"height":969.667,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":353,"height":949.667,"x":20,"y":20,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":45.6667,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":91.3333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":137,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":182.667,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":228.333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":274,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":319.667,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":365.333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":411,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":456.667,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":502.333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":548,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6666,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6666,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6666,"x":0,"y":593.667,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":1,"x":0,"y":647.333,"alpha":1,"visible":true,"children":[]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":664.333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":1,"x":0,"y":718,"alpha":1,"visible":true,"children":[]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":735,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6666,"x":0,"y":780.667,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6666,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6666,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":826.333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":353,"height":37.6667,"x":0,"y":872,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":337,"height":21.6667,"x":8,"y":8,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":337,"height":21.6667,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]}]},{"type":"_UIScrollViewScrollIndicator","width":367,"height":3,"x":23,"y":665.333,"alpha":0,"visible":true,"children":[{"type":"UIView","width":367,"height":3,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"_UIScrollViewScrollIndicator","width":3,"height":605,"x":387,"y":3,"alpha":0,"visible":true,"children":[{"type":"UIView","width":3,"height":605,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]}]},{"type":"RNSScreenStackHeaderConfig","width":393,"height":0,"x":0,"y":-671.333,"alpha":1,"visible":false,"children":[]}]}]}]},{"type":"UINavigationBar","identifier":"Errors","width":393,"height":44,"x":0,"y":53.6667,"alpha":1,"visible":true,"children":[{"type":"_UIBarBackground","width":393,"height":103,"x":0,"y":-59,"alpha":1,"visible":true,"children":[{"type":"UIImageView","width":393,"height":103,"x":0,"y":0,"alpha":1,"visible":true,"children":[]},{"type":"_UIBarBackgroundShadowView","width":393,"height":0.333333,"x":0,"y":103,"alpha":1,"visible":true,"children":[{"type":"_UIBarBackgroundShadowContentImageView","width":393,"height":0.333333,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"_UINavigationBarContentView","width":393,"height":44,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"_UIButtonBarStackView","width":8,"height":44,"x":377,"y":0,"alpha":1,"visible":true,"children":[]},{"type":"_UINavigationBarTitleControl","width":48.6667,"height":20.3333,"x":172.333,"y":11.6667,"alpha":1,"visible":true,"children":[{"type":"UIView","width":48.6667,"height":20.3333,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UILabel","width":48.6667,"height":20.3333,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]},{"type":"_UIPointerInteractionAssistantEffectContainerView","width":0,"height":0,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"UIToolbar","identifier":"Toolbar","width":393,"height":49,"x":0,"y":769,"alpha":1,"visible":false,"children":[{"type":"_UIBarBackground","width":393,"height":49,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UIVisualEffectView","width":393,"height":49,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"_UIVisualEffectBackdropView","width":393,"height":49,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"_UIBarBackgroundShadowView","width":393,"height":0.333333,"x":0,"y":-0.333333,"alpha":1,"visible":true,"children":[{"type":"_UIBarBackgroundShadowContentImageView","width":393,"height":0.333333,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]}]}]}]}]}]},{"type":"RCTViewComponentView","width":393,"height":83,"x":0,"y":769,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":393,"height":82.6667,"x":0,"y":0.333333,"alpha":1,"visible":true,"children":[]},{"type":"RCTViewComponentView","width":131,"height":48.6667,"x":0,"y":0.333333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":25,"height":25,"x":53,"y":6.33333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":25,"height":25,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"RCTViewComponentView","width":31,"height":28,"x":50,"y":5,"alpha":0,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":25,"height":25,"x":3,"y":1.33333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":25,"height":25,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTParagraphComponentView","width":30.3333,"height":12,"x":50.3333,"y":33,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":30.3333,"height":12,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":131,"height":48.6667,"x":131,"y":0.333333,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":31,"height":28,"x":50,"y":5,"alpha":0,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":25,"height":25,"x":3,"y":1.33333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":25,"height":25,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTParagraphComponentView","width":25,"height":25,"x":53,"y":6.33333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":25,"height":25,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"RCTParagraphComponentView","width":63.6667,"height":12,"x":33.6667,"y":33,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":63.6667,"height":12,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTViewComponentView","width":131,"height":48.6667,"x":262,"y":0.333333,"alpha":1,"visible":true,"children":[{"type":"RCTViewComponentView","width":31,"height":28,"x":50,"y":5,"alpha":0,"visible":true,"children":[{"type":"RCTParagraphComponentView","width":25,"height":25,"x":3,"y":1.33333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":25,"height":25,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]},{"type":"RCTParagraphComponentView","width":25,"height":25,"x":53,"y":6.33333,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":25,"height":25,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"RCTParagraphComponentView","width":55.6667,"height":12,"x":37.6667,"y":33,"alpha":1,"visible":true,"children":[{"type":"RCTParagraphTextView","width":55.6667,"height":12,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]}]},{"type":"RNSScreenStackHeaderConfig","width":393,"height":0,"x":0,"y":-852,"alpha":1,"visible":false,"children":[]}]}]}]},{"type":"UIToolbar","identifier":"Toolbar","width":393,"height":49,"x":0,"y":852,"alpha":1,"visible":false,"children":[{"type":"_UIBarBackground","width":393,"height":83,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"UIVisualEffectView","width":393,"height":83,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"_UIVisualEffectBackdropView","width":393,"height":83,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]},{"type":"_UIBarBackgroundShadowView","width":393,"height":0.333333,"x":0,"y":-0.333333,"alpha":1,"visible":true,"children":[{"type":"_UIBarBackgroundShadowContentImageView","width":393,"height":0.333333,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]}]}]}]}]},{"type":"RCTViewComponentView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTDebuggingOverlayComponentView","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[{"type":"RCTDebuggingOverlay","width":393,"height":852,"x":0,"y":0,"alpha":1,"visible":true,"children":[]}]}]}]}]}]}]}]}]}]} +{"filename":"screenshot.png","length":34850,"type":"attachment","attachment_type":"event.attachment","content_type":"image\/png"} +�PNG + + IHDR�TF��esRGB����eXIfMM*JR(�iZHH����Tϱ� pHYs  ��iDOT�(��E�� �@IDATx읇�7������ڌ'y|�A�-眓�q{�s{��䬜Z9��j�@�ܤ6y +,0tSM6�y�^P��Q���?����@����1���@�H@�,�D*@@ 8  �E��BC��"@@� Yh�@$���@D"   ��"�Hd��@@��  Y�,4T�� p@@ �"��� +D��d@$��P  �H��,�D*@@ 8  �E��BC��"@@� Yh�@$���@D"   ��"�Hd��@@��  Y�,4T�� p@@ �"��� +D��d@$��P  �H��,�D*@@ 8  �E��BC��"@@� Yh�@$���@D"   ��"�Hd��@@��  Y�,4T�� p@@ �"��� +D��d@$��P  �H��,�D*@@ 8  �E��BC��"@@� Yh�@$���@D"   ��"�Hd��@@��  Y�,4T�� p@@ �"��� +D��d@$��P1�<���ť�^���FW�9�2�G �����[�# ,�� �Ḍ�"1��¨�Db|�v,� ��i�FDb�'���#�H�c�.&���D��G�8��� �r�@$FmFϸ#�H�� ���!c6�\��#�H��1��"� D��cLD� ���@$z ��A���`$��"1�<6W�H��Tr! Db�L�l �H��_��ś��"1Gi}"�H� ��E�.��>y �7� ���=} ~"�H,�I��!#�<�\�0@$��:}�Db���f�"1+�h4,�a!O���"1�3�@��X�ǰ,�Ă���8���ɜw�zx �Þ�A@`�@$F~� � Dbx��3��<���O��!�H {z��G��)b�  0<��aO�  0� #?E @��"1<��@FDb䧈����@$��==����#�H��1@�������pTq�@$�$�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@���Ȓ��d��o滊�"�H�8�@$ G�U� +l�6��dq�@$ 8�@��䨓c�e���������ǶfI�Nr�v���d�7"1�"�c멦0�{��������%{��0��)i�yx�yF�� "1�7���n�NuU���!��yg�7m��_ ,������#����z�����Ԇ�Cwl�?��T�X?|s�X��Ѻ}����m,�yuW�o׎Su?��]ׯ��Y~����Kǵg�tɮ>���K��Ε����w,YW|����xi�t�o���x��MŁ}�k<{�|��ۊ'�\�?_��l�t�x�����m���KOo��MOoUc9u�l�����cؾ�d�����[�{n�P|���J����u��}~��v�.��_�����y�PqA$&X$f��6io�����1V�ݿ���~�����._S_��c*�է�K�&��Ny-��=rh�-��ゟ�WY>Ucׂ��;�bn�*/�j��I�b_�~y��s՟V6�'O�m��1\�q��!�s}|M�s:s������,� ?^��D$j L*��`�v�U��]E�;}�ic���&�^��ض�����$���&'z�c*�7/Z[��xŚ�=��e�}�L����[�W�k�l��J���s���X���׮k���~�?t�!p1�}>x��D�'���F�q�F��'��Ͼ��,�&?~� "Q�)'��Z(tt4��W�מ�ьS���mZ��S幊�c;�N�嘪� k�7��W��*{j��ʲ設��R?��g���=��Y���GK����^yI{_�ַ��_�l)�1�z> w�A$&\$�8�{�̜+�/;T����ٻ�W�)�D�#u�}�M�>U�H��?��.�?��ؽS��=.���q��New���ln.�ޝ��������?���>�`_[\�w��k��#-��T��a� C�&�Nu'��-�k�:��c� f1.��+��C$&\$n]\>��E��Z��z1��+R�Xzw�B�v~���*Z$<�\�O�Wmf#���n.й~c_zq���=A�y�����7����O*�o�T�{�O�I8F.턙c���@hN��Jn/��_?��NU>�ϝ��"!ߪ����d�E�^E��v���~q��S _���R���H(�l�t�N��{���j�g��Hz +�s��G��B_m��悙�"ϵ��`���,�����ո�(�����T��콈ĺU�J�CmN���=7nh�oON$�2�_:ű�LOD��?�����(��ԟ���X8�>�_�ف�5���Gc���|���Ӳ|�;S��X����?�� +D�v�L2�}\��o���u-"�<���9�����bǶT$�%�c�|Y�O�����~�����Ӿ��]��mˉD��vecA��@����T����?m,���Ȃ_���ݯ��D��_/�_~�%�o�����=�M����U_X9vL����|��,� ?~� "1�"���� �8qQ~�����7�#�l�Hh�՗S�_/G�鱣�]m<�����{�O`+M����w�OZV�� ����A{��_G}^�����#��Y�g��cE�J�@���~��~��y����mI�O 4��D �=X ��T-���p��=>' J��'���aE��3�n��X�{_�/6V�ߋ��Gg�/�\ (۷�l�����z�Mu�\Ѵ�n�)��`�s����-�����O��d��HL�HtZ��6��/8kV�hBѩ����H�e�X�Y;f�Ą���ߎV�:��Q��_����\�y㉒��~�-�6�(���m~�^y�}�����w�t3���vͺ�<��~:Ҵ�o��C�v��J�떿��iC���i������SY�q>p���X��һOx�y�Uk+����z��_��5Ͳ�����de�^>j���N�՟�?\/�џ}��2N�ĕ��(�uU ���[/�j�'����i�S���(Ǐ���sm|���є���oe��5��u�@$J Xz���9]�T|=-��iگ���-�"ѶT��:��"S��v�-�s�Xwǒ֑�ۻ^�\E�1s���s>=w�jo_��qY鱣g�D#�;ﶹ���$> +r�^D���4�S��lS�1G���/"Qa���c�� t��Cf���~��k����uՓ��4���/���A����x�������S��Uml��]�ٳ����/�c{_�c����I$���q{ �wq�4ոlS���u�s_�"&Zش�d!d�B������/?n}唶���.�}8/����\��ߏm�K�b[ŗXD[./��[U;�o|��T��і�{g'�P?�s�^DB�j�kǩf;�� �OyD�0?���c0&%�"�?-.�5?z�T��?��o��]�>���TѦ�8�m������w��\�2J�n"�����2��'����cw�ij���q�>~9���8z��n�H�c:������mƓ]}��)�l_\#��.��i�H�n��I({A� X}����[� ���>���9⯳�}mw��Ȫ�&-,j��Յ��q�=Q�Bgݪcͺ;�k�+��>�U���x���k��WUW���r9�[ϳ�b�n��S��Me�(U9���?<��(�=v�T�_��qz�E�+ǃ��O/i<�M�[�n}n�r����}��"1��B��Ą����A�䧻Q���7����3'��Be�#���l�}�Z����������X�����N����{�� a��Ul�xѦ|����b�:-�i����"!_� ������x����&�IEB~����6��?�C$ʘD|&-�H$7Ȥ`Pכ[X��D���k�zGK� D����� �H ��F$��lyM;>�� ��.UG`3����n�m��$��B ��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r��Yr�+�� L�t�q�@$ 8�@���Ȓc��x/�t80x �"��r�9fN�+^}vGq�Uk��_ؙ����w:�#�f������y�ᑟW�S�0�կ[����3Db"�.M��۪�7k���?v�T��k�/z?i��Z����w�`C$~��P�}F%oz<����v=�K��O:��~�s�H�Q$|��:y���������x՟V���NP7���dQ�ֆ��B���Ν;_�d1n�9.�5�ׁH�A$�b[���9W)o����$���?��m�D$ˏ�pj��A$� �,(����:u�)"zg�vN�ziW�^����[6���)5�>y_[�._S���}�~����h=p��zy��G��Ξ=_�1}�\��x�ܵ�ٿcV�z�q�'O���l�m��9]osz�%����3��m/��u�M����78VZ�r�s�i��e�+����k֕����K~���U��T�șz\�����y��d��-�q��ퟦ1����t����{�\���=��軯����{�����Sב�N0�ڍ6[򈈯?��Kj��V-���7��J��/+K7���L��7=n��S��H����ز-�������h�������C����~=ڼF-��9���U�g�*�sㆦ���;3�Ztms��u�EB�'�w��>�Oگ|�(T��m��-����_l^o���R�+��u����Hȯۓ�M�M��-_�X�`s�溘z����#�󅧶5ǵy��u��~�i��/��6�I[��"Q��z+�� O����w�6��}�pcט.Ls�t�W^R���c�N�����{���#�u���(��.n��{�@�Eq*\���� �z�E�pxjp_���h�+���nsp�'.F���-�Z o�x1��;M�M��X[6�h�E����܏H�?����4�un�v.+��ޫH,_v�+�-?Q�?��3�3��|����x��?��[���c[K�� ���CջI�u��r�7^���F�o�*v�oU����"Q#�_1��!�:��*�D0�;׏��m>Y���!��^����q���s =��1=&���=���m��*��v��Ǒ���kœ���?�z +���#m7� I!��\kq�%��T���Q �?~~�����"Q5F�r׹{�t嵹�Ҵ�lK�*����e��R�w ����u,����#_+��z'�8Ns��^i�u���v���H����c\�{w��6N��~DbߞvnmX{���c�R����H���1�I�v3�~S��v9�}�(���$�W�?�����'���/�S^/ѣ=�xʧ��(�WU�����K�]�6�\��4��&�{g�:+�K1���/��5?��xs����[�b������w��Ʊ_l�'��}��*�_yh�T��_�8^n�T۪�n�)U��k��䣺� ��ʧ��]y,ۿ>� �]���uV���)��kc�v�K��f+O/m|y�w�iQ}�Q�U�ҟ�+��O��)��M�\��9��_7�S��O�_j��w>�����f��� �lRU/�b{)���v<����D�[Z_���}��G���{[b�OP�����������r���4�]v|��/l��i,����U�_��c�_z���8}�����z'������i۪�9^|I*�ي����G/�����"a���k�M1�M�n�M����(v�\�ǧ1�E�;�Gx����]�Zv=iT]�ېv_����J�0�ck���e*ZX��:�� �b?w�}��i;�s���1:��*��;�U�����ßLF��b��{�E�Ov1^��}��hs^�?㍾ʧOQ� Z$Կ��c��J$R���8����q �qnz�� �w�c(�D�?�{�J�q��|q��ې��!5r �(�\S;�;��+�|��o'�ŭ[},ۯ��\/�;�SGP鏙tv��T���)NZ�]�_�/�i]������n�U��ޥlXs���w�E��uԵ���8l���3>�ź��ߎm���c�(�oi��s��en�q����C�#H�s�>��qc�G�:kN��ͭ����=Db@"1Hҥ"1�ؓ+�IĀk�}Q�2V�"1��-D�|ӳ�G?@$FP$���Ec?��oy�Q�� 6el�<�q�A��6i�sc�80_@$��?n����~X�Ǒ�"�H�8�@$ G��+���Á�8�H ��p �Drd�����x��8r�@$ 8�@���ȒcwE\�}8� D��pd9�H@�,9�q���/�G �"��r��Yr�㮈kb���"�H p��, ȑ%;��v\�^��D�@$��Y �#K�q�qM���@@$ D�8��"9��`��ߎ ��k9�H ��p �Drd�1��"���>��"�H�8�@$ G����q�x�# D��pd9�H@�,9�qW�5�ۇ�q�@$ 8�@���Ȓ�W;.��q�"�H p��, ȑ%�8&v�p�? �Ă���.�kX(�d�ow��^$��).�Ê��ڕ�Ģ2����}�����>�𖑞�~�)��:ٿ����:���b��5�����#�}��c-7^��)�~lk��;��+����ܹ� �]($�ݤ�/�kH���z������k!po.c[����}�E��v�- �6���=��涺���"�����&�]���������s�5�X ��؊D� ����*w�SNݱ���}S�����D�o5m�{n�P��]˦ɗ��e�c�c��l���5]�[���fY�;��/$<�W��3ۋ�wo*6�=^�G���G��[ܱd]���{J�~��~oc==�O�?ٞ��Uv�R�����G���ϟo�:N�ҟv�iU��6�'m�����?=P�������}G?=�T�}T����q$�U�R[7�wUv}l!������=���g�cv铓6i{-�����������vͺR[��O�t�w �b<�e��� �~,�=ѯH(f��}���\�(z�{��1�5�V�J�>r~,EB��)f;I���s;��Jˎ��;J}J$ߩ����jo����aS�ʊ�a���5^��� �����T����#��^Ǚ�sߛ֟h�+�+�����wQ.�4m��� ���k7��]~��M����� �MW60������|���f����6�%j���N�����ƾ��e�����s�n�4�|�6������}��u�#^)�E"��|�"�>�)I��qe���uM��U~j'��j�}k!��R$:-d�&kf�\�}¡⭗w��d5��*���[��+7gUc��J�^꾚XF��Ua��y�Y$ܯ�r�D"����8n�˦��X��S��:�_��X��Ϥ����N5'��R�Q �1Msל��e-�����6n�xĠz���Uy��R�Q�һ�����Ne��X�]i���d�$�%�#�q�_��q<�w�m*�6��Hh��R>�}{��5y����gc]zܤ: ���i��;.���Q��n.��8D۸��R$49�4�lr��8�r��'����t$���' #���B>������޺�|^ܩ��bR?��'�Im�UTj����8嗋'{�j&�ۧ U[�>�K�z�޿�� �Gy�����(p��\Nm�Z$n����})����V��O_x�}z�O�I�[8�ꢀ��{��Ui����)��n\�1��$��V�[��؊�_&��U�#��u�����f9�S����_��7���.��.[��n-�vN��M�d.��_�{���NOR�iz�PY��{�K��Y��0�u��u{ �V��ī^�z�n��Ǐ�����S��nSٻ�������G��ژX��OO��:]�\D��b��Q�H�}C�K&a#��_��_:�ט;�{��g*U^(�c�� �O>)޿,o|]�~��Z����>��?�g���V$4!&�ۯ����W7&�'ξ���ŶT$�ݺvfn�Ea������>��ƻ��k}f���W�wz�nŶ�z��"�������O;���/`]�(�E�G7�l��qd�_�q�GׯT����c������y���q>�����Q/-;���D"��vJ�0u}�_�뙋H�-ıߴo��D�_��υ���7�}|Rz��T�yt�J���{٢H�ޑ- +���߼��p�+9��{�"�1Y����{�ұ M�4���U땗��T$d�K:����A�B�����e�+Տ�z}q�8�����}�R?a���;z�L}\JmS��@����*N��ʧ�M��?Ӵ��8�v�qީ�'9^�O�M�e��H�}U�M�X��\D"����b�ظ�J$T�Oe��i��~@�:�� +H�؏7E���G���Gw�W�p�N"Q�{�3h��}��1�c:�"1�IKo�Aǟ�x�3�XM\o��0� D���釄�Dxu��,������"�H�%����?"��Ս#��#�D�"a�KX�80�@$��>Ip��� ���/ D��pd9�H@�,9��q��.� D��pd9�H@�,9��߮�9eN��"�H p��, ȑ%G�;�٥��"�H p��, ȑ%����2��i�@$ D�8��"9���wǁ?�T80~@$ D�8��"9��`W8~�B�9��"�H�8�@$ G���8�g� +Ə�"�H�8�@$ G�� +�oWȜ2��r�@$ 8�@���Ȓ����R���q�@$ 8�@���Ȓ�]��� +�S�_ �"��r��Yr�����]*? �"��r��Yr�+�]!sʜ��D�@$��Y �#K�~w��K���D�@$��Y �#K�a� +��H�⿶ml�{��{������)"1�"q�V��4���;�պ���������/���3���1]�򸤾�\:.��u N� D�� �f�G$���󾩎�q��L�eӉ��'�頋F�)���"�򸤾���]���:���<�d�M��:�ө~!� Z$R ~��H�'�^pOc.��^�B�~���'�1|��h<����KI�Xz�x�����̹R�w�ӧ�.�T�{wO�Dl��ӥxG��)f�Q$��۪��͋�6c�i�cWz��k��qi�ם�]v���o�-��*ŗ��[6��o�9ƹs�6�]y��R�E^Y���S��_}��{ǒuM�n���_���q��<�tK����T~����|��mΞ=_o���]��ˊ���#�fUc�6����`�H��H����?�,6�=^��Z�|?��"�MW��߰ZXu��Ƌ�s{����u�+/YQ�Yq����r�ՏH�Yq��^/����~-���;7[�NK���(�[O�>k���%�����ʋ��i�"����������qOm(K�}��z�D��Wv��v�X7�������e��%<Ϟ]�u[۲���U���y��z;/�=���b�����6l-�1^�W�����Xr���o�� �����g��S��8�r�n_�Y:���H�Ho0F1��Noz����cg�7�(]����h��˾c۩���;6�K����~DB��W/�-�Zc�~��n�$��z��]:��l�^��~��G�F=��� ���g��d_|�˱�R�뭗vUn�>$d�9U��_�sl�9M�i�~���!5r�29{����!-�Nv�hU��<�g�N�ھ�̎z�~EBGi��=T�E"���Kc�H�L=���_����uj���aωS�?y��T�X^�]v�����Y䧸��+ׇc�/����5Wac��u ��0��q�n@/�܌;kO��i�"�{g��J�_�]Ή��n?��K$|D��5��G;�x-�u�r[���?|M/=������6����cyLi���1R�~�Y�����(#��2t&�n�n7uZ��������v|jw��� �T�i�L�"�q�ƶoOY@�H��οȯ������ /�7�;��J�����y���a�D?׬�A$:���gG!�Ibğ$��/G�����\L��E�e��[$���u�Tm�{cws������v�S�ů�T�"�z�����,�]ˮ��:�&�~�m��WAZl]g<��>�"���z��C$�&�Ml�ٓB7�u���S��/⛖]'�EB6��Ő��S�� ��|�K��0Y$K {���jE��[G'��ʾ�.^WR��m���⿮j�u�N�l_\�rܤ~u-�z<�*�lO<���_�]�G}n�t�E��k�"1�� ra>�ԾX����E����|q�'�������Btd��vޮ�x|��B�Ɉ����k�N9�H �.���W<�ؾ�伏#�(�@v ��3�p �Drd����}W&`2i@$ D�8��"9�䘴��Sh�"�H p��, ȑ%���]��ɤq�@$ 8�@���Ȓc�vL\/O p���"�H�8�@$ G���wU`&��D�@$��Y �#K�I�1q�<%��v �"��r��Yr��j�U� �L D��pd9�H@�,9&m�����9�H ��p �Drd����}W&`2i@$ D�8��"9�䘴��Sh�"�H p��, ȑ%���]��ɤq�@$ 8�@���Ȓc�vL\/O p���"�H�8�@$ G���wU`&��D�@$��Y �#K�I�1q�<%��v �"��r��#9NO�+Ξ=�xf�\!�~w(���+�n�o?��Ϝ>�6���ɳ��������g�*?l{����Z�k�Ο����0���^�k>���94S����;r�������� "1G����ѻ{��~����Z,����WUz���k�7��7�8��߾�d�c�3M{���8FjT���� +��x�6D��o��ч|�}q1qA$��n�Qy���U��q���y�5�E"�3]{�U\Fu\)��/ Db,DB7���oX�����͟ ]�� DŽڥ��5#��D0��G$�Y$��q��w�ts�Wu���I�ˮw��7��v���?��g����l,n�f]��ڿ�n[<��tU�g�_W�>Ix�1Mɹq��R|��Gi�SBl���}�?ƭ����s�wKU�m{z��5\yI;���cM [�S���?kG0�^y��q}U�I$��|q�c�T;��kS��mn�jm������|�L ۪z_��wZ���\qt5w1B$�$�f��m��1,�Ou��mw]��A����;[7��-��e{��]�x�}�ycZľ��e{���b���������}�E��lsYu�-��ʦϾ=-��H����/����Bc����ݢ�w*_]�R�>���zy���M��H��8~�^j�Ǫ_�6�H��v��i'��&���~�\�����h����h}4�>�H�:6_癙vQ�x=���Jm���\9|����M��1�oݧ��@$�$餼����-�ߊ�����z�}s��9���{�捖�]��cG�d�%?����/��j�"!QSl=�9��_|��Y�����u�(d���E�ݳ�/_�K���/�>R��R����/dㅧ�5c�X��_kQ��iN$��I�G������*��E���:�x�������[x��?�;��~�ꃷ�T��WS�Oڛ0D�� �B� � M^���\���ͭ�׵�,��x1�mXs���qX$n�-����?�dc�S^�^1���E$CqܯlqW��9���X�g��*��9�}�&_��O�T$d�t�Q՟�u��-j_��1)U��mn�3�sY~�H�.�ql1}��gZ'�m���2W��x�>o�96i�b�HԈ4ˆ��|�㜴��;G.��#�>��rq�7��U����۵��n�cHS�ٮ�E�qr� �7��U_��SL��*i?SN�ͣ|����G$jD�������$�I������Z$4&��TG?�=n������N� ���4~������J��~7�o7ϓ|���?Í�+��{���o'��g�i��@i�ʩ�}w 5�͌��K��/��z�Hؖ��[��Oߵ��ܷl�+��\ÿ���8D�F�Hʹ俩}E�����GʶN�,���@����5���>�p_������wj{�˯|��p[�k�A�=r�>N�qP1���o������ k�w��Ծ��-�N�~y��3Z�S�p�^ƦO�u��*���R�����;���0�j��hC$(�H �yp��Q�R"�'�Qc� D��49P�>��y8����H�@4�Q!%�ޢ�#��>)�J���|���"�H�8�@$ G����a ���e��?��"�H�8�@$ G��↿�c��as�@$ 8�@���Ȓc�;�g ��D�@$��Y �#Kvq���1���9�H ��p �Drd�1� ������"�H p��, ȑ%������`�@$ D�8��"9������EÁ�s�@$ 8�@���Ȓ�]��wq�s0l �"��r��Yr {C�����9�H ��p �Drd��.n��8�96 D��pd9�H@�,9����v�p`�@$ D�8��"9��`7�]s� ��"�H�8�@$ G�����?�h80| �"��r��Yr���.�9`��D�X�"q���;�a��ĽB��IDAT����D��B�}����?�(Ν;���z��J�N~�~y�멇� $^��Һ%��������c[�} ��O�G$ Db �E���vQ˵��� o�ڱ�Tsa��� ����-��{K0�7_i���~&C� Db�"q�k*c�vQ�m�A/b��ѩn��p�a��I'C 4ψ"Q�����I�o�w�̴��-j��cɺ�'���q<�U^[�ߴ�x��>J�w�`y�m�����]�������Ծ�����m��X\���ن�,�[Cp�i��w.���O+�c>y��������<�0 �Ds�� ��H(��+��Z�m���(�M�vͺz[�T�s]�u�ș�viۭS�����L7�`�+/YY����j7��4�H�%w���b�:�Z�U/[��o�v]�m��l��؇lݮ'��GD:q�@$J L'�t�KE�����E�凛��E�*��X�k'{���k�����ȡ�QS.�w_5����Ҽ�Nm8Q�/��e�D�u�_yI�H<�x��[�����=�%�0��D��y��D�T$䫧-Xn�[���.��x�����WC����ڥ~�S�7����G�Y�_�cv�z��-�E$֬8Z|�Ξ�� ��q��u����*�M۸�MW�m��u��C�@$���_"U��bą,�U?u]�Ч1��&��k��o�zm��}�R��J�����l�$i�~����������mfN�k���(�H )'�RF$j7�\�m��H��H_��EM��V����%�ϟoK�5�K����|�{�q�|�W��{�J�X�)�Cl����@��H� !�S�B��c9CZ�/"�=m. "E$�Y-�)�r"!?}��M�l���ܵ������E{�M�H�����/�#�hS^����Z�֦�*뽆�J����9�''�~����vݪcm�,K�ԊmG)"�HD>�5�H�n���H�ߋN"!|���R�.o�����7���P�W����>]�c�8��Ww�ͭ��Ģ6�W��N�Ċ��?�qu�7���Gq�y���s�DBO��P9B�����4~�!�m������0��@$���\�M$;]�~����;���g\=&�ĺ��_U?�.�;��^R�\��v6��핦?�ˉ��Zl�^B�C�7�w�w8q\�G��"�rb.eD�(-<���_J���_ ��:@́Ԓ��Z�[������@�Y��O,��o��b��� �?�}�$:�$9�C27n|�G�j����X7�KѦ�b��7=&c�v�ce���t.��'�[��¹ႌ��n�.IL�eG.;뮾����� ���ܲ�\P��_Tt-}9��!�V]n�H_:�kstS�Z�R�������6?�����#��'&������zpo�Og�����9�,ie��n H��I�w���vm��t���5�l}7~\�ǡ�������Ze�1'�j��Ƚ��J����$� &+͝��;�?�Ưu]M�w]��1��8��ٗ���G��r����e���gO���G��.��v�u�[}2���̼ug��$q�rvOG� uֵ����ڕ�<콒\�p=���0L�U{�:{w\��Ih���?�h���l���j�7=��& H��Ib�Ɓ�x�d�6��q[}L��-mT�䕪���S���%_Q|RHOI�dc㩯�I��y)�3��.թ�g�h��R;�����+���E$�� +����5��og6�����_r�jɱ| � əNKk��m~�t�H�����|$;��3:�GZnR����o�N(��=rp�j�v@���Gu��7��إWN�V��6F�=T߈^��+��xF�������@ԙj�w�ȞZR�?1jkI�>?��e ����f��>x�T�}Q}}]~��b�+o2n��1���}�]���)w��$:�$> \ +z|Vb_��KVJ���6+��F��������U'Sgz-ue�N����k�HB:��t�zBy]��>o,�D����ZE�_ ��HB�YDn���H�|lN�:�v+���ܑ�Wu�d,5Y+[�(I��F�dzI�E�D�D,µ��=�u _eE��o��ՅR��j��Ŝ��U�w��s9�� 1��V�Y�2͒D���s�p/Ź�Ҹ� ���IQ�9gl�$l쭛��=;4;�l, ��ήB�� I�˙��z���D�������[ jw���,���Gm1������~�)�DPHWh�{wg7�}�r�!yW������C�%�W���;4wlͭ$!=ﮬ~)O�!�����Hy��ʺ��\�޿iz�=��0����8��l2�$:�$t�h;0���Ȧ�k��z>�^��F����c�q_����[jO)Y�R������-���B�FIB�����A}z�J2���EmI�I/[O���қ���$���6jt��~���5�R�\������20Y_$��d`�꧐Ę#���)e=Eb��,�{�d���= ��#|� =��&�y���I��n�-�7rd+Ǯ�/x�`�W�B�}$�-o:�/^�9%�L�g3�r�_|6�����泫��Ћ�6�~����df�=�h~67[c#$a����n���C�QH�۳G��$$k�׽}*Y��x^6=J�;����|���D�ݗa��M��;l�I!�& �`�g�R݈��Pj�HV�~HF�}�2CH�}�Bz����Bm���3�(]�R�/�L����t�5C��;���nW������d�-v�[ACgҧ�ݐV�% �͙Y!�ػ�읍e�sS�ߠv�q뵧n?H�(� ����>�0���XtƁ� �a @�$ ��b�QpY�#+�]z �$I�0��$G�-�V��@�$I�0��$GDV�� +�`�^�$I@` ��( �G/EK���0�$I@` ��( ��U8��.إ�0I@�` �HpD��K�k�� �1I@�` �HpD�Ad��� v�% @�$��b�Qp�R��Z9;a @�$��b�QpY�#+�]z �$I�0��$G�-�V��@�$I�0��$GDV�� +�`�^�$I@` ��( �G/EK���0�$I@` ��( ��U8��.إ�0I@�` �HpD��K�k�� �1I@�` �HpD�Ad��� v�% @]D���$�>�/y��d����;�wW�H��;�������m2�kC�����D�}'c�����m��e��zB�$��$FGo���nz����yO�O�m� ]�������/��kK?��HC�)��b�kk,㜙��$�$;�c��l���vm4%�9��Sp���Y��42^Ye4��W��ZC��)�:}o�j�n�$�%$q�F8ʐ#�d��*'Wȍ:��w�E/O|��@����ei�B$�����{��X�yכG��[O��㮛�It I��u�a"0�.��z˻�n~֝q�p�,up$u��W�7W�m���e5ӣT�O�ޛ�^~�J�+����ʙ����_�/K�I���X��[Y�n��'{=O=�7w����GF—&�5���]��bs7yK?ߐ�6��=���J�AZN$��$tP��u��b����ܾ�:���v�I�VW+��K +���ee׉Z��[uw�|{���]�:���y��|�;�����f�+��կ���W_�/�T���^����9�k�9�uʫ�% �k/���8��J��ؑ�y�?�r���/�D���v@+}���(YO�������B�T����R����s�jk���?��k�̵4�:%�W��w��zc�.���i�)I��X:����zkW�~!����ԉ�\�d?}�L^V��\������l�z#�F�ec�����3���It I؆�<������s�r&릪��J$s"n?��Pr����1��G�U�Y���M�������^������>��2�Pڦ��O�ʹc�y��W���5����m�:��T�g�$ak�פ��‹�S׹�ItI����淖ϝ�ʱキU�E����ټ�C�o���D�>�sݗ���$�w2��j����錥n??���'�X�^��^�DI"�v�w���-��\e���+7�@]L:��U�n��}����WK�^�����䔏9u�3�; +D`�J����&}���r���U��?����rW�^^}C��B�$��O�z&J���]�� �ӳ,��=�teȗ����$Ɯ�k�N��醜��Cm��͖�y��c��/&�z���]\y�����\\�;X��h*��Wٓ8n����T鳱Ξ�Vs\�[+�����T�g�$� ^B6��?!y��� �' X:������p� ��������?���Uun��__x$�ۺ�\���}'���P� �-^"����t����ҙ݌v�?1�x���?pv8w���._��䦒�I��t��c=������k7�m���$��t[��G����Hl ��'�D����� }��.��dCr�>=[�SW����ߒ]r�-�?z��S�&��ԓMV�_-�}ݼv�w�D��x�X����qCy�L�$�j=�HBkumfkW�K������M/i9��H� H�6�o���:�";�QL�������M���5����S�e�K�L��?�V������I~�`��lI@]q&Q������%GV�]������|$yx���wOU���7�H��ܓ�\r�J��I�1'����N�$���l�gr�o�8Q�v���9��[ݝ?ݞ����}�=�����a�����$rg׉�d���C3vldd`���� ׫��y{����N�ya�����$:ډI���Ss$V�9�P�E�״���CmV&m�S�έ�3$It�3�X��d�����ʍ��]?�\b�x�頭|�6��w�����L�Z�=�cOH�:�N9�$���w䍒��?z5�az����v�:�D{��owʭ�;$I�ή���IJW�V�=��]��2~�d!��:+�+i{� +I@U���‰��.%�ku���h�{ǥ*���-\Fr��� ��:3���[g{H��r��t���$�ݲ#u�[6���Q��d6� `xx4���X=$�:Ge6%m�M! H�'IB����S'��:sF##E��_�,���[K!��;4�=i�lI@���պ� [b�n�$I@` ��( �G7DA��h L �$I�0��$GD`����� @�$��b�QptC������0I@�` �HpD�A6� �a�n�$I@` ��( �G7DA��h L �$I�0��$GD`����� @�$��b�QptC������0I@�` �HpD�A6� �a�n�$I@` ��( �G7DA��h L �$I�0��$GD`����� @�$��b�QptC������0I@�` �HpD�A6� �a�n�$I@` ��( �G7DA��h L �$I�0��$GD`����� @�$��b�QptC������0I@�` �HpD��mط[/$K^:�3����c=;#�� H����'�ݴ��{��pamkV�He�{��oj�v�Z�C�D��v�9�����:FFn䄱u���Zg�i�b�^ H"w��vP �N�`��c�5�������I@��ƱI@A� �]b�5W���y)]c�$���/?���ݗ�6��� r7nTh�}u� �ec�L���$��|�*�}�d���������zk'�PʌH��h�u��P��8��`�;�:�}m�O�7G?뮾d���{�� |�a�ۧ��ˏ��L����n^K�~#�ޫ��w���(ʊH�ȝhYA�ȼ�cW�����#D�� oFr街�$7gfv�!Y=>�׵��\����GbC}�� ʌH�:�2����T�@�0I@�` �HpD�A�־h [c�b��$ 0�@������� �"���$I@` ��( ��Z��5l��ˊH��$�Q @�# +��F6̋� ��$I�0��$GDk�ְ5�.+ H�` D1I�(8��0/�n0�> @�$��b�Qp��/Z��غ��$ H �0�$8��(kdü���@�0I@�` �HpD�A�־h [c�b��$ 0�@������� �"���$I@` ��( ��Z��5l��ˊH��$�Q @�# +��F6̋� ��$I�0��$GDk�ְ5�.+ H�` D1I�(8��0/�n0�> @�$��b�Qp��/Z��غ��$ H �0�$8��(kd3�y�Yu"���m=�^�u��h�^�?��lϬ}��_�$I���%�xh��*B�%���W;�����$ �.Ā���paoU7g�B�x�Z��nKH� D�A7U��3�u�OV�E��+ �O�~0ng $I4Y*��ׯ�(�x��U2��+�<���T�ԉ�*Y�yL�Ŏ*���#}W.�T�h���I ]����#� +�\���{ ��K;�#���rY�n*߸Qqf�m__��42��6w������e$�5�W;s�6Ok�����-���[�mI@ ; s>ׇ+�`uv�-�8up[6�����"�a��ʍSs����8l�7p������ct��N��=S$��-D��yk�����b��ݕ'r]6���� �-=_|V!�����b��7�&F�f��>Z!���O���+r�����љ|L��|�I��] H�!�q��p�|�e���5�R=rfrv��5���ـ՛C���o�v����9Z{(��\�x=�eѺOwܜ��:�=��_����ۦ��|=s�V�jiqV�veu1��=��P���T!i�oz^�{�j\򐅋H�h�a�w����vA���ܲ寍� �m1�x��`AN����}tP���=DLֶ��i_�$��ŧ��s�5X�6;�ں�\>_����� �6=6?+�lbrL�]�O�㚬����d�߲#��ʑ�( �$ѐ�9#��Ǐ^�rX֦�uf1�x�Xv�������i_������}�dp����!�pu�ywn^r��bc��t�79��~��ϟ����1T6��Ml�'��I������&��'������B ! @�D�� ſ\�Q���|�-�C$���|�@NV/�"+���^�mv�"�� �� �O����]�l䒇�Gr��O��1�H��!���W����'br�H�a��$���K��KQ�}]vQ9�����O�:����b=���g��K����5���x�z*�:wk��su����R�h�׬*>����������)&+�l�v�o�$���t[*=/>&T�!�,\ @c�k�q{����������n�~�J�����h�!�$����<�R���y(���$1���x�WP���ң�&'ݺ���'�1E&k�q��`^7:z�j~1���͐ĝ?�<�e�0=�}��y�m����e�@�DSÜ��~�y�I���w9��ꀋ9D�$������pS� ��˳��\�݃�' ���T����iW�֣��6��cz�l�ջ��T6��ML�Q���$W��?s�Z���I!� H"wR!����h�.g(��[ݷ_�O�s�����K���t~�)&h�`�Cv��v1y�?��J��{dmJ��:�uH���I�8�����˗�37_ﴱ��B���Q�,\ @�Ĥ:,l���|D�Y��%۫n���>{Ѿ��t[C�$х8z��8���8���CX�D:���>��@��= +koij�ݷϓ���$��` �HpD�1� +��j�@�1I@�` �HpD�A�W�(�=b�&�$I�0��$G����( ��$I�0��$GDy���#�h�1I@�` �HpD�1� +����@�1I@�` �HpD�A�W�(�=b�&�$I�0��$G����( ��$I�0��$GDy���#�h�1I@�` �HpD�1� +����@�1I@�` �HpD�A�W�(�=b�&�$I�0��$G����( ��$I�0��$GDy���#�h�1I@�` �HpD�1� +����@�1I@�` �HpD�A�W�(�=b�&�$I0p��v �e���Gz�BK��s��m7m+|��_j��:�G��&�y�@:��l�g޺�`�W�j�~�?i�m'� $I��Q�w��� ��Zr,/���m-��n�$!����8�������Y���Jf��B��ӎӟJ @�DK��'�N��p��cU�L�^�큪���DH���5�Zm��� ��b��$Z��9��������b��s���ϙ�'���E���L��?���3y���/I��;���6wN���1V����r��������%"�C������Y:44����pe��X"_���3[Y?����߻�r�ԃ{��ˏם���<�Q�$1a�"�.�|�Ե�uɡ��9Q�GF2G9햌P��[�����ΟnOu)?x�r����RWW(�>n��r���2yWW���m}�����'ggvte�of/\��! �$Qp�>@)o�|.u��Ț���n�Z�R#���g�zs�&��C3v��dTw���*�;n�^�3�������U��ݗs�X?݃��k�Cc�.��59_�՛)�"�$������'K^:R�Y�v2���c�;nΞ��v9�E��ܻ���՛n����'��LN�z\Y7/=���D�]Y˫ϊEG��,�ha^�֡�}{���'�'��$ �*g����ݴnD�d!�]�.&�V�L�M��U.1}��tp ~��;� +����T}k��Mr?9[��6�jץ1��^�ەw۔�uW_P�ڞ}d_���GB��H���#9ql�����X�$��ܯ�E���s�h��R��6��X��G�v��ӊ�����e�n�ۦ��G������mW�͕#I��$I�đ�a=1�@ p��]Jܗ�b$ag�# +��-k�u�&�n����Tv�Y��I~�L�C���R�-[��_�b��q����P$���m##7�ٺ�\^o퓙�M's�ft�|>\s:�������s�C���o�zC�ԕ�2$1I$q�/2'�x,�o���u�1�9�zBy�l�8;��q��cAGu�O�3���&�n2m:�9k>{w_�Gm��T��6��>qR�$&�$t�<����A&@��d\p~��tNj{�b;���?��}��G�[�7*d��/755�wl�c�>:SX��"Y���x+�$.^��듬�?����)�9��ܾ�y�2�w^JǬ5_����+^�9����������r����x���/���ʼC����xr�����x�-?:��Q]��75=��47���k_#h��<�`.c�J��y����Sɿ��DP��K>N1�@c��g��Ǐ\-����]i��OHLV,:��݃i��g�:��5ݒ�wͪ����]NqoT������~3樬n�c3�~j}�����̼ug�ޛ'9&�Sݱ���}�ee����Io��I��|��=�?��?G��kʸ�̉���M��Mt)���o.����m��l"xu~�$��6�tطٽ1�̺�/�,�rɱ\��u?zm�s������w�LV����r=L�Ƌ��ƓmD���Ej�f#]��u���I�ޗ����$��'�3���O?�/Q4�ʙw�� q�~�P%2w��$ou��j��[??����c$q��P>7#�ï��P���t�Œ\�J�o�����!Y�I��=ql(Ѿ�����,"t�tf�����l��ڕJ&t6�z��ez5_�W����l|ɸu��c$q���� tL�_�����O� +I@@ʘ�.%�w���g��Ou�VݺP>�Wr����Z�1=1�闎7�VG��WF�yZ��֬�5����̙����]/��g����5WWFrV�Tu�zk��mVvS��ʊ�]�z��g��R����|]��b$�������ڥOg����j�$ � 8B���:=#�6;]*R?���6���MX_.4����kj��9h�X}�$�q-���{��֬�9�����?x�T�ݵ���H�{�K8��~M�9;k{��Uc[����������]�1]��/�X[#��`��N������|��% ��I��U^Lj��Tm�$� ������՗Sbs��]���������2չ}Lίs�=�mn>�W����C���X}�$�����6��K�;������Ĭ���#����I���))��%F݋���g�S7��Y�̟b>�ͩ����iL; ��%;�p��s��!6�DHb�c3��R�I@�傣��؁c�u/��[���Ƣf�>�7Tg:�4&W��:������l�����5ݺ�b���~��#6ӡ����O�����ɦCN_��|cs�ջ�坽���ۛE󳧦\ݖ�u��I�i-�6=~ҫ��\h���Dh=��zH����2��������������p��0I��P���.�H�#5;�"V�S[H�� �1=���Ǘ�9]��eM�_�.�X�X��s����|}9���_M�dOo��җ��@�}LFi#{��>ή�������*���;��ǏfO�^��q=z�����o�$a����t�^�� I@9( �eOgߝ]���h��W+���Ν�]���V��ĕ۽��ƶ{����w�����t=�����-����1=��69����O��^n���rh�����UX��4��n�g�5�s����H^d�ݺ)j:]�đC������/7�N�!m�8�?��`26?K�s��!���0=J��IH֞$R���.ݭZZy�Vu��Z� �g�51���$$�K����^eH�(�V��� ��7����79sR*�kԙG���W� U�\`:��鶲��8"�U�c2w�\9�U�,I����ưt��J$)9���F����\� +�csb���wϯ�'o|������s�i�W.�*f�F�fx8;s0=z��_��BNۗ���b2}��� a26�DH����ݕ�'�|yʍ'�'1vlʏ��L�}���C"���+O\����OH��$�@�`��ht����B�LA�� dKH�1����'��/7�P�D؉k+�! H�` D1I�(8��0/�(�@�0I@�` �HpD�A�־h [c�b��$ 0�@������� �"���$I@` ��( ��Z��5l��ˊH��$�Q @�# +��F6̋� ��$I�0��$GDk�ְ5�.+ H�` D1I�(8��0/�n0�> @�$��b�Qp��/Z��غ��$ H �0�$8��(kdü���@�0I@�` �HpD�A�־h [c�b��$ 0�@������� �"���$I@` ��( ��Z��5l��ˊH��$�Q ��$���?� �S��V����$Z=A�q��: @�fFO390�����ؾ,�$ H �0���$|��X D,ID C5�X $ $ +��X jH"j��X�X `,�$5 X `,I�,���Z����,��@f����d��דU�V%��{{�,=M�s���'��?I���$��_zj�Y,�5,0� �s�ͫ���_��i�,I��g3rA���L ��ԕX����#X�v]W��Eն�K kּ�c��u�ĉ�~dd�m�|O�ă�������s��}fA����?��9]Nx㍕�…�T����4P�6 �ڵ+��Ç��������?f ;~}7�{�$��k�-{y{F?[�$}��$鿔$w��/�Y��oK�eJ�m�իW�����k.�̙3����_S��ε�]Zz���E��?�c�_@D�� /��]S� ����k��{��L��ݜ�3��-�-��d���:��}��G�%�=�y�w�N"$O]�X�0q�𑚓���~Ā"��� +;��gH��cg ��{0���*?�E&��!�����.#m۶-��Z��s�Rg�KR|��F��� -(D����DC�+������ +�\/��'��Ά$J�� Omhh(=���:��t���$t�1D��������X}�q���e��'���Y��W_M����� �A�O��S7 )���8���+j�=h�jƿ�v�)ִ�E�&4o�� 9���k������z�α�ŋ��}ݴi�)��u������}������:��'HB�S�i��f�.%� ��_�Z�����!=����s}:��} �����?�SA�}�I��������8Qhsc$�Vw���κ�@ovŵ���lvȷ��V�Y78��N��>+�ӟ�T5ՙLUc�T� I�q�h/cm�D�#]�e�^�9�7�|+�祗^��h��i�R �������+���k��7����kj���ƞ!���N����D'ø��u�ɤzs�׷���ف�2���65ػwo�};v�X:1�@=�A�z2S��֍ڵ$q����� A���be���Y�A����u�m7n��a�|�6U_�~�띃�����>���v�v�:$ku&o�nL��$�Y��ޠ���$�i�LP��s�������K����< �@����Ԏ;�cǎW-���۳�߹S��HS�$ϧ�,`{�;k_�rU݅-_��'0��$����q"�\�$ԏOg[@��_nm�"�/�hZ:�Zj��{12p�[ݒ%K����W�{��N�� I����h�bm�ǧ�-`+W1:[9?t�-�}�ǜ��U����O0������� Ih�cDP���β���P72�����l�TN"��O5;�8�оٛ��_�q���3�����=C�y��HB��t�t`���S�N��~7=y��%�#>�g��֭�K���a�1��,���{�$.����~�)t6!s���Dz��J��=�[��Y�~�ϝ��J�{_~�e�<�~zO�O�Y��ܝy#Dq�Z��,��k�� #�\+[�z�[��Z��s-`BQ��u��G��L��W�m嵀���g�m,L�Q��|�"A�H=C��&��t�RCܟ�U�~�%<��|�Z�~��x�u���w�������O�"���7��!��V��������r�؋�:����@�X@?���.�O������^��ęD�o2��X l�_�9���o܇{�F-$���*���$1.�� `,��$zc�Y%�X`\�$�e6:a,�z��Do�sϮr``�g��k ��%�}�]E�"��v$jz|�G�)<��^�GO���[�� �†��?e�wבD-���/խC���� +�寕�����6򭵀���z�髯��ћ�zs6���,�c~�!��������>��$C� Y�����T�ZK�0I-l��V�i��Ol�����իWU�˅�V�y�J�� �Й�\�$�����;�~��og'�?��$z�Z���%I�/��<�{{����I�Vf}��Z ��@���|��tP����[�~z�a#�^߷�Z�V�_�>-oڴ)�n��{k���y��\N��������ҽy�穌���/�e��Gy��Ö-��>���?:R�7�|��/^�� +����V[�6���i��D{��>���C����������e_�իΰ�<%�~������R9�Wq�ĉ4o���]�.ţ� +���d�W��-��H½�tφ����ι4-�:�����󏨬͗���Y_��[�u��uYT�P� u�ҥtn�*�3 �}Æ ��ogс[�~*�#���O�O>�T��?�I �9����ҿ�|�,�p���ʕ+���]����g�F��v3;���b�����Y� +�}�Y�$ _js��r-�Q���+�pf��M�liבD���c���cg ��W%ɚ�Vʈ@��|9I|~*k�εY Q�H�%�#Ё��d�M������_���ݗ6�Z-�8s�L�Y�n����lݚ]���k�裏Ҽ.�����,�v�ѿ9}����c��֧?�Q}h-� ���aäe[}�-+��Q� K%�����_ ��˹�Z$�ykGg�3�+[ +I��ȂmI�ws*[c��������}P���$� + �Ѣ��4���L�? r��V�$^~ya�k�.��_���;�򍐄�@�uh�2G:��?�Z�����`C�'7l�,����+�����.Y��Ю�T��d��M�Џmv���ϱ�駟�]��.k����I���?�����ʒ�:���v�2���}�/�6���.S��\�}ԓO�-P�|�ݶ��ԁ�\n^��Ib۶� �s��HB��l|9�z$�����?��� [�6\ۚ�׭[W����r*�ƴ������1����[e�X�.e��I���[jzʘvI���� `��X@��̉۬철�+V��>�`m�c�3F�X ����SEZ�]:y���۽`���I4e.����eH�����b,���$є��X �� ���oV��h��DS�B `,�[�$zk�Y-�X�) @M� a,��@oY���f�X `��,I4e.����eH�����b,���$є��X �� ���oV��h��DS�B `,�[�$��W�YIDATzk�Y-�X�) @M� a,��@oY���f�X `��,I4e.����eH�����b,���$є��X �� ���oV��h��DS�B `,�[�$zk�Y-�X�) @M� a,��@oY���f�X `��,I4e.����eH�����b,���$є��X �� ���oV��h��DS�B `,�[�$zk�Y-�X�) @M� a,��@oY���f�X `��,I4e.����eH�����b,���$є��X �� ���oV��h��DS�B `,�[�$zk�Y-�X�) ��"q����2IEND�B`� +{"filename":"redux_state.json","length":13,"type":"attachment","attachment_type":"event.attachment","content_type":"application\/octet-stream"} +{"counter":0} \ No newline at end of file diff --git a/samples/react-native/scripts/dsn.mjs b/samples/react-native/scripts/dsn.mjs new file mode 100644 index 0000000000..da2153f203 --- /dev/null +++ b/samples/react-native/scripts/dsn.mjs @@ -0,0 +1,24 @@ +import { fileURLToPath } from 'node:url'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export function setIosDsn() { + setDsn('http://key@localhost:8961/123456'); +} + +export function setAndroidDsn() { + setDsn('http://key@10.0.2.2:8961/123456'); +} + +function setDsn(dsn) { + const sentryOptionsPath = path.join(__dirname, '../sentry.options.json'); + const sentryOptions = JSON.parse(fs.readFileSync(sentryOptionsPath, 'utf8')); + sentryOptions.dsn = dsn; + fs.writeFileSync( + sentryOptionsPath, + JSON.stringify(sentryOptions, null, 2) + '\n', + ); + console.log('Dsn set to: ', dsn); +} diff --git a/samples/react-native/scripts/set-aos-dsn.mjs b/samples/react-native/scripts/set-aos-dsn.mjs new file mode 100755 index 0000000000..521cb44a11 --- /dev/null +++ b/samples/react-native/scripts/set-aos-dsn.mjs @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { setAndroidDsn } from './dsn.mjs'; + +setAndroidDsn(); diff --git a/samples/react-native/scripts/set-ios-dsn.mjs b/samples/react-native/scripts/set-ios-dsn.mjs new file mode 100755 index 0000000000..ea1ca7e61a --- /dev/null +++ b/samples/react-native/scripts/set-ios-dsn.mjs @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { setIosDsn } from './dsn.mjs'; + +setIosDsn(); diff --git a/samples/react-native/sentry.options.json b/samples/react-native/sentry.options.json index 53ae525bc0..58425c35d5 100644 --- a/samples/react-native/sentry.options.json +++ b/samples/react-native/sentry.options.json @@ -6,13 +6,13 @@ "enableAutoSessionTracking": true, "sessionTrackingIntervalMillis": 30000, "enableTracing": true, - "tracesSampleRate": 1.0, + "tracesSampleRate": 1, "attachStacktrace": true, "attachScreenshot": true, "attachViewHierarchy": true, "enableCaptureFailedRequests": true, - "profilesSampleRate": 1.0, - "replaysSessionSampleRate": 1.0, - "replaysOnErrorSampleRate": 1.0, + "profilesSampleRate": 1, + "replaysSessionSampleRate": 1, + "replaysOnErrorSampleRate": 1, "spotlight": true } diff --git a/samples/react-native/src/App.tsx b/samples/react-native/src/App.tsx index 23c69e6907..83c2dc095a 100644 --- a/samples/react-native/src/App.tsx +++ b/samples/react-native/src/App.tsx @@ -36,6 +36,9 @@ import HeavyNavigationScreen from './Screens/HeavyNavigationScreen'; import WebviewScreen from './Screens/WebviewScreen'; import { isTurboModuleEnabled } from '@sentry/react-native/dist/js/utils/environment'; +/* false by default to avoid issues in e2e tests */ +const ENABLE_RUNNING_INDICATOR = false; + if (typeof setImmediate === 'undefined') { require('setimmediate'); } @@ -255,6 +258,10 @@ function RunningIndicator() { return null; } + if (!ENABLE_RUNNING_INDICATOR) { + return null; + } + return ; } diff --git a/yarn.lock b/yarn.lock index ddc9c22aa9..91d20f2005 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4401,6 +4401,13 @@ __metadata: languageName: node linkType: hard +"@flatten-js/interval-tree@npm:^1.1.2": + version: 1.1.3 + resolution: "@flatten-js/interval-tree@npm:1.1.3" + checksum: 8ff9dc4062b20bd1bcff735b6734d93489409af59f87db799abe534d745dd8cd9293a15e720a999058bc97c66b88f1cdb14f6142d122723ffe52032c5ca2efde + languageName: node + linkType: hard + "@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": version: 9.3.0 resolution: "@hapi/hoek@npm:9.3.0" @@ -8406,6 +8413,16 @@ __metadata: languageName: node linkType: hard +"@types/jest@npm:^29.5.14": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: 18dba4623f26661641d757c63da2db45e9524c9be96a29ef713c703a9a53792df9ecee9f7365a0858ddbd6440d98fe6b65ca67895ca5884b73cbc7ffc11f3838 + languageName: node + linkType: hard + "@types/jsdom@npm:^20.0.0": version: 20.0.1 resolution: "@types/jsdom@npm:20.0.1" @@ -8545,6 +8562,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.13.1": + version: 22.13.1 + resolution: "@types/node@npm:22.13.1" + dependencies: + undici-types: ~6.20.0 + checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -9658,7 +9684,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.9.0": +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.6.3, ajv@npm:^8.9.0": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -10940,7 +10966,7 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:3.7.2, bluebird@npm:^3.1.1, bluebird@npm:^3.4.7, bluebird@npm:^3.5.1, bluebird@npm:^3.5.5, bluebird@npm:^3.7.2": +"bluebird@npm:3.7.2, bluebird@npm:^3.1.1, bluebird@npm:^3.4.7, bluebird@npm:^3.5.1, bluebird@npm:^3.5.4, bluebird@npm:^3.5.5, bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef @@ -11047,6 +11073,13 @@ __metadata: languageName: node linkType: hard +"browser-process-hrtime@npm:^1.0.0": + version: 1.0.0 + resolution: "browser-process-hrtime@npm:1.0.0" + checksum: e30f868cdb770b1201afb714ad1575dd86366b6e861900884665fb627109b3cc757c40067d3bfee1ff2a29c835257ea30725a8018a9afd02ac1c24b408b1e45f + languageName: node + linkType: hard + "browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": version: 4.23.3 resolution: "browserslist@npm:4.23.3" @@ -11172,6 +11205,87 @@ __metadata: languageName: node linkType: hard +"bunyamin@npm:^1.5.2": + version: 1.6.3 + resolution: "bunyamin@npm:1.6.3" + dependencies: + "@flatten-js/interval-tree": ^1.1.2 + multi-sort-stream: ^1.0.4 + stream-json: ^1.7.5 + trace-event-lib: ^1.3.1 + peerDependencies: + "@types/bunyan": ^1.8.8 + bunyan: ^1.8.15 || ^2.0.0 + peerDependenciesMeta: + "@types/bunyan": + optional: true + bunyan: + optional: true + checksum: 3422db179c2f1d9581740b18de79c925e2ab25ee49ea5e66a5b66db16372d6f641927de55010c997050049d9e9569f4b720d409ffa0a573ded86aef5d49768eb + languageName: node + linkType: hard + +"bunyan-debug-stream@npm:^3.1.0": + version: 3.1.1 + resolution: "bunyan-debug-stream@npm:3.1.1" + dependencies: + chalk: ^4.1.2 + peerDependencies: + bunyan: "*" + peerDependenciesMeta: + bunyan: + optional: true + checksum: e0dd2c42de27857bd7c70b600ac30ecf7ef5efe7837c6ea2d87b98e48c7cd16a4fcce1d08439d9fc5dbff2d672b191357ea579750c9cd6379703109f5077bca4 + languageName: node + linkType: hard + +"bunyan@npm:^1.8.12": + version: 1.8.15 + resolution: "bunyan@npm:1.8.15" + dependencies: + dtrace-provider: ~0.8 + moment: ^2.19.3 + mv: ~2 + safe-json-stringify: ~1 + dependenciesMeta: + dtrace-provider: + optional: true + moment: + optional: true + mv: + optional: true + safe-json-stringify: + optional: true + bin: + bunyan: bin/bunyan + checksum: a479e0787c3a0b6565b54bd15f0b6c729d624c5aba53523e140e49e279b7a78508df93000e758bf6d02361117d6b4e6e5fc1d5ece05366fb6c4ba41bf1ac7d52 + languageName: node + linkType: hard + +"bunyan@npm:^2.0.5": + version: 2.0.5 + resolution: "bunyan@npm:2.0.5" + dependencies: + dtrace-provider: ~0.8 + exeunt: 1.1.0 + moment: ^2.19.3 + mv: ~2 + safe-json-stringify: ~1 + dependenciesMeta: + dtrace-provider: + optional: true + moment: + optional: true + mv: + optional: true + safe-json-stringify: + optional: true + bin: + bunyan: bin/bunyan + checksum: a932e883387e5bef23eee0f1f9af94e8b885da32492eaf7164dc58e3b42e5a65845068beb7ac8fbcff31511a55728c1a826bf48ba3e4edd7e220ebf0fe2ab989 + languageName: node + linkType: hard + "byte-size@npm:8.1.1": version: 8.1.1 resolution: "byte-size@npm:8.1.1" @@ -11235,6 +11349,13 @@ __metadata: languageName: node linkType: hard +"caf@npm:^15.0.1": + version: 15.0.1 + resolution: "caf@npm:15.0.1" + checksum: 832cc5d3a6053efb458ed1c1f5e5d3ebbc7710f2275f033c6362dcfd1565f15e29dbee15fa0f3301ecb5c4dbdc753c070b5a4a6d3dc8e246cb784cb26c601e8b + languageName: node + linkType: hard + "call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" @@ -11416,6 +11537,17 @@ __metadata: languageName: node linkType: hard +"child-process-promise@npm:^2.2.0": + version: 2.2.1 + resolution: "child-process-promise@npm:2.2.1" + dependencies: + cross-spawn: ^4.0.2 + node-version: ^1.0.0 + promise-polyfill: ^6.0.1 + checksum: fb72dda7ee78099f106d57bf3d7cc3225c16c9ddfe8e364e3535a52396482ee81aecd3eff0da7131ca17b7ba9fcbb8af827da63a03f0c3262c76268696898642 + languageName: node + linkType: hard + "chokidar@npm:^3.4.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -12281,6 +12413,16 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^4.0.2": + version: 4.0.2 + resolution: "cross-spawn@npm:4.0.2" + dependencies: + lru-cache: ^4.0.1 + which: ^1.2.9 + checksum: 8ce57b3e11c5c798542a21ddfdc1edef33ab6fe001958b31f3340a6ff684e3334a8baad2751efa78b6200aad442cf12b939396d758b0dd5c42c9b782c28fe06e + languageName: node + linkType: hard + "cross-spawn@npm:^6.0.0": version: 6.0.6 resolution: "cross-spawn@npm:6.0.6" @@ -12584,6 +12726,13 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^4.0.0": + version: 4.0.0 + resolution: "decamelize@npm:4.0.0" + checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 + languageName: node + linkType: hard + "decamelize@npm:^6.0.0": version: 6.0.0 resolution: "decamelize@npm:6.0.0" @@ -13047,6 +13196,64 @@ __metadata: languageName: node linkType: hard +"detox-copilot@npm:^0.0.27": + version: 0.0.27 + resolution: "detox-copilot@npm:0.0.27" + checksum: 4f01ed1f21fe3128ee50037b63085fe95ccdc9e723c6b034d53720fa325123e39d4f83d18b1ab88a11a679258b0ff734e74f0738118e260f10945fadbe205443 + languageName: node + linkType: hard + +"detox@npm:^20.33.0": + version: 20.33.0 + resolution: "detox@npm:20.33.0" + dependencies: + ajv: ^8.6.3 + bunyan: ^1.8.12 + bunyan-debug-stream: ^3.1.0 + caf: ^15.0.1 + chalk: ^4.0.0 + child-process-promise: ^2.2.0 + detox-copilot: ^0.0.27 + execa: ^5.1.1 + find-up: ^5.0.0 + fs-extra: ^11.0.0 + funpermaproxy: ^1.1.0 + glob: ^8.0.3 + ini: ^1.3.4 + jest-environment-emit: ^1.0.8 + json-cycle: ^1.3.0 + lodash: ^4.17.11 + multi-sort-stream: ^1.0.3 + multipipe: ^4.0.0 + node-ipc: 9.2.1 + proper-lockfile: ^3.0.2 + resolve-from: ^5.0.0 + sanitize-filename: ^1.6.1 + semver: ^7.0.0 + serialize-error: ^8.0.1 + shell-quote: ^1.7.2 + signal-exit: ^3.0.3 + stream-json: ^1.7.4 + strip-ansi: ^6.0.1 + telnet-client: 1.2.8 + tempfile: ^2.0.0 + trace-event-lib: ^1.3.1 + which: ^1.3.1 + ws: ^7.0.0 + yargs: ^17.0.0 + yargs-parser: ^21.0.0 + yargs-unparser: ^2.0.0 + peerDependencies: + jest: 29.x.x || 28.x.x || ^27.2.5 + peerDependenciesMeta: + jest: + optional: true + bin: + detox: local-cli/cli.js + checksum: 14a9a230f02c6e7e535e96223a9aacbef05c06c20887eac3d1f1df1aca612a1c529f94e265064df39d1c98ee700fbc2a26ebdd18affea5e60f17a527ae42d6e0 + languageName: node + linkType: hard + "devtools-protocol@npm:0.0.1232444": version: 0.0.1232444 resolution: "devtools-protocol@npm:0.0.1232444" @@ -13201,6 +13408,25 @@ __metadata: languageName: node linkType: hard +"dtrace-provider@npm:~0.8": + version: 0.8.8 + resolution: "dtrace-provider@npm:0.8.8" + dependencies: + nan: ^2.14.0 + node-gyp: latest + checksum: f2dc89df6a9c443dc9bae3b53496e0685b5da89142951d451c1ce062c75d96698ffc0b3d90f621a59a6a18578be552378ad4e08210759038910ff2080be556b9 + languageName: node + linkType: hard + +"duplexer2@npm:^0.1.2": + version: 0.1.4 + resolution: "duplexer2@npm:0.1.4" + dependencies: + readable-stream: ^2.0.2 + checksum: 744961f03c7f54313f90555ac20284a3fb7bf22fdff6538f041a86c22499560eb6eac9d30ab5768054137cb40e6b18b40f621094e0261d7d8c35a37b7a5ad241 + languageName: node + linkType: hard + "duplexer@npm:^0.1.1, duplexer@npm:~0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -13215,6 +13441,13 @@ __metadata: languageName: node linkType: hard +"easy-stack@npm:^1.0.1": + version: 1.0.1 + resolution: "easy-stack@npm:1.0.1" + checksum: 161a99e497b3857b0be4ec9e1ebbe90b241ea9d84702f9881b8e5b3f6822065b8c4e33436996935103e191bffba3607de70712a792f4d406a050def48c6bc381 + languageName: node + linkType: hard + "edge-paths@npm:^3.0.5": version: 3.0.5 resolution: "edge-paths@npm:3.0.5" @@ -14209,6 +14442,13 @@ __metadata: languageName: node linkType: hard +"event-pubsub@npm:4.3.0": + version: 4.3.0 + resolution: "event-pubsub@npm:4.3.0" + checksum: 6940f57790c01a967b7c637f1c9fd000ee968a1d5894186ffb3356ffbe174c70e22e62adbbcfcee3f305482d99b6abe7613c1c27c909b07adc9127dc16c8cf73 + languageName: node + linkType: hard + "event-target-shim@npm:^5.0.0, event-target-shim@npm:^5.0.1": version: 5.0.1 resolution: "event-target-shim@npm:5.0.1" @@ -14286,6 +14526,13 @@ __metadata: languageName: node linkType: hard +"exeunt@npm:1.1.0": + version: 1.1.0 + resolution: "exeunt@npm:1.1.0" + checksum: c0054fa49d7b3abbc2acecd4c6e34c6ce3a0370f9c31d18cdf64dad6be9a6d3fb84d93be892b7d1906f3f23051b3855bde7b255129fc49605a04392f69e98ea2 + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -15161,6 +15408,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.0.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: f983c706e0c22b0c0747a8e9c76aed6f391ba2d76734cf2757cd84da13417b402ed68fe25bace65228856c61d36d3b41da198f1ffbf33d0b34283a2f7a62c6e9 + languageName: node + linkType: hard + "fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -15288,6 +15546,13 @@ __metadata: languageName: node linkType: hard +"funpermaproxy@npm:^1.1.0": + version: 1.1.0 + resolution: "funpermaproxy@npm:1.1.0" + checksum: 74cf0aafeadbd79053324f1fb981c1a4358618722ad01c65bd1466b42498fd07acb7749ab9224b25fc8e81c2e1283b92ceee61dded265bd7527b225351db998b + languageName: node + linkType: hard + "gauge@npm:^5.0.0": version: 5.0.2 resolution: "gauge@npm:5.0.2" @@ -15652,7 +15917,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.1.0": +"glob@npm:^8.0.3, glob@npm:^8.1.0": version: 8.1.0 resolution: "glob@npm:8.1.0" dependencies: @@ -16782,6 +17047,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^2.1.0": + version: 2.1.0 + resolution: "is-plain-obj@npm:2.1.0" + checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa + languageName: node + linkType: hard + "is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -17279,6 +17551,39 @@ __metadata: languageName: node linkType: hard +"jest-environment-emit@npm:^1.0.8": + version: 1.0.8 + resolution: "jest-environment-emit@npm:1.0.8" + dependencies: + bunyamin: ^1.5.2 + bunyan: ^2.0.5 + bunyan-debug-stream: ^3.1.0 + funpermaproxy: ^1.1.0 + lodash.merge: ^4.6.2 + node-ipc: 9.2.1 + strip-ansi: ^6.0.0 + tslib: ^2.5.3 + peerDependencies: + "@jest/environment": ">=27.2.5" + "@jest/types": ">=27.2.5" + jest: ">=27.2.5" + jest-environment-jsdom: ">=27.2.5" + jest-environment-node: ">=27.2.5" + peerDependenciesMeta: + "@jest/environment": + optional: true + "@jest/types": + optional: true + jest: + optional: true + jest-environment-jsdom: + optional: true + jest-environment-node: + optional: true + checksum: 0c7bafbd3a6e5952f6abb45958f0d2997371d29b29f3876afda48d1d734ccd703577aaac0d5afec2e19dc33a9db0e9458721fe73dbe797f0ced21481d908acfd + languageName: node + linkType: hard + "jest-environment-jsdom@npm:^29.2.1, jest-environment-jsdom@npm:^29.6.2": version: 29.7.0 resolution: "jest-environment-jsdom@npm:29.7.0" @@ -17781,6 +18086,22 @@ __metadata: languageName: node linkType: hard +"js-message@npm:1.0.7": + version: 1.0.7 + resolution: "js-message@npm:1.0.7" + checksum: 18dcc4d80356e8b5be978ca7838d96d4e350a1cb8adc5741c229dec6df09f53bfed7c75c1f360171d2d791a14e2f077d6c2b1013ba899ded7a27d7dfcd4f3784 + languageName: node + linkType: hard + +"js-queue@npm:2.0.2": + version: 2.0.2 + resolution: "js-queue@npm:2.0.2" + dependencies: + easy-stack: ^1.0.1 + checksum: 5049c3f648315ed13e46755704ff5453df70f7e8e1812acf1f98d6700efbec32421f76294a0e63fd2a9f8aabaf124233bbb308f9a2caec9d9f3d833ab5a73079 + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -17973,6 +18294,13 @@ __metadata: languageName: node linkType: hard +"json-cycle@npm:^1.3.0": + version: 1.5.0 + resolution: "json-cycle@npm:1.5.0" + checksum: 0a44cd349676c6726093c64283fb75402f9104b32325b06c9270af6d639e7caac419f5301a39298aef2ac1659b273b167e02bd622e628c3392cf86f0e77a9f78 + languageName: node + linkType: hard + "json-parse-better-errors@npm:^1.0.1": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" @@ -18805,6 +19133,16 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^4.0.1": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: ^1.0.2 + yallist: ^2.1.2 + checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -20258,7 +20596,7 @@ __metadata: languageName: node linkType: hard -"moment@npm:2.30.1, moment@npm:^2.24.0, moment@npm:^2.29.4": +"moment@npm:2.30.1, moment@npm:^2.19.3, moment@npm:^2.24.0, moment@npm:^2.29.4": version: 2.30.1 resolution: "moment@npm:2.30.1" checksum: 859236bab1e88c3e5802afcf797fc801acdbd0ee509d34ea3df6eea21eb6bcc2abd4ae4e4e64aa7c986aa6cba563c6e62806218e6412a765010712e5fa121ba6 @@ -20313,6 +20651,13 @@ __metadata: languageName: node linkType: hard +"multi-sort-stream@npm:^1.0.3, multi-sort-stream@npm:^1.0.4": + version: 1.0.4 + resolution: "multi-sort-stream@npm:1.0.4" + checksum: b234754e0e7489623f5184ba0e887ffd8014fe829c846fd8a95569339b6e19a616ae1d44f3d064279adfbf92fa5c4d016a89fc5026e16dbd680ebd67067b19a0 + languageName: node + linkType: hard + "multimatch@npm:5.0.0": version: 5.0.0 resolution: "multimatch@npm:5.0.0" @@ -20326,6 +20671,16 @@ __metadata: languageName: node linkType: hard +"multipipe@npm:^4.0.0": + version: 4.0.0 + resolution: "multipipe@npm:4.0.0" + dependencies: + duplexer2: ^0.1.2 + object-assign: ^4.1.0 + checksum: 5a494ec2ce5bfdb389882ca595e3c4a33cae6c90dad879db2e3aa9a94484d8b164b0fb7b58ccf7593ae7e8c6213fd3f53a736b2c98e4f14c5ed1d38debc33f98 + languageName: node + linkType: hard + "mute-stream@npm:0.0.7": version: 0.0.7 resolution: "mute-stream@npm:0.0.7" @@ -20347,7 +20702,7 @@ __metadata: languageName: node linkType: hard -"mv@npm:2.1.1": +"mv@npm:2.1.1, mv@npm:~2": version: 2.1.1 resolution: "mv@npm:2.1.1" dependencies: @@ -20369,6 +20724,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.14.0": + version: 2.22.0 + resolution: "nan@npm:2.22.0" + dependencies: + node-gyp: latest + checksum: 222e3a090e326c72f6782d948f44ee9b81cfb2161d5fe53216f04426a273fd094deee9dcc6813096dd2397689a2b10c1a92d3885d2e73fd2488a51547beb2929 + languageName: node + linkType: hard + "nanoid@npm:3.3.7, nanoid@npm:^3.1.23, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" @@ -20546,6 +20910,17 @@ __metadata: languageName: node linkType: hard +"node-ipc@npm:9.2.1": + version: 9.2.1 + resolution: "node-ipc@npm:9.2.1" + dependencies: + event-pubsub: 4.3.0 + js-message: 1.0.7 + js-queue: 2.0.2 + checksum: a38aa4c8ca4317b293e0ce21f0a3a4941fc51c054800b35e263fcfe3e0feeb60e7d2c497f015054b28783316c6e7d9cc3837af9d9958bcbd8c577d0cdf6964b7 + languageName: node + linkType: hard + "node-java-connector@npm:1.1.1": version: 1.1.1 resolution: "node-java-connector@npm:1.1.1" @@ -20616,6 +20991,13 @@ __metadata: languageName: node linkType: hard +"node-version@npm:^1.0.0": + version: 1.2.0 + resolution: "node-version@npm:1.2.0" + checksum: 74e92d2a7f0fe0fce3aafd6dcc30b3b440999df68b3d92fcefcad2a52b37bc29c6b542f33760229390bfdc1a4d993fb65b9c199b1f0d568969d07fc1c04bc1e7 + languageName: node + linkType: hard + "nopt@npm:^7.0.0, nopt@npm:^7.2.0, nopt@npm:^7.2.1": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -22075,6 +22457,13 @@ __metadata: languageName: node linkType: hard +"promise-polyfill@npm:^6.0.1": + version: 6.1.0 + resolution: "promise-polyfill@npm:6.1.0" + checksum: 6f1899cca37e48f67a424842282acd525d8d99d3536f2d97e37a117cfc4a0006683330ceaf5a15fbc09b4450f319a680292f9970a5f8e9cf90acbce0bdb0f751 + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -22133,6 +22522,17 @@ __metadata: languageName: node linkType: hard +"proper-lockfile@npm:^3.0.2": + version: 3.2.0 + resolution: "proper-lockfile@npm:3.2.0" + dependencies: + graceful-fs: ^4.1.11 + retry: ^0.12.0 + signal-exit: ^3.0.2 + checksum: 1be1bb702b9d47bdf18d75f22578f51370781feba7d2617f70ff8c66a86bcfa6e55b4f69c57fc326380110f2d1ffdb6e54a4900814bf156c04ee4eb2d3c065aa + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -22180,6 +22580,13 @@ __metadata: languageName: node linkType: hard +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 + languageName: node + linkType: hard + "psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -23257,7 +23664,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.5, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -23949,6 +24356,13 @@ __metadata: languageName: node linkType: hard +"safe-json-stringify@npm:~1": + version: 1.2.0 + resolution: "safe-json-stringify@npm:1.2.0" + checksum: 5bb32db6d6a3ceb3752df51f4043a412419cd3d4fcd5680a865dfa34cd7e575ba659c077d13f52981ced084061df9c75c7fb12e391584d4264e6914c1cd3d216 + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.3": version: 1.0.3 resolution: "safe-regex-test@npm:1.0.3" @@ -23974,7 +24388,7 @@ __metadata: languageName: node linkType: hard -"sanitize-filename@npm:1.6.3": +"sanitize-filename@npm:1.6.3, sanitize-filename@npm:^1.6.1": version: 1.6.3 resolution: "sanitize-filename@npm:1.6.3" dependencies: @@ -24285,7 +24699,10 @@ __metadata: "@react-navigation/native-stack": ^7.0.3 "@react-navigation/stack": ^7.0.3 "@sentry/babel-plugin-component-annotate": ^2.18.0 + "@sentry/core": 8.54.0 "@sentry/react-native": 6.7.0-alpha.0 + "@types/jest": ^29.5.14 + "@types/node": ^22.13.1 "@types/react": ^18.2.65 "@types/react-native-vector-icons": ^6.4.18 "@types/react-test-renderer": ^18.0.0 @@ -24294,6 +24711,7 @@ __metadata: babel-jest: ^29.2.1 babel-plugin-module-resolver: ^5.0.0 delay: ^6.0.0 + detox: ^20.33.0 eslint: ^8.19.0 jest: ^29.6.3 patch-package: ^8.0.0 @@ -24313,6 +24731,7 @@ __metadata: react-test-renderer: 18.3.1 redux: ^4.2.1 sentry-react-native-samples-utils: "workspace:^" + ts-jest: ^29.2.5 typescript: 5.0.4 languageName: unknown linkType: soft @@ -24366,6 +24785,15 @@ __metadata: languageName: node linkType: hard +"serialize-error@npm:^8.0.1": + version: 8.1.0 + resolution: "serialize-error@npm:8.1.0" + dependencies: + type-fest: ^0.20.2 + checksum: 2eef236d50edd2d7926e602c14fb500dc3a125ee52e9f08f67033181b8e0be5d1122498bdf7c23c80683cddcad083a27974e9e7111ce23165f4d3bcdd6d65102 + languageName: node + linkType: hard + "serve-favicon@npm:2.5.0": version: 2.5.0 resolution: "serve-favicon@npm:2.5.0" @@ -24576,6 +25004,13 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.7.2": + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 1e97b62ced1c4c5135015978ebf273bed1f425a68cf84163e83fbb0f34b3ff9471e656720dab2b7cbb4ae0f58998e686d17d166c28dfb3662acd009e8bd7faed + languageName: node + linkType: hard + "shelljs@npm:^0.8.3": version: 0.8.5 resolution: "shelljs@npm:0.8.5" @@ -25004,6 +25439,13 @@ __metadata: languageName: node linkType: hard +"stream-chain@npm:^2.2.5": + version: 2.2.5 + resolution: "stream-chain@npm:2.2.5" + checksum: c83cbf504bd11e2bcbe761a92801295b3decac7ffa4092ceffca2eb1b5d0763bcc511fa22cd8044e8a18c21ca66794fd10c8d9cd1292a3e6c0d83a4194c6b8ed + languageName: node + linkType: hard + "stream-combiner@npm:^0.2.2": version: 0.2.2 resolution: "stream-combiner@npm:0.2.2" @@ -25014,6 +25456,15 @@ __metadata: languageName: node linkType: hard +"stream-json@npm:^1.7.4, stream-json@npm:^1.7.5": + version: 1.9.1 + resolution: "stream-json@npm:1.9.1" + dependencies: + stream-chain: ^2.2.5 + checksum: 2ebf0648f9ed82ee79727a9a47805231a70d5032e0c21cee3e05cd3c449d3ce49c72b371555447eeef55904bae22ac64be8ae6086fc6cce0b83b3aa617736b64 + languageName: node + linkType: hard + "stream-slice@npm:^0.1.2": version: 0.1.2 resolution: "stream-slice@npm:0.1.2" @@ -25591,7 +26042,16 @@ __metadata: languageName: node linkType: hard -"temp-dir@npm:1.0.0": +"telnet-client@npm:1.2.8": + version: 1.2.8 + resolution: "telnet-client@npm:1.2.8" + dependencies: + bluebird: ^3.5.4 + checksum: d2430c5449a46f6f4f9a7c2c648164f014c308aa0d3207a4d6b5b7f0e443322d07b180ecac63ad43eadb6557c8ef5ae7dce1ea6276464c8c82c8c6a9c9c01bf2 + languageName: node + linkType: hard + +"temp-dir@npm:1.0.0, temp-dir@npm:^1.0.0": version: 1.0.0 resolution: "temp-dir@npm:1.0.0" checksum: cb2b58ddfb12efa83e939091386ad73b425c9a8487ea0095fe4653192a40d49184a771a1beba99045fbd011e389fd563122d79f54f82be86a55620667e08a6b2 @@ -25624,6 +26084,16 @@ __metadata: languageName: node linkType: hard +"tempfile@npm:^2.0.0": + version: 2.0.0 + resolution: "tempfile@npm:2.0.0" + dependencies: + temp-dir: ^1.0.0 + uuid: ^3.0.1 + checksum: 8a92a0f57e0ae457dfbc156b14c427b42048a86ca6bade311835cc2aeda61b25b82d688f71f2d663dde6f172f479ed07293b53f7981e41cb6f9120a3eb4fe797 + languageName: node + linkType: hard + "tempy@npm:^0.7.1": version: 0.7.1 resolution: "tempy@npm:0.7.1" @@ -25825,6 +26295,15 @@ __metadata: languageName: node linkType: hard +"trace-event-lib@npm:^1.3.1": + version: 1.4.1 + resolution: "trace-event-lib@npm:1.4.1" + dependencies: + browser-process-hrtime: ^1.0.0 + checksum: f10dbfeccee9ec80a8cf69ecadd49fa609fc2593fb50a83cc4b664524c0531f91009134bf54302f9c4911afed119b0eebb8d2724723fc44516e24a40aaae9219 + languageName: node + linkType: hard + "treeverse@npm:^3.0.0": version: 3.0.0 resolution: "treeverse@npm:3.0.0" @@ -25878,7 +26357,7 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.1.1": +"ts-jest@npm:^29.1.1, ts-jest@npm:^29.2.5": version: 29.2.5 resolution: "ts-jest@npm:29.2.5" dependencies: @@ -26006,6 +26485,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.5.3": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -26398,6 +26884,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: b7bc50f012dc6afbcce56c9fd62d7e86b20a62ff21f12b7b5cbf1973b9578d90f22a9c7fe50e638e96905d33893bf2f9f16d98929c4673c2480de05c6c96ea8b + languageName: node + linkType: hard + "undici@npm:^6.11.1, undici@npm:^6.18.2": version: 6.21.1 resolution: "undici@npm:6.21.1" @@ -26657,6 +27150,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^3.0.1": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: 58de2feed61c59060b40f8203c0e4ed7fd6f99d42534a499f1741218a1dd0c129f4aa1de797bcf822c8ea5da7e4137aa3673431a96dae729047f7aca7b27866f + languageName: node + linkType: hard + "uuid@npm:^7.0.3": version: 7.0.3 resolution: "uuid@npm:7.0.3" @@ -27029,7 +27531,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^1.2.9": +"which@npm:^1.2.9, which@npm:^1.3.1": version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: @@ -27247,7 +27749,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.5.1, ws@npm:^7.5.10": +"ws@npm:^7, ws@npm:^7.0.0, ws@npm:^7.5.1, ws@npm:^7.5.10": version: 7.5.10 resolution: "ws@npm:7.5.10" peerDependencies: @@ -27378,6 +27880,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^2.1.2": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb + languageName: node + linkType: hard + "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -27408,7 +27917,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": +"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.0, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c @@ -27432,7 +27941,19 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": +"yargs-unparser@npm:^2.0.0": + version: 2.0.0 + resolution: "yargs-unparser@npm:2.0.0" + dependencies: + camelcase: ^6.0.0 + decamelize: ^4.0.0 + flat: ^5.0.2 + is-plain-obj: ^2.1.0 + checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 + languageName: node + linkType: hard + +"yargs@npm:17.7.2, yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: