main 9d8f40574e86 cached
1192 files
17.5 MB
4.7M tokens
17887 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (18,796K chars total). Download the full file to get everything.
Repository: software-mansion/react-native-audio-api
Branch: main
Commit: 9d8f40574e86
Files: 1192
Total size: 17.5 MB

Directory structure:
gitextract_uaa1x4hk/

├── .claude/
│   ├── README.md
│   ├── commands/
│   │   └── pre-push-update.md
│   ├── hooks/
│   │   └── double-prompt.js
│   ├── last-knowledge-update
│   ├── settings.json
│   └── skills/
│       ├── audio-nodes/
│       │   ├── SKILL.md
│       │   ├── gainnode-example.md
│       │   └── maintenance.md
│       ├── build-compilation-dependencies/
│       │   ├── SKILL.md
│       │   ├── build-details.md
│       │   └── maintenance.md
│       ├── flow/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── host-objects/
│       │   ├── SKILL.md
│       │   ├── examples.md
│       │   └── maintenance.md
│       ├── post-work-checks/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── thread-safety-itc/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── turbo-modules/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── utilities/
│       │   ├── SKILL.md
│       │   ├── api.md
│       │   └── maintenance.md
│       ├── web-audio-api/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       └── writing-skills/
│           ├── SKILL.md
│           └── maintenance.md
├── .editorconfig
├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   └── feature_request.yaml
│   ├── actions/
│   │   └── setup/
│   │       └── action.yml
│   ├── pull_request_template.md
│   ├── release.yml
│   └── workflows/
│       ├── ci.yml
│       ├── graph-tests.yml
│       ├── npm-audio-package-build.yml
│       ├── npm-custom-node-generator-build.yml
│       ├── publish-docs.yml
│       └── tests.yml
├── .gitignore
├── .nvmrc
├── .yarn/
│   └── releases/
│       └── yarn-4.5.0.cjs
├── .yarnrc.yml
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── THIRD_PARTY.md
├── apps/
│   ├── CLAUDE.md
│   ├── common-app/
│   │   ├── .eslintrc.js
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── prettier.config.js
│   │   ├── scripts/
│   │   │   └── dependencies.js
│   │   ├── src/
│   │   │   ├── App.tsx
│   │   │   ├── components/
│   │   │   │   ├── BGGradient.tsx
│   │   │   │   ├── Button.tsx
│   │   │   │   ├── Container.tsx
│   │   │   │   ├── Select.tsx
│   │   │   │   ├── Slider.tsx
│   │   │   │   ├── Spacer.tsx
│   │   │   │   ├── Switch.tsx
│   │   │   │   ├── VerticalSlider.tsx
│   │   │   │   ├── icons/
│   │   │   │   │   ├── CheckedCircleIcon.tsx
│   │   │   │   │   ├── MenuIcon.tsx
│   │   │   │   │   └── PlayPauseIcon.tsx
│   │   │   │   └── index.ts
│   │   │   ├── demos/
│   │   │   │   ├── Crossfade/
│   │   │   │   │   └── Crossfade.tsx
│   │   │   │   ├── PedalBoard/
│   │   │   │   │   ├── AutoWahPedal.tsx
│   │   │   │   │   ├── EchoPedal.tsx
│   │   │   │   │   ├── OverdrivePedal.tsx
│   │   │   │   │   ├── PedalBoard.tsx
│   │   │   │   │   ├── ReverbPedal.tsx
│   │   │   │   │   └── curves.ts
│   │   │   │   ├── Record/
│   │   │   │   │   ├── ControlPanel.tsx
│   │   │   │   │   ├── PauseButton.tsx
│   │   │   │   │   ├── PlaybackVisualization.tsx
│   │   │   │   │   ├── Record.tsx
│   │   │   │   │   ├── RecordButton.tsx
│   │   │   │   │   ├── RecordingTime.tsx
│   │   │   │   │   ├── RecordingVisualization.tsx
│   │   │   │   │   ├── Status.tsx
│   │   │   │   │   ├── TimeStream.tsx
│   │   │   │   │   ├── constants.tsx
│   │   │   │   │   └── types.ts
│   │   │   │   └── index.ts
│   │   │   ├── examples/
│   │   │   │   ├── AudioFile/
│   │   │   │   │   ├── AudioFile.tsx
│   │   │   │   │   ├── AudioPlayer.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AudioParamPipeline/
│   │   │   │   │   ├── AudioParamPipeline.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AudioPipelineStress/
│   │   │   │   │   ├── AudioPipelineStress.tsx
│   │   │   │   │   ├── StopRequestedError.ts
│   │   │   │   │   ├── StressPlaybackController.ts
│   │   │   │   │   ├── StressResourceOwner.ts
│   │   │   │   │   ├── audioSessions.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── AudioTag/
│   │   │   │   │   ├── AudioTag.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AudioVisualizer/
│   │   │   │   │   ├── AudioVisualizer.tsx
│   │   │   │   │   ├── Canvas.tsx
│   │   │   │   │   ├── Charts.tsx
│   │   │   │   │   ├── FreqTimeChart.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── ConvolverIR/
│   │   │   │   │   ├── ConvolverIR.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── DrumMachine/
│   │   │   │   │   ├── DrumMachine.tsx
│   │   │   │   │   ├── Grid.tsx
│   │   │   │   │   ├── NotesHighlight.tsx
│   │   │   │   │   ├── PatternShape.tsx
│   │   │   │   │   ├── PlayButton.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── instruments.ts
│   │   │   │   │   ├── presets.ts
│   │   │   │   │   └── useGestures.ts
│   │   │   │   ├── Metronome/
│   │   │   │   │   ├── Metronome.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── patterns.ts
│   │   │   │   ├── OfflineRendering/
│   │   │   │   │   ├── OfflineRendering.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── Oscillator/
│   │   │   │   │   ├── Oscillator.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Piano/
│   │   │   │   │   ├── Keyboard.tsx
│   │   │   │   │   ├── Piano.tsx
│   │   │   │   │   ├── PianoNote.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── PlaybackSpeed/
│   │   │   │   │   ├── PlaybackSpeed.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── Record/
│   │   │   │   │   └── Record.tsx
│   │   │   │   ├── Streaming/
│   │   │   │   │   └── Streaming.tsx
│   │   │   │   ├── Worklets/
│   │   │   │   │   └── Worklets.tsx
│   │   │   │   └── index.ts
│   │   │   ├── singletons/
│   │   │   │   └── index.ts
│   │   │   ├── styles.ts
│   │   │   ├── testComponents/
│   │   │   │   ├── ControlBar.tsx
│   │   │   │   ├── CurrentStepCard.tsx
│   │   │   │   ├── EmptyState.tsx
│   │   │   │   ├── Header.tsx
│   │   │   │   ├── LiveLog.tsx
│   │   │   │   ├── ScenarioCard.tsx
│   │   │   │   ├── ScenarioResults.tsx
│   │   │   │   ├── SectionTitle.tsx
│   │   │   │   ├── StatusPill.tsx
│   │   │   │   ├── StepRow.tsx
│   │   │   │   ├── Summary.tsx
│   │   │   │   ├── SummaryBadge.tsx
│   │   │   │   ├── UnsupportedNotice.tsx
│   │   │   │   ├── index.ts
│   │   │   │   ├── statusStyles.ts
│   │   │   │   └── types.ts
│   │   │   ├── types.ts
│   │   │   └── utils/
│   │   │       ├── skiUtils.ts
│   │   │       ├── soundEngines/
│   │   │       │   ├── Clap.ts
│   │   │       │   ├── HiHat.ts
│   │   │       │   ├── Kick.ts
│   │   │       │   ├── MetronomeSound.ts
│   │   │       │   └── SoundEngine.ts
│   │   │       ├── usePlayer.tsx
│   │   │       └── withSeparators.ts
│   │   ├── tsconfig.json
│   │   └── types.d.ts
│   └── fabric-example/
│       ├── .bundle/
│       │   └── config
│       ├── .watchmanconfig
│       ├── App.tsx
│       ├── Gemfile
│       ├── README.md
│       ├── android/
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── debug.keystore
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── fabricexample/
│       │   │           │           ├── MainActivity.kt
│       │   │           │           └── MainApplication.kt
│       │   │           └── res/
│       │   │               ├── drawable/
│       │   │               │   ├── ic_launcher_background.xml
│       │   │               │   ├── logo.xml
│       │   │               │   ├── pause.xml
│       │   │               │   ├── resume.xml
│       │   │               │   └── rn_edit_text_material.xml
│       │   │               ├── mipmap-anydpi-v26/
│       │   │               │   ├── ic_launcher.xml
│       │   │               │   └── ic_launcher_round.xml
│       │   │               └── values/
│       │   │                   ├── ic_launcher_background.xml
│       │   │                   ├── strings.xml
│       │   │                   └── styles.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       ├── app.json
│       ├── babel.config.js
│       ├── index.js
│       ├── ios/
│       │   ├── .xcode.env
│       │   ├── FabricExample/
│       │   │   ├── AppDelegate.swift
│       │   │   ├── Images.xcassets/
│       │   │   │   ├── AppIcon.appiconset/
│       │   │   │   │   └── Contents.json
│       │   │   │   └── Contents.json
│       │   │   ├── Info.plist
│       │   │   ├── LaunchScreen.storyboard
│       │   │   └── PrivacyInfo.xcprivacy
│       │   ├── FabricExample.xcodeproj/
│       │   │   ├── project.pbxproj
│       │   │   └── xcshareddata/
│       │   │       └── xcschemes/
│       │   │           └── FabricExample.xcscheme
│       │   ├── FabricExample.xcworkspace/
│       │   │   └── contents.xcworkspacedata
│       │   ├── FabricExampleTests/
│       │   │   ├── AudioAPIModuleTests.mm
│       │   │   ├── AudioEngineTests.mm
│       │   │   ├── AudioPlayerTests.mm
│       │   │   ├── AudioSessionManagerTests.mm
│       │   │   ├── IOSAudioRecorderTests.mm
│       │   │   ├── NativeAudioRecorderTests.mm
│       │   │   └── SystemNotificationManagerTests.mm
│       │   └── Podfile
│       ├── metro.config.js
│       ├── package.json
│       ├── react-native.config.js
│       └── tsconfig.json
├── ghdocs/
│   ├── audio-node.md
│   └── changelog.md
├── lefthook.yml
├── lgplv3
├── package.json
├── packages/
│   ├── audiodocs/
│   │   ├── .eslintrc
│   │   ├── .gitignore
│   │   ├── .yarn/
│   │   │   └── releases/
│   │   │       └── yarn-1.22.22.cjs
│   │   ├── .yarnrc.yml
│   │   ├── CLAUDE.md
│   │   ├── README.md
│   │   ├── babel.config.js
│   │   ├── docs/
│   │   │   ├── analysis/
│   │   │   │   ├── _category_.json
│   │   │   │   └── analyser-node.mdx
│   │   │   ├── core/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-context.mdx
│   │   │   │   ├── audio-node.mdx
│   │   │   │   ├── audio-param.mdx
│   │   │   │   ├── base-audio-context.mdx
│   │   │   │   └── offline-audio-context.mdx
│   │   │   ├── destinations/
│   │   │   │   ├── _category_.json
│   │   │   │   └── audio-destination-node.mdx
│   │   │   ├── effects/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── biquad-filter-node.mdx
│   │   │   │   ├── convolver-node.mdx
│   │   │   │   ├── delay-node.mdx
│   │   │   │   ├── gain-node.mdx
│   │   │   │   ├── iir-filter-node.mdx
│   │   │   │   ├── periodic-wave.mdx
│   │   │   │   ├── stereo-panner-node.mdx
│   │   │   │   └── wave-shaper-node.mdx
│   │   │   ├── experimental/
│   │   │   │   ├── _category_.json
│   │   │   │   └── audio-tag.mdx
│   │   │   ├── fundamentals/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── best-practices.mdx
│   │   │   │   ├── getting-started.mdx
│   │   │   │   └── introduction.mdx
│   │   │   ├── guides/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── create-your-own-effect.mdx
│   │   │   │   ├── lets-make-some-noise.mdx
│   │   │   │   ├── making-a-piano-keyboard.mdx
│   │   │   │   ├── noise-generation.mdx
│   │   │   │   └── see-your-sound.mdx
│   │   │   ├── inputs/
│   │   │   │   ├── _category_.json
│   │   │   │   └── audio-recorder.mdx
│   │   │   ├── other/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-api-plugin.mdx
│   │   │   │   ├── compatibility.mdx
│   │   │   │   ├── ffmpeg-info.mdx
│   │   │   │   ├── non-expo-permissions.mdx
│   │   │   │   ├── running_with_mac_catalyst.mdx
│   │   │   │   ├── testing.mdx
│   │   │   │   └── web-audio-api-coverage.mdx
│   │   │   ├── react/
│   │   │   │   ├── _category_.json
│   │   │   │   └── select-input.mdx
│   │   │   ├── sources/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-buffer-base-source-node.mdx
│   │   │   │   ├── audio-buffer-queue-source-node.mdx
│   │   │   │   ├── audio-buffer-source-node.mdx
│   │   │   │   ├── audio-buffer.mdx
│   │   │   │   ├── audio-scheduled-source-node.mdx
│   │   │   │   ├── constant-source-node.mdx
│   │   │   │   ├── oscillator-node.mdx
│   │   │   │   ├── recorder-adapter-node.mdx
│   │   │   │   └── streamer-node.mdx
│   │   │   ├── system/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-manager.mdx
│   │   │   │   ├── playback-notification-manager.mdx
│   │   │   │   └── recording-notification-manager.mdx
│   │   │   ├── types/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── channel-count-mode.mdx
│   │   │   │   ├── channel-interpretation.mdx
│   │   │   │   └── oscillator-type.mdx
│   │   │   ├── utils/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── decoding.mdx
│   │   │   │   └── time-stretching.mdx
│   │   │   └── worklets/
│   │   │       ├── _category_.json
│   │   │       ├── introduction.mdx
│   │   │       ├── worklet-node.mdx
│   │   │       ├── worklet-processing-node.mdx
│   │   │       └── worklet-source-node.mdx
│   │   ├── docusaurus.config.js
│   │   ├── package.json
│   │   ├── prettier.config.js
│   │   ├── sidebars.js
│   │   ├── src/
│   │   │   ├── audio/
│   │   │   │   ├── AudioManager.ts
│   │   │   │   ├── Equalizer.ts
│   │   │   │   ├── MockAudioContext.ts
│   │   │   │   ├── effects.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── useEqualizerControls.ts
│   │   │   │   ├── useIsPlaying.ts
│   │   │   │   └── utils.ts
│   │   │   ├── canvasUtils/
│   │   │   │   ├── clearCanvas.ts
│   │   │   │   ├── createGradient.ts
│   │   │   │   ├── drawEQControlPoints.ts
│   │   │   │   ├── drawEqGrid.ts
│   │   │   │   ├── drawShadedCurve.ts
│   │   │   │   ├── drawSpectroLines.ts
│   │   │   │   ├── getBarWidth.ts
│   │   │   │   ├── getEqualizerResponse.ts
│   │   │   │   ├── groupEQBandLevels.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── lagrangeInterpolation.ts
│   │   │   │   ├── stretchFrequencies.ts
│   │   │   │   └── types.ts
│   │   │   ├── components/
│   │   │   │   ├── AnimableIcon/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── AudioNodePropsTable/
│   │   │   │   │   ├── AudioNodePropsTable.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Badges/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Charts/
│   │   │   │   │   ├── ExponentialRampToValueAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── LinearRampToValueAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── SetTargetAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── SetValueAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── SetValueCurveAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── common/
│   │   │   │   │   │   └── AudioParamChartBase.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Compatibility/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── HandIcon/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── InteractiveExample/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── InteractivePlayground/
│   │   │   │   │   ├── AudioBufferSourceExample/
│   │   │   │   │   │   ├── AudioBufferSourceExample.tsx
│   │   │   │   │   │   └── useAudioBufferSourcePlayground.tsx
│   │   │   │   │   ├── GainAdsrExample/
│   │   │   │   │   │   ├── AdsrChart.tsx
│   │   │   │   │   │   ├── GainAdsrExample.tsx
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   └── useGainAdsrPlayground.tsx
│   │   │   │   │   ├── OscillatorExample/
│   │   │   │   │   │   ├── OscillatorExample.tsx
│   │   │   │   │   │   └── useOscilatorPlayground.tsx
│   │   │   │   │   ├── WaveformVisualizer.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── RadonBanner/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   └── TopPromoRotator/
│   │   │   │       ├── index.tsx
│   │   │   │       └── styles.module.css
│   │   │   ├── css/
│   │   │   │   ├── colors.css
│   │   │   │   ├── custom.css
│   │   │   │   ├── overrides.css
│   │   │   │   └── typography.css
│   │   │   ├── examples/
│   │   │   │   ├── Biquad/
│   │   │   │   │   ├── BiquadExampleComponent.tsx
│   │   │   │   │   ├── BoxWithFlaps.tsx
│   │   │   │   │   ├── FrequencyResponseGraph.module.css
│   │   │   │   │   ├── FrequencyResponseGraph.tsx
│   │   │   │   │   └── drawFrequencyResponse.tsx
│   │   │   │   ├── LetsMakeSomeNoise/
│   │   │   │   │   ├── Component.tsx
│   │   │   │   │   └── Source.tsx
│   │   │   │   ├── NoiseGeneration/
│   │   │   │   │   ├── BrownianNoiseComponent.tsx
│   │   │   │   │   ├── BrownianNoiseSource.tsx
│   │   │   │   │   ├── PinkNoiseComponent.tsx
│   │   │   │   │   ├── PinkNoiseSource.tsx
│   │   │   │   │   ├── WhiteNoiseComponent.tsx
│   │   │   │   │   └── WhiteNoiseSource.tsx
│   │   │   │   ├── SeeYourSound/
│   │   │   │   │   ├── BaseComponent.tsx
│   │   │   │   │   ├── BaseSource.tsx
│   │   │   │   │   ├── CanvasSizerComponent.tsx
│   │   │   │   │   ├── FrequencyDomainComponent.tsx
│   │   │   │   │   ├── FrequencyDomainSource.tsx
│   │   │   │   │   ├── TimeDomainComponent.tsx
│   │   │   │   │   └── TimeDomainSource.tsx
│   │   │   │   ├── SimplePiano/
│   │   │   │   │   ├── EnvelopesComponent.tsx
│   │   │   │   │   ├── EnvelopesSource.tsx
│   │   │   │   │   ├── FinalComponent.tsx
│   │   │   │   │   ├── FinalSource.tsx
│   │   │   │   │   ├── ItHangsComponent.tsx
│   │   │   │   │   ├── ItHangsSource.tsx
│   │   │   │   │   ├── PressOutComponent.tsx
│   │   │   │   │   └── PressOutSource.tsx
│   │   │   │   └── VinylPlayer/
│   │   │   │       ├── VinylPlayer.tsx
│   │   │   │       ├── consts.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── styles.module.css
│   │   │   ├── hooks/
│   │   │   │   ├── usePageType.tsx
│   │   │   │   └── useScreenSize.tsx
│   │   │   ├── landingComponents/
│   │   │   │   ├── FooterBackground/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Hero/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── HireUsSection/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── HomepageButton/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── LandingBlog/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── LandingFeatures/
│   │   │   │   │   ├── LandingFeature.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── LandingWidget/
│   │   │   │   │   ├── Canvas/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Equalizer/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── SoundButton/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Spectrogram/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Toolbar/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── styles.module.css
│   │   │   │   │   └── types.ts
│   │   │   │   ├── Testimonials/
│   │   │   │   │   ├── TestimonialItem/
│   │   │   │   │   │   ├── QuoteIcon/
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── TestimonialList/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── styles.module.css
│   │   │   │   │   │   ├── styles.prev.css
│   │   │   │   │   │   ├── testimonials.tsx
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── useDrag.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   └── index.ts
│   │   │   ├── pages/
│   │   │   │   ├── TestPage.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   └── styles.module.css
│   │   │   ├── theme/
│   │   │   │   ├── CodeBlock/
│   │   │   │   │   ├── highlighting-dark.js
│   │   │   │   │   └── highlighting-light.js
│   │   │   │   ├── DocSidebar/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Navbar/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── styles.css
│   │   │   │   ├── NotFound/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Root.jsx
│   │   │   │   ├── SkipToContent/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── TOCItems/
│   │   │   │   │   ├── Tree/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── Tabs/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   └── muiTheme.jsx
│   │   │   ├── types.d.ts
│   │   │   ├── ui/
│   │   │   │   ├── DetailBox/
│   │   │   │   │   ├── DetailBox.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── FilterList/
│   │   │   │   │   ├── FilterList.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Icon/
│   │   │   │   │   ├── Icon.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Layout/
│   │   │   │   │   ├── Box/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Column/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Container/
│   │   │   │   │   │   ├── Container.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Row/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Spacer/
│   │   │   │   │   │   ├── Spacer.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ResponsiveCanvas/
│   │   │   │   │   ├── ResponsiveCanvas.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── SliderInput/
│   │   │   │   │   ├── SliderInput.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── styles.module.css
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   └── Switch/
│   │   │   │       ├── Switch.tsx
│   │   │   │       ├── index.ts
│   │   │   │       └── styles.module.css
│   │   │   └── wasm-loader.js
│   │   ├── static/
│   │   │   ├── .nojekyll
│   │   │   ├── audio/
│   │   │   │   ├── music/
│   │   │   │   │   └── guitar-sample.flac
│   │   │   │   └── other/
│   │   │   │       └── mixed-channels.opus
│   │   │   ├── fonts/
│   │   │   │   ├── Aeonik-Bold.otf
│   │   │   │   ├── Aeonik-Medium.otf
│   │   │   │   └── Aeonik-Regular.otf
│   │   │   └── signalsmithStretch.mjs
│   │   ├── tsconfig.json
│   │   └── types.d.ts
│   ├── custom-node-generator/
│   │   ├── README.md
│   │   ├── bin/
│   │   │   └── cli.js
│   │   ├── lib/
│   │   │   └── generator.js
│   │   ├── package.json
│   │   └── templates/
│   │       └── basic/
│   │           ├── shared/
│   │           │   ├── MyProcessorNode.cpp
│   │           │   ├── MyProcessorNode.h
│   │           │   ├── MyProcessorNodeHostObject.h
│   │           │   ├── NativeAudioProcessingModule.cpp
│   │           │   └── NativeAudioProcessingModule.h
│   │           └── specs/
│   │               └── NativeAudioProcessingModule.ts
│   ├── react-native-audio-api/
│   │   ├── .clang-format
│   │   ├── .clang-tidy
│   │   ├── .clangd
│   │   ├── .eslintrc.js
│   │   ├── .prettierignore
│   │   ├── .watchmanconfig
│   │   ├── RNAudioAPI.podspec
│   │   ├── android/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── build.gradle
│   │   │   ├── gradle.properties
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── AndroidManifestNew.xml
│   │   │       │   ├── cpp/
│   │   │       │   │   └── audioapi/
│   │   │       │   │       ├── CMakeLists.txt
│   │   │       │   │       └── android/
│   │   │       │   │           ├── AudioAPIModule.cpp
│   │   │       │   │           ├── AudioAPIModule.h
│   │   │       │   │           ├── OnLoad.cpp
│   │   │       │   │           ├── core/
│   │   │       │   │           │   ├── AndroidAudioRecorder.cpp
│   │   │       │   │           │   ├── AndroidAudioRecorder.h
│   │   │       │   │           │   ├── AudioPlayer.cpp
│   │   │       │   │           │   ├── AudioPlayer.h
│   │   │       │   │           │   ├── NativeAudioPlayer.hpp
│   │   │       │   │           │   ├── NativeAudioRecorder.hpp
│   │   │       │   │           │   └── utils/
│   │   │       │   │           │       ├── AndroidFileWriterBackend.cpp
│   │   │       │   │           │       ├── AndroidFileWriterBackend.h
│   │   │       │   │           │       ├── AndroidRecorderCallback.cpp
│   │   │       │   │           │       ├── AndroidRecorderCallback.h
│   │   │       │   │           │       ├── AndroidRotatingFileWriter.cpp
│   │   │       │   │           │       ├── AndroidRotatingFileWriter.h
│   │   │       │   │           │       ├── FileOptions.cpp
│   │   │       │   │           │       ├── FileOptions.h
│   │   │       │   │           │       ├── ffmpegBackend/
│   │   │       │   │           │       │   ├── FFmpegFileWriter.cpp
│   │   │       │   │           │       │   ├── FFmpegFileWriter.h
│   │   │       │   │           │       │   ├── ptrs.hpp
│   │   │       │   │           │       │   ├── utils.cpp
│   │   │       │   │           │       │   └── utils.h
│   │   │       │   │           │       └── miniaudioBackend/
│   │   │       │   │           │           ├── MiniAudioFileWriter.cpp
│   │   │       │   │           │           └── MiniAudioFileWriter.h
│   │   │       │   │           └── system/
│   │   │       │   │               └── NativeFileInfo.hpp
│   │   │       │   ├── java/
│   │   │       │   │   └── com/
│   │   │       │   │       └── swmansion/
│   │   │       │   │           └── audioapi/
│   │   │       │   │               ├── AudioAPIModule.kt
│   │   │       │   │               ├── AudioAPIPackage.kt
│   │   │       │   │               └── system/
│   │   │       │   │                   ├── AudioEvent.kt
│   │   │       │   │                   ├── AudioFocusListener.kt
│   │   │       │   │                   ├── CentralizedForegroundService.kt
│   │   │       │   │                   ├── ForegroundServiceManager.kt
│   │   │       │   │                   ├── MediaSessionManager.kt
│   │   │       │   │                   ├── NativeFileInfo.kt
│   │   │       │   │                   ├── PermissionRequestListener.kt
│   │   │       │   │                   ├── VolumeChangeListener.kt
│   │   │       │   │                   └── notification/
│   │   │       │   │                       ├── BaseNotification.kt
│   │   │       │   │                       ├── NotificationRegistry.kt
│   │   │       │   │                       ├── PlaybackNotification.kt
│   │   │       │   │                       ├── PlaybackNotificationReceiver.kt
│   │   │       │   │                       ├── RecordingNotification.kt
│   │   │       │   │                       ├── RecordingNotificationReceiver.kt
│   │   │       │   │                       └── state/
│   │   │       │   │                           └── RecordingNotificationState.kt
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   ├── logo.xml
│   │   │       │       │   ├── next.xml
│   │   │       │       │   ├── pause.xml
│   │   │       │       │   ├── play.xml
│   │   │       │       │   ├── previous.xml
│   │   │       │       │   ├── skip_backward_15.xml
│   │   │       │       │   ├── skip_forward_15.xml
│   │   │       │       │   └── stop.xml
│   │   │       │       └── layout/
│   │   │       │           ├── btn_round_ripple.xml
│   │   │       │           ├── notification_collapsed.xml
│   │   │       │           └── notification_expanded.xml
│   │   │       └── oldarch/
│   │   │           └── NativeAudioAPIModuleSpec.java
│   │   ├── app.plugin.js
│   │   ├── babel.config.js
│   │   ├── common/
│   │   │   └── cpp/
│   │   │       ├── audioapi/
│   │   │       │   ├── AudioAPIModuleInstaller.h
│   │   │       │   ├── HostObjects/
│   │   │       │   │   ├── AudioContextHostObject.cpp
│   │   │       │   │   ├── AudioContextHostObject.h
│   │   │       │   │   ├── AudioNodeHostObject.cpp
│   │   │       │   │   ├── AudioNodeHostObject.h
│   │   │       │   │   ├── AudioParamHostObject.cpp
│   │   │       │   │   ├── AudioParamHostObject.h
│   │   │       │   │   ├── BaseAudioContextHostObject.cpp
│   │   │       │   │   ├── BaseAudioContextHostObject.h
│   │   │       │   │   ├── OfflineAudioContextHostObject.cpp
│   │   │       │   │   ├── OfflineAudioContextHostObject.h
│   │   │       │   │   ├── analysis/
│   │   │       │   │   │   ├── AnalyserNodeHostObject.cpp
│   │   │       │   │   │   └── AnalyserNodeHostObject.h
│   │   │       │   │   ├── destinations/
│   │   │       │   │   │   └── AudioDestinationNodeHostObject.h
│   │   │       │   │   ├── effects/
│   │   │       │   │   │   ├── BiquadFilterNodeHostObject.cpp
│   │   │       │   │   │   ├── BiquadFilterNodeHostObject.h
│   │   │       │   │   │   ├── ConvolverNodeHostObject.cpp
│   │   │       │   │   │   ├── ConvolverNodeHostObject.h
│   │   │       │   │   │   ├── DelayNodeHostObject.cpp
│   │   │       │   │   │   ├── DelayNodeHostObject.h
│   │   │       │   │   │   ├── GainNodeHostObject.cpp
│   │   │       │   │   │   ├── GainNodeHostObject.h
│   │   │       │   │   │   ├── IIRFilterNodeHostObject.cpp
│   │   │       │   │   │   ├── IIRFilterNodeHostObject.h
│   │   │       │   │   │   ├── PeriodicWaveHostObject.h
│   │   │       │   │   │   ├── StereoPannerNodeHostObject.cpp
│   │   │       │   │   │   ├── StereoPannerNodeHostObject.h
│   │   │       │   │   │   ├── WaveShaperNodeHostObject.cpp
│   │   │       │   │   │   ├── WaveShaperNodeHostObject.h
│   │   │       │   │   │   ├── WorkletNodeHostObject.h
│   │   │       │   │   │   └── WorkletProcessingNodeHostObject.h
│   │   │       │   │   ├── events/
│   │   │       │   │   │   ├── AudioEventHandlerRegistryHostObject.cpp
│   │   │       │   │   │   └── AudioEventHandlerRegistryHostObject.h
│   │   │       │   │   ├── inputs/
│   │   │       │   │   │   ├── AudioRecorderHostObject.cpp
│   │   │       │   │   │   └── AudioRecorderHostObject.h
│   │   │       │   │   ├── sources/
│   │   │       │   │   │   ├── AudioBufferBaseSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferBaseSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioBufferHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferHostObject.h
│   │   │       │   │   │   ├── AudioBufferQueueSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferQueueSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioBufferSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioFileSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioFileSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioScheduledSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioScheduledSourceNodeHostObject.h
│   │   │       │   │   │   ├── ConstantSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── ConstantSourceNodeHostObject.h
│   │   │       │   │   │   ├── OscillatorNodeHostObject.cpp
│   │   │       │   │   │   ├── OscillatorNodeHostObject.h
│   │   │       │   │   │   ├── RecorderAdapterNodeHostObject.h
│   │   │       │   │   │   ├── StreamerNodeHostObject.h
│   │   │       │   │   │   └── WorkletSourceNodeHostObject.h
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── AudioDecoderHostObject.cpp
│   │   │       │   │       ├── AudioDecoderHostObject.h
│   │   │       │   │       ├── AudioStretcherHostObject.cpp
│   │   │       │   │       ├── AudioStretcherHostObject.h
│   │   │       │   │       ├── JsEnumParser.cpp
│   │   │       │   │       ├── JsEnumParser.h
│   │   │       │   │       └── NodeOptionsParser.h
│   │   │       │   ├── core/
│   │   │       │   │   ├── AudioContext.cpp
│   │   │       │   │   ├── AudioContext.h
│   │   │       │   │   ├── AudioNode.cpp
│   │   │       │   │   ├── AudioNode.h
│   │   │       │   │   ├── AudioParam.cpp
│   │   │       │   │   ├── AudioParam.h
│   │   │       │   │   ├── BaseAudioContext.cpp
│   │   │       │   │   ├── BaseAudioContext.h
│   │   │       │   │   ├── OfflineAudioContext.cpp
│   │   │       │   │   ├── OfflineAudioContext.h
│   │   │       │   │   ├── analysis/
│   │   │       │   │   │   ├── AnalyserNode.cpp
│   │   │       │   │   │   └── AnalyserNode.h
│   │   │       │   │   ├── destinations/
│   │   │       │   │   │   ├── AudioDestinationNode.cpp
│   │   │       │   │   │   └── AudioDestinationNode.h
│   │   │       │   │   ├── effects/
│   │   │       │   │   │   ├── BiquadFilterNode.cpp
│   │   │       │   │   │   ├── BiquadFilterNode.h
│   │   │       │   │   │   ├── ConvolverNode.cpp
│   │   │       │   │   │   ├── ConvolverNode.h
│   │   │       │   │   │   ├── DelayNode.cpp
│   │   │       │   │   │   ├── DelayNode.h
│   │   │       │   │   │   ├── GainNode.cpp
│   │   │       │   │   │   ├── GainNode.h
│   │   │       │   │   │   ├── IIRFilterNode.cpp
│   │   │       │   │   │   ├── IIRFilterNode.h
│   │   │       │   │   │   ├── PeriodicWave.cpp
│   │   │       │   │   │   ├── PeriodicWave.h
│   │   │       │   │   │   ├── StereoPannerNode.cpp
│   │   │       │   │   │   ├── StereoPannerNode.h
│   │   │       │   │   │   ├── WaveShaperNode.cpp
│   │   │       │   │   │   ├── WaveShaperNode.h
│   │   │       │   │   │   ├── WorkletNode.cpp
│   │   │       │   │   │   ├── WorkletNode.h
│   │   │       │   │   │   ├── WorkletProcessingNode.cpp
│   │   │       │   │   │   └── WorkletProcessingNode.h
│   │   │       │   │   ├── inputs/
│   │   │       │   │   │   ├── AudioRecorder.cpp
│   │   │       │   │   │   └── AudioRecorder.h
│   │   │       │   │   ├── sources/
│   │   │       │   │   │   ├── AudioBufferBaseSourceNode.cpp
│   │   │       │   │   │   ├── AudioBufferBaseSourceNode.h
│   │   │       │   │   │   ├── AudioBufferQueueSourceNode.cpp
│   │   │       │   │   │   ├── AudioBufferQueueSourceNode.h
│   │   │       │   │   │   ├── AudioBufferSourceNode.cpp
│   │   │       │   │   │   ├── AudioBufferSourceNode.h
│   │   │       │   │   │   ├── AudioFileSourceNode.cpp
│   │   │       │   │   │   ├── AudioFileSourceNode.h
│   │   │       │   │   │   ├── AudioScheduledSourceNode.cpp
│   │   │       │   │   │   ├── AudioScheduledSourceNode.h
│   │   │       │   │   │   ├── ConstantSourceNode.cpp
│   │   │       │   │   │   ├── ConstantSourceNode.h
│   │   │       │   │   │   ├── OscillatorNode.cpp
│   │   │       │   │   │   ├── OscillatorNode.h
│   │   │       │   │   │   ├── RecorderAdapterNode.cpp
│   │   │       │   │   │   ├── RecorderAdapterNode.h
│   │   │       │   │   │   ├── StreamerNode.cpp
│   │   │       │   │   │   ├── StreamerNode.h
│   │   │       │   │   │   ├── WorkletSourceNode.cpp
│   │   │       │   │   │   └── WorkletSourceNode.h
│   │   │       │   │   ├── types/
│   │   │       │   │   │   ├── AudioFormat.h
│   │   │       │   │   │   ├── BiquadFilterType.h
│   │   │       │   │   │   ├── ChannelCountMode.h
│   │   │       │   │   │   ├── ChannelInterpretation.h
│   │   │       │   │   │   ├── ContextState.h
│   │   │       │   │   │   ├── OscillatorType.h
│   │   │       │   │   │   ├── OverSampleType.h
│   │   │       │   │   │   └── ParamEventType.h
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── AudioDecoder.cpp
│   │   │       │   │       ├── AudioDecoder.h
│   │   │       │   │       ├── AudioDestructor.hpp
│   │   │       │   │       ├── AudioFileWriter.cpp
│   │   │       │   │       ├── AudioFileWriter.h
│   │   │       │   │       ├── AudioGraphManager.cpp
│   │   │       │   │       ├── AudioGraphManager.h
│   │   │       │   │       ├── AudioRecorderCallback.cpp
│   │   │       │   │       ├── AudioRecorderCallback.h
│   │   │       │   │       ├── AudioStretcher.cpp
│   │   │       │   │       ├── AudioStretcher.h
│   │   │       │   │       ├── Constants.h
│   │   │       │   │       ├── Locker.h
│   │   │       │   │       ├── RotatingFileWriter.cpp
│   │   │       │   │       ├── RotatingFileWriter.h
│   │   │       │   │       ├── graph/
│   │   │       │   │       │   ├── AudioGraph.hpp
│   │   │       │   │       │   ├── Disposer.hpp
│   │   │       │   │       │   ├── Graph.hpp
│   │   │       │   │       │   ├── HostGraph.hpp
│   │   │       │   │       │   ├── HostNode.hpp
│   │   │       │   │       │   ├── InputPool.hpp
│   │   │       │   │       │   ├── NodeHandle.hpp
│   │   │       │   │       │   └── README.md
│   │   │       │   │       ├── param/
│   │   │       │   │       │   ├── ParamControlQueue.cpp
│   │   │       │   │       │   ├── ParamControlQueue.h
│   │   │       │   │       │   ├── ParamEvent.h
│   │   │       │   │       │   ├── ParamQueueBase.hpp
│   │   │       │   │       │   ├── ParamRenderEventFactory.hpp
│   │   │       │   │       │   ├── ParamRenderQueue.cpp
│   │   │       │   │       │   ├── ParamRenderQueue.h
│   │   │       │   │       │   └── RenderParamEvent.h
│   │   │       │   │       └── worklets/
│   │   │       │   │           ├── SafeIncludes.h
│   │   │       │   │           ├── WorkletsRunner.cpp
│   │   │       │   │           └── WorkletsRunner.h
│   │   │       │   ├── dsp/
│   │   │       │   │   ├── AudioUtils.hpp
│   │   │       │   │   ├── Convolver.cpp
│   │   │       │   │   ├── Convolver.h
│   │   │       │   │   ├── FFT.cpp
│   │   │       │   │   ├── FFT.h
│   │   │       │   │   ├── VectorMath.cpp
│   │   │       │   │   ├── VectorMath.h
│   │   │       │   │   ├── WaveShaper.cpp
│   │   │       │   │   ├── WaveShaper.h
│   │   │       │   │   └── r8brain/
│   │   │       │   │       ├── CDSPBlockConvolver.h
│   │   │       │   │       ├── CDSPFIRFilter.h
│   │   │       │   │       ├── CDSPFracInterpolator.h
│   │   │       │   │       ├── CDSPHBDownsampler.h
│   │   │       │   │       ├── CDSPHBDownsampler.inc
│   │   │       │   │       ├── CDSPHBUpsampler.h
│   │   │       │   │       ├── CDSPHBUpsampler.inc
│   │   │       │   │       ├── CDSPProcessor.h
│   │   │       │   │       ├── CDSPRealFFT.h
│   │   │       │   │       ├── CDSPResampler.h
│   │   │       │   │       ├── CDSPSincFilterGen.h
│   │   │       │   │       ├── Resampler.hpp
│   │   │       │   │       ├── fft/
│   │   │       │   │       │   ├── fft4g.h
│   │   │       │   │       │   ├── pffft.h
│   │   │       │   │       │   ├── pffft_double.c
│   │   │       │   │       │   ├── pffft_double.h
│   │   │       │   │       │   ├── pffft_priv_impl.h
│   │   │       │   │       │   └── simd/
│   │   │       │   │       │       ├── pf_avx_double.h
│   │   │       │   │       │       ├── pf_double.h
│   │   │       │   │       │       ├── pf_neon_double.h
│   │   │       │   │       │       ├── pf_neon_double_from_avx.h
│   │   │       │   │       │       ├── pf_scalar_double.h
│   │   │       │   │       │       └── pf_sse2_double.h
│   │   │       │   │       ├── r8bbase.h
│   │   │       │   │       ├── r8bconf.h
│   │   │       │   │       └── r8butil.h
│   │   │       │   ├── events/
│   │   │       │   │   ├── AudioEvent.h
│   │   │       │   │   ├── AudioEventHandlerRegistry.cpp
│   │   │       │   │   ├── AudioEventHandlerRegistry.h
│   │   │       │   │   └── IAudioEventHandlerRegistry.h
│   │   │       │   ├── external/
│   │   │       │   │   ├── include/
│   │   │       │   │   │   ├── ogg/
│   │   │       │   │   │   │   ├── config_types.h
│   │   │       │   │   │   │   ├── ogg.h
│   │   │       │   │   │   │   └── os_types.h
│   │   │       │   │   │   ├── opus/
│   │   │       │   │   │   │   ├── opus.h
│   │   │       │   │   │   │   ├── opus_defines.h
│   │   │       │   │   │   │   ├── opus_multistream.h
│   │   │       │   │   │   │   ├── opus_projection.h
│   │   │       │   │   │   │   └── opus_types.h
│   │   │       │   │   │   ├── opusfile/
│   │   │       │   │   │   │   └── opusfile.h
│   │   │       │   │   │   └── vorbis/
│   │   │       │   │   │       ├── codec.h
│   │   │       │   │   │       ├── vorbisenc.h
│   │   │       │   │   │       └── vorbisfile.h
│   │   │       │   │   └── include_ffmpeg/
│   │   │       │   │       ├── libavcodec/
│   │   │       │   │       │   ├── ac3_parser.h
│   │   │       │   │       │   ├── adts_parser.h
│   │   │       │   │       │   ├── avcodec.h
│   │   │       │   │       │   ├── avdct.h
│   │   │       │   │       │   ├── bsf.h
│   │   │       │   │       │   ├── codec.h
│   │   │       │   │       │   ├── codec_desc.h
│   │   │       │   │       │   ├── codec_id.h
│   │   │       │   │       │   ├── codec_par.h
│   │   │       │   │       │   ├── d3d11va.h
│   │   │       │   │       │   ├── defs.h
│   │   │       │   │       │   ├── dirac.h
│   │   │       │   │       │   ├── dv_profile.h
│   │   │       │   │       │   ├── dxva2.h
│   │   │       │   │       │   ├── jni.h
│   │   │       │   │       │   ├── mediacodec.h
│   │   │       │   │       │   ├── packet.h
│   │   │       │   │       │   ├── qsv.h
│   │   │       │   │       │   ├── smpte_436m.h
│   │   │       │   │       │   ├── vdpau.h
│   │   │       │   │       │   ├── version.h
│   │   │       │   │       │   ├── version_major.h
│   │   │       │   │       │   ├── videotoolbox.h
│   │   │       │   │       │   └── vorbis_parser.h
│   │   │       │   │       ├── libavformat/
│   │   │       │   │       │   ├── avformat.h
│   │   │       │   │       │   ├── avio.h
│   │   │       │   │       │   ├── version.h
│   │   │       │   │       │   └── version_major.h
│   │   │       │   │       ├── libavutil/
│   │   │       │   │       │   ├── adler32.h
│   │   │       │   │       │   ├── aes.h
│   │   │       │   │       │   ├── aes_ctr.h
│   │   │       │   │       │   ├── ambient_viewing_environment.h
│   │   │       │   │       │   ├── attributes.h
│   │   │       │   │       │   ├── audio_fifo.h
│   │   │       │   │       │   ├── avassert.h
│   │   │       │   │       │   ├── avconfig.h
│   │   │       │   │       │   ├── avstring.h
│   │   │       │   │       │   ├── avutil.h
│   │   │       │   │       │   ├── base64.h
│   │   │       │   │       │   ├── blowfish.h
│   │   │       │   │       │   ├── bprint.h
│   │   │       │   │       │   ├── bswap.h
│   │   │       │   │       │   ├── buffer.h
│   │   │       │   │       │   ├── camellia.h
│   │   │       │   │       │   ├── cast5.h
│   │   │       │   │       │   ├── channel_layout.h
│   │   │       │   │       │   ├── common.h
│   │   │       │   │       │   ├── container_fifo.h
│   │   │       │   │       │   ├── cpu.h
│   │   │       │   │       │   ├── crc.h
│   │   │       │   │       │   ├── csp.h
│   │   │       │   │       │   ├── des.h
│   │   │       │   │       │   ├── detection_bbox.h
│   │   │       │   │       │   ├── dict.h
│   │   │       │   │       │   ├── display.h
│   │   │       │   │       │   ├── dovi_meta.h
│   │   │       │   │       │   ├── downmix_info.h
│   │   │       │   │       │   ├── encryption_info.h
│   │   │       │   │       │   ├── error.h
│   │   │       │   │       │   ├── eval.h
│   │   │       │   │       │   ├── executor.h
│   │   │       │   │       │   ├── ffversion.h
│   │   │       │   │       │   ├── fifo.h
│   │   │       │   │       │   ├── file.h
│   │   │       │   │       │   ├── film_grain_params.h
│   │   │       │   │       │   ├── frame.h
│   │   │       │   │       │   ├── hash.h
│   │   │       │   │       │   ├── hdr_dynamic_metadata.h
│   │   │       │   │       │   ├── hdr_dynamic_vivid_metadata.h
│   │   │       │   │       │   ├── hmac.h
│   │   │       │   │       │   ├── hwcontext.h
│   │   │       │   │       │   ├── hwcontext_amf.h
│   │   │       │   │       │   ├── hwcontext_cuda.h
│   │   │       │   │       │   ├── hwcontext_d3d11va.h
│   │   │       │   │       │   ├── hwcontext_d3d12va.h
│   │   │       │   │       │   ├── hwcontext_drm.h
│   │   │       │   │       │   ├── hwcontext_dxva2.h
│   │   │       │   │       │   ├── hwcontext_mediacodec.h
│   │   │       │   │       │   ├── hwcontext_oh.h
│   │   │       │   │       │   ├── hwcontext_opencl.h
│   │   │       │   │       │   ├── hwcontext_qsv.h
│   │   │       │   │       │   ├── hwcontext_vaapi.h
│   │   │       │   │       │   ├── hwcontext_vdpau.h
│   │   │       │   │       │   ├── hwcontext_videotoolbox.h
│   │   │       │   │       │   ├── hwcontext_vulkan.h
│   │   │       │   │       │   ├── iamf.h
│   │   │       │   │       │   ├── imgutils.h
│   │   │       │   │       │   ├── intfloat.h
│   │   │       │   │       │   ├── intreadwrite.h
│   │   │       │   │       │   ├── lfg.h
│   │   │       │   │       │   ├── log.h
│   │   │       │   │       │   ├── lzo.h
│   │   │       │   │       │   ├── macros.h
│   │   │       │   │       │   ├── mastering_display_metadata.h
│   │   │       │   │       │   ├── mathematics.h
│   │   │       │   │       │   ├── md5.h
│   │   │       │   │       │   ├── mem.h
│   │   │       │   │       │   ├── motion_vector.h
│   │   │       │   │       │   ├── murmur3.h
│   │   │       │   │       │   ├── opt.h
│   │   │       │   │       │   ├── parseutils.h
│   │   │       │   │       │   ├── pixdesc.h
│   │   │       │   │       │   ├── pixelutils.h
│   │   │       │   │       │   ├── pixfmt.h
│   │   │       │   │       │   ├── random_seed.h
│   │   │       │   │       │   ├── rational.h
│   │   │       │   │       │   ├── rc4.h
│   │   │       │   │       │   ├── refstruct.h
│   │   │       │   │       │   ├── replaygain.h
│   │   │       │   │       │   ├── ripemd.h
│   │   │       │   │       │   ├── samplefmt.h
│   │   │       │   │       │   ├── sha.h
│   │   │       │   │       │   ├── sha512.h
│   │   │       │   │       │   ├── spherical.h
│   │   │       │   │       │   ├── stereo3d.h
│   │   │       │   │       │   ├── tdrdi.h
│   │   │       │   │       │   ├── tea.h
│   │   │       │   │       │   ├── threadmessage.h
│   │   │       │   │       │   ├── timecode.h
│   │   │       │   │       │   ├── timestamp.h
│   │   │       │   │       │   ├── tree.h
│   │   │       │   │       │   ├── twofish.h
│   │   │       │   │       │   ├── tx.h
│   │   │       │   │       │   ├── uuid.h
│   │   │       │   │       │   ├── version.h
│   │   │       │   │       │   ├── video_enc_params.h
│   │   │       │   │       │   ├── video_hint.h
│   │   │       │   │       │   └── xtea.h
│   │   │       │   │       └── libswresample/
│   │   │       │   │           ├── swresample.h
│   │   │       │   │           ├── version.h
│   │   │       │   │           └── version_major.h
│   │   │       │   ├── jsi/
│   │   │       │   │   ├── JsiHostObject.cpp
│   │   │       │   │   ├── JsiHostObject.h
│   │   │       │   │   ├── JsiPromise.cpp
│   │   │       │   │   ├── JsiPromise.h
│   │   │       │   │   ├── JsiUtils.cpp
│   │   │       │   │   ├── JsiUtils.h
│   │   │       │   │   ├── RuntimeAwareCache.h
│   │   │       │   │   ├── RuntimeLifecycleMonitor.cpp
│   │   │       │   │   └── RuntimeLifecycleMonitor.h
│   │   │       │   ├── libs/
│   │   │       │   │   ├── audio-stretch/
│   │   │       │   │   │   ├── stretch.c
│   │   │       │   │   │   └── stretch.h
│   │   │       │   │   ├── base64/
│   │   │       │   │   │   └── base64.h
│   │   │       │   │   ├── decoding/
│   │   │       │   │   │   └── IncrementalAudioDecoder.h
│   │   │       │   │   ├── ffmpeg/
│   │   │       │   │   │   ├── FFmpegDecoding.cpp
│   │   │       │   │   │   ├── FFmpegDecoding.h
│   │   │       │   │   │   └── relinking.md
│   │   │       │   │   ├── miniaudio/
│   │   │       │   │   │   ├── MiniAudioDecoding.cpp
│   │   │       │   │   │   ├── MiniAudioDecoding.h
│   │   │       │   │   │   ├── decoders/
│   │   │       │   │   │   │   ├── libopus/
│   │   │       │   │   │   │   │   ├── miniaudio_libopus.c
│   │   │       │   │   │   │   │   └── miniaudio_libopus.h
│   │   │       │   │   │   │   └── libvorbis/
│   │   │       │   │   │   │       ├── miniaudio_libvorbis.c
│   │   │       │   │   │   │       └── miniaudio_libvorbis.h
│   │   │       │   │   │   └── miniaudio.h
│   │   │       │   │   ├── pffft/
│   │   │       │   │   │   ├── pffft.c
│   │   │       │   │   │   └── pffft.h
│   │   │       │   │   └── signalsmith-stretch/
│   │   │       │   │       ├── fft-pffft.h
│   │   │       │   │       ├── fft.h
│   │   │       │   │       ├── signalsmith-stretch.h
│   │   │       │   │       └── stft.h
│   │   │       │   ├── types/
│   │   │       │   │   └── NodeOptions.h
│   │   │       │   └── utils/
│   │   │       │       ├── AlignedAllocator.hpp
│   │   │       │       ├── AudioArray.hpp
│   │   │       │       ├── AudioArrayBuffer.hpp
│   │   │       │       ├── AudioBuffer.hpp
│   │   │       │       ├── AudioFileProperties.cpp
│   │   │       │       ├── AudioFileProperties.h
│   │   │       │       ├── Benchmark.hpp
│   │   │       │       ├── BoundedPriorityQueue.hpp
│   │   │       │       ├── CircularArray.hpp
│   │   │       │       ├── CircularOverflowableAudioArray.cpp
│   │   │       │       ├── CircularOverflowableAudioArray.h
│   │   │       │       ├── CrossThreadEventScheduler.hpp
│   │   │       │       ├── FatFunction.hpp
│   │   │       │       ├── Macros.h
│   │   │       │       ├── MiniaudioImplementation.cpp
│   │   │       │       ├── MoveOnlyFunction.hpp
│   │   │       │       ├── Result.hpp
│   │   │       │       ├── SpscChannel.hpp
│   │   │       │       ├── TaskOffloader.hpp
│   │   │       │       ├── ThreadPool.hpp
│   │   │       │       ├── TripleBuffer.hpp
│   │   │       │       └── UnitConversion.h
│   │   │       ├── clangd/
│   │   │       │   ├── CMakeLists.txt
│   │   │       │   ├── SETUP.md
│   │   │       │   └── generate-and-copy.sh
│   │   │       └── test/
│   │   │           ├── CMakeLists.txt
│   │   │           ├── Dockerfile
│   │   │           ├── RunTests.sh
│   │   │           ├── RunTestsGraph.sh
│   │   │           ├── RunTestsGraphDocker.sh
│   │   │           ├── graph_tests_docs.md
│   │   │           └── src/
│   │   │               ├── FatFunctionTest.cpp
│   │   │               ├── MockAudioEventHandlerRegistry.h
│   │   │               ├── core/
│   │   │               │   ├── AudioParamTest.cpp
│   │   │               │   ├── effects/
│   │   │               │   │   ├── DelayTest.cpp
│   │   │               │   │   ├── GainTest.cpp
│   │   │               │   │   ├── IIRFilterTest.cpp
│   │   │               │   │   ├── StereoPannerTest.cpp
│   │   │               │   │   ├── WaveShaperNodeTest.cpp
│   │   │               │   │   └── biquad/
│   │   │               │   │       ├── BiquadFilterChromium.cpp
│   │   │               │   │       ├── BiquadFilterChromium.h
│   │   │               │   │       ├── BiquadFilterTest.cpp
│   │   │               │   │       └── BiquadFilterTest.h
│   │   │               │   └── sources/
│   │   │               │       ├── AudioScheduledSourceTest.cpp
│   │   │               │       ├── ConstantSourceTest.cpp
│   │   │               │       └── OscillatorTest.cpp
│   │   │               ├── graph/
│   │   │               │   ├── AudioGraphFuzzTest.cpp
│   │   │               │   ├── AudioGraphTest.cpp
│   │   │               │   ├── AudioThreadGuard.cpp
│   │   │               │   ├── AudioThreadGuard.h
│   │   │               │   ├── GraphCycleDebugTest.cpp
│   │   │               │   ├── GraphFuzzTest.cpp
│   │   │               │   ├── GraphTest.cpp
│   │   │               │   ├── HostGraphTest.cpp
│   │   │               │   ├── MockGraphProcessor.h
│   │   │               │   ├── TestGraphUtils.cpp
│   │   │               │   └── TestGraphUtils.h
│   │   │               └── utils/
│   │   │                   ├── AudioArrayTest.cpp
│   │   │                   ├── AudioBufferTest.cpp
│   │   │                   └── TripleBufferTest.cpp
│   │   ├── development/
│   │   │   └── react/
│   │   │       └── package.json
│   │   ├── ios/
│   │   │   └── audioapi/
│   │   │       └── ios/
│   │   │           ├── AudioAPIModule.h
│   │   │           ├── AudioAPIModule.mm
│   │   │           ├── core/
│   │   │           │   ├── IOSAudioPlayer.h
│   │   │           │   ├── IOSAudioPlayer.mm
│   │   │           │   ├── IOSAudioRecorder.h
│   │   │           │   ├── IOSAudioRecorder.mm
│   │   │           │   ├── NativeAudioPlayer.h
│   │   │           │   ├── NativeAudioPlayer.m
│   │   │           │   ├── NativeAudioRecorder.h
│   │   │           │   ├── NativeAudioRecorder.m
│   │   │           │   └── utils/
│   │   │           │       ├── FileOptions.h
│   │   │           │       ├── FileOptions.mm
│   │   │           │       ├── IOSFileWriter.h
│   │   │           │       ├── IOSFileWriter.mm
│   │   │           │       ├── IOSRecorderCallback.h
│   │   │           │       ├── IOSRecorderCallback.mm
│   │   │           │       ├── IOSRotatingFileWriter.h
│   │   │           │       └── IOSRotatingFileWriter.mm
│   │   │           └── system/
│   │   │               ├── AudioEngine.h
│   │   │               ├── AudioEngine.mm
│   │   │               ├── AudioSessionManager.h
│   │   │               ├── AudioSessionManager.mm
│   │   │               ├── SystemNotificationManager.h
│   │   │               ├── SystemNotificationManager.mm
│   │   │               └── notification/
│   │   │                   ├── BaseNotification.h
│   │   │                   ├── NotificationRegistry.h
│   │   │                   ├── NotificationRegistry.mm
│   │   │                   ├── PlaybackNotification.h
│   │   │                   └── PlaybackNotification.mm
│   │   ├── mock/
│   │   │   └── package.json
│   │   ├── package.json
│   │   ├── scripts/
│   │   │   ├── check-audio-events-sync.sh
│   │   │   ├── cpplint.sh
│   │   │   ├── create-package.sh
│   │   │   ├── download-prebuilt-binaries.sh
│   │   │   ├── rnaa_utils.rb
│   │   │   ├── setup-rn-audio-api-web.js
│   │   │   └── validate-worklets-version.js
│   │   ├── src/
│   │   │   ├── AudioAPIModule/
│   │   │   │   ├── AudioAPIModule.ts
│   │   │   │   ├── AudioAPIModule.web.ts
│   │   │   │   ├── ModuleInterfaces.ts
│   │   │   │   ├── globals.d.ts
│   │   │   │   └── index.ts
│   │   │   ├── api.ts
│   │   │   ├── api.web.ts
│   │   │   ├── core/
│   │   │   │   ├── AnalyserNode.ts
│   │   │   │   ├── AudioBuffer.ts
│   │   │   │   ├── AudioBufferBaseSourceNode.ts
│   │   │   │   ├── AudioBufferQueueSourceNode.ts
│   │   │   │   ├── AudioBufferSourceNode.ts
│   │   │   │   ├── AudioContext.ts
│   │   │   │   ├── AudioDecoder.ts
│   │   │   │   ├── AudioDestinationNode.ts
│   │   │   │   ├── AudioNode.ts
│   │   │   │   ├── AudioParam.ts
│   │   │   │   ├── AudioRecorder.ts
│   │   │   │   ├── AudioScheduledSourceNode.ts
│   │   │   │   ├── AudioStretcher.ts
│   │   │   │   ├── BaseAudioContext.ts
│   │   │   │   ├── BiquadFilterNode.ts
│   │   │   │   ├── ConstantSourceNode.ts
│   │   │   │   ├── ConvolverNode.ts
│   │   │   │   ├── DelayNode.ts
│   │   │   │   ├── GainNode.ts
│   │   │   │   ├── IIRFilterNode.ts
│   │   │   │   ├── OfflineAudioContext.ts
│   │   │   │   ├── OscillatorNode.ts
│   │   │   │   ├── PeriodicWave.ts
│   │   │   │   ├── RecorderAdapterNode.ts
│   │   │   │   ├── StereoPannerNode.ts
│   │   │   │   ├── StreamerNode.ts
│   │   │   │   ├── WaveShaperNode.ts
│   │   │   │   ├── WorkletNode.ts
│   │   │   │   ├── WorkletProcessingNode.ts
│   │   │   │   └── WorkletSourceNode.ts
│   │   │   ├── development/
│   │   │   │   └── react/
│   │   │   │       ├── Audio/
│   │   │   │       │   ├── Audio.tsx
│   │   │   │       │   ├── Audio.web.tsx
│   │   │   │       │   ├── AudioFileSourceNode.ts
│   │   │   │       │   ├── AudioTagContext.ts
│   │   │   │       │   ├── controls/
│   │   │   │       │   │   ├── AudioControls.tsx
│   │   │   │       │   │   └── audioControlUtils.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── types.ts
│   │   │   │       │   └── utils.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── types.d.ts
│   │   │   ├── errors/
│   │   │   │   ├── AudioApiError.ts
│   │   │   │   ├── IndexSizeError.ts
│   │   │   │   ├── InvalidAccessError.ts
│   │   │   │   ├── InvalidStateError.ts
│   │   │   │   ├── NotSupportedError.ts
│   │   │   │   ├── RangeError.ts
│   │   │   │   └── index.ts
│   │   │   ├── events/
│   │   │   │   ├── AudioEventEmitter.ts
│   │   │   │   ├── AudioEventSubscription.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── hooks/
│   │   │   │   ├── index.ts
│   │   │   │   ├── useAudioInput.ts
│   │   │   │   └── useSystemVolume.ts
│   │   │   ├── index.ts
│   │   │   ├── interfaces.ts
│   │   │   ├── mock/
│   │   │   │   └── index.ts
│   │   │   ├── options-validators.ts
│   │   │   ├── plugin/
│   │   │   │   └── withAudioAPI.ts
│   │   │   ├── specs/
│   │   │   │   ├── NativeAudioAPIModule.ts
│   │   │   │   ├── NativeAudioAPIModule.web.ts
│   │   │   │   └── index.ts
│   │   │   ├── system/
│   │   │   │   ├── AudioManager.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── notification/
│   │   │   │   │   ├── PlaybackNotificationManager.ts
│   │   │   │   │   ├── RecordingNotificationManager.ios.ts
│   │   │   │   │   ├── RecordingNotificationManager.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── types.ts
│   │   │   ├── types.ts
│   │   │   ├── utils/
│   │   │   │   ├── filePresets.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── paths.ts
│   │   │   ├── web-core/
│   │   │   │   ├── AnalyserNode.tsx
│   │   │   │   ├── AudioBuffer.tsx
│   │   │   │   ├── AudioBufferSourceNode.tsx
│   │   │   │   ├── AudioContext.tsx
│   │   │   │   ├── AudioDestinationNode.tsx
│   │   │   │   ├── AudioNode.tsx
│   │   │   │   ├── AudioParam.tsx
│   │   │   │   ├── AudioScheduledSourceNode.tsx
│   │   │   │   ├── BaseAudioContext.tsx
│   │   │   │   ├── BiquadFilterNode.tsx
│   │   │   │   ├── ConstantSourceNode.tsx
│   │   │   │   ├── ConvolverNode.tsx
│   │   │   │   ├── ConvolverNodeOptions.tsx
│   │   │   │   ├── DelayNode.tsx
│   │   │   │   ├── GainNode.tsx
│   │   │   │   ├── IIRFilterNode.tsx
│   │   │   │   ├── OfflineAudioContext.tsx
│   │   │   │   ├── OscillatorNode.tsx
│   │   │   │   ├── PeriodicWave.tsx
│   │   │   │   ├── StereoPannerNode.tsx
│   │   │   │   ├── WaveShaperNode.tsx
│   │   │   │   └── custom/
│   │   │   │       ├── LoadCustomWasm.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── signalsmithStretch/
│   │   │   │           ├── LICENSE.txt
│   │   │   │           ├── README.md
│   │   │   │           └── SignalsmithStretch.mjs
│   │   │   └── web-system/
│   │   │       ├── AudioManager.ts
│   │   │       ├── index.ts
│   │   │       └── notification/
│   │   │           ├── PlaybackNotificationManager.ts
│   │   │           ├── RecordingNotificationManager.ts
│   │   │           └── index.ts
│   │   ├── tests/
│   │   │   ├── CLAUDE.md
│   │   │   ├── integration.test.ts
│   │   │   ├── jest.config.json
│   │   │   ├── mock.test.ts
│   │   │   └── setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   └── turbo.json
│   └── test-app-screen/
│       ├── .gitignore
│       ├── index.ts
│       ├── package.json
│       ├── src/
│       │   ├── AudioBufferTest.ts
│       │   ├── OscillatorTest.ts
│       │   ├── RecorderTest.ts
│       │   ├── StreamingTest.ts
│       │   ├── Test.tsx
│       │   ├── WorkletsTest.ts
│       │   └── constants.ts
│       └── tsconfig.json
├── prettier.config.js
├── scripts/
│   └── collect-knowledge-changes.sh
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .claude/README.md
================================================
# Claude Code Setup

This directory contains project-specific configuration for [Claude Code](https://claude.ai/code).

## Structure

```
.claude/
├── settings.json              # Tool permissions and MCP server configuration
├── last-knowledge-update      # Tracks last SHA processed by /pre-push-update
├── commands/
│   └── pre-push-update.md     # /pre-push-update slash command
├── skills/
│   ├── audio-nodes/
│   │   ├── SKILL.md           # C++ audio node engine
│   │   ├── gainnode-example.md
│   │   └── maintenance.md     # For /pre-push-update only
│   ├── host-objects/
│   │   ├── SKILL.md           # JSI HostObject layer
│   │   ├── examples.md
│   │   └── maintenance.md
│   ├── build-compilation-dependencies/
│   │   ├── SKILL.md           # CMake, Gradle, podspec, prebuilt libs
│   │   ├── build-details.md
│   │   └── maintenance.md
│   ├── utilities/
│   │   ├── SKILL.md           # Shared C++ and TS utilities
│   │   ├── api.md
│   │   └── maintenance.md
│   ├── native-ios/
│   │   ├── SKILL.md           # iOS native layer
│   │   └── maintenance.md
│   ├── native-android/
│   │   ├── SKILL.md           # Android native layer
│   │   └── maintenance.md
│   ├── turbo-modules/
│   │   ├── SKILL.md           # TurboModule/JSI wiring
│   │   └── maintenance.md
│   ├── web-audio-api/
│   │   ├── SKILL.md           # Web Audio API spec conformance
│   │   └── maintenance.md
│   ├── thread-safety-itc/
│   │   ├── SKILL.md           # Audio thread safety & ITC
│   │   └── maintenance.md
│   ├── post-work-checks/
│   │   ├── SKILL.md           # Checklist after every change
│   │   └── maintenance.md
│   ├── flow/
│   │   ├── SKILL.md           # End-to-end feature flow
│   │   └── maintenance.md
│   └── writing-skills/
│       ├── SKILL.md           # How to write and maintain skill files (meta)
│       └── maintenance.md
└── README.md                  # This file
```

## Skills

Skill files are a reference library for Claude. Each skill lives in its own directory (`.claude/skills/<name>/SKILL.md`) and is **auto-loaded** by Claude Code based on the YAML frontmatter `name` and `description` fields. The description contains trigger phrases — when the conversation context matches, the skill is surfaced automatically.

Skills use a **three-level progressive disclosure model**:
1. **Frontmatter** — always loaded; name + description with trigger phrases
2. **`SKILL.md` body** — loaded when the skill is triggered; concise patterns and APIs
3. **Supporting `.md` files** (e.g. `gainnode-example.md`, `build-details.md`) — linked from `SKILL.md`; loaded explicitly when deep reference is needed

Skills are intentionally kept concise (under 500 lines). They answer "what exists and how do I use it", not "how is it implemented". Verbose material (full code examples, deep build analysis, complete API docs for large `.hpp` files) lives alongside `SKILL.md` in the same skill directory.

**To update a skill manually**: edit the relevant `SKILL.md` file directly.

**To keep skills in sync with code automatically**: use `/pre-push-update` (see below).

## Maintenance Files

Every skill directory has a `maintenance.md` file. It maps source file path patterns to what needs checking in that skill when those paths change. This file is **not loaded during normal skill usage** — only `/pre-push-update` reads it.

**Purpose**: when `/pre-push-update` runs, it reads each relevant skill's `maintenance.md` to decide exactly which sections to review. Without this table, Claude has to guess — with it, the mapping is explicit and reliable.

**Format** (same in every `maintenance.md`):

```markdown
# Maintenance — skill-name

> Used by /pre-push-update only — not loaded during skill usage.

| Path | What to check |
|---|---|
| `path/to/file.*` | What in this skill to review or update |
```

Each `SKILL.md` ends with a single footer line: `*Maintenance: see [maintenance.md](maintenance.md).*`

Supporting files (e.g. `gainnode-example.md`) do **not** have their own maintenance sections — their rows are merged into the skill's `maintenance.md`.

**Rule**: if you add a new pattern, invariant, or code example to a skill, also add or update the relevant row in `maintenance.md` so future runs of `/pre-push-update` know to revisit it.

## `/pre-push-update` command

A slash command that reviews all commits since its last run and updates skill files to reflect what changed.

### How it works

1. `scripts/collect-knowledge-changes.sh` reads `.claude/last-knowledge-update` for the last-processed git SHA. On first run (empty file), it falls back to `HEAD~10`.
2. The script outputs:
   - All commits in the range
   - **All changed files** (full stat, unfiltered) — Claude uses this to triage what is interesting
   - **Source diff** filtered to `*.h / *.hpp / *.cpp / *.mm / *.kt / *.ts / *.tsx` inside the tracked source directories
   - **Maintenance tables** — all `maintenance.md` files concatenated, so Claude knows exactly which sections to review without extra file reads
3. Claude reads the output, classifies each changed path against the skill map, and makes targeted additions or corrections.
4. Claude advances `.claude/last-knowledge-update` to the new HEAD SHA.

### When to run it

Run it before pushing a branch, after merging a PR, or whenever you feel the skill files may have drifted from the code. It is safe to run at any time — it only reads git history and writes to `.claude/`.

```bash
# Inside a Claude Code session:
/pre-push-update
```

### What it updates

| Change type | Action |
|---|---|
| New audio node class | Add entry to `audio-nodes/SKILL.md` |
| New HostObject pattern | Add entry to `host-objects/SKILL.md` |
| New utility helper | Add entry to `utilities/SKILL.md` |
| Renamed/moved class referenced in a skill | Correct the reference |
| New thread-safety invariant | Add to `thread-safety-itc/SKILL.md` |
| Pure formatting / test-only / CI changes | Skipped |

### What it does NOT do

- Rewrite skills from scratch
- Document internal implementation details
- Process binary files, lock files, or generated code
- Touch anything outside `.claude/`

### Marker file

`.claude/last-knowledge-update` contains the SHA of the last commit that was successfully processed. If it is empty or the SHA is not found in history, the script falls back to `HEAD~10`. You can reset it manually by writing any valid commit SHA.

```bash
# Reset to a specific commit (process everything since that point next run)
git rev-parse <commit-ish> > .claude/last-knowledge-update

# Reset to process the last 20 commits next run
git rev-parse HEAD~20 > .claude/last-knowledge-update
```

### Diff limits

The script caps the source diff at **4000 lines**. If a batch of commits exceeds this, the diff is truncated with a warning. In that case run `/pre-push-update` more frequently, or review large refactors manually.

## `settings.json`

Defines tool permissions for Claude Code:

- **Always allow**: `yarn build/lint/format/test`, read-only git commands, reading all source files, writing/editing `.claude/**` and `**/CLAUDE.md`, common inspection commands (`ls`, `which`, etc.)
- **Ask before**: destructive git operations (`commit`, `push`, `reset`, `checkout`, etc.), `yarn clean`
- **Always deny**: force push, `rm -rf`, `sudo`, reading build artifacts and binary files

Also configures MCP servers:
- `filesystem` — `@modelcontextprotocol/server-filesystem` pointed at the repo root
- `lsp` — `mcp-language-server` using `typescript-language-server` for TS/JS code intelligence


================================================
FILE: .claude/commands/pre-push-update.md
================================================
Run the knowledge update process: collect all commits since the last update, analyse what changed, and update skill files and CLAUDE.md accordingly.

## Step 1 — Collect changes

Run the collection script:

```bash
bash scripts/collect-knowledge-changes.sh
```

If the output starts with `NO_NEW_COMMITS`, stop here and tell the user there is nothing to update.

## Step 2 — Triage the changed files

Look at the **ALL CHANGED FILES** section first. Use it to decide which changes are worth deep analysis. Classify each changed path:

| Path pattern | Potentially affects |
|---|---|
| `common/cpp/audioapi/core/` | `audio-nodes/SKILL.md` (+ `audio-nodes/gainnode-example.md`) |
| `common/cpp/audioapi/HostObjects/` | `host-objects/SKILL.md` (+ `host-objects/examples.md`) |
| `common/cpp/audioapi/utils/` or `dsp/` | `utilities/SKILL.md` (+ `utilities/api.md`) |
| `common/cpp/audioapi/events/` or `core/utils/Audio*` | `thread-safety-itc/SKILL.md` |
| `android/src/main/` | `native-android/SKILL.md` |
| `ios/` | `native-ios/SKILL.md` |
| `src/specs/` or `AudioAPIModule.*` | `turbo-modules/SKILL.md` |
| `src/` (TypeScript) | `turbo-modules/SKILL.md` or `web-audio-api/SKILL.md` |
| `CMakeLists.txt`, `*.podspec`, `*.gradle` | `build-compilation-dependencies/SKILL.md` (+ `build-compilation-dependencies/build-details.md`) |
| `.claude/` | CLAUDE.md itself |

For each identified skill, check the **MAINTENANCE TABLES** section at the end of the script output — it contains every skill's `maintenance.md` so you can see exactly which sections to review without additional file reads.

**Skip a file entirely if:**
- It is a test file with no new patterns (e.g. adding a test for existing behaviour)
- The change is purely formatting/whitespace
- It is a dependency version bump
- It is CI config, example app, or lock file

## Step 3 — Read the source diff

Read the **SOURCE DIFF** section for the files you decided are interesting. For each interesting change ask:

1. **New API or class?** — Is there a new class, method, or utility that a developer working in this area would want to know about? If yes, add a concise entry to the relevant skill file.

2. **New pattern or invariant?** — Did the change reveal a non-obvious pattern, rule, or constraint (e.g. "this must always be called before X", "this field is audio-thread only")? If yes, document it in the relevant skill file.

3. **Broken reference?** — Does the diff rename, move, or delete something that is currently mentioned in a skill file or CLAUDE.md? If yes, correct the reference.

4. **New utility?** — Was a utility helper added to `utils/` or `dsp/`? If yes, add it to `utilities.md` following the existing format (brief usage note for `.h` files, inline docs for `.hpp`).

5. **Nothing documentable?** — If the change is purely internal implementation with no effect on the documented API, patterns, or invariants — skip it.

## Step 4 — Update skill files

Apply only targeted, minimal additions or corrections. Do **not**:
- Rewrite skill files from scratch
- Add documentation for every changed line
- Document internal implementation details that are only useful when reading that specific file

Read each skill file you intend to modify before editing it.

## Step 5 — Advance the marker

Extract the `HEAD_SHA=<sha>` line from the script output. Write only that SHA (no newline, no extra text) to `.claude/last-knowledge-update`.

```bash
# replace <sha> with the actual SHA from the last line of script output
printf '%s' '<sha>' > .claude/last-knowledge-update
```

To reset the marker to "empty" (so the next run falls back to HEAD~10), use:
```bash
> .claude/last-knowledge-update
```
(`touch` only updates the timestamp — it does **not** clear the file contents.)

## Step 6 — Report

Tell the user:
- Which skill files were updated and why (one line each)
- Which files were skipped and why (brief)
- The new marker SHA


================================================
FILE: .claude/hooks/double-prompt.js
================================================
#!/usr/bin/env node
// UserPromptSubmit hook — repeats the user's prompt as additionalContext.
// Research suggests repeating the instruction improves instruction-following.

let data = '';
process.stdin.setEncoding('utf8');
process.stdin.on('data', chunk => { data += chunk; });
process.stdin.on('end', () => {
  try {
    const input = JSON.parse(data);
    const prompt = (input.prompt || '').trim();
    if (prompt.length >= 500) {
      process.stdout.write(JSON.stringify({ additionalContext: prompt }));
    }
  } catch (_) {
    // parsing failed — output nothing, hook is a no-op
  }
});


================================================
FILE: .claude/last-knowledge-update
================================================
69e3f98f9413eca44ba6ef375636873a92184587


================================================
FILE: .claude/settings.json
================================================
{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "respectGitIgnore": true,
  "permissions": {
    "allow": [
      "Bash(yarn build)",
      "Bash(yarn lint*)",
      "Bash(yarn format*)",
      "Bash(yarn typecheck)",
      "Bash(yarn test)",
      "Bash(yarn check-audio-enum-sync)",
      "Bash(yarn workspace *)",
      "Bash(git status)",
      "Bash(git diff*)",
      "Bash(git log*)",
      "Bash(git branch*)",
      "Bash(git show*)",
      "Bash(cmake *)",
      "Bash(clang-format *)",
      "Bash(node *)",
      "Bash(npx prettier*)",

      "Bash(ls*)",
      "Bash(pwd)",
      "Bash(which *)",
      "Bash(type *)",
      "Bash(file *)",
      "Bash(wc *)",
      "Bash(bash scripts/collect-knowledge-changes.sh*)",
      "Bash(printf '%s' * > .claude/last-knowledge-update)",
      "Bash(> .claude/last-knowledge-update)",

      "Read(**)",

      "WebFetch(https://webaudio.github.io/*)",
      "WebFetch(https://developer.mozilla.org/*)",
      "WebFetch(https://en.cppreference.com/*)",
      "WebFetch(https://reactnative.dev/*)",
      "WebSearch(*)",

      "Write(.claude/**)",
      "Edit(.claude/**)",
      "Write(CLAUDE.md)",
      "Edit(CLAUDE.md)",
      "Write(apps/CLAUDE.md)",
      "Edit(apps/CLAUDE.md)",
      "Write(packages/*/CLAUDE.md)",
      "Edit(packages/*/CLAUDE.md)",
      "Write(packages/react-native-audio-api/tests/CLAUDE.md)",
      "Edit(packages/react-native-audio-api/tests/CLAUDE.md)"
    ],
    "ask": [
      "Bash(git add*)",
      "Bash(git commit*)",
      "Bash(git push*)",
      "Bash(git merge*)",
      "Bash(git rebase*)",
      "Bash(git reset*)",
      "Bash(git checkout *)",
      "Bash(git stash*)",
      "Bash(yarn clean)"
    ],
    "deny": [
      "Bash(git push --force*)",
      "Bash(rm -rf *)",
      "Bash(sudo *)",

      "Read(**/node_modules/**)",
      "Read(**/Pods/**)",
      "Read(**/vendor/bundle/**)",

      "Read(**/build/**)",
      "Read(**/lib/**)",
      "Read(**/.turbo/**)",
      "Read(**/.gradle/**)",
      "Read(**/.cxx/**)",
      "Read(**/.kotlin/**)",
      "Read(**/DerivedData/**)",
      "Read(**/*.xcuserstate)",
      "Read(**/*.pbxuser)",
      "Read(**/*.hmap)",
      "Read(**/*.ipa)",

      "Read(**/jniLibs/**)",
      "Read(**/*.a)",
      "Read(**/*.xcframework/**)",
      "Read(**/ffmpeg_ios/**)",
      "Read(**/openssl-prebuilt/**)",
      "Read(**/prebuilt_libs/**)",
      "Read(**/output/**)",

      "Read(**/CMakeFiles/**)",

      "Read(yarn.lock)",
      "Read(**/Gemfile.lock)",
      "Read(**/Podfile.lock)",

      "Read(**/*.png)",
      "Read(**/*.jpg)",
      "Read(**/*.jpeg)",
      "Read(**/*.gif)",
      "Read(**/*.webp)",
      "Read(**/*.ico)",
      "Read(**/*.svg)",
      "Read(**/*.ttf)",
      "Read(**/*.otf)",
      "Read(**/*.woff)",
      "Read(**/*.woff2)",
      "Read(**/*.mp3)",
      "Read(**/*.wav)",
      "Read(**/*.ogg)",
      "Read(**/*.aac)"
    ]
  },
  "hooks": {
    "UserPromptSubmit": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "node .claude/hooks/double-prompt.js"
          }
        ]
      }
    ]
  },
  "mcpServers": {
    "lsp": {
      "command": "npx",
      "args": ["-y", "mcp-language-server", "--stdio"],
      "env": {
        "LSP_COMMAND": "typescript-language-server",
        "LSP_ARGS": "--stdio"
      }
    }
  }
}


================================================
FILE: .claude/skills/audio-nodes/SKILL.md
================================================
---
name: audio-nodes
description: >
  C++ audio node engine for react-native-audio-api. Covers the AudioNode class hierarchy, the processNode() audio-thread contract (no allocs, no locks, no blocking I/O), AudioParam a-rate/k-rate processing, cross-thread communication patterns (CrossThreadEventScheduler, IAudioEventHandlerRegistry), and a step-by-step checklist for implementing a new node end-to-end. Use this skill when implementing a new Web Audio API node, modifying audio graph traversal or processing logic, or debugging audio rendering artifacts. Trigger phrases: "add a new node", "implement AudioNode", "processNode", "audio thread", "AudioParam automation".
---

# Skill: AudioNodes

Golden references: `GainNode.h/.cpp` (effect node), `OscillatorNode.h/.cpp` (scheduled source). Mirror their structure for any new node. See [gainnode-example.md](gainnode-example.md) for an annotated header + .cpp.

**If spec defaults or parameter ranges are unclear → fetch https://webaudio.github.io/web-audio-api/ before writing any constructor code.**

---

## Directory Structure

```
common/cpp/audioapi/core/
├── AudioNode.h / .cpp               # Base class for all nodes
├── AudioParam.h / .cpp              # Automatable parameter
├── BaseAudioContext.h / .cpp        # Engine + node factory
├── AudioContext.h / .cpp            # Real-time context
├── OfflineAudioContext.h / .cpp     # Offline rendering context
├── sources/
│   ├── AudioScheduledSourceNode.h   # Base for start/stop sources (INTERNAL)
│   ├── AudioBufferBaseSourceNode.h  # Base for buffer playback (INTERNAL)
│   ├── OscillatorNode.h / .cpp
│   ├── AudioBufferSourceNode.h / .cpp
│   ├── AudioBufferQueueSourceNode.h / .cpp
│   ├── ConstantSourceNode.h / .cpp
│   ├── StreamerNode.h / .cpp        # FFmpeg-based (conditional)
│   ├── WorkletSourceNode.h / .cpp
│   └── RecorderAdapterNode.h / .cpp
├── effects/
│   ├── GainNode.h / .cpp
│   ├── BiquadFilterNode.h / .cpp
│   ├── DelayNode.h / .cpp
│   ├── IIRFilterNode.h / .cpp
│   ├── StereoPannerNode.h / .cpp
│   ├── WaveShaperNode.h / .cpp
│   ├── ConvolverNode.h / .cpp
│   ├── WorkletNode.h / .cpp
│   └── PeriodicWave.h / .cpp        # Wave table (not a node)
├── analysis/
│   └── AnalyserNode.h / .cpp
├── destinations/
│   └── AudioDestinationNode.h / .cpp
├── inputs/
│   └── AudioRecorder.h / .cpp
└── utils/
    └── AudioGraphManager.h / .cpp
```

---

## The Audio Thread Contract

`processNode()` runs on the **audio thread** — the real-time rendering thread driven by the native audio driver (Oboe on Android, CoreAudio on iOS). This thread has strict requirements:

**MUST NOT in `processNode()`:**
- Allocate or free memory (`new`, `delete`, `malloc`, `free`, `std::vector::push_back` that grows, etc.)
- Acquire any mutex or lock (`std::mutex`, `std::lock_guard`, etc.)
- Make any blocking syscall (file I/O, socket, `sleep`, `wait`)
- Call into JavaScript — no JSI calls, no `callInvoker_->invokeSync()`
- Throw exceptions (or rely on exception unwinding paths that allocate)

**Preallocate everything in the constructor:**
```cpp
// Constructor — JS thread, allocations OK
GainNode::GainNode(const std::shared_ptr<BaseAudioContext> &context, const GainOptions &options)
    : AudioNode(context, options) {
  // Preallocate the AudioBuffer used during processing
  audioBuffer_ = std::make_shared<AudioBuffer>(channelCount_, context->getBufferSize());

  // Preallocate params — they own their internal AudioBuffer too
  gainParam_ = std::make_shared<AudioParam>(
      options.gain, -3.4028234663852886e+38f, 3.4028234663852886e+38f, context);
}

// processNode — audio thread, NO allocations
std::shared_ptr<AudioBuffer> GainNode::processNode(
    const std::shared_ptr<AudioBuffer> &processingBuffer,
    int framesToProcess) {
  // Already-allocated buffer reused each render quantum
  auto gainValues = gainParam_->processARateParam(framesToProcess, time);
  for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {
    processingBuffer->getChannel(i)->multiply(*gainValues->getChannel(0), framesToProcess);
  }
  return processingBuffer;
}
```

---

## Class Hierarchy

```mermaid
classDiagram
  direction TD

  class AudioScheduledSourceNode {
    <<internal base>>
    start(when)
    stop(when)
  }
  class AudioBufferBaseSourceNode {
    <<internal base>>
    playbackRate AudioParam
    detune AudioParam
  }

  AudioNode <|-- AudioScheduledSourceNode
  AudioNode <|-- GainNode
  AudioNode <|-- BiquadFilterNode
  AudioNode <|-- DelayNode
  AudioNode <|-- IIRFilterNode
  AudioNode <|-- StereoPannerNode
  AudioNode <|-- WaveShaperNode
  AudioNode <|-- ConvolverNode
  AudioNode <|-- WorkletNode
  AudioNode <|-- AnalyserNode
  AudioNode <|-- AudioDestinationNode
  AudioNode <|-- AudioRecorder

  AudioScheduledSourceNode <|-- AudioBufferBaseSourceNode
  AudioScheduledSourceNode <|-- OscillatorNode
  AudioScheduledSourceNode <|-- ConstantSourceNode
  AudioScheduledSourceNode <|-- StreamerNode
  AudioScheduledSourceNode <|-- WorkletSourceNode

  AudioBufferBaseSourceNode <|-- AudioBufferSourceNode
  AudioBufferBaseSourceNode <|-- AudioBufferQueueSourceNode
```

### AudioScheduledSourceNode (internal only — not exposed to JS directly)

Base class for source nodes that have a scheduled start and stop time. **Not instantiated directly.**

```cpp
// Playback state machine
enum class PlaybackState {
  UNSCHEDULED,      // before start() called
  SCHEDULED,        // start() called, waiting for startTime_
  PLAYING,          // actively producing audio
  STOP_SCHEDULED,   // stop() called, waiting for stopTime_
  FINISHED          // done, node will be disabled
};
```

Subclasses call `updatePlaybackInfo(currentTime, framesToProcess)` at the top of `processNode()` to transition the state machine and handle sample-accurate start/stop.

When the node finishes, fire the `ENDED` event to JS via `audioEventHandlerRegistry_->invokeHandlerWithEventBody(AudioEvent::ENDED, {})`.

---

## processNode() Signature

```cpp
protected:
  // Audio-thread only
  virtual std::shared_ptr<AudioBuffer> processNode(
      const std::shared_ptr<AudioBuffer> &processingBuffer,
      int framesToProcess) = 0;
```

- `processingBuffer` — already contains the mixed input from all connected input nodes. Modify in-place and return it.
- `framesToProcess` — number of samples per channel to process, typically 128 (RENDER_QUANTUM_SIZE).
- Called by `AudioNode::processAudio()` which handles input mixing, channel count modes, and deduplication (via `lastRenderedFrame_`).

---

## Thread Annotations in Header Files

**Annotate every method with the thread it is safe to call from.** Use comments in the header:

```cpp
class MyNode : public AudioNode {
 public:
  // JS-thread only
  void setSomething(float value);
  float getSomething() const;

 protected:
  // Audio-thread only
  std::shared_ptr<AudioBuffer> processNode(
      const std::shared_ptr<AudioBuffer> &processingBuffer,
      int framesToProcess) override;
};
```

In `AudioParam.h` the pattern is:
```cpp
/// JS-Thread only methods
[[nodiscard]] inline float getValue() const noexcept { ... }
void setValue(float value);
void setValueAtTime(float value, double startTime);

/// Audio-Thread only methods
std::shared_ptr<AudioBuffer> processARateParam(int framesToProcess, double time);
float processKRateParam(int framesToProcess, double time);
```

---

## AudioParam — Automatable Parameters

Every automatable property (frequency, gain, detune, Q, etc.) is an `AudioParam`.

```cpp
gainParam_ = std::make_shared<AudioParam>(
    defaultValue,
    minValue,
    maxValue,
    context
);
```

### A-rate vs K-rate

- **A-rate (audio-rate)**: one value per sample — use when the parameter can change significantly within a render quantum (e.g. frequency modulation)
  ```cpp
  // Call processARateParam() for per-sample values — returns AudioBuffer, no allocation
  auto gainValues = gainParam_->processARateParam(framesToProcess, time);
  float *values = gainValues->getChannel(0)->getData();
  // values[i] is the gain for frame i
  ```

- **K-rate (control-rate)**: one value per render quantum — use when the parameter changes slowly
  ```cpp
  // Call processKRateParam() for a single block-wide value
  float gain = gainParam_->processKRateParam(framesToProcess, time);
  // Single value for the whole block
  ```

### JS → Audio Thread parameter updates

`CrossThreadEventScheduler<T>` is a lock-free SPSC channel. When JS calls `param.setValueAtTime(...)`, it enqueues a lambda on the scheduler. The audio thread drains the queue at the start of each `processARateParam` / `processKRateParam` call.

```cpp
// JS-thread (in AudioParam):
void AudioParam::setValueAtTime(float value, double startTime) {
  eventScheduler_.scheduleEvent([value, startTime](AudioParam &param) {
    param.eventsQueue_.insertEvent(...);
  });
}

// Audio-thread (inside processARateParam):
eventScheduler_.processAllEvents(*this);  // drain all pending events
```

**Important**: HostObject setters forward to the node/param asynchronously through this scheduler. By the time `processNode()` runs, the queued update may or may not have been applied yet, depending on timing. Design accordingly — never assume immediate consistency.

---

## Cross-Thread Communication Patterns

### JS → Audio (parameter/graph updates)
Use `CrossThreadEventScheduler` (lock-free SPSC queue). See `utils/CrossThreadEventScheduler.hpp`.

### Audio → JS (events like `ended`, `loopEnded`, `positionChanged`)
Use `IAudioEventHandlerRegistry::invokeHandlerWithEventBody()` which internally calls `callInvoker_->invokeAsync()` — this safely schedules the JS callback on the JS thread from the audio thread.

```cpp
// Audio-thread: fire 'ended' event
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
    AudioEvent::ENDED, {});
```

Callback IDs are stored as `std::atomic<uint64_t>` on the node. `0` means no listener registered.

### JS → Audio (graph mutations: connect/disconnect)
All graph mutations are queued via `AudioGraphManager` using its own SPSC channel (`addPendingNodeConnection`, `addPendingParamConnection`). The audio thread calls `graphManager_->preProcessGraph()` before each render pass to apply pending changes.

---

## Implementing a New Node — Checklist

1. **Subclass the right base**
   - `AudioNode` — standard effect or analysis node
   - `AudioScheduledSourceNode` — source with start/stop scheduling
   - `AudioBufferBaseSourceNode` — source that plays back an AudioBuffer with pitch control

2. **Header file** (`core/<category>/MyNode.h`)
   - Annotate every method with `// JS-thread only` or `// Audio-thread only`
   - Declare `processNode()` in `protected:`
   - Declare `AudioParam` members for automatable properties
   - Preallocate all buffers you'll need in `private:` state

3. **Constructor** (runs on JS thread)
   - Call `AudioNode(context, options)` base constructor with correct `numberOfInputs`, `numberOfOutputs`
   - Create all `AudioParam` instances with correct default/min/max values from the Web Audio spec
   - Preallocate any DSP state buffers (IIR delay lines, ring buffers, etc.)
   - Do NOT call `context_->...` in `processNode()` for anything that could block

4. **processNode()** (runs on audio thread)
   - Call `context_.lock()` to get a `shared_ptr<BaseAudioContext>` — return early if null
   - Call `context->getCurrentTime()` for automation timing
   - Use `processARateParam()` or `processKRateParam()` to read param values
   - Process samples in-place on `processingBuffer`
   - No allocations, no locks, no blocking I/O

5. **HostObject** (see the `host-objects` skill)
   - Create `MyNodeHostObject` extending `AudioNodeHostObject`
   - Add factory method to `BaseAudioContextHostObject` (`createMyNode`)
   - Add factory method to `BaseAudioContext` C++ class

6. **TypeScript API** (see the `turbo-modules` skill)
   - Add TS class in `src/core/`
   - Export from package index

7. **Spec compliance**
   - Check the Web Audio API spec for default values, parameter ranges, and behavior
   - See `web-audio-api.md` skill

8. **Tests and docs** — see the `flow` skill

See [full GainNode example](gainnode-example.md) for a complete header + .cpp reference implementation.

---

## Web Audio API Spec Reference

All node behavior (parameter names, default values, valid ranges, processing semantics) must match the spec:
- https://webaudio.github.io/web-audio-api/

Key spec-defined constraints already encoded in the codebase:
- `AudioParam` min/max values come from spec tables
- `GainNode.gain` default = 1.0, no clamping
- `BiquadFilterNode.frequency` default = 350 Hz, range [Nyquist - epsilon, Nyquist]
- `OscillatorNode.frequency` default = 440 Hz
- Render quantum = 128 frames

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/audio-nodes/gainnode-example.md
================================================
# Reference: Complete GainNode C++ Example

This file contains the full GainNode header and implementation, extracted from `SKILL.md` to keep the main skill file under budget.

## `GainNode.h`

```cpp
#pragma once
#include "audioapi/core/AudioNode.h"
#include "audioapi/core/AudioParam.h"

namespace audioapi {

class GainNode : public AudioNode {
 public:
  // JS-thread only
  explicit GainNode(
      const std::shared_ptr<BaseAudioContext> &context,
      const GainOptions &options);

  // JS-thread only
  [[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;

 protected:
  // Audio-thread only
  std::shared_ptr<AudioBuffer> processNode(
      const std::shared_ptr<AudioBuffer> &processingBuffer,
      int framesToProcess) override;

 private:
  std::shared_ptr<AudioParam> gainParam_;
};

} // namespace audioapi
```

## `GainNode.cpp`

```cpp
GainNode::GainNode(
    const std::shared_ptr<BaseAudioContext> &context,
    const GainOptions &options)
    : AudioNode(context, options) {
  // Preallocate param — constructor is on JS thread, allocation OK
  gainParam_ = std::make_shared<AudioParam>(
      options.gain,
      -3.4028234663852886e+38f,
      3.4028234663852886e+38f,
      context);
}

std::shared_ptr<AudioBuffer> GainNode::processNode(
    const std::shared_ptr<AudioBuffer> &processingBuffer,
    int framesToProcess) {
  std::shared_ptr<BaseAudioContext> context = context_.lock();
  if (!context) return processingBuffer;

  double time = context->getCurrentTime();

  // A-rate: per-sample gain values — no allocation, reuses preallocated buffer
  auto gainParamValues = gainParam_->processARateParam(framesToProcess, time);
  auto gainValues = gainParamValues->getChannel(0);

  for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {
    processingBuffer->getChannel(i)->multiply(*gainValues, framesToProcess);
  }

  return processingBuffer;
}
```



================================================
FILE: .claude/skills/audio-nodes/maintenance.md
================================================
# Maintenance — audio-nodes

> Used by `/pre-push-update` only — not loaded when the `audio-nodes` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `common/cpp/audioapi/core/AudioNode.*` | Base class contract, `processNode()` signature, `processAudio()` graph traversal |
| `common/cpp/audioapi/core/AudioParam.*` | A-rate / k-rate section, automation method list |
| `common/cpp/audioapi/core/sources/AudioScheduledSourceNode.*` | Playback state machine, `updatePlaybackInfo` contract |
| `common/cpp/audioapi/core/<new file>` | Add new node to class hierarchy diagram and directory tree |
| `common/cpp/audioapi/core/effects/GainNode.h` | `gainnode-example.md` — constructor signature, AudioParam declarations, thread annotations |
| `common/cpp/audioapi/core/effects/GainNode.cpp` | `gainnode-example.md` — `processNode()` body, AudioParam initialization |

Update the **class hierarchy diagram** in `SKILL.md` when a node is added, removed, or changes its base class.


================================================
FILE: .claude/skills/build-compilation-dependencies/SKILL.md
================================================
---
name: build-compilation-dependencies
description: >
  Build system overview for react-native-audio-api across all platforms — CMakeLists.txt,
  android/build.gradle, RNAudioAPI.podspec, prebuilt external libraries, and the standalone
  C++ test build. Use this skill when adding a new source file, modifying CMakeLists or podspec,
  debugging compilation errors, integrating a new dependency, or understanding why includes work
  differently in tests vs the app. Trigger phrases: "add source file", "CMakeLists", "podspec",
  "build.gradle", "prebuilt binaries", "FFmpeg disabled", "pod install", "new architecture",
  "compile error", "undefined symbol", "SIMD", "worklets build flag", "C++ tests", "conditional
  compilation", "include path", "gradle build fails", "link error".
---

# Skill: Build, Compilation & Dependencies

For deep CMake/Gradle/podspec analysis see [build-details.md](build-details.md).

---

## Repository Build Overview

```
react-native-audio-api/
├── package.json                        # Yarn 4 workspaces root
├── packages/react-native-audio-api/    # Main library
│   ├── android/
│   │   ├── build.gradle                # Android build config (Gradle)
│   │   ├── CMakeLists.txt              # Android CMake root (delegates to subdirectory)
│   │   └── src/main/cpp/audioapi/
│   │       └── CMakeLists.txt          # Actual Android C++ build target
│   ├── common/cpp/audioapi/            # Shared C++ (used by all platforms)
│   │   └── external/                   # Prebuilt binaries per platform
│   │       ├── android/                # .a static libs (Opus, Ogg, Vorbis, OpenSSL)
│   │       ├── iphoneos/               # iOS device .a libs
│   │       ├── iphonesimulator/        # iOS sim .a libs
│   │       ├── macosx/                 # macOS .a libs
│   │       ├── ffmpeg_ios/             # FFmpeg .xcframeworks (iOS only)
│   │       ├── include/                # Headers for Opus/Ogg/Vorbis/OpenSSL
│   │       └── include_ffmpeg/         # Headers for FFmpeg
│   ├── common/cpp/test/
│   │   ├── CMakeLists.txt              # Standalone test build (no Android/iOS)
│   │   ├── RunTests.sh                 # Test runner script
│   │   └── src/                        # Google Test files
│   ├── RNAudioAPI.podspec              # CocoaPods spec for iOS
│   └── scripts/
│       ├── download-prebuilt-binaries.sh  # Downloads externals from GitHub Releases
│       ├── rnaa_utils.rb               # Ruby helpers for podspec (path resolution, worklets check)
│       └── validate-worklets-version.js
└── apps/
    └── fabric-example/
        └── ios/
            └── Podfile                 # Consumer Podfile (new arch enabled)
```

---

## Prebuilt Binaries

External libraries (Opus, Ogg, Vorbis, OpenSSL, FFmpeg) are **not compiled from source** — they are downloaded as prebuilt `.a` / `.so` / `.xcframework` archives from:

```
https://github.com/software-mansion-labs/rn-audio-libs/releases/download/<TAG>/
```

Current tag: **v3.0.0** (see `scripts/download-prebuilt-binaries.sh`).

The download script is triggered automatically:
- **iOS**: by podspec `prepare_command` during `pod install`
- **Android**: by `downloadPrebuiltBinaries` Gradle task, which runs before `preBuild`

Downloaded artifacts land in:
- `common/cpp/audioapi/external/android/<ABI>/` — `.a` static libs for Android ABIs
- `android/src/main/jniLibs/<ABI>/` — FFmpeg `.so` shared libs for Android (loaded at runtime)
- `common/cpp/audioapi/external/ffmpeg_ios/` — FFmpeg `.xcframework` files for iOS
- `common/cpp/audioapi/external/iphoneos/` / `iphonesimulator/` / `macosx/` — Opus/Ogg/etc `.a`

**These directories are gitignored.** If they're missing, run `pod install` (iOS) or Gradle build (Android) to re-download them. Do not commit them.

---

## Android Build — high-level summary

### Files
- `android/build.gradle` — Gradle library config
- `android/CMakeLists.txt` — Android CMake root (SIMD detection, RN version flags, delegates to subdirectory)
- `android/src/main/cpp/audioapi/CMakeLists.txt` — actual build target (sources, prebuilt libs, include paths)

### Key behaviors
- Feature flags (`newArchEnabled`, `disableAudioapiFFmpeg`) are read from app's `gradle.properties` and forwarded to both CMake and Kotlin `BuildConfig`
- DSP sources always compiled with `-O3` regardless of overall build type
- Sources gathered with `GLOB_RECURSE CONFIGURE_DEPENDS` — CMake re-runs automatically when files are added/removed
- Worklets must be merged before the audio API CMake build starts (explicit Gradle task dependency)
- 16KB page size alignment enabled for Android 15+

For full per-line analysis see [build-details.md](build-details.md#android-androidcmakeliststxt-root--detailed-analysis).

---

## iOS Build (CocoaPods) — high-level summary

### Files
- `RNAudioAPI.podspec` — library spec with subspecs
- `scripts/rnaa_utils.rb` — Ruby helpers called by podspec
- `apps/fabric-example/ios/Podfile` — consumer

### Key behaviors
- Four subspecs split compilation: `audioapi` (core C++), `audioapi/ios` (ObjC++), `audioapi/audioapi_dsp` (DSP with `-O3`), `audioapi/miniaudio_impl` (compiled as `-x objective-c++`)
- Static prebuilt libs linked with `-force_load` to prevent dead-stripping
- FFmpeg xcframeworks listed in `s.ios.vendored_frameworks` — CocoaPods handles embedding and signing
- `Accelerate` framework linked, enabling `HAVE_ACCELERATE=1` for vDSP SIMD on iOS
- Header search paths split: `pod_target_xcconfig` (library compilation) vs `xcconfig` (app consumers)
- `rnaa_utils.rb` resolves dynamic paths at `pod install` time (not hardcoded)

For full per-line analysis see [build-details.md](build-details.md#ios-rnaudioapipodspec--detailed-analysis).

---

## Building the Apps

### iOS (fabric-example)

```bash
# From the monorepo root first:
yarn install

# Then install pods — must be done from the ios/ directory:
cd apps/fabric-example/ios
pod install

# Run the app (from repo root):
yarn workspace fabric-example ios
# or open Xcode:
open apps/fabric-example/ios/FabricExample.xcworkspace
```

**When to re-run `pod install`**:
- After `yarn install` (any dependency change)
- After changing `RNAudioAPI.podspec`
- After adding/removing iOS source files that need to be picked up
- After changing `rnaa_utils.rb` or `scripts/validate-worklets-version.js`
- When prebuilt binaries need to be re-downloaded (podspec `prepare_command` runs on `pod install`)

**Disable FFmpeg on iOS**:
```bash
DISABLE_AUDIOAPI_FFMPEG=1 pod install
```

### Android (fabric-example)

```bash
yarn workspace fabric-example android
# or open in Android Studio:
open apps/fabric-example/android
```

**Disable FFmpeg on Android**: set in `android/gradle.properties`:
```
disableAudioapiFFmpeg=true
```

**Clean CMake cache** (fixes most mysterious native build failures):
```bash
yarn workspace react-native-audio-api clean  # or manually:
rm -rf packages/react-native-audio-api/android/.cxx
```

---

## C++ Tests (standalone build)

### Location
`packages/react-native-audio-api/common/cpp/test/`

### How to run
```bash
yarn test   # from monorepo root — runs RunTests.sh
```

`RunTests.sh` does:
```bash
cd packages/react-native-audio-api/common/cpp/test
cmake -S . -B build -Wno-dev
cd build && make -j10
./tests --gtest_print_time=1
```

The `build/` directory is deleted after each run.

### Key design decisions
- Completely standalone — no Gradle, no Xcode, no prebuilt Android libraries needed
- Sources resolved from `node_modules` (symlinked to `packages/` in yarn workspaces)
- HostObjects, worklets nodes, AudioContext, and FFmpegDecoding are excluded from the test build
- Compile definitions: `RN_AUDIO_API_ENABLE_WORKLETS=0`, `RN_AUDIO_API_TEST=1`, `RN_AUDIO_API_FFMPEG_DISABLED=1`
- Google Test auto-fetched via `FetchContent` if not installed locally
- New test files in `test/src/**/*.cpp` are picked up automatically by glob — no CMakeLists edit needed

For `MockAudioEventHandlerRegistry`, `TestableXxx` pattern, and full CMakeLists analysis see [build-details.md](build-details.md#c-test-build--commoncpptestcmakeliststxt--detailed-analysis).

---

## Conditional Compilation Flags Summary

| Flag | Android (CMake) | iOS (podspec) | Tests |
|---|---|---|---|
| `RN_AUDIO_API_FFMPEG_DISABLED` | `-DRN_AUDIO_API_FFMPEG_DISABLED` | `-DRN_AUDIO_API_FFMPEG_DISABLED=1` | Always set to 1 |
| `RN_AUDIO_API_ENABLE_WORKLETS` | `-DRN_AUDIO_API_ENABLE_WORKLETS=1/0` | `-DRN_AUDIO_API_ENABLE_WORKLETS=1` | Always set to 0 |
| `RCT_NEW_ARCH_ENABLED` | `-DRCT_NEW_ARCH_ENABLED` | `-DRCT_NEW_ARCH_ENABLED` | Not set |
| `HAVE_ARM_NEON_INTRINSICS` | Set by CMake SIMD detection | Set by Xcode/Clang for arm64 | Set by CMake SIMD detection |
| `HAVE_X86_SSE2` | Set by CMake SIMD detection | Not used | Set by CMake SIMD detection |
| `HAVE_ACCELERATE` | Not set | `GCC_PREPROCESSOR_DEFINITIONS` | Not set |
| `RN_AUDIO_API_TEST` | Not set | Not set | Always set to 1 |

---

## Common Build Failure Patterns

| Symptom | Likely cause | Fix |
|---|---|---|
| `file not found: libopus.a` | Prebuilt binaries not downloaded | Run `pod install` (iOS) or Gradle build (triggers download task) |
| `No such module 'RNAudioAPI'` | Pod not installed | `cd apps/fabric-example/ios && pod install` |
| `undefined symbol: av_*` | FFmpeg .so not in jniLibs | Build triggers download; verify `disableAudioapiFFmpeg` not set unexpectedly |
| CMake error on clean build | Stale `.cxx` cache | `rm -rf packages/react-native-audio-api/android/.cxx` |
| Test build: `Cannot open include file: audioapi/...` | Node modules not linked | `yarn install` from root, then re-run tests |
| New `.cpp` not compiled in tests | Glob picks it up automatically — may need cmake reconfigure | Delete `test/build/` and re-run |
| iOS compile error `unknown type 'id'` | C++ file included ObjC-only header | Compile that file as ObjC++ (separate subspec with `-x objective-c++`) |
| `RCT_NEW_ARCH_ENABLED` undefined on Android | Old RN gradle plugin | Ensure `newArchEnabled=true` in app's `gradle.properties` |

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/build-compilation-dependencies/build-details.md
================================================
# Build Details — CMake, Gradle & Podspec Deep Reference

> This file contains the detailed per-platform build system analysis for `CMakeLists.txt`, `android/build.gradle`, `RNAudioAPI.podspec`, and the C++ test build.
>
> For the high-level overview, prebuilt binaries, building apps, conditional flags, and common failures, see [SKILL.md](SKILL.md).

---

## Android: `build.gradle` — detailed analysis

### Feature flags (set by app's `gradle.properties`)

```groovy
def isNewArchitectureEnabled() {
  return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
}
def isFFmpegDisabled() {
  return rootProject.hasProperty("disableAudioapiFFmpeg") && rootProject.getProperty("disableAudioapiFFmpeg") == "true"
}
```

### Forwarding flags to CMake

```groovy
"-DRN_AUDIO_API_FFMPEG_DISABLED=${IS_RN_AUDIO_API_FFMPEG_DISABLED}"
"-DRN_AUDIO_API_WORKLETS_ENABLED=${isWorkletsAvailable}"
"-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}"
```

### Forwarding flags to Kotlin via BuildConfig

```groovy
buildConfigField "boolean", "RN_AUDIO_API_FFMPEG_DISABLED", isFFmpegDisabled().toString()
buildConfigField "boolean", "RN_AUDIO_API_ENABLE_WORKLETS", "${isWorkletsAvailable}"
```

### 16KB page size alignment (Android 15+)

```groovy
packagingOptions {
  jniLibs { useLegacyPackaging = false }
}
```

### Worklets dependency ordering

Worklets must be merged before the audio API's CMake build starts. Gradle task dependency is wired explicitly:

```groovy
tasks.getByName("buildCMakeDebug").dependsOn(rnWorkletsProject.tasks.getByName("mergeDebugNativeLibs"))
```

### Minimum RN version enforcement

Enforced in Gradle task `assertMinimalReactNativeVersionTask` (currently RN 76+).

---

## Android: `android/CMakeLists.txt` (root) — detailed analysis

Thin delegator. Sets up SIMD detection, applies Folly + React Native flags, then:

```cmake
add_subdirectory("${ANDROID_CPP_DIR}/audioapi")
```

### SIMD detection (affects DSP performance)

```cmake
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
    set(HAVE_ARM_NEON_INTRINSICS TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
    set(HAVE_X86_SSE2 TRUE)
endif()
```

### RN version-dependent flags (workaround for RN 0.80+ flag changes)

```cmake
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 80)
  include("${REACT_NATIVE_DIR}/ReactCommon/cmake-utils/react-native-flags.cmake")
  target_compile_reactnative_options(react-native-audio-api PRIVATE)
else()
  string(APPEND CMAKE_CXX_FLAGS " -fexceptions -frtti ...")
endif()
```

---

## Android: `android/src/main/cpp/audioapi/CMakeLists.txt` — detailed analysis

Builds `react-native-audio-api` as a shared library.

### Source gathering

Uses `GLOB_RECURSE CONFIGURE_DEPENDS` — CMake will re-run automatically when files are added/removed:

```cmake
file(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/audioapi/*.cpp")
```

### FFmpeg conditional exclusion

```cmake
if(RN_AUDIO_API_FFMPEG_DISABLED)
  list(REMOVE_ITEM COMMON_CPP_SOURCES
    "${COMMON_CPP_DIR}/audioapi/libs/ffmpeg/FFmpegDecoding.cpp"
  )
endif()
```

### DSP sources get `-O3` (always, regardless of overall build type)

```cmake
set_source_files_properties(${DSP_CPP_SOURCES} PROPERTIES COMPILE_FLAGS "-O3")
```

### Static prebuilt libs imported via `IMPORTED_LOCATION`

```cmake
foreach(lib IN ITEMS opus opusfile ogg vorbis vorbisenc vorbisfile crypto ssl)
  add_library(${lib} STATIC IMPORTED)
  set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${EXTERNAL_DIR}/${ANDROID_ABI}/lib${lib}.a)
endforeach()
```

### FFmpeg shared libs (`.so`) in `jniLibs/` linked as shared IMPORTED

```cmake
add_library(${lib} SHARED IMPORTED)
set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/lib${lib}.so)
```

### Include paths for Android (key paths)

```
common/cpp                        — for #include <audioapi/...>
android/src/main/cpp              — for Android-specific headers
external/include                  — Opus/Ogg/Vorbis/OpenSSL headers
external/include/opus             — nested Opus headers
external/include_ffmpeg           — FFmpeg headers
ReactCommon                       — JSI headers
ReactAndroid/src/main/jni/...     — TurboModule JNI headers
```

---

## iOS: `RNAudioAPI.podspec` — detailed analysis

### Subspecs split compilation

| Subspec | Sources | Special |
|---|---|---|
| `audioapi` | `common/cpp/audioapi/**/*.{cpp,h,hpp}` | Excludes FFmpeg sources if disabled |
| `audioapi/ios` | `ios/audioapi/**/*.{mm,h}` | ObjC++ platform layer |
| `audioapi/audioapi_dsp` | `common/cpp/audioapi/dsp/**/*.cpp` | Compiled with `-O3` |
| `audioapi/miniaudio_impl` | `utils/MiniaudioImplementation.cpp` | Compiled as `-x objective-c++` (required by miniaudio) |

### `miniaudio_impl` workaround

miniaudio's implementation file must be compiled as Objective-C++ on iOS (it uses Apple APIs). CocoaPods can't set per-file compiler flags the same way CMake can, so it gets its own subspec with `compiler_flags = "-x objective-c++"`.

### Prebuilt binaries linked via `-force_load`

All static libs (Opus, Ogg, Vorbis, OpenSSL) use `-force_load` to prevent dead-stripping of symbols needed at runtime but not referenced at link time:

```ruby
s.xcconfig = {
  'OTHER_LDFLAGS' => %W[
    -force_load #{lib_dir}/libopus.a
    -force_load #{lib_dir}/libogg.a
    ...
  ].join(" ")
}
```

### FFmpeg xcframeworks listed in `s.ios.vendored_frameworks`

CocoaPods handles embedding and signing automatically:

```ruby
s.ios.vendored_frameworks = $RN_AUDIO_API_FFMPEG_DISABLED ? [] : [
  'common/cpp/audioapi/external/ffmpeg_ios/libavcodec.xcframework',
  ...
]
```

### Header search paths split between pod target and consumers

- `pod_target_xcconfig` — `HEADER_SEARCH_PATHS` for compiling the library itself (Boost, Folly, Yoga, external headers)
- `xcconfig` — `HEADER_SEARCH_PATHS` for app targets consuming this pod (ReactCommon, dynamic framework dirs)

### `rnaa_utils.rb` — dynamic path resolution at `pod install` time

Resolves three paths that vary per machine/monorepo layout:

1. `react_native_common_dir` — ReactCommon path relative to Pods root
2. `dynamic_frameworks_audio_api_dir` — this pod's dir relative to Pods root
3. `dynamic_frameworks_worklets_dir` — worklets pod dir (only if enabled)

These vary per machine/monorepo layout, so they're computed at install time rather than hardcoded.

### System frameworks linked

```ruby
s.ios.frameworks = 'Accelerate', 'AVFoundation', 'MediaPlayer'
```

`Accelerate` enables `HAVE_ACCELERATE=1` for vDSP SIMD on iOS.

### Podfile (fabric-example)

Enables New Architecture: `ENV['RCT_NEW_ARCH_ENABLED'] = '1'` at the top. This is the only example app using the new arch — always test new features here.

The podfile resolves the minimum iOS version from RN's `min_ios_version_supported` helper — do not hardcode `14.0` in the Podfile itself.

---

## C++ Test Build — `common/cpp/test/CMakeLists.txt` — detailed analysis

### Design: completely standalone

No Gradle, no Xcode, no prebuilt Android libraries needed.

### Sources resolved from `node_modules` (not from monorepo source directly)

```cmake
set(ROOT ${CMAKE_SOURCE_DIR}/../../../../..)
set(REACT_NATIVE_AUDIO_API_DIR "${ROOT}/node_modules/react-native-audio-api")

file(GLOB_RECURSE RNAUDIOAPI_SRC CONFIGURE_DEPENDS
  "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/*.cpp"
)
```

This means **tests build against the installed/published version of the library** in `node_modules`, not the local `packages/` source directly. In a monorepo with yarn workspaces, `node_modules/react-native-audio-api` symlinks to `packages/react-native-audio-api`, so this works fine locally.

### Excluded from tests (not relevant for unit testing)

```cmake
list(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX ".*/audioapi/HostObjects/.*\\.cpp$")  # no JSI in tests
list(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX ".*/Worklet.*Node\\.cpp$")            # worklets not compiled
list(REMOVE_ITEM RNAUDIOAPI_SRC ... "AudioContext.cpp")                         # needs real audio I/O
list(REMOVE_ITEM RNAUDIOAPI_SRC ... "FFmpegDecoding.cpp")                       # FFmpeg disabled in tests
```

### Compile definitions always set in tests

```cmake
add_compile_definitions(RN_AUDIO_API_ENABLE_WORKLETS=0)
add_compile_definitions(RN_AUDIO_API_TEST=1)
add_compile_definitions(RN_AUDIO_API_FFMPEG_DISABLED=1)
```

Use `RN_AUDIO_API_TEST` in source code to conditionally compile test-only hooks.

### Google Test auto-fetched if not installed

```cmake
find_package(GTest QUIET)
if(NOT GTest_FOUND)
  include(FetchContent)
  FetchContent_Declare(googletest URL https://github.com/google/googletest/archive/<sha>.zip)
  FetchContent_MakeAvailable(googletest)
endif()
```

### JSI headers included for compilation

JSI headers are included from `node_modules/react-native/ReactCommon/jsi` so core audio classes that depend on JSI types can compile even without a running JS engine.

### `MockAudioEventHandlerRegistry` — test fixture boilerplate

`test/src/MockAudioEventHandlerRegistry.h` provides a Google Mock implementation of `IAudioEventHandlerRegistry`. Pass it to `OfflineAudioContext` in every test fixture:

```cpp
class MyNodeTest : public ::testing::Test {
 protected:
  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
  std::shared_ptr<OfflineAudioContext> context;

  void SetUp() override {
    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
    context = std::make_shared<OfflineAudioContext>(
        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
    context->initialize();
  }
};
```

### `TestableXxx` pattern — white-box unit testing

Expose `processNode()` and internal state for white-box unit testing (since `processNode` is `protected`):

```cpp
class TestableGainNode : public GainNode {
 public:
  explicit TestableGainNode(std::shared_ptr<BaseAudioContext> ctx)
      : GainNode(ctx, GainOptions()) {}

  std::shared_ptr<AudioBuffer> processNode(
      const std::shared_ptr<AudioBuffer> &buf, int frames) override {
    return GainNode::processNode(buf, frames);  // call through to real implementation
  }
};
```

### Adding a new test file

1. Create `test/src/core/<category>/MyNodeTest.cpp`
2. `GLOB_RECURSE test_src "src/*.cpp"` picks it up automatically — no CMakeLists edit needed.
3. Verify `context->initialize()` is called in `SetUp()` if your node needs the context to be running.



================================================
FILE: .claude/skills/build-compilation-dependencies/maintenance.md
================================================
# Maintenance — build-compilation-dependencies

> Used by `/pre-push-update` only — not loaded when the `build-compilation-dependencies` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `android/CMakeLists.txt` | SIMD detection, RN version flag workaround |
| `android/src/main/cpp/audioapi/CMakeLists.txt` | Source glob patterns, FFmpeg exclusion, DSP `-O3` targets, IMPORTED lib list, include paths |
| `android/build.gradle` | Feature flag detection, CMake arg forwarding, BuildConfig fields, worklets task dependency, packaging options |
| `RNAudioAPI.podspec` | Subspecs table, `miniaudio_impl` workaround, `-force_load` list, xcframeworks list, `rnaa_utils.rb` dynamic paths |
| `apps/fabric-example/ios/Podfile` | New Architecture enablement, minimum iOS version helper |
| `common/cpp/test/CMakeLists.txt` | Excluded sources list, compile definitions, GoogleTest fetch URL, include paths |
| `common/cpp/test/src/MockAudioEventHandlerRegistry.h` | Mock interface — update fixture boilerplate in `build-details.md` if signature changes |
| `scripts/download-prebuilt-binaries.sh` | New download artifacts, new TAG version |


================================================
FILE: .claude/skills/flow/SKILL.md
================================================
---
name: flow
description: >
  End-to-end process for shipping a feature or bug fix in react-native-audio-api. Covers all required deliverables in order: Web Audio API spec review, TypeScript interface and types, C++ AudioNode implementation, HostObject wiring, TypeScript class, TurboModule spec (when needed), C++ tests (Google Test), JS tests (Jest), documentation (audiodocs MDX), and post-work checks. Also covers the bug-fix flow: MRE first, C++ test when applicable, root-cause analysis, post-mortem. Use this skill at the start of any feature implementation or bug fix. Trigger phrases: "implement a feature", "add a node", "fix a bug", "what steps", "where do I start", "PR checklist", "how to write tests".
---

# Skill: Feature Implementation Flow

## Quick Reference

**Feature checklist (all 9 steps required for a PR):**
1. Read spec → define exactly what you're building
2. TypeScript interface + option types (`src/interfaces/`, `src/types/`)
3. C++ AudioNode (`core/<category>/MyNode.h/.cpp`) — see `audio-nodes` skill
4. HostObject (`HostObjects/MyNodeHostObject.h/.cpp`) — see `host-objects` skill
5. TypeScript class (`src/core/MyNode.ts`)
6. TurboModule spec entry — **only** if a new RN native method is needed
7. C++ tests (Google Test) — **write tests first, confirm they fail, then implement**
8. JS/TS tests (Jest)
9. Docs page (`packages/audiodocs/`)
Then: `post-work-checks` skill

**Bug fix checklist:**
1. Reproduce (write failing test or MRE first)
2. Identify the layer (use the table in §Bug Fix Flow)
3. Fix + verify tests pass
4. Post-mortem (update skill if a new pitfall discovered)

---

## Feature Implementation Flow

### 1 — Define exactly what you are building

Before touching any code. **If spec behavior is unclear → fetch https://webaudio.github.io/web-audio-api/ before proceeding.**

- Read the Web Audio API spec section for the node/feature. Nail down:
  - All properties and methods
  - Parameter default values, min/max, and automation behaviour
  - Edge cases (what happens when `start()` is called twice? what if feedback[0] === 0?)
- Decide the **TypeScript interface shape**: what does the JS consumer see?
- Identify if **native platform code** is needed (e.g. new permission, device routing, new Oboe/CoreAudio API surface). If yes, plan iOS + Android separately.

---

### 2 — TypeScript interface and types

Files: `packages/react-native-audio-api/src/`

1. Add the interface in `src/interfaces/` — `IMyNode.ts`
   ```ts
   export interface IMyNode extends IAudioNode {
     readonly myParam: IAudioParam;
     someMethod(arg: number): void;
   }
   ```

2. Add the options type in `src/types/` — `NodeOptions.ts` (or add to existing file)
   ```ts
   export interface MyNodeOptions extends AudioNodeOptions {
     myParam?: number; // default: 1.0
   }
   ```

3. Export both from `src/interfaces/index.ts` and `src/types/index.ts`.

---

### 3 — C++ AudioNode

Files: `packages/react-native-audio-api/common/cpp/audioapi/core/`

See the `audio-nodes` skill for the full contract. **If unsure which base class to use → check the class hierarchy in that skill.** Summary:

1. Create `core/<category>/MyNode.h` and `MyNode.cpp`.
2. Subclass the right base (`AudioNode`, `AudioScheduledSourceNode`, `AudioBufferBaseSourceNode`).
3. Annotate every method with `// JS-thread only` or `// Audio-thread only`.
4. Declare `processNode()` in `protected:` — audio thread.
5. Preallocate all `AudioParam`s and scratch buffers in the constructor (JS thread).
6. Add `createMyNode(const MyNodeOptions &options)` factory to `BaseAudioContext`.
7. Add the `.cpp` file to `CMakeLists.txt` (check existing entries for the pattern).

**No allocations, no locks, no blocking I/O in `processNode()`.**

---

### 4 — HostObject

Files: `packages/react-native-audio-api/common/cpp/audioapi/HostObjects/`

See the `host-objects` skill for the full macro system and shadow state patterns. **If unsure whether to use shadow state or atomics → check the decision table in that skill.** Summary:

1. Create `HostObjects/MyNodeHostObject.h` and `MyNodeHostObject.cpp`.
2. Extend `AudioNodeHostObject`.
3. Expose properties with `JSI_PROPERTY_GETTER/SETTER_DECL/IMPL` + `JSI_EXPORT_PROPERTY_GETTER/SETTER`.
4. Expose methods with `JSI_HOST_FUNCTION_DECL/IMPL` + `JSI_EXPORT_FUNCTION`.
5. Use **shadow state** (JS-thread copy + `scheduleAudioEvent`) for any property that: is read back by JS, is written from JS, AND must be applied on the audio thread. See `host-objects.md` for the decision table.
6. Wire factory in `BaseAudioContextHostObject`: add `createMyNode` host function that calls `context->createMyNode(options)` and wraps in `MyNodeHostObject`.
7. Add to `CMakeLists.txt`.

---

### 5 — TypeScript class

Files: `packages/react-native-audio-api/src/core/`

1. Create `src/core/MyNode.ts` — extends `AudioNode`, wraps the JSI HostObject.
   ```ts
   import { IMyNode } from '../interfaces';
   import AudioNode from './AudioNode';
   import BaseAudioContext from './BaseAudioContext';
   import { MyNodeOptions } from '../types';

   export default class MyNode extends AudioNode implements IMyNode {
     constructor(context: BaseAudioContext, options: MyNodeOptions) {
       const node = context.context.createMyNode(options);
       super(context, node);
     }
     // getters/setters forwarded to (this.node as IMyNode)
   }
   ```

2. Add a factory method `createMyNode(options?)` to `src/core/BaseAudioContext.ts`.

3. Export from `src/index.ts`.

4. Add web passthrough in `src/web-core/MyNode.ts` if the node has a browser equivalent, or add a stub/throw if not supported on web. The web system always delegates to the browser's `AudioContext`.

---

### 6 — TurboModule spec (only if new native entry point needed)

File: `src/specs/NativeAudioAPIModule.ts`

Only needed if the feature requires a *new* RN native method (e.g. a permission check, a new audio session configuration). Most audio nodes do **not** need this — they are exposed entirely through JSI HostObjects.

If needed: add the method signature to the spec, then implement on iOS (`AudioAPIModule.mm`) and Android (`AudioAPIModule.kt`).

---

### 7 — Tests

#### C++ tests (Google Test)

Path: `common/cpp/test/src/core/<category>/MyNodeTest.cpp`

Pattern:
```cpp
#include <audioapi/core/OfflineAudioContext.h>
#include <audioapi/core/effects/MyNode.h>
#include <gtest/gtest.h>
#include <test/src/MockAudioEventHandlerRegistry.h>
#include <memory>
using namespace audioapi;

class MyNodeTest : public ::testing::Test {
 protected:
  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
  std::shared_ptr<OfflineAudioContext> context;
  static constexpr int sampleRate = 44100;

  void SetUp() override {
    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
    context = std::make_shared<OfflineAudioContext>(
        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
    context->initialize();
  }
};

// Use TestableXxx subclass to expose processNode() and internal state for white-box tests
class TestableMyNode : public MyNode {
 public:
  explicit TestableMyNode(std::shared_ptr<BaseAudioContext> ctx)
      : MyNode(ctx, MyNodeOptions()) {}
  std::shared_ptr<AudioBuffer> processNode(
      const std::shared_ptr<AudioBuffer> &buf, int frames) override {
    return MyNode::processNode(buf, frames);
  }
};

TEST_F(MyNodeTest, CanBeCreated) { ... }
TEST_F(MyNodeTest, ProcessesAudioCorrectly) { ... }
TEST_F(MyNodeTest, EdgeCase) { ... }
```

New test files are picked up automatically by `GLOB_RECURSE` — no CMakeLists edit needed.

Run with:
```bash
yarn test   # from repo root
```

#### JS/TS tests (Jest)

Path: `packages/react-native-audio-api/tests/`

- `integration.test.ts` — graph construction, node creation, property access through the mock API
- `mock.test.ts` — mock implementation correctness

Run with:
```bash
yarn workspace react-native-audio-api test
```

#### Example app (fabric-example)

If the feature has a visible or audible component, add a demo in `apps/fabric-example/App.tsx` (or a sub-screen). This acts as a manual smoke test and documents intended usage.

---

### 8 — Documentation

Path: `packages/audiodocs/`

Every **public API** that ships must have a documentation page. The docs package uses MDX. Look at an existing node's page for the format. Cover:

- Constructor / factory call
- All properties and their types/ranges
- All methods with parameter descriptions
- A minimal usage example (TypeScript snippet)
- Any spec deviations or limitations (e.g. "offline rendering not supported")

---

### 9 — Post-work checks

See the `post-work-checks` skill. At minimum before any PR:

```bash
yarn format          # auto-fix formatting
yarn lint            # JS/TS/C++/Kotlin linting
yarn typecheck       # TypeScript
yarn test            # C++ Google Tests
yarn check-audio-enum-sync  # if you touched AudioEvent enums
```

---

## Bug Fix Flow

### 1 — Reproduce (MRE first)

- **If an MRE is provided** → good, use it as your starting point.
- **If no MRE** → reproduce in `apps/fabric-example/App.tsx`. Add the minimal code that triggers the bug. Keep it in the app until the fix is verified, then remove or clean it up.
- **If the bug is in C++ DSP/processing logic** → write a **failing C++ test first** (`common/cpp/test/`). This gives a fast edit-compile-run loop without needing a device, and the test stays as a permanent regression guard.

---

### 2 — Identify the layer

| Symptom | Likely layer | Where to look |
|---|---|---|
| Wrong default value / validation error | TypeScript | `src/core/MyNode.ts`, `src/types/` |
| Property read-back returns wrong value | HostObject shadow state | `HostObjects/MyNodeHostObject` |
| Wrong argument parsed from JS | HostObject | argument parsing in `get`/`call` |
| Audio output sounds wrong | C++ `processNode()` | `core/<category>/MyNode.cpp` |
| DSP math wrong | DSP helpers | `dsp/` utilities |
| Crash on audio thread | Thread safety violation | `cross-thread` patterns — `audio-nodes.md` |
| Platform-specific (only iOS or only Android) | Native layer | `ios/` or `android/` |
| Only in new RN architecture | TurboModule / JSI wiring | `src/specs/`, HostObject init |

---

### 3 — Fix and verify

1. Make the fix.
2. If a C++ test was written in step 1 → it must now pass.
3. If no C++ test was written but the fix touches `processNode()` or DSP code → add one now. It will stay as a regression test.
4. Run post-work checks (see above).

---

### 4 — Post-mortem (short, but do it)

After the fix is working, spend 2 minutes asking:

- **Why did this bug exist?** Was it a missing validation? A wrong default value? A thread-safety assumption that wasn't documented?
- **Should a skill file be updated?** If the bug revealed a non-obvious invariant (e.g. "feedback[0] must not be 0"), add it to the relevant skill (`audio-nodes.md`, `host-objects.md`, etc.) under a pitfalls or constraints section.
- **Should a new test be added?** If no test existed that would have caught this, add one.
- **Should docs be updated?** If the spec says X but the implementation did Y, and the fix brings it in line — update the docs page.

These small post-mortems compound over time and prevent the same class of bug from recurring.

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/flow/maintenance.md
================================================
# Maintenance — flow

> Used by `/pre-push-update` only — not loaded when the `flow` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `common/cpp/test/CMakeLists.txt` | Test build section — new exclusions, new defines |
| `packages/react-native-audio-api/tests/` | JS test section — new test patterns |
| `packages/audiodocs/` | Docs section — new documentation conventions |
| `package.json` scripts | Post-work checks step — new or renamed commands |

This skill describes **process** — update it when the team's workflow changes, not for every new node added.


================================================
FILE: .claude/skills/host-objects/SKILL.md
================================================
---
name: host-objects
description: >
  Covers how to create, structure, and maintain JSI HostObjects that bridge C++ audio nodes to
  JavaScript in react-native-audio-api. Explains naming conventions, property/method exposure via
  macros, shadow state for JS↔audio-thread communication, JSI argument parsing, return value
  patterns, memory pressure, factory wiring in BaseAudioContextHostObject, and common pitfalls.
  Use this skill when creating a new audio node HostObject, modifying existing HostObject get/set/call
  logic, wiring a new node into the context factory, or debugging JSI-related crashes and type errors.
  Trigger phrases: "add HostObject", "create JSI bridge", "expose C++ node to JS", "shadow state",
  "scheduleAudioEvent from setter", "JSI property getter", "HostObject crashes", "new audio node".
---

# Skill: HostObjects

Scope: C++ JSI HostObject layer — `packages/react-native-audio-api/common/cpp/audioapi/HostObjects/`

HostObjects are the middle layer between the TypeScript API and the C++ audio engine. They expose C++ audio node state and methods to JavaScript via JSI (no bridge serialization), and route state changes to the audio thread via a lock-free SPSC event queue.

Golden references: `GainNodeHostObject.h/.cpp` (effect node), `OscillatorNodeHostObject.h/.cpp` (source node). Mirror their structure for any new HostObject. See [full examples](examples.md) for annotated implementations.

---

## Critical Pitfalls — Read Before Writing Any Code

- **NEVER read from `node_` in a getter** if the property can be written by the audio thread. Use shadow state or atomics instead.
- **NEVER call `node_->someMethod()` directly from a setter** — always schedule via `scheduleAudioEvent`. The audio thread may be mid-render.
- **ALWAYS register getters/setters/functions in the constructor.** Anything not added to `addGetters`/`addSetters`/`addFunctions` is silently missing from JS.
- **Match property names exactly.** The string in `JSI_EXPORT_PROPERTY_GETTER` becomes the JS property name. A typo means the property doesn't exist in JS.
- **Clear callback IDs in the destructor** for any HO that registers audio events. Otherwise the audio thread fires into a destroyed JS function.
- **Call `setExternalMemoryPressure`** when returning HOs or typed arrays backed by large native buffers.
- **Shadow state must be initialized** from `options` in the constructor — JS may read a property before ever setting it.

---

## Three-Layer Architecture

Every audio node has three layers. HostObject is the middle one:

```mermaid
flowchart TD
  TS["TypeScript class\n(src/core/)"]
  HO["HostObject\n(C++ — JsiHostObject subclass)"]
  AN["AudioNode\n(C++ core — audio thread)"]

  TS <--> |"JSI — direct memory, no serialization"| HO
  HO <--> |"shared_ptr\nscheduleAudioEvent → SPSC"| AN
```

There is **no strong typing** between the C++ HostObject and the TypeScript interface. Alignment is by convention — property names and function signatures must match manually.

---

## Directory Structure

```
HostObjects/
├── AudioNodeHostObject.h/.cpp            # Base for all audio node HOs
├── AudioParamHostObject.h/.cpp           # AudioParam wrapper
├── BaseAudioContextHostObject.h/.cpp     # Factory — all createXxx() methods live here
├── AudioContextHostObject.h/.cpp         # Realtime context (adds close/resume/suspend)
├── OfflineAudioContextHostObject.h/.cpp
├── analysis/
│   └── AnalyserNodeHostObject.h/.cpp
├── destinations/
│   └── AudioDestinationNodeHostObject.h
├── effects/
│   ├── GainNodeHostObject.h/.cpp
│   ├── BiquadFilterNodeHostObject.h/.cpp
│   ├── DelayNodeHostObject.h/.cpp
│   ├── IIRFilterNodeHostObject.h/.cpp
│   ├── StereoPannerNodeHostObject.h/.cpp
│   ├── WaveShaperNodeHostObject.h/.cpp
│   ├── ConvolverNodeHostObject.h/.cpp
│   ├── WorkletNodeHostObject.h/.cpp
│   └── WorkletProcessingNodeHostObject.h/.cpp
├── sources/
│   ├── AudioScheduledSourceNodeHostObject.h/.cpp  # Base for timed sources
│   ├── AudioBufferBaseSourceNodeHostObject.h/.cpp # Base for buffer sources
│   ├── OscillatorNodeHostObject.h/.cpp
│   ├── AudioBufferSourceNodeHostObject.h/.cpp
│   ├── AudioBufferQueueSourceNodeHostObject.h/.cpp
│   ├── ConstantSourceNodeHostObject.h/.cpp
│   ├── StreamerNodeHostObject.h/.cpp
│   ├── AudioBufferHostObject.h/.cpp               # Data container, not a node
│   └── RecorderAdapterNodeHostObject.h/.cpp
├── inputs/
│   └── AudioRecorderHostObject.h/.cpp
├── events/
│   └── AudioEventHandlerRegistryHostObject.h/.cpp
└── utils/
    ├── JsEnumParser.h/.cpp      # Enum ↔ string conversions
    ├── NodeOptionsParser.h      # Parses JS option objects into C++ structs
    ├── AudioDecoderHostObject.h/.cpp
    └── AudioStretcherHostObject.h/.cpp
```

---

## Macro System

All HostObjects use macros defined in `jsi/JsiHostObject.h`. Always use these — never write raw JSI dispatch code.

### Declaration macros (in .h)

```cpp
JSI_PROPERTY_GETTER_DECL(gain)         // jsi::Value gain(jsi::Runtime &runtime)
JSI_PROPERTY_SETTER_DECL(gain)         // void gain(jsi::Runtime &runtime, const jsi::Value &value)
JSI_HOST_FUNCTION_DECL(setValueAtTime) // jsi::Value setValueAtTime(jsi::Runtime &, const jsi::Value &, const jsi::Value *, size_t)
```

### Implementation macros (in .cpp)

```cpp
JSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) { ... }
JSI_PROPERTY_SETTER_IMPL(GainNodeHostObject, gain) { ... }
JSI_HOST_FUNCTION_IMPL(GainNodeHostObject, setValueAtTime) { ... }
```

### Registration macros (in constructor)

```cpp
addGetters(
    JSI_EXPORT_PROPERTY_GETTER(GainNodeHostObject, gain));
addSetters(
    JSI_EXPORT_PROPERTY_SETTER(GainNodeHostObject, fftSize));
addFunctions(
    JSI_EXPORT_FUNCTION(GainNodeHostObject, connect),
    JSI_EXPORT_FUNCTION(GainNodeHostObject, disconnect));
```

**All getters, setters, and functions must be registered in the constructor.** Anything not registered is invisible to JS.

---

## Shadow State

Shadow state is the core pattern for JS↔audio-thread communication (introduced in PR #942).

### The Problem

The audio node's C++ state is read and written on the **audio thread**. JS runs on a different thread. Without shadow state, reading a property from JS would require either a lock (forbidden on the audio thread) or an atomic (only works for primitives).

### The Solution

The HostObject maintains its own **copy** of the node's properties — the shadow state. This copy:
- Is read/written **only by the JS thread**
- Is always in sync with what JS last set
- Is the source of truth for JS reads

When JS sets a property:
1. Update the shadow copy immediately (JS thread)
2. Schedule an event on `CrossThreadEventScheduler` that will apply the change on the audio thread

When JS reads a property:
1. Return the shadow copy — **do not touch the C++ node**

```cpp
// Header — shadow state declared as private member
class OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {
 public:
  JSI_PROPERTY_GETTER_DECL(type);
  JSI_PROPERTY_SETTER_DECL(type);
 private:
  OscillatorType type_;  // shadow copy of node_->type_
};

// Getter — returns shadow, never touches audio thread
JSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, type) {
  return jsi::String::createFromUtf8(
      runtime, js_enum_parser::oscillatorTypeToString(type_));
}

// Setter — updates shadow + schedules audio thread update
JSI_PROPERTY_SETTER_IMPL(OscillatorNodeHostObject, type) {
  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);
  auto type = js_enum_parser::oscillatorTypeFromString(
      value.asString(runtime).utf8(runtime));

  // 1. Update shadow state (JS thread, immediate)
  type_ = type;

  // 2. Schedule audio thread update (lock-free SPSC)
  auto event = [oscillatorNode, type](BaseAudioContext &) {
    oscillatorNode->setType(type);
  };
  oscillatorNode->scheduleAudioEvent(std::move(event));
}
```

### When NOT to use shadow state

| Scenario | Pattern |
|---|---|
| Primitive, only written by JS | Shadow state (standard) |
| Non-primitive, only written by JS | Store in TS layer, pass to AudioNode when needed |
| Primitive, can be written by audio thread | `std::atomic<T>` on the C++ node; read directly via getter |
| Non-primitive, can be written by audio thread | Triple buffer pattern (see `AnalyserNode` for reference) |

### AudioParam is a special case

`AudioParam::value_` is `std::atomic<float>` because it can be updated by the audio thread during automation. The HO reads it directly:

```cpp
JSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, value) {
  return {param_->getValue()};  // atomic read, no shadow needed
}

JSI_PROPERTY_SETTER_IMPL(AudioParamHostObject, value) {
  auto event = [param = param_, v = static_cast<float>(value.getNumber())](BaseAudioContext &) {
    param->setValue(v);
  };
  param_->scheduleAudioEvent(std::move(event));
}
```

### Shadow state must be initialized in the constructor

Initialize shadow members from `options` in the constructor — JS may read a property before ever setting it:

```cpp
OscillatorNodeHostObject::OscillatorNodeHostObject(...) {
  type_ = options.type;  // Initialize shadow from options
}
```

---

## Argument Parsing

### Primitives

```cpp
float v       = static_cast<float>(args[0].getNumber());
double d      = args[0].getNumber();
int i         = static_cast<int>(args[0].getNumber());
bool b        = args[0].getBool();
std::string s = args[0].getString(runtime).utf8(runtime);
```

### Optional arguments — check count first

```cpp
// args[2] is optional, default -1
double duration = (count > 2 && !args[2].isUndefined()) ? args[2].getNumber() : -1.0;
```

Use `jsiutils::argToString(runtime, args, count, index, defaultValue)` for optional string args.

### TypedArrays (Float32Array, Uint8Array, etc.)

JS typed arrays are passed as objects with a `.buffer` property:

```cpp
JSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteFrequencyData) {
  auto arrayBuffer = args[0]
      .getObject(runtime)
      .getPropertyAsObject(runtime, "buffer")
      .getArrayBuffer(runtime);
  auto data   = arrayBuffer.data(runtime);
  auto length = static_cast<int>(arrayBuffer.size(runtime));

  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
  analyserNode->getByteFrequencyData(data, length);
  return jsi::Value::undefined();
}
```

For Float32Arrays (reinterpret the bytes):

```cpp
auto rawValues = reinterpret_cast<float *>(arrayBuffer.data(runtime));
auto length    = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));
```

### HostObject arguments (node-to-node)

```cpp
JSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, connect) {
  auto obj = args[0].getObject(runtime);
  if (obj.isHostObject<AudioNodeHostObject>(runtime)) {
    auto other = obj.getHostObject<AudioNodeHostObject>(runtime);
    node_->connect(other->node_);
  } else if (obj.isHostObject<AudioParamHostObject>(runtime)) {
    auto param = obj.getHostObject<AudioParamHostObject>(runtime);
    node_->connect(param->param_);
  }
  return jsi::Value::undefined();
}
```

### Extracting a HostObject's inner C++ object

```cpp
auto periodicWave = args[0]
    .getObject(runtime)
    .getHostObject<PeriodicWaveHostObject>(runtime);
oscillatorNode->setPeriodicWave(periodicWave->periodicWave_);
```

---

## Return Value Patterns

### Primitives

```cpp
return {fftSize_};                                          // int/float/double
return {true};                                              // bool
return jsi::String::createFromUtf8(runtime, "suspended");  // string
return jsi::Value::undefined();                             // void
return jsi::Value::null();                                  // null
```

### A HostObject

```cpp
JSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) {
  auto gainNode  = std::static_pointer_cast<GainNode>(node_);
  auto gainParam = std::make_shared<AudioParamHostObject>(gainNode->getGainParam());
  return jsi::Object::createFromHostObject(runtime, gainParam);
}
```

### A plain JS object

```cpp
auto result = jsi::Object(runtime);
result.setProperty(runtime, "status", jsi::String::createFromUtf8(runtime, "success"));
result.setProperty(runtime, "path",   jsi::String::createFromUtf8(runtime, path));
return result;
```

### A Float32Array wrapping native memory

```cpp
JSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, getChannelData) {
  auto channel          = static_cast<int>(args[0].getNumber());
  auto audioArrayBuffer = audioBuffer_->getSharedChannel(channel);
  auto arrayBuffer      = jsi::ArrayBuffer(runtime, audioArrayBuffer);

  auto float32ArrayCtor = runtime.global()
      .getPropertyAsFunction(runtime, "Float32Array");
  auto float32Array = float32ArrayCtor
      .callAsConstructor(runtime, arrayBuffer)
      .getObject(runtime);

  float32Array.setExternalMemoryPressure(runtime, audioArrayBuffer->size());
  return float32Array;
}
```

### External memory pressure

Call `setExternalMemoryPressure` whenever returning a HostObject or typed array that wraps a large native buffer. This lets the JS GC schedule collection correctly:

```cpp
jsiObject.setExternalMemoryPressure(runtime, bufferHostObject->getSizeInBytes());
```

---

## Enum Parsing

Use `JsEnumParser` (`utils/JsEnumParser.h`) for all enum ↔ string conversions. Never hardcode strings.

```cpp
// String → enum
auto type = js_enum_parser::oscillatorTypeFromString(
    value.asString(runtime).utf8(runtime));

// Enum → string
return jsi::String::createFromUtf8(
    runtime, js_enum_parser::oscillatorTypeToString(type_));
```

When adding a new enum, add both directions to `JsEnumParser`.

---

## Destructor: Clearing Callbacks

When a HostObject is garbage collected, registered audio callbacks must be cleared. Otherwise the audio thread fires into a destroyed JS function.

```cpp
AudioScheduledSourceNodeHostObject::~AudioScheduledSourceNodeHostObject() {
  auto node = std::static_pointer_cast<AudioScheduledSourceNode>(node_);
  node->setOnEndedCallbackId(0);  // 0 = no listener
}
```

Apply this for every `std::atomic<uint64_t>` callback ID on the node.

---

## TypeScript Counterpart

Each HO must have a matching TS interface and class in `packages/react-native-audio-api/src/core/`.

```ts
// Interface — mirrors C++ HO properties exactly (src/core/interfaces/)
export interface IGainNode extends IAudioNode {
  readonly gain: IAudioParam;
}

// TS class — wraps the C++ HO (src/core/)
class GainNode extends AudioNode {
  readonly gain: AudioParam;

  constructor(context: BaseAudioContext, options?: TGainOptions) {
    // context.context is the C++ BaseAudioContextHostObject
    const gainNode: IGainNode = context.context.createGain(options ?? {});
    super(context, gainNode);
    this.gain = new AudioParam(gainNode.gain, context);
  }
}
```

See the `turbo-modules` skill for full TS wiring details.

---

## Adding to BaseAudioContextHostObject

Every new node needs a factory method. Three steps:

### 1. Declare in `BaseAudioContextHostObject.h`

```cpp
JSI_HOST_FUNCTION_DECL(createMyNode);
```

### 2. Register in `BaseAudioContextHostObject` constructor

```cpp
addFunctions(
    // ... existing entries
    JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createMyNode));
```

### 3. Implement in `BaseAudioContextHostObject.cpp`

```cpp
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createMyNode) {
  MyNodeOptions options = NodeOptionsParser::parseMyNodeOptions(runtime, args, count);
  auto myNode = std::make_shared<MyNodeHostObject>(context_, options);
  return jsi::Object::createFromHostObject(runtime, myNode);
}
```

Also add `createMyNode()` to the C++ `BaseAudioContext` factory — see the `audio-nodes` skill.

---

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/host-objects/examples.md
================================================
# HostObject Examples

## GainNodeHostObject (no shadow state)

`gain` is an `AudioParam` — no shadow state needed because its `value_` is `std::atomic<float>`.

### `effects/GainNodeHostObject.h`

```cpp
#pragma once
#include "audioapi/HostObjects/AudioNodeHostObject.h"
#include "audioapi/HostObjects/AudioParamHostObject.h"
#include "audioapi/core/effects/GainNode.h"

namespace audioapi {

class GainNodeHostObject : public AudioNodeHostObject {
 public:
  explicit GainNodeHostObject(
      const std::shared_ptr<BaseAudioContext> &context,
      const GainOptions &options);

  // JS-thread only
  JSI_PROPERTY_GETTER_DECL(gain);
};

} // namespace audioapi
```

### `effects/GainNodeHostObject.cpp`

```cpp
GainNodeHostObject::GainNodeHostObject(
    const std::shared_ptr<BaseAudioContext> &context,
    const GainOptions &options)
    : AudioNodeHostObject(context->createGain(options)) {
  addGetters(
      JSI_EXPORT_PROPERTY_GETTER(GainNodeHostObject, gain));
}

JSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) {
  auto gainNode  = std::static_pointer_cast<GainNode>(node_);
  auto gainParam = std::make_shared<AudioParamHostObject>(gainNode->getGainParam());
  return jsi::Object::createFromHostObject(runtime, gainParam);
}
```

---

## OscillatorNodeHostObject (with shadow state)

`type` is a plain enum — not atomic — so it uses shadow state. `AudioParam` wrappers for `frequency` and `detune` are preallocated in the constructor and returned directly (no shadow needed since the underlying `value_` is atomic on the node).

### `sources/OscillatorNodeHostObject.h`

```cpp
#pragma once
#include "audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h"
#include "audioapi/core/sources/OscillatorNode.h"

namespace audioapi {

class OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {
 public:
  explicit OscillatorNodeHostObject(
      const std::shared_ptr<BaseAudioContext> &context,
      const OscillatorOptions &options);

  // JS-thread only
  JSI_PROPERTY_GETTER_DECL(frequency);
  JSI_PROPERTY_GETTER_DECL(detune);
  JSI_PROPERTY_GETTER_DECL(type);
  JSI_PROPERTY_SETTER_DECL(type);
  JSI_HOST_FUNCTION_DECL(setPeriodicWave);

 private:
  // Shadow state — JS thread only
  OscillatorType type_;
  // AudioParam wrappers — not shadow state, wrap atomic state on the node
  std::shared_ptr<AudioParamHostObject> frequencyParam_;
  std::shared_ptr<AudioParamHostObject> detuneParam_;
};

} // namespace audioapi
```

### `sources/OscillatorNodeHostObject.cpp`

```cpp
OscillatorNodeHostObject::OscillatorNodeHostObject(
    const std::shared_ptr<BaseAudioContext> &context,
    const OscillatorOptions &options)
    : AudioScheduledSourceNodeHostObject(context->createOscillator(options)) {
  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);

  // Initialize shadow from options
  type_ = options.type;

  // Preallocate AudioParam wrappers
  frequencyParam_ = std::make_shared<AudioParamHostObject>(oscillatorNode->getFrequencyParam());
  detuneParam_    = std::make_shared<AudioParamHostObject>(oscillatorNode->getDetuneParam());

  addGetters(
      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, frequency),
      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, detune),
      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, type));
  addSetters(
      JSI_EXPORT_PROPERTY_SETTER(OscillatorNodeHostObject, type));
  addFunctions(
      JSI_EXPORT_FUNCTION(OscillatorNodeHostObject, setPeriodicWave));
}

JSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, frequency) {
  return jsi::Object::createFromHostObject(runtime, frequencyParam_);
}

JSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, type) {
  // Return shadow — never read from node_
  return jsi::String::createFromUtf8(
      runtime, js_enum_parser::oscillatorTypeToString(type_));
}

JSI_PROPERTY_SETTER_IMPL(OscillatorNodeHostObject, type) {
  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);
  auto type = js_enum_parser::oscillatorTypeFromString(
      value.asString(runtime).utf8(runtime));

  // 1. Shadow update — immediate, JS thread
  type_ = type;

  // 2. Audio thread update — async, lock-free
  auto event = [oscillatorNode, type](BaseAudioContext &) {
    oscillatorNode->setType(type);
  };
  oscillatorNode->scheduleAudioEvent(std::move(event));
}

JSI_HOST_FUNCTION_IMPL(OscillatorNodeHostObject, setPeriodicWave) {
  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);
  auto periodicWave   = args[0].getObject(runtime)
      .getHostObject<PeriodicWaveHostObject>(runtime);
  oscillatorNode->setPeriodicWave(periodicWave->periodicWave_);
  return jsi::Value::undefined();
}
```



================================================
FILE: .claude/skills/host-objects/maintenance.md
================================================
# Maintenance — host-objects

> Used by `/pre-push-update` only — not loaded when the `host-objects` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `common/cpp/audioapi/HostObjects/**` | New HostObjects, macro usage changes, shadow state patterns |
| `common/cpp/audioapi/jsi/JsiHostObject.*` | Macro signatures, new export macros — update both `SKILL.md` and `examples.md` |
| `common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.*` | Factory wiring section (3-step checklist) |
| Any new `*HostObject.h` | Add to directory structure, document any new patterns it introduces |
| `common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.*` | `examples.md` — macro usage, AudioParam wrapping pattern |
| `common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.*` | `examples.md` — shadow state pattern, enum parsing |

Update the **three-layer architecture diagram** in `SKILL.md` only if the communication mechanism between layers changes.


================================================
FILE: .claude/skills/post-work-checks/SKILL.md
================================================
---
name: post-work-checks
description: >
  Ordered quality gate checklist to run after every code change in react-native-audio-api.
  Covers formatting, linting, type checking, C++ tests, JS tests, and enum sync validation.
  Documents what lefthook pre-commit hooks run automatically vs what must be run manually.
  Use at the end of any implementation task before opening a PR.
  Trigger phrases: "post-work", "before PR", "before commit", "check quality", "run linter",
  "run tests", "format code", "lefthook", "pre-commit", "yarn test", "yarn lint".
---

# Skill: Post-Work Checks

Run these checks after any code change and before opening a PR.

---

## Quick Reference

```bash
yarn format                  # auto-fix all formatting
yarn lint                    # lint all workspaces
yarn typecheck               # TypeScript type checking
yarn test                    # C++ Google Tests
yarn check-audio-enum-sync   # only if AudioEvent enum touched
```

---

## What lefthook Runs Automatically

`lefthook` runs pre-commit hooks on every `git commit` — these run automatically:

| Hook | Command |
|---|---|
| Format | `yarn format` (JS via Prettier, C++ via clang-format, Kotlin via ktlint) |
| Lint | `yarn lint` (JS/TS + C++ + Kotlin) |
| Type check | `yarn typecheck` |
| Commit message | `commitlint` |

**If a hook fails, the commit is aborted.** Fix the issue and re-commit — do NOT use `--no-verify`.

---

## What Must Be Run Manually

These are NOT run by lefthook:

### C++ tests

```bash
yarn test   # from monorepo root
```

Runs `packages/react-native-audio-api/common/cpp/test/RunTests.sh` via CMake + Google Test.

**When**: after any change to `common/cpp/audioapi/core/`, `dsp/`, or `utils/` C++ files.

### AudioEvent enum sync check

```bash
yarn check-audio-enum-sync
```

**When**: only when you modify the `AudioEvent` enum or any file that maps event names across C++/Kotlin/TypeScript.

---

## Per-Language Commands

When you need to target a specific language:

```bash
# TypeScript/JavaScript
yarn lint:js           # ESLint
yarn format:js         # Prettier

# Shared C++
yarn format:common     # clang-format for common/cpp/
yarn lint:cpp          # cpplint

# Android
yarn format:android:cpp     # clang-format for android/src/main/cpp/
yarn format:android:kotlin  # KtLint
yarn lint:kotlin             # Kotlin linter

# iOS
yarn format:ios         # clang-format for ios/
yarn lint:ios           # iOS Objective-C++ format checks
```

---

## Recommended Order

Later steps may surface issues caused by earlier ones — run in this order:

1. `yarn format` — fix formatting first (removes noise from lint)
2. `yarn lint` — catch remaining code issues
3. `yarn typecheck` — catch TypeScript errors
4. `yarn test` — catch C++ regressions (when C++ changed)
5. `yarn check-audio-enum-sync` — when `AudioEvent` enum was touched

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/post-work-checks/maintenance.md
================================================
# Maintenance — post-work-checks

> Used by `/pre-push-update` only — not loaded when the `post-work-checks` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| Root `package.json` scripts | New or renamed lint/format/test commands |
| `packages/react-native-audio-api/package.json` scripts | Package-level command changes |
| `.lefthook.yml` or lefthook config | Pre-commit hook changes |
| `scripts/check-audio-enum-sync*` | Enum sync check details |


================================================
FILE: .claude/skills/thread-safety-itc/SKILL.md
================================================
---
name: thread-safety-itc
description: >
  Audio thread safety rules, lock-free inter-thread communication patterns, and the audio event
  system in react-native-audio-api. Covers the three-thread model (JS / audio / worker),
  CrossThreadEventScheduler for JS→audio scheduling, IAudioEventHandlerRegistry for audio→JS events,
  AudioGraphManager for graph mutations, shadow state vs atomics decision table, TaskOffloader for
  off-thread work, and SpscChannel low-level API. Use when implementing cross-thread data flow,
  adding audio events, debugging thread-safety crashes or data races, or deciding which ITC
  primitive to use.
  Trigger phrases: "lock-free", "SPSC", "thread safety", "ITC", "cross-thread", "audio thread race",
  "scheduleAudioEvent", "invokeHandlerWithEventBody", "TaskOffloader", "off-thread",
  "SpscChannel", "CrossThreadEventScheduler", "shadow state", "atomic".
---

# Skill: Thread Safety & Inter-Thread Communication

Three threads interact in this codebase. Every line of code that crosses a thread boundary must use the correct primitive or it is a bug.

**When in doubt about which ITC primitive to use → go to the Decision Table below first.**

---

## The Three Threads

| Thread | Alias | Runs |
|---|---|---|
| React Native JS thread | "JS thread" | User code, HostObject methods, `scheduleAudioEvent` calls |
| Audio thread | "audio thread" | `processNode()` — driven by Oboe (Android) / CoreAudio (iOS) |
| Worker threads | "off-thread" | FFmpeg decoding, file I/O, `TaskOffloader` tasks |

**Audio thread is real-time.** It has a hard deadline (~3ms at 44100 Hz, 128 frames). Missing it causes audible glitches.

---

## Audio Thread Contract

`processNode()` **MUST NOT**:
- Allocate or free memory (`new`, `delete`, `malloc`, `free`, any `push_back` that grows)
- Acquire any mutex (`std::mutex`, `std::lock_guard`, `std::unique_lock`)
- Make blocking syscalls (file I/O, socket I/O, `sleep`, `wait`)
- Call into JavaScript (no JSI calls, no `callInvoker_->invokeSync()`)
- Throw exceptions

**Preallocate everything in the constructor (JS thread).** The audio thread only uses what was already allocated.

---

## JS → Audio: `CrossThreadEventScheduler`

The standard way to send property updates from JS to the audio thread.

```cpp
// JS thread (HostObject setter):
auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);
auto event = [oscillatorNode, type](BaseAudioContext &) {
  oscillatorNode->setType(type);   // runs on audio thread
};
oscillatorNode->scheduleAudioEvent(std::move(event));
```

`scheduleAudioEvent()` is defined on `AudioNode`. It enqueues a lambda into the node's `CrossThreadEventScheduler<BaseAudioContext>`. The audio thread drains the queue at the start of each render cycle.

**Never assume immediate consistency** — by the time the audio thread processes the event, several render quanta may have passed.

---

## Audio → JS: `IAudioEventHandlerRegistry`

Send events from the audio thread back to JS (e.g. `ended`, `loopEnded`, `positionChanged`).

```cpp
// Audio thread: fire event with no payload
audioEventHandlerRegistry_->invokeHandlerWithEventBody(AudioEvent::ENDED, {});

// Audio thread: fire event with payload
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
    AudioEvent::POSITION_CHANGED, {{"position", currentPosition}});
```

Internally calls `callInvoker_->invokeAsync()` — safe to call from the audio thread.

### Callback ID pattern

Callbacks are stored as `std::atomic<uint64_t>` on the C++ node. `0` means no listener.

```cpp
// C++ node header
std::atomic<uint64_t> onEndedCallbackId_{0};

// HostObject destructor — MUST clear to prevent firing into a destroyed JS function
~AudioScheduledSourceNodeHostObject() {
  auto node = std::static_pointer_cast<AudioScheduledSourceNode>(node_);
  node->setOnEndedCallbackId(0);
}
```

**Always clear callback IDs in the HostObject destructor.**

---

## Graph Mutations: `AudioGraphManager`

Connect/disconnect operations queue via `AudioGraphManager` (its own internal SPSC channel). The audio thread calls `graphManager_->preProcessGraph()` before each render pass to apply pending changes.

Do not call `AudioGraphManager` directly — go through `AudioNode::connect()` / `disconnect()`.

---

## Decision Table

| Scenario | Correct pattern |
|---|---|
| JS sets a property → audio thread reads it | Shadow state in HostObject + `scheduleAudioEvent` |
| Audio thread fires an event → JS callback | `invokeHandlerWithEventBody()` |
| JS connects/disconnects nodes | `AudioNode::connect()` → `AudioGraphManager` |
| Property written by audio thread, JS reads it | `std::atomic<T>` on C++ node; getter reads directly |
| Non-primitive, can be written by audio thread | Triple buffer (see `AnalyserNode` for reference) |
| CPU-heavy work, must not block JS or audio | `TaskOffloader` on a dedicated worker thread |

---

## Off-Thread Work: `TaskOffloader`

For work that would block both the JS thread and the audio thread (decoding, file writing):

```cpp
TaskOffloader<MyWorkItem> offloader([](MyWorkItem item) {
  // runs on dedicated worker thread — allocs OK, blocking I/O OK
  item.process();
});
offloader.scheduleTask(std::move(workItem));
```

See the `utilities` skill for full API.

---

## Common Mistakes

- **Reading `node_->field_` in a getter** when that field is written by the audio thread → use shadow state or atomics.
- **Calling `node_->method()` directly from a setter** → always schedule via `scheduleAudioEvent`.
- **Not clearing callback IDs in the HostObject destructor** → audio thread fires into destroyed JS function.
- **`std::vector::push_back` in `processNode()`** → may allocate; preallocate in constructor.
- **`std::mutex` anywhere in `processNode()`** → deadlock risk and real-time violation.
- **Copying `shared_ptr` inside `processNode()`** — increments atomic refcount; capture before entering hot path.

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/thread-safety-itc/maintenance.md
================================================
# Maintenance — thread-safety-itc

> Used by `/pre-push-update` only — not loaded when the `thread-safety-itc` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `common/cpp/audioapi/events/**` | New event types, handler patterns, `AudioEvent` enum |
| `common/cpp/audioapi/utils/SpscChannel.hpp` | Lock-free queue API changes |
| `common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp` | Scheduler API changes — update decision table |
| `common/cpp/audioapi/core/AudioNode.*` | Audio thread contract changes |
| `common/cpp/audioapi/core/utils/AudioGraphManager.*` | Graph mutation queue changes |
| Any new cross-thread primitive in `utils/` | Document in the decision table |


================================================
FILE: .claude/skills/turbo-modules/SKILL.md
================================================
---
name: turbo-modules
description: >
  TurboModule spec, JSI binding injection, and platform native module entry points. Use when adding
  a new native method to NativeAudioAPIModule.ts, wiring a new top-level HostObject through
  AudioAPIModuleInstaller, debugging "native module not found" or "undefined is not a function"
  for a global, or understanding the install() bootstrap flow on iOS and Android.
  Trigger phrases: "native module not found", "install()", "NativeAudioAPIModule",
  "injectJSIBindings", "AudioAPIModuleInstaller", "JSI global", "TurboModule spec",
  "module bootstrap", "undefined is not a function".
---

# Skill: TurboModules & JSI Installation

## When to Use TurboModule vs HostObjects

**Rule**: if it needs `AVAudioSession`, `AudioManager`, `MediaSession`, or OS permissions → TurboModule. If it's audio processing → HostObject installed by `AudioAPIModuleInstaller`.

| Use TurboModule method | Use HostObject property/method |
|---|---|
| Platform system APIs (audio session, permissions, notifications, device routing) | All audio graph operations (create/connect/disconnect nodes, AudioParam, scheduling) |
| One-time initialization (`install`) | Real-time playback control |
| Features that need native UI thread or system callbacks | Features that only need the JSI runtime |
| Android-only or iOS-only behavior | Cross-platform C++ engine behavior |

Most audio nodes do **not** need a TurboModule method — they are exposed entirely through JSI HostObjects injected by `injectJSIBindings`.

---

## Reference

- RN TurboModules (new arch): https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules
- RN JSI: https://reactnative.dev/docs/the-new-architecture/architecture-glossary#javascript-interface-jsi
- fbjni (Android JNI bridge): https://github.com/facebookincubator/fbjni

---

## The Big Picture

Most audio functionality is exposed **not** through TurboModule method calls but through **JSI HostObjects** placed directly on the JS global object. The TurboModule's job is narrow:

1. Be available early via the standard RN module system
2. Provide `install()` — one synchronous call that injects HostObject factories onto `globalThis`
3. Expose platform-specific system APIs (audio session, permissions, notifications, devices) that cannot be done through pure JSI

```mermaid
flowchart TD
  A["JS: NativeAudioAPIModule.install()"]

  subgraph ios["iOS — AudioAPIModule.mm"]
    B["init AudioSessionManager · AudioEngine\nget jsi::Runtime* · CallInvoker"]
  end

  subgraph android["Android — AudioAPIModule.kt + .cpp"]
    C["MediaSessionManager.initialize()\nJNI: injectJSIBindings()"]
  end

  D["AudioAPIModuleInstaller::injectJSIBindings\n(runtime, callInvoker, eventRegistry, uiRuntime?)"]

  subgraph globals["globalThis — set by injectJSIBindings"]
    G["createAudioContext\ncreateOfflineAudioContext\ncreateAudioRecorder\ncreateAudioBuffer\ncreateAudioDecoder\ncreateAudioStretcher\nAudioEventEmitter HostObject"]
  end

  A --> ios
  A --> android
  ios --> D
  android --> D
  D --> globals
```

After `install()` returns, TypeScript code can call `globalThis.createAudioContext(sampleRate)` and get back a HostObject — no serialization, no bridge round-trip.

---

## TurboModule Spec (`src/specs/NativeAudioAPIModule.ts`)

Defines the TypeScript interface for the native module. Codegen (React Native's codegen) generates the native binding glue from this file.

```ts
interface Spec extends TurboModule {
  install(): boolean;                           // synchronous — MUST run first
  getDevicePreferredSampleRate(): number;       // synchronous
  setAudioSessionActivity(enabled: boolean): Promise<boolean>;
  setAudioSessionOptions(...): void;
  observeAudioInterruptions(focusType, enabled): void;
  requestRecordingPermissions(): Promise<PermissionStatus>;
  // ... audio devices, notifications ...
}

const NativeAudioAPIModule = TurboModuleRegistry.get<Spec>('AudioAPIModule')!;
```

**`install()` is synchronous** (`RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD` on iOS, `override fun install(): Boolean` on Android). It must complete before the app tries to use any audio API. It is called once during module bootstrap in `src/AudioAPIModule/index.ts`.

**Web mock** (`src/specs/NativeAudioAPIModule.web.ts`): on the web platform, the whole spec is mocked with no-ops and resolved promises (e.g. permissions always return `'Granted'`). This file replaces the native spec at bundle time for web builds.

---

## `AudioAPIModuleInstaller` (`common/cpp/audioapi/AudioAPIModuleInstaller.h`)

The single C++ class that owns JSI injection. It is `#include`-d by both iOS (`.mm`) and Android (`.cpp`) native modules, keeping the injection logic platform-agnostic.

```cpp
class AudioAPIModuleInstaller {
 public:
  static void injectJSIBindings(
      jsi::Runtime *jsiRuntime,
      const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
      std::shared_ptr<worklets::WorkletRuntime> uiRuntime = nullptr);
};
```

Each `get*Function()` private method creates a `jsi::Function` via `jsi::Function::createFromHostFunction()`. The lambda captures the dependencies it needs (`jsCallInvoker`, `audioEventHandlerRegistry`, `uiRuntime`) by value (shared_ptr).

**Worklets guard**: functions that need the worklets runtime (AudioContext, OfflineAudioContext) have an `#if RN_AUDIO_API_ENABLE_WORKLETS` branch:
```cpp
#if RN_AUDIO_API_ENABLE_WORKLETS
  auto runtimeRegistry = RuntimeRegistry{.uiRuntime = uiRuntime};
  if (count > 1 && args[1].isObject()) {
    runtimeRegistry.audioRuntime = worklets::extractWorkletRuntime(runtime, args[1]);
  }
#else
  auto runtimeRegistry = RuntimeRegistry{};
#endif
```

**Adding a new top-level global**: add a `static jsi::Function getCreateXxxFunction(...)` private method and a `setProperty("createXxx", ...)` call in `injectJSIBindings`. This is only needed for objects that JS creates directly (not objects created as properties of another HostObject).

---

## iOS Native Module (`AudioAPIModule.mm`)

Uses ObjC++ with `RCT_EXPORT_MODULE` and `RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD`.

**Key steps in `install`**:
1. Allocate platform managers (`AudioSessionManager`, `AudioEngine`, `SystemNotificationManager`, `NotificationRegistry`)
2. Get `jsi::Runtime *` from the bridge: `reinterpret_cast<facebook::jsi::Runtime *>(self.bridge.runtime)`
3. Get `CallInvoker` — different paths for old Bridge vs New Architecture:
   ```objc
   #if defined(RCT_NEW_ARCH_ENABLED)
     auto jsCallInvoker = _callInvoker.callInvoker;
   #else
     auto jsCallInvoker = self.bridge.jsCallInvoker;
   #endif
   ```
4. Create `AudioEventHandlerRegistry` (owns JS callbacks, needs runtime + callInvoker)
5. Call `AudioAPIModuleInstaller::injectJSIBindings(...)`

**New Architecture support** (`getTurboModule`):
```objc
#ifdef RCT_NEW_ARCH_ENABLED
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
    (const facebook::react::ObjCTurboModule::InitParams &)params
{
  return std::make_shared<facebook::react::NativeAudioAPIModuleSpecJSI>(params);
}
#endif
```
This connects the ObjC implementation to the codegen-generated C++ TurboModule spec.

**`methodQueue`**: the module runs on a dedicated serial queue (`com.swmansion.audioapi.MainModuleQueue`), not the main thread.

**`invokeHandlerWithEventName:eventBody:`**: called from Objective-C system callbacks (audio session interruption, volume change, etc.) to fire events back into JS. It converts `NSDictionary` to `std::unordered_map<std::string, EventValue>` and calls `audioEventHandlerRegistry_->invokeHandlerWithEventBody(...)`.

---

## Android Native Module (`AudioAPIModule.kt` + `AudioAPIModule.cpp`)

Android uses **fbjni HybridObject** — a pattern where a Kotlin class holds a C++ peer via `HybridData`. The Kotlin class handles the Java/Kotlin TurboModule protocol; the C++ peer owns the JSI runtime pointer and call invoker.

### Initialization flow

```
AudioAPIModule.kt (init block)
  ├── System.loadLibrary("react-native-audio-api")        // load .so
  ├── get CallInvokerHolderImpl from reactContext
  ├── get WorkletsModule if worklets enabled
  └── mHybridData = initHybrid(workletsModule, jsContext, callInvokerHolder)
            │
            ▼
      AudioAPIModule.cpp::initHybrid (JNI)
        ├── unwrap jsCallInvoker from holder
        ├── reinterpret_cast<jsi::Runtime *>(jsContext)
        ├── [if worklets] get WorkletsModuleProxy
        └── makeCxxInstance(...)   → creates C++ AudioAPIModule peer
                └── stores: jsiRuntime_, jsCallInvoker_, audioEventHandlerRegistry_
```

```
AudioAPIModule.kt::install()
  ├── MediaSessionManager.initialize(...)
  ├── NativeFileInfo.initialize(...)
  └── injectJSIBindings()   // external fun → JNI call
            │
            ▼
      AudioAPIModule.cpp::injectJSIBindings()
        └── AudioAPIModuleInstaller::injectJSIBindings(...)
```

**`external fun`**: Kotlin keyword for JNI-implemented methods. These are registered in `AudioAPIModule.cpp::registerNatives()`:
```cpp
void AudioAPIModule::registerNatives() {
  registerHybrid({
    makeNativeMethod("initHybrid",          AudioAPIModule::initHybrid),
    makeNativeMethod("injectJSIBindings",   AudioAPIModule::injectJSIBindings),
    makeNativeMethod("invokeHandlerWithEventNameAndEventBody", ...),
  });
}
```

`registerNatives()` is called from `android/src/main/cpp/audioapi/android/OnLoad.cpp` at `.so` load time.

**`invokeHandlerWithEventNameAndEventBody`**: called from Kotlin (MediaSessionManager callbacks) to fire events into JS. Takes a Java `Map<String, Object>` and converts to `std::unordered_map<std::string, EventValue>`.

---

## Two-Architecture Paths Summary

| | Old Bridge | New Architecture (TurboModules/Fabric) |
|---|---|---|
| iOS CallInvoker source | `self.bridge.jsCallInvoker` | `_callInvoker.callInvoker` |
| iOS runtime source | `self.bridge.runtime` (cast) | same |
| iOS codegen | `RCT_EXPORT_MODULE` only | `+ getTurboModule:` implemented |
| Android CallInvoker | `reactContext.jsCallInvokerHolder` | same |
| Android codegen | `NativeAudioAPIModuleSpec` base class | same (generated) |

The JSI injection itself (`AudioAPIModuleInstaller`) is identical for both architectures — it only needs the `jsi::Runtime *` and `CallInvoker`, which are obtained differently but behave the same.

---

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/turbo-modules/maintenance.md
================================================
# Maintenance — turbo-modules

> Used by `/pre-push-update` only — not loaded when the `turbo-modules` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `src/specs/NativeAudioAPIModule.ts` | Spec interface — new methods, changed signatures |
| `common/cpp/audioapi/AudioAPIModuleInstaller.h` | New globals injected, new HostObjects installed |
| `ios/audioapi/ios/AudioAPIModule.mm` | iOS install flow, new platform managers, new RCT_EXPORT_METHOD |
| `android/src/main/java/.../AudioAPIModule.kt` | Android `install()`, new `external fun`, lifecycle changes |
| `android/src/main/cpp/audioapi/android/AudioAPIModule.cpp` | New `registerNatives` entries |

Update the **install flow diagram** when new globals are added to `injectJSIBindings`.


================================================
FILE: .claude/skills/utilities/SKILL.md
================================================
---
name: utilities
description: >
  Overview of all shared utility helpers, data structures, and DSP primitives available in
  react-native-audio-api. Covers C++ utilities in common/cpp/audioapi/utils/,
  common/cpp/audioapi/core/utils/, common/cpp/audioapi/dsp/, and TypeScript utilities in
  src/utils/. Use this skill before writing new math, buffer management, or cross-thread code —
  check if a utility already exists. Trigger phrases: "add a new utility", "what helpers are
  available", "cross-thread communication", "audio buffer", "DSP math", "circular buffer",
  "lock-free queue", "off-thread", "SIMD buffer", "time conversion", "parameter automation",
  "audio constants", "TypeScript utils".
---

# Skill: Utilities

## `common/cpp/audioapi/utils/` — Core data structures & primitives

### `AudioArray.h` — float audio array (read header for full API)

Single-channel float buffer. The foundational data type. Use for any per-channel audio data.

Key operations: `zero()`, `sum(source, gain)`, `multiply(source)`, `copy(source)`, `copyReverse(...)`, `copyTo(float*)`, `copyWithin(...)`, `scale(float)`, `normalize()`, `getMaxAbsValue()`, `computeConvolution(kernel)`.

Access: `operator[]`, `begin()`/`end()`, `span()`, `subSpan(length, offset)`.

Constructors copy data — `AudioArray` always owns its buffer.

---

### `AudioBuffer.h` — multi-channel container (read header for full API)

Holds N channels of `AudioArrayBuffer`. Handles up/down-mixing automatically on `sum()` and `copy()`.

Key operations: `getChannel(index)`, `getSharedChannel(index)`, `zero()`, `sum(source, interpretation)`, `copy(source)`, `deinterleaveFrom(float*, frames)`, `interleaveTo(float*, frames)`, `normalize()`, `scale(float)`.

Channel layout constants: `ChannelMono=0`, `ChannelLeft=0`, `ChannelRight=1`, `ChannelCenter=2`, `ChannelLFE=3`, `ChannelSurroundLeft=4`, `ChannelSurroundRight=5`.

`getChannel()` returns a non-owning `AudioArray*`. `getSharedChannel()` returns `shared_ptr<AudioArrayBuffer>` (use for JSI transfer).

---

### `AudioArrayBuffer.hpp` — JSI-transferable audio array

`AudioArray` + `jsi::MutableBuffer`. Allows zero-copy transfer of audio data to JS as an `ArrayBuffer`. Use in `getChannelData()` patterns.

```cpp
// Typical usage in HostObject — no copy, JS sees the native memory
auto audioArrayBuffer = audioBuffer_->getSharedChannel(channel);
auto arrayBuffer = jsi::ArrayBuffer(runtime, audioArrayBuffer);
auto float32Array = runtime.global()
    .getPropertyAsFunction(runtime, "Float32Array")
    .callAsConstructor(runtime, arrayBuffer)
    .getObject(runtime);
float32Array.setExternalMemoryPressure(runtime, audioArrayBuffer->size());
```

---

### `CircularAudioArray.h` — circular float buffer (read header)

`AudioArray` subclass acting as a circular queue for streaming audio. **Not thread-safe** — use only from one thread.

Key operations:
- `push_back(AudioArray&, size)` / `push_back(float*, size)` — write frames
- `pop_front(AudioArray&, size)` / `pop_front(float*, size)` — read oldest frames
- `pop_back(AudioArray&, size, offset)` — read newest frames
- `getNumberOfAvailableFrames()` — how many frames ready to read

Used in delay lines and streaming buffers.

---

### `CircularOverflowableAudioArray.h` — overwritable circular buffer

Like `CircularAudioArray` but overwrites oldest data when full instead of rejecting. Use for recording input where you always want the latest data, not the oldest.

---

### `SpscChannel.hpp` — lock-free SPSC channel

Bounded single-producer, single-consumer queue built on aligned atomics. **Do not use directly — prefer `CrossThreadEventScheduler` or `TaskOffloader`** unless you need fine-grained control.

For full API see [api.md](api.md#spscchannelhpp--lock-free-spsc-channel).

---

### `CrossThreadEventScheduler.hpp` — JS→audio event queue

High-level wrapper over `SpscChannel` for scheduling lambdas from the JS thread to be executed on the audio thread. This is **the standard way** to send updates from JS to audio.

For full API see [api.md](api.md#crossthreadeventschedulerhpp--jsaudio-event-queue).

---

### `AlignedAllocator.hpp` — aligned STL allocator

STL-compatible allocator that guarantees `N`-byte alignment (default 16 bytes, SIMD-friendly). Use when creating buffers that will be processed by SIMD code in `VectorMath`.

For full API see [api.md](api.md#alignedallocatorhpp--aligned-stl-allocator).

---

### `MoveOnlyFunction.hpp` — non-copyable function wrapper

Backport of C++23 `std::move_only_function`. Use instead of `std::function` when the callable captures a move-only type (e.g. a `unique_ptr`).

For full API see [api.md](api.md#moveonlyfunctionhpp--non-copyable-function-wrapper).

---

### `Result.hpp` — Rust-style Result<T,E>

Represents either success (`Ok`) or error (`Err`). Use at API boundaries (e.g. `AudioRecorder::start()`). Use `NoneType` / `None` for void variants.

For full API see [api.md](api.md#resulthpp--rust-style-resultte).

---

### `RingBiDirectionalBuffer.hpp` — compile-time capacity ring deque

Non-thread-safe bounded ring buffer with push/pop from both ends. Capacity is a **compile-time** power-of-two template parameter. Used for `AudioParamEventQueue`.

For full API see [api.md](api.md#ringbidirectionalbufferhpp--compile-time-capacity-ring-deque).

---

### `TaskOffloader.hpp` — worker thread with SPSC input

Spawns a dedicated worker thread that processes items from a SPSC channel. Use when you need to offload a recurring task (e.g. file writing, decoding) to a dedicated thread.

For full API see [api.md](api.md#taskoffloaderhpp--worker-thread-with-spsc-input).

---

### `Benchmark.hpp` — timing utilities (dev/debug only)

Use `getExecutionTime()` for one-shot nanosecond timing. **Do not leave `logAvgExecutionTime` in production code.**

For full API see [api.md](api.md#benchmarkhpp--timing-utilities-devdebug-only).

---

### `UnitConversion.h` — byte unit constants

```cpp
audioapi::KB_IN_BYTES   // 1024.0
audioapi::MB_IN_BYTES   // 1024 * 1024.0
audioapi::GB_IN_BYTES   // 1024^3.0
```

---

## `common/cpp/audioapi/core/utils/` — Node and context utilities

### `Constants.h` — global audio constants

```cpp
RENDER_QUANTUM_SIZE   = 128      // frames per render block — never hardcode 128
MAX_FFT_SIZE          = 32768
MAX_CHANNEL_COUNT     = 32
OCTAVE_RANGE          = 1200     // cents per octave
PI                    = std::numbers::pi_v<float>
MOST_POSITIVE_SINGLE_FLOAT / MOST_NEGATIVE_SINGLE_FLOAT
PROMISE_VENDOR_THREAD_POOL_WORKER_COUNT = 4
```

---

### `AudioDestructor.hpp` — off-thread destruction

Offloads `shared_ptr` destruction to a dedicated worker thread. Use for any object whose destructor may block or deallocate large buffers — both are forbidden on the audio thread.

For full API see [api.md](api.md#audiodestructorhpp--off-thread-destruction).

---

### `ParamChangeEvent.hpp` — AudioParam automation event

Represents a single Web Audio API automation command (`setValueAtTime`, `linearRampToValueAtTime`, etc.). Move-only. Used exclusively within `AudioParamEventQueue` — do not construct outside of `AudioParam` scheduling methods.

For full API see [api.md](api.md#paramchangeeventhpp--audioparam-automation-event).

---

### `AudioParamEventQueue.h` — sorted automation event queue

Stores and processes `ParamChangeEvent` objects in time order on the audio thread. Read the header for full API.

---

### `AudioGraphManager.h` — thread-safe graph mutation queue

Queues connect/disconnect operations from the JS thread for application before each render pass. Do not call its methods directly — go through `AudioNode::connect()`/`disconnect()`. Read the header for implementation details.

---

### `Locker.h` — nullable mutex RAII wrapper

RAII mutex wrapper that can hold `nullptr` (no-op). Supports `Locker::tryLock(mutex)` for non-blocking acquisition. **Do not use on the audio thread.** Locks are forbidden in `processNode()`.

---

### Other `core/utils/` classes

- **`AudioDecoder.h`** — decodes audio files to `AudioBuffer` (FFmpeg, conditional). Read the header.
- **`AudioFileWriter.h`** — writes PCM to audio files. Read the header.
- **`AudioStretcher.h`** — pitch/time stretching (signalsmith-stretch). Read the header.
- **`AudioRecorderCallback.h`** — callback adapter for the platform recorder. Internal.
- **`worklets/WorkletsRunner.h`** — manages JS worklet execution on the audio thread. Internal.

---

## `common/cpp/audioapi/dsp/` — DSP helpers

### `AudioUtils.hpp` — inline DSP math

Provides `timeToSampleFrame()`, `sampleFrameToTime()`, `linearInterpolate()`, `linearToDecibels()`, `decibelsToLinear()`.

For full API see [api.md](api.md#audioutilshpp--inline-dsp-math).

---

### `VectorMath.h` — SIMD-optimized vector math

SIMD-accelerated array operations (ARM NEON / x86 SSE2). Use for per-channel hot-path processing. Read the header for available functions before writing manual loops.

---

### `FFT.h` / `Convolver.h` / `Resampler.h` / `WaveShaper.h` / `Windows.hpp`

Higher-level DSP blocks. Read each header before use.

---

## `src/utils/` — TypeScript utilities

### `paths.ts`

```ts
import { isRemoteSource, isBase64Source, isDataBlobString } from './utils/paths';

isRemoteSource(url)      // true if starts with http:// or https://
isBase64Source(data)     // true if 'data:audio/...;base64,...'
isDataBlobString(data)   // true if starts with 'blob:'
```

Use before passing a URL/path to decoder or streaming APIs to determine the source type.

---

### `filePresets.ts`

```ts
import FilePreset from './utils/filePresets';

FilePreset.Low        // 22050 Hz, 48kbps,  16-bit
FilePreset.Medium     // 44100 Hz, 128kbps, 16-bit
FilePreset.High       // 48000 Hz, 192kbps, 24-bit
FilePreset.Lossless   // 48000 Hz, 320kbps, 24-bit, FLAC L8
```

Use when configuring `AudioRecorder` file output instead of building `FilePresetType` objects manually.

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/utilities/api.md
================================================
# Utilities API Reference — Full .hpp Documentation

> This file contains the detailed API documentation for template/inline utilities in `common/cpp/audioapi/utils/`, `common/cpp/audioapi/core/utils/`, and `common/cpp/audioapi/dsp/`.
>
> For a concise overview and when-to-use guidance, see [SKILL.md](SKILL.md).

---

## `SpscChannel.hpp` — lock-free SPSC channel

Bounded single-producer, single-consumer queue built on aligned atomics. **Do not use directly — prefer `CrossThreadEventScheduler` or `TaskOffloader`** unless you need fine-grained control.

```cpp
// Create a channel
auto [sender, receiver] = channels::spsc::channel<MyType>(capacity);
// Optional template params: OverflowStrategy, WaitStrategy

// Sender (producer thread)
sender.try_send(value);   // non-blocking, returns ResponseStatus
sender.send(value);       // blocks until space available

// Receiver (consumer thread)
ResponseStatus s = receiver.try_receive(value);  // non-blocking
T val = receiver.receive();                       // blocks until data available
```

**OverflowStrategy:**
- `WAIT_ON_FULL` (default) — `try_send` returns `CHANNEL_FULL` when full
- `OVERWRITE_ON_FULL` — overwrites oldest element (use with `BUSY_LOOP`)

**WaitStrategy** (affects blocking `send`/`receive`):
- `BUSY_LOOP` (default) — spin loop; lowest latency, highest CPU
- `YIELD` — `std::this_thread::yield()`; lower CPU, higher latency
- `ATOMIC_WAIT` — `std::atomic::wait()`; good for long waits (destructor threads)

**ResponseStatus:** `SUCCESS`, `CHANNEL_FULL`, `CHANNEL_EMPTY`, `SKIP_DUE_TO_OVERWRITE`.

Real capacity rounds up to next power of two.

---

## `CrossThreadEventScheduler.hpp` — JS→audio event queue

High-level wrapper over `SpscChannel` for scheduling lambdas from the JS thread to be executed on the audio thread. This is **the standard way** to send updates from JS to audio.

```cpp
// Declaration (e.g. in AudioNode or AudioParam)
CrossThreadEventScheduler<MyNode> eventScheduler_{/*capacity=*/64};

// JS thread — schedule a change
eventScheduler_.scheduleEvent([newValue](MyNode &node) {
    node.setSomething(newValue);
});
// returns false if queue is full (drop the event or handle it)

// Audio thread — drain all pending events before processNode()
eventScheduler_.processAllEvents(*this);
```

Template parameter `T` is the type passed by reference to each event lambda. For `AudioNode` subclasses, `T = BaseAudioContext` (events are called with the context). For `AudioParam`, `T = AudioParam` itself.

Not copyable. Use `std::shared_ptr` if shared ownership is needed across threads.

---

## `AlignedAllocator.hpp` — aligned STL allocator

STL-compatible allocator that guarantees `N`-byte alignment. Default alignment is 16 bytes (SIMD-friendly).

```cpp
// 16-byte aligned float vector (default)
std::vector<float, AlignedAllocator<float>> buf(1024);

// Custom alignment (e.g. 64 bytes for AVX-512)
std::vector<float, AlignedAllocator<float, 64>> buf(1024);
```

Use when creating buffers that will be processed by SIMD code in `VectorMath`.

---

## `MoveOnlyFunction.hpp` — non-copyable function wrapper

Backport of C++23 `std::move_only_function`. Use instead of `std::function` when the callable captures a move-only type (e.g. a `unique_ptr`).

```cpp
audioapi::move_only_function<void(BaseAudioContext&)> event = [ptr = std::move(uniquePtr)](BaseAudioContext &) {
    ptr->doSomething();
};
// move into the scheduler
eventScheduler_.scheduleEvent(std::move(event));
```

Not copyable. Throws `std::bad_function_call` if invoked when empty.

---

## `Result.hpp` — Rust-style Result<T,E>

Represents either success (`Ok`) or error (`Err`). Used at API boundaries (e.g. `AudioRecorder::start()`).

```cpp
// Creating
Result<std::string, std::string> res = Ok(std::string("path/to/file"));
Result<std::string, std::string> err = Err(std::string("permission denied"));

// Checking and extracting
if (result.is_ok()) {
    std::string path = std::move(result).unwrap();
}
if (result.is_err()) {
    std::string msg = std::move(result).unwrap_err();
}

// With default
std::string path = std::move(result).unwrap_or(std::string("default"));

// Transforming
auto mapped     = std::move(result).map([](std::string s) { return s.size(); });
auto mapped_err = std::move(result).map_err([](std::string e) { return -1; });

// Chaining
auto chained = std::move(result).and_then([](std::string s) -> Result<int, std::string> {
    return Ok(42);
});
```

Use `NoneType` / `None` for void variants: `Result<NoneType, std::string>`.

---

## `RingBiDirectionalBuffer.hpp` — compile-time capacity ring deque

Non-thread-safe bounded ring buffer with push/pop from both ends. Capacity is a **compile-time** power-of-two template parameter.

```cpp
RingBiDirectionalBuffer<MyEvent, 128> queue;  // capacity must be power of 2

queue.pushBack(event);   // add to back, returns false if full
queue.pushFront(event);  // add to front, returns false if full

MyEvent e;
queue.popFront(e);       // remove from front into e, returns false if empty
queue.popBack(e);        // remove from back into e, returns false if empty
queue.popFront();        // discard front element
queue.popBack();         // discard back element

const MyEvent &front = queue.peekFront();   // const peek, no removal
MyEvent &back = queue.peekBackMut();        // mutable peek

queue.isEmpty(); queue.isFull();
queue.size(); queue.getCapacity();          // real capacity = getCapacity() - 1
```

Used for `AudioParamEventQueue` (parameter automation event storage on the audio thread).

---

## `TaskOffloader.hpp` — worker thread with SPSC input

Spawns a dedicated worker thread that processes items from a SPSC channel. Use when you need to offload a recurring task (e.g. file writing, decoding) to a dedicated thread.

```cpp
// T must be default_initializable
TaskOffloader<AudioData,
    OverflowStrategy::WAIT_ON_FULL,
    WaitStrategy::ATOMIC_WAIT> offloader{
    /*capacity=*/64,
    [](AudioData data) {    // runs on worker thread
        writeToFile(data);
    }
};

// Push work from any thread
auto *sender = offloader.getSender();
sender->send(audioData);
```

Not copyable or movable. Destructor sends a dummy value to unblock the worker and joins the thread.

---

## `Benchmark.hpp` — timing utilities (dev/debug only)

```cpp
#include <audioapi/utils/Benchmark.hpp>

// One-shot timing — returns nanoseconds
double ns = audioapi::benchmarks::getExecutionTime([]{ doSomething(); });

// Running average with logging (NOT thread-safe, not for production)
audioapi::benchmarks::logAvgExecutionTime("render quantum", []{ renderAudio(); });
```

**Do not leave `logAvgExecutionTime` in production code.**

---

## `AudioDestructor.hpp` — off-thread destruction

Offloads `shared_ptr` destruction to a dedicated worker thread. Use for any object whose destructor may block or deallocate large buffers — both are forbidden on the audio thread.

```cpp
// Typically owned by AudioContext or BaseAudioContext
AudioDestructor<AudioNode> destructor;

// Audio thread — hand off a node for destruction without blocking
bool ok = destructor.tryAddForDeconstruction(std::move(nodePtr));
// if false (queue capacity=1024 is full), the shared_ptr is NOT moved
```

The worker thread blocks on receive and drops the `shared_ptr`, triggering the destructor off the audio thread.

---

## `ParamChangeEvent.hpp` — AudioParam automation event

Represents a single Web Audio API automation command (`setValueAtTime`, `linearRampToValueAtTime`, etc.). Stores timing, start/end values, and a `calculateValue_` lambda. Move-only.

```cpp
ParamChangeEvent event(
    startTime, endTime, startValue, endValue,
    [](double start, double end, float startVal, float endVal, double currentTime) -> float {
        return computedValue;  // interpolation logic
    },
    ParamChangeEventType::LINEAR_RAMP
);

event.getStartTime(); event.getEndTime();
event.getStartValue(); event.getEndValue();
event.getCalculateValue();   // the interpolation lambda
event.getType();

// Mutators used by AudioParamEventQueue when adjusting event boundaries:
event.setEndTime(t); event.setStartValue(v); event.setEndValue(v);
```

Used exclusively within `AudioParamEventQueue`. Do not construct outside of `AudioParam` scheduling methods.

---

## `AudioUtils.hpp` — inline DSP math

```cpp
#include <audioapi/dsp/AudioUtils.hpp>
using namespace audioapi::dsp;

size_t frame = timeToSampleFrame(time, sampleRate);   // double → size_t
double t     = sampleFrameToTime(frame, sampleRate);  // int → double

// Linear interpolation with edge-case handling (extrapolates at end of array)
float v = linearInterpolate(span, firstIndex, secondIndex, factor);

float db     = linearToDecibels(linearValue);    // 20 * log10(v)
float linear = decibelsToLinear(dbValue);        // 10^(db/20)
```



================================================
FILE: .claude/skills/utilities/maintenance.md
================================================
# Maintenance — utilities

> Used by `/pre-push-update` only — not loaded when the `utilities` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `common/cpp/audioapi/utils/*.h` | New utility added — add brief usage note to `SKILL.md` |
| `common/cpp/audioapi/utils/SpscChannel.hpp` | `api.md` — API, OverflowStrategy/WaitStrategy values, ResponseStatus enum |
| `common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp` | `api.md` — template parameter meaning, `scheduleEvent` return value |
| `common/cpp/audioapi/utils/AlignedAllocator.hpp` | `api.md` — default alignment, constructor signature |
| `common/cpp/audioapi/utils/MoveOnlyFunction.hpp` | `api.md` — signature, throw behaviour |
| `common/cpp/audioapi/utils/Result.hpp` | `api.md` — Ok/Err constructors, method signatures |
| `common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp` | `api.md` — push/pop/peek method names, capacity rules |
| `common/cpp/audioapi/utils/TaskOffloader.hpp` | `api.md` — constructor, `getSender`, destructor behaviour |
| `common/cpp/audioapi/utils/Benchmark.hpp` | `api.md` — function names, return type |
| `common/cpp/audioapi/core/utils/AudioDestructor.hpp` | `api.md` — `tryAddForDeconstruction` signature, capacity |
| `common/cpp/audioapi/core/utils/ParamChangeEvent.hpp` | `api.md` — constructor args, getters/setters |
| `common/cpp/audioapi/dsp/AudioUtils.hpp` | `api.md` — new DSP helpers added or signatures changed |
| `common/cpp/audioapi/core/utils/Constants.h` | Constants section in `SKILL.md` |
| `src/utils/**` | TypeScript utils section in `SKILL.md` |


================================================
FILE: .claude/skills/web-audio-api/SKILL.md
================================================
---
name: web-audio-api
description: >
  Web Audio API spec reference and browser passthrough layer (src/web-core/). Use when implementing
  a node that must match the Web Audio API spec, checking parameter default values and ranges,
  adding or modifying src/web-core/ wrapper classes, deciding whether a feature belongs to the spec
  or is an RN-specific extension, or updating the coverage table.
  Trigger phrases: "web-core", "spec compliance", "coverage table", "api.web.ts", "Web Audio spec",
  "parameter default", "browser passthrough", "not in spec", "spec deviation",
  "webaudio.github.io".
---

# Skill: Web Audio API

## Spec Reference

Everything that has a counterpart in the Web Audio API specification must match it:

- **Spec**: https://webaudio.github.io/web-audio-api/
- **MDN reference**: https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API

Key spec sections to check when implementing or reviewing a node:
- Processing model and render quantum (128 frames)
- `AudioNode` channel count rules and `channelCountMode` / `channelInterpretation`
- `AudioParam` automation methods, value clamping, and timing
- Each node's constructor options, property defaults, and valid ranges

---

## Platform Routing

The library ships **one TypeScript API** that runs on two platforms. The entry point swap happens via package.json field resolution:

```
index.ts          # re-exports from api.ts (or api.web.ts on web)
├── api.ts        # React Native — re-exports from src/core/*
└── api.web.ts    # Browser — re-exports from src/web-core/*
```

On **React Native**: classes in `src/core/` hold a reference to a C++ JSI HostObject. All method calls go to native.

On **Web (browser)**: classes in `src/web-core/` wrap the corresponding `globalThis.*` (browser Web Audio API) object. All method calls delegate directly to the browser engine.

Both sides share:
- The same TypeScript interfaces (`src/interfaces.ts`)
- The same types (`src/types.ts`)
- The same error classes (`src/errors/`)
- The same hooks (`src/hooks/`)

---

## `src/web-core/` — Browser Passthrough Layer

Each file in `src/web-core/` is a thin wrapper around the corresponding browser API object. The pattern is:

**Constructor**: instantiate the browser node via `globalThis.XxxNode` (or `new window.AudioContext`), store it as `this.node` (or `this.context`), read readonly properties from it.

**Getters/setters/methods**: delegate directly to `this.node`.

**AudioParam**: wrapped in the local `AudioParam` class (which stores `this.param: globalThis.AudioParam` and delegates all automation calls).

```ts
// Example: GainNode.tsx (minimal)
export default class GainNode extends AudioNode {
  readonly gain: AudioParam;

  constructor(context: BaseAudioContext, gainOptions?: GainOptions) {
    const gain = new globalThis.GainNode(context.context, gainOptions);
    super(context, gain);
    this.gain = new AudioParam(gain.gain, context);
  }
}

// Example: OscillatorNode.tsx (with extra validation)
public set type(value: OscillatorType) {
  if (value === 'custom') {
    throw new InvalidStateError("'type' cannot be set to 'custom' directly...");
  }
  (this.node as globalThis.OscillatorNode).type = value;
}
```

**`AudioContext`** (web) wraps `window.AudioContext`. It also adds validation matching the RN side (e.g. sampleRate range check) so error behaviour is consistent across platforms.

**`decodeAudioData`** on web additionally supports a `string` URL source (fetches the file, then decodes). This is a deliberate extension beyond the browser spec signature (which only takes `ArrayBuffer`), mirroring the RN native implementation.

### Rules for web-core code

- Every public method/property must have a direct counterpart in the spec (or be in `custom/`)
- Extra validation (range checks, length checks) is fine — it makes error messages consistent with the RN side
- No business logic — the browser engine is the source of truth for audio processing
- If a node does not exist in the browser, it goes in `src/web-core/custom/`

---

## `src/web-core/custom/` — RN Extensions on Web

Nodes or features that don't exist in the Web Audio API spec but are in this library as mobile extensions. The `custom/index.ts` re-exports them and `api.web.ts` re-exports the custom barrel.

Currently: signalsmith-stretch WASM wrapper (`LoadCustomWasm.ts`, `signalsmithStretch/`) for time-stretch on web.

When adding a new RN-specific feature that should also work on web, implement the web version here.

---

## Implementation Coverage

Current status (from `packages/audiodocs/docs/other/web-audio-api-coverage.mdx`):

### Fully implemented ✅
`AnalyserNode`, `AudioBuffer`, `AudioBufferSourceNode`, `AudioDestinationNode`, `AudioNode`, `AudioParam`, `AudioScheduledSourceNode`, `BiquadFilterNode`, `ConstantSourceNode`, `ConvolverNode`, `DelayNode`, `GainNode`, `IIRFilterNode`, `OfflineAudioContext`, `OscillatorNode`, `PeriodicWave`, `StereoPannerNode`, `WaveShaperNode`

### Partially implemented 🚧
| Interface | What's available |
|---|---|
| `AudioContext` | `close`, `suspend`, `resume`, `currentTime`, `destination`, `sampleRate`, `state` |
| `BaseAudioContext` | `currentTime`, `destination`, `sampleRate`, `state`, `decodeAudioData`, all `create*` for available nodes |

### Not yet implemented ❌
`AudioListener`, `AudioSinkInfo`, `AudioWorklet`, `AudioWorkletGlobalScope`, `AudioWorkletNode`, `AudioWorkletProcessor`, `ChannelMergerNode`, `ChannelSplitterNode`, `DynamicsCompressorNode`, `MediaElementAudioSourceNode`, `MediaStreamAudioDestinationNode`, `MediaStreamAudioSourceNode`, `PannerNode`

**Goal**: everything in the Web Audio API spec should eventually be in this library. If you implement a node from the ❌ list, update the coverage table in `packages/audiodocs/docs/other/web-audio-api-coverage.mdx`.

---

## RN-Specific Extensions (beyond spec)

These are exported from `api.ts` but **not** from `api.web.ts` (or have a stub/custom web implementation):

| Class | Purpose |
|---|---|
| `AudioBufferQueueSourceNode` | Queue of audio buffers, plays them sequentially — no Web Audio spec equivalent |
| `StreamerNode` | FFmpeg-backed streaming decoder — no Web Audio spec equivalent |
| `AudioRecorder` | Microphone input recording — no Web Audio spec equivalent |
| `RecorderAdapterNode` | Connects recorder to the audio graph |
| `WorkletNode` / `WorkletSourceNode` / `WorkletProcessingNode` | JS-on-audio-thread via React Native Worklets — different from browser `AudioWorkletNode` |
| `AudioManager` | iOS/Android audio session management (permissions, routing, interruption handling) |
| `changePlaybackSpeed` (`AudioStretcher`) | Time-stretch without pitch change |
| `decodeAudioData` (standalone) | Standalone decode utility (not on context) |
| `decodePCMInBase64` | Decode raw PCM from base64 |

When implementing these on the RN side, a web stub or polyfill in `src/web-core/custom/` should be considered if the feature can be reasonably approximated in a browser.

---

## Adding a New Spec Node — Web Layer Checklist

When adding a new Web Audio API node that is in the spec:

1. **Implement `src/web-core/MyNode.tsx`**
   - Extend the right base class (`AudioNode`, `AudioScheduledSourceNode`)
   - Constructor: `new globalThis.MyNode(context.context, options)`
   - Wrap all `AudioParam` properties in `new AudioParam(node.myParam, context)`
   - Delegate all getters/setters/methods to `this.node`
   - Add any validation that matches the RN side's error behaviour

2. **Export from `src/api.web.ts`**
   ```ts
   export { default as MyNode } from './web-core/MyNode';
   ```

3. **Ensure the interface in `src/interfaces.ts`** (or a dedicated interface file) is shared between both paths.

4. **Update the coverage table** in `packages/audiodocs/docs/other/web-audio-api-coverage.mdx` — move the node from ❌ to ✅.

If the node **does not exist in the browser** (e.g. `AudioBufferQueueSourceNode`):
- Add a stub or alternative implementation in `src/web-core/custom/`
- Export it from `src/web-core/custom/index.ts`
- It will be picked up automatically by the `export * from './web-core/custom'` line in `api.web.ts`

---

## Spec Compliance Notes

When in doubt, cross-check the spec. Key invariants that are easy to get wrong:

- **`feedback[0]` must not be 0** for `IIRFilterNode` — the spec requires it; we validate in TypeScript and in C++.
- **`feedforward` all-zeros** must throw `InvalidStateError` — the spec requires at least one non-zero coefficient.
- **`OscillatorNode.type = 'custom'`** must throw `InvalidStateError` — use `setPeriodicWave()` instead.
- **`AudioParam` min/max** — must match the spec's exact values; do not invent ranges.
- **`createBuffer` / `createDelay` / `createPeriodicWave`** — the spec defines when these throw and what error type. Match it.
- **`decodeAudioData`** — on RN side, we extend it to accept a URL string in addition to `ArrayBuffer`. This is intentional and documented.
- **`sampleRate` range** — spec says [8000, 96000]; enforced in `AudioContext` constructor on both platforms.

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/web-audio-api/maintenance.md
================================================
# Maintenance — web-audio-api

> Used by `/pre-push-update` only — not loaded when the `web-audio-api` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `src/web-core/**` | New or modified web wrapper — update pattern docs or coverage table |
| `src/api.web.ts` | New export — add to coverage table or RN-extensions table |
| `src/api.ts` | New RN-only export — add to RN-specific extensions table |
| `packages/audiodocs/docs/other/web-audio-api-coverage.mdx` | Coverage table sync |
| `src/web-core/custom/**` | New web-side RN extension |


================================================
FILE: .claude/skills/writing-skills/SKILL.md
================================================
---
name: writing-skills
description: >
  How to write, structure, and maintain Claude skill files. Covers the three-level progressive
  disclosure model, all YAML frontmatter fields (context:fork, allowed-tools,
  disable-model-invocation, user-invocable, hooks, argument-hint), invocation control patterns,
  string substitutions ($ARGUMENTS, ${CLAUDE_SKILL_DIR}), shell preprocessing with backtick
  syntax, and the Maintenance section contract. Use when creating a new skill file, rewriting an
  existing one, or reviewing a skill for quality.
  Trigger phrases: "add a skill", "write a skill", "create a skill file", "update skill",
  "skill quality", "skill review", "context fork", "allowed-tools", "user-invocable".
user-invocable: false
---

# Skill: Writing Skills

A skill file is a scoped knowledge document that Claude loads on demand. Good skills are concise, trigger reliably, and stay accurate over time.

---

## Three-Level Model

```
Level 1 — YAML frontmatter       always loaded, ~100 tokens
Level 2 — skill body (SKILL.md)  loaded on trigger, < 500 lines / ~5 k tokens
Level 3 — supporting .md files   loaded explicitly when more detail is needed
```

Claude sees the `description` field in every conversation. It reads the skill body only when the topic is relevant. It reads a supporting file only when the skill body links to it and more detail is needed.

**Design each level independently.** The frontmatter alone must be enough to trigger the skill. The skill body must be useful without any supporting file. Supporting files are supplementary.

---

## File Structure

Each skill lives in its own directory:

```
.claude/skills/<skill-name>/
├── SKILL.md              # Required — main skill body with YAML frontmatter
└── <supporting-file>.md  # Optional — verbose reference material linked from SKILL.md
```

Supporting files (e.g. `gainnode-example.md`, `api.md`, `build-details.md`) live alongside `SKILL.md` in the same directory. They are plain `.md` files (not `SKILL.md`). Alternatively group them under an optional `references/` subdirectory when you have several related documents, or `scripts/` for executable code Claude can run.

Link from the parent skill:

```markdown
See [gainnode-example.md](gainnode-example.md) for a complete header + .cpp.
```

---

## YAML Frontmatter

Required: `name` and `description`. Everything else is optional.

```yaml
---
name: kebab-case-name           # matches the directory name; no claude/anthropic prefix
description: >
  What the skill covers. When to use it.
  Trigger phrases: "phrase one", "phrase two".

# — optional fields —
context: fork                   # run as isolated subagent (see below)
agent: Explore                  # subagent type: Explore / Plan / general-purpose / custom
allowed-tools: "Read Grep Glob" # tools available without per-use approval
model: claude-sonnet-4-6        # model override for this skill
disable-model-invocation: true  # user can /invoke; Claude won't auto-load
user-invocable: false           # Claude auto-loads; hidden from the /menu
argument-hint: "[node-name]"    # shown in slash-command autocomplete
hooks:                          # hooks scoped to this skill's lifecycle
metadata:
  author: team
  version: 1.0.0
---
```

### Rules

- `name`: kebab-case, matches directory name. Forbidden prefixes: `claude`, `anthropic`.
- `description`: max 1024 characters. Include **what**, **when**, and **trigger phrases** (quoted, comma-separated at the end).
- Trigger phrases must match how developers actually speak: `"add a node"`, `"processNode"`, `"shadow state"` — not `"audio processing implementation"`.
- No XML angle brackets (`<` or `>`) anywhere in frontmatter — security restriction.

### Anti-patterns

```yaml
# BAD — vague, no trigger phrases
description: This skill covers audio node implementation details.

# BAD — too long (gets cut at 1024 chars)
description: >
  This skill covers every aspect of ... [500 words] ...

# BAD — missing the literal "Trigger phrases:" label (skill will never auto-load)
description: >
  How to create a C++ audio node. Covers processNode() contract, AudioParam a-rate/k-rate,
  cross-thread scheduling. Use when implementing a new node or debugging audio rendering.
  "add a node", "processNode", "audio thread", "AudioParam automation".

# GOOD
description: >
  How to create a C++ audio node. Covers processNode() contract, AudioParam a-rate/k-rate,
  cross-thread scheduling. Use when implementing a new node or debugging audio rendering.
  Trigger phrases: "add a node", "processNode", "audio thread", "AudioParam automation".
```

**The `Trigger phrases:` label is mandatory** — without the exact label, Claude Code does not recognise the list as trigger phrases and the skill will not auto-load.

---

## Invocation Control

By default a skill is both user-invokable (`/skill-name`) and auto-loaded by Claude. Override with:

| Frontmatter | User `/invoke` | Claude auto-load | Use when |
|---|---|---|---|
| (default) | Yes | Yes | General knowledge skills |
| `disable-model-invocation: true` | Yes | No | Task-only / deployment skills |
| `user-invocable: false` | No | Yes | Internal / meta knowledge |

---

## context: fork

Runs the skill in an isolated subagent. The skill body becomes the task prompt — the subagent has no access to conversation history.

```yaml
---
name: deep-research
description: Research a topic thoroughly
context: fork
agent: Explore   # Explore / Plan / general-purpose / custom .claude/agents/ name
---

Research $ARGUMENTS thoroughly:
1. Find relevant files using Glob and Grep
2. Read and analyze the code
3. Summarize findings with specific file references
```

**Only useful for task-oriented skills** with concrete step-by-step instructions. Do NOT set on reference/knowledge skills — the subagent receives guidelines but has no actionable task.

---

## String Substitutions

Available in skill body content:

```
$ARGUMENTS             all arguments passed when user invokes /skill-name arg
$ARGUMENTS[0]          first argument by index (0-based); $0 is shorthand
${CLAUDE_SESSION_ID}   current session ID
${CLAUDE_SKILL_DIR}    absolute path to the skill directory — use to reference bundled scripts
```

## Shell Preprocessing

`` !`command` `` runs a shell command **before** the skill content is sent to Claude. Output replaces the placeholder at load time — Claude sees only the result, not the syntax.

```markdown
## Context
Branch: !`git branch --show-current`
Last commits: !`git log --oneline -5`
```

Useful for skills that need live repository state injected automatically.

---

## Skill Body

### Structure

```markdown
---
name: my-skill
description: > ...
---

# Skill: My Skill

One-sentence summary of what this covers (not a repeat of frontmatter — add context).

---

## Most Important Section First

Critical invariants, hard constraints, common mistakes go at the top.
Readers may stop reading early — put the highest-value content first.

## Secondary Sections

...

---

## Maintenance

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `path/to/file.*` | What to review in this skill |
```

### Rules

- **Under 500 lines** — non-negotiable. If the file exceeds 500 lines, move verbose content to a supporting file in the same directory.
- **Imperative form**: "Use `AudioParam`", "Declare in protected:", "Call `scheduleAudioEvent`". Not: "You should use", "It is recommended to call".
- **Code over prose**: a 5-line snippet teaches faster than two paragraphs. Prefer concrete examples.
- **Critical first**: MUST NOT lists, common pitfalls, and hard constraints go in the FIRST section, not buried at the bottom. Readers stop reading early.
- **No scope blockquotes**: do not add `> **Scope**: ...` / `> **What this skill covers**: ...` / `> **When Claude should consult this skill**: ...` — this duplicates the frontmatter and wastes lines.
- **Escape hatches**: add "If unsure → [do X]" guidance wherever a wrong choice causes hard-to-debug bugs (e.g. "If unsure which ITC primitive → check the decision table in `thread-safety-itc`").
- **Golden references**: link to one or two existing files that exemplify the patterns in the skill. These let Claude anchor new code to proven implementations.

### What belongs in the skill body vs supporting files

| Belongs in skill body | Move to supporting file |
|---|---|
| API overview (1-line per method) | Complete header + .cpp of a class |
| Key usage patterns (5–15 line snippets) | Full working example (50+ lines) |
| Decision tables, checklists | Exhaustive per-flag build analysis |
| Common pitfalls (concise) | Line-by-line CMakeLists commentary |
| Links to spec or docs | Full `.hpp` API with every overload |

---

## The Maintenance File

Each skill directory has a `maintenance.md` file mapping source paths to what needs checking. It is **not loaded during normal skill usage** — only `/pre-push-update` reads it.

```markdown
# Maintenance — skill-name

> Used by /pre-push-update only — not loaded during skill usage.

| Path | What to check |
|---|---|
| `path/to/file.*` | Specific section or element to review |
```

`SKILL.md` ends with a single footer line linking to it:

```markdown
*Maintenance: see [maintenance.md](maintenance.md).*
```

Supporting files do **not** have their own maintenance sections — their rows go into the same `maintenance.md`.

### Why separate

`## Maintenance` embedded in `SKILL.md` wastes tokens on every skill load. A dedicated `maintenance.md` is only read by `/pre-push-update`.

### Rules

- Use glob-style patterns (`*`, `**`) for directories.
- The "What to check" column must name the specific section or element to review — not just "update if needed".
- Add a row whenever you add a new documented pattern to the skill.
- Supporting file paths belong in the skill's `maintenance.md` — not in the supporting file itself.

---

## Supporting Files

For content that is too large for the skill body but still useful to load on demand.

### When to create a supporting file

- A complete class header + implementation (50+ lines of code)
- Full API documentation for a large `.hpp` template file
- Deep line-by-line analysis of a build file
- A complete worked example spanning multiple files

### Location

Place supporting files in the same directory as `SKILL.md`:

```
.claude/skills/audio-nodes/
├── SKILL.md
└── gainnode-example.md    # supporting file
```

Link from the parent skill:

```markdown
See [gainnode-example.md](gainnode-example.md) for a complete header + .cpp.
```

Supporting files do **not** need YAML frontmatter or a `name` field — they are plain markdown.

---

## Checklist: New Skill File

1. Create directory `.claude/skills/<skill-name>/`
2. Create `SKILL.md` with YAML frontmatter (`name`, `description` with what + when + trigger phrases, ≤1024 chars)
3. `# Skill: Name` heading — no scope blockquotes below it
4. Most important content first
5. Under 500 lines — move verbose content to a supporting `.md` file in the same directory
6. Imperative form, code snippets preferred over prose
7. Create `maintenance.md` with path → what-to-check table; add `*Maintenance: see [maintenance.md](maintenance.md).*` at the bottom of `SKILL.md`
8. If supporting files created: their maintenance rows go into `maintenance.md` (not in the supporting files)
9. Add the skill directory to the table in `CLAUDE.md` and the tree in `.claude/README.md`

---

*Maintenance: see [maintenance.md](maintenance.md).*


================================================
FILE: .claude/skills/writing-skills/maintenance.md
================================================
# Maintenance — writing-skills

> Used by `/pre-push-update` only — not loaded when the `writing-skills` skill is active.

Review this skill when `pre-push-update` reports changes in:

| Path | What to check |
|---|---|
| `.claude/skills/*/SKILL.md` | New patterns observed — update best-practices or anti-patterns sections |
| `.claude/skills/**/*.md` | Supporting file or maintenance.md conventions changed — update the relevant section |
| `.claude/commands/pre-push-update.md` | Maintenance contract changed — update the `maintenance.md` rules |
| `CLAUDE.md` | Skill table updated — update the checklist step that references `CLAUDE.md` |


================================================
FILE: .editorconfig
================================================
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org

root = true

[*]

indent_style = space
indent_size = 2

end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true


================================================
FILE: .eslintrc.js
================================================
/** @type {import('eslint').ESLint.ConfigData} */
module.exports = {
  root: true,
  overrides: [
    {
      files: ['*.ts', '*.tsx'],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        project: true,
        tsconfigRootDir: __dirname,
      },
      plugins: ['tsdoc'],
      extends: [
        'plugin:@typescript-eslint/recommended-type-checked',
        'plugin:prettier/recommended',
      ],
      rules: {
        '@typescript-eslint/no-unsafe-call': 'off',
        '@typescript-eslint/no-unsafe-member-access': 'off',
        '@typescript-eslint/no-floating-promises': 'off',
        '@typescript-eslint/no-misused-promises': 'off',
        '@typescript-eslint/no-unsafe-return': 'off',
        '@typescript-eslint/no-unsafe-assignment': 'off',
        '@typescript-eslint/no-unsafe-argument': 'off',
        '@typescript-eslint/no-require-imports': 'off',
        '@typescript-eslint/no-empty-object-type': 'off',
        '@typescript-eslint/no-inline-styles': 'off',
        '@typescript-eslint/no-explicit-any': 'warn',
        '@typescript-eslint/ban-ts-comment': [
          'error',
          {
            'ts-ignore': 'allow-with-description',
            'ts-expect-error': 'allow-with-description',
          },
        ],
        '@typescript-eslint/no-unused-vars': [
          'error',
          { argsIgnorePattern: '^_' },
        ],
        '@typescript-eslint/no-var-requires': 'off',
        '@typescript-eslint/no-non-null-assertion': 'off',
        '@typescript-eslint/no-duplicate-type-constituents': 'error',
        '@typescript-eslint/no-shadow': 'error',
        'tsdoc/syntax': 'error',
        'prettier/prettier': [
          'error',
          {
            plugins: ['prettier-plugin-jsdoc'],
            bracketSameLine: true,
            printWidth: 80,
            singleQuote: true,
            trailingComma: 'es5',
            tabWidth: 2,
            arrowParens: 'always',
          },
        ],
      },
    },
    {
      files: ['*.js', '*.jsx'],
      plugins: ['jsdoc'],
      extends: ['plugin:jsdoc/recommended'],
      rules: {
        'jsdoc/tag-lines': 'off',
      },
    },
  ],
  parserOptions: {
    requireConfigFile: false,
  },
  extends: [
    'standard',
    'prettier',
    'plugin:import/typescript',
    'plugin:react-hooks/recommended',
  ],
  plugins: ['react', 'react-native', 'import', 'jest', '@typescript-eslint'],
  env: {
    'react-native/react-native': true,
    'jest/globals': true,
  },
  settings: {
    'import/resolver': {
      'babel-module': {
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
      },
    },
  },
  rules: {
    'object-shorthand': 'error',
    'curly': ['error', 'all'],
    'no-case-declarations': 'error',
    'import/no-unresolved': 'error',
    'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
    'react/jsx-uses-vars': 'error',
    'react/jsx-uses-react': 'error',
    'no-use-before-define': 'off',
    'eqeqeq': 'error',
    'no-unreachable': 'error',
    'jest/no-disabled-tests': 'warn',
    'jest/no-focused-tests': 'error',
    'jest/no-identical-title': 'error',
    'jest/prefer-to-have-length': 'warn',
    'jest/valid-expect': 'error',
    'react/react-in-jsx-scope': 'off',
    'import/no-duplicates': 'warn', // Avoid issues in native component specs since 0.81
  },
};


================================================
FILE: .gitattributes
================================================
*.pbxproj -text
# specific for windows script files
*.bat text eol=crlf
docs/assets/example-01.mp4 filter=lfs diff=lfs merge=lfs -text

packages/react-native-audio-api/common/cpp/audioapi/libs/** linguist-vendored
apps/** linguist-vendored
docs/** linguist-vendored
.github/** linguist-vendored
.yarn/** linguist-vendored
packages/audiodocs/** linguist-documentation
packages/react-native-audio-api/src/web-core/custom/signalsmithStretch/* linguist-vendored


================================================
FILE: .github/CODEOWNERS
================================================
/.github/CODEOWNERS @maciejmakowski2003 @mdydek
/.github/workflows  @maciejmakowski2003 @mdydek


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: software-mansion
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: Bug report
description: Report an issue with React Native Audio API here.
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!

        > [!TIP]
        > **We strongly encourage providing a Minimal Reproducible Example (MRE) with your report.**
        > Issues without a reproduction are much harder to investigate and are likely to stall or be closed.
        >
        > A good MRE is:
        > - **Minimal** — stripped down to the smallest amount of code that still reproduces the issue (no unrelated dependencies, screens, or logic)
        > - **Reproducible** — someone else must be able to clone/open it and see the bug without any extra steps
        > - **Self-contained** — a public GitHub repository or an Expo Snack that runs out of the box
        >
        > If you ARE an AI assistant filing this issue, you MUST create and **verify** the MRE before submitting.

        Before you proceed:

        - Make sure to check whether there are similar issues in the repository
        - Make sure to clean cache in your project. Depending on your setup this could be done by:
          - `yarn start --reset-cache` or
          - `npm start -- --reset-cache` or
          - `expo start --clear`

  - type: markdown
    attributes:
      value: |
        ## Required information
  - type: textarea
    id: description
    attributes:
      label: Description
      description: Please provide a clear, concise and descriptive explanation of what the bug is. Include screenshots or a video if needed. Tell us what were you expecting to happen instead of what is happening now.
    validations:
      required: true

  - type: textarea
    id: steps-to-reproduce
    attributes:
      label: Steps to reproduce
      description: Provide a detailed list of steps that reproduce the issue.
      placeholder: |
        1.
        2.
        3.
    validations:
      required: true

  - type: input
    id: repro
    attributes:
      label: Snack or a link to a repository
      description: |
        Please provide a Snack (https://snack.expo.io/) or a link to a repository on GitHub under your username that reproduces the issue.
        Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve.
        Issues without a reproduction are likely to stale.
      placeholder: Link to a Snack or a GitHub repository
    validations:
      required: true

  - type: input
    id: react-native-audio-api-version
    attributes:
      label: React Native Audio API version
      description: What version of react-native-audio-api are you using?
      placeholder: 0.1.0
    validations:
      required: true

  - type: input
    id: react-native-version
    attributes:
      label: React Native version
      description: What version of react-native are you using?
      placeholder: 0.75.3
    validations:
      required: true

  - type: dropdown
    id: platforms
    attributes:
      label: Platforms
      description: On what platform your application is running on?
      multiple: true
      options:
        - Android
        - iOS
    validations:
      required: true

  - type: markdown
    attributes:
      value: |
        ## Additonal information

        Providing as much information as possible greatly helps us with reproducting the issues.

  - type: dropdown
    id: runtime
    attributes:
      label: JavaScript runtime
      description: What runtime is your application using?
      options:
        - JSC
        - Hermes
        - V8

  - type: dropdown
    id: workflow
    attributes:
      label: Workflow
      description: How is your application managed?
      options:
        - React Native
        - Expo Go
        - Expo Dev Client

  - type: dropdown
    id: architecture
    attributes:
      label: Architecture
      description: What React Native architecture your application is running on? Currently, the default architecture on React Native is Paper so if you haven't changed it in your application select this option.
      options:
        - Paper (Old Architecture)
        - Fabric (New Architecture)

  - type: dropdown
    id: build-type
    attributes:
      label: Build type
      description: What is the build configuration/variant of your native app and JavaScript bundle mode?
      options:
        - Debug app & dev bundle
        - Release app & production bundle
        - Debug app & production bundle
        - Release app & dev bundle
        - Other (please specify)

  - type: dropdown
    id: emulator
    attributes:
      label: Device
      description: How are you running your application?
      options:
        - iOS simulator
        - Android emulator
        - Real device

  - type: input
    id: device-model
    attributes:
      label: Device model
      description: What device you are experiencing this problem on? Specify full device name along with the version of the operating system it's running.
      placeholder: ex. Samsung Galaxy A22 (Android 12)

  - type: dropdown
    id: acknowledgements
    attributes:
      label: Acknowledgements
      description: I searched for similar issues in the repository.
      options:
        - 'Yes'
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
name: Feature request
description: Suggest a feature
body:
  - type: textarea
    id: Suggestion
    attributes:
      label: Feature Request
      description: Describe the feature(s) you would like to be added.
    validations:
      required: true


================================================
FILE: .github/actions/setup/action.yml
================================================
name: Setup
description: Setup Node.js and install dependencies

runs:
  using: composite
  steps:
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version-file: .nvmrc

    - name: Setup Python
      uses: actions/setup-python@v1

    - name: Setup Cmake
      uses: jwlawson/actions-setup-cmake@v2
      with:
        cmake-version: '4.0.x'

    - name: Install cpplint
      shell: bash
      run: pip install 'cpplint==2.0.2'

    - name: Install ktlint
      shell: bash
      run: |
        curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.7.0/ktlint
        chmod a+x ktlint
        sudo mv ktlint /usr/local/bin/

    # .clang-format uses options added in clang-format 22 (BreakAfterOpenBracket*).
    # ubuntu-latest still defaults to an older binary; install 22
    - name: Install clang-format 22
      shell: bash
      run: |
        set -euo pipefail
        curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- 22
        sudo apt-get install -y clang-format-22
        sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-22 200
        clang-format --version

    - name: Cache dependencies
      id: yarn-cache
      uses: actions/cache@v4
      with:
        path: |
          **/node_modules
          .yarn/install-state.gz
        key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}-${{ hashFiles('**/package.json', '!node_modules/**') }}
        restore-keys: |
          ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
          ${{ runner.os }}-yarn-

    - name: Install dependencies
      if: steps.yarn-cache.outputs.cache-hit != 'true'
      run: yarn install --immutable
      shell: bash


================================================
FILE: .github/pull_request_template.md
================================================
<!-- Reference any GitHub issues resolved by this PR -->

Closes #

## ⚠️ Breaking changes ⚠️

<!-- A brief description of the breaking changes -->

-

## Introduced changes

<!-- A brief description of the changes -->

-

## Checklist

<!-- Make sure all of these are complete -->

- [ ] Linked relevant issue
- [ ] Updated relevant documentation
- [ ] Added/Conducted relevant tests
- [ ] Performed self-review of the code
- [ ] Updated Web Audio API coverage
- [ ] Added support for web
- [ ] Updated old arch android spec file


================================================
FILE: .github/release.yml
================================================
changelog:
  categories:
    - title: ⚠️ Breaking Changes
      labels:
        - breaking-change
    - title: 🚀 Features
      labels:
        - feature
    - title: 📖 Docs
      labels:
        - documentation
    - title: 🐛 Bug Fixes
      labels:
        - bug
        - fix
    - title: 👨🏻‍🔬 Unstable
      labels:
        - unstable
    - title: 🧪 Tests
      labels:
        - tests
    - title: Other Changes
      labels:
        - "*"


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
  pull_request:
    branches:
      - main
  merge_group:
    types:
      - checks_requested

jobs:
  lint:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup
        uses: ./.github/actions/setup

      - name: Lint files
        run: yarn lint

      - name: Typecheck files
        run: yarn typecheck

  check-audio-enum-sync:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup
        uses: ./.github/actions/setup

      - name: Check AudioEvent enum sync
        run: yarn check-audio-enum-sync

  build-library:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup
        uses: ./.github/actions/setup

      - name: Build package
        run: yarn build


================================================
FILE: .github/workflows/graph-tests.yml
================================================
name: Graph Tests
on:
  pull_request:
    paths:
      - 'packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/**'
      - 'packages/react-native-audio-api/common/cpp/test/src/graph/**'

jobs:
  graph-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup
      - run: yarn test:graph


================================================
FILE: .github/workflows/npm-audio-package-build.yml
================================================
name: NPM Build and publish to npm

on:
  schedule:
    - cron: '01 00 * * *' # Every day at 00:01 UTC
  workflow_dispatch:
    inputs:
      latest-build:
        description: 'Whether to publish as a latest build'
        required: true
        type: boolean
      old-version-patch:
        description: 'Whether to publish as a patch to an old version'
        required: true
        type: boolean

permissions:
  id-token: write
  contents: read

concurrency:
  group: 'npm-audio-package-build'
  cancel-in-progress: false

jobs:
  build:
    if: github.repository == 'software-mansion/react-native-audio-api'
    runs-on: ubuntu-latest
    environment: deployment
    permissions:
      contents: read
      id-token: write
    env:
      AUDIO_API_DIR: packages/react-native-audio-api
      AUDIO_API_VERSION: PLACEHOLDER # all placeholders to be replaced during the run
      TRUNKATED_VERSION: PLACEHOLDER
      PACKAGE_NAME: PLACEHOLDER
      TAG: PLACEHOLDER
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: 'yarn'
          registry-url: https://registry.npmjs.org/

      - name: Update NPM
        run: npm install -g npm@latest

      - name: Determine version
        working-directory: ${{ env.AUDIO_API_DIR }}
        run: |
          VERSION=$(jq -r .version package.json)
          echo "AUDIO_API_VERSION=$VERSION" >> $GITHUB_ENV
          TRUNKATED_VERSION=$(echo $VERSION | cut -d. -f1,2)
          echo "TRUNKATED_VERSION=$TRUNKATED_VERSION" >> $GITHUB_ENV

      - name: Assert AUDIO_API_VERSION
        if: ${{ env.AUDIO_API_VERSION == 'PLACEHOLDER' }}
        run: exit 1 # this should never happen

      - name: Assert TRUNKATED_VERSION
        if: ${{ env.TRUNKATED_VERSION == 'PLACEHOLDER' }}
        run: exit 1 # this should never happen

      - name: Install monorepo dependencies
        run: yarn install --immutable

      - name: Set tag
        run: |
          if [[ "${{ inputs.old-version-patch }}" == "true" ]]; then
            CURRENT_VERSION=$(npm view react-native-audio-api version | cut -d. -f1,2)
            if [[ "$CURRENT_VERSION" == "${{ env.TRUNKATED_VERSION }}" ]]; then
              echo "Old version patch requested but current published version matches package version. Exiting."
              exit 1
            fi
            echo "TAG=rn-audio-api-${{ env.TRUNKATED_VERSION }}" >> $GITHUB_ENV
          elif [[ "${{ inputs.latest-build }}" != "true" ]]; then
            echo "TAG=audio-api-nightly" >> $GITHUB_ENV
          else
            echo "TAG=latest" >> $GITHUB_ENV
          fi

      - name: Assert tag
        if: ${{ env.TAG == 'PLACEHOLDER' }}
        run: exit 1 # this should never happen

      - name: Build package
        id: build
        working-directory: ${{ env.AUDIO_API_DIR }}
        run: |
          if [[ "${{ inputs.latest-build }}" != "true" && "${{ inputs.old-version-patch }}" != "true" ]]; then
            ./scripts/create-package.sh generate_nightly_version
          else
            ./scripts/create-package.sh
          fi

      - name: Check if any node_modules were packed
        id: check_node_modules
        working-directory: ${{ env.AUDIO_API_DIR }}
        run: >-
          ! grep --silent -E "node_modules/.+" build.log

      - name: Show build log
        working-directory: ${{ env.AUDIO_API_DIR }}
        if: failure() && steps.build.outcome == 'failure'
        run: cat build.log

      - name: Show packed node_modules
        working-directory: ${{ env.AUDIO_API_DIR }}
        if: failure() && steps.node_modules.outcome == 'failure'
        run: >-
          ! grep -E "node_modules/.+" build.log

      - name: Add package name to env
        working-directory: ${{ env.AUDIO_API_DIR }}
        run: echo "PACKAGE_NAME=$(ls -l | egrep -o "react-native-audio-api-(.*)(=?\.tgz)")" >> $GITHUB_ENV

      - name: Assert package name
        if: ${{ env.PACKAGE_NAME == 'PLACEHOLDER' }}
        run: exit 1 # this should never happen

      - name: Upload package to GitHub
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PACKAGE_NAME }}
          path: ${{ env.AUDIO_API_DIR }}/${{ env.PACKAGE_NAME }}

      - name: Move package to monorepo root
        run: mv ${{ env.AUDIO_API_DIR }}/${{ env.PACKAGE_NAME }} .

      - name: Publish package to npm
        run: npm publish $PACKAGE_NAME --tag ${{ env.TAG }} --provenance


================================================
FILE: .github/workflows/npm-custom-node-generator-build.yml
================================================
name: NPM[Custom Node Generator] Build and publish to npm

on:
  workflow_dispatch:

permissions:
  id-token: write
  contents: read

concurrency:
  group: npm-custom-node-generator-build
  cancel-in-progress: false
jobs:
  build:
    if: github.repository == 'software-mansion/react-native-audio-api'
    runs-on: ubuntu-latest
    environment: deployment
    permissions:
      contents: read
      id-token: write
    env:
      PACKAGE_DIR: packages/custom-node-generator
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 24
          registry-url: https://registry.npmjs.org/

      - name: Update NPM
        run: npm install -g npm@latest

      - name: Publish package to npm
        working-directory: ${{ env.PACKAGE_DIR }}
        run: npm publish --provenance --access public


================================================
FILE: .github/workflows/publish-docs.yml
================================================
name: DOCS Build and publish audio api docs

on:
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: 'pages'
  cancel-in-progress: true

jobs:
  publish:
    if: github.repository == 'software-mansion/react-native-audio-api'
    runs-on: ubuntu-latest
    environment: github-pages
    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4

      - name: Setup Yarn
        uses: mskelton/setup-yarn@v2

      - name: Install dependencies and build the docs
        run: |
          cd packages/audiodocs
          yarn
          yarn build

      - name: Upload build files
        uses: actions/upload-pages-artifact@v3
        with:
          path: packages/audiodocs/build

      - name: Setup Pages
        uses: actions/configure-pages@v5

      - name: Recrawl search index
        run: |
          curl -X POST https://crawler.algolia.com/api/1/crawlers/${{ secrets.CRAWLER_ID }}/reindex \
          -H "Content-Type: application/json" \
          -u ${{ secrets.CRAWLER_USER_ID }}:${{ secrets.CRAWLER_API_KEY }}

      - name: Deploy to Github Pages
        uses: actions/deploy-pages@v4


================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests

on:
  pull_request:
  workflow_dispatch:

jobs:
  cpp-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup
        uses: ./.github/actions/setup

      - name: Run C++ tests
        working-directory: packages/react-native-audio-api
        run: yarn test:cpp

  js-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup
        uses: ./.github/actions/setup

      - name: Run JS integration tests
        working-directory: packages/react-native-audio-api
        run: yarn test:js


================================================
FILE: .gitignore
================================================
# OSX
#
.DS_Store

# XDE
.expo/

# VSCode
.vscode/
jsconfig.json

# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace

.xcode.env.local

# Android/IJ
#
.classpath
.cxx
.gradle
.idea
.project
.settings
local.properties
android.iml

# Cocoapods
#
apps/**/ios/Pods

# Ruby
apps/**/vendor/

# node.js
#
node_modules/
npm-debug.log
yarn-debug.log
yarn-error.log

# BUCK
buck-out/
\.buckd/
android/app/libs
android/keystores/debug.keystore

# Yarn
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.yarn/cache

# Expo
.expo/

# Turborepo
.turbo/

packages/react-native-audio-api/lib
react-native-audio-api*.tgz

# Android
.kotlin


# Envs
.env

compile_commands.json
openssl-prebuilt/
prebuilt_libs/
output/

# External libs
packages/react-native-audio-api/android/src/main/jniLibs/
packages/react-native-audio-api/common/cpp/audioapi/external/**/*.a
packages/react-native-audio-api/common/cpp/audioapi/external/*.xcframework
packages/react-native-audio-api/common/cpp/audioapi/external/ffmpeg_ios/

# Clangd cache
.cache


================================================
FILE: .nvmrc
================================================
v22.16.0


================================================
FILE: .yarn/releases/yarn-4.5.0.cjs
================================================
#!/usr/bin/env node
/* eslint-disable */
//prettier-ignore
(()=>{var t_e=Object.create;var vR=Object.defineProperty;var r_e=Object.getOwnPropertyDescriptor;var n_e=Object.getOwnPropertyNames;var i_e=Object.getPrototypeOf,s_e=Object.prototype.hasOwnProperty;var ve=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var Et=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)vR(t,r,{get:e[r],enumerable:!0})},o_e=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of n_e(e))!s_e.call(t,a)&&a!==r&&vR(t,a,{get:()=>e[a],enumerable:!(o=r_e(e,a))||o.enumerable});return t};var Ze=(t,e,r)=>(r=t!=null?t_e(i_e(t)):{},o_e(e||!t||!t.__esModule?vR(r,"default",{value:t,enumerable:!0}):r,t));var Bi={};Vt(Bi,{SAFE_TIME:()=>D7,S_IFDIR:()=>iD,S_IFLNK:()=>sD,S_IFMT:()=>Uu,S_IFREG:()=>Dw});var Uu,iD,Dw,sD,D7,P7=Et(()=>{Uu=61440,iD=16384,Dw=32768,sD=40960,D7=456789e3});var nr={};Vt(nr,{EBADF:()=>Io,EBUSY:()=>a_e,EEXIST:()=>p_e,EINVAL:()=>c_e,EISDIR:()=>f_e,ENOENT:()=>u_e,ENOSYS:()=>l_e,ENOTDIR:()=>A_e,ENOTEMPTY:()=>g_e,EOPNOTSUPP:()=>d_e,EROFS:()=>h_e,ERR_DIR_CLOSED:()=>DR});function Tl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function a_e(t){return Tl("EBUSY",t)}function l_e(t,e){return Tl("ENOSYS",`${t}, ${e}`)}function c_e(t){return Tl("EINVAL",`invalid argument, ${t}`)}function Io(t){return Tl("EBADF",`bad file descriptor, ${t}`)}function u_e(t){return Tl("ENOENT",`no such file or directory, ${t}`)}function A_e(t){return Tl("ENOTDIR",`not a directory, ${t}`)}function f_e(t){return Tl("EISDIR",`illegal operation on a directory, ${t}`)}function p_e(t){return Tl("EEXIST",`file already exists, ${t}`)}function h_e(t){return Tl("EROFS",`read-only filesystem, ${t}`)}function g_e(t){return Tl("ENOTEMPTY",`directory not empty, ${t}`)}function d_e(t){return Tl("EOPNOTSUPP",`operation not supported, ${t}`)}function DR(){return Tl("ERR_DIR_CLOSED","Directory handle was closed")}var oD=Et(()=>{});var wa={};Vt(wa,{BigIntStatsEntry:()=>qd,DEFAULT_MODE:()=>SR,DirEntry:()=>PR,StatEntry:()=>Hd,areStatsEqual:()=>xR,clearStats:()=>aD,convertToBigIntStats:()=>y_e,makeDefaultStats:()=>b7,makeEmptyStats:()=>m_e});function b7(){return new Hd}function m_e(){return aD(b7())}function aD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):bR.types.isDate(r)&&(t[e]=new Date(0))}return t}function y_e(t){let e=new qd;for(let r in t)if(Object.hasOwn(t,r)){let o=t[r];typeof o=="number"?e[r]=BigInt(o):bR.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function xR(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var bR,SR,PR,Hd,qd,kR=Et(()=>{bR=Ze(ve("util")),SR=33188,PR=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},Hd=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=SR;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},qd=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(SR);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function B_e(t){let e,r;if(e=t.match(w_e))t=e[1];else if(r=t.match(I_e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function v_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(E_e))?t=`/${e[1]}`:(r=t.match(C_e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function lD(t,e){return t===ue?x7(e):QR(e)}var Pw,It,dr,ue,V,S7,E_e,C_e,w_e,I_e,QR,x7,Ia=Et(()=>{Pw=Ze(ve("path")),It={root:"/",dot:".",parent:".."},dr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},ue=Object.create(Pw.default),V=Object.create(Pw.default.posix);ue.cwd=()=>process.cwd();V.cwd=process.platform==="win32"?()=>QR(process.cwd()):process.cwd;process.platform==="win32"&&(V.resolve=(...t)=>t.length>0&&V.isAbsolute(t[0])?Pw.default.posix.resolve(...t):Pw.default.posix.resolve(V.cwd(),...t));S7=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};ue.contains=(t,e)=>S7(ue,t,e);V.contains=(t,e)=>S7(V,t,e);E_e=/^([a-zA-Z]:.*)$/,C_e=/^\/\/(\.\/)?(.*)$/,w_e=/^\/([a-zA-Z]:.*)$/,I_e=/^\/unc\/(\.dot\/)?(.*)$/;QR=process.platform==="win32"?v_e:t=>t,x7=process.platform==="win32"?B_e:t=>t;ue.fromPortablePath=x7;ue.toPortablePath=QR});async function cD(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function k7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:R0,mtime:R0}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await FR(A,p,t,n,r,u,{...a,didParentExist:!0});for(let I of A)await I();await Promise.all(p.map(I=>I()))}async function FR(t,e,r,o,a,n,u){let A=u.didParentExist?await Q7(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:R0,mtime:R0}:p,I;switch(!0){case p.isDirectory():I=await P_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():I=await x_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():I=await k_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(u.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((I||A?.mtime?.getTime()!==E.getTime()||A?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),I=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),I=!0)),I}async function Q7(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function P_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(v){if(v.code!=="EEXIST")throw v}}),h=!0);let E=await n.readdirPromise(u),I=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let v of E.sort())await FR(t,e,r,r.pathUtils.join(o,v),n,n.pathUtils.join(u,v),I)&&(h=!0);else(await Promise.all(E.map(async x=>{await FR(t,e,r,r.pathUtils.join(o,x),n,n.pathUtils.join(u,x),I)}))).some(x=>x)&&(h=!0);return h}async function b_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:"sha1"}),I=420,v=A.mode&511,x=`${E}${v!==I?v.toString(8):""}`,C=r.pathUtils.join(h.indexPath,E.slice(0,2),`${x}.dat`),R;(ce=>(ce[ce.Lock=0]="Lock",ce[ce.Rename=1]="Rename"))(R||={});let L=1,U=await Q7(r,C);if(a){let ae=U&&a.dev===U.dev&&a.ino===U.ino,le=U?.mtimeMs!==D_e;if(ae&&le&&h.autoRepair&&(L=0,U=null),!ae)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let z=!U&&L===1?`${C}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,te=!1;return t.push(async()=>{if(!U&&(L===0&&await r.lockPromise(C,async()=>{let ae=await n.readFilePromise(u);await r.writeFilePromise(C,ae)}),L===1&&z)){let ae=await n.readFilePromise(u);await r.writeFilePromise(z,ae);try{await r.linkPromise(z,C)}catch(le){if(le.code==="EEXIST")te=!0,await r.unlinkPromise(z);else throw le}}a||await r.linkPromise(C,o)}),e.push(async()=>{U||(await r.lutimesPromise(C,R0,R0),v!==I&&await r.chmodPromise(C,v)),z&&!te&&await r.unlinkPromise(z)}),!1}async function S_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function x_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="HardlinkFromIndex"?b_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):S_e(t,e,r,o,a,n,u,A,p)}async function k_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(lD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var R0,D_e,RR=Et(()=>{Ia();R0=new Date(456789e3*1e3),D_e=R0.getTime()});function uD(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let u=t.pathUtils.join(e,n);return Object.assign(t.statSync(u),{name:n,path:void 0})};return new bw(e,a,o)}var bw,F7=Et(()=>{oD();bw=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw DR()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function R7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var T7,AD,N7=Et(()=>{T7=ve("events");kR();AD=class t extends T7.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new t(r,o,a);return n.start(),n}start(){R7(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){R7(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let o=this.bigint?new qd:new Hd;return aD(o)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;xR(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener("change",r);let o=this.changeListeners.get(r);typeof o<"u"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function jd(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=fD.get(t);typeof p>"u"&&fD.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=AD.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function T0(t,e,r){let o=fD.get(t);if(typeof o>"u")return;let a=o.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function N0(t){let e=fD.get(t);if(!(typeof e>"u"))for(let r of e.keys())T0(t,r)}var fD,TR=Et(()=>{N7();fD=new WeakMap});function Q_e(t){let e=t.match(/\r?\n/g);if(e===null)return M7.EOL;let r=e.filter(a=>a===`\r
`).length,o=e.length-r;return r>o?`\r
`:`
`}function L0(t,e){return e.replace(/\r?\n/g,Q_e(t))}var L7,M7,hf,_u,M0=Et(()=>{L7=ve("crypto"),M7=ve("os");RR();Ia();hf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,L7.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!=="EBUSY"&&u.code!=="ENOTEMPTY")throw u;n<o&&await new Promise(A=>setTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await k7(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(lD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let u=o?L0(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let u=o?L0(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,"wx")}catch(p){if(p.code==="EEXIST"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)}
`)}writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)}
`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},_u=class extends hf{constructor(){super(V)}}});var Ss,gf=Et(()=>{M0();Ss=class extends hf{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,o){return this.baseFs.openPro
Download .txt
gitextract_uaa1x4hk/

├── .claude/
│   ├── README.md
│   ├── commands/
│   │   └── pre-push-update.md
│   ├── hooks/
│   │   └── double-prompt.js
│   ├── last-knowledge-update
│   ├── settings.json
│   └── skills/
│       ├── audio-nodes/
│       │   ├── SKILL.md
│       │   ├── gainnode-example.md
│       │   └── maintenance.md
│       ├── build-compilation-dependencies/
│       │   ├── SKILL.md
│       │   ├── build-details.md
│       │   └── maintenance.md
│       ├── flow/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── host-objects/
│       │   ├── SKILL.md
│       │   ├── examples.md
│       │   └── maintenance.md
│       ├── post-work-checks/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── thread-safety-itc/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── turbo-modules/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       ├── utilities/
│       │   ├── SKILL.md
│       │   ├── api.md
│       │   └── maintenance.md
│       ├── web-audio-api/
│       │   ├── SKILL.md
│       │   └── maintenance.md
│       └── writing-skills/
│           ├── SKILL.md
│           └── maintenance.md
├── .editorconfig
├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   └── feature_request.yaml
│   ├── actions/
│   │   └── setup/
│   │       └── action.yml
│   ├── pull_request_template.md
│   ├── release.yml
│   └── workflows/
│       ├── ci.yml
│       ├── graph-tests.yml
│       ├── npm-audio-package-build.yml
│       ├── npm-custom-node-generator-build.yml
│       ├── publish-docs.yml
│       └── tests.yml
├── .gitignore
├── .nvmrc
├── .yarn/
│   └── releases/
│       └── yarn-4.5.0.cjs
├── .yarnrc.yml
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── THIRD_PARTY.md
├── apps/
│   ├── CLAUDE.md
│   ├── common-app/
│   │   ├── .eslintrc.js
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── prettier.config.js
│   │   ├── scripts/
│   │   │   └── dependencies.js
│   │   ├── src/
│   │   │   ├── App.tsx
│   │   │   ├── components/
│   │   │   │   ├── BGGradient.tsx
│   │   │   │   ├── Button.tsx
│   │   │   │   ├── Container.tsx
│   │   │   │   ├── Select.tsx
│   │   │   │   ├── Slider.tsx
│   │   │   │   ├── Spacer.tsx
│   │   │   │   ├── Switch.tsx
│   │   │   │   ├── VerticalSlider.tsx
│   │   │   │   ├── icons/
│   │   │   │   │   ├── CheckedCircleIcon.tsx
│   │   │   │   │   ├── MenuIcon.tsx
│   │   │   │   │   └── PlayPauseIcon.tsx
│   │   │   │   └── index.ts
│   │   │   ├── demos/
│   │   │   │   ├── Crossfade/
│   │   │   │   │   └── Crossfade.tsx
│   │   │   │   ├── PedalBoard/
│   │   │   │   │   ├── AutoWahPedal.tsx
│   │   │   │   │   ├── EchoPedal.tsx
│   │   │   │   │   ├── OverdrivePedal.tsx
│   │   │   │   │   ├── PedalBoard.tsx
│   │   │   │   │   ├── ReverbPedal.tsx
│   │   │   │   │   └── curves.ts
│   │   │   │   ├── Record/
│   │   │   │   │   ├── ControlPanel.tsx
│   │   │   │   │   ├── PauseButton.tsx
│   │   │   │   │   ├── PlaybackVisualization.tsx
│   │   │   │   │   ├── Record.tsx
│   │   │   │   │   ├── RecordButton.tsx
│   │   │   │   │   ├── RecordingTime.tsx
│   │   │   │   │   ├── RecordingVisualization.tsx
│   │   │   │   │   ├── Status.tsx
│   │   │   │   │   ├── TimeStream.tsx
│   │   │   │   │   ├── constants.tsx
│   │   │   │   │   └── types.ts
│   │   │   │   └── index.ts
│   │   │   ├── examples/
│   │   │   │   ├── AudioFile/
│   │   │   │   │   ├── AudioFile.tsx
│   │   │   │   │   ├── AudioPlayer.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AudioParamPipeline/
│   │   │   │   │   ├── AudioParamPipeline.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AudioPipelineStress/
│   │   │   │   │   ├── AudioPipelineStress.tsx
│   │   │   │   │   ├── StopRequestedError.ts
│   │   │   │   │   ├── StressPlaybackController.ts
│   │   │   │   │   ├── StressResourceOwner.ts
│   │   │   │   │   ├── audioSessions.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── AudioTag/
│   │   │   │   │   ├── AudioTag.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AudioVisualizer/
│   │   │   │   │   ├── AudioVisualizer.tsx
│   │   │   │   │   ├── Canvas.tsx
│   │   │   │   │   ├── Charts.tsx
│   │   │   │   │   ├── FreqTimeChart.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── ConvolverIR/
│   │   │   │   │   ├── ConvolverIR.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── DrumMachine/
│   │   │   │   │   ├── DrumMachine.tsx
│   │   │   │   │   ├── Grid.tsx
│   │   │   │   │   ├── NotesHighlight.tsx
│   │   │   │   │   ├── PatternShape.tsx
│   │   │   │   │   ├── PlayButton.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── instruments.ts
│   │   │   │   │   ├── presets.ts
│   │   │   │   │   └── useGestures.ts
│   │   │   │   ├── Metronome/
│   │   │   │   │   ├── Metronome.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── patterns.ts
│   │   │   │   ├── OfflineRendering/
│   │   │   │   │   ├── OfflineRendering.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── Oscillator/
│   │   │   │   │   ├── Oscillator.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Piano/
│   │   │   │   │   ├── Keyboard.tsx
│   │   │   │   │   ├── Piano.tsx
│   │   │   │   │   ├── PianoNote.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── PlaybackSpeed/
│   │   │   │   │   ├── PlaybackSpeed.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── Record/
│   │   │   │   │   └── Record.tsx
│   │   │   │   ├── Streaming/
│   │   │   │   │   └── Streaming.tsx
│   │   │   │   ├── Worklets/
│   │   │   │   │   └── Worklets.tsx
│   │   │   │   └── index.ts
│   │   │   ├── singletons/
│   │   │   │   └── index.ts
│   │   │   ├── styles.ts
│   │   │   ├── testComponents/
│   │   │   │   ├── ControlBar.tsx
│   │   │   │   ├── CurrentStepCard.tsx
│   │   │   │   ├── EmptyState.tsx
│   │   │   │   ├── Header.tsx
│   │   │   │   ├── LiveLog.tsx
│   │   │   │   ├── ScenarioCard.tsx
│   │   │   │   ├── ScenarioResults.tsx
│   │   │   │   ├── SectionTitle.tsx
│   │   │   │   ├── StatusPill.tsx
│   │   │   │   ├── StepRow.tsx
│   │   │   │   ├── Summary.tsx
│   │   │   │   ├── SummaryBadge.tsx
│   │   │   │   ├── UnsupportedNotice.tsx
│   │   │   │   ├── index.ts
│   │   │   │   ├── statusStyles.ts
│   │   │   │   └── types.ts
│   │   │   ├── types.ts
│   │   │   └── utils/
│   │   │       ├── skiUtils.ts
│   │   │       ├── soundEngines/
│   │   │       │   ├── Clap.ts
│   │   │       │   ├── HiHat.ts
│   │   │       │   ├── Kick.ts
│   │   │       │   ├── MetronomeSound.ts
│   │   │       │   └── SoundEngine.ts
│   │   │       ├── usePlayer.tsx
│   │   │       └── withSeparators.ts
│   │   ├── tsconfig.json
│   │   └── types.d.ts
│   └── fabric-example/
│       ├── .bundle/
│       │   └── config
│       ├── .watchmanconfig
│       ├── App.tsx
│       ├── Gemfile
│       ├── README.md
│       ├── android/
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── debug.keystore
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── fabricexample/
│       │   │           │           ├── MainActivity.kt
│       │   │           │           └── MainApplication.kt
│       │   │           └── res/
│       │   │               ├── drawable/
│       │   │               │   ├── ic_launcher_background.xml
│       │   │               │   ├── logo.xml
│       │   │               │   ├── pause.xml
│       │   │               │   ├── resume.xml
│       │   │               │   └── rn_edit_text_material.xml
│       │   │               ├── mipmap-anydpi-v26/
│       │   │               │   ├── ic_launcher.xml
│       │   │               │   └── ic_launcher_round.xml
│       │   │               └── values/
│       │   │                   ├── ic_launcher_background.xml
│       │   │                   ├── strings.xml
│       │   │                   └── styles.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       ├── app.json
│       ├── babel.config.js
│       ├── index.js
│       ├── ios/
│       │   ├── .xcode.env
│       │   ├── FabricExample/
│       │   │   ├── AppDelegate.swift
│       │   │   ├── Images.xcassets/
│       │   │   │   ├── AppIcon.appiconset/
│       │   │   │   │   └── Contents.json
│       │   │   │   └── Contents.json
│       │   │   ├── Info.plist
│       │   │   ├── LaunchScreen.storyboard
│       │   │   └── PrivacyInfo.xcprivacy
│       │   ├── FabricExample.xcodeproj/
│       │   │   ├── project.pbxproj
│       │   │   └── xcshareddata/
│       │   │       └── xcschemes/
│       │   │           └── FabricExample.xcscheme
│       │   ├── FabricExample.xcworkspace/
│       │   │   └── contents.xcworkspacedata
│       │   ├── FabricExampleTests/
│       │   │   ├── AudioAPIModuleTests.mm
│       │   │   ├── AudioEngineTests.mm
│       │   │   ├── AudioPlayerTests.mm
│       │   │   ├── AudioSessionManagerTests.mm
│       │   │   ├── IOSAudioRecorderTests.mm
│       │   │   ├── NativeAudioRecorderTests.mm
│       │   │   └── SystemNotificationManagerTests.mm
│       │   └── Podfile
│       ├── metro.config.js
│       ├── package.json
│       ├── react-native.config.js
│       └── tsconfig.json
├── ghdocs/
│   ├── audio-node.md
│   └── changelog.md
├── lefthook.yml
├── lgplv3
├── package.json
├── packages/
│   ├── audiodocs/
│   │   ├── .eslintrc
│   │   ├── .gitignore
│   │   ├── .yarn/
│   │   │   └── releases/
│   │   │       └── yarn-1.22.22.cjs
│   │   ├── .yarnrc.yml
│   │   ├── CLAUDE.md
│   │   ├── README.md
│   │   ├── babel.config.js
│   │   ├── docs/
│   │   │   ├── analysis/
│   │   │   │   ├── _category_.json
│   │   │   │   └── analyser-node.mdx
│   │   │   ├── core/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-context.mdx
│   │   │   │   ├── audio-node.mdx
│   │   │   │   ├── audio-param.mdx
│   │   │   │   ├── base-audio-context.mdx
│   │   │   │   └── offline-audio-context.mdx
│   │   │   ├── destinations/
│   │   │   │   ├── _category_.json
│   │   │   │   └── audio-destination-node.mdx
│   │   │   ├── effects/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── biquad-filter-node.mdx
│   │   │   │   ├── convolver-node.mdx
│   │   │   │   ├── delay-node.mdx
│   │   │   │   ├── gain-node.mdx
│   │   │   │   ├── iir-filter-node.mdx
│   │   │   │   ├── periodic-wave.mdx
│   │   │   │   ├── stereo-panner-node.mdx
│   │   │   │   └── wave-shaper-node.mdx
│   │   │   ├── experimental/
│   │   │   │   ├── _category_.json
│   │   │   │   └── audio-tag.mdx
│   │   │   ├── fundamentals/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── best-practices.mdx
│   │   │   │   ├── getting-started.mdx
│   │   │   │   └── introduction.mdx
│   │   │   ├── guides/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── create-your-own-effect.mdx
│   │   │   │   ├── lets-make-some-noise.mdx
│   │   │   │   ├── making-a-piano-keyboard.mdx
│   │   │   │   ├── noise-generation.mdx
│   │   │   │   └── see-your-sound.mdx
│   │   │   ├── inputs/
│   │   │   │   ├── _category_.json
│   │   │   │   └── audio-recorder.mdx
│   │   │   ├── other/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-api-plugin.mdx
│   │   │   │   ├── compatibility.mdx
│   │   │   │   ├── ffmpeg-info.mdx
│   │   │   │   ├── non-expo-permissions.mdx
│   │   │   │   ├── running_with_mac_catalyst.mdx
│   │   │   │   ├── testing.mdx
│   │   │   │   └── web-audio-api-coverage.mdx
│   │   │   ├── react/
│   │   │   │   ├── _category_.json
│   │   │   │   └── select-input.mdx
│   │   │   ├── sources/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-buffer-base-source-node.mdx
│   │   │   │   ├── audio-buffer-queue-source-node.mdx
│   │   │   │   ├── audio-buffer-source-node.mdx
│   │   │   │   ├── audio-buffer.mdx
│   │   │   │   ├── audio-scheduled-source-node.mdx
│   │   │   │   ├── constant-source-node.mdx
│   │   │   │   ├── oscillator-node.mdx
│   │   │   │   ├── recorder-adapter-node.mdx
│   │   │   │   └── streamer-node.mdx
│   │   │   ├── system/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── audio-manager.mdx
│   │   │   │   ├── playback-notification-manager.mdx
│   │   │   │   └── recording-notification-manager.mdx
│   │   │   ├── types/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── channel-count-mode.mdx
│   │   │   │   ├── channel-interpretation.mdx
│   │   │   │   └── oscillator-type.mdx
│   │   │   ├── utils/
│   │   │   │   ├── _category_.json
│   │   │   │   ├── decoding.mdx
│   │   │   │   └── time-stretching.mdx
│   │   │   └── worklets/
│   │   │       ├── _category_.json
│   │   │       ├── introduction.mdx
│   │   │       ├── worklet-node.mdx
│   │   │       ├── worklet-processing-node.mdx
│   │   │       └── worklet-source-node.mdx
│   │   ├── docusaurus.config.js
│   │   ├── package.json
│   │   ├── prettier.config.js
│   │   ├── sidebars.js
│   │   ├── src/
│   │   │   ├── audio/
│   │   │   │   ├── AudioManager.ts
│   │   │   │   ├── Equalizer.ts
│   │   │   │   ├── MockAudioContext.ts
│   │   │   │   ├── effects.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── useEqualizerControls.ts
│   │   │   │   ├── useIsPlaying.ts
│   │   │   │   └── utils.ts
│   │   │   ├── canvasUtils/
│   │   │   │   ├── clearCanvas.ts
│   │   │   │   ├── createGradient.ts
│   │   │   │   ├── drawEQControlPoints.ts
│   │   │   │   ├── drawEqGrid.ts
│   │   │   │   ├── drawShadedCurve.ts
│   │   │   │   ├── drawSpectroLines.ts
│   │   │   │   ├── getBarWidth.ts
│   │   │   │   ├── getEqualizerResponse.ts
│   │   │   │   ├── groupEQBandLevels.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── lagrangeInterpolation.ts
│   │   │   │   ├── stretchFrequencies.ts
│   │   │   │   └── types.ts
│   │   │   ├── components/
│   │   │   │   ├── AnimableIcon/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── AudioNodePropsTable/
│   │   │   │   │   ├── AudioNodePropsTable.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Badges/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Charts/
│   │   │   │   │   ├── ExponentialRampToValueAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── LinearRampToValueAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── SetTargetAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── SetValueAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── SetValueCurveAtTime/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── common/
│   │   │   │   │   │   └── AudioParamChartBase.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Compatibility/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── HandIcon/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── InteractiveExample/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── InteractivePlayground/
│   │   │   │   │   ├── AudioBufferSourceExample/
│   │   │   │   │   │   ├── AudioBufferSourceExample.tsx
│   │   │   │   │   │   └── useAudioBufferSourcePlayground.tsx
│   │   │   │   │   ├── GainAdsrExample/
│   │   │   │   │   │   ├── AdsrChart.tsx
│   │   │   │   │   │   ├── GainAdsrExample.tsx
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   └── useGainAdsrPlayground.tsx
│   │   │   │   │   ├── OscillatorExample/
│   │   │   │   │   │   ├── OscillatorExample.tsx
│   │   │   │   │   │   └── useOscilatorPlayground.tsx
│   │   │   │   │   ├── WaveformVisualizer.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── RadonBanner/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   └── TopPromoRotator/
│   │   │   │       ├── index.tsx
│   │   │   │       └── styles.module.css
│   │   │   ├── css/
│   │   │   │   ├── colors.css
│   │   │   │   ├── custom.css
│   │   │   │   ├── overrides.css
│   │   │   │   └── typography.css
│   │   │   ├── examples/
│   │   │   │   ├── Biquad/
│   │   │   │   │   ├── BiquadExampleComponent.tsx
│   │   │   │   │   ├── BoxWithFlaps.tsx
│   │   │   │   │   ├── FrequencyResponseGraph.module.css
│   │   │   │   │   ├── FrequencyResponseGraph.tsx
│   │   │   │   │   └── drawFrequencyResponse.tsx
│   │   │   │   ├── LetsMakeSomeNoise/
│   │   │   │   │   ├── Component.tsx
│   │   │   │   │   └── Source.tsx
│   │   │   │   ├── NoiseGeneration/
│   │   │   │   │   ├── BrownianNoiseComponent.tsx
│   │   │   │   │   ├── BrownianNoiseSource.tsx
│   │   │   │   │   ├── PinkNoiseComponent.tsx
│   │   │   │   │   ├── PinkNoiseSource.tsx
│   │   │   │   │   ├── WhiteNoiseComponent.tsx
│   │   │   │   │   └── WhiteNoiseSource.tsx
│   │   │   │   ├── SeeYourSound/
│   │   │   │   │   ├── BaseComponent.tsx
│   │   │   │   │   ├── BaseSource.tsx
│   │   │   │   │   ├── CanvasSizerComponent.tsx
│   │   │   │   │   ├── FrequencyDomainComponent.tsx
│   │   │   │   │   ├── FrequencyDomainSource.tsx
│   │   │   │   │   ├── TimeDomainComponent.tsx
│   │   │   │   │   └── TimeDomainSource.tsx
│   │   │   │   ├── SimplePiano/
│   │   │   │   │   ├── EnvelopesComponent.tsx
│   │   │   │   │   ├── EnvelopesSource.tsx
│   │   │   │   │   ├── FinalComponent.tsx
│   │   │   │   │   ├── FinalSource.tsx
│   │   │   │   │   ├── ItHangsComponent.tsx
│   │   │   │   │   ├── ItHangsSource.tsx
│   │   │   │   │   ├── PressOutComponent.tsx
│   │   │   │   │   └── PressOutSource.tsx
│   │   │   │   └── VinylPlayer/
│   │   │   │       ├── VinylPlayer.tsx
│   │   │   │       ├── consts.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── styles.module.css
│   │   │   ├── hooks/
│   │   │   │   ├── usePageType.tsx
│   │   │   │   └── useScreenSize.tsx
│   │   │   ├── landingComponents/
│   │   │   │   ├── FooterBackground/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Hero/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── HireUsSection/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── HomepageButton/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── LandingBlog/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── LandingFeatures/
│   │   │   │   │   ├── LandingFeature.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── LandingWidget/
│   │   │   │   │   ├── Canvas/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Equalizer/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── SoundButton/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Spectrogram/
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Toolbar/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── styles.module.css
│   │   │   │   │   └── types.ts
│   │   │   │   ├── Testimonials/
│   │   │   │   │   ├── TestimonialItem/
│   │   │   │   │   │   ├── QuoteIcon/
│   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── TestimonialList/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── styles.module.css
│   │   │   │   │   │   ├── styles.prev.css
│   │   │   │   │   │   ├── testimonials.tsx
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── useDrag.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   └── index.ts
│   │   │   ├── pages/
│   │   │   │   ├── TestPage.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   └── styles.module.css
│   │   │   ├── theme/
│   │   │   │   ├── CodeBlock/
│   │   │   │   │   ├── highlighting-dark.js
│   │   │   │   │   └── highlighting-light.js
│   │   │   │   ├── DocSidebar/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Navbar/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── styles.css
│   │   │   │   ├── NotFound/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Root.jsx
│   │   │   │   ├── SkipToContent/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── TOCItems/
│   │   │   │   │   ├── Tree/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── Tabs/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── styles.module.css
│   │   │   │   └── muiTheme.jsx
│   │   │   ├── types.d.ts
│   │   │   ├── ui/
│   │   │   │   ├── DetailBox/
│   │   │   │   │   ├── DetailBox.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── FilterList/
│   │   │   │   │   ├── FilterList.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Icon/
│   │   │   │   │   ├── Icon.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── Layout/
│   │   │   │   │   ├── Box/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Column/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Container/
│   │   │   │   │   │   ├── Container.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Row/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   ├── Spacer/
│   │   │   │   │   │   ├── Spacer.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── styles.module.css
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── ResponsiveCanvas/
│   │   │   │   │   ├── ResponsiveCanvas.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── styles.module.css
│   │   │   │   ├── SliderInput/
│   │   │   │   │   ├── SliderInput.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── styles.module.css
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   └── Switch/
│   │   │   │       ├── Switch.tsx
│   │   │   │       ├── index.ts
│   │   │   │       └── styles.module.css
│   │   │   └── wasm-loader.js
│   │   ├── static/
│   │   │   ├── .nojekyll
│   │   │   ├── audio/
│   │   │   │   ├── music/
│   │   │   │   │   └── guitar-sample.flac
│   │   │   │   └── other/
│   │   │   │       └── mixed-channels.opus
│   │   │   ├── fonts/
│   │   │   │   ├── Aeonik-Bold.otf
│   │   │   │   ├── Aeonik-Medium.otf
│   │   │   │   └── Aeonik-Regular.otf
│   │   │   └── signalsmithStretch.mjs
│   │   ├── tsconfig.json
│   │   └── types.d.ts
│   ├── custom-node-generator/
│   │   ├── README.md
│   │   ├── bin/
│   │   │   └── cli.js
│   │   ├── lib/
│   │   │   └── generator.js
│   │   ├── package.json
│   │   └── templates/
│   │       └── basic/
│   │           ├── shared/
│   │           │   ├── MyProcessorNode.cpp
│   │           │   ├── MyProcessorNode.h
│   │           │   ├── MyProcessorNodeHostObject.h
│   │           │   ├── NativeAudioProcessingModule.cpp
│   │           │   └── NativeAudioProcessingModule.h
│   │           └── specs/
│   │               └── NativeAudioProcessingModule.ts
│   ├── react-native-audio-api/
│   │   ├── .clang-format
│   │   ├── .clang-tidy
│   │   ├── .clangd
│   │   ├── .eslintrc.js
│   │   ├── .prettierignore
│   │   ├── .watchmanconfig
│   │   ├── RNAudioAPI.podspec
│   │   ├── android/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── build.gradle
│   │   │   ├── gradle.properties
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── AndroidManifestNew.xml
│   │   │       │   ├── cpp/
│   │   │       │   │   └── audioapi/
│   │   │       │   │       ├── CMakeLists.txt
│   │   │       │   │       └── android/
│   │   │       │   │           ├── AudioAPIModule.cpp
│   │   │       │   │           ├── AudioAPIModule.h
│   │   │       │   │           ├── OnLoad.cpp
│   │   │       │   │           ├── core/
│   │   │       │   │           │   ├── AndroidAudioRecorder.cpp
│   │   │       │   │           │   ├── AndroidAudioRecorder.h
│   │   │       │   │           │   ├── AudioPlayer.cpp
│   │   │       │   │           │   ├── AudioPlayer.h
│   │   │       │   │           │   ├── NativeAudioPlayer.hpp
│   │   │       │   │           │   ├── NativeAudioRecorder.hpp
│   │   │       │   │           │   └── utils/
│   │   │       │   │           │       ├── AndroidFileWriterBackend.cpp
│   │   │       │   │           │       ├── AndroidFileWriterBackend.h
│   │   │       │   │           │       ├── AndroidRecorderCallback.cpp
│   │   │       │   │           │       ├── AndroidRecorderCallback.h
│   │   │       │   │           │       ├── AndroidRotatingFileWriter.cpp
│   │   │       │   │           │       ├── AndroidRotatingFileWriter.h
│   │   │       │   │           │       ├── FileOptions.cpp
│   │   │       │   │           │       ├── FileOptions.h
│   │   │       │   │           │       ├── ffmpegBackend/
│   │   │       │   │           │       │   ├── FFmpegFileWriter.cpp
│   │   │       │   │           │       │   ├── FFmpegFileWriter.h
│   │   │       │   │           │       │   ├── ptrs.hpp
│   │   │       │   │           │       │   ├── utils.cpp
│   │   │       │   │           │       │   └── utils.h
│   │   │       │   │           │       └── miniaudioBackend/
│   │   │       │   │           │           ├── MiniAudioFileWriter.cpp
│   │   │       │   │           │           └── MiniAudioFileWriter.h
│   │   │       │   │           └── system/
│   │   │       │   │               └── NativeFileInfo.hpp
│   │   │       │   ├── java/
│   │   │       │   │   └── com/
│   │   │       │   │       └── swmansion/
│   │   │       │   │           └── audioapi/
│   │   │       │   │               ├── AudioAPIModule.kt
│   │   │       │   │               ├── AudioAPIPackage.kt
│   │   │       │   │               └── system/
│   │   │       │   │                   ├── AudioEvent.kt
│   │   │       │   │                   ├── AudioFocusListener.kt
│   │   │       │   │                   ├── CentralizedForegroundService.kt
│   │   │       │   │                   ├── ForegroundServiceManager.kt
│   │   │       │   │                   ├── MediaSessionManager.kt
│   │   │       │   │                   ├── NativeFileInfo.kt
│   │   │       │   │                   ├── PermissionRequestListener.kt
│   │   │       │   │                   ├── VolumeChangeListener.kt
│   │   │       │   │                   └── notification/
│   │   │       │   │                       ├── BaseNotification.kt
│   │   │       │   │                       ├── NotificationRegistry.kt
│   │   │       │   │                       ├── PlaybackNotification.kt
│   │   │       │   │                       ├── PlaybackNotificationReceiver.kt
│   │   │       │   │                       ├── RecordingNotification.kt
│   │   │       │   │                       ├── RecordingNotificationReceiver.kt
│   │   │       │   │                       └── state/
│   │   │       │   │                           └── RecordingNotificationState.kt
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   ├── logo.xml
│   │   │       │       │   ├── next.xml
│   │   │       │       │   ├── pause.xml
│   │   │       │       │   ├── play.xml
│   │   │       │       │   ├── previous.xml
│   │   │       │       │   ├── skip_backward_15.xml
│   │   │       │       │   ├── skip_forward_15.xml
│   │   │       │       │   └── stop.xml
│   │   │       │       └── layout/
│   │   │       │           ├── btn_round_ripple.xml
│   │   │       │           ├── notification_collapsed.xml
│   │   │       │           └── notification_expanded.xml
│   │   │       └── oldarch/
│   │   │           └── NativeAudioAPIModuleSpec.java
│   │   ├── app.plugin.js
│   │   ├── babel.config.js
│   │   ├── common/
│   │   │   └── cpp/
│   │   │       ├── audioapi/
│   │   │       │   ├── AudioAPIModuleInstaller.h
│   │   │       │   ├── HostObjects/
│   │   │       │   │   ├── AudioContextHostObject.cpp
│   │   │       │   │   ├── AudioContextHostObject.h
│   │   │       │   │   ├── AudioNodeHostObject.cpp
│   │   │       │   │   ├── AudioNodeHostObject.h
│   │   │       │   │   ├── AudioParamHostObject.cpp
│   │   │       │   │   ├── AudioParamHostObject.h
│   │   │       │   │   ├── BaseAudioContextHostObject.cpp
│   │   │       │   │   ├── BaseAudioContextHostObject.h
│   │   │       │   │   ├── OfflineAudioContextHostObject.cpp
│   │   │       │   │   ├── OfflineAudioContextHostObject.h
│   │   │       │   │   ├── analysis/
│   │   │       │   │   │   ├── AnalyserNodeHostObject.cpp
│   │   │       │   │   │   └── AnalyserNodeHostObject.h
│   │   │       │   │   ├── destinations/
│   │   │       │   │   │   └── AudioDestinationNodeHostObject.h
│   │   │       │   │   ├── effects/
│   │   │       │   │   │   ├── BiquadFilterNodeHostObject.cpp
│   │   │       │   │   │   ├── BiquadFilterNodeHostObject.h
│   │   │       │   │   │   ├── ConvolverNodeHostObject.cpp
│   │   │       │   │   │   ├── ConvolverNodeHostObject.h
│   │   │       │   │   │   ├── DelayNodeHostObject.cpp
│   │   │       │   │   │   ├── DelayNodeHostObject.h
│   │   │       │   │   │   ├── GainNodeHostObject.cpp
│   │   │       │   │   │   ├── GainNodeHostObject.h
│   │   │       │   │   │   ├── IIRFilterNodeHostObject.cpp
│   │   │       │   │   │   ├── IIRFilterNodeHostObject.h
│   │   │       │   │   │   ├── PeriodicWaveHostObject.h
│   │   │       │   │   │   ├── StereoPannerNodeHostObject.cpp
│   │   │       │   │   │   ├── StereoPannerNodeHostObject.h
│   │   │       │   │   │   ├── WaveShaperNodeHostObject.cpp
│   │   │       │   │   │   ├── WaveShaperNodeHostObject.h
│   │   │       │   │   │   ├── WorkletNodeHostObject.h
│   │   │       │   │   │   └── WorkletProcessingNodeHostObject.h
│   │   │       │   │   ├── events/
│   │   │       │   │   │   ├── AudioEventHandlerRegistryHostObject.cpp
│   │   │       │   │   │   └── AudioEventHandlerRegistryHostObject.h
│   │   │       │   │   ├── inputs/
│   │   │       │   │   │   ├── AudioRecorderHostObject.cpp
│   │   │       │   │   │   └── AudioRecorderHostObject.h
│   │   │       │   │   ├── sources/
│   │   │       │   │   │   ├── AudioBufferBaseSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferBaseSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioBufferHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferHostObject.h
│   │   │       │   │   │   ├── AudioBufferQueueSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferQueueSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioBufferSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioBufferSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioFileSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioFileSourceNodeHostObject.h
│   │   │       │   │   │   ├── AudioScheduledSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── AudioScheduledSourceNodeHostObject.h
│   │   │       │   │   │   ├── ConstantSourceNodeHostObject.cpp
│   │   │       │   │   │   ├── ConstantSourceNodeHostObject.h
│   │   │       │   │   │   ├── OscillatorNodeHostObject.cpp
│   │   │       │   │   │   ├── OscillatorNodeHostObject.h
│   │   │       │   │   │   ├── RecorderAdapterNodeHostObject.h
│   │   │       │   │   │   ├── StreamerNodeHostObject.h
│   │   │       │   │   │   └── WorkletSourceNodeHostObject.h
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── AudioDecoderHostObject.cpp
│   │   │       │   │       ├── AudioDecoderHostObject.h
│   │   │       │   │       ├── AudioStretcherHostObject.cpp
│   │   │       │   │       ├── AudioStretcherHostObject.h
│   │   │       │   │       ├── JsEnumParser.cpp
│   │   │       │   │       ├── JsEnumParser.h
│   │   │       │   │       └── NodeOptionsParser.h
│   │   │       │   ├── core/
│   │   │       │   │   ├── AudioContext.cpp
│   │   │       │   │   ├── AudioContext.h
│   │   │       │   │   ├── AudioNode.cpp
│   │   │       │   │   ├── AudioNode.h
│   │   │       │   │   ├── AudioParam.cpp
│   │   │       │   │   ├── AudioParam.h
│   │   │       │   │   ├── BaseAudioContext.cpp
│   │   │       │   │   ├── BaseAudioContext.h
│   │   │       │   │   ├── OfflineAudioContext.cpp
│   │   │       │   │   ├── OfflineAudioContext.h
│   │   │       │   │   ├── analysis/
│   │   │       │   │   │   ├── AnalyserNode.cpp
│   │   │       │   │   │   └── AnalyserNode.h
│   │   │       │   │   ├── destinations/
│   │   │       │   │   │   ├── AudioDestinationNode.cpp
│   │   │       │   │   │   └── AudioDestinationNode.h
│   │   │       │   │   ├── effects/
│   │   │       │   │   │   ├── BiquadFilterNode.cpp
│   │   │       │   │   │   ├── BiquadFilterNode.h
│   │   │       │   │   │   ├── ConvolverNode.cpp
│   │   │       │   │   │   ├── ConvolverNode.h
│   │   │       │   │   │   ├── DelayNode.cpp
│   │   │       │   │   │   ├── DelayNode.h
│   │   │       │   │   │   ├── GainNode.cpp
│   │   │       │   │   │   ├── GainNode.h
│   │   │       │   │   │   ├── IIRFilterNode.cpp
│   │   │       │   │   │   ├── IIRFilterNode.h
│   │   │       │   │   │   ├── PeriodicWave.cpp
│   │   │       │   │   │   ├── PeriodicWave.h
│   │   │       │   │   │   ├── StereoPannerNode.cpp
│   │   │       │   │   │   ├── StereoPannerNode.h
│   │   │       │   │   │   ├── WaveShaperNode.cpp
│   │   │       │   │   │   ├── WaveShaperNode.h
│   │   │       │   │   │   ├── WorkletNode.cpp
│   │   │       │   │   │   ├── WorkletNode.h
│   │   │       │   │   │   ├── WorkletProcessingNode.cpp
│   │   │       │   │   │   └── WorkletProcessingNode.h
│   │   │       │   │   ├── inputs/
│   │   │       │   │   │   ├── AudioRecorder.cpp
│   │   │       │   │   │   └── AudioRecorder.h
│   │   │       │   │   ├── sources/
│   │   │       │   │   │   ├── AudioBufferBaseSourceNode.cpp
│   │   │       │   │   │   ├── AudioBufferBaseSourceNode.h
│   │   │       │   │   │   ├── AudioBufferQueueSourceNode.cpp
│   │   │       │   │   │   ├── AudioBufferQueueSourceNode.h
│   │   │       │   │   │   ├── AudioBufferSourceNode.cpp
│   │   │       │   │   │   ├── AudioBufferSourceNode.h
│   │   │       │   │   │   ├── AudioFileSourceNode.cpp
│   │   │       │   │   │   ├── AudioFileSourceNode.h
│   │   │       │   │   │   ├── AudioScheduledSourceNode.cpp
│   │   │       │   │   │   ├── AudioScheduledSourceNode.h
│   │   │       │   │   │   ├── ConstantSourceNode.cpp
│   │   │       │   │   │   ├── ConstantSourceNode.h
│   │   │       │   │   │   ├── OscillatorNode.cpp
│   │   │       │   │   │   ├── OscillatorNode.h
│   │   │       │   │   │   ├── RecorderAdapterNode.cpp
│   │   │       │   │   │   ├── RecorderAdapterNode.h
│   │   │       │   │   │   ├── StreamerNode.cpp
│   │   │       │   │   │   ├── StreamerNode.h
│   │   │       │   │   │   ├── WorkletSourceNode.cpp
│   │   │       │   │   │   └── WorkletSourceNode.h
│   │   │       │   │   ├── types/
│   │   │       │   │   │   ├── AudioFormat.h
│   │   │       │   │   │   ├── BiquadFilterType.h
│   │   │       │   │   │   ├── ChannelCountMode.h
│   │   │       │   │   │   ├── ChannelInterpretation.h
│   │   │       │   │   │   ├── ContextState.h
│   │   │       │   │   │   ├── OscillatorType.h
│   │   │       │   │   │   ├── OverSampleType.h
│   │   │       │   │   │   └── ParamEventType.h
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── AudioDecoder.cpp
│   │   │       │   │       ├── AudioDecoder.h
│   │   │       │   │       ├── AudioDestructor.hpp
│   │   │       │   │       ├── AudioFileWriter.cpp
│   │   │       │   │       ├── AudioFileWriter.h
│   │   │       │   │       ├── AudioGraphManager.cpp
│   │   │       │   │       ├── AudioGraphManager.h
│   │   │       │   │       ├── AudioRecorderCallback.cpp
│   │   │       │   │       ├── AudioRecorderCallback.h
│   │   │       │   │       ├── AudioStretcher.cpp
│   │   │       │   │       ├── AudioStretcher.h
│   │   │       │   │       ├── Constants.h
│   │   │       │   │       ├── Locker.h
│   │   │       │   │       ├── RotatingFileWriter.cpp
│   │   │       │   │       ├── RotatingFileWriter.h
│   │   │       │   │       ├── graph/
│   │   │       │   │       │   ├── AudioGraph.hpp
│   │   │       │   │       │   ├── Disposer.hpp
│   │   │       │   │       │   ├── Graph.hpp
│   │   │       │   │       │   ├── HostGraph.hpp
│   │   │       │   │       │   ├── HostNode.hpp
│   │   │       │   │       │   ├── InputPool.hpp
│   │   │       │   │       │   ├── NodeHandle.hpp
│   │   │       │   │       │   └── README.md
│   │   │       │   │       ├── param/
│   │   │       │   │       │   ├── ParamControlQueue.cpp
│   │   │       │   │       │   ├── ParamControlQueue.h
│   │   │       │   │       │   ├── ParamEvent.h
│   │   │       │   │       │   ├── ParamQueueBase.hpp
│   │   │       │   │       │   ├── ParamRenderEventFactory.hpp
│   │   │       │   │       │   ├── ParamRenderQueue.cpp
│   │   │       │   │       │   ├── ParamRenderQueue.h
│   │   │       │   │       │   └── RenderParamEvent.h
│   │   │       │   │       └── worklets/
│   │   │       │   │           ├── SafeIncludes.h
│   │   │       │   │           ├── WorkletsRunner.cpp
│   │   │       │   │           └── WorkletsRunner.h
│   │   │       │   ├── dsp/
│   │   │       │   │   ├── AudioUtils.hpp
│   │   │       │   │   ├── Convolver.cpp
│   │   │       │   │   ├── Convolver.h
│   │   │       │   │   ├── FFT.cpp
│   │   │       │   │   ├── FFT.h
│   │   │       │   │   ├── VectorMath.cpp
│   │   │       │   │   ├── VectorMath.h
│   │   │       │   │   ├── WaveShaper.cpp
│   │   │       │   │   ├── WaveShaper.h
│   │   │       │   │   └── r8brain/
│   │   │       │   │       ├── CDSPBlockConvolver.h
│   │   │       │   │       ├── CDSPFIRFilter.h
│   │   │       │   │       ├── CDSPFracInterpolator.h
│   │   │       │   │       ├── CDSPHBDownsampler.h
│   │   │       │   │       ├── CDSPHBDownsampler.inc
│   │   │       │   │       ├── CDSPHBUpsampler.h
│   │   │       │   │       ├── CDSPHBUpsampler.inc
│   │   │       │   │       ├── CDSPProcessor.h
│   │   │       │   │       ├── CDSPRealFFT.h
│   │   │       │   │       ├── CDSPResampler.h
│   │   │       │   │       ├── CDSPSincFilterGen.h
│   │   │       │   │       ├── Resampler.hpp
│   │   │       │   │       ├── fft/
│   │   │       │   │       │   ├── fft4g.h
│   │   │       │   │       │   ├── pffft.h
│   │   │       │   │       │   ├── pffft_double.c
│   │   │       │   │       │   ├── pffft_double.h
│   │   │       │   │       │   ├── pffft_priv_impl.h
│   │   │       │   │       │   └── simd/
│   │   │       │   │       │       ├── pf_avx_double.h
│   │   │       │   │       │       ├── pf_double.h
│   │   │       │   │       │       ├── pf_neon_double.h
│   │   │       │   │       │       ├── pf_neon_double_from_avx.h
│   │   │       │   │       │       ├── pf_scalar_double.h
│   │   │       │   │       │       └── pf_sse2_double.h
│   │   │       │   │       ├── r8bbase.h
│   │   │       │   │       ├── r8bconf.h
│   │   │       │   │       └── r8butil.h
│   │   │       │   ├── events/
│   │   │       │   │   ├── AudioEvent.h
│   │   │       │   │   ├── AudioEventHandlerRegistry.cpp
│   │   │       │   │   ├── AudioEventHandlerRegistry.h
│   │   │       │   │   └── IAudioEventHandlerRegistry.h
│   │   │       │   ├── external/
│   │   │       │   │   ├── include/
│   │   │       │   │   │   ├── ogg/
│   │   │       │   │   │   │   ├── config_types.h
│   │   │       │   │   │   │   ├── ogg.h
│   │   │       │   │   │   │   └── os_types.h
│   │   │       │   │   │   ├── opus/
│   │   │       │   │   │   │   ├── opus.h
│   │   │       │   │   │   │   ├── opus_defines.h
│   │   │       │   │   │   │   ├── opus_multistream.h
│   │   │       │   │   │   │   ├── opus_projection.h
│   │   │       │   │   │   │   └── opus_types.h
│   │   │       │   │   │   ├── opusfile/
│   │   │       │   │   │   │   └── opusfile.h
│   │   │       │   │   │   └── vorbis/
│   │   │       │   │   │       ├── codec.h
│   │   │       │   │   │       ├── vorbisenc.h
│   │   │       │   │   │       └── vorbisfile.h
│   │   │       │   │   └── include_ffmpeg/
│   │   │       │   │       ├── libavcodec/
│   │   │       │   │       │   ├── ac3_parser.h
│   │   │       │   │       │   ├── adts_parser.h
│   │   │       │   │       │   ├── avcodec.h
│   │   │       │   │       │   ├── avdct.h
│   │   │       │   │       │   ├── bsf.h
│   │   │       │   │       │   ├── codec.h
│   │   │       │   │       │   ├── codec_desc.h
│   │   │       │   │       │   ├── codec_id.h
│   │   │       │   │       │   ├── codec_par.h
│   │   │       │   │       │   ├── d3d11va.h
│   │   │       │   │       │   ├── defs.h
│   │   │       │   │       │   ├── dirac.h
│   │   │       │   │       │   ├── dv_profile.h
│   │   │       │   │       │   ├── dxva2.h
│   │   │       │   │       │   ├── jni.h
│   │   │       │   │       │   ├── mediacodec.h
│   │   │       │   │       │   ├── packet.h
│   │   │       │   │       │   ├── qsv.h
│   │   │       │   │       │   ├── smpte_436m.h
│   │   │       │   │       │   ├── vdpau.h
│   │   │       │   │       │   ├── version.h
│   │   │       │   │       │   ├── version_major.h
│   │   │       │   │       │   ├── videotoolbox.h
│   │   │       │   │       │   └── vorbis_parser.h
│   │   │       │   │       ├── libavformat/
│   │   │       │   │       │   ├── avformat.h
│   │   │       │   │       │   ├── avio.h
│   │   │       │   │       │   ├── version.h
│   │   │       │   │       │   └── version_major.h
│   │   │       │   │       ├── libavutil/
│   │   │       │   │       │   ├── adler32.h
│   │   │       │   │       │   ├── aes.h
│   │   │       │   │       │   ├── aes_ctr.h
│   │   │       │   │       │   ├── ambient_viewing_environment.h
│   │   │       │   │       │   ├── attributes.h
│   │   │       │   │       │   ├── audio_fifo.h
│   │   │       │   │       │   ├── avassert.h
│   │   │       │   │       │   ├── avconfig.h
│   │   │       │   │       │   ├── avstring.h
│   │   │       │   │       │   ├── avutil.h
│   │   │       │   │       │   ├── base64.h
│   │   │       │   │       │   ├── blowfish.h
│   │   │       │   │       │   ├── bprint.h
│   │   │       │   │       │   ├── bswap.h
│   │   │       │   │       │   ├── buffer.h
│   │   │       │   │       │   ├── camellia.h
│   │   │       │   │       │   ├── cast5.h
│   │   │       │   │       │   ├── channel_layout.h
│   │   │       │   │       │   ├── common.h
│   │   │       │   │       │   ├── container_fifo.h
│   │   │       │   │       │   ├── cpu.h
│   │   │       │   │       │   ├── crc.h
│   │   │       │   │       │   ├── csp.h
│   │   │       │   │       │   ├── des.h
│   │   │       │   │       │   ├── detection_bbox.h
│   │   │       │   │       │   ├── dict.h
│   │   │       │   │       │   ├── display.h
│   │   │       │   │       │   ├── dovi_meta.h
│   │   │       │   │       │   ├── downmix_info.h
│   │   │       │   │       │   ├── encryption_info.h
│   │   │       │   │       │   ├── error.h
│   │   │       │   │       │   ├── eval.h
│   │   │       │   │       │   ├── executor.h
│   │   │       │   │       │   ├── ffversion.h
│   │   │       │   │       │   ├── fifo.h
│   │   │       │   │       │   ├── file.h
│   │   │       │   │       │   ├── film_grain_params.h
│   │   │       │   │       │   ├── frame.h
│   │   │       │   │       │   ├── hash.h
│   │   │       │   │       │   ├── hdr_dynamic_metadata.h
│   │   │       │   │       │   ├── hdr_dynamic_vivid_metadata.h
│   │   │       │   │       │   ├── hmac.h
│   │   │       │   │       │   ├── hwcontext.h
│   │   │       │   │       │   ├── hwcontext_amf.h
│   │   │       │   │       │   ├── hwcontext_cuda.h
│   │   │       │   │       │   ├── hwcontext_d3d11va.h
│   │   │       │   │       │   ├── hwcontext_d3d12va.h
│   │   │       │   │       │   ├── hwcontext_drm.h
│   │   │       │   │       │   ├── hwcontext_dxva2.h
│   │   │       │   │       │   ├── hwcontext_mediacodec.h
│   │   │       │   │       │   ├── hwcontext_oh.h
│   │   │       │   │       │   ├── hwcontext_opencl.h
│   │   │       │   │       │   ├── hwcontext_qsv.h
│   │   │       │   │       │   ├── hwcontext_vaapi.h
│   │   │       │   │       │   ├── hwcontext_vdpau.h
│   │   │       │   │       │   ├── hwcontext_videotoolbox.h
│   │   │       │   │       │   ├── hwcontext_vulkan.h
│   │   │       │   │       │   ├── iamf.h
│   │   │       │   │       │   ├── imgutils.h
│   │   │       │   │       │   ├── intfloat.h
│   │   │       │   │       │   ├── intreadwrite.h
│   │   │       │   │       │   ├── lfg.h
│   │   │       │   │       │   ├── log.h
│   │   │       │   │       │   ├── lzo.h
│   │   │       │   │       │   ├── macros.h
│   │   │       │   │       │   ├── mastering_display_metadata.h
│   │   │       │   │       │   ├── mathematics.h
│   │   │       │   │       │   ├── md5.h
│   │   │       │   │       │   ├── mem.h
│   │   │       │   │       │   ├── motion_vector.h
│   │   │       │   │       │   ├── murmur3.h
│   │   │       │   │       │   ├── opt.h
│   │   │       │   │       │   ├── parseutils.h
│   │   │       │   │       │   ├── pixdesc.h
│   │   │       │   │       │   ├── pixelutils.h
│   │   │       │   │       │   ├── pixfmt.h
│   │   │       │   │       │   ├── random_seed.h
│   │   │       │   │       │   ├── rational.h
│   │   │       │   │       │   ├── rc4.h
│   │   │       │   │       │   ├── refstruct.h
│   │   │       │   │       │   ├── replaygain.h
│   │   │       │   │       │   ├── ripemd.h
│   │   │       │   │       │   ├── samplefmt.h
│   │   │       │   │       │   ├── sha.h
│   │   │       │   │       │   ├── sha512.h
│   │   │       │   │       │   ├── spherical.h
│   │   │       │   │       │   ├── stereo3d.h
│   │   │       │   │       │   ├── tdrdi.h
│   │   │       │   │       │   ├── tea.h
│   │   │       │   │       │   ├── threadmessage.h
│   │   │       │   │       │   ├── timecode.h
│   │   │       │   │       │   ├── timestamp.h
│   │   │       │   │       │   ├── tree.h
│   │   │       │   │       │   ├── twofish.h
│   │   │       │   │       │   ├── tx.h
│   │   │       │   │       │   ├── uuid.h
│   │   │       │   │       │   ├── version.h
│   │   │       │   │       │   ├── video_enc_params.h
│   │   │       │   │       │   ├── video_hint.h
│   │   │       │   │       │   └── xtea.h
│   │   │       │   │       └── libswresample/
│   │   │       │   │           ├── swresample.h
│   │   │       │   │           ├── version.h
│   │   │       │   │           └── version_major.h
│   │   │       │   ├── jsi/
│   │   │       │   │   ├── JsiHostObject.cpp
│   │   │       │   │   ├── JsiHostObject.h
│   │   │       │   │   ├── JsiPromise.cpp
│   │   │       │   │   ├── JsiPromise.h
│   │   │       │   │   ├── JsiUtils.cpp
│   │   │       │   │   ├── JsiUtils.h
│   │   │       │   │   ├── RuntimeAwareCache.h
│   │   │       │   │   ├── RuntimeLifecycleMonitor.cpp
│   │   │       │   │   └── RuntimeLifecycleMonitor.h
│   │   │       │   ├── libs/
│   │   │       │   │   ├── audio-stretch/
│   │   │       │   │   │   ├── stretch.c
│   │   │       │   │   │   └── stretch.h
│   │   │       │   │   ├── base64/
│   │   │       │   │   │   └── base64.h
│   │   │       │   │   ├── decoding/
│   │   │       │   │   │   └── IncrementalAudioDecoder.h
│   │   │       │   │   ├── ffmpeg/
│   │   │       │   │   │   ├── FFmpegDecoding.cpp
│   │   │       │   │   │   ├── FFmpegDecoding.h
│   │   │       │   │   │   └── relinking.md
│   │   │       │   │   ├── miniaudio/
│   │   │       │   │   │   ├── MiniAudioDecoding.cpp
│   │   │       │   │   │   ├── MiniAudioDecoding.h
│   │   │       │   │   │   ├── decoders/
│   │   │       │   │   │   │   ├── libopus/
│   │   │       │   │   │   │   │   ├── miniaudio_libopus.c
│   │   │       │   │   │   │   │   └── miniaudio_libopus.h
│   │   │       │   │   │   │   └── libvorbis/
│   │   │       │   │   │   │       ├── miniaudio_libvorbis.c
│   │   │       │   │   │   │       └── miniaudio_libvorbis.h
│   │   │       │   │   │   └── miniaudio.h
│   │   │       │   │   ├── pffft/
│   │   │       │   │   │   ├── pffft.c
│   │   │       │   │   │   └── pffft.h
│   │   │       │   │   └── signalsmith-stretch/
│   │   │       │   │       ├── fft-pffft.h
│   │   │       │   │       ├── fft.h
│   │   │       │   │       ├── signalsmith-stretch.h
│   │   │       │   │       └── stft.h
│   │   │       │   ├── types/
│   │   │       │   │   └── NodeOptions.h
│   │   │       │   └── utils/
│   │   │       │       ├── AlignedAllocator.hpp
│   │   │       │       ├── AudioArray.hpp
│   │   │       │       ├── AudioArrayBuffer.hpp
│   │   │       │       ├── AudioBuffer.hpp
│   │   │       │       ├── AudioFileProperties.cpp
│   │   │       │       ├── AudioFileProperties.h
│   │   │       │       ├── Benchmark.hpp
│   │   │       │       ├── BoundedPriorityQueue.hpp
│   │   │       │       ├── CircularArray.hpp
│   │   │       │       ├── CircularOverflowableAudioArray.cpp
│   │   │       │       ├── CircularOverflowableAudioArray.h
│   │   │       │       ├── CrossThreadEventScheduler.hpp
│   │   │       │       ├── FatFunction.hpp
│   │   │       │       ├── Macros.h
│   │   │       │       ├── MiniaudioImplementation.cpp
│   │   │       │       ├── MoveOnlyFunction.hpp
│   │   │       │       ├── Result.hpp
│   │   │       │       ├── SpscChannel.hpp
│   │   │       │       ├── TaskOffloader.hpp
│   │   │       │       ├── ThreadPool.hpp
│   │   │       │       ├── TripleBuffer.hpp
│   │   │       │       └── UnitConversion.h
│   │   │       ├── clangd/
│   │   │       │   ├── CMakeLists.txt
│   │   │       │   ├── SETUP.md
│   │   │       │   └── generate-and-copy.sh
│   │   │       └── test/
│   │   │           ├── CMakeLists.txt
│   │   │           ├── Dockerfile
│   │   │           ├── RunTests.sh
│   │   │           ├── RunTestsGraph.sh
│   │   │           ├── RunTestsGraphDocker.sh
│   │   │           ├── graph_tests_docs.md
│   │   │           └── src/
│   │   │               ├── FatFunctionTest.cpp
│   │   │               ├── MockAudioEventHandlerRegistry.h
│   │   │               ├── core/
│   │   │               │   ├── AudioParamTest.cpp
│   │   │               │   ├── effects/
│   │   │               │   │   ├── DelayTest.cpp
│   │   │               │   │   ├── GainTest.cpp
│   │   │               │   │   ├── IIRFilterTest.cpp
│   │   │               │   │   ├── StereoPannerTest.cpp
│   │   │               │   │   ├── WaveShaperNodeTest.cpp
│   │   │               │   │   └── biquad/
│   │   │               │   │       ├── BiquadFilterChromium.cpp
│   │   │               │   │       ├── BiquadFilterChromium.h
│   │   │               │   │       ├── BiquadFilterTest.cpp
│   │   │               │   │       └── BiquadFilterTest.h
│   │   │               │   └── sources/
│   │   │               │       ├── AudioScheduledSourceTest.cpp
│   │   │               │       ├── ConstantSourceTest.cpp
│   │   │               │       └── OscillatorTest.cpp
│   │   │               ├── graph/
│   │   │               │   ├── AudioGraphFuzzTest.cpp
│   │   │               │   ├── AudioGraphTest.cpp
│   │   │               │   ├── AudioThreadGuard.cpp
│   │   │               │   ├── AudioThreadGuard.h
│   │   │               │   ├── GraphCycleDebugTest.cpp
│   │   │               │   ├── GraphFuzzTest.cpp
│   │   │               │   ├── GraphTest.cpp
│   │   │               │   ├── HostGraphTest.cpp
│   │   │               │   ├── MockGraphProcessor.h
│   │   │               │   ├── TestGraphUtils.cpp
│   │   │               │   └── TestGraphUtils.h
│   │   │               └── utils/
│   │   │                   ├── AudioArrayTest.cpp
│   │   │                   ├── AudioBufferTest.cpp
│   │   │                   └── TripleBufferTest.cpp
│   │   ├── development/
│   │   │   └── react/
│   │   │       └── package.json
│   │   ├── ios/
│   │   │   └── audioapi/
│   │   │       └── ios/
│   │   │           ├── AudioAPIModule.h
│   │   │           ├── AudioAPIModule.mm
│   │   │           ├── core/
│   │   │           │   ├── IOSAudioPlayer.h
│   │   │           │   ├── IOSAudioPlayer.mm
│   │   │           │   ├── IOSAudioRecorder.h
│   │   │           │   ├── IOSAudioRecorder.mm
│   │   │           │   ├── NativeAudioPlayer.h
│   │   │           │   ├── NativeAudioPlayer.m
│   │   │           │   ├── NativeAudioRecorder.h
│   │   │           │   ├── NativeAudioRecorder.m
│   │   │           │   └── utils/
│   │   │           │       ├── FileOptions.h
│   │   │           │       ├── FileOptions.mm
│   │   │           │       ├── IOSFileWriter.h
│   │   │           │       ├── IOSFileWriter.mm
│   │   │           │       ├── IOSRecorderCallback.h
│   │   │           │       ├── IOSRecorderCallback.mm
│   │   │           │       ├── IOSRotatingFileWriter.h
│   │   │           │       └── IOSRotatingFileWriter.mm
│   │   │           └── system/
│   │   │               ├── AudioEngine.h
│   │   │               ├── AudioEngine.mm
│   │   │               ├── AudioSessionManager.h
│   │   │               ├── AudioSessionManager.mm
│   │   │               ├── SystemNotificationManager.h
│   │   │               ├── SystemNotificationManager.mm
│   │   │               └── notification/
│   │   │                   ├── BaseNotification.h
│   │   │                   ├── NotificationRegistry.h
│   │   │                   ├── NotificationRegistry.mm
│   │   │                   ├── PlaybackNotification.h
│   │   │                   └── PlaybackNotification.mm
│   │   ├── mock/
│   │   │   └── package.json
│   │   ├── package.json
│   │   ├── scripts/
│   │   │   ├── check-audio-events-sync.sh
│   │   │   ├── cpplint.sh
│   │   │   ├── create-package.sh
│   │   │   ├── download-prebuilt-binaries.sh
│   │   │   ├── rnaa_utils.rb
│   │   │   ├── setup-rn-audio-api-web.js
│   │   │   └── validate-worklets-version.js
│   │   ├── src/
│   │   │   ├── AudioAPIModule/
│   │   │   │   ├── AudioAPIModule.ts
│   │   │   │   ├── AudioAPIModule.web.ts
│   │   │   │   ├── ModuleInterfaces.ts
│   │   │   │   ├── globals.d.ts
│   │   │   │   └── index.ts
│   │   │   ├── api.ts
│   │   │   ├── api.web.ts
│   │   │   ├── core/
│   │   │   │   ├── AnalyserNode.ts
│   │   │   │   ├── AudioBuffer.ts
│   │   │   │   ├── AudioBufferBaseSourceNode.ts
│   │   │   │   ├── AudioBufferQueueSourceNode.ts
│   │   │   │   ├── AudioBufferSourceNode.ts
│   │   │   │   ├── AudioContext.ts
│   │   │   │   ├── AudioDecoder.ts
│   │   │   │   ├── AudioDestinationNode.ts
│   │   │   │   ├── AudioNode.ts
│   │   │   │   ├── AudioParam.ts
│   │   │   │   ├── AudioRecorder.ts
│   │   │   │   ├── AudioScheduledSourceNode.ts
│   │   │   │   ├── AudioStretcher.ts
│   │   │   │   ├── BaseAudioContext.ts
│   │   │   │   ├── BiquadFilterNode.ts
│   │   │   │   ├── ConstantSourceNode.ts
│   │   │   │   ├── ConvolverNode.ts
│   │   │   │   ├── DelayNode.ts
│   │   │   │   ├── GainNode.ts
│   │   │   │   ├── IIRFilterNode.ts
│   │   │   │   ├── OfflineAudioContext.ts
│   │   │   │   ├── OscillatorNode.ts
│   │   │   │   ├── PeriodicWave.ts
│   │   │   │   ├── RecorderAdapterNode.ts
│   │   │   │   ├── StereoPannerNode.ts
│   │   │   │   ├── StreamerNode.ts
│   │   │   │   ├── WaveShaperNode.ts
│   │   │   │   ├── WorkletNode.ts
│   │   │   │   ├── WorkletProcessingNode.ts
│   │   │   │   └── WorkletSourceNode.ts
│   │   │   ├── development/
│   │   │   │   └── react/
│   │   │   │       ├── Audio/
│   │   │   │       │   ├── Audio.tsx
│   │   │   │       │   ├── Audio.web.tsx
│   │   │   │       │   ├── AudioFileSourceNode.ts
│   │   │   │       │   ├── AudioTagContext.ts
│   │   │   │       │   ├── controls/
│   │   │   │       │   │   ├── AudioControls.tsx
│   │   │   │       │   │   └── audioControlUtils.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── types.ts
│   │   │   │       │   └── utils.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── types.d.ts
│   │   │   ├── errors/
│   │   │   │   ├── AudioApiError.ts
│   │   │   │   ├── IndexSizeError.ts
│   │   │   │   ├── InvalidAccessError.ts
│   │   │   │   ├── InvalidStateError.ts
│   │   │   │   ├── NotSupportedError.ts
│   │   │   │   ├── RangeError.ts
│   │   │   │   └── index.ts
│   │   │   ├── events/
│   │   │   │   ├── AudioEventEmitter.ts
│   │   │   │   ├── AudioEventSubscription.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── hooks/
│   │   │   │   ├── index.ts
│   │   │   │   ├── useAudioInput.ts
│   │   │   │   └── useSystemVolume.ts
│   │   │   ├── index.ts
│   │   │   ├── interfaces.ts
│   │   │   ├── mock/
│   │   │   │   └── index.ts
│   │   │   ├── options-validators.ts
│   │   │   ├── plugin/
│   │   │   │   └── withAudioAPI.ts
│   │   │   ├── specs/
│   │   │   │   ├── NativeAudioAPIModule.ts
│   │   │   │   ├── NativeAudioAPIModule.web.ts
│   │   │   │   └── index.ts
│   │   │   ├── system/
│   │   │   │   ├── AudioManager.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── notification/
│   │   │   │   │   ├── PlaybackNotificationManager.ts
│   │   │   │   │   ├── RecordingNotificationManager.ios.ts
│   │   │   │   │   ├── RecordingNotificationManager.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── types.ts
│   │   │   ├── types.ts
│   │   │   ├── utils/
│   │   │   │   ├── filePresets.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── paths.ts
│   │   │   ├── web-core/
│   │   │   │   ├── AnalyserNode.tsx
│   │   │   │   ├── AudioBuffer.tsx
│   │   │   │   ├── AudioBufferSourceNode.tsx
│   │   │   │   ├── AudioContext.tsx
│   │   │   │   ├── AudioDestinationNode.tsx
│   │   │   │   ├── AudioNode.tsx
│   │   │   │   ├── AudioParam.tsx
│   │   │   │   ├── AudioScheduledSourceNode.tsx
│   │   │   │   ├── BaseAudioContext.tsx
│   │   │   │   ├── BiquadFilterNode.tsx
│   │   │   │   ├── ConstantSourceNode.tsx
│   │   │   │   ├── ConvolverNode.tsx
│   │   │   │   ├── ConvolverNodeOptions.tsx
│   │   │   │   ├── DelayNode.tsx
│   │   │   │   ├── GainNode.tsx
│   │   │   │   ├── IIRFilterNode.tsx
│   │   │   │   ├── OfflineAudioContext.tsx
│   │   │   │   ├── OscillatorNode.tsx
│   │   │   │   ├── PeriodicWave.tsx
│   │   │   │   ├── StereoPannerNode.tsx
│   │   │   │   ├── WaveShaperNode.tsx
│   │   │   │   └── custom/
│   │   │   │       ├── LoadCustomWasm.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── signalsmithStretch/
│   │   │   │           ├── LICENSE.txt
│   │   │   │           ├── README.md
│   │   │   │           └── SignalsmithStretch.mjs
│   │   │   └── web-system/
│   │   │       ├── AudioManager.ts
│   │   │       ├── index.ts
│   │   │       └── notification/
│   │   │           ├── PlaybackNotificationManager.ts
│   │   │           ├── RecordingNotificationManager.ts
│   │   │           └── index.ts
│   │   ├── tests/
│   │   │   ├── CLAUDE.md
│   │   │   ├── integration.test.ts
│   │   │   ├── jest.config.json
│   │   │   ├── mock.test.ts
│   │   │   └── setup.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.test.json
│   │   └── turbo.json
│   └── test-app-screen/
│       ├── .gitignore
│       ├── index.ts
│       ├── package.json
│       ├── src/
│       │   ├── AudioBufferTest.ts
│       │   ├── OscillatorTest.ts
│       │   ├── RecorderTest.ts
│       │   ├── StreamingTest.ts
│       │   ├── Test.tsx
│       │   ├── WorkletsTest.ts
│       │   └── constants.ts
│       └── tsconfig.json
├── prettier.config.js
├── scripts/
│   └── collect-knowledge-changes.sh
└── tsconfig.json
Download .txt
Showing preview only (1,627K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (17887 symbols across 702 files)

FILE: .yarn/releases/yarn-4.5.0.cjs
  function Tl (line 4) | function Tl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}
  function a_e (line 4) | function a_e(t){return Tl("EBUSY",t)}
  function l_e (line 4) | function l_e(t,e){return Tl("ENOSYS",`${t}, ${e}`)}
  function c_e (line 4) | function c_e(t){return Tl("EINVAL",`invalid argument, ${t}`)}
  function Io (line 4) | function Io(t){return Tl("EBADF",`bad file descriptor, ${t}`)}
  function u_e (line 4) | function u_e(t){return Tl("ENOENT",`no such file or directory, ${t}`)}
  function A_e (line 4) | function A_e(t){return Tl("ENOTDIR",`not a directory, ${t}`)}
  function f_e (line 4) | function f_e(t){return Tl("EISDIR",`illegal operation on a directory, ${...
  function p_e (line 4) | function p_e(t){return Tl("EEXIST",`file already exists, ${t}`)}
  function h_e (line 4) | function h_e(t){return Tl("EROFS",`read-only filesystem, ${t}`)}
  function g_e (line 4) | function g_e(t){return Tl("ENOTEMPTY",`directory not empty, ${t}`)}
  function d_e (line 4) | function d_e(t){return Tl("EOPNOTSUPP",`operation not supported, ${t}`)}
  function DR (line 4) | function DR(){return Tl("ERR_DIR_CLOSED","Directory handle was closed")}
  function b7 (line 4) | function b7(){return new Hd}
  function m_e (line 4) | function m_e(){return aD(b7())}
  function aD (line 4) | function aD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r...
  function y_e (line 4) | function y_e(t){let e=new qd;for(let r in t)if(Object.hasOwn(t,r)){let o...
  function xR (line 4) | function xR(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs...
  method constructor (line 4) | constructor(){this.name="";this.path="";this.mode=0}
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
  method constructor (line 4) | constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atim...
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
  method constructor (line 4) | constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);...
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}
  function B_e (line 4) | function B_e(t){let e,r;if(e=t.match(w_e))t=e[1];else if(r=t.match(I_e))...
  function v_e (line 4) | function v_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(E_e))?t=...
  function lD (line 4) | function lD(t,e){return t===ue?x7(e):QR(e)}
  function cD (line 4) | async function cD(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.i...
  function k7 (line 4) | async function k7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtil...
  function FR (line 4) | async function FR(t,e,r,o,a,n,u){let A=u.didParentExist?await Q7(r,o):nu...
  function Q7 (line 4) | async function Q7(t,e){try{return await t.lstatPromise(e)}catch{return n...
  function P_e (line 4) | async function P_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p...
  function b_e (line 4) | async function b_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromis...
  function S_e (line 4) | async function S_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(...
  function x_e (line 4) | async function x_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="Har...
  function k_e (line 4) | async function k_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(...
  function uD (line 4) | function uD(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return n...
  method constructor (line 4) | constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.clo...
  method throwIfClosed (line 4) | throwIfClosed(){if(this.closed)throw DR()}
  method [Symbol.asyncIterator] (line 4) | async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==nu...
  method read (line 4) | read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.reso...
  method readSync (line 4) | readSync(){return this.throwIfClosed(),this.nextDirent()}
  method close (line 4) | close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}
  method closeSync (line 4) | closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}
  function R7 (line 4) | function R7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: e...
  method constructor (line 4) | constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.chang...
  method create (line 4) | static create(r,o,a){let n=new t(r,o,a);return n.start(),n}
  method start (line 4) | start(){R7(this.status,"ready"),this.status="running",this.startTimeout=...
  method stop (line 4) | stop(){R7(this.status,"running"),this.status="stopped",this.startTimeout...
  method stat (line 4) | stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}c...
  method makeInterval (line 4) | makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStat...
  method registerChangeListener (line 4) | registerChangeListener(r,o){this.addListener("change",r),this.changeList...
  method unregisterChangeListener (line 4) | unregisterChangeListener(r){this.removeListener("change",r);let o=this.c...
  method unregisterAllChangeListeners (line 4) | unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())...
  method hasChangeListeners (line 4) | hasChangeListeners(){return this.changeListeners.size>0}
  method ref (line 4) | ref(){for(let r of this.changeListeners.values())r.ref();return this}
  method unref (line 4) | unref(){for(let r of this.changeListeners.values())r.unref();return this}
  function jd (line 4) | function jd(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=...
  function T0 (line 4) | function T0(t,e,r){let o=fD.get(t);if(typeof o>"u")return;let a=o.get(e)...
  function N0 (line 4) | function N0(t){let e=fD.get(t);if(!(typeof e>"u"))for(let r of e.keys())...
  function Q_e (line 4) | function Q_e(t){let e=t.match(/\r?\n/g);if(e===null)return M7.EOL;let r=...
  function L0 (line 7) | function L0(t,e){return e.replace(/\r?\n/g,Q_e(t))}
  method constructor (line 7) | constructor(e){this.pathUtils=e}
  method genTraversePromise (line 7) | async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length...
  method checksumFilePromise (line 7) | async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this....
  method removePromise (line 7) | async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=aw...
  method removeSync (line 7) | removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a)...
  method mkdirpPromise (line 7) | async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===th...
  method mkdirpSync (line 7) | mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUt...
  method copyPromise (line 7) | async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stab...
  method copySync (line 7) | copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=t...
  method changeFilePromise (line 7) | async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeF...
  method changeFileBufferPromise (line 7) | async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try...
  method changeFileTextPromise (line 7) | async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="...
  method changeFileSync (line 7) | changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBuffer...
  method changeFileBufferSync (line 7) | changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.r...
  method changeFileTextSync (line 7) | changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{...
  method movePromise (line 7) | async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.c...
  method moveSync (line 7) | moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this...
  method lockPromise (line 7) | async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A...
  method readJsonPromise (line 7) | async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{...
  method readJsonSync (line 7) | readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(...
  method writeJsonPromise (line 7) | async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await t...
  method writeJsonSync (line 8) | writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSy...
  method preserveTimePromise (line 9) | async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await ...
  method preserveTimeSync (line 9) | async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&...
  method constructor (line 9) | constructor(){super(V)}
  method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
  method resolve (line 9) | resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}
  method getRealPath (line 9) | getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}
  method openPromise (line 9) | async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e...
  method openSync (line 9) | openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}
  method opendirPromise (line 9) | async opendirPromise(e,r){return Object.assign(await this.baseFs.opendir...
  method opendirSync (line 9) | opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapTo...
  method readPromise (line 9) | async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,...
  method readSync (line 9) | readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}
  method writePromise (line 9) | async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseF...
  method writeSync (line 9) | writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r...
  method closePromise (line 9) | async closePromise(e){return this.baseFs.closePromise(e)}
  method closeSync (line 9) | closeSync(e){this.baseFs.closeSync(e)}
  method createReadStream (line 9) | createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this....
  method createWriteStream (line 9) | createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?thi...
  method realpathPromise (line 9) | async realpathPromise(e){return this.mapFromBase(await this.baseFs.realp...
  method realpathSync (line 9) | realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.ma...
  method existsPromise (line 9) | async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}
  method existsSync (line 9) | existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}
  method accessSync (line 9) | accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}
  method accessPromise (line 9) | async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase...
  method statPromise (line 9) | async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}
  method statSync (line 9) | statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}
  method fstatPromise (line 9) | async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}
  method fstatSync (line 9) | fstatSync(e,r){return this.baseFs.fstatSync(e,r)}
  method lstatPromise (line 9) | lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}
  method lstatSync (line 9) | lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}
  method fchmodPromise (line 9) | async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}
  method fchmodSync (line 9) | fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}
  method chmodPromise (line 9) | async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e...
  method chmodSync (line 9) | chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}
  method fchownPromise (line 9) | async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}
  method fchownSync (line 9) | fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}
  method chownPromise (line 9) | async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase...
  method chownSync (line 9) | chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}
  method renamePromise (line 9) | async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase...
  method renameSync (line 9) | renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.map...
  method copyFilePromise (line 9) | async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.m...
  method copyFileSync (line 9) | copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),...
  method appendFilePromise (line 9) | async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this...
  method appendFileSync (line 9) | appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase...
  method writeFilePromise (line 9) | async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.f...
  method writeFileSync (line 9) | writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e...
  method unlinkPromise (line 9) | async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}
  method unlinkSync (line 9) | unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}
  method utimesPromise (line 9) | async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBa...
  method utimesSync (line 9) | utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}
  method lutimesPromise (line 9) | async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapTo...
  method lutimesSync (line 9) | lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}
  method mkdirPromise (line 9) | async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e...
  method mkdirSync (line 9) | mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}
  method rmdirPromise (line 9) | async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e...
  method rmdirSync (line 9) | rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}
  method rmPromise (line 9) | async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}
  method rmSync (line 9) | rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}
  method linkPromise (line 9) | async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),...
  method linkSync (line 9) | linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBa...
  method symlinkPromise (line 9) | async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.is...
  method symlinkSync (line 9) | symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(...
  method readFilePromise (line 9) | async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMap...
  method readFileSync (line 9) | readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}
  method readdirPromise (line 9) | readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}
  method readdirSync (line 9) | readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}
  method readlinkPromise (line 9) | async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readl...
  method readlinkSync (line 9) | readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.ma...
  method truncatePromise (line 9) | async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapTo...
  method truncateSync (line 9) | truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}
  method ftruncateSync (line 9) | ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}
  method watch (line 9) | watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}
  method watchFile (line 9) | watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}
  method unwatchFile (line 9) | unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}
  method fsMapToBase (line 9) | fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}
  method constructor (line 9) | constructor(e,{baseFs:r,pathUtils:o}){super(o),this.target=e,this.baseFs=r}
  method getRealPath (line 9) | getRealPath(){return this.target}
  method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
  method mapFromBase (line 9) | mapFromBase(e){return e}
  method mapToBase (line 9) | mapToBase(e){return e}
  function U7 (line 9) | function U7(t){let e=t;return typeof t.path=="string"&&(e.path=ue.toPort...
  method constructor (line 9) | constructor(e=_7.default){super(),this.realFs=e}
  method getExtractHint (line 9) | getExtractHint(){return!1}
  method getRealPath (line 9) | getRealPath(){return It.root}
  method resolve (line 9) | resolve(e){return V.resolve(e)}
  method openPromise (line 9) | async openPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.op...
  method openSync (line 9) | openSync(e,r,o){return this.realFs.openSync(ue.fromPortablePath(e),r,o)}
  method opendirPromise (line 9) | async opendirPromise(e,r){return await new Promise((o,a)=>{typeof r<"u"?...
  method opendirSync (line 9) | opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(ue.fromPorta...
  method readPromise (line 9) | async readPromise(e,r,o=0,a=0,n=-1){return await new Promise((u,A)=>{thi...
  method readSync (line 9) | readSync(e,r,o,a,n){return this.realFs.readSync(e,r,o,a,n)}
  method writePromise (line 9) | async writePromise(e,r,o,a,n){return await new Promise((u,A)=>typeof r==...
  method writeSync (line 9) | writeSync(e,r,o,a,n){return typeof r=="string"?this.realFs.writeSync(e,r...
  method closePromise (line 9) | async closePromise(e){await new Promise((r,o)=>{this.realFs.close(e,this...
  method closeSync (line 9) | closeSync(e){this.realFs.closeSync(e)}
  method createReadStream (line 9) | createReadStream(e,r){let o=e!==null?ue.fromPortablePath(e):e;return thi...
  method createWriteStream (line 9) | createWriteStream(e,r){let o=e!==null?ue.fromPortablePath(e):e;return th...
  method realpathPromise (line 9) | async realpathPromise(e){return await new Promise((r,o)=>{this.realFs.re...
  method realpathSync (line 9) | realpathSync(e){return ue.toPortablePath(this.realFs.realpathSync(ue.fro...
  method existsPromise (line 9) | async existsPromise(e){return await new Promise(r=>{this.realFs.exists(u...
  method accessSync (line 9) | accessSync(e,r){return this.realFs.accessSync(ue.fromPortablePath(e),r)}
  method accessPromise (line 9) | async accessPromise(e,r){return await new Promise((o,a)=>{this.realFs.ac...
  method existsSync (line 9) | existsSync(e){return this.realFs.existsSync(ue.fromPortablePath(e))}
  method statPromise (line 9) | async statPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.st...
  method statSync (line 9) | statSync(e,r){return r?this.realFs.statSync(ue.fromPortablePath(e),r):th...
  method fstatPromise (line 9) | async fstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.f...
  method fstatSync (line 9) | fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync...
  method lstatPromise (line 9) | async lstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.l...
  method lstatSync (line 9) | lstatSync(e,r){return r?this.realFs.lstatSync(ue.fromPortablePath(e),r):...
  method fchmodPromise (line 9) | async fchmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.fc...
  method fchmodSync (line 9) | fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}
  method chmodPromise (line 9) | async chmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.chm...
  method chmodSync (line 9) | chmodSync(e,r){return this.realFs.chmodSync(ue.fromPortablePath(e),r)}
  method fchownPromise (line 9) | async fchownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs....
  method fchownSync (line 9) | fchownSync(e,r,o){return this.realFs.fchownSync(e,r,o)}
  method chownPromise (line 9) | async chownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.c...
  method chownSync (line 9) | chownSync(e,r,o){return this.realFs.chownSync(ue.fromPortablePath(e),r,o)}
  method renamePromise (line 9) | async renamePromise(e,r){return await new Promise((o,a)=>{this.realFs.re...
  method renameSync (line 9) | renameSync(e,r){return this.realFs.renameSync(ue.fromPortablePath(e),ue....
  method copyFilePromise (line 9) | async copyFilePromise(e,r,o=0){return await new Promise((a,n)=>{this.rea...
  method copyFileSync (line 9) | copyFileSync(e,r,o=0){return this.realFs.copyFileSync(ue.fromPortablePat...
  method appendFilePromise (line 9) | async appendFilePromise(e,r,o){return await new Promise((a,n)=>{let u=ty...
  method appendFileSync (line 9) | appendFileSync(e,r,o){let a=typeof e=="string"?ue.fromPortablePath(e):e;...
  method writeFilePromise (line 9) | async writeFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typ...
  method writeFileSync (line 9) | writeFileSync(e,r,o){let a=typeof e=="string"?ue.fromPortablePath(e):e;o...
  method unlinkPromise (line 9) | async unlinkPromise(e){return await new Promise((r,o)=>{this.realFs.unli...
  method unlinkSync (line 9) | unlinkSync(e){return this.realFs.unlinkSync(ue.fromPortablePath(e))}
  method utimesPromise (line 9) | async utimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs....
  method utimesSync (line 9) | utimesSync(e,r,o){this.realFs.utimesSync(ue.fromPortablePath(e),r,o)}
  method lutimesPromise (line 9) | async lutimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs...
  method lutimesSync (line 9) | lutimesSync(e,r,o){this.realFs.lutimesSync(ue.fromPortablePath(e),r,o)}
  method mkdirPromise (line 9) | async mkdirPromise(e,r){return await new Promise((o,a)=>{this.realFs.mkd...
  method mkdirSync (line 9) | mkdirSync(e,r){return this.realFs.mkdirSync(ue.fromPortablePath(e),r)}
  method rmdirPromise (line 9) | async rmdirPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.r...
  method rmdirSync (line 9) | rmdirSync(e,r){return this.realFs.rmdirSync(ue.fromPortablePath(e),r)}
  method rmPromise (line 9) | async rmPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rm(u...
  method rmSync (line 9) | rmSync(e,r){return this.realFs.rmSync(ue.fromPortablePath(e),r)}
  method linkPromise (line 9) | async linkPromise(e,r){return await new Promise((o,a)=>{this.realFs.link...
  method linkSync (line 9) | linkSync(e,r){return this.realFs.linkSync(ue.fromPortablePath(e),ue.from...
  method symlinkPromise (line 9) | async symlinkPromise(e,r,o){return await new Promise((a,n)=>{this.realFs...
  method symlinkSync (line 9) | symlinkSync(e,r,o){return this.realFs.symlinkSync(ue.fromPortablePath(e....
  method readFilePromise (line 9) | async readFilePromise(e,r){return await new Promise((o,a)=>{let n=typeof...
  method readFileSync (line 9) | readFileSync(e,r){let o=typeof e=="string"?ue.fromPortablePath(e):e;retu...
  method readdirPromise (line 9) | async readdirPromise(e,r){return await new Promise((o,a)=>{r?r.recursive...
  method readdirSync (line 9) | readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.with...
  method readlinkPromise (line 9) | async readlinkPromise(e){return await new Promise((r,o)=>{this.realFs.re...
  method readlinkSync (line 9) | readlinkSync(e){return ue.toPortablePath(this.realFs.readlinkSync(ue.fro...
  method truncatePromise (line 9) | async truncatePromise(e,r){return await new Promise((o,a)=>{this.realFs....
  method truncateSync (line 9) | truncateSync(e,r){return this.realFs.truncateSync(ue.fromPortablePath(e)...
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return await new Promise((o,a)=>{this.realFs...
  method ftruncateSync (line 9) | ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}
  method watch (line 9) | watch(e,r,o){return this.realFs.watch(ue.fromPortablePath(e),r,o)}
  method watchFile (line 9) | watchFile(e,r,o){return this.realFs.watchFile(ue.fromPortablePath(e),r,o)}
  method unwatchFile (line 9) | unwatchFile(e,r){return this.realFs.unwatchFile(ue.fromPortablePath(e),r)}
  method makeCallback (line 9) | makeCallback(e,r){return(o,a)=>{o?r(o):e(a)}}
  method constructor (line 9) | constructor(e,{baseFs:r=new Tn}={}){super(V),this.target=this.pathUtils....
  method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
  method resolve (line 9) | resolve(e){return this.pathUtils.isAbsolute(e)?V.normalize(e):this.baseF...
  method mapFromBase (line 9) | mapFromBase(e){return e}
  method mapToBase (line 9) | mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(t...
  method constructor (line 9) | constructor(e,{baseFs:r=new Tn}={}){super(V),this.target=this.pathUtils....
  method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
  method getTarget (line 9) | getTarget(){return this.target}
  method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
  method mapToBase (line 9) | mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsol...
  method mapFromBase (line 9) | mapFromBase(e){return this.pathUtils.resolve(q7,this.pathUtils.relative(...
  method constructor (line 9) | constructor(r,o){super(o);this.instance=null;this.factory=r}
  method baseFs (line 9) | get baseFs(){return this.instance||(this.instance=this.factory()),this.i...
  method baseFs (line 9) | set baseFs(r){this.instance=r}
  method mapFromBase (line 9) | mapFromBase(r){return r}
  method mapToBase (line 9) | mapToBase(r){return r}
  method constructor (line 9) | constructor({baseFs:r=new Tn,filter:o=null,magicByte:a=42,maxOpenFiles:n...
  method getExtractHint (line 9) | getExtractHint(r){return this.baseFs.getExtractHint(r)}
  method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
  method saveAndClose (line 9) | saveAndClose(){if(N0(this),this.mountInstances)for(let[r,{childFs:o}]of ...
  method discardAndClose (line 9) | discardAndClose(){if(N0(this),this.mountInstances)for(let[r,{childFs:o}]...
  method resolve (line 9) | resolve(r){return this.baseFs.resolve(r)}
  method remapFd (line 9) | remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o...
  method openPromise (line 9) | async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>aw...
  method openSync (line 9) | openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,...
  method opendirPromise (line 9) | async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>a...
  method opendirSync (line 9) | opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(...
  method readPromise (line 9) | async readPromise(r,o,a,n,u){if((r&Ba)!==this.magic)return await this.ba...
  method readSync (line 9) | readSync(r,o,a,n,u){if((r&Ba)!==this.magic)return this.baseFs.readSync(r...
  method writePromise (line 9) | async writePromise(r,o,a,n,u){if((r&Ba)!==this.magic)return typeof o=="s...
  method writeSync (line 9) | writeSync(r,o,a,n,u){if((r&Ba)!==this.magic)return typeof o=="string"?th...
  method closePromise (line 9) | async closePromise(r){if((r&Ba)!==this.magic)return await this.baseFs.cl...
  method closeSync (line 9) | closeSync(r){if((r&Ba)!==this.magic)return this.baseFs.closeSync(r);let ...
  method createReadStream (line 9) | createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):...
  method createWriteStream (line 9) | createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o...
  method realpathPromise (line 9) | async realpathPromise(r){return await this.makeCallPromise(r,async()=>aw...
  method realpathSync (line 9) | realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(...
  method existsPromise (line 9) | async existsPromise(r){return await this.makeCallPromise(r,async()=>awai...
  method existsSync (line 9) | existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(...
  method accessPromise (line 9) | async accessPromise(r,o){return await this.makeCallPromise(r,async()=>aw...
  method accessSync (line 9) | accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,...
  method statPromise (line 9) | async statPromise(r,o){return await this.makeCallPromise(r,async()=>awai...
  method statSync (line 9) | statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(...
  method fstatPromise (line 9) | async fstatPromise(r,o){if((r&Ba)!==this.magic)return this.baseFs.fstatP...
  method fstatSync (line 9) | fstatSync(r,o){if((r&Ba)!==this.magic)return this.baseFs.fstatSync(r,o);...
  method lstatPromise (line 9) | async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method lstatSync (line 9) | lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o)...
  method fchmodPromise (line 9) | async fchmodPromise(r,o){if((r&Ba)!==this.magic)return this.baseFs.fchmo...
  method fchmodSync (line 9) | fchmodSync(r,o){if((r&Ba)!==this.magic)return this.baseFs.fchmodSync(r,o...
  method chmodPromise (line 9) | async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method chmodSync (line 9) | chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o)...
  method fchownPromise (line 9) | async fchownPromise(r,o,a){if((r&Ba)!==this.magic)return this.baseFs.fch...
  method fchownSync (line 9) | fchownSync(r,o,a){if((r&Ba)!==this.magic)return this.baseFs.fchownSync(r...
  method chownPromise (line 9) | async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>a...
  method chownSync (line 9) | chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,...
  method renamePromise (line 9) | async renamePromise(r,o){return await this.makeCallPromise(r,async()=>aw...
  method renameSync (line 9) | renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>t...
  method copyFilePromise (line 9) | async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if(a&U0.constants....
  method copyFileSync (line 9) | copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if(a&U0.constants.COPYFILE_FICLO...
  method appendFilePromise (line 9) | async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async...
  method appendFileSync (line 9) | appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendF...
  method writeFilePromise (line 9) | async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async(...
  method writeFileSync (line 9) | writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFil...
  method unlinkPromise (line 9) | async unlinkPromise(r){return await this.makeCallPromise(r,async()=>awai...
  method unlinkSync (line 9) | unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(...
  method utimesPromise (line 9) | async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>...
  method utimesSync (line 9) | utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(...
  method lutimesPromise (line 9) | async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=...
  method lutimesSync (line 9) | lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSyn...
  method mkdirPromise (line 9) | async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method mkdirSync (line 9) | mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o)...
  method rmdirPromise (line 9) | async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method rmdirSync (line 9) | rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o)...
  method rmPromise (line 9) | async rmPromise(r,o){return await this.makeCallPromise(r,async()=>await ...
  method rmSync (line 9) | rmSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,o),(a,{s...
  method linkPromise (line 9) | async linkPromise(r,o){return await this.makeCallPromise(o,async()=>awai...
  method linkSync (line 9) | linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(...
  method symlinkPromise (line 9) | async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=...
  method symlinkSync (line 9) | symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSyn...
  method readFilePromise (line 9) | async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await ...
  method readFileSync (line 9) | readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSyn...
  method readdirPromise (line 9) | async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>a...
  method readdirSync (line 9) | readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(...
  method readlinkPromise (line 9) | async readlinkPromise(r){return await this.makeCallPromise(r,async()=>aw...
  method readlinkSync (line 9) | readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(...
  method truncatePromise (line 9) | async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>...
  method truncateSync (line 9) | truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSyn...
  method ftruncatePromise (line 9) | async ftruncatePromise(r,o){if((r&Ba)!==this.magic)return this.baseFs.ft...
  method ftruncateSync (line 9) | ftruncateSync(r,o){if((r&Ba)!==this.magic)return this.baseFs.ftruncateSy...
  method watch (line 9) | watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,...
  method watchFile (line 9) | watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,...
  method unwatchFile (line 9) | unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(...
  method makeCallPromise (line 9) | async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="stri...
  method makeCallSync (line 9) | makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")retur...
  method findMount (line 9) | findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";f...
  method limitOpenFiles (line 9) | limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),...
  method getMountPromise (line 9) | async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInsta...
  method getMountSync (line 9) | getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(...
  method constructor (line 9) | constructor(){super(V)}
  method getExtractHint (line 9) | getExtractHint(){throw Zt()}
  method getRealPath (line 9) | getRealPath(){throw Zt()}
  method resolve (line 9) | resolve(){throw Zt()}
  method openPromise (line 9) | async openPromise(){throw Zt()}
  method openSync (line 9) | openSync(){throw Zt()}
  method opendirPromise (line 9) | async opendirPromise(){throw Zt()}
  method opendirSync (line 9) | opendirSync(){throw Zt()}
  method readPromise (line 9) | async readPromise(){throw Zt()}
  method readSync (line 9) | readSync(){throw Zt()}
  method writePromise (line 9) | async writePromise(){throw Zt()}
  method writeSync (line 9) | writeSync(){throw Zt()}
  method closePromise (line 9) | async closePromise(){throw Zt()}
  method closeSync (line 9) | closeSync(){throw Zt()}
  method createWriteStream (line 9) | createWriteStream(){throw Zt()}
  method createReadStream (line 9) | createReadStream(){throw Zt()}
  method realpathPromise (line 9) | async realpathPromise(){throw Zt()}
  method realpathSync (line 9) | realpathSync(){throw Zt()}
  method readdirPromise (line 9) | async readdirPromise(){throw Zt()}
  method readdirSync (line 9) | readdirSync(){throw Zt()}
  method existsPromise (line 9) | async existsPromise(e){throw Zt()}
  method existsSync (line 9) | existsSync(e){throw Zt()}
  method accessPromise (line 9) | async accessPromise(){throw Zt()}
  method accessSync (line 9) | accessSync(){throw Zt()}
  method statPromise (line 9) | async statPromise(){throw Zt()}
  method statSync (line 9) | statSync(){throw Zt()}
  method fstatPromise (line 9) | async fstatPromise(e){throw Zt()}
  method fstatSync (line 9) | fstatSync(e){throw Zt()}
  method lstatPromise (line 9) | async lstatPromise(e){throw Zt()}
  method lstatSync (line 9) | lstatSync(e){throw Zt()}
  method fchmodPromise (line 9) | async fchmodPromise(){throw Zt()}
  method fchmodSync (line 9) | fchmodSync(){throw Zt()}
  method chmodPromise (line 9) | async chmodPromise(){throw Zt()}
  method chmodSync (line 9) | chmodSync(){throw Zt()}
  method fchownPromise (line 9) | async fchownPromise(){throw Zt()}
  method fchownSync (line 9) | fchownSync(){throw Zt()}
  method chownPromise (line 9) | async chownPromise(){throw Zt()}
  method chownSync (line 9) | chownSync(){throw Zt()}
  method mkdirPromise (line 9) | async mkdirPromise(){throw Zt()}
  method mkdirSync (line 9) | mkdirSync(){throw Zt()}
  method rmdirPromise (line 9) | async rmdirPromise(){throw Zt()}
  method rmdirSync (line 9) | rmdirSync(){throw Zt()}
  method rmPromise (line 9) | async rmPromise(){throw Zt()}
  method rmSync (line 9) | rmSync(){throw Zt()}
  method linkPromise (line 9) | async linkPromise(){throw Zt()}
  method linkSync (line 9) | linkSync(){throw Zt()}
  method symlinkPromise (line 9) | async symlinkPromise(){throw Zt()}
  method symlinkSync (line 9) | symlinkSync(){throw Zt()}
  method renamePromise (line 9) | async renamePromise(){throw Zt()}
  method renameSync (line 9) | renameSync(){throw Zt()}
  method copyFilePromise (line 9) | async copyFilePromise(){throw Zt()}
  method copyFileSync (line 9) | copyFileSync(){throw Zt()}
  method appendFilePromise (line 9) | async appendFilePromise(){throw Zt()}
  method appendFileSync (line 9) | appendFileSync(){throw Zt()}
  method writeFilePromise (line 9) | async writeFilePromise(){throw Zt()}
  method writeFileSync (line 9) | writeFileSync(){throw Zt()}
  method unlinkPromise (line 9) | async unlinkPromise(){throw Zt()}
  method unlinkSync (line 9) | unlinkSync(){throw Zt()}
  method utimesPromise (line 9) | async utimesPromise(){throw Zt()}
  method utimesSync (line 9) | utimesSync(){throw Zt()}
  method lutimesPromise (line 9) | async lutimesPromise(){throw Zt()}
  method lutimesSync (line 9) | lutimesSync(){throw Zt()}
  method readFilePromise (line 9) | async readFilePromise(){throw Zt()}
  method readFileSync (line 9) | readFileSync(){throw Zt()}
  method readlinkPromise (line 9) | async readlinkPromise(){throw Zt()}
  method readlinkSync (line 9) | readlinkSync(){throw Zt()}
  method truncatePromise (line 9) | async truncatePromise(){throw Zt()}
  method truncateSync (line 9) | truncateSync(){throw Zt()}
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){throw Zt()}
  method ftruncateSync (line 9) | ftruncateSync(e,r){throw Zt()}
  method watch (line 9) | watch(){throw Zt()}
  method watchFile (line 9) | watchFile(){throw Zt()}
  method unwatchFile (line 9) | unwatchFile(){throw Zt()}
  method constructor (line 9) | constructor(e){super(ue),this.baseFs=e}
  method mapFromBase (line 9) | mapFromBase(e){return ue.fromPortablePath(e)}
  method mapToBase (line 9) | mapToBase(e){return ue.toPortablePath(e)}
  method makeVirtualPath (line 9) | static makeVirtualPath(e,r,o){if(V.basename(e)!=="__virtual__")throw new...
  method resolveVirtual (line 9) | static resolveVirtual(e){let r=e.match(NR);if(!r||!r[3]&&r[5])return e;l...
  method constructor (line 9) | constructor({baseFs:e=new Tn}={}){super(V),this.baseFs=e}
  method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
  method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
  method realpathSync (line 9) | realpathSync(e){let r=e.match(NR);if(!r)return this.baseFs.realpathSync(...
  method realpathPromise (line 9) | async realpathPromise(e){let r=e.match(NR);if(!r)return await this.baseF...
  method mapToBase (line 9) | mapToBase(e){if(e==="")return e;if(this.pathUtils.isAbsolute(e))return t...
  method mapFromBase (line 9) | mapFromBase(e){return e}
  function T_e (line 9) | function T_e(t,e){return typeof LR.default.isUtf8<"u"?LR.default.isUtf8(...
  method constructor (line 9) | constructor(e){super(ue),this.baseFs=e}
  method mapFromBase (line 9) | mapFromBase(e){return e}
  method mapToBase (line 9) | mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0...
  method constructor (line 9) | constructor(e,r){this[tY]=1;this[eY]=void 0;this[$7]=void 0;this[Z7]=voi...
  method fd (line 9) | get fd(){return this[df]}
  method appendFile (line 9) | async appendFile(e,r){try{this[Nc](this.appendFile);let o=(typeof r=="st...
  method chown (line 9) | async chown(e,r){try{return this[Nc](this.chown),await this[Bo].fchownPr...
  method chmod (line 9) | async chmod(e){try{return this[Nc](this.chmod),await this[Bo].fchmodProm...
  method createReadStream (line 9) | createReadStream(e){return this[Bo].createReadStream(null,{...e,fd:this....
  method createWriteStream (line 9) | createWriteStream(e){return this[Bo].createWriteStream(null,{...e,fd:thi...
  method datasync (line 9) | datasync(){throw new Error("Method not implemented.")}
  method sync (line 9) | sync(){throw new Error("Method not implemented.")}
  method read (line 9) | async read(e,r,o,a){try{this[Nc](this.read);let n;return Buffer.isBuffer...
  method readFile (line 9) | async readFile(e){try{this[Nc](this.readFile);let r=(typeof e=="string"?...
  method readLines (line 9) | readLines(e){return(0,rY.createInterface)({input:this.createReadStream(e...
  method stat (line 9) | async stat(e){try{return this[Nc](this.stat),await this[Bo].fstatPromise...
  method truncate (line 9) | async truncate(e){try{return this[Nc](this.truncate),await this[Bo].ftru...
  method utimes (line 9) | utimes(e,r){throw new Error("Method not implemented.")}
  method writeFile (line 9) | async writeFile(e,r){try{this[Nc](this.writeFile);let o=(typeof r=="stri...
  method write (line 9) | async write(...e){try{if(this[Nc](this.write),ArrayBuffer.isView(e[0])){...
  method writev (line 9) | async writev(e,r){try{this[Nc](this.writev);let o=0;if(typeof r<"u")for(...
  method readv (line 9) | readv(e,r){throw new Error("Method not implemented.")}
  method close (line 9) | close(){if(this[df]===-1)return Promise.resolve();if(this[Hp])return thi...
  method [(Bo,df,tY=Yd,eY=Hp,$7=gD,Z7=dD,Nc)] (line 9) | [(Bo,df,tY=Yd,eY=Hp,$7=gD,Z7=dD,Nc)](e){if(this[df]===-1){let r=new Erro...
  method [Lc] (line 9) | [Lc](){if(this[Yd]--,this[Yd]===0){let e=this[df];this[df]=-1,this[Bo].c...
  function xw (line 9) | function xw(t,e){e=new hD(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?...
  function mD (line 9) | function mD(t,e){let r=Object.create(t);return xw(r,e),r}
  function oY (line 9) | function oY(t){let e=Math.ceil(Math.random()*4294967296).toString(16).pa...
  function aY (line 9) | function aY(){if(MR)return MR;let t=ue.toPortablePath(lY.default.tmpdir(...
  method detachTemp (line 9) | detachTemp(t){Mc.delete(t)}
  method mktempSync (line 9) | mktempSync(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY("xfs-");t...
  method mktempPromise (line 9) | async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY(...
  method rmtempPromise (line 9) | async rmtempPromise(){await Promise.all(Array.from(Mc.values()).map(asyn...
  method rmtempSync (line 9) | rmtempSync(){for(let t of Mc)try{oe.removeSync(t),Mc.delete(t)}catch{}}
  function L_e (line 9) | function L_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT...
  function AY (line 9) | function AY(t,e,r){return!t.isSymbolicLink()&&!t.isFile()?!1:L_e(e,r)}
  function fY (line 9) | function fY(t,e,r){uY.stat(t,function(o,a){r(o,o?!1:AY(a,t,e))})}
  function M_e (line 9) | function M_e(t,e){return AY(uY.statSync(t),t,e)}
  function dY (line 9) | function dY(t,e,r){gY.stat(t,function(o,a){r(o,o?!1:mY(a,e))})}
  function O_e (line 9) | function O_e(t,e){return mY(gY.statSync(t),e)}
  function mY (line 9) | function mY(t,e){return t.isFile()&&U_e(t,e)}
  function U_e (line 9) | function U_e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:pr...
  function OR (line 9) | function OR(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Pro...
  function __e (line 9) | function __e(t,e){try{return yD.sync(t,e||{})}catch(r){if(e&&e.ignoreErr...
  function FY (line 9) | function FY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.op...
  function Y_e (line 9) | function Y_e(t){return FY(t)||FY(t,!0)}
  function W_e (line 9) | function W_e(t){return t=t.replace(_R,"^$1"),t}
  function K_e (line 9) | function K_e(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.r...
  function J_e (line 9) | function J_e(t){let r=Buffer.alloc(150),o;try{o=qR.openSync(t,"r"),qR.re...
  function r8e (line 9) | function r8e(t){t.file=qY(t);let e=t.file&&Z_e(t.file);return e?(t.args....
  function n8e (line 9) | function n8e(t){if(!$_e)return t;let e=r8e(t),r=!e8e.test(e);if(t.option...
  function i8e (line 9) | function i8e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[]...
  function GR (line 9) | function GR(t,e){return Object.assign(new Error(`${e} ${t.command} ENOEN...
  function s8e (line 9) | function s8e(t,e){if(!jR)return;let r=t.emit;t.emit=function(o,a){if(o==...
  function WY (line 9) | function WY(t,e){return jR&&t===1&&!e.file?GR(e.original,"spawn"):null}
  function o8e (line 9) | function o8e(t,e){return jR&&t===1&&!e.file?GR(e.original,"spawnSync"):n...
  function JY (line 9) | function JY(t,e,r){let o=YR(t,e,r),a=zY.spawn(o.command,o.args,o.options...
  function a8e (line 9) | function a8e(t,e,r){let o=YR(t,e,r),a=zY.spawnSync(o.command,o.args,o.op...
  function l8e (line 9) | function l8e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function _0 (line 9) | function _0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 9) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 9) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 9) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 9) | function u(h){return r[h.type](h)}
  function A (line 9) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 9) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function c8e (line 9) | function c8e(t,e){e=e!==void 0?e:{};var r={},o={Start:u0},a=u0,n=functio...
  function CD (line 12) | function CD(t,e={isGlobPattern:()=>!1}){try{return(0,$Y.parse)(t,e)}catc...
  function zd (line 12) | function zd(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a...
  function wD (line 12) | function wD(t){return`${Jd(t.chain)}${t.then?` ${VR(t.then)}`:""}`}
  function VR (line 12) | function VR(t){return`${t.type} ${wD(t.line)}`}
  function Jd (line 12) | function Jd(t){return`${JR(t)}${t.then?` ${zR(t.then)}`:""}`}
  function zR (line 12) | function zR(t){return`${t.type} ${Jd(t.chain)}`}
  function JR (line 12) | function JR(t){switch(t.type){case"command":return`${t.envs.length>0?`${...
  function ED (line 12) | function ED(t){return`${t.name}=${t.args[0]?H0(t.args[0]):""}`}
  function XR (line 12) | function XR(t){switch(t.type){case"redirection":return Qw(t);case"argume...
  function Qw (line 12) | function Qw(t){return`${t.subtype} ${t.args.map(e=>H0(e)).join(" ")}`}
  function H0 (line 12) | function H0(t){return t.segments.map(e=>ZR(e)).join("")}
  function ZR (line 12) | function ZR(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?"''":o.match(/[()}<...
  function ID (line 12) | function ID(t){let e=a=>{switch(a){case"addition":return"+";case"subtrac...
  function f8e (line 13) | function f8e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function q0 (line 13) | function q0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 13) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 13) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 13) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 13) | function u(h){return r[h.type](h)}
  function A (line 13) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 13) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function p8e (line 13) | function p8e(t,e){e=e!==void 0?e:{};var r={},o={resolution:Fe},a=Fe,n="/...
  function BD (line 13) | function BD(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The...
  function vD (line 13) | function vD(t){let e="";return t.from&&(e+=t.from.fullName,t.from.descri...
  function aW (line 13) | function aW(t){return typeof t>"u"||t===null}
  function h8e (line 13) | function h8e(t){return typeof t=="object"&&t!==null}
  function g8e (line 13) | function g8e(t){return Array.isArray(t)?t:aW(t)?[]:[t]}
  function d8e (line 13) | function d8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r...
  function m8e (line 13) | function m8e(t,e){var r="",o;for(o=0;o<e;o+=1)r+=t;return r}
  function y8e (line 13) | function y8e(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}
  function Fw (line 13) | function Fw(t,e){Error.call(this),this.name="YAMLException",this.reason=...
  function $R (line 13) | function $R(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.li...
  function w8e (line 17) | function w8e(t){var e={};return t!==null&&Object.keys(t).forEach(functio...
  function I8e (line 17) | function I8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(E8e.i...
  function eT (line 17) | function eT(t,e,r){var o=[];return t.include.forEach(function(a){r=eT(a,...
  function v8e (line 17) | function v8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;...
  function Zd (line 17) | function Zd(t){this.include=t.include||[],this.implicit=t.implicit||[],t...
  function k8e (line 17) | function k8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~...
  function Q8e (line 17) | function Q8e(){return null}
  function F8e (line 17) | function F8e(t){return t===null}
  function T8e (line 17) | function T8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="...
  function N8e (line 17) | function N8e(t){return t==="true"||t==="True"||t==="TRUE"}
  function L8e (line 17) | function L8e(t){return Object.prototype.toString.call(t)==="[object Bool...
  function U8e (line 17) | function U8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}
  function _8e (line 17) | function _8e(t){return 48<=t&&t<=55}
  function H8e (line 17) | function H8e(t){return 48<=t&&t<=57}
  function q8e (line 17) | function q8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)ret...
  function j8e (line 17) | function j8e(t){var e=t,r=1,o,a,n=[];return e.indexOf("_")!==-1&&(e=e.re...
  function G8e (line 17) | function G8e(t){return Object.prototype.toString.call(t)==="[object Numb...
  function K8e (line 17) | function K8e(t){return!(t===null||!W8e.test(t)||t[t.length-1]==="_")}
  function V8e (line 17) | function V8e(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=...
  function J8e (line 17) | function J8e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".na...
  function X8e (line 17) | function X8e(t){return Object.prototype.toString.call(t)==="[object Numb...
  function tHe (line 17) | function tHe(t){return t===null?!1:TW.exec(t)!==null||NW.exec(t)!==null}
  function rHe (line 17) | function rHe(t){var e,r,o,a,n,u,A,p=0,h=null,E,I,v;if(e=TW.exec(t),e===n...
  function nHe (line 17) | function nHe(t){return t.toISOString()}
  function sHe (line 17) | function sHe(t){return t==="<<"||t===null}
  function aHe (line 18) | function aHe(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=nT;for(r=0...
  function lHe (line 18) | function lHe(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=nT,u=0,A...
  function cHe (line 18) | function cHe(t){var e="",r=0,o,a,n=t.length,u=nT;for(o=0;o<n;o++)o%3===0...
  function uHe (line 18) | function uHe(t){return W0&&W0.isBuffer(t)}
  function hHe (line 18) | function hHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A....
  function gHe (line 18) | function gHe(t){return t!==null?t:[]}
  function yHe (line 18) | function yHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u...
  function EHe (line 18) | function EHe(t){if(t===null)return[];var e,r,o,a,n,u=t;for(n=new Array(u...
  function IHe (line 18) | function IHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(wHe.call(r,...
  function BHe (line 18) | function BHe(t){return t!==null?t:{}}
  function PHe (line 18) | function PHe(){return!0}
  function bHe (line 18) | function bHe(){}
  function SHe (line 18) | function SHe(){return""}
  function xHe (line 18) | function xHe(t){return typeof t>"u"}
  function QHe (line 18) | function QHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)...
  function FHe (line 18) | function FHe(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&...
  function RHe (line 18) | function RHe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multi...
  function THe (line 18) | function THe(t){return Object.prototype.toString.call(t)==="[object RegE...
  function LHe (line 18) | function LHe(t){if(t===null)return!1;try{var e="("+t+")",r=bD.parse(e,{r...
  function MHe (line 18) | function MHe(t){var e="("+t+")",r=bD.parse(e,{range:!0}),o=[],a;if(r.typ...
  function OHe (line 18) | function OHe(t){return t.toString()}
  function UHe (line 18) | function UHe(t){return Object.prototype.toString.call(t)==="[object Func...
  function oK (line 18) | function oK(t){return Object.prototype.toString.call(t)}
  function ju (line 18) | function ju(t){return t===10||t===13}
  function V0 (line 18) | function V0(t){return t===9||t===32}
  function va (line 18) | function va(t){return t===9||t===32||t===10||t===13}
  function em (line 18) | function em(t){return t===44||t===91||t===93||t===123||t===125}
  function WHe (line 18) | function WHe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-9...
  function KHe (line 18) | function KHe(t){return t===120?2:t===117?4:t===85?8:0}
  function VHe (line 18) | function VHe(t){return 48<=t&&t<=57?t-48:-1}
  function aK (line 18) | function aK(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t==...
  function zHe (line 19) | function zHe(t){return t<=65535?String.fromCharCode(t):String.fromCharCo...
  function JHe (line 19) | function JHe(t,e){this.input=t,this.filename=e.filename||null,this.schem...
  function EK (line 19) | function EK(t,e){return new AK(e,new _He(t.filename,t.input,t.position,t...
  function br (line 19) | function br(t,e){throw EK(t,e)}
  function kD (line 19) | function kD(t,e){t.onWarning&&t.onWarning.call(null,EK(t,e))}
  function qp (line 19) | function qp(t,e,r,o){var a,n,u,A;if(e<r){if(A=t.input.slice(e,r),o)for(a...
  function cK (line 19) | function cK(t,e,r,o){var a,n,u,A;for(mf.isObject(r)||br(t,"cannot merge ...
  function tm (line 19) | function tm(t,e,r,o,a,n,u,A){var p,h;if(Array.isArray(a))for(a=Array.pro...
  function sT (line 19) | function sT(t){var e;e=t.input.charCodeAt(t.position),e===10?t.position+...
  function Wi (line 19) | function Wi(t,e,r){for(var o=0,a=t.input.charCodeAt(t.position);a!==0;){...
  function QD (line 19) | function QD(t){var e=t.position,r;return r=t.input.charCodeAt(e),!!((r==...
  function oT (line 19) | function oT(t,e){e===1?t.result+=" ":e>1&&(t.result+=mf.repeat(`
  function XHe (line 20) | function XHe(t,e,r){var o,a,n,u,A,p,h,E,I=t.kind,v=t.result,x;if(x=t.inp...
  function ZHe (line 20) | function ZHe(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)r...
  function $He (line 20) | function $He(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!...
  function e6e (line 20) | function e6e(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,I,v={},x,C,R,L...
  function t6e (line 20) | function t6e(t,e){var r,o,a=iT,n=!1,u=!1,A=e,p=0,h=!1,E,I;if(I=t.input.c...
  function uK (line 26) | function uK(t,e){var r,o=t.tag,a=t.anchor,n=[],u,A=!1,p;for(t.anchor!==n...
  function r6e (line 26) | function r6e(t,e,r){var o,a,n,u,A=t.tag,p=t.anchor,h={},E={},I=null,v=nu...
  function n6e (line 26) | function n6e(t){var e,r=!1,o=!1,a,n,u;if(u=t.input.charCodeAt(t.position...
  function i6e (line 26) | function i6e(t){var e,r;if(r=t.input.charCodeAt(t.position),r!==38)retur...
  function s6e (line 26) | function s6e(t){var e,r,o;if(o=t.input.charCodeAt(t.position),o!==42)ret...
  function rm (line 26) | function rm(t,e,r,o,a){var n,u,A,p=1,h=!1,E=!1,I,v,x,C,R;if(t.listener!=...
  function o6e (line 26) | function o6e(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.check...
  function CK (line 26) | function CK(t,e){t=String(t),e=e||{},t.length!==0&&(t.charCodeAt(t.lengt...
  function wK (line 27) | function wK(t,e,r){e!==null&&typeof e=="object"&&typeof r>"u"&&(r=e,e=nu...
  function IK (line 27) | function IK(t,e){var r=CK(t,e);if(r.length!==0){if(r.length===1)return r...
  function a6e (line 27) | function a6e(t,e,r){return typeof e=="object"&&e!==null&&typeof r>"u"&&(...
  function l6e (line 27) | function l6e(t,e){return IK(t,mf.extend({schema:fK},e))}
  function S6e (line 27) | function S6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Obje...
  function vK (line 27) | function vK(t){var e,r,o;if(e=t.toString(16).toUpperCase(),t<=255)r="x",...
  function x6e (line 27) | function x6e(t){this.schema=t.schema||c6e,this.indent=Math.max(1,t.inden...
  function DK (line 27) | function DK(t,e){for(var r=Lw.repeat(" ",e),o=0,a=-1,n="",u,A=t.length;o...
  function aT (line 29) | function aT(t,e){return`
  function k6e (line 30) | function k6e(t,e){var r,o,a;for(r=0,o=t.implicitTypes.length;r<o;r+=1)if...
  function cT (line 30) | function cT(t){return t===p6e||t===A6e}
  function nm (line 30) | function nm(t){return 32<=t&&t<=126||161<=t&&t<=55295&&t!==8232&&t!==823...
  function Q6e (line 30) | function Q6e(t){return nm(t)&&!cT(t)&&t!==65279&&t!==f6e&&t!==Nw}
  function PK (line 30) | function PK(t,e){return nm(t)&&t!==65279&&t!==TK&&t!==LK&&t!==MK&&t!==OK...
  function F6e (line 30) | function F6e(t){return nm(t)&&t!==65279&&!cT(t)&&t!==C6e&&t!==B6e&&t!==N...
  function _K (line 30) | function _K(t){var e=/^\n* /;return e.test(t)}
  function R6e (line 30) | function R6e(t,e,r,o,a){var n,u,A,p=!1,h=!1,E=o!==-1,I=-1,v=F6e(t.charCo...
  function T6e (line 30) | function T6e(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t...
  function bK (line 30) | function bK(t,e){var r=_K(t)?String(e):"",o=t[t.length-1]===`
  function SK (line 34) | function SK(t){return t[t.length-1]===`
  function N6e (line 35) | function N6e(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(`
  function xK (line 38) | function xK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0...
  function L6e (line 41) | function L6e(t){for(var e="",r,o,a,n=0;n<t.length;n++){if(r=t.charCodeAt...
  function M6e (line 41) | function M6e(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n<u;n+=1)z0(...
  function O6e (line 41) | function O6e(t,e,r,o){var a="",n=t.tag,u,A;for(u=0,A=r.length;u<A;u+=1)z...
  function U6e (line 41) | function U6e(t,e,r){var o="",a=t.tag,n=Object.keys(r),u,A,p,h,E;for(u=0,...
  function _6e (line 41) | function _6e(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,I,v;if(t...
  function kK (line 41) | function kK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTyp...
  function z0 (line 41) | function z0(t,e,r,o,a,n){t.tag=null,t.dump=r,kK(t,r,!1)||kK(t,r,!0);var ...
  function H6e (line 41) | function H6e(t,e){var r=[],o=[],a,n;for(lT(t,r,o),a=0,n=o.length;a<n;a+=...
  function lT (line 41) | function lT(t,e,r){var o,a,n;if(t!==null&&typeof t=="object")if(a=e.inde...
  function YK (line 41) | function YK(t,e){e=e||{};var r=new x6e(e);return r.noRefs||H6e(t,r),z0(r...
  function q6e (line 42) | function q6e(t,e){return YK(t,Lw.extend({schema:u6e},e))}
  function TD (line 42) | function TD(t){return function(){throw new Error("Function "+t+" is depr...
  function G6e (line 42) | function G6e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function J0 (line 42) | function J0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 42) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 42) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 42) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 42) | function u(h){return r[h.type](h)}
  function A (line 42) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 42) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function Y6e (line 42) | function Y6e(t,e){e=e!==void 0?e:{};var r={},o={Start:gu},a=gu,n=functio...
  function eV (line 51) | function eV(t){return t.match(W6e)?t:JSON.stringify(t)}
  function rV (line 51) | function rV(t){return typeof t>"u"?!0:typeof t=="object"&&t!==null&&!Arr...
  function AT (line 51) | function AT(t,e,r){if(t===null)return`null
  function Da (line 61) | function Da(t){try{let e=AT(t,0,!1);return e!==`
  function K6e (line 62) | function K6e(t){return t.endsWith(`
  function z6e (line 64) | function z6e(t){if(V6e.test(t))return K6e(t);let e=(0,LD.safeLoad)(t,{sc...
  function Ki (line 64) | function Ki(t){return z6e(t)}
  method constructor (line 64) | constructor(e){this.data=e}
  function aV (line 64) | function aV(t){return typeof t=="string"?!!cs[t]:"env"in t?cs[t.env]&&cs...
  method constructor (line 64) | constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageEr...
  method constructor (line 64) | constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanio...
  method constructor (line 75) | constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type...
  function Z6e (line 80) | function Z6e(t){let e=t.split(`
  function Do (line 82) | function Do(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,`
  function Ko (line 90) | function Ko(t){return{...t,[Uw]:!0}}
  function Gu (line 90) | function Gu(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&...
  function HD (line 90) | function HD(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(...
  function _w (line 90) | function _w(t,e){return e.length===1?new st(`${t}${HD(e[0],{mergeName:!0...
  function $0 (line 92) | function $0(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;...
  function qn (line 92) | function qn(t){return t===null?"null":t===void 0?"undefined":t===""?"an ...
  function sm (line 92) | function sm(t,e){if(t.length===0)return"nothing";if(t.length===1)return ...
  function Gp (line 92) | function Gp(t,e){var r,o,a;return typeof e=="number"?`${(r=t?.p)!==null&...
  function ET (line 92) | function ET(t,e,r){return t===1?e:r}
  function pr (line 92) | function pr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}
  function iqe (line 92) | function iqe(t,e){return r=>{t[e]=r}}
  function Wu (line 92) | function Wu(t,e){return r=>{let o=t[e];return t[e]=r,Wu(t,e).bind(null,o)}}
  function Hw (line 92) | function Hw(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}
  function CT (line 92) | function CT(){return Hr({test:(t,e)=>!0})}
  function pV (line 92) | function pV(t){return Hr({test:(e,r)=>e!==t?pr(r,`Expected ${qn(t)} (got...
  function om (line 92) | function om(){return Hr({test:(t,e)=>typeof t!="string"?pr(e,`Expected a...
  function Js (line 92) | function Js(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>ty...
  function oqe (line 92) | function oqe(){return Hr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(...
  function wT (line 92) | function wT(){return Hr({test:(t,e)=>{var r;if(typeof t!="number"){if(ty...
  function aqe (line 92) | function aqe(t){return Hr({test:(e,r)=>{var o;if(typeof r?.coercions>"u"...
  function lqe (line 92) | function lqe(){return Hr({test:(t,e)=>{var r;if(!(t instanceof Date)){if...
  function qD (line 92) | function qD(t,{delimiter:e}={}){return Hr({test:(r,o)=>{var a;let n=r;if...
  function cqe (line 92) | function cqe(t,{delimiter:e}={}){let r=qD(t,{delimiter:e});return Hr({te...
  function uqe (line 92) | function uqe(t,e){let r=qD(jD([t,e])),o=GD(e,{keys:t});return Hr({test:(...
  function jD (line 92) | function jD(t,{delimiter:e}={}){let r=dV(t.length);return Hr({test:(o,a)...
  function GD (line 92) | function GD(t,{keys:e=null}={}){let r=qD(jD([e??om(),t]));return Hr({tes...
  function Aqe (line 92) | function Aqe(t,e={}){return GD(t,e)}
  function hV (line 92) | function hV(t,{extra:e=null}={}){let r=Object.keys(t),o=Hr({test:(a,n)=>...
  function fqe (line 92) | function fqe(t){return hV(t,{extra:GD(CT())})}
  function gV (line 92) | function gV(t){return()=>t}
  function Hr (line 92) | function Hr({test:t}){return gV(t)()}
  function hqe (line 92) | function hqe(t,e){if(!e(t))throw new Yp}
  function gqe (line 92) | function gqe(t,e){let r=[];if(!e(t,{errors:r}))throw new Yp({errors:r})}
  function dqe (line 92) | function dqe(t,e){}
  function mqe (line 92) | function mqe(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if...
  function yqe (line 92) | function yqe(t,e){let r=jD(t);return(...o)=>{if(!r(o))throw new Yp;retur...
  function Eqe (line 92) | function Eqe(t){return Hr({test:(e,r)=>e.length>=t?!0:pr(r,`Expected to ...
  function Cqe (line 92) | function Cqe(t){return Hr({test:(e,r)=>e.length<=t?!0:pr(r,`Expected to ...
  function dV (line 92) | function dV(t){return Hr({test:(e,r)=>e.length!==t?pr(r,`Expected to hav...
  function wqe (line 92) | function wqe({map:t}={}){return Hr({test:(e,r)=>{let o=new Set,a=new Set...
  function Iqe (line 92) | function Iqe(){return Hr({test:(t,e)=>t<=0?!0:pr(e,`Expected to be negat...
  function Bqe (line 92) | function Bqe(){return Hr({test:(t,e)=>t>=0?!0:pr(e,`Expected to be posit...
  function BT (line 92) | function BT(t){return Hr({test:(e,r)=>e>=t?!0:pr(r,`Expected to be at le...
  function vqe (line 92) | function vqe(t){return Hr({test:(e,r)=>e<=t?!0:pr(r,`Expected to be at m...
  function Dqe (line 92) | function Dqe(t,e){return Hr({test:(r,o)=>r>=t&&r<=e?!0:pr(o,`Expected to...
  function Pqe (line 92) | function Pqe(t,e){return Hr({test:(r,o)=>r>=t&&r<e?!0:pr(o,`Expected to ...
  function vT (line 92) | function vT({unsafe:t=!1}={}){return Hr({test:(e,r)=>e!==Math.round(e)?p...
  function qw (line 92) | function qw(t){return Hr({test:(e,r)=>t.test(e)?!0:pr(r,`Expected to mat...
  function bqe (line 92) | function bqe(){return Hr({test:(t,e)=>t!==t.toLowerCase()?pr(e,`Expected...
  function Sqe (line 92) | function Sqe(){return Hr({test:(t,e)=>t!==t.toUpperCase()?pr(e,`Expected...
  function xqe (line 92) | function xqe(){return Hr({test:(t,e)=>nqe.test(t)?!0:pr(e,`Expected to b...
  function kqe (line 92) | function kqe(){return Hr({test:(t,e)=>fV.test(t)?!0:pr(e,`Expected to be...
  function Qqe (line 92) | function Qqe({alpha:t=!1}){return Hr({test:(e,r)=>(t?eqe.test(e):tqe.tes...
  function Fqe (line 92) | function Fqe(){return Hr({test:(t,e)=>rqe.test(t)?!0:pr(e,`Expected to b...
  function Rqe (line 92) | function Rqe(t=CT()){return Hr({test:(e,r)=>{let o;try{o=JSON.parse(e)}c...
  function YD (line 92) | function YD(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Hr({test:(o,...
  function jw (line 92) | function jw(t,...e){let r=Array.isArray(e[0])?e[0]:e;return YD(t,r)}
  function Tqe (line 92) | function Tqe(t){return Hr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}
  function Nqe (line 92) | function Nqe(t){return Hr({test:(e,r)=>e===null?!0:t(e,r)})}
  function Lqe (line 92) | function Lqe(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r...
  function DT (line 92) | function DT(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r!...
  function Mqe (line 92) | function Mqe(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r...
  function Oqe (line 92) | function Oqe(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r...
  function Yw (line 92) | function Yw(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==voi...
  method constructor (line 92) | constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=`
  method constructor (line 94) | constructor(){this.help=!1}
  method Usage (line 94) | static Usage(e){return e}
  method catch (line 94) | async catch(e){throw e}
  method validateAndExecute (line 94) | async validateAndExecute(){let r=this.constructor.schema;if(Array.isArra...
  function Pa (line 94) | function Pa(t){gT&&console.log(t)}
  function yV (line 94) | function yV(){let t={nodes:[]};for(let e=0;e<un.CustomNode;++e)t.nodes.p...
  function _qe (line 94) | function _qe(t){let e=yV(),r=[],o=e.nodes.length;for(let a of t){r.push(...
  function Oc (line 94) | function Oc(t,e){return t.nodes.push(e),t.nodes.length-1}
  function Hqe (line 94) | function Hqe(t){let e=new Set,r=o=>{if(e.has(o))return;e.add(o);let a=t....
  function qqe (line 94) | function qqe(t,{prefix:e=""}={}){if(gT){Pa(`${e}Nodes are:`);for(let r=0...
  function jqe (line 94) | function jqe(t,e,r=!1){Pa(`Running a vm on ${JSON.stringify(e)}`);let o=...
  function Gqe (line 94) | function Gqe(t,e,{endToken:r=Hn.EndOfInput}={}){let o=jqe(t,[...e,r]);re...
  function Yqe (line 94) | function Yqe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path....
  function Wqe (line 94) | function Wqe(t,e){let r=e.filter(v=>v.selectedIndex!==null),o=r.filter(v...
  function Kqe (line 94) | function Kqe(t){let e=[],r=[];for(let o of t)o.selectedIndex===Z0?r.push...
  function EV (line 94) | function EV(t,e,...r){return e===void 0?Array.from(t):EV(t.filter((o,a)=...
  function tl (line 94) | function tl(){return{dynamics:[],shortcuts:[],statics:{}}}
  function CV (line 94) | function CV(t){return t===un.SuccessNode||t===un.ErrorNode}
  function PT (line 94) | function PT(t,e=0){return{to:CV(t.to)?t.to:t.to>=un.CustomNode?t.to+e-un...
  function Vqe (line 94) | function Vqe(t,e=0){let r=tl();for(let[o,a]of t.dynamics)r.dynamics.push...
  function xs (line 94) | function xs(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}
  function am (line 94) | function am(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}
  function zo (line 94) | function zo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e]....
  function WD (line 94) | function WD(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,...
  method constructor (line 94) | constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trai...
  method addPath (line 94) | addPath(e){this.paths.push(e)}
  method setArity (line 94) | setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,ex...
  method addPositional (line 94) | addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra==...
  method addRest (line 94) | addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===rl)throw n...
  method addProxy (line 94) | addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}
  method addOption (line 94) | addOption({names:e,description:r,arity:o=0,hidden:a=!1,required:n=!1,all...
  method setContext (line 94) | setContext(e){this.context=e}
  method usage (line 94) | usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryN...
  method compile (line 94) | compile(){if(typeof this.context>"u")throw new Error("Assertion failed: ...
  method registerOptions (line 94) | registerOptions(e,r){xs(e,r,["isOption","--"],r,"inhibateOptions"),xs(e,...
  method constructor (line 94) | constructor({binaryName:e="..."}={}){this.builders=[],this.opts={binaryN...
  method build (line 94) | static build(e,r={}){return new t(r).commands(e).compile()}
  method getBuilderByIndex (line 94) | getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(...
  method commands (line 94) | commands(e){for(let r of e)r(this.command());return this}
  method command (line 94) | command(){let e=new ST(this.builders.length,this.opts);return this.build...
  method compile (line 94) | compile(){let e=[],r=[];for(let a of this.builders){let{machine:n,contex...
  function IV (line 94) | function IV(){return zD.default&&"getColorDepth"in zD.default.WriteStrea...
  function BV (line 94) | function BV(t){let e=wV;if(typeof e>"u"){if(t.stdout===process.stdout&&t...
  method constructor (line 94) | constructor(e){super(),this.contexts=e,this.commands=[]}
  method from (line 94) | static from(e,r){let o=new t(r);o.path=e.path;for(let a of e.options)swi...
  method execute (line 94) | async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index...
  function SV (line 98) | async function SV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,r...
  function xV (line 98) | async function xV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,r...
  function kV (line 98) | function kV(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.arg...
  function bV (line 98) | function bV(t){return t()}
  method constructor (line 98) | constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapt...
  method from (line 98) | static from(e,r={}){let o=new t(r),a=Array.isArray(e)?e:[e];for(let n of...
  method register (line 98) | register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeo...
  method process (line 98) | process(e,r){let{input:o,context:a,partial:n}=typeof e=="object"&&Array....
  method run (line 98) | async run(e,r){var o,a;let n,u={...t.defaultContext,...r},A=(o=this.enab...
  method runExit (line 98) | async runExit(e,r){process.exitCode=await this.run(e,r)}
  method definition (line 98) | definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=thi...
  method definitions (line 98) | definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations....
  method usage (line 98) | usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===nu...
  method error (line 124) | error(e,r){var o,{colored:a,command:n=(o=e[PV])!==null&&o!==void 0?o:nul...
  method format (line 127) | format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.d...
  method getUsageByRegistration (line 127) | getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>...
  method getUsageByIndex (line 127) | getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}
  method execute (line 127) | async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.def...
  method execute (line 128) | async execute(){this.context.stdout.write(this.cli.usage())}
  function XD (line 128) | function XD(t={}){return Ko({definition(e,r){var o;e.addProxy({name:(o=t...
  method constructor (line 128) | constructor(){super(...arguments),this.args=XD()}
  method execute (line 128) | async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.pro...
  method execute (line 129) | async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVer...
  function MV (line 130) | function MV(t,e,r){let[o,a]=Gu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=n...
  function UV (line 130) | function UV(t,e,r){let[o,a]=Gu(e,r??{}),n=t.split(","),u=new Set(n);retu...
  function HV (line 130) | function HV(t,e,r){let[o,a]=Gu(e,r??{}),n=t.split(","),u=new Set(n);retu...
  function jV (line 130) | function jV(t={}){return Ko({definition(e,r){var o;e.addRest({name:(o=t....
  function Jqe (line 130) | function Jqe(t,e,r){let[o,a]=Gu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=...
  function Xqe (line 130) | function Xqe(t={}){let{required:e=!0}=t;return Ko({definition(r,o){var a...
  function YV (line 130) | function YV(t,...e){return typeof t=="string"?Jqe(t,...e):Xqe(t)}
  function nje (line 130) | function nje(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,`
  function ije (line 132) | function ije(t){let e=XV(t),r=ks.configDotenv({path:e});if(!r.parsed)thr...
  function sje (line 132) | function sje(t){console.log(`[dotenv@${RT}][INFO] ${t}`)}
  function oje (line 132) | function oje(t){console.log(`[dotenv@${RT}][WARN] ${t}`)}
  function QT (line 132) | function QT(t){console.log(`[dotenv@${RT}][DEBUG] ${t}`)}
  function JV (line 132) | function JV(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KE...
  function aje (line 132) | function aje(t,e){let r;try{r=new URL(e)}catch(A){throw A.code==="ERR_IN...
  function XV (line 132) | function XV(t){let e=FT.resolve(process.cwd(),".env");return t&&t.path&&...
  function lje (line 132) | function lje(t){return t[0]==="~"?FT.join($qe.homedir(),t.slice(1)):t}
  function cje (line 132) | function cje(t){sje("Loading env from encrypted .env.vault");let e=ks._p...
  function uje (line 132) | function uje(t){let e=FT.resolve(process.cwd(),".env"),r="utf8",o=!!(t&&...
  function Aje (line 132) | function Aje(t){let e=XV(t);return JV(t).length===0?ks.configDotenv(t):z...
  function fje (line 132) | function fje(t,e){let r=Buffer.from(e.slice(-64),"hex"),o=Buffer.from(t,...
  function pje (line 132) | function pje(t,e,r={}){let o=!!(r&&r.debug),a=!!(r&&r.override);if(typeo...
  function Ku (line 132) | function Ku(t){return`YN${t.toString(10).padStart(4,"0")}`}
  function ZD (line 132) | function ZD(t){let e=Number(t.slice(2));if(typeof wr[e]>"u")throw new Er...
  method constructor (line 132) | constructor(e,r){if(r=Rje(r),e instanceof t){if(e.loose===!!r.loose&&e.i...
  method format (line 132) | format(){return this.version=`${this.major}.${this.minor}.${this.patch}`...
  method toString (line 132) | toString(){return this.version}
  method compare (line 132) | compare(e){if(tP("SemVer.compare",this.version,this.options,e),!(e insta...
  method compareMain (line 132) | compareMain(e){return e instanceof t||(e=new t(e,this.options)),cm(this....
  method comparePre (line 132) | comparePre(e){if(e instanceof t||(e=new t(e,this.options)),this.prerelea...
  method compareBuild (line 132) | compareBuild(e){e instanceof t||(e=new t(e,this.options));let r=0;do{let...
  method inc (line 132) | inc(e,r,o){switch(e){case"premajor":this.prerelease.length=0,this.patch=...
  function Cn (line 132) | function Cn(t){var e=this;if(e instanceof Cn||(e=new Cn),e.tail=null,e.h...
  function b5e (line 132) | function b5e(t,e,r){var o=e===t.head?new rg(r,null,e,t):new rg(r,e,e.nex...
  function S5e (line 132) | function S5e(t,e){t.tail=new rg(e,t.tail,null,t),t.head||(t.head=t.tail)...
  function x5e (line 132) | function x5e(t,e){t.head=new rg(e,null,t.head,t),t.tail||(t.tail=t.head)...
  function rg (line 132) | function rg(t,e,r,o){if(!(this instanceof rg))return new rg(t,e,r,o);thi...
  method constructor (line 132) | constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(type...
  method max (line 132) | set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a...
  method max (line 132) | get max(){return this[ng]}
  method allowStale (line 132) | set allowStale(e){this[tI]=!!e}
  method allowStale (line 132) | get allowStale(){return this[tI]}
  method maxAge (line 132) | set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be ...
  method maxAge (line 132) | get maxAge(){return this[ig]}
  method lengthCalculator (line 132) | set lengthCalculator(e){typeof e!="function"&&(e=qT),e!==this[um]&&(this...
  method lengthCalculator (line 132) | get lengthCalculator(){return this[um]}
  method length (line 132) | get length(){return this[If]}
  method itemCount (line 132) | get itemCount(){return this[Qs].length}
  method rforEach (line 132) | rforEach(e,r){r=r||this;for(let o=this[Qs].tail;o!==null;){let a=o.prev;...
  method forEach (line 132) | forEach(e,r){r=r||this;for(let o=this[Qs].head;o!==null;){let a=o.next;i...
  method keys (line 132) | keys(){return this[Qs].toArray().map(e=>e.key)}
  method values (line 132) | values(){return this[Qs].toArray().map(e=>e.value)}
  method reset (line 132) | reset(){this[wf]&&this[Qs]&&this[Qs].length&&this[Qs].forEach(e=>this[wf...
  method dump (line 132) | dump(){return this[Qs].map(e=>uP(this,e)?!1:{k:e.key,v:e.value,e:e.now+(...
  method dumpLru (line 132) | dumpLru(){return this[Qs]}
  method set (line 132) | set(e,r,o){if(o=o||this[ig],o&&typeof o!="number")throw new TypeError("m...
  method has (line 132) | has(e){if(!this[Uc].has(e))return!1;let r=this[Uc].get(e).value;return!u...
  method get (line 132) | get(e){return jT(this,e,!0)}
  method peek (line 132) | peek(e){return jT(this,e,!1)}
  method pop (line 132) | pop(){let e=this[Qs].tail;return e?(Am(this,e),e.value):null}
  method del (line 132) | del(e){Am(this,this[Uc].get(e))}
  method load (line 132) | load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let...
  method prune (line 132) | prune(){this[Uc].forEach((e,r)=>jT(this,r,!1))}
  method constructor (line 132) | constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,...
  method constructor (line 132) | constructor(e,r){if(r=F5e(r),e instanceof t)return e.loose===!!r.loose&&...
  method format (line 132) | format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||"...
  method toString (line 132) | toString(){return this.range}
  method parseRange (line 132) | parseRange(e){let o=((this.options.includePrerelease&&M5e)|(this.options...
  method intersects (line 132) | intersects(e,r){if(!(e instanceof t))throw new TypeError("a Range is req...
  method test (line 132) | test(e){if(!e)return!1;if(typeof e=="string")try{e=new R5e(e,this.option...
  method ANY (line 132) | static get ANY(){return nI}
  method constructor (line 132) | constructor(e,r){if(r=fJ(r),e instanceof t){if(e.loose===!!r.loose)retur...
  method parse (line 132) | parse(e){let r=this.options.loose?pJ[hJ.COMPARATORLOOSE]:pJ[hJ.COMPARATO...
  method toString (line 132) | toString(){return this.value}
  method test (line 132) | test(e){if(zT("Comparator.test",e,this.options.loose),this.semver===nI||...
  method intersects (line 132) | intersects(e,r){if(!(e instanceof t))throw new TypeError("a Comparator i...
  function f9e (line 132) | function f9e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function sg (line 132) | function sg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 132) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 132) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 132) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 132) | function u(h){return r[h.type](h)}
  function A (line 132) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 132) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function p9e (line 132) | function p9e(t,e){e=e!==void 0?e:{};var r={},o={Expression:y},a=y,n="|",...
  function g9e (line 134) | function g9e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}
  function d9e (line 134) | function d9e(){let t={},e=Object.keys(pP);for(let r=e.length,o=0;o<r;o++...
  function m9e (line 134) | function m9e(t){let e=d9e(),r=[t];for(e[t].distance=0;r.length;){let o=r...
  function y9e (line 134) | function y9e(t,e){return function(r){return e(t(r))}}
  function E9e (line 134) | function E9e(t,e){let r=[e[t].parent,t],o=pP[e[t].parent][t],a=e[t].pare...
  function I9e (line 134) | function I9e(t){let e=function(...r){let o=r[0];return o==null?o:(o.leng...
  function B9e (line 134) | function B9e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.le...
  function v9e (line 134) | function v9e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2...
  function sN (line 134) | function sN(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t...
  function oN (line 134) | function oN(t,e){if(Kp===0)return 0;if(Ol("color=16m")||Ol("color=full")...
  function P9e (line 134) | function P9e(t){let e=oN(t,t&&t.isTTY);return sN(e)}
  function IX (line 138) | function IX(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5|...
  function R9e (line 138) | function R9e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o...
  function T9e (line 138) | function T9e(t){CX.lastIndex=0;let e=[],r;for(;(r=CX.exec(t))!==null;){l...
  function wX (line 138) | function wX(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a...
  method constructor (line 138) | constructor(e){return PX(e)}
  function gP (line 138) | function gP(t){return PX(t)}
  method get (line 138) | get(){let r=dP(this,fN(e.open,e.close,this._styler),this._isEmpty);retur...
  method get (line 138) | get(){let t=dP(this,this._styler,!0);return Object.defineProperty(this,"...
  method get (line 138) | get(){let{level:e}=this;return function(...r){let o=fN(lI.color[DX[e]][t...
  method get (line 138) | get(){let{level:r}=this;return function(...o){let a=fN(lI.bgColor[DX[r]]...
  method get (line 138) | get(){return this._generator.level}
  method set (line 138) | set(t){this._generator.level=t}
  function H9e (line 139) | function H9e(t,e,r){let o=hN(t,e,"-",!1,r)||[],a=hN(e,t,"",!1,r)||[],n=h...
  function q9e (line 139) | function q9e(t,e){let r=1,o=1,a=LX(t,r),n=new Set([e]);for(;t<=a&&a<=e;)...
  function j9e (line 139) | function j9e(t,e,r){if(t===e)return{pattern:t,count:[],digits:0};let o=G...
  function TX (line 139) | function TX(t,e,r,o){let a=q9e(t,e),n=[],u=t,A;for(let p=0;p<a.length;p+...
  function hN (line 139) | function hN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!NX(...
  function G9e (line 139) | function G9e(t,e){let r=[];for(let o=0;o<t.length;o++)r.push([t[o],e[o]]...
  function Y9e (line 139) | function Y9e(t,e){return t>e?1:e>t?-1:0}
  function NX (line 139) | function NX(t,e,r){return t.some(o=>o[e]===r)}
  function LX (line 139) | function LX(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}
  function MX (line 139) | function MX(t,e){return t-t%Math.pow(10,e)}
  function OX (line 139) | function OX(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}
  function W9e (line 139) | function W9e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}
  function UX (line 139) | function UX(t){return/^-?(0+)\d/.test(t)}
  function K9e (line 139) | function K9e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-Stri...
  method extglobChars (line 140) | extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t....
  method globChars (line 140) | globChars(t){return t===!0?F7e:gZ}
  function rYe (line 140) | function rYe(){this.__data__=[],this.size=0}
  function nYe (line 140) | function nYe(t,e){return t===e||t!==t&&e!==e}
  function sYe (line 140) | function sYe(t,e){for(var r=t.length;r--;)if(iYe(t[r][0],e))return r;ret...
  function cYe (line 140) | function cYe(t){var e=this.__data__,r=oYe(e,t);if(r<0)return!1;var o=e.l...
  function AYe (line 140) | function AYe(t){var e=this.__data__,r=uYe(e,t);return r<0?void 0:e[r][1]}
  function pYe (line 140) | function pYe(t){return fYe(this.__data__,t)>-1}
  function gYe (line 140) | function gYe(t,e){var r=this.__data__,o=hYe(r,t);return o<0?(++this.size...
  function Em (line 140) | function Em(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){va...
  function IYe (line 140) | function IYe(){this.__data__=new wYe,this.size=0}
  function BYe (line 140) | function BYe(t){var e=this.__data__,r=e.delete(t);return this.size=e.siz...
  function vYe (line 140) | function vYe(t){return this.__data__.get(t)}
  function DYe (line 140) | function DYe(t){return this.__data__.has(t)}
  function TYe (line 140) | function TYe(t){var e=FYe.call(t,dI),r=t[dI];try{t[dI]=void 0;var o=!0}c...
  function MYe (line 140) | function MYe(t){return LYe.call(t)}
  function qYe (line 140) | function qYe(t){return t==null?t===void 0?HYe:_Ye:d$&&d$ in Object(t)?OY...
  function jYe (line 140) | function jYe(t){var e=typeof t;return t!=null&&(e=="object"||e=="functio...
  function JYe (line 140) | function JYe(t){if(!YYe(t))return!1;var e=GYe(t);return e==KYe||e==VYe||...
  function $Ye (line 140) | function $Ye(t){return!!I$&&I$ in t}
  function rWe (line 140) | function rWe(t){if(t!=null){try{return tWe.call(t)}catch{}try{return t+"...
  function hWe (line 140) | function hWe(t){if(!sWe(t)||iWe(t))return!1;var e=nWe(t)?pWe:lWe;return ...
  function gWe (line 140) | function gWe(t,e){return t?.[e]}
  function yWe (line 140) | function yWe(t,e){var r=mWe(t,e);return dWe(r)?r:void 0}
  function vWe (line 140) | function vWe(){this.__data__=R$?R$(null):{},this.size=0}
  function DWe (line 140) | function DWe(t){var e=this.has(t)&&delete this.__data__[t];return this.s...
  function kWe (line 140) | function kWe(t){var e=this.__data__;if(PWe){var r=e[t];return r===bWe?vo...
  function TWe (line 140) | function TWe(t){var e=this.__data__;return QWe?e[t]!==void 0:RWe.call(e,t)}
  function MWe (line 140) | function MWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,...
  function Cm (line 140) | function Cm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){va...
  function YWe (line 140) | function YWe(){this.size=0,this.__data__={hash:new W$,map:new(GWe||jWe),...
  function WWe (line 140) | function WWe(t){var e=typeof t;return e=="string"||e=="number"||e=="symb...
  function VWe (line 140) | function VWe(t,e){var r=t.__data__;return KWe(e)?r[typeof e=="string"?"s...
  function JWe (line 140) | function JWe(t){var e=zWe(this,t).delete(t);return this.size-=e?1:0,e}
  function ZWe (line 140) | function ZWe(t){return XWe(this,t).get(t)}
  function eKe (line 140) | function eKe(t){return $We(this,t).has(t)}
  function rKe (line 140) | function rKe(t,e){var r=tKe(this,t),o=r.size;return r.set(t,e),this.size...
  function wm (line 140) | function wm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){va...
  function fKe (line 140) | function fKe(t,e){var r=this.__data__;if(r instanceof lKe){var o=r.__dat...
  function Im (line 140) | function Im(t){var e=this.__data__=new pKe(t);this.size=e.size}
  function CKe (line 140) | function CKe(t){return this.__data__.set(t,EKe),this}
  function wKe (line 140) | function wKe(t){return this.__data__.has(t)}
  function SP (line 140) | function SP(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new IKe;+...
  function DKe (line 140) | function DKe(t,e){for(var r=-1,o=t==null?0:t.length;++r<o;)if(e(t[r],r,t...
  function PKe (line 140) | function PKe(t,e){return t.has(e)}
  function FKe (line 140) | function FKe(t,e,r,o,a,n){var u=r&kKe,A=t.length,p=e.length;if(A!=p&&!(u...
  function NKe (line 140) | function NKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){...
  function LKe (line 140) | function LKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[...
  function eVe (line 140) | function eVe(t,e,r,o,a,n,u){switch(r){case $Ke:if(t.byteLength!=e.byteLe...
  function tVe (line 140) | function tVe(t,e){for(var r=-1,o=e.length,a=t.length;++r<o;)t[a+r]=e[r];...
  function sVe (line 140) | function sVe(t,e,r){var o=e(t);return iVe(t)?o:nVe(o,r(t))}
  function oVe (line 140) | function oVe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r<o;){var...
  function aVe (line 140) | function aVe(){return[]}
  function pVe (line 140) | function pVe(t,e){for(var r=-1,o=Array(t);++r<t;)o[r]=e(r);return o}
  function hVe (line 140) | function hVe(t){return t!=null&&typeof t=="object"}
  function yVe (line 140) | function yVe(t){return dVe(t)&&gVe(t)==mVe}
  function BVe (line 140) | function BVe(){return!1}
  function QVe (line 140) | function QVe(t,e){var r=typeof t;return e=e??xVe,!!e&&(r=="number"||r!="...
  function RVe (line 140) | function RVe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=FVe}
  function aze (line 140) | function aze(t){return LVe(t)&&NVe(t.length)&&!!ui[TVe(t)]}
  function lze (line 140) | function lze(t){return function(e){return t(e)}}
  function Bze (line 140) | function Bze(t,e){var r=mze(t),o=!r&&dze(t),a=!r&&!o&&yze(t),n=!r&&!o&&!...
  function Dze (line 140) | function Dze(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototy...
  function Pze (line 140) | function Pze(t,e){return function(r){return t(e(r))}}
  function Rze (line 140) | function Rze(t){if(!xze(t))return kze(t);var e=[];for(var r in Object(t)...
  function Lze (line 140) | function Lze(t){return t!=null&&Nze(t.length)&&!Tze(t)}
  function _ze (line 140) | function _ze(t){return Uze(t)?Mze(t):Oze(t)}
  function Gze (line 140) | function Gze(t){return Hze(t,jze,qze)}
  function Vze (line 140) | function Vze(t,e,r,o,a,n){var u=r&Yze,A=mte(t),p=A.length,h=mte(e),E=h.l...
  function EJe (line 140) | function EJe(t,e,r,o,a,n){var u=Lte(t),A=Lte(e),p=u?Ute:Nte(t),h=A?Ute:N...
  function Gte (line 140) | function Gte(t,e,r,o,a){return t===e?!0:t==null||e==null||!jte(t)&&!jte(...
  function IJe (line 140) | function IJe(t,e){return wJe(t,e)}
  function DJe (line 140) | function DJe(t,e,r){e=="__proto__"&&Jte?Jte(t,e,{configurable:!0,enumera...
  function SJe (line 140) | function SJe(t,e,r){(r!==void 0&&!bJe(t[e],r)||r===void 0&&!(e in t))&&P...
  function xJe (line 140) | function xJe(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A...
  function TJe (line 140) | function TJe(t,e){if(e)return t.slice();var r=t.length,o=sre?sre(r):new ...
  function NJe (line 140) | function NJe(t){var e=new t.constructor(t.byteLength);return new are(e)....
  function MJe (line 140) | function MJe(t,e){var r=e?LJe(t.buffer):t.buffer;return new t.constructo...
  function OJe (line 140) | function OJe(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r<o;)e[r]=t[...
  function t (line 140) | function t(){}
  function WJe (line 140) | function WJe(t){return typeof t.constructor=="function"&&!YJe(t)?jJe(GJe...
  function zJe (line 140) | function zJe(t){return VJe(t)&&KJe(t)}
  function iXe (line 140) | function iXe(t){if(!ZJe(t)||JJe(t)!=$Je)return!1;var e=XJe(t);if(e===nul...
  function sXe (line 140) | function sXe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="...
  function uXe (line 140) | function uXe(t,e,r){var o=t[e];(!(cXe.call(t,e)&&aXe(o,r))||r===void 0&&...
  function pXe (line 140) | function pXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n<u;)...
  function hXe (line 140) | function hXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);ret...
  function CXe (line 140) | function CXe(t){if(!gXe(t))return mXe(t);var e=dXe(t),r=[];for(var o in ...
  function vXe (line 140) | function vXe(t){return BXe(t)?wXe(t,!0):IXe(t)}
  function bXe (line 140) | function bXe(t){return DXe(t,PXe(t))}
  function UXe (line 140) | function UXe(t,e,r,o,a,n,u){var A=Rre(t,r),p=Rre(e,r),h=u.get(p);if(h){k...
  function Lre (line 140) | function Lre(t,e,r,o,a){t!==e&&qXe(e,function(n,u){if(a||(a=new _Xe),GXe...
  function KXe (line 140) | function KXe(t){return t}
  function VXe (line 140) | function VXe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:retu...
  function JXe (line 140) | function JXe(t,e,r){return e=qre(e===void 0?t.length-1:e,0),function(){f...
  function XXe (line 140) | function XXe(t){return function(){return t}}
  function iZe (line 140) | function iZe(t){var e=0,r=0;return function(){var o=nZe(),a=rZe-(o-r);if...
  function AZe (line 140) | function AZe(t,e){return uZe(cZe(t,e,lZe),t+"")}
  function dZe (line 140) | function dZe(t,e,r){if(!gZe(r))return!1;var o=typeof e;return(o=="number...
  function EZe (line 140) | function EZe(t){return mZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1...
  function BZe (line 140) | function BZe(t){return!!(Ane.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9...
  function jP (line 140) | function jP(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}
  function vZe (line 140) | function vZe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}
  function DZe (line 140) | function DZe(t){}
  function cL (line 140) | function cL(t){throw new Error(`Assertion failed: Unexpected object '${t...
  function PZe (line 140) | function PZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new st(...
  function ol (line 140) | function ol(t,e){let r=[];for(let o of t){let a=e(o);a!==fne&&r.push(a)}...
  function zp (line 140) | function zp(t,e){for(let r of t){let o=e(r);if(o!==pne)return o}}
  function iL (line 140) | function iL(t){return typeof t=="object"&&t!==null}
  function _c (line 140) | async function _c(t){let e=await Promise.allSettled(t),r=[];for(let o of...
  function GP (line 140) | function GP(t){if(t instanceof Map&&(t=Object.fromEntries(t)),iL(t))for(...
  function al (line 140) | function al(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}
  function xI (line 140) | function xI(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}
  function Sm (line 140) | function Sm(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}
  function kI (line 140) | function kI(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}
  function bZe (line 140) | async function bZe(t,e){if(e==null)return await t();try{return await t()...
  function xm (line 140) | async function xm(t,e){try{return await t()}catch(r){throw r.message=e(r...
  function uL (line 140) | function uL(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}
  function km (line 140) | async function km(t){return await new Promise((e,r)=>{let o=[];t.on("err...
  function hne (line 140) | function hne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),reso...
  function gne (line 140) | function gne(t){return SI(ue.fromPortablePath(t))}
  function dne (line 140) | function dne(path){let physicalPath=ue.fromPortablePath(path),currentCac...
  function SZe (line 140) | function SZe(t){let e=one.get(t),r=oe.statSync(t);if(e?.mtime===r.mtimeM...
  function vf (line 140) | function vf(t,{cachingStrategy:e=2}={}){switch(e){case 0:return dne(t);c...
  function Fs (line 140) | function Fs(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];...
  function xZe (line 140) | function xZe(t){return t.length===0?null:t.map(e=>`(${cne.default.makeRe...
  function YP (line 140) | function YP(t,{env:e}){let r=/\${(?<variableName>[\d\w_]+)(?<colon>:)?(?...
  function QI (line 140) | function QI(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"...
  function yne (line 140) | function yne(t){return typeof t>"u"?t:QI(t)}
  function AL (line 140) | function AL(t){try{return yne(t)}catch{return null}}
  function kZe (line 140) | function kZe(t){return!!(ue.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}
  function Ene (line 140) | function Ene(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value...
  function QZe (line 140) | function QZe(...t){return Ene({},...t)}
  function FZe (line 140) | function FZe(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r...
  function Qm (line 140) | function Qm(t){return typeof t=="string"?Number.parseInt(t,10):t}
  method constructor (line 140) | constructor(){super(...arguments);this.chunks=[]}
  method _transform (line 140) | _transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("...
  method _flush (line 140) | _flush(r){r(null,Buffer.concat(this.chunks))}
  method constructor (line 140) | constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0...
  method set (line 140) | set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=...
  method reduce (line 140) | reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=...
  method wait (line 140) | async wait(){await Promise.all(this.promises.values())}
  method constructor (line 140) | constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}
  method _transform (line 140) | _transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("...
  method _flush (line 140) | _flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}
  function wne (line 140) | function wne(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1...
  function Hc (line 140) | function Hc(t,e){return[e,t]}
  function fg (line 140) | function fg(t,e,r){return t.get("enableColors")&&r&2&&(e=RI.default.bold...
  function Xs (line 140) | function Xs(t,e,r){if(!t.get("enableColors"))return e;let o=RZe.get(r);i...
  function Tm (line 140) | function Tm(t,e,r){return t.get("enableHyperlinks")?TZe?`\x1B]8;;${r}\x1...
  function Ot (line 140) | function Ot(t,e,r){if(e===null)return Xs(t,"null",yt.NULL);if(Object.has...
  function mL (line 140) | function mL(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Ot(t,a,r))....
  function pg (line 140) | function pg(t,e){if(t===null)return null;if(Object.hasOwn(WP,e))return W...
  function NZe (line 140) | function NZe(t,e,[r,o]){return t?pg(r,o):Ot(e,r,o)}
  function yL (line 140) | function yL(t){return{Check:Xs(t,"\u2713","green"),Cross:Xs(t,"\u2718","...
  function Xu (line 140) | function Xu(t,{label:e,value:[r,o]}){return`${Ot(t,e,yt.CODE)}: ${Ot(t,r...
  function zP (line 140) | function zP(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=...
  function TI (line 140) | function TI(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=n...
  function LZe (line 140) | function LZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}
  function MZe (line 140) | function MZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o]....
  function OZe (line 140) | function OZe(t){return t.code==="ENOENT"}
  method constructor (line 140) | constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),...
  function UZe (line 140) | function UZe(t,e){return new wL(t,e)}
  function KZe (line 140) | function KZe(t){return t.replace(/\\/g,"/")}
  function VZe (line 140) | function VZe(t,e){return HZe.resolve(t,e)}
  function zZe (line 140) | function zZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e===...
  function IL (line 140) | function IL(t){return t.replace(GZe,"\\$2")}
  function BL (line 140) | function BL(t){return t.replace(jZe,"\\$2")}
  function Sne (line 140) | function Sne(t){return IL(t).replace(YZe,"//$1").replace(WZe,"/")}
  function xne (line 140) | function xne(t){return BL(t)}
  function Une (line 140) | function Une(t,e={}){return!_ne(t,e)}
  function _ne (line 140) | function _ne(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.in...
  function g$e (line 140) | function g$e(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf(...
  function d$e (line 140) | function d$e(t){return $P(t)?t.slice(1):t}
  function m$e (line 140) | function m$e(t){return"!"+t}
  function $P (line 140) | function $P(t){return t.startsWith("!")&&t[1]!=="("}
  function Hne (line 140) | function Hne(t){return!$P(t)}
  function y$e (line 140) | function y$e(t){return t.filter($P)}
  function E$e (line 140) | function E$e(t){return t.filter(Hne)}
  function C$e (line 140) | function C$e(t){return t.filter(e=>!PL(e))}
  function w$e (line 140) | function w$e(t){return t.filter(PL)}
  function PL (line 140) | function PL(t){return t.startsWith("..")||t.startsWith("./..")}
  function I$e (line 140) | function I$e(t){return a$e(t,{flipBackslashes:!1})}
  function B$e (line 140) | function B$e(t){return t.includes(One)}
  function qne (line 140) | function qne(t){return t.endsWith("/"+One)}
  function v$e (line 140) | function v$e(t){let e=o$e.basename(t);return qne(t)||Une(e)}
  function D$e (line 140) | function D$e(t){return t.reduce((e,r)=>e.concat(jne(r)),[])}
  function jne (line 140) | function jne(t){let e=DL.braces(t,{expand:!0,nodupes:!0,keepEscaping:!0}...
  function P$e (line 140) | function P$e(t,e){let{parts:r}=DL.scan(t,Object.assign(Object.assign({},...
  function Gne (line 140) | function Gne(t,e){return DL.makeRe(t,e)}
  function b$e (line 140) | function b$e(t,e){return t.map(r=>Gne(r,e))}
  function S$e (line 140) | function S$e(t,e){return e.some(r=>r.test(t))}
  function x$e (line 140) | function x$e(t){return t.replace(h$e,"/")}
  function F$e (line 140) | function F$e(){let t=[],e=Q$e.call(arguments),r=!1,o=e[e.length-1];o&&!A...
  function Kne (line 140) | function Kne(t,e){if(Array.isArray(t))for(let r=0,o=t.length;r<o;r++)t[r...
  function T$e (line 140) | function T$e(t){let e=R$e(t);return t.forEach(r=>{r.once("error",o=>e.em...
  function Jne (line 140) | function Jne(t){t.forEach(e=>e.emit("close"))}
  function N$e (line 140) | function N$e(t){return typeof t=="string"}
  function L$e (line 140) | function L$e(t){return t===""}
  function G$e (line 140) | function G$e(t,e){let r=$ne(t,e),o=$ne(e.ignore,e),a=eie(r),n=tie(r,o),u...
  function $ne (line 140) | function $ne(t,e){let r=t;return e.braceExpansion&&(r=qc.pattern.expandP...
  function bL (line 140) | function bL(t,e,r){let o=[],a=qc.pattern.getPatternsOutsideCurrentDirect...
  function eie (line 140) | function eie(t){return qc.pattern.getPositivePatterns(t)}
  function tie (line 140) | function tie(t,e){return qc.pattern.getNegativePatterns(t).concat(e).map...
  function SL (line 140) | function SL(t){let e={};return t.reduce((r,o)=>{let a=qc.pattern.getBase...
  function xL (line 140) | function xL(t,e,r){return Object.keys(t).map(o=>kL(o,t[o],e,r))}
  function kL (line 140) | function kL(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patte...
  function Y$e (line 140) | function Y$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){nie(r,o);return}if...
  function nie (line 140) | function nie(t,e){t(e)}
  function QL (line 140) | function QL(t,e){t(null,e)}
  function W$e (line 140) | function W$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.fol...
  function K$e (line 140) | function K$e(t){return t===void 0?Jp.FILE_SYSTEM_ADAPTER:Object.assign(O...
  method constructor (line 140) | constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue...
  method _getValue (line 140) | _getValue(e,r){return e??r}
  function J$e (line 140) | function J$e(t,e,r){if(typeof e=="function"){lie.read(t,NL(),e);return}l...
  function X$e (line 140) | function X$e(t,e){let r=NL(e);return z$e.read(t,r)}
  function NL (line 140) | function NL(t={}){return t instanceof TL.default?t:new TL.default(t)}
  function $$e (line 140) | function $$e(t,e){let r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=O...
  method constructor (line 140) | constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),...
  function iet (line 140) | function iet(t,e){return new ML(t,e)}
  function oet (line 140) | function oet(t,e,r){return t.endsWith(r)?t+e:t+r+e}
  function uet (line 140) | function uet(t,e,r){if(!e.stats&&cet.IS_SUPPORT_READDIR_WITH_FILE_TYPES)...
  function Cie (line 140) | function Cie(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==nul...
  function Aet (line 140) | function Aet(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);re...
  function wie (line 140) | function wie(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){ub(r,o);return}l...
  function ub (line 140) | function ub(t,e){t(e)}
  function _L (line 140) | function _L(t,e){t(null,e)}
  function het (line 140) | function het(t,e){return!e.stats&&pet.IS_SUPPORT_READDIR_WITH_FILE_TYPES...
  function Die (line 140) | function Die(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{...
  function Pie (line 140) | function Pie(t,e){return e.fs.readdirSync(t).map(o=>{let a=vie.joinPathS...
  function get (line 140) | function get(t){return t===void 0?eh.FILE_SYSTEM_ADAPTER:Object.assign(O...
  method constructor (line 140) | constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValu...
  method _getValue (line 140) | _getValue(e,r){return e??r}
  function Cet (line 140) | function Cet(t,e,r){if(typeof e=="function"){kie.read(t,YL(),e);return}k...
  function wet (line 140) | function wet(t,e){let r=YL(e);return Eet.read(t,r)}
  function YL (line 140) | function YL(t={}){return t instanceof jL.default?t:new jL.default(t)}
  function Iet (line 140) | function Iet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.n...
  function Rie (line 140) | function Rie(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),!(r>=1))th...
  function Gl (line 140) | function Gl(){}
  function vet (line 140) | function vet(){this.value=null,this.callback=Gl,this.next=null,this.rele...
  function Det (line 140) | function Det(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);function o(E,...
  function Pet (line 140) | function Pet(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}
  function bet (line 140) | function bet(t,e){return t===null||t(e)}
  function xet (line 140) | function xet(t,e){return t.split(/[/\\]/).join(e)}
  function ket (line 140) | function ket(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._root=Qet.replacePat...
  method constructor (line 140) | constructor(e,r){super(e,r),this._settings=r,this._scandir=Ret.scandir,t...
  method read (line 140) | read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()...
  method isDestroyed (line 140) | get isDestroyed(){return this._isDestroyed}
  method destroy (line 140) | destroy(){if(this._isDestroyed)throw new Error("The reader is already de...
  method onEntry (line 140) | onEntry(e){this._emitter.on("entry",e)}
  method onError (line 140) | onError(e){this._emitter.once("error",e)}
  method onEnd (line 140) | onEnd(e){this._emitter.once("end",e)}
  method _pushToQueue (line 140) | _pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==...
  method _worker (line 140) | _worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,...
  method _handleError (line 140) | _handleError(e){this._isDestroyed||!pb.isFatalError(this._settings,e)||(...
  method _handleEntry (line 140) | _handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=...
  method _emitEntry (line 140) | _emitEntry(e){this._emitter.emit("entry",e)}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._reader=new Let.defa...
  method read (line 140) | read(e){this._reader.onError(r=>{Met(e,r)}),this._reader.onEntry(r=>{thi...
  function Met (line 140) | function Met(t,e){t(e)}
  function Oet (line 140) | function Oet(t,e){t(null,e)}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._reader=new _et.defa...
  method read (line 140) | read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),th...
  method constructor (line 140) | constructor(){super(...arguments),this._scandir=Het.scandirSync,this._st...
  method read (line 140) | read(){return this._pushToQueue(this._root,this._settings.basePath),this...
  method _pushToQueue (line 140) | _pushToQueue(e,r){this._queue.add({directory:e,base:r})}
  method _handleQueue (line 140) | _handleQueue(){for(let e of this._queue.values())this._handleDirectory(e...
  method _handleDirectory (line 140) | _handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandir...
  method _handleError (line 140) | _handleError(e){if(hb.isFatalError(this._settings,e))throw e}
  method _handleEntry (line 140) | _handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=hb.joinPathSegments(r...
  method _pushToStorage (line 140) | _pushToStorage(e){this._storage.push(e)}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._reader=new jet.defa...
  method read (line 140) | read(){return this._reader.read()}
  method constructor (line 140) | constructor(e={}){this._options=e,this.basePath=this._getValue(this._opt...
  method _getValue (line 140) | _getValue(e,r){return e??r}
  function Vet (line 140) | function Vet(t,e,r){if(typeof e=="function"){new _ie.default(t,gb()).rea...
  function zet (line 140) | function zet(t,e){let r=gb(e);return new Ket.default(t,r).read()}
  function Jet (line 140) | function Jet(t,e){let r=gb(e);return new Wet.default(t,r).read()}
  function gb (line 140) | function gb(t={}){return t instanceof cM.default?t:new cM.default(t)}
  method constructor (line 140) | constructor(e){this._settings=e,this._fsStatSettings=new Zet.Settings({f...
  method _getFullEntryPath (line 140) | _getFullEntryPath(e){return Xet.resolve(this._settings.cwd,e)}
  method _makeEntry (line 140) | _makeEntry(e,r){let o={name:r,path:r,dirent:Hie.fs.createDirentFromStats...
  method _isFatalError (line 140) | _isFatalError(e){return!Hie.errno.isEnoentCodeError(e)&&!this._settings....
  method constructor (line 140) | constructor(){super(...arguments),this._walkStream=ttt.walkStream,this._...
  method dynamic (line 140) | dynamic(e,r){return this._walkStream(e,r)}
  method static (line 140) | static(e,r){let o=e.map(this._getFullEntryPath,this),a=new $et.PassThrou...
  method _getEntry (line 140) | _getEntry(e,r,o){return this._getStat(e).then(a=>this._makeEntry(a,r)).c...
  method _getStat (line 140) | _getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings...
  method constructor (line 140) | constructor(){super(...arguments),this._walkAsync=ntt.walk,this._readerS...
  method dynamic (line 140) | dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===...
  method static (line 140) | async static(e,r){let o=[],a=this._readerStream.static(e,r);return new P...
  method constructor (line 140) | constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOpt...
  method _fillStorage (line 140) | _fillStorage(){for(let e of this._patterns){let r=this._getPatternSegmen...
  method _getPatternSegments (line 140) | _getPatternSegments(e){return LI.pattern.getPatternParts(e,this._microma...
  method _splitSegmentsIntoSections (line 140) | _splitSegmentsIntoSections(e){return LI.array.splitWhen(e,r=>r.dynamic&&...
  method match (line 140) | match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.comp...
  method constructor (line 140) | constructor(e,r){this._settings=e,this._micromatchOptions=r}
  method getFilter (line 140) | getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe...
  method _getMatcher (line 140) | _getMatcher(e){return new att.default(e,this._settings,this._micromatchO...
  method _getNegativePatternsRe (line 140) | _getNegativePatternsRe(e){let r=e.filter(yb.pattern.isAffectDepthOfReadi...
  method _filter (line 140) | _filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymb...
  method _isSkippedByDeep (line 140) | _isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntry...
  method _getEntryLevel (line 140) | _getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e...
  method _isSkippedSymbolicLink (line 140) | _isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.d...
  method _isSkippedByPositivePatterns (line 140) | _isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!...
  method _isSkippedByNegativePatterns (line 140) | _isSkippedByNegativePatterns(e,r){return!yb.pattern.matchAny(e,r)}
  method constructor (line 140) | constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=n...
  method getFilter (line 140) | getFilter(e,r){let o=gg.pattern.convertPatternsToRe(e,this._micromatchOp...
  method _filter (line 140) | _filter(e,r,o){let a=gg.path.removeLeadingDotSegment(e.path);if(this._se...
  method _isDuplicateEntry (line 140) | _isDuplicateEntry(e){return this.index.has(e)}
  method _createIndexRecord (line 140) | _createIndexRecord(e){this.index.set(e,void 0)}
  method _onlyFileFilter (line 140) | _onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}
  method _onlyDirectoryFilter (line 140) | _onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent...
  method _isSkippedByAbsoluteNegativePatterns (line 140) | _isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)re...
  method _isMatchToPatterns (line 140) | _isMatchToPatterns(e,r,o){let a=gg.pattern.matchAny(e,r);return!a&&o?gg....
  method constructor (line 140) | constructor(e){this._settings=e}
  method getFilter (line 140) | getFilter(){return e=>this._isNonFatalError(e)}
  method _isNonFatalError (line 140) | _isNonFatalError(e){return ltt.errno.isEnoentCodeError(e)||this._setting...
  method constructor (line 140) | constructor(e){this._settings=e}
  method getTransformer (line 140) | getTransformer(){return e=>this._transform(e)}
  method _transform (line 140) | _transform(e){let r=e.path;return this._settings.absolute&&(r=Vie.path.m...
  method constructor (line 140) | constructor(e){this._settings=e,this.errorFilter=new ftt.default(this._s...
  method _getRootDirectory (line 140) | _getRootDirectory(e){return ctt.resolve(this._settings.cwd,e.base)}
  method _getReaderOptions (line 140) | _getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,path...
  method _getMicromatchOptions (line 140) | _getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._se...
  method constructor (line 140) | constructor(){super(...arguments),this._reader=new htt.default(this._set...
  method read (line 140) | async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e...
  method api (line 140) | api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.stati...
  method constructor (line 140) | constructor(){super(...arguments),this._reader=new mtt.default(this._set...
  method read (line 140) | read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=th...
  method api (line 140) | api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.stati...
  method constructor (line 140) | constructor(){super(...arguments),this._walkSync=Ctt.walkSync,this._stat...
  method dynamic (line 140) | dynamic(e,r){return this._walkSync(e,r)}
  method static (line 140) | static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=t...
  method _getEntry (line 140) | _getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}...
  method _getStat (line 140) | _getStat(e){return this._statSync(e,this._fsStatSettings)}
  method constructor (line 140) | constructor(){super(...arguments),this._reader=new Itt.default(this._set...
  method read (line 140) | read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);retu...
  method api (line 140) | api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.stati...
  method constructor (line 140) | constructor(e={}){this._options=e,this.absolute=this._getValue(this._opt...
  method _getValue (line 140) | _getValue(e,r){return e===void 0?r:e}
  method _getFileSystemMethods (line 140) | _getFileSystemMethods(e={}){return Object.assign(Object.assign({},Um.DEF...
  function HM (line 140) | async function HM(t,e){jc(t);let r=qM(t,Ptt.default,e),o=await Promise.a...
  function e (line 140) | function e(h,E){jc(h);let I=qM(h,Stt.default,E);return Yl.array.flatten(I)}
    method constructor (line 227) | constructor(o){super(o)}
    method submit (line 227) | async submit(){this.value=await t.call(this,this.values,this.state),su...
    method create (line 227) | static create(o){return Ghe(o)}
  function r (line 140) | function r(h,E){jc(h);let I=qM(h,btt.default,E);return Yl.stream.merge(I)}
    method constructor (line 227) | constructor(a){super({...a,choices:e})}
    method create (line 227) | static create(a){return Whe(a)}
  function o (line 140) | function o(h,E){jc(h);let I=[].concat(h),v=new _M.default(E);return tse....
  function a (line 140) | function a(h,E){jc(h);let I=new _M.default(E);return Yl.pattern.isDynami...
  function n (line 140) | function n(h){return jc(h),Yl.path.escape(h)}
  function u (line 140) | function u(h){return jc(h),Yl.path.convertPathToPattern(h)}
  function E (line 140) | function E(v){return jc(v),Yl.path.escapePosixPath(v)}
  function I (line 140) | function I(v){return jc(v),Yl.path.convertPosixPathToPattern(v)}
  function E (line 140) | function E(v){return jc(v),Yl.path.escapeWindowsPath(v)}
  function I (line 140) | function I(v){return jc(v),Yl.path.convertWindowsPathToPattern(v)}
  function qM (line 140) | function qM(t,e,r){let o=[].concat(t),a=new _M.default(r),n=tse.generate...
  function jc (line 140) | function jc(t){if(![].concat(t).every(o=>Yl.string.isString(o)&&!Yl.stri...
  function zi (line 140) | function zi(...t){let e=(0,wb.createHash)("sha512"),r="";for(let o of t)...
  function Ib (line 140) | async function Ib(t,{baseFs:e,algorithm:r}={baseFs:oe,algorithm:"sha512"...
  function Bb (line 140) | async function Bb(t,{cwd:e}){let o=(await(0,jM.default)(t,{cwd:ue.fromPo...
  function eA (line 140) | function eA(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: d...
  function In (line 140) | function In(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,...
  function Rs (line 140) | function Rs(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,...
  function Qtt (line 140) | function Qtt(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}
  function vb (line 140) | function vb(t){return{identHash:t.identHash,scope:t.scope,name:t.name,lo...
  function YM (line 140) | function YM(t){return{identHash:t.identHash,scope:t.scope,name:t.name,de...
  function Ftt (line 140) | function Ftt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,l...
  function WM (line 140) | function WM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,...
  function OI (line 140) | function OI(t){return WM(t,t)}
  function KM (line 140) | function KM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");r...
  function VM (line 140) | function VM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");r...
  function Pf (line 140) | function Pf(t){return t.range.startsWith(MI)}
  function Gc (line 140) | function Gc(t){return t.reference.startsWith(MI)}
  function UI (line 140) | function UI(t){if(!Pf(t))throw new Error("Not a virtual descriptor");ret...
  function _I (line 140) | function _I(t){if(!Gc(t))throw new Error("Not a virtual descriptor");ret...
  function Rtt (line 140) | function Rtt(t){return Pf(t)?In(t,t.range.replace(Db,"")):t}
  function Ttt (line 140) | function Ttt(t){return Gc(t)?Rs(t,t.reference.replace(Db,"")):t}
  function Ntt (line 140) | function Ntt(t,e){return t.range.includes("::")?t:In(t,`${t.range}::${_m...
  function Ltt (line 140) | function Ltt(t,e){return t.reference.includes("::")?t:Rs(t,`${t.referenc...
  function HI (line 140) | function HI(t,e){return t.identHash===e.identHash}
  function ase (line 140) | function ase(t,e){return t.descriptorHash===e.descriptorHash}
  function qI (line 140) | function qI(t,e){return t.locatorHash===e.locatorHash}
  function Mtt (line 140) | function Mtt(t,e){if(!Gc(t))throw new Error("Invalid package type");if(!...
  function ea (line 140) | function ea(t){let e=lse(t);if(!e)throw new Error(`Invalid ident (${t})`...
  function lse (line 140) | function lse(t){let e=t.match(Ott);if(!e)return null;let[,r,o]=e;return ...
  function nh (line 140) | function nh(t,e=!1){let r=jI(t,e);if(!r)throw new Error(`Invalid descrip...
  function jI (line 140) | function jI(t,e=!1){let r=e?t.match(Utt):t.match(_tt);if(!r)return null;...
  function bf (line 140) | function bf(t,e=!1){let r=Pb(t,e);if(!r)throw new Error(`Invalid locator...
  function Pb (line 140) | function Pb(t,e=!1){let r=e?t.match(Htt):t.match(qtt);if(!r)return null;...
  function dg (line 140) | function dg(t,e){let r=t.match(jtt);if(r===null)throw new Error(`Invalid...
  function Gtt (line 140) | function Gtt(t,e){try{return dg(t,e)}catch{return null}}
  function Ytt (line 140) | function Ytt(t,{protocol:e}){let{selector:r,params:o}=dg(t,{requireProto...
  function nse (line 140) | function nse(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A...
  function Wtt (line 140) | function Wtt(t){return t===null?!1:Object.entries(t).length>0}
  function bb (line 140) | function bb({protocol:t,source:e,selector:r,params:o}){let a="";return t...
  function Ktt (line 140) | function Ktt(t){let{params:e,protocol:r,source:o,selector:a}=dg(t);for(l...
  function rn (line 140) | function rn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}
  function xa (line 140) | function xa(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.na...
  function ka (line 140) | function ka(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${...
  function GM (line 140) | function GM(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}
  function Hm (line 140) | function Hm(t){let{protocol:e,selector:r}=dg(t.reference),o=e!==null?e.r...
  function Oi (line 140) | function Oi(t,e){return e.scope?`${Ot(t,`@${e.scope}/`,yt.SCOPE)}${Ot(t,...
  function Sb (line 140) | function Sb(t){if(t.startsWith(MI)){let e=Sb(t.substring(t.indexOf("#")+...
  function qm (line 140) | function qm(t,e){return`${Ot(t,Sb(e),yt.RANGE)}`}
  function jn (line 140) | function jn(t,e){return`${Oi(t,e)}${Ot(t,"@",yt.RANGE)}${qm(t,e.range)}`}
  function GI (line 140) | function GI(t,e){return`${Ot(t,Sb(e),yt.REFERENCE)}`}
  function qr (line 140) | function qr(t,e){return`${Oi(t,e)}${Ot(t,"@",yt.REFERENCE)}${GI(t,e.refe...
  function EL (line 140) | function EL(t){return`${rn(t)}@${Sb(t.reference)}`}
  function jm (line 140) | function jm(t){return Fs(t,[e=>rn(e),e=>e.range])}
  function YI (line 140) | function YI(t,e){return Oi(t,e.anchoredLocator)}
  function NI (line 140) | function NI(t,e,r){let o=Pf(e)?UI(e):e;return r===null?`${jn(t,o)} \u219...
  function CL (line 140) | function CL(t,e,r){return r===null?`${qr(t,e)}`:`${qr(t,e)} (via ${qm(t,...
  function zM (line 140) | function zM(t){return`node_modules/${rn(t)}`}
  function xb (line 140) | function xb(t,e){return t.conditions?ktt(t.conditions,r=>{let[,o,a]=r.ma...
  function WI (line 140) | function WI(t){let e=new Set;if("children"in t)e.add(t);else for(let r o...
  method supportsDescriptor (line 140) | supportsDescriptor(e,r){return!!(e.range.startsWith(t.protocol)||r.proje...
  method supportsLocator (line 140) | supportsLocator(e,r){return!!e.reference.startsWith(t.protocol)}
  method shouldPersistResolution (line 140) | shouldPersistResolution(e,r){return!1}
  method bindDescriptor (line 140) | bindDescriptor(e,r,o){return e}
  method getResolutionDependencies (line 140) | getResolutionDependencies(e,r){return{}}
  method getCandidates (line 140) | async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e)....
  method getSatisfying (line 140) | async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);retu...
  method resolve (line 140) | async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(t...
  function tA (line 140) | function tA(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=Ase.get(o);if(ty...
  function Qa (line 140) | function Qa(t){if(t.indexOf(":")!==-1)return null;let e=fse.get(t);if(ty...
  function Xtt (line 140) | function Xtt(t){let e=Jtt.exec(t);return e?e[1]:null}
  function pse (line 140) | function pse(t){if(t.semver===Sf.default.Comparator.ANY)return{gt:null,l...
  function JM (line 140) | function JM(t){if(t.length===0)return null;let e=null,r=null;for(let o o...
  function hse (line 140) | function hse(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1...
  function XM (line 140) | function XM(t){let e=t.map(Ztt).map(o=>Qa(o).set.map(a=>a.map(n=>pse(n))...
  function Ztt (line 140) | function Ztt(t){let e=t.split("||");if(e.length>1){let r=new Set;for(let...
  function dse (line 140) | function dse(t){let e=t.match(/^[ \t]+/m);return e?e[0]:"  "}
  function mse (line 140) | function mse(t){return t.charCodeAt(0)===65279?t.slice(1):t}
  function ta (line 140) | function ta(t){return t.replace(/\\/g,"/")}
  function kb (line 140) | function kb(t,{yamlCompatibilityMode:e}){return e?AL(t):typeof t>"u"||ty...
  function yse (line 140) | function yse(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o...
  function ZM (line 140) | function ZM(t,e){return e.length===1?yse(t,e[0]):`(${e.map(r=>yse(t,r))....
  method constructor (line 140) | constructor(){this.indent="  ";this.name=null;this.version=null;this.os=...
  method tryFind (line 140) | static async tryFind(e,{baseFs:r=new Tn}={}){let o=V.join(e,"package.jso...
  method find (line 140) | static async find(e,{baseFs:r}={}){let o=await t.tryFind(e,{baseFs:r});i...
  method fromFile (line 140) | static async fromFile(e,{baseFs:r=new Tn}={}){let o=new t;return await o...
  method fromText (line 140) | static fromText(e){let r=new t;return r.loadFromText(e),r}
  method loadFromText (line 140) | loadFromText(e){let r;try{r=JSON.parse(mse(e)||"{}")}catch(o){throw o.me...
  method loadFile (line 140) | async loadFile(e,{baseFs:r=new Tn}){let o=await r.readFilePromise(e,"utf...
  method load (line 140) | load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)...
  method getForScope (line 140) | getForScope(e){switch(e){case"dependencies":return this.dependencies;cas...
  method hasConsumerDependency (line 140) | hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||th...
  method hasHardDependency (line 140) | hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.d...
  method hasSoftDependency (line 140) | hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}
  method hasDependency (line 140) | hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDepende...
  method getConditions (line 140) | getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(ZM("os...
  method ensureDependencyMeta (line 140) | ensureDependencyMeta(e){if(e.range!=="unknown"&&!Ese.default.valid(e.ran...
  method ensurePeerDependencyMeta (line 140) | ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Inva...
  method setRawField (line 140) | setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn...
  method exportTo (line 140) | exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),thi...
  function rrt (line 140) | function rrt(t){for(var e=t.length;e--&&trt.test(t.charAt(e)););return e}
  function srt (line 140) | function srt(t){return t&&t.slice(0,nrt(t)+1).replace(irt,"")}
  function crt (line 140) | function crt(t){return typeof t=="symbol"||art(t)&&ort(t)==lrt}
  function drt (line 140) | function drt(t){if(typeof t=="number")return t;if(Art(t))return Sse;if(b...
  function wrt (line 140) | function wrt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,I=!1,v=!0;if(typeof t!="fun...
  function Drt (line 140) | function Drt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new Type...
  function brt (line 140) | function brt(t){return typeof t.reportCode<"u"}
  method constructor (line 140) | constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}
  method constructor (line 140) | constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.repor...
  method getRecommendedLength (line 140) | getRecommendedLength(){return 180}
  method reportCacheHit (line 140) | reportCacheHit(e){this.cacheHits.add(e.locatorHash)}
  method reportCacheMiss (line 140) | reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}
  method progressViaCounter (line 140) | static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let...
  method progressViaTitle (line 140) | static progressViaTitle(){let e,r,o=new Promise(u=>{r=u}),a=(0,Nse.defau...
  method startProgressPromise (line 140) | async startProgressPromise(e,r){let o=this.reportProgress(e);try{return ...
  method startProgressSync (line 140) | startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}fina...
  method reportInfoOnce (line 140) | reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||...
  method reportWarningOnce (line 140) | reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.ha...
  method reportErrorOnce (line 140) | reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)...
  method reportExceptionOnce (line 140) | reportExceptionOnce(e){brt(e)?this.reportErrorOnce(e.reportCode,e.messag...
  method createStreamReporter (line 140) | createStreamReporter(e=null){let r=new Lse.PassThrough,o=new Mse.StringD...
  method constructor (line 141) | constructor(e){this.fetchers=e}
  method supports (line 141) | supports(e,r){return!!this.tryFetcher(e,r)}
  method getLocalPath (line 141) | getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}
  method fetch (line 141) | async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}
  method tryFetcher (line 141) | tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||n...
  method getFetcher (line 141) | getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw...
  method constructor (line 141) | constructor(e){this.resolvers=e.filter(r=>r)}
  method supportsDescriptor (line 141) | supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}
  method supportsLocator (line 141) | supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}
  method shouldPersistResolution (line 141) | shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shoul...
  method bindDescriptor (line 141) | bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescr...
  method getResolutionDependencies (line 141) | getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r)....
  method getCandidates (line 141) | async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o...
  method getSatisfying (line 141) | async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).ge...
  method resolve (line 141) | async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e...
  method tryResolverByDescriptor (line 141) | tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDesc...
  method getResolverByDescriptor (line 141) | getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDesc...
  method tryResolverByLocator (line 141) | tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator...
  method getResolverByLocator (line 141) | getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator...
  method supports (line 141) | supports(e){return!!e.reference.startsWith("virtual:")}
  method getLocalPath (line 141) | getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Err...
  method fetch (line 141) | async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Erro...
  method getLocatorFilename (line 141) | getLocatorFilename(e){return Hm(e)}
  method ensureVirtualLink (line 141) | async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.proje...
  method isVirtualDescriptor (line 141) | static isVirtualDescriptor(e){return!!e.range.startsWith(t.protocol)}
  method isVirtualLocator (line 141) | static isVirtualLocator(e){return!!e.reference.startsWith(t.protocol)}
  method supportsDescriptor (line 141) | supportsDescriptor(e,r){return t.isVirtualDescriptor(e)}
  method supportsLocator (line 141) | supportsLocator(e,r){return t.isVirtualLocator(e)}
  method shouldPersistResolution (line 141) | shouldPersistResolution(e,r){return!1}
  method bindDescriptor (line 141) | bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDe...
  method getResolutionDependencies (line 141) | getResolutionDependencies(e,r){throw new Error('Assertion failed: callin...
  method getCandidates (line 141) | async getCandidates(e,r,o){throw new Error('Assertion failed: calling "g...
  method getSatisfying (line 141) | async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling ...
  method resolve (line 141) | async resolve(e,r){throw new Error('Assertion failed: calling "resolve" ...
  method supports (line 141) | supports(e){return!!e.reference.startsWith(ei.protocol)}
  method getLocalPath (line 141) | getLocalPath(e,r){return this.getWorkspace(e,r).cwd}
  method fetch (line 141) | async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new g...
  method getWorkspace (line 141) | getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(e...
  function KI (line 141) | function KI(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}
  function Use (line 141) | function Use(t){return typeof t>"u"?3:KI(t)?0:Array.isArray(t)?1:2}
  function aO (line 141) | function aO(t,e){return Object.hasOwn(t,e)}
  function xrt (line 141) | function xrt(t){return KI(t)&&aO(t,"onConflict")&&typeof t.onConflict=="...
  function krt (line 141) | function krt(t){if(typeof t>"u")return{onConflict:"default",value:t};if(...
  function _se (line 141) | function _se(t,e){let r=KI(t)&&aO(t,e)?t[e]:void 0;return krt(r)}
  function zm (line 141) | function zm(t,e){return[t,e,Hse]}
  function lO (line 141) | function lO(t){return Array.isArray(t)?t[2]===Hse:!1}
  function sO (line 141) | function sO(t,e){if(KI(t)){let r={};for(let o of Object.keys(t))r[o]=sO(...
  function oO (line 141) | function oO(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[I,...
  function qse (line 141) | function qse(t){return oO(t.map(([e,r])=>[e,{".":r}]),[],".",0,t.length)}
  function VI (line 141) | function VI(t){return lO(t)?t[1]:t}
  function Fb (line 141) | function Fb(t){let e=lO(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>Fb...
  function cO (line 141) | function cO(t){return lO(t)?t[0]:null}
  function AO (line 141) | function AO(){if(process.platform==="win32"){let t=ue.toPortablePath(pro...
  function Jm (line 141) | function Jm(){return ue.toPortablePath((0,uO.homedir)()||"/usr/local/sha...
  function fO (line 141) | function fO(t,e){let r=V.relative(e,t);return r&&!r.startsWith("..")&&!V...
  function Nrt (line 141) | function Nrt(t){var e=new kf(t);return e.request=pO.request,e}
  function Lrt (line 141) | function Lrt(t){var e=new kf(t);return e.request=pO.request,e.createSock...
  function Mrt (line 141) | function Mrt(t){var e=new kf(t);return e.request=Gse.request,e}
  function Ort (line 141) | function Ort(t){var e=new kf(t);return e.request=Gse.request,e.createSoc...
  function kf (line 141) | function kf(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy...
  function p (line 141) | function p(){n.emit("free",A,u)}
  function h (line 141) | function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListe...
  function A (line 141) | function A(I){I.upgrade=!0}
  function p (line 141) | function p(I,v,x){process.nextTick(function(){h(I,v,x)})}
  function h (line 141) | function h(I,v,x){if(u.removeAllListeners(),v.removeAllListeners(),I.sta...
  function E (line 141) | function E(I){u.removeAllListeners(),ih(`tunneling socket could not be e...
  function Yse (line 142) | function Yse(t,e){var r=this;kf.prototype.createSocket.call(r,t,function...
  function Wse (line 142) | function Wse(t,e,r){return typeof t=="string"?{host:t,port:e,localAddres...
  function hO (line 142) | function hO(t){for(var e=1,r=arguments.length;e<r;++e){var o=arguments[e...
  function Urt (line 142) | function Urt(t){return Jse.includes(t)}
  function Hrt (line 142) | function Hrt(t){return _rt.includes(t)}
  function jrt (line 142) | function jrt(t){return qrt.includes(t)}
  function Zm (line 142) | function Zm(t){return e=>typeof e===t}
  function Pe (line 142) | function Pe(t){if(t===null)return"null";switch(typeof t){case"undefined"...
  method constructor (line 142) | constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}
  method isCanceled (line 142) | get isCanceled(){return!0}
  method fn (line 142) | static fn(e){return(...r)=>new t((o,a,n)=>{r.push(n),e(...r).then(o,a)})}
  method constructor (line 142) | constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCancel...
  method then (line 142) | then(e,r){return this._promise.then(e,r)}
  method catch (line 142) | catch(e){return this._promise.catch(e)}
  method finally (line 142) | finally(e){return this._promise.finally(e)}
  method cancel (line 142) | cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandl...
  method isCanceled (line 142) | get isCanceled(){return this._isCanceled}
  function Jrt (line 142) | function Jrt(t){return t.encrypted}
  method constructor (line 142) | constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorT...
  method servers (line 142) | set servers(e){this.clear(),this._resolver.setServers(e)}
  method servers (line 142) | get servers(){return this._resolver.getServers()}
  method lookup (line 142) | lookup(e,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r=...
  method lookupAsync (line 142) | async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await...
  method query (line 142) | async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending...
  method _resolve (line 142) | async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code=...
  method _lookup (line 142) | async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),ca...
  method _set (line 142) | async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r...
  method queryAndCache (line 142) | async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._...
  method _tick (line 142) | _tick(e){let r=this._nextRemovalTime;(!r||e<r)&&(clearTimeout(this._remo...
  method install (line 142) | install(e){if(soe(e),$m in e)throw new Error("CacheableLookup has been a...
  method uninstall (line 142) | uninstall(e){if(soe(e),e[$m]){if(e[BO]!==this)throw new Error("The agent...
  method updateInterfaceInfo (line 142) | updateInterfaceInfo(){let{_iface:e}=this;this._iface=ooe(),(e.has4&&!thi...
  method clear (line 142) | clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}
  function poe (line 142) | function poe(t,e){if(t&&e)return poe(t)(e);if(typeof t!="function")throw...
  function Ub (line 142) | function Ub(t){var e=function(){return e.called?e.value:(e.called=!0,e.v...
  function moe (line 142) | function moe(t){var e=function(){if(e.called)throw new Error(e.onceError...
  method constructor (line 142) | constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}
  function qb (line 142) | async function qb(t,e){if(!t)return Promise.reject(new Error("Expected a...
  function Eg (line 142) | function Eg(t){let e=parseInt(t,10);return isFinite(e)?e:0}
  function Qnt (line 142) | function Qnt(t){return t?Snt.has(t.status):!0}
  function kO (line 142) | function kO(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let...
  function Fnt (line 142) | function Fnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"=...
  method constructor (line 142) | constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,igno...
  method now (line 142) | now(){return Date.now()}
  method storable (line 142) | storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||thi...
  method _hasExplicitExpiration (line 142) | _hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]|...
  method _assertRequestHasHeaders (line 142) | _assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request heade...
  method satisfiesWithoutRevalidation (line 142) | satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=k...
  method _requestMatches (line 142) | _requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host==...
  method _allowsStoringAuthenticated (line 142) | _allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||thi...
  method _varyMatches (line 142) | _varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.v...
  method _copyWithoutHopByHopHeaders (line 142) | _copyWithoutHopByHopHeaders(e){let r={};for(let o in e)xnt[o]||(r[o]=e[o...
  method responseHeaders (line 142) | responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeader...
  method date (line 142) | date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this...
  method age (line 142) | age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;retur...
  method _ageValue (line 142) | _ageValue(){return Eg(this._resHeaders.age)}
  method maxAge (line 142) | maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&t...
  method timeToLive (line 142) | timeToLive(){let e=this.maxAge()-this.age(),r=e+Eg(this._rescc["stale-if...
  method stale (line 142) | stale(){return this.maxAge()<=this.age()}
  method _useStaleIfError (line 142) | _useStaleIfError(){return this.maxAge()+Eg(this._rescc["stale-if-error"]...
  method useStaleWhileRevalidate (line 142) | useStaleWhileRevalidate(){return this.maxAge()+Eg(this._rescc["stale-whi...
  method fromObject (line 142) | static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}
  method _fromObject (line 142) | _fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e|...
  method toObject (line 142) | toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._ca...
  method revalidationHeaders (line 142) | revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copy...
  method revalidatedPolicy (line 142) | revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStal...
  method constructor (line 142) | constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument...
  method _read (line 142) | _read(){this.push(this.body),this.push(null)}
  method constructor (line 142) | constructor(e,{emitErrors:r=!0,...o}={}){if(super(),this.opts={namespace...
  method _checkIterableAdaptar (line 142) | _checkIterableAdaptar(){return Moe.includes(this.opts.store.opts.dialect...
  method _getKeyPrefix (line 142) | _getKeyPrefix(e){return`${this.opts.namespace}:${e}`}
  method _getKeyPrefixArray (line 142) | _getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}
  method _getKeyUnprefix (line 142) | _getKeyUnprefix(e){return e.split(":").splice(1).join(":")}
  method get (line 142) | get(e,r){let{store:o}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefi...
  method set (line 142) | set(e,r,o){let a=this._getKeyPrefix(e);typeof o>"u"&&(o=this.opts.ttl),o...
  method delete (line 142) | delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKey...
  method clear (line 142) | clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear...
  method has (line 142) | has(e){let r=this._getKeyPrefix(e),{store:o}=this.opts;return Promise.re...
  method disconnect (line 142) | disconnect(){let{store:e}=this.opts;if(typeof e.disconnect=="function")r...
  method constructor (line 142) | constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter ...
  method createCacheableRequest (line 142) | createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=NO...
  function Knt (line 142) | function Knt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search...
  function NO (line 142) | function NO(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostnam...
  method constructor (line 142) | constructor(t){super(t.message),this.name="RequestError",Object.assign(t...
  method constructor (line 142) | constructor(t){super(t.message),this.name="CacheError",Object.assign(thi...
  method get (line 142) | get(){let n=t[a];return typeof n=="function"?n.bind(t):n}
  method set (line 142) | set(n){t[a]=n}
  method transform (line 142) | transform(A,p,h){o=!1,h(null,A)}
  method flush (line 142) | flush(A){A()}
  method destroy (line 142) | destroy(A,p){t.destroy(),p(A)}
  method constructor (line 142) | constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`max...
  method _set (line 142) | _set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){...
  method get (line 142) | get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.ha...
  method set (line 142) | set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}
  method has (line 142) | has(e){return this.cache.has(e)||this.oldCache.has(e)}
  method peek (line 142) | peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.h...
  method delete (line 142) | delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCach...
  method clear (line 142) | clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}
  method keys (line 142) | *keys(){for(let[e]of this)yield e}
  method values (line 142) | *values(){for(let[,e]of this)yield e}
  method [Symbol.iterator] (line 142) | *[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.o...
  method size (line 142) | get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||...
  method constructor (line 142) | constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCac...
  method normalizeOrigin (line 142) | static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&...
  method normalizeOptions (line 142) | normalizeOptions(e){let r="";if(e)for(let o of rit)e[o]&&(r+=`:${e[o]}`)...
  method _tryToCreateNewSession (line 142) | _tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e])...
  method getSession (line 142) | getSession(e,r,o){return new Promise((a,n)=>{Array.isArray(o)?(o=[...o],...
  method request (line 143) | request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject...
  method createConnection (line 143) | createConnection(e,r){return t.connect(e,r)}
  method connect (line 143) | static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostnam...
  method closeFreeSessions (line 143) | closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r ...
  method destroy (line 143) | destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.de...
  method freeSessions (line 143) | get freeSessions(){return zoe({agent:this,isFree:!0})}
  method busySessions (line 143) | get busySessions(){return zoe({agent:this,isFree:!1})}
  method constructor (line 143) | constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode...
  method _destroy (line 143) | _destroy(e){this.req._request.destroy(e)}
  method setTimeout (line 143) | setTimeout(e,r){return this.req.setTimeout(e,r),this}
  method _dump (line 143) | _dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),t...
  method _read (line 143) | _read(){this.req&&this.req._request.resume()}
  method constructor (line 143) | constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.na...
  method constructor (line 143) | constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e i...
  method method (line 143) | get method(){return this[Qo][cae]}
  method method (line 143) | set method(e){e&&(this[Qo][cae]=e.toUpperCase())}
  method path (line 143) | get path(){return this[Qo][uae]}
  method path (line 143) | set path(e){e&&(this[Qo][uae]=e)}
  method _mustNotHaveABody (line 143) | get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"...
  method _write (line 143) | _write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and ...
  method _final (line 143) | _final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(thi...
  method abort (line 143) | abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=...
  method _destroy (line 143) | _destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.de...
  method flushHeaders (line 143) | async flushHeaders(){if(this[Yb]||this.destroyed)return;this[Yb]=!0;let ...
  method getHeader (line 143) | getHeader(e){if(typeof e!="string")throw new GO("name","string",e);retur...
  method headersSent (line 143) | get headersSent(){return this[Yb]}
  method removeHeader (line 143) | removeHeader(e){if(typeof e!="string")throw new GO("name","string",e);if...
  method setHeader (line 143) | setHeader(e,r){if(this.headersSent)throw new aae("set");if(typeof e!="st...
  method setNoDelay (line 143) | setNoDelay(){}
  method setSocketKeepAlive (line 143) | setSocketKeepAlive(){}
  method setTimeout (line 143) | setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._req...
  method maxHeadersCount (line 143) | get maxHeadersCount(){if(!this.destroyed&&this._request)return this._req...
  method maxHeadersCount (line 143) | set maxHeadersCount(e){}
  function Mit (line 143) | function Mit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)...
  method once (line 143) | once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})}
  method unhandleAll (line 143) | unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListe...
  method constructor (line 143) | constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=...
  method constructor (line 143) | constructor(){this.weakMap=new WeakMap,this.map=new Map}
  method set (line 143) | set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}
  method get (line 143) | get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}
  method has (line 143) | has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}
  function lst (line 143) | function lst(t){for(let e in t){let r=t[e];if(!ot.default.string(r)&&!ot...
  function cst (line 143) | function cst(t){return ot.default.object(t)&&!("statusCode"in t)}
  method constructor (line 143) | constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.c...
  method constructor (line 147) | constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborti...
  method constructor (line 147) | constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})...
  method constructor (line 147) | constructor(e,r){super(e.message,e,r),this.name="CacheError"}
  method constructor (line 147) | constructor(e,r){super(e.message,e,r),this.name="UploadError"}
  method constructor (line 147) | constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.ev...
  method constructor (line 147) | constructor(e,r){super(e.message,e,r),this.name="ReadError"}
  method constructor (line 147) | constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),th...
  method constructor (line 147) | constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[iy]=0...
  method normalizeArguments (line 147) | static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(ot.default.obj...
  method _lockWrite (line 147) | _lockWrite(){let e=()=>{throw new TypeError("The payload has been alread...
  method _unlockWrite (line 147) | _unlockWrite(){this.write=super.write,this.end=super.end}
  method _finalizeBody (line 147) | async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!ot.default.un...
  method _onResponseBase (line 147) | async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Xae]=e,r.dec...
  method _onResponse (line 147) | async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._be...
  method _onRequest (line 147) | _onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;Vit.default(e),thi...
  method _createCacheableRequest (line 147) | async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.ass...
  method _makeRequest (line 147) | async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for...
  method _error (line 147) | async _error(e){try{for(let r of this.options.hooks.beforeError)e=await ...
  method _beforeError (line 147) | _beforeError(e){if(this[ay])return;let{options:r}=this,o=this.retryCount...
  method _read (line 147) | _read(){this[Jb]=!0;let e=this[Xb];if(e&&!this[ay]){e.readableLength&&(t...
  method _write (line 147) | _write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitiali...
  method _writeRequest (line 147) | _writeRequest(e,r,o){this[$s].destroyed||(this._progressCallbacks.push((...
  method _final (line 147) | _final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._prog...
  method _destroy (line 147) | _destroy(e,r){var o;this[ay]=!0,clearTimeout(this[Zae]),$s in this&&(thi...
  method _isAboutToError (line 147) | get _isAboutToError(){return this[ay]}
  method ip (line 147) | get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteA...
  method aborted (line 147) | get aborted(){var e,r,o;return((r=(e=this[$s])===null||e===void 0?void 0...
  method socket (line 147) | get socket(){var e,r;return(r=(e=this[$s])===null||e===void 0?void 0:e.s...
  method downloadProgress (line 147) | get downloadProgress(){let e;return this[ny]?e=this[iy]/this[ny]:this[ny...
  method uploadProgress (line 147) | get uploadProgress(){let e;return this[sy]?e=this[oy]/this[sy]:this[sy]=...
  method timings (line 147) | get timings(){var e;return(e=this[$s])===null||e===void 0?void 0:e.timings}
  method isFromCache (line 147) | get isFromCache(){return this[zae]}
  method pipe (line 147) | pipe(e,r){if(this[Jae])throw new Error("Failed to pipe. The response has...
  method unpipe (line 147) | unpipe(e){return e instanceof p4.ServerResponse&&this[zb].delete(e),supe...
  method constructor (line 147) | constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.ur...
  method constructor (line 147) | constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}
  method isCanceled (line 147) | get isCanceled(){return!0}
  function sle (line 147) | function sle(t){let e,r,o=new Est.EventEmitter,a=new wst((u,A,p)=>{let h...
  function Pst (line 147) | function Pst(t,...e){let r=(async()=>{if(t instanceof Dst.RequestError)t...
  function lle (line 147) | function lle(t){for(let e of Object.values(t))(ale.default.plainObject(e...
  function wle (line 147) | function wle(t){let e=new URL(t),r={host:e.hostname,headers:{}};return e...
  function D4 (line 147) | async function D4(t){return al(Cle,t,()=>oe.readFilePromise(t).then(e=>(...
  function Hst (line 147) | function Hst({statusCode:t,statusMessage:e},r){let o=Ot(r,t,yt.NUMBER),a...
  function cS (line 147) | async function cS(t,{configuration:e,customErrorMessage:r}){try{return a...
  function vle (line 147) | function vle(t,e){let r=[...e.configuration.get("networkSettings")].sort...
  function o1 (line 147) | async function o1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonRespo...
  function S4 (line 147) | async function S4(t,{configuration:e,jsonResponse:r,customErrorMessage:o...
  function qst (line 147) | async function qst(t,e,{customErrorMessage:r,...o}){return(await cS(o1(t...
  function x4 (line 147) | async function x4(t,e,{customErrorMessage:r,...o}){return(await cS(o1(t,...
  function jst (line 147) | async function jst(t,{customErrorMessage:e,...r}){return(await cS(o1(t,n...
  function Gst (line 147) | async function Gst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResp...
  function Vst (line 147) | function Vst(){if(process.platform==="darwin"||process.platform==="win32...
  function a1 (line 147) | function a1(){return ble=ble??{os:process.platform,cpu:process.arch,libc...
  function zst (line 147) | function zst(t=a1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}...
  function k4 (line 147) | function k4(){let t=a1();return Sle=Sle??{os:[t.os],cpu:[t.cpu],libc:t.l...
  function Zst (line 147) | function Zst(t){let e=Jst.exec(t);if(!e)return null;let r=e[2]&&e[2].ind...
  function $st (line 147) | function $st(){let e=new Error().stack.split(`
  function Q4 (line 148) | function Q4(){return typeof AS.default.availableParallelism<"u"?AS.defau...
  function M4 (line 148) | function M4(t,e,r,o,a){let n=VI(r);if(o.isArray||o.type==="ANY"&&Array.i...
  function R4 (line 148) | function R4(t,e,r,o,a){let n=VI(r);switch(o.type){case"ANY":return Fb(n)...
  function not (line 148) | function not(t,e,r,o,a){let n=VI(r);if(typeof n!="object"||Array.isArray...
  function iot (line 148) | function iot(t,e,r,o,a){let n=VI(r),u=new Map;if(typeof n!="object"||Arr...
  function O4 (line 148) | function O4(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e...
  function gS (line 148) | function gS(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecre...
  function sot (line 148) | function sot(){let t={};for(let[e,r]of Object.entries(process.env))e=e.t...
  function N4 (line 148) | function N4(){let t=`${dS}rc_filename`;for(let[e,r]of Object.entries(pro...
  function xle (line 148) | async function xle(t){try{return await oe.readFilePromise(t)}catch{retur...
  function oot (line 148) | async function oot(t,e){return Buffer.compare(...await Promise.all([xle(...
  function aot (line 148) | async function aot(t,e){let[r,o]=await Promise.all([oe.statPromise(t),oe...
  function cot (line 148) | async function cot({configuration:t,selfPath:e}){let r=t.get("yarnPath")...
  method constructor (line 148) | constructor(e){this.isCI=Tf.isCI;this.projectCwd=null;this.plugins=new M...
  method create (line 148) | static create(e,r,o){let a=new t(e);typeof r<"u"&&!(r instanceof Map)&&(...
  method find (line 148) | static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){l...
  method findRcFiles (line 148) | static async findRcFiles(e){let r=N4(),o=[],a=e,n=null;for(;a!==n;){n=a;...
  method findFolderRcFile (line 148) | static async findFolderRcFile(e){let r=V.join(e,dr.rc),o;try{o=await oe....
  method findProjectCwd (line 148) | static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o...
  method updateConfiguration (line 148) | static async updateConfiguration(e,r,o={}){let a=N4(),n=V.join(e,a),u=oe...
  method addPlugin (line 148) | static async addPlugin(e,r){r.length!==0&&await t.updateConfiguration(e,...
  method updateHomeConfiguration (line 148) | static async updateHomeConfiguration(e){let r=Jm();return await t.update...
  method activatePlugin (line 148) | activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&th...
  method importSettings (line 148) | importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.s...
  method useWithSource (line 148) | useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=`...
  method use (line 148) | use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSe...
  method get (line 148) | get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key...
  method getSpecial (line 148) | getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n...
  method getSubprocessStreams (line 148) | getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=oe.create...
  method makeResolver (line 149) | makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of ...
  method makeFetcher (line 149) | makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r...
  method getLinkers (line 149) | getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r....
  method getSupportedArchitectures (line 149) | getSupportedArchitectures(){let e=a1(),r=this.get("supportedArchitecture...
  method isInteractive (line 149) | isInteractive({interactive:e,stdout:r}){return r.isTTY?e??this.get("pref...
  method getPackageExtensions (line 149) | async getPackageExtensions(){if(this.packageExtensions!==null)return thi...
  method normalizeLocator (line 149) | normalizeLocator(e){return Qa(e.reference)?Rs(e,`${this.get("defaultProt...
  method normalizeDependency (line 149) | normalizeDependency(e){return Qa(e.range)?In(e,`${this.get("defaultProto...
  method normalizeDependencyMap (line 149) | normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.nor...
  method normalizePackage (line 149) | normalizePackage(e,{packageExtensions:r}){let o=OI(e),a=r.get(e.identHas...
  method getLimit (line 149) | getLimit(e){return al(this.limits,e,()=>(0,Rle.default)(this.get(e)))}
  method triggerHook (line 149) | async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.ho...
  method triggerMultipleHooks (line 149) | async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...
  method reduceHook (line 149) | async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){l...
  method firstHook (line 149) | async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hook...
  function Ig (line 149) | function Ig(t){return t!==null&&typeof t.fd=="number"}
  function U4 (line 149) | function U4(){}
  function _4 (line 149) | function _4(){for(let t of Bg)t.kill()}
  function Wc (line 149) | async function Wc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,...
  function F4 (line 149) | async function F4(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:...
  function j4 (line 149) | function j4(t,e){let r=uot.get(e);return typeof r<"u"?128+r:t??1}
  function Aot (line 149) | function Aot(t,e,{configuration:r,report:o}){o.reportError(1,`  ${Xu(r,t...
  method constructor (line 149) | constructor({fileName:e,code:r,signal:o}){let a=Ke.create(V.cwd()),n=Ot(...
  method constructor (line 149) | constructor({fileName:e,code:r,signal:o,stdout:a,stderr:n}){super({fileN...
  function Lle (line 149) | function Lle(t){Nle=t}
  function f1 (line 149) | function f1(){return typeof G4>"u"&&(G4=Nle()),G4}
  function x (line 149) | function x(We){return r.locateFile?r.locateFile(We,v):v+We}
  function de (line 149) | function de(We,tt,Bt){switch(tt=tt||"i8",tt.charAt(tt.length-1)==="*"&&(...
  function me (line 149) | function me(We,tt){We||Ri("Assertion failed: "+tt)}
  function we (line 149) | function we(We){var tt=r["_"+We];return me(tt,"Cannot call unknown funct...
  function Ae (line 149) | function Ae(We,tt,Bt,or,ee){var ye={string:function(rs){var bi=0;if(rs!=...
  function ne (line 149) | function ne(We,tt,Bt,or){Bt=Bt||[];var ee=Bt.every(function(Le){return L...
  function xe (line 149) | function xe(We,tt){if(!We)return"";for(var Bt=We+tt,or=We;!(or>=Bt)&&be[...
  function Ne (line 149) | function Ne(We,tt,Bt,or){if(!(or>0))return 0;for(var ee=Bt,ye=Bt+or-1,Le...
  function ht (line 149) | function ht(We,tt,Bt){return Ne(We,be,tt,Bt)}
  function H (line 149) | function H(We){for(var tt=0,Bt=0;Bt<We.length;++Bt){var or=We.charCodeAt...
  function rt (line 149) | function rt(We){var tt=H(We)+1,Bt=Ni(tt);return Bt&&Ne(We,Ye,Bt,tt),Bt}
  function Te (line 149) | function Te(We,tt){Ye.set(We,tt)}
  function Fe (line 149) | function Fe(We,tt){return We%tt>0&&(We+=tt-We%tt),We}
  function J (line 149) | function J(We){ke=We,r.HEAP_DATA_VIEW=F=new DataView(We),r.HEAP8=Ye=new ...
  function dt (line 149) | function dt(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r....
  function jt (line 149) | function jt(){at=!0,oo(Se)}
  function tr (line 149) | function tr(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=...
  function bt (line 149) | function bt(We){ie.unshift(We)}
  function ln (line 149) | function ln(We){Se.unshift(We)}
  function kr (line 149) | function kr(We){Re.unshift(We)}
  function Kn (line 149) | function Kn(We){mr++,r.monitorRunDependencies&&r.monitorRunDependencies(...
  function Ms (line 149) | function Ms(We){if(mr--,r.monitorRunDependencies&&r.monitorRunDependenci...
  function Ri (line 149) | function Ri(We){r.onAbort&&r.onAbort(We),We+="",te(We),Ee=!0,g=1,We="abo...
  function io (line 149) | function io(We){return We.startsWith(gs)}
  function Os (line 149) | function Os(We){try{if(We==Pi&&ce)return new Uint8Array(ce);var tt=ii(We...
  function so (line 149) | function so(We,tt){var Bt,or,ee;try{ee=Os(We),or=new WebAssembly.Module(...
  function uc (line 149) | function uc(){var We={a:Ha};function tt(ee,ye){var Le=ee.exports;r.asm=L...
  function Au (line 149) | function Au(We){return F.getFloat32(We,!0)}
  function op (line 149) | function op(We){return F.getFloat64(We,!0)}
  function ap (line 149) | function ap(We){return F.getInt16(We,!0)}
  function Us (line 149) | function Us(We){return F.getInt32(We,!0)}
  function Dn (line 149) | function Dn(We,tt){F.setInt32(We,tt,!0)}
  function oo (line 149) | function oo(We){for(;We.length>0;){var tt=We.shift();if(typeof tt=="func...
  function _s (line 149) | function _s(We,tt){var Bt=new Date(Us((We>>2)*4)*1e3);Dn((tt>>2)*4,Bt.ge...
  function ml (line 149) | function ml(We,tt){return _s(We,tt)}
  function yl (line 149) | function yl(We,tt,Bt){be.copyWithin(We,tt,tt+Bt)}
  function ao (line 149) | function ao(We){try{return Be.grow(We-ke.byteLength+65535>>>16),J(Be.buf...
  function Vn (line 149) | function Vn(We){var tt=be.length;We=We>>>0;var Bt=2147483648;if(We>Bt)re...
  function Mn (line 149) | function Mn(We){le(We)}
  function Ti (line 149) | function Ti(We){var tt=Date.now()/1e3|0;return We&&Dn((We>>2)*4,tt),tt}
  function On (line 149) | function On(){if(On.called)return;On.called=!0;var We=new Date().getFull...
  function _i (line 149) | function _i(We){On();var tt=Date.UTC(Us((We+20>>2)*4)+1900,Us((We+16>>2)...
  function Me (line 149) | function Me(We){if(typeof I=="boolean"&&I){var tt;try{tt=Buffer.from(We,...
  function ii (line 149) | function ii(We){if(io(We))return Me(We.slice(gs.length))}
  function Cs (line 149) | function Cs(We){if(We=We||A,mr>0||(dt(),mr>0))return;function tt(){Pn||(...
  method HEAPU8 (line 149) | get HEAPU8(){return t.HEAPU8}
  function V4 (line 149) | function V4(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=...
  method openPromise (line 149) | static async openPromise(e,r){let o=new t(r);try{return await e(o)}final...
  method constructor (line 149) | constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r...
  function pot (line 149) | function pot(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof...
  function CS (line 149) | function CS(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
  method constructor (line 149) | constructor(e,r){super(e),this.name="Libzip Error",this.code=r}
  method constructor (line 149) | constructor(r,o={}){super();this.listings=new Map;this.entries=new Map;t...
  method makeLibzipError (line 149) | makeLibzipError(r){let o=this.libzip.struct.errorCodeZip(r),a=this.libzi...
  method getExtractHint (line 149) | getExtractHint(r){for(let o of this.entries.keys()){let a=this.pathUtils...
  method getAllFiles (line 149) | getAllFiles(){return Array.from(this.entries.keys())}
  method getRealPath (line 149) | getRealPath(){if(!this.path)throw new Error("ZipFS don't have real paths...
  method prepareClose (line 149) | prepareClose(){if(!this.ready)throw nr.EBUSY("archive closed, close");N0...
  method getBufferAndClose (line 149) | getBufferAndClose(){if(this.prepareClose(),this.entries.size===0)return ...
  method discardAndClose (line 149) | discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this...
  method saveAndClose (line 149) | saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot...
  method resolve (line 149) | resolve(r){return V.resolve(It.root,r)}
  method openPromise (line 149) | async openPromise(r,o,a){return this.openSync(r,o,a)}
  method openSync (line 149) | openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}...
  method hasOpenFileHandles (line 149) | hasOpenFileHandles(){return!!this.fds.size}
  method opendirPromise (line 149) | async opendirPromise(r,o){return this.opendirSync(r,o)}
  method opendirSync (line 149) | opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!t...
  method readPromise (line 149) | async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}
  method readSync (line 149) | readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>...
  method writePromise (line 149) | async writePromise(r,o,a,n,u){return typeof o=="string"?this.writeSync(r...
  method writeSync (line 149) | writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>"u"?nr.EBADF("read"):n...
  method closePromise (line 149) | async closePromise(r){return this.closeSync(r)}
  method closeSync (line 149) | closeSync(r){if(typeof this.fds.get(r)>"u")throw nr.EBADF("read");this.f...
  method createReadStream (line 149) | createReadStream(r,{encoding:o}={}){if(r===null)throw new Error("Unimple...
  method createWriteStream (line 149) | createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw nr.EROFS(`op...
  method realpathPromise (line 149) | async realpathPromise(r){return this.realpathSync(r)}
  method realpathSync (line 149) | realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.en...
  method existsPromise (line 149) | async existsPromise(r){return this.existsSync(r)}
  method existsSync (line 149) | existsSync(r){if(!this.ready)throw nr.EBUSY(`archive closed, existsSync ...
  method accessPromise (line 149) | async accessPromise(r,o){return this.accessSync(r,o)}
  method accessSync (line 149) | accessSync(r,o=na.constants.F_OK){let a=this.resolveFilename(`access '${...
  method statPromise (line 149) | async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigi...
  method statSync (line 149) | statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`...
  method fstatPromise (line 149) | async fstatPromise(r,o){return this.fstatSync(r,o)}
  method fstatSync (line 149) | fstatSync(r,o){let a=this.fds.get(r);if(typeof a>"u")throw nr.EBADF("fst...
  method lstatPromise (line 149) | async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bi...
  method lstatSync (line 149) | lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(...
  method statImpl (line 149) | statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<"u"){let u=this...
  method getUnixMode (line 149) | getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,...
  method registerListing (line 149) | registerListing(r){let o=this.listings.get(r);if(o)return o;this.registe...
  method registerEntry (line 149) | registerEntry(r,o){this.registerListing(V.dirname(r)).add(V.basename(r))...
  method unregisterListing (line 149) | unregisterListing(r){this.listings.delete(r),this.listings.get(V.dirname...
  method unregisterEntry (line 149) | unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);t...
  method deleteEntry (line 149) | deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,...
  method resolveFilename (line 149) | resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw nr.EBUSY(`archive cl...
  method allocateBuffer (line 149) | allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libz...
  method allocateUnattachedSource (line 149) | allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,...
  method allocateSource (line 149) | allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=th...
  method setFileSource (line 149) | setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=V.relativ...
  method isSymbolicLink (line 149) | isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file....
  method getFileSource (line 149) | getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if...
  method fchmodPromise (line 149) | async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,"fchmo...
  method fchmodSync (line 149) | fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,"fchmodSync"),o)}
  method chmodPromise (line 149) | async chmodPromise(r,o){return this.chmodSync(r,o)}
  method chmodSync (line 149) | chmodSync(r,o){if(this.readOnly)throw nr.EROFS(`chmod '${r}'`);o&=493;le...
  method fchownPromise (line 149) | async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,"fch...
  method fchownSync (line 149) | fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,"fchownSync"),o,a)}
  method chownPromise (line 149) | async chownPromise(r,o,a){return this.chownSync(r,o,a)}
  method chownSync (line 149) | chownSync(r,o,a){throw new Error("Unimplemented")}
  method renamePromise (line 149) | async renamePromise(r,o){return this.renameSync(r,o)}
  method renameSync (line 149) | renameSync(r,o){throw new Error("Unimplemented")}
  method copyFilePromise (line 149) | async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP...
  method copyFileSync (line 149) | copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=thi...
  method prepareCopyFile (line 149) | prepareCopyFile(r,o,a=0){if(this.readOnly)throw nr.EROFS(`copyfile '${r}...
  method appendFilePromise (line 149) | async appendFilePromise(r,o,a){if(this.readOnly)throw nr.EROFS(`open '${...
  method appendFileSync (line 149) | appendFileSync(r,o,a={}){if(this.readOnly)throw nr.EROFS(`open '${r}'`);...
  method fdToPath (line 149) | fdToPath(r,o){let a=this.fds.get(r)?.p;if(typeof a>"u")throw nr.EBADF(o)...
  method writeFilePromise (line 149) | async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}...
  method writeFileSync (line 149) | writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.pre...
  method prepareWriteFile (line 149) | prepareWriteFile(r,o){if(typeof r=="number"&&(r=this.fdToPath(r,"read"))...
  method unlinkPromise (line 149) | async unlinkPromise(r){return this.unlinkSync(r)}
  method unlinkSync (line 149) | unlinkSync(r){if(this.readOnly)throw nr.EROFS(`unlink '${r}'`);let o=thi...
  method utimesPromise (line 149) | async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}
  method utimesSync (line 149) | utimesSync(r,o,a){if(this.readOnly)throw nr.EROFS(`utimes '${r}'`);let n...
  method lutimesPromise (line 149) | async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}
  method lutimesSync (line 149) | lutimesSync(r,o,a){if(this.readOnly)throw nr.EROFS(`lutimes '${r}'`);let...
  method utimesImpl (line 149) | utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrate...
  method mkdirPromise (line 149) | async mkdirPromise(r,o){return this.mkdirSync(r,o)}
  method mkdirSync (line 149) | mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(...
  method rmdirPromise (line 149) | async rmdirPromise(r,o){return this.rmdirSync(r,o)}
  method rmdirSync (line 149) | rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw nr.EROFS(`rmdir ...
  method rmPromise (line 149) | async rmPromise(r,o){return this.rmSync(r,o)}
  method rmSync (line 149) | rmSync(r,{recursive:o=!1}={}){if(this.readOnly)throw nr.EROFS(`rm '${r}'...
  method hydrateDirectory (line 149) | hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,V.relative(It.roo...
  method linkPromise (line 149) | async linkPromise(r,o){return this.linkSync(r,o)}
  method linkSync (line 149) | linkSync(r,o){throw nr.EOPNOTSUPP(`link '${r}' -> '${o}'`)}
  method symlinkPromise (line 149) | async symlinkPromise(r,o){return this.symlinkSync(r,o)}
  method symlinkSync (line 149) | symlinkSync(r,o){if(this.readOnly)throw nr.EROFS(`symlink '${r}' -> '${o...
  method readFilePromise (line 149) | async readFilePromise(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);l...
  method readFileSync (line 149) | readFileSync(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=this...
  method readFileBuffer (line 149) | readFileBuffer(r,o={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdT...
  method readdirPromise (line 149) | async readdirPromise(r,o){return this.readdirSync(r,o)}
  method readdirSync (line 149) | readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this...
  method readlinkPromise (line 149) | async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this...
  method readlinkSync (line 149) | readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(...
  method prepareReadlink (line 149) | prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if...
  method truncatePromise (line 149) | async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r)...
  method truncateSync (line 149) | truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.e...
  method ftruncatePromise (line 149) | async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,...
  method ftruncateSync (line 149) | ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,"ftruncateSy...
  method watch (line 149) | watch(r,o,a){let n;switch(typeof o){case"function":case"string":case"und...
  method watchFile (line 149) | watchFile(r,o,a){let n=V.resolve(It.root,r);return jd(this,n,o,a)}
  method unwatchFile (line 149) | unwatchFile(r,o){let a=V.resolve(It.root,r);return T0(this,a,o)}
  function Yle (line 149) | function Yle(t,e,r=Buffer.alloc(0),o){let a=new Zi(r),n=I=>I===e||I.star...
  function hot (line 149) | function hot(){return f1()}
  function got (line 149) | async function got(){return f1()}
  method constructor (line 149) | constructor(){super(...arguments);this.cwd=ge.String("--cwd",process.cwd...
  method execute (line 159) | async execute(){let r=this.args.length>0?`${this.commandName} ${this.arg...
  method constructor (line 159) | constructor(e){super(e),this.name="ShellError"}
  function dot (line 159) | function dot(t){if(!IS.default.scan(t,BS).isGlob)return!1;try{IS.default...
  function mot (line 159) | function mot(t,{cwd:e,baseFs:r}){return(0,Xle.default)(t,{...$le,cwd:ue....
  function Z4 (line 159) | function Z4(t){return IS.default.scan(t,BS).isBrace}
  function $4 (line 159) | function $4(){}
  function eU (line 159) | function eU(){for(let t of vg)t.kill()}
  function ice (line 159) | function ice(t,e,r,o){return a=>{let n=a[0]instanceof iA.Transform?"pipe...
  function sce (line 162) | function sce(t){return e=>{let r=e[0]==="pipe"?new iA.PassThrough:e[0];r...
  function DS (line 162) | function DS(t,e){return rU.start(t,e)}
  function tce (line 162) | function tce(t,e=null){let r=new iA.PassThrough,o=new nce.StringDecoder,...
  function oce (line 163) | function oce(t,{prefix:e}){return{stdout:tce(r=>t.stdout.write(`${r}
  method constructor (line 165) | constructor(e){this.stream=e}
  method close (line 165) | close(){}
  method get (line 165) | get(){return this.stream}
  method constructor (line 165) | constructor(){this.stream=null}
  method close (line 165) | close(){if(this.stream===null)throw new Error("Assertion failed: No stre...
  method attach (line 165) | attach(e){this.stream=e}
  method get (line 165) | get(){if(this.stream===null)throw new Error("Assertion failed: No stream...
  method constructor (line 165) | constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this....
  method start (line 165) | static start(e,{stdin:r,stdout:o,stderr:a}){let n=new t(null,e);return n...
  method pipeTo (line 165) | pipeTo(e,r=1){let o=new t(this,e),a=new tU;return o.pipe=a,o.stdout=this...
  method exec (line 165) | async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe"...
  method run (line 165) | async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());retu...
  function ace (line 165) | function ace(t,e,r){let o=new cl.PassThrough({autoDestroy:!0});switch(t)...
  function bS (line 165) | function bS(t,e={}){let r={...t,...e};return r.environment={...t.environ...
  function Eot (line 165) | async function Eot(t,e,r){let o=[],a=new cl.PassThrough;return a.on("dat...
  function lce (line 165) | async function lce(t,e,r){let o=t.map(async n=>{let u=await Dg(n.args,e,...
  function PS (line 165) | function PS(t){return t.match(/[^ \r\n\t]+/g)||[]}
  function hce (line 165) | async function hce(t,e,r,o,a=o){switch(t.name){case"$":o(String(process....
  function d1 (line 165) | async function d1(t,e,r){if(t.type==="number"){if(Number.isInteger(t.val...
  function Dg (line 165) | async function Dg(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>...
  function m1 (line 165) | function m1(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let o=ue.f...
  function wot (line 165) | function wot(t,e,r){return o=>{let a=new cl.PassThrough,n=SS(t,e,bS(r,{s...
  function Iot (line 165) | function Iot(t,e,r){return o=>{let a=new cl.PassThrough,n=SS(t,e,r);retu...
  function cce (line 165) | function cce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.r...
  function uce (line 165) | async function uce(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{....
  function Bot (line 165) | async function Bot(t,e,r,{background:o=!1}={}){function a(n){let u=["#2E...
  function vot (line 167) | async function vot(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variabl...
  function SS (line 168) | async function SS(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let ...
  function gce (line 168) | function gce(t){switch(t.type){case"variable":return t.name==="@"||t.nam...
  function y1 (line 168) | function y1(t){switch(t.type){case"redirection":return t.args.some(e=>y1...
  function iU (line 168) | function iU(t){switch(t.type){case"variable":return gce(t);case"number":...
  function sU (line 168) | function sU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(...
  function cy (line 168) | async function cy(t,e=[],{baseFs:r=new Tn,builtins:o={},cwd:a=ue.toPorta...
  method write (line 171) | write(ae,le,ce){setImmediate(ce)}
  function Dot (line 171) | function Dot(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r<o;)a[...
  function Cce (line 171) | function Cce(t){if(typeof t=="string")return t;if(bot(t))return Pot(t,Cc...
  function Qot (line 171) | function Qot(t){return t==null?"":kot(t)}
  function Fot (line 171) | function Fot(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<...
  function Tot (line 171) | function Tot(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:Ro...
  function jot (line 171) | function jot(t){return qot.test(t)}
  function Got (line 171) | function Got(t){return t.split("")}
  function nat (line 171) | function nat(t){return t.match(rat)||[]}
  function aat (line 171) | function aat(t){return sat(t)?oat(t):iat(t)}
  function fat (line 171) | function fat(t){return function(e){e=Aat(e);var r=cat(e)?uat(e):void 0,o...
  function mat (line 171) | function mat(t){return dat(gat(t).toLowerCase())}
  function yat (line 171) | function yat(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,I=11,v=1...
  function Cat (line 171) | function Cat(){if(QS)return QS;if(typeof Intl.Segmenter<"u"){let t=new I...
  function $ce (line 171) | function $ce(t,{configuration:e,json:r}){if(!e.get("enableMessageNames")...
  function AU (line 171) | function AU(t,{configuration:e,json:r}){let o=$ce(t,{configuration:e,jso...
  function uy (line 171) | async function uy({configuration:t,stdout:e,forceError:r},o){let a=await...
  method constructor (line 176) | constructor({configuration:r,stdout:o,json:a=!1,forceSectionAlignment:n=...
  method start (line 176) | static async start(r,o){let a=new this(r),n=process.emitWarning;process....
  method hasErrors (line 176) | hasErrors(){return this.errorCount>0}
  method exitCode (line 176) | exitCode(){return this.hasErrors()?1:0}
  method getRecommendedLength (line 176) | getRecommendedLength(){let o=this.progressStyle!==null?this.stdout.colum...
  method startSectionSync (line 176) | startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u=...
  method startSectionPromise (line 176) | async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},...
  method startTimerImpl (line 176) | startTimerImpl(r,o,a){return{cb:typeof o=="function"?o:a,reportHeader:()...
  method startTimerSync (line 176) | startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return t...
  method startTimerPromise (line 176) | async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a)...
  method reportSeparator (line 176) | reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(nul...
  method reportInfo (line 176) | reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.fo...
  method reportWarning (line 176) | reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;...
  method reportError (line 176) | reportError(r,o){this.errorCount+=1,this.timerFooter.push(()=>this.repor...
  method reportErrorImpl (line 176) | reportErrorImpl(r,o){this.commit();let a=this.formatNameWithHyperlink(r)...
  method reportFold (line 176) | reportFold(r,o){if(!ch)return;let a=`${ch.start(r)}${o}${ch.end(r)}`;thi...
  method reportProgress (line 176) | reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve...
  method reportJson (line 176) | reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}
  method finalize (line 176) | async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>...
  method writeLine (line 176) | writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout....
  method writeLines (line 177) | writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(l...
  method commit (line 178) | commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)...
  method clearProgress (line 178) | clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.pr...
  method writeProgress (line 178) | writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==nu...
  method refreshProgress (line 179) | refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.prog...
  method truncate (line 179) | truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typ...
  method formatName (line 179) | formatName(r){return this.includeNames?$ce(r,{configuration:this.configu...
  method formatPrefix (line 179) | formatPrefix(r,o){return this.includePrefix?`${Ot(this.configuration,"\u...
  method formatNameWithHyperlink (line 179) | formatNameWithHyperlink(r){return this.includeNames?AU(r,{configuration:...
  method formatIndent (line 179) | formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ...
  function uh (line 179) | async function uh(t,e,r,o=[]){if(process.platform==="win32"){let a=`@got...
  function nue (line 181) | async function nue(t){let e=await Ut.tryFind(t);if(e?.packageManager){le...
  function B1 (line 181) | async function B1({project:t,locator:e,binFolder:r,ignoreCorepack:o,life...
  function bat (line 181) | async function bat(t,e,{configuration:r,report:o,workspace:a=null,locato...
  function Sat (line 189) | async function Sat(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(...
  function NS (line 189) | async function NS(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){ret...
  function fU (line 189) | async function fU(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){ret...
  function xat (line 189) | async function xat(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await ...
  function iue (line 189) | async function iue(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){le...
  function sue (line 189) | async function sue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await...
  function pU (line 189) | function pU(t,e){return t.manifest.scripts.has(e)}
  function oue (line 189) | async function oue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,...
  function kat (line 190) | async function kat(t,e,r){pU(t,e)&&await oue(t,e,r)}
  function hU (line 190) | function hU(t){let e=V.extname(t);if(e.match(/\.[cm]?[jt]sx?$/))return!0...
  function LS (line 190) | async function LS(t,{project:e}){let r=e.configuration,o=new Map,a=e.sto...
  function aue (line 190) | async function aue(t){return await LS(t.anchoredLocator,{project:t.proje...
  function gU (line 190) | async function gU(t,e){await Promise.all(Array.from(e,([r,[,o,a]])=>a?uh...
  function lue (line 190) | async function lue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,node...
  function Qat (line 190) | async function Qat(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessi...
  method constructor (line 190) | constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e...
  method unpipe (line 190) | unpipe(){this.dest.removeListener("drain",this.ondrain)}
  method proxyErrors (line 190) | proxyErrors(){}
  method end (line 190) | end(){this.unpipe(),this.opts.end&&this.dest.end()}
  method unpipe (line 190) | unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}
  method constructor (line 190) | constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit("error",a),e....
  method constructor (line 190) | constructor(e){super(),this[_S]=!1,this[D1]=!1,this.pipes=[],this.buffer...
  method bufferLength (line 190) | get bufferLength(){return this[Ts]}
  method encoding (line 190) | get encoding(){return this[Fa]}
  method encoding (line 190) | set encoding(e){if(this[Fo])throw new Error("cannot set encoding in obje...
  method setEncoding (line 190) | setEncoding(e){this.encoding=e}
  method objectMode (line 190) | get objectMode(){return this[Fo]}
  method objectMode (line 190) | set objectMode(e){this[Fo]=this[Fo]||!!e}
  method async (line 190) | get async(){return this[Uf]}
  method async (line 190) | set async(e){this[Uf]=this[Uf]||!!e}
  method write (line 190) | write(e,r,o){if(this[Lf])throw new Error("write after end");if(this[Ro])...
  method read (line 190) | read(e){if(this[Ro])return null;if(this[Ts]===0||e===0||e>this[Ts])retur...
  method [hue] (line 190) | [hue](e,r){return e===r.length||e===null?this[yU]():(this.buffer[0]=r.sl...
  method end (line 190) | end(e,r,o){return typeof e=="function"&&(o=e,e=null),typeof r=="function...
  method [fy] (line 190) | [fy](){this[Ro]||(this[D1]=!1,this[_S]=!0,this.emit("resume"),this.buffe...
  method resume (line 190) | resume(){return this[fy]()}
  method pause (line 190) | pause(){this[_S]=!1,this[D1]=!0}
  method destroyed (line 190) | get destroyed(){return this[Ro]}
  method flowing (line 190) | get flowing(){return this[_S]}
  method paused (line 190) | get paused(){return this[D1]}
  method [mU] (line 190) | [mU](e){this[Fo]?this[Ts]+=1:this[Ts]+=e.length,this.buffer.push(e)}
  method [yU] (line 190) | [yU](){return this.buffer.length&&(this[Fo]?this[Ts]-=1:this[Ts]-=this.b...
  method [US] (line 190) | [US](e){do;while(this[gue](this[yU]()));!e&&!this.buffer.length&&!this[L...
  method [gue] (line 190) | [gue](e){return e?(this.emit("data",e),this.flowing):!1}
  method pipe (line 190) | pipe(e,r){if(this[Ro])return;let o=this[fh];return r=r||{},e===Aue.stdou...
  method unpipe (line 190) | unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(thi...
  method addListener (line 190) | addListener(e,r){return this.on(e,r)}
  method on (line 190) | on(e,r){let o=super.on(e,r);return e==="data"&&!this.pipes.length&&!this...
  method emittedEnd (line 190) | get emittedEnd(){return this[fh]}
  method [Mf] (line 190) | [Mf](){!this[MS]&&!this[fh]&&!this[Ro]&&this.buffer.length===0&&this[Lf]...
  method emit (line 190) | emit(e,r,...o){if(e!=="error"&&e!=="close"&&e!==Ro&&this[Ro])return;if(e...
  method [EU] (line 190) | [EU](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r...
  method [due] (line 190) | [due](){this[fh]||(this[fh]=!0,this.readable=!1,this[Uf]?P1(()=>this[CU]...
  method [CU] (line 190) | [CU](){if(this[Of]){let r=this[Of].end();if(r){for(let o of this.pipes)o...
  method collect (line 190) | collect(){let e=[];this[Fo]||(e.dataLength=0);let r=this.promise();retur...
  method concat (line 190) | concat(){return this[Fo]?Promise.reject(new Error("cannot concat in obje...
  method promise (line 190) | promise(){return new Promise((e,r)=>{this.on(Ro,()=>r(new Error("stream ...
  method [Rat] (line 190) | [Rat](){return{next:()=>{let r=this.read();if(r!==null)return Promise.re...
  method [Tat] (line 190) | [Tat](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}
  method destroy (line 190) | destroy(e){return this[Ro]?(e?this.emit("error",e):this.emit(Ro),this):(...
  method isStream (line 190) | static isStream(e){return!!e&&(e instanceof yue||e instanceof fue||e ins...
  method constructor (line 190) | constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.e...
  method name (line 190) | get name(){return"ZlibError"}
  method constructor (line 190) | constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid ...
  method close (line 190) | close(){this[ti]&&(this[ti].close(),this[ti]=null,this.emit("close"))}
  method reset (line 190) | reset(){if(!this[hy])return PU(this[ti],"zlib binding closed"),this[ti]....
  method flush (line 190) | flush(e){this.ended||(typeof e!="number"&&(e=this[LU]),this.write(Object...
  method end (line 190) | end(e,r,o){return e&&this.write(e,r),this.flush(this[Bue]),this[vU]=!0,s...
  method ended (line 190) | get ended(){return this[vU]}
  method write (line 190) | write(e,r,o){if(typeof r=="function"&&(o=r,r="utf8"),typeof e=="string"&...
  method [bg] (line 190) | [bg](e){return super.write(e)}
  method constructor (line 190) | constructor(e,r){e=e||{},e.flush=e.flush||Pg.Z_NO_FLUSH,e.finishFlush=e....
  method params (line 190) | params(e,r){if(!this[hy]){if(!this[ti])throw new Error("cannot switch pa...
  method constructor (line 190) | constructor(e){super(e,"Deflate")}
  method constructor (line 190) | constructor(e){super(e,"Inflate")}
  method constructor (line 190) | constructor(e){super(e,"Gzip"),this[DU]=e&&!!e.portable}
  method [bg] (line 190) | [bg](e){return this[DU]?(this[DU]=!1,e[9]=255,super[bg](e)):super[bg](e)}
  method constructor (line 190) | constructor(e){super(e,"Gunzip")}
  method constructor (line 190) | constructor(e){super(e,"DeflateRaw")}
  method constructor (line 190) | constructor(e){super(e,"InflateRaw")}
  method constructor (line 190) | constructor(e){super(e,"Unzip")}
  method constructor (line 190) | constructor(e,r){e=e||{},e.flush=e.flush||Pg.BROTLI_OPERATION_PROCESS,e....
  method constructor (line 190) | constructor(e){super(e,"BrotliCompress")}
  method constructor (line 190) | constructor(e){super(e,"BrotliDecompress")}
  method constructor (line 190) | constructor(){throw new Error("Brotli is not supported in this version o...
  method constructor (line 190) | constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.glob...
  method write (line 190) | write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing m...
  method [UU] (line 190) | [UU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(...
  method constructor (line 190) | constructor(e,r,o,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!...
  method decode (line 190) | decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need...
  method [qU] (line 190) | [qU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(...
  method encode (line 190) | encode(e,r){if(e||(e=this.block=Buffer.alloc(512),r=0),r||(r=0),!(e.le
Copy disabled (too large) Download .json
Condensed preview — 1192 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (19,193K chars).
[
  {
    "path": ".claude/README.md",
    "chars": 7553,
    "preview": "# Claude Code Setup\n\nThis directory contains project-specific configuration for [Claude Code](https://claude.ai/code).\n\n"
  },
  {
    "path": ".claude/commands/pre-push-update.md",
    "chars": 3909,
    "preview": "Run the knowledge update process: collect all commits since the last update, analyse what changed, and update skill file"
  },
  {
    "path": ".claude/hooks/double-prompt.js",
    "chars": 597,
    "preview": "#!/usr/bin/env node\n// UserPromptSubmit hook — repeats the user's prompt as additionalContext.\n// Research suggests repe"
  },
  {
    "path": ".claude/last-knowledge-update",
    "chars": 41,
    "preview": "69e3f98f9413eca44ba6ef375636873a92184587\n"
  },
  {
    "path": ".claude/settings.json",
    "chars": 3406,
    "preview": "{\n  \"$schema\": \"https://json.schemastore.org/claude-code-settings.json\",\n  \"respectGitIgnore\": true,\n  \"permissions\": {\n"
  },
  {
    "path": ".claude/skills/audio-nodes/SKILL.md",
    "chars": 12827,
    "preview": "---\nname: audio-nodes\ndescription: >\n  C++ audio node engine for react-native-audio-api. Covers the AudioNode class hier"
  },
  {
    "path": ".claude/skills/audio-nodes/gainnode-example.md",
    "chars": 1909,
    "preview": "# Reference: Complete GainNode C++ Example\n\nThis file contains the full GainNode header and implementation, extracted fr"
  },
  {
    "path": ".claude/skills/audio-nodes/maintenance.md",
    "chars": 1040,
    "preview": "# Maintenance — audio-nodes\n\n> Used by `/pre-push-update` only — not loaded when the `audio-nodes` skill is active.\n\nRev"
  },
  {
    "path": ".claude/skills/build-compilation-dependencies/SKILL.md",
    "chars": 10092,
    "preview": "---\nname: build-compilation-dependencies\ndescription: >\n  Build system overview for react-native-audio-api across all pl"
  },
  {
    "path": ".claude/skills/build-compilation-dependencies/build-details.md",
    "chars": 10514,
    "preview": "# Build Details — CMake, Gradle & Podspec Deep Reference\n\n> This file contains the detailed per-platform build system an"
  },
  {
    "path": ".claude/skills/build-compilation-dependencies/maintenance.md",
    "chars": 1199,
    "preview": "# Maintenance — build-compilation-dependencies\n\n> Used by `/pre-push-update` only — not loaded when the `build-compilati"
  },
  {
    "path": ".claude/skills/flow/SKILL.md",
    "chars": 11345,
    "preview": "---\nname: flow\ndescription: >\n  End-to-end process for shipping a feature or bug fix in react-native-audio-api. Covers a"
  },
  {
    "path": ".claude/skills/flow/maintenance.md",
    "chars": 631,
    "preview": "# Maintenance — flow\n\n> Used by `/pre-push-update` only — not loaded when the `flow` skill is active.\n\nReview this skill"
  },
  {
    "path": ".claude/skills/host-objects/SKILL.md",
    "chars": 15721,
    "preview": "---\nname: host-objects\ndescription: >\n  Covers how to create, structure, and maintain JSI HostObjects that bridge C++ au"
  },
  {
    "path": ".claude/skills/host-objects/examples.md",
    "chars": 4701,
    "preview": "# HostObject Examples\n\n## GainNodeHostObject (no shadow state)\n\n`gain` is an `AudioParam` — no shadow state needed becau"
  },
  {
    "path": ".claude/skills/host-objects/maintenance.md",
    "chars": 1030,
    "preview": "# Maintenance — host-objects\n\n> Used by `/pre-push-update` only — not loaded when the `host-objects` skill is active.\n\nR"
  },
  {
    "path": ".claude/skills/post-work-checks/SKILL.md",
    "chars": 2924,
    "preview": "---\nname: post-work-checks\ndescription: >\n  Ordered quality gate checklist to run after every code change in react-nativ"
  },
  {
    "path": ".claude/skills/post-work-checks/maintenance.md",
    "chars": 518,
    "preview": "# Maintenance — post-work-checks\n\n> Used by `/pre-push-update` only — not loaded when the `post-work-checks` skill is ac"
  },
  {
    "path": ".claude/skills/thread-safety-itc/SKILL.md",
    "chars": 5972,
    "preview": "---\nname: thread-safety-itc\ndescription: >\n  Audio thread safety rules, lock-free inter-thread communication patterns, a"
  },
  {
    "path": ".claude/skills/thread-safety-itc/maintenance.md",
    "chars": 748,
    "preview": "# Maintenance — thread-safety-itc\n\n> Used by `/pre-push-update` only — not loaded when the `thread-safety-itc` skill is "
  },
  {
    "path": ".claude/skills/turbo-modules/SKILL.md",
    "chars": 10473,
    "preview": "---\nname: turbo-modules\ndescription: >\n  TurboModule spec, JSI binding injection, and platform native module entry point"
  },
  {
    "path": ".claude/skills/turbo-modules/maintenance.md",
    "chars": 811,
    "preview": "# Maintenance — turbo-modules\n\n> Used by `/pre-push-update` only — not loaded when the `turbo-modules` skill is active.\n"
  },
  {
    "path": ".claude/skills/utilities/SKILL.md",
    "chars": 9969,
    "preview": "---\nname: utilities\ndescription: >\n  Overview of all shared utility helpers, data structures, and DSP primitives availab"
  },
  {
    "path": ".claude/skills/utilities/api.md",
    "chars": 8838,
    "preview": "# Utilities API Reference — Full .hpp Documentation\n\n> This file contains the detailed API documentation for template/in"
  },
  {
    "path": ".claude/skills/utilities/maintenance.md",
    "chars": 1633,
    "preview": "# Maintenance — utilities\n\n> Used by `/pre-push-update` only — not loaded when the `utilities` skill is active.\n\nReview "
  },
  {
    "path": ".claude/skills/web-audio-api/SKILL.md",
    "chars": 9132,
    "preview": "---\nname: web-audio-api\ndescription: >\n  Web Audio API spec reference and browser passthrough layer (src/web-core/). Use"
  },
  {
    "path": ".claude/skills/web-audio-api/maintenance.md",
    "chars": 609,
    "preview": "# Maintenance — web-audio-api\n\n> Used by `/pre-push-update` only — not loaded when the `web-audio-api` skill is active.\n"
  },
  {
    "path": ".claude/skills/writing-skills/SKILL.md",
    "chars": 11542,
    "preview": "---\nname: writing-skills\ndescription: >\n  How to write, structure, and maintain Claude skill files. Covers the three-lev"
  },
  {
    "path": ".claude/skills/writing-skills/maintenance.md",
    "chars": 644,
    "preview": "# Maintenance — writing-skills\n\n> Used by `/pre-push-update` only — not loaded when the `writing-skills` skill is active"
  },
  {
    "path": ".editorconfig",
    "chars": 283,
    "preview": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors and IDEs\n# edit"
  },
  {
    "path": ".eslintrc.js",
    "chars": 3346,
    "preview": "/** @type {import('eslint').ESLint.ConfigData} */\nmodule.exports = {\n  root: true,\n  overrides: [\n    {\n      files: ['*"
  },
  {
    "path": ".gitattributes",
    "chars": 458,
    "preview": "*.pbxproj -text\n# specific for windows script files\n*.bat text eol=crlf\ndocs/assets/example-01.mp4 filter=lfs diff=lfs m"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 96,
    "preview": "/.github/CODEOWNERS @maciejmakowski2003 @mdydek\n/.github/workflows  @maciejmakowski2003 @mdydek\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 860,
    "preview": "# These are supported funding model platforms\n\ngithub: software-mansion\npatreon: # Replace with a single Patreon usernam"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "chars": 5287,
    "preview": "name: Bug report\ndescription: Report an issue with React Native Audio API here.\nbody:\n  - type: markdown\n    attributes:"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
    "chars": 251,
    "preview": "name: Feature request\ndescription: Suggest a feature\nbody:\n  - type: textarea\n    id: Suggestion\n    attributes:\n      l"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "chars": 1726,
    "preview": "name: Setup\ndescription: Setup Node.js and install dependencies\n\nruns:\n  using: composite\n  steps:\n    - name: Setup Nod"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 531,
    "preview": "<!-- Reference any GitHub issues resolved by this PR -->\n\nCloses #\n\n## ⚠️ Breaking changes ⚠️\n\n<!-- A brief description "
  },
  {
    "path": ".github/release.yml",
    "chars": 445,
    "preview": "changelog:\n  categories:\n    - title: ⚠️ Breaking Changes\n      labels:\n        - breaking-change\n    - title: 🚀 Feature"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1018,
    "preview": "name: CI\non:\n  pull_request:\n    branches:\n      - main\n  merge_group:\n    types:\n      - checks_requested\n\njobs:\n  lint"
  },
  {
    "path": ".github/workflows/graph-tests.yml",
    "chars": 362,
    "preview": "name: Graph Tests\non:\n  pull_request:\n    paths:\n      - 'packages/react-native-audio-api/common/cpp/audioapi/core/utils"
  },
  {
    "path": ".github/workflows/npm-audio-package-build.yml",
    "chars": 4519,
    "preview": "name: NPM Build and publish to npm\n\non:\n  schedule:\n    - cron: '01 00 * * *' # Every day at 00:01 UTC\n  workflow_dispat"
  },
  {
    "path": ".github/workflows/npm-custom-node-generator-build.yml",
    "chars": 906,
    "preview": "name: NPM[Custom Node Generator] Build and publish to npm\n\non:\n  workflow_dispatch:\n\npermissions:\n  id-token: write\n  co"
  },
  {
    "path": ".github/workflows/publish-docs.yml",
    "chars": 1230,
    "preview": "name: DOCS Build and publish audio api docs\n\non:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 635,
    "preview": "name: Tests\n\non:\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  cpp-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - "
  },
  {
    "path": ".gitignore",
    "chars": 1230,
    "preview": "# OSX\n#\n.DS_Store\n\n# XDE\n.expo/\n\n# VSCode\n.vscode/\njsconfig.json\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n"
  },
  {
    "path": ".nvmrc",
    "chars": 9,
    "preview": "v22.16.0\n"
  },
  {
    "path": ".yarn/releases/yarn-4.5.0.cjs",
    "chars": 2753677,
    "preview": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var t_e=Object.create;var vR=Object.defineProperty;var "
  },
  {
    "path": ".yarnrc.yml",
    "chars": 117,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: false\n\nnodeLinker: node-modules\n\nyarnPath: .yarn/releases/yarn-4.5.0.cjs\n"
  },
  {
    "path": "CLAUDE.md",
    "chars": 7549,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1406,
    "preview": "# Contributing\n\n## Development\n\nTo contribute by resolving already opened issues, please follow these steps:\n\n1. Fork th"
  },
  {
    "path": "LICENSE",
    "chars": 1072,
    "preview": "MIT License\n\nCopyright (c) 2024 Software Mansion\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "README.md",
    "chars": 7565,
    "preview": "<img src=\"./assets/react-native-audio-api-gh-cover.png?v0.0.1\" alt=\"React Native Audio API\" width=\"100%\">\n\n[![Ad](https:"
  },
  {
    "path": "THIRD_PARTY.md",
    "chars": 1632,
    "preview": "This project contains source code copied from Webkit implementation, which mixes BSD 2 clause and BSD 3 clause with copy"
  },
  {
    "path": "apps/CLAUDE.md",
    "chars": 8300,
    "preview": "# apps/ — Example Applications\n\nThe main example app is `fabric-example` — it uses the New Architecture (TurboModules/Fa"
  },
  {
    "path": "apps/common-app/.eslintrc.js",
    "chars": 64,
    "preview": "module.exports = {\n  root: true,\n  extends: '@react-native',\n};\n"
  },
  {
    "path": "apps/common-app/index.ts",
    "chars": 50,
    "preview": "import App from './src/App';\n\nexport default App;\n"
  },
  {
    "path": "apps/common-app/package.json",
    "chars": 1587,
    "preview": "{\n  \"name\": \"common-app\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"peerDependencies\": {\n    \"react\": \"*\",\n    \"react-"
  },
  {
    "path": "apps/common-app/prettier.config.js",
    "chars": 230,
    "preview": "/** @type {import('prettier').Config} */\nmodule.exports = {\n  plugins: [\"prettier-plugin-jsdoc\"],\n  bracketSameLine: fal"
  },
  {
    "path": "apps/common-app/scripts/dependencies.js",
    "chars": 1439,
    "preview": "const path = require('path');\n\n/**\n * @param {Object<string, string>} dependencies\n * @param {Set<string>} exclude\n */\nf"
  },
  {
    "path": "apps/common-app/src/App.tsx",
    "chars": 6632,
    "preview": "import { NavigationContainer, useNavigation } from '@react-navigation/native';\nimport { createStackNavigator } from '@re"
  },
  {
    "path": "apps/common-app/src/components/BGGradient.tsx",
    "chars": 1148,
    "preview": "import { Canvas, RadialGradient, Rect, vec } from '@shopify/react-native-skia';\nimport React, { useCallback, useState } "
  },
  {
    "path": "apps/common-app/src/components/Button.tsx",
    "chars": 920,
    "preview": "import { FC } from 'react';\nimport { Text, Pressable, StyleSheet } from 'react-native';\n\nimport { colors, layout } from "
  },
  {
    "path": "apps/common-app/src/components/Container.tsx",
    "chars": 1304,
    "preview": "import React, { PropsWithChildren } from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimpor"
  },
  {
    "path": "apps/common-app/src/components/Select.tsx",
    "chars": 2870,
    "preview": "import React, { useState } from 'react';\nimport { ScrollView } from 'react-native-gesture-handler';\nimport { Modal, View"
  },
  {
    "path": "apps/common-app/src/components/Slider.tsx",
    "chars": 4640,
    "preview": "import React, { useEffect } from 'react';\nimport {\n  View,\n  Text,\n  TextInput,\n  StyleSheet,\n  LayoutChangeEvent,\n} fro"
  },
  {
    "path": "apps/common-app/src/components/Spacer.tsx",
    "chars": 347,
    "preview": "import { FC } from 'react';\nimport { View } from 'react-native';\n\ninterface SpacerProps {\n  size: number;\n}\n\nconst Verti"
  },
  {
    "path": "apps/common-app/src/components/Switch.tsx",
    "chars": 1384,
    "preview": "import React, { type FC } from 'react';\nimport { StyleSheet, Pressable } from 'react-native';\nimport Animated, {\n  useAn"
  },
  {
    "path": "apps/common-app/src/components/VerticalSlider.tsx",
    "chars": 5281,
    "preview": "import React, { useEffect } from 'react';\nimport { View, Text, StyleSheet, TextInput } from 'react-native';\nimport { Ges"
  },
  {
    "path": "apps/common-app/src/components/icons/CheckedCircleIcon.tsx",
    "chars": 673,
    "preview": "import React from 'react';\nimport Svg, { Circle, Path } from 'react-native-svg';\n\ntype Props = {\n  selected: boolean;\n  "
  },
  {
    "path": "apps/common-app/src/components/icons/MenuIcon.tsx",
    "chars": 702,
    "preview": "import React from 'react';\nimport Svg, { Line } from 'react-native-svg';\n\ntype Props = {\n  size?: number;\n  color?: stri"
  },
  {
    "path": "apps/common-app/src/components/icons/PlayPauseIcon.tsx",
    "chars": 744,
    "preview": "import React from 'react';\nimport { View } from 'react-native';\nimport Svg, { Path, Rect } from 'react-native-svg';\n\ntyp"
  },
  {
    "path": "apps/common-app/src/components/index.ts",
    "chars": 398,
    "preview": "export { default as Button } from './Button';\nexport { default as Slider } from './Slider';\nexport { default as Spacer }"
  },
  {
    "path": "apps/common-app/src/demos/Crossfade/Crossfade.tsx",
    "chars": 13358,
    "preview": "import React, { FC, useCallback, useEffect, useState, useRef } from 'react';\nimport {\n  AudioBuffer,\n  AudioManager,\n  A"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/AutoWahPedal.tsx",
    "chars": 7800,
    "preview": "import React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimpor"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/EchoPedal.tsx",
    "chars": 4355,
    "preview": "import React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimpor"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/OverdrivePedal.tsx",
    "chars": 6169,
    "preview": "// filepath: /Users/michal/react-native-audio-api/apps/common-app/src/demos/PedalBoard/OverdrivePedal.tsx\nimport React, "
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/PedalBoard.tsx",
    "chars": 6121,
    "preview": "import React, { useEffect, useRef, useState } from 'react';\nimport {\n  AudioBufferSourceNode,\n  AudioBuffer,\n  GainNode,"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/ReverbPedal.tsx",
    "chars": 5471,
    "preview": "import React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimpor"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/curves.ts",
    "chars": 1258,
    "preview": "import { AudioContext, AudioBuffer } from 'react-native-audio-api';\n\nexport function makeDistortionCurve(k: number, samp"
  },
  {
    "path": "apps/common-app/src/demos/Record/ControlPanel.tsx",
    "chars": 924,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport Animated from 'react-native-reanim"
  },
  {
    "path": "apps/common-app/src/demos/Record/PauseButton.tsx",
    "chars": 1900,
    "preview": "import React, { FC } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport Animated, {\n  useA"
  },
  {
    "path": "apps/common-app/src/demos/Record/PlaybackVisualization.tsx",
    "chars": 3415,
    "preview": "import {\n  Canvas,\n  Group,\n  Path,\n  Skia,\n  useCanvasRef,\n  useCanvasSize,\n} from '@shopify/react-native-skia';\nimport"
  },
  {
    "path": "apps/common-app/src/demos/Record/Record.tsx",
    "chars": 7642,
    "preview": "import React, { FC, useCallback, useEffect, useState } from 'react';\nimport {\n  AudioBuffer,\n  AudioManager,\n  Recording"
  },
  {
    "path": "apps/common-app/src/demos/Record/RecordButton.tsx",
    "chars": 4233,
    "preview": "import React, { FC, useCallback } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport Animated, {"
  },
  {
    "path": "apps/common-app/src/demos/Record/RecordingTime.tsx",
    "chars": 2072,
    "preview": "import React, { useEffect } from 'react';\nimport { StyleSheet, TextInput } from 'react-native';\nimport Animated, {\n  use"
  },
  {
    "path": "apps/common-app/src/demos/Record/RecordingVisualization.tsx",
    "chars": 11301,
    "preview": "import {\n  Canvas,\n  Group,\n  Path,\n  Skia,\n  useCanvasRef,\n  useCanvasSize,\n} from '@shopify/react-native-skia';\nimport"
  },
  {
    "path": "apps/common-app/src/demos/Record/Status.tsx",
    "chars": 1049,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { RecordingState } fro"
  },
  {
    "path": "apps/common-app/src/demos/Record/TimeStream.tsx",
    "chars": 4813,
    "preview": "import React, { useEffect, useRef, useState } from 'react';\nimport { Dimensions, StyleSheet, Text, View } from 'react-na"
  },
  {
    "path": "apps/common-app/src/demos/Record/constants.tsx",
    "chars": 363,
    "preview": "const constants = {\n  sampleRate: 3125,\n  updateIntervalMS: 32,\n  barWidth: 2,\n  barGap: 2,\n  minDb: -40,\n  maxDb: 0,\n  "
  },
  {
    "path": "apps/common-app/src/demos/Record/types.ts",
    "chars": 232,
    "preview": "export enum RecordingState {\n  Idle = 'Idle',\n  Loading = 'Loading',\n  Recording = 'Recording',\n  Paused = 'Paused',\n  R"
  },
  {
    "path": "apps/common-app/src/demos/index.ts",
    "chars": 1049,
    "preview": "import { icons } from 'lucide-react-native';\n\nimport PedalBoard from './PedalBoard/PedalBoard';\nimport Record from './Re"
  },
  {
    "path": "apps/common-app/src/examples/AudioFile/AudioFile.tsx",
    "chars": 6277,
    "preview": "import React, { FC, useCallback, useEffect, useState } from 'react';\nimport { ActivityIndicator, Alert, StyleSheet, View"
  },
  {
    "path": "apps/common-app/src/examples/AudioFile/AudioPlayer.ts",
    "chars": 3980,
    "preview": "import type {\n  AudioBuffer,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\nimport {\n  AudioContext,\n  Playba"
  },
  {
    "path": "apps/common-app/src/examples/AudioFile/index.ts",
    "chars": 39,
    "preview": "export { default } from './AudioFile';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioParamPipeline/AudioParamPipeline.tsx",
    "chars": 16464,
    "preview": "import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { ScrollView, StyleSheet, Text, View"
  },
  {
    "path": "apps/common-app/src/examples/AudioParamPipeline/index.ts",
    "chars": 48,
    "preview": "export { default } from './AudioParamPipeline';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/AudioPipelineStress.tsx",
    "chars": 28761,
    "preview": "import React, { FC, useEffect, useRef, useState } from 'react';\nimport { Platform, ScrollView, StyleSheet } from 'react-"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/StopRequestedError.ts",
    "chars": 152,
    "preview": "export default class StopRequestedError extends Error {\n  constructor() {\n    super('Run stopped by user');\n    this.nam"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/StressPlaybackController.ts",
    "chars": 1537,
    "preview": "import { AudioBuffer, AudioBufferSourceNode, AudioContext } from 'react-native-audio-api';\n\nexport default class StressP"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/StressResourceOwner.ts",
    "chars": 5353,
    "preview": "import {\n  AudioBuffer,\n  AudioContext,\n  AudioManager,\n  AudioRecorder,\n  FileDirectory,\n  FileFormat,\n} from 'react-na"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/audioSessions.ts",
    "chars": 780,
    "preview": "import { AudioManager } from 'react-native-audio-api';\n\nexport async function activatePlaybackSession(): Promise<void> {"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/constants.ts",
    "chars": 437,
    "preview": "export const DEFAULT_LOOP_COUNT = 5;\nexport const PLAYBACK_PROGRESS_TIMEOUT_MS = 4000;\nexport const RECORDING_CALLBACK_T"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/helpers.ts",
    "chars": 3223,
    "preview": "import { POSITION_POLL_INTERVAL_MS } from './constants';\nimport type { PlaybackProgressStats, SerializedError } from './"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/index.ts",
    "chars": 49,
    "preview": "export { default } from './AudioPipelineStress';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/types.ts",
    "chars": 1580,
    "preview": "import type { AudioBuffer, AudioContext, AudioRecorder } from 'react-native-audio-api';\n\nimport type StressPlaybackContr"
  },
  {
    "path": "apps/common-app/src/examples/AudioTag/AudioTag.tsx",
    "chars": 1858,
    "preview": "import React, { useRef } from 'react';\nimport { Button, View } from 'react-native';\nimport { Audio, AudioTagHandle } fro"
  },
  {
    "path": "apps/common-app/src/examples/AudioTag/index.ts",
    "chars": 38,
    "preview": "export { default } from './AudioTag';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/AudioVisualizer.tsx",
    "chars": 4273,
    "preview": "import React, { useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, View } from 'react-native';\nimpo"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/Canvas.tsx",
    "chars": 1388,
    "preview": "import React, {\n  useContext,\n  createContext,\n  PropsWithChildren,\n  useMemo,\n} from 'react';\nimport { StyleSheet } fro"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/Charts.tsx",
    "chars": 3872,
    "preview": "import React, { useMemo } from 'react';\nimport {\n  Points,\n  vec,\n  Line,\n  Circle,\n  Skia,\n  PaintStyle,\n  SkPoint,\n} f"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/FreqTimeChart.tsx",
    "chars": 718,
    "preview": "import React from 'react';\n\nimport { withCanvas } from './Canvas';\nimport Charts from './Charts';\n\ninterface FreqTimeCha"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/index.ts",
    "chars": 45,
    "preview": "export { default } from './AudioVisualizer';\n"
  },
  {
    "path": "apps/common-app/src/examples/ConvolverIR/ConvolverIR.tsx",
    "chars": 5174,
    "preview": "import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { StyleSheet, Text } from 'react-nat"
  },
  {
    "path": "apps/common-app/src/examples/ConvolverIR/index.ts",
    "chars": 41,
    "preview": "export { default } from './ConvolverIR';\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/DrumMachine.tsx",
    "chars": 4865,
    "preview": "import { Canvas, useCanvasRef } from '@shopify/react-native-skia';\nimport React, { useState, useCallback, useLayoutEffec"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/Grid.tsx",
    "chars": 1949,
    "preview": "import React, { memo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport { Line, Circle, Paint, vec } from"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/NotesHighlight.tsx",
    "chars": 1675,
    "preview": "import React, { memo } from 'react';\nimport { Circle, Paint } from '@shopify/react-native-skia';\nimport { SharedValue, u"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/PatternShape.tsx",
    "chars": 2012,
    "preview": "import React, { useMemo } from 'react';\nimport { Circle, Paint, Path, vec, Skia } from '@shopify/react-native-skia';\n\nim"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/PlayButton.tsx",
    "chars": 2470,
    "preview": "import Animated, {\n  withTiming,\n  SharedValue,\n  useAnimatedStyle,\n} from 'react-native-reanimated';\nimport React, { us"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/constants.ts",
    "chars": 601,
    "preview": "import { Dimensions } from 'react-native';\nimport type { InstrumentName, XYPoint } from '../../types';\n\nexport const scr"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/index.ts",
    "chars": 41,
    "preview": "export { default } from './DrumMachine';\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/instruments.ts",
    "chars": 472,
    "preview": "import { maxSize } from './constants';\nimport type { Instrument } from '../../types';\n\nexport const HiHat: Instrument = "
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/presets.ts",
    "chars": 7628,
    "preview": "import type { Preset } from '../../types';\nimport { numBeats } from './constants';\n\nconst Empty: Preset = {\n  name: 'Emp"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/useGestures.ts",
    "chars": 2720,
    "preview": "import { runOnJS, useSharedValue } from 'react-native-reanimated';\nimport {\n  Gesture,\n  GestureUpdateEvent,\n  PanGestur"
  },
  {
    "path": "apps/common-app/src/examples/Metronome/Metronome.tsx",
    "chars": 2296,
    "preview": "import { AudioContext } from 'react-native-audio-api';\nimport React, { useState, useCallback, FC } from 'react';\n\nimport"
  },
  {
    "path": "apps/common-app/src/examples/Metronome/index.tsx",
    "chars": 39,
    "preview": "export { default } from './Metronome';\n"
  },
  {
    "path": "apps/common-app/src/examples/Metronome/patterns.ts",
    "chars": 1993,
    "preview": "import type { Pattern } from '../../types';\n\nconst oneBeatPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    "
  },
  {
    "path": "apps/common-app/src/examples/OfflineRendering/OfflineRendering.tsx",
    "chars": 2449,
    "preview": "import React, { useCallback, useState, FC } from 'react';\nimport {\n  AudioBuffer,\n  AudioContext,\n  OfflineAudioContext,"
  },
  {
    "path": "apps/common-app/src/examples/OfflineRendering/index.ts",
    "chars": 46,
    "preview": "export { default } from './OfflineRendering';\n"
  },
  {
    "path": "apps/common-app/src/examples/Oscillator/Oscillator.tsx",
    "chars": 5807,
    "preview": "import React, { useRef, useState, useEffect, FC } from 'react';\nimport { StyleSheet, Text, View, Pressable } from 'react"
  },
  {
    "path": "apps/common-app/src/examples/Oscillator/index.tsx",
    "chars": 40,
    "preview": "export { default } from './Oscillator';\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/Keyboard.tsx",
    "chars": 2235,
    "preview": "import { FC } from 'react';\nimport { View, StyleSheet, Pressable } from 'react-native';\n\nimport { colors } from '../../s"
  },
  {
    "path": "apps/common-app/src/examples/Piano/Piano.tsx",
    "chars": 1675,
    "preview": "import { FC, useEffect, useRef } from 'react';\nimport { AudioContext, AudioBuffer } from 'react-native-audio-api';\n\nimpo"
  },
  {
    "path": "apps/common-app/src/examples/Piano/PianoNote.tsx",
    "chars": 1574,
    "preview": "import {\n  GainNode,\n  AudioBuffer,\n  AudioContext,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\n\nimport { "
  },
  {
    "path": "apps/common-app/src/examples/Piano/index.ts",
    "chars": 35,
    "preview": "export { default } from './Piano';\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/utils.ts",
    "chars": 3012,
    "preview": "import { AudioBuffer } from 'react-native-audio-api';\n\nexport type KeyName =\n  | 'C4'\n  | 'C#4'\n  | 'D4'\n  | 'D#4'\n  | '"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/PlaybackSpeed.tsx",
    "chars": 5198,
    "preview": "import React, {\n  useState,\n  FC,\n  useRef,\n  useEffect,\n  useCallback,\n  useMemo,\n} from 'react';\nimport { View, StyleS"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/constants.ts",
    "chars": 595629,
    "preview": "const PCM_DATA1 =\n  'BQADAAEAAAAAAAEA/P/4//v//f///wAAAAD///7//f/+////AQAAAP//AQACAAEAAQD///3//f/+//7//P/6//r//P/9//r/+P/"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/helpers.ts",
    "chars": 418,
    "preview": "import { TimeStretchingAlgorithm, AudioSettings } from './types';\n\nexport const getAudioSettings = (\n  algorithm: TimeSt"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/index.ts",
    "chars": 43,
    "preview": "export { default } from './PlaybackSpeed';\n"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/types.ts",
    "chars": 285,
    "preview": "export type TimeStretchingAlgorithm = 'linear' | 'pitchCorrection' | 'PSOLA';\n\nexport interface AudioSettings {\n  pitchC"
  },
  {
    "path": "apps/common-app/src/examples/Record/Record.tsx",
    "chars": 7031,
    "preview": "import React, { FC, useCallback, useEffect, useState, useRef } from 'react';\nimport { Alert, Text, View } from 'react-na"
  },
  {
    "path": "apps/common-app/src/examples/Streaming/Streaming.tsx",
    "chars": 2237,
    "preview": "import React, { FC, useEffect, useRef } from 'react';\nimport { AudioContext, GainNode, StreamerNode } from 'react-native"
  },
  {
    "path": "apps/common-app/src/examples/Worklets/Worklets.tsx",
    "chars": 8044,
    "preview": "import { useEffect, useRef, useState } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport {\n  A"
  },
  {
    "path": "apps/common-app/src/examples/index.ts",
    "chars": 3278,
    "preview": "import { StackNavigationProp } from '@react-navigation/stack';\nimport { icons } from 'lucide-react-native';\n\nimport Audi"
  },
  {
    "path": "apps/common-app/src/singletons/index.ts",
    "chars": 169,
    "preview": "import { AudioContext, AudioRecorder } from 'react-native-audio-api';\n\nexport const audioContext = new AudioContext();\ne"
  },
  {
    "path": "apps/common-app/src/styles.ts",
    "chars": 508,
    "preview": "import { Dimensions } from 'react-native';\n\nconst { width } = Dimensions.get('screen');\n\nexport const layout = {\n  spaci"
  },
  {
    "path": "apps/common-app/src/testComponents/ControlBar.tsx",
    "chars": 796,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { Button } from '../componen"
  },
  {
    "path": "apps/common-app/src/testComponents/CurrentStepCard.tsx",
    "chars": 937,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } fro"
  },
  {
    "path": "apps/common-app/src/testComponents/EmptyState.tsx",
    "chars": 571,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } fro"
  },
  {
    "path": "apps/common-app/src/testComponents/Header.tsx",
    "chars": 687,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors } from '../st"
  },
  {
    "path": "apps/common-app/src/testComponents/LiveLog.tsx",
    "chars": 1096,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } fro"
  },
  {
    "path": "apps/common-app/src/testComponents/ScenarioCard.tsx",
    "chars": 1253,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } fro"
  },
  {
    "path": "apps/common-app/src/testComponents/ScenarioResults.tsx",
    "chars": 882,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport EmptyState from './EmptyStat"
  },
  {
    "path": "apps/common-app/src/testComponents/SectionTitle.tsx",
    "chars": 446,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text } from 'react-native';\n\nimport { colors } from '../styles';"
  },
  {
    "path": "apps/common-app/src/testComponents/StatusPill.tsx",
    "chars": 800,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors } from '../st"
  },
  {
    "path": "apps/common-app/src/testComponents/StepRow.tsx",
    "chars": 1166,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors } from '../st"
  },
  {
    "path": "apps/common-app/src/testComponents/Summary.tsx",
    "chars": 702,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { layout } from '../styles';"
  },
  {
    "path": "apps/common-app/src/testComponents/SummaryBadge.tsx",
    "chars": 825,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } fro"
  },
  {
    "path": "apps/common-app/src/testComponents/UnsupportedNotice.tsx",
    "chars": 779,
    "preview": "import React, { FC } from 'react';\nimport { StyleSheet, Text } from 'react-native';\n\nimport { Spacer } from '../componen"
  },
  {
    "path": "apps/common-app/src/testComponents/index.ts",
    "chars": 1101,
    "preview": "import ControlBar from './ControlBar';\nimport CurrentStepCard from './CurrentStepCard';\nimport EmptyState from './EmptyS"
  },
  {
    "path": "apps/common-app/src/testComponents/statusStyles.ts",
    "chars": 382,
    "preview": "import { colors } from '../styles';\nimport type { ScenarioStatus, TestStatus } from './types';\n\nexport const statusTextC"
  },
  {
    "path": "apps/common-app/src/testComponents/types.ts",
    "chars": 549,
    "preview": "export type TestStatus = 'pass' | 'fail' | 'info' | 'skipped';\nexport type ScenarioStatus = 'pass' | 'fail' | 'skipped';"
  },
  {
    "path": "apps/common-app/src/types.ts",
    "chars": 674,
    "preview": "export type InstrumentName =\n  | 'kick'\n  | 'clap'\n  | 'hi-hat'\n  | 'downbeat'\n  | 'regularbeat';\n\nexport interface Inst"
  },
  {
    "path": "apps/common-app/src/utils/skiUtils.ts",
    "chars": 594,
    "preview": "export function getAngle(stepIdx: number, maxSteps: number) {\n  'worklet';\n\n  return (stepIdx / maxSteps) * Math.PI * 2 "
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/Clap.ts",
    "chars": 2013,
    "preview": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass Clap im"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/HiHat.ts",
    "chars": 1891,
    "preview": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass HiHat i"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/Kick.ts",
    "chars": 1077,
    "preview": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass Kick im"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/MetronomeSound.ts",
    "chars": 1028,
    "preview": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass Metrono"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/SoundEngine.ts",
    "chars": 202,
    "preview": "import { AudioContext } from 'react-native-audio-api';\n\nexport interface SoundEngine {\n  audioContext: AudioContext;\n  t"
  },
  {
    "path": "apps/common-app/src/utils/usePlayer.tsx",
    "chars": 4283,
    "preview": "import { AudioContext } from 'react-native-audio-api';\nimport { useSharedValue } from 'react-native-reanimated';\nimport "
  },
  {
    "path": "apps/common-app/src/utils/withSeparators.ts",
    "chars": 539,
    "preview": "import { ReactNode } from 'react';\n\ntype RenderElement<T> = (element: T, index: number) => ReactNode;\ntype RenderSeparat"
  },
  {
    "path": "apps/common-app/tsconfig.json",
    "chars": 148,
    "preview": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"types\": [\"jest\"],\n    \"moduleSuffixes\": [\".ios\", \".and"
  },
  {
    "path": "apps/common-app/types.d.ts",
    "chars": 16,
    "preview": "module '*.mp3';\n"
  },
  {
    "path": "apps/fabric-example/.bundle/config",
    "chars": 59,
    "preview": "BUNDLE_PATH: \"vendor/bundle\"\nBUNDLE_FORCE_RUBY_PLATFORM: 1\n"
  },
  {
    "path": "apps/fabric-example/.watchmanconfig",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "apps/fabric-example/App.tsx",
    "chars": 51,
    "preview": "import App from 'common-app';\n\nexport default App;\n"
  },
  {
    "path": "apps/fabric-example/Gemfile",
    "chars": 520,
    "preview": "source 'https://rubygems.org'\n\n# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version\nruby \""
  },
  {
    "path": "apps/fabric-example/README.md",
    "chars": 4432,
    "preview": "This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](ht"
  },
  {
    "path": "apps/fabric-example/android/app/build.gradle",
    "chars": 4744,
    "preview": "apply plugin: \"com.android.application\"\napply plugin: \"org.jetbrains.kotlin.android\"\napply plugin: \"com.facebook.react\"\n"
  },
  {
    "path": "apps/fabric-example/android/app/proguard-rules.pro",
    "chars": 435,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /u"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/AndroidManifest.xml",
    "chars": 1796,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permis"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/java/com/fabricexample/MainActivity.kt",
    "chars": 946,
    "preview": "package com.fabricexample\n\nimport android.Manifest\nimport android.os.Bundle\nimport androidx.core.app.ActivityCompat\nimpo"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/java/com/fabricexample/MainApplication.kt",
    "chars": 789,
    "preview": "package com.fabricexample\n\nimport android.app.Application\nimport com.facebook.react.PackageList\nimport com.facebook.reac"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 4867,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n    android:height=\"108dp\"\n    android:width=\"108dp\"\n    android:viewport"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/logo.xml",
    "chars": 5978,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"36dp\"\n    android:height=\"40dp\"\n  "
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/pause.xml",
    "chars": 422,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:aapt=\"http://schemas.android.com/aapt\"\n    and"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/resume.xml",
    "chars": 533,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:aapt=\"http://schemas.android.com/aapt\"\n    andr"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/rn_edit_text_material.xml",
    "chars": 1917,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2014 The Android Open Source Project\n\n     Licensed under the "
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 265,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 265,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/values/ic_launcher_background.xml",
    "chars": 120,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/values/strings.xml",
    "chars": 76,
    "preview": "<resources>\n    <string name=\"app_name\">FabricExample</string>\n</resources>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/values/styles.xml",
    "chars": 282,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.DayNight.NoActionBa"
  },
  {
    "path": "apps/fabric-example/android/build.gradle",
    "chars": 547,
    "preview": "buildscript {\n    ext {\n        buildToolsVersion = \"36.0.0\"\n        minSdkVersion = 24\n        compileSdkVersion = 36\n "
  },
  {
    "path": "apps/fabric-example/android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 252,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "apps/fabric-example/android/gradle.properties",
    "chars": 1975,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "apps/fabric-example/android/gradlew",
    "chars": 8595,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
  },
  {
    "path": "apps/fabric-example/android/gradlew.bat",
    "chars": 3093,
    "preview": "@REM Copyright (c) Meta Platforms, Inc. and affiliates.\r\n@REM\r\n@REM This source code is licensed under the MIT license f"
  }
]

// ... and 992 more files (download for full content)

About this extraction

This page contains the full source code of the software-mansion/react-native-audio-api GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1192 files (17.5 MB), approximately 4.7M tokens, and a symbol index with 17887 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!