{"version":3,"file":"docs-2f55905df80fbb929f663f7b3fe0f3d2.js","names":["define","_exports","_application","_emberResolver","_emberLoadInitializers","_environment","_defineProperty","e","r","t","i","Symbol","toPrimitive","call","TypeError","String","Number","_toPrimitive","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","default","App","constructor","args","super","this","modulePrefix","podModulePrefix","_templateFactory","createTemplateFactory","id","block","moduleName","isStrictMode","_emberComponentManager","get","_xClass","_xComponent","_xImportPath","_xMetaPanel","_header","_xModule","_xSection","_xSections","_xToggles","_component","_component2","_service","_class","_descriptor","__COLOCATED_TEMPLATE__","CachedSound","l","initializer","loadedItems","stereo","sounds","loadedSoundCountSentence","count","length","prototype","service","n","a","keys","forEach","slice","reverse","reduce","setComponentTemplate","_templateOnly","_copyButton","_tracking","_object","_descriptor2","_descriptor3","_descriptor4","_descriptor5","_initializerDefineProperty","_applyDecoratedDescriptor","DiagnosticControls","connectionLoader","connections","items","testSounds","setConnectionStrategy","option","connectionStrategy","target","useConnections","names","filter","name","selectedConnections","includes","updateSelectedStrategies","op","d","concat","updateMetadata","sound","url","findSound","metadata","formattedMetadata","parsedMetadata","trim","JSON","parse","error","message","metadataError","selectPreset","item","stringify","title","tracked","action","getOwnPropertyDescriptor","_docsCodeHighlight","_docsDemo","_xExample","_xSnippet","_docsHeader","_link","_searchBox","_searchResult","_searchResults","_versionSelector","_docsHero","_docsKeyboardShortcuts","_docsLink","_docsLogo","_docsModalDialog","_docsSnippet","_docsViewer","_xAutogeneratedApiDocs","_moduleNav","_xCurrentPageIndex","_xMain","_xNavItem","_xNavList","_xNav","AutoplayChecking","playAfterDelay","togglePause","window","setTimeout","async","play","AutoplayGotchas","fetchUrl","Promise","resolve","togglePlaySound","load","silenceErrors","_stereo","CastPlayer","SERVICE_EVENT_MAP","map","event","startsWith","deviceLabel","castDeviceName","castKind","prepare","_handlers","castEvents","handler","_record","on","teardown","off","currentSound","nowPlaying","setNowPlaying","stamp","Date","toLocaleTimeString","artist","stopCasting","log","device","DocsCastSupport","supportedKind","supportedCastType","DocsCurrentBrowser","browserName","userAgent","osName","DocsCustomPositionControlComponent","onChangePosition","position","lastSelectedPosition","oppositeBrowser","DocsPeekSnippetComponent","label","toggle","isExpanded","ProxyExample","remove","removeSound","Queued","playSound","queue","playNext","audioElement","setAttribute","Math","floor","random","console","next","shift","ServiceExample","_asyncArrowRuntime","buildTask","context","generator","then","catch","StereoPlayerChanger","select","identifier","DocsStereoPlayerExampleComponent","DocsThemeToggleComponent","theme","DocsTryMultipleUrlsComponent","playTask","perform","_positionedContainer","_basicDialog","_inPlaceDialog","_liquidDialog","_liquidTetherDialog","_tetherDialog","_overlay","_emberTether","_emberWormhole","_array","_emberConcurrency","EventDisplay","arguments","addSoundEvents","addServiceEvents","debug","loadSoundFromUrlTask","didCancel","eventListGroupings","groupedEvents","eventsList","lastItem","pop","set","push","willDestroy","removeEvents","EVENT_MAP","data","pushObject","type","displayEvent","$E","A","_formatJson","_modalDialog","PlayButtonComponent","draw","canvas","h","height","w","width","ctx","getContext","clearRect","percent","increase","drawLineSegment","x","start","stop","color","moveTo","strokeStyle","lineTo","stroke","beginPath","drawLine","limit","point","p","top","resizeCanvas","scale","dims","parentElement","getBoundingClientRect","ServiceDisplay","SoundDisplay","loadedSound","usingSingleAudioElement","useSharedAudioAccess","hasControlOfAudioElement","connection","sharedAudioAccess","hasControl","allConnections","isCurrentSound","connectionChoices","strategies","strategy","canPlay","canSwitchConnections","switchConnection","key","connectionKey","swap","timeout","inspectSound","onRemoval","_runloop","Position","didInsert","element","handleTap","center","gesture","isFastForwardable","isRewindable","rect","positionPercentage","newPosition","parseFloat","duration","parseInt","dragAdjustment","updatePosition","deltaX","changePercentage","newPercentage","updatePlayheadPosition","pxPosition","throttle","handlePanEnd","Volume","numOfNotches","Array","notchCount","activeNotches","volume","_stereoUrl","_strategy","StrategyBreakdown","loadWasAttempted","isResolved","isErrored","strategyResults","filledOutResults","_debug","results","tried","isArray","found","find","connectionClass","_containerDebugAdapter","_controller","onDemandUrl","_dataAdapter","_and","_helper","_regexp","appVersion","_","hash","version","APP","versionOnly","hideSha","shaOnly","hideVersion","match","showExtended","versionExtendedRegExp","versionRegExp","shaRegExp","helper","_append","append","_autoplayAllowed","_breakOn","_call","_cancelAll","_capitalize","_castingAvailable","_chunk","chunk","_compact","_compute","compute","_currentSound","_dec","dec","_drop","_util","EnsureSafeComponentHelper","_entries","entries","_eq","_fastforwardSound","_filterBy","_filter","_findBy","_findSound","_flatten","flatten","_fromEntries","fromEntries","_getCodeSnippet","_groupBy","_gt","_gte","_hasNext","hasNext","_hasPrevious","hasPrevious","_ifKey","_ignoreChildren","_inc","inc","_includes","_intersect","_invoke","invoke","_isArray","_isCasting","_isClipboardSupported","_isEmpty","_isEqual","_join","_jsonStringify","_keys","_loadSound","_lt","_lte","_mapBy","_map","_next","_noop","noop","_notEq","_not","_numericDuration","_objectAt","objectAt","_onKey","_optional","optional","_or","_pageTitle","_pauseSound","_perform","_pick","pick","_pipeAction","_pipe","pipe","_playSound","_pluralize","_preventDefault","preventDefault","_previous","previous","_queue","_range","range","_reduce","_rejectBy","_repeat","repeat","_reverse","_rewindSound","_seekSound","_set","_shuffle","shuffle","_singularize","_slice","_sortBy","_soundDuration","_soundEndTimestamp","_soundErrorDetails","_soundIsBlocked","_soundIsErrored","_soundIsFastforwardable","_soundIsLoaded","_soundIsLoading","_soundIsPlaying","_soundIsRewindable","_soundIsSeekable","_soundMetadata","_soundPositionTimestamp","_soundPosition","_soundStartTimestamp","_stereoVolumeIsAdjustable","_stereoVolume","_stopPropagation","stopPropagation","_stopSound","success","status","params","userSelected","_svgJar","svgJar","_take","_task","_toggleAction","_togglePlaySound","_toggleStereoMute","_toggle","_typeSignature","_union","_userAgent","_values","values","_without","without","_xor","_initializerFactory","initialize","_deprecationSupport","application","registerOptionsForType","singleton","_routeAnchorJump","_addModalsContainer","_clearDoubleBoot","_emberRouterScroll","_none","_castButton","_clipboard","_didInsert","_didPan","_didUpdate","_soundPositionProgress","_soundPositionSlider","_style","_willDestroy","_router","Router","locationType","rootURL","docsRoute","route","path","_route","AutoplayTestRoute","AutoplayRoute","_testSounds","model","Index","Players","swappable","unplayable","Sync","_docs","_item","redirect","router","replaceWith","DocsTestingRoute","_ensureRegistered","playGood","playBad","playBlank","_docsRoutes","_docsSearch","_docsStore","_fastboot","_keyboard","_configUtils","computedFromConfig","prop","computed","extend","hasEmberTether","hasLiquidWormhole","hasLiquidTether","destinationElementId","getDestinationElementIdFromConfig","_projectVersion","_routerScroll","_store","STORAGE_KEY","storedPreference","localStorage","getItem","systemPrefersDark","matchMedia","matches","isDark","preference","document","documentElement","dataset","setItem","_base","_chromecast","_hls","_howler","_nativeAudioCasting","_nativeAudio","_transform","BooleanTransform","DateTransform","NumberTransform","StringTransform","_parseTouchData","isHorizontal","isVertical","parseInitialTouchData","parseTouchData","WNYC_HLS_STREAM","WNYC_AAC_STREAM","WFMU_STREAM","THE_CURRENT_STREAM","STREAM_WITHOUT_EXTENSION","OGG_WITH_CORS","OGG_FILE","MP3_ON_DEMAND_2","MP3_ON_DEMAND","KOOP_STREAM","KMART_SHOPPERS","KLKT_STREAM","KEXP_STREAM","INVALID_STREAM","HLS_FIXED_TEST","HLS_BIPBOP","urlObject","urlPromise","findTouchById","touchList","touch","isSimulatedMouseEvent","mouseEvent","isChromeFakeEvent","sourceCapabilities","firesTouchEvents","isMozFakeEvent","mozInputSource","isFastClickFakeEvent","forwardedTouchEvent","FastBoot","config","metaName","prefix","rawConfig","querySelector","getAttribute","exports","decodeURIComponent","err","Error","runningTests","require","create"],"sources":["vendor/ember-cli/app-prefix.js","docs/app.js","docs/application.js","docs/autoplay-test.js","docs/component-managers/glimmer.js","docs/components/api/x-class.js","docs/components/api/x-component.js","docs/components/api/x-import-path.js","docs/components/api/x-meta-panel.js","docs/components/api/x-meta-panel/header.js","docs/components/api/x-module.js","docs/components/api/x-section.js","docs/components/api/x-sections.js","docs/components/api/x-toggles.js","docs/components/cached-sounds.js","docs/components/component-label.js","docs/components/copy-button.js","docs/components/debug-details.js","docs/components/debug-details/section.js","docs/components/diagnostic-controls.js","docs/components/docs-code-highlight.js","docs/components/docs-demo.js","docs/components/docs-demo/x-example.js","docs/components/docs-demo/x-snippet.js","docs/components/docs-header.js","docs/components/docs-header/link.js","docs/components/docs-header/search-box.js","docs/components/docs-header/search-result.js","docs/components/docs-header/search-results.js","docs/components/docs-header/version-selector.js","docs/components/docs-hero.js","docs/components/docs-keyboard-shortcuts.js","docs/components/docs-link.js","docs/components/docs-logo.js","docs/components/docs-modal-dialog.js","docs/components/docs-snippet.js","docs/components/docs-viewer.js","docs/components/docs-viewer/x-autogenerated-api-docs.js","docs/components/docs-viewer/x-autogenerated-api-docs/module-nav.js","docs/components/docs-viewer/x-current-page-index.js","docs/components/docs-viewer/x-main.js","docs/components/docs-viewer/x-nav-item.js","docs/components/docs-viewer/x-nav-list.js","docs/components/docs-viewer/x-nav.js","docs/components/docs-viewer/x-section.js","docs/components/docs/attention-getter.js","docs/components/docs/autoplay-checking.js","docs/components/docs/autoplay-gotchas.js","docs/components/docs/cast-player.js","docs/components/docs/cast-support.js","docs/components/docs/current-browser.js","docs/components/docs/current-os.js","docs/components/docs/custom-metadata.js","docs/components/docs/custom-position-control.js","docs/components/docs/event-display.js","docs/components/docs/manual-position-control.js","docs/components/docs/other-browser.js","docs/components/docs/peek-snippet.js","docs/components/docs/proxy-example.js","docs/components/docs/queued.js","docs/components/docs/service-errors-silence-error.js","docs/components/docs/service-errors-throw-error.js","docs/components/docs/service-errors-try-catch.js","docs/components/docs/service-errors-try-then.js","docs/components/docs/service-example.js","docs/components/docs/stereo-player-changer.js","docs/components/docs/stereo-player-example.js","docs/components/docs/stereo-player-modifiers.js","docs/components/docs/stereo-player.js","docs/components/docs/stereo-simple-example.js","docs/components/docs/strategy-breakdown.js","docs/components/docs/template-errors-example.js","docs/components/docs/theme-toggle.js","docs/components/docs/try-multiple-urls.js","docs/components/ember-modal-dialog-positioned-container.js","docs/components/ember-modal-dialog/-basic-dialog.js","docs/components/ember-modal-dialog/-in-place-dialog.js","docs/components/ember-modal-dialog/-liquid-dialog.js","docs/components/ember-modal-dialog/-liquid-tether-dialog.js","docs/components/ember-modal-dialog/-tether-dialog.js","docs/components/ember-modal-dialog/overlay.js","docs/components/ember-tether.js","docs/components/ember-wormhole.js","docs/components/event-display.js","docs/components/format-json.js","docs/components/modal-dialog.js","docs/components/play-button.js","docs/components/service-display.js","docs/components/sound-display.js","docs/components/sound-display/controls.js","docs/components/sound-display/position.js","docs/components/sound-display/volume.js","docs/components/sound-properties.js","docs/components/sound-properties/prop.js","docs/components/strategy-breakdown.js","docs/components/strategy-breakdown/connection.js","docs/container-debug-adapter.js","docs/controllers/docs.js","docs/controllers/docs/playing-sounds.js","docs/data-adapter.js","docs/diagnostic.js","docs/diagnostic/index.js","docs/diagnostic/players.js","docs/diagnostic/sync.js","docs/docs.js","docs/docs/advanced.js","docs/docs/browser-audio.js","docs/docs/casting.js","docs/docs/debugging.js","docs/docs/event-monitoring.js","docs/docs/index.js","docs/docs/metadata.js","docs/docs/playing-sounds.js","docs/docs/testing.js","docs/docs/upgrading.js","docs/helpers/and.js","docs/helpers/app-version.js","docs/helpers/append.js","docs/helpers/autoplay-allowed.js","docs/helpers/break-on.js","docs/helpers/call.js","docs/helpers/cancel-all.js","docs/helpers/capitalize.js","docs/helpers/casting-available.js","docs/helpers/chunk.js","docs/helpers/compact.js","docs/helpers/compute.js","docs/helpers/current-sound.js","docs/helpers/dec.js","docs/helpers/drop.js","docs/helpers/ensure-safe-component.js","docs/helpers/entries.js","docs/helpers/eq.js","docs/helpers/fastforward-sound.js","docs/helpers/filter-by.js","docs/helpers/filter.js","docs/helpers/find-by.js","docs/helpers/find-sound.js","docs/helpers/flatten.js","docs/helpers/from-entries.js","docs/helpers/get-code-snippet.js","docs/helpers/group-by.js","docs/helpers/gt.js","docs/helpers/gte.js","docs/helpers/has-next.js","docs/helpers/has-previous.js","docs/helpers/if-key.js","docs/helpers/ignore-children.js","docs/helpers/inc.js","docs/helpers/includes.js","docs/helpers/intersect.js","docs/helpers/invoke.js","docs/helpers/is-array.js","docs/helpers/is-casting.js","docs/helpers/is-clipboard-supported.js","docs/helpers/is-empty.js","docs/helpers/is-equal.js","docs/helpers/join.js","docs/helpers/json-stringify.js","docs/helpers/keys.js","docs/helpers/load-sound.js","docs/helpers/lt.js","docs/helpers/lte.js","docs/helpers/map-by.js","docs/helpers/map.js","docs/helpers/next.js","docs/helpers/noop.js","docs/helpers/not-eq.js","docs/helpers/not.js","docs/helpers/numeric-duration.js","docs/helpers/object-at.js","docs/helpers/on-key.js","docs/helpers/optional.js","docs/helpers/or.js","docs/helpers/page-title.js","docs/helpers/pause-sound.js","docs/helpers/perform.js","docs/helpers/pick.js","docs/helpers/pipe-action.js","docs/helpers/pipe.js","docs/helpers/play-sound.js","docs/helpers/pluralize.js","docs/helpers/prevent-default.js","docs/helpers/previous.js","docs/helpers/queue.js","docs/helpers/range.js","docs/helpers/reduce.js","docs/helpers/reject-by.js","docs/helpers/repeat.js","docs/helpers/reverse.js","docs/helpers/rewind-sound.js","docs/helpers/seek-sound.js","docs/helpers/set.js","docs/helpers/shuffle.js","docs/helpers/singularize.js","docs/helpers/slice.js","docs/helpers/sort-by.js","docs/helpers/sound-duration.js","docs/helpers/sound-end-timestamp.js","docs/helpers/sound-error-details.js","docs/helpers/sound-is-blocked.js","docs/helpers/sound-is-errored.js","docs/helpers/sound-is-fastforwardable.js","docs/helpers/sound-is-loaded.js","docs/helpers/sound-is-loading.js","docs/helpers/sound-is-playing.js","docs/helpers/sound-is-rewindable.js","docs/helpers/sound-is-seekable.js","docs/helpers/sound-metadata.js","docs/helpers/sound-position-timestamp.js","docs/helpers/sound-position.js","docs/helpers/sound-start-timestamp.js","docs/helpers/stereo-volume-is-adjustable.js","docs/helpers/stereo-volume.js","docs/helpers/stop-propagation.js","docs/helpers/stop-sound.js","docs/helpers/strategy-status.js","docs/helpers/svg-jar.js","docs/helpers/take.js","docs/helpers/task.js","docs/helpers/toggle-action.js","docs/helpers/toggle-play-sound.js","docs/helpers/toggle-stereo-mute.js","docs/helpers/toggle.js","docs/helpers/type-signature.js","docs/helpers/union.js","docs/helpers/user-agent.js","docs/helpers/values.js","docs/helpers/without.js","docs/helpers/xor.js","docs/index.js","docs/initializers/app-version.js","docs/initializers/ember-data.js","docs/initializers/route-anchor-jump.js","docs/instance-initializers/add-modals-container.js","docs/instance-initializers/clear-double-boot.js","docs/instance-initializers/ember-router-scroll.js","docs/instance-initializers/user-agent.js","docs/locations/none.js","docs/modifiers/cast-button.js","docs/modifiers/clipboard.js","docs/modifiers/did-insert.js","docs/modifiers/did-pan.js","docs/modifiers/did-update.js","docs/modifiers/on-key.js","docs/modifiers/sound-position-progress.js","docs/modifiers/sound-position-slider.js","docs/modifiers/stereo-volume.js","docs/modifiers/style.js","docs/modifiers/will-destroy.js","docs/not-found.js","docs/router.js","docs/routes/autoplay-test.js","docs/routes/autoplay.js","docs/routes/diagnostic.js","docs/routes/diagnostic/index.js","docs/routes/diagnostic/players.js","docs/routes/diagnostic/sync.js","docs/routes/docs.js","docs/routes/docs/api/item.js","docs/routes/docs/audio-format.js","docs/routes/docs/autoplay.js","docs/routes/docs/error-handling.js","docs/routes/docs/testing.js","docs/routes/docs/volume.js","docs/routes/docs/waiting-for-sounds.js","docs/routes/index.js","docs/services/-ensure-registered.js","docs/services/audio.js","docs/services/docs-routes.js","docs/services/docs-search.js","docs/services/docs-store.js","docs/services/fastboot.js","docs/services/keyboard.js","docs/services/modal-dialog.js","docs/services/page-title.js","docs/services/project-version.js","docs/services/router-scroll.js","docs/services/stereo.js","docs/services/store.js","docs/services/theme.js","docs/services/user-agent.js","docs/stereo-connections/base.js","docs/stereo-connections/chromecast.js","docs/stereo-connections/hls.js","docs/stereo-connections/howler.js","docs/stereo-connections/native-audio-casting.js","docs/stereo-connections/native-audio.js","docs/templates/application.js","docs/templates/autoplay-test.js","docs/templates/diagnostic.js","docs/templates/diagnostic/index.js","docs/templates/diagnostic/players.js","docs/templates/diagnostic/sync.js","docs/templates/docs.js","docs/templates/docs/advanced.js","docs/templates/docs/api/item.js","docs/templates/docs/browser-audio.js","docs/templates/docs/casting.js","docs/templates/docs/debugging.js","docs/templates/docs/event-monitoring.js","docs/templates/docs/index.js","docs/templates/docs/metadata.js","docs/templates/docs/playing-sounds.js","docs/templates/docs/testing.js","docs/templates/docs/upgrading.js","docs/templates/index.js","docs/templates/not-found.js","docs/transforms/boolean.js","docs/transforms/date.js","docs/transforms/number.js","docs/transforms/string.js","docs/utils/parse-touch-data.js","docs/utils/test-sounds.js","docs/utils/touch-utils.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","define(\"docs/app\", [\"exports\", \"@ember/application\", \"ember-resolver\", \"ember-load-initializers\", \"docs/config/environment\"], function (_exports, _application, _emberResolver, _emberLoadInitializers, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/application\",0,\"ember-resolver\",0,\"ember-load-initializers\",0,\"docs/config/environment\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  class App extends _application.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"modulePrefix\", _environment.default.modulePrefix);\n      _defineProperty(this, \"podModulePrefix\", _environment.default.podModulePrefix);\n      _defineProperty(this, \"Resolver\", _emberResolver.default);\n    }\n  }\n  _exports.default = App;\n  (0, _emberLoadInitializers.default)(App, _environment.default.modulePrefix);\n});","define(\"docs/application\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{outlet}}\n  <DocsKeyboardShortcuts />\n  */\n  {\n    \"id\": \"zIVDuiyg\",\n    \"block\": \"[[[46,[28,[37,1],null,null],null,null,null],[1,\\\"\\\\n\\\"],[8,[39,2],null,null,null]],[],false,[\\\"component\\\",\\\"-outlet\\\",\\\"docs-keyboard-shortcuts\\\"]]\",\n    \"moduleName\": \"docs/application.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/autoplay-test\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! // BEGIN-SNIPPET autoplay-example.hbs }}\n  \n  <div class='mb-4'>\n    <h3 class='text-lg font-bold'>Ember-Stereo Autoplay Test</h3>\n    {{#if (autoplay-allowed)}}\n      This audio should automatically play without user input\n    {{else}}\n      This audio should not automatically play without user input\n    {{/if}}\n  </div>\n  \n  {{#let '/sounds/foghorn-leghorn.mp3' as |url|}}\n    {{! template-lint-disable no-pointer-down-event-binding }}\n    <button\n      type='button'\n      class='ui-button with-icon max-w-min'\n      {{on 'mousedown' (toggle-play-sound url)}}\n      {{did-insert (play-sound url)}}\n    >\n      {{#if (sound-is-playing url)}}\n        {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}\n        Playing\n      {{else if (sound-is-loading url)}}\n        {{svg-jar\n          'loading-outline'\n          height=20\n          width=30\n          title='Loading'\n          class='animate-spin'\n        }}\n        Loading\n      {{else}}\n        {{svg-jar 'play-outline' height=20 width=30 title='Play'}}\n        Play\n      {{/if}}\n    </button>\n  \n    {{#if (sound-is-blocked url)}}\n      {{! template-lint-disable no-invalid-interactive }}\n      <div class='autoplay-blocked-overlay' {{on 'click' (play-sound url)}}>\n        Oy! The audio was blocked by the browser and someone's gotta give this\n        overlay a click in order for audio to resume\n      </div>\n    {{/if}}\n  \n    {{sound-error-details url}}\n  {{/let}}\n  \n  {{! // END-SNIPPET }}\n  \n  {{outlet}}\n  */\n  {\n    \"id\": \"bi+VUmtY\",\n    \"block\": \"[[[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"mb-4\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h3\\\"],[14,0,\\\"text-lg font-bold\\\"],[12],[1,\\\"Ember-Stereo Autoplay Test\\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,1],null,null],[[[1,\\\"    This audio should automatically play without user input\\\\n\\\"]],[]],[[[1,\\\"    This audio should not automatically play without user input\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[44,[\\\"/sounds/foghorn-leghorn.mp3\\\"],[[[1,\\\"  \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button with-icon max-w-min\\\"],[24,4,\\\"button\\\"],[4,[38,3],[\\\"mousedown\\\",[28,[37,4],[[30,1]],null]],null],[4,[38,5],[[28,[37,6],[[30,1]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[30,1]],null],[[[1,\\\"      \\\"],[1,[28,[35,8],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n      Playing\\\\n\\\"]],[]],[[[41,[28,[37,9],[[30,1]],null],[[[1,\\\"      \\\"],[1,[28,[35,8],[\\\"loading-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\",\\\"class\\\"],[20,30,\\\"Loading\\\",\\\"animate-spin\\\"]]]],[1,\\\"\\\\n      Loading\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[1,[28,[35,8],[\\\"play-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Play\\\"]]]],[1,\\\"\\\\n      Play\\\\n    \\\"]],[]]]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,10],[[30,1]],null],[[[1,\\\"    \\\"],[11,0],[24,0,\\\"autoplay-blocked-overlay\\\"],[4,[38,3],[\\\"click\\\",[28,[37,6],[[30,1]],null]],null],[12],[1,\\\"\\\\n      Oy! The audio was blocked by the browser and someone's gotta give this\\\\n      overlay a click in order for audio to resume\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[1,[28,[35,11],[[30,1]],null]],[1,\\\"\\\\n\\\"]],[1]]],[1,\\\"\\\\n\\\"],[1,\\\"\\\\n\\\"],[46,[28,[37,13],null,null],null,null,null]],[\\\"url\\\"],false,[\\\"if\\\",\\\"autoplay-allowed\\\",\\\"let\\\",\\\"on\\\",\\\"toggle-play-sound\\\",\\\"did-insert\\\",\\\"play-sound\\\",\\\"sound-is-playing\\\",\\\"svg-jar\\\",\\\"sound-is-loading\\\",\\\"sound-is-blocked\\\",\\\"sound-error-details\\\",\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"docs/autoplay-test.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/component-managers/glimmer\", [\"exports\", \"@glimmer/component/-private/ember-component-manager\"], function (_exports, _emberComponentManager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberComponentManager.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component/-private/ember-component-manager\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-class\", [\"exports\", \"ember-cli-addon-docs/components/api/x-class\"], function (_exports, _xClass) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xClass.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-class\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-component\", [\"exports\", \"ember-cli-addon-docs/components/api/x-component\"], function (_exports, _xComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xComponent.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-component\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-import-path\", [\"exports\", \"ember-cli-addon-docs/components/api/x-import-path\"], function (_exports, _xImportPath) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xImportPath.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-import-path\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-meta-panel\", [\"exports\", \"ember-cli-addon-docs/components/api/x-meta-panel\"], function (_exports, _xMetaPanel) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xMetaPanel.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-meta-panel\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-meta-panel/header\", [\"exports\", \"ember-cli-addon-docs/components/api/x-meta-panel/header\"], function (_exports, _header) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _header.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-meta-panel/header\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-module\", [\"exports\", \"ember-cli-addon-docs/components/api/x-module\"], function (_exports, _xModule) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xModule.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-module\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-section\", [\"exports\", \"ember-cli-addon-docs/components/api/x-section\"], function (_exports, _xSection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xSection.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-section\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-sections\", [\"exports\", \"ember-cli-addon-docs/components/api/x-sections\"], function (_exports, _xSections) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xSections.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-sections\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/api/x-toggles\", [\"exports\", \"ember-cli-addon-docs/components/api/x-toggles\"], function (_exports, _xToggles) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xToggles.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/api/x-toggles\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/cached-sounds\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <ComponentLabel @title={{this.loadedSoundCountSentence}} />\n  <div\n    class='grid items-start content-start justify-start flex-1 grid-cols-1 gap-2 md:grid-cols-2'\n  >\n    {{#each this.loadedItems as |item|}}\n      <SoundDisplay @url={{item.url}} />\n    {{/each}}\n  </div>\n  */\n  {\n    \"id\": \"yyDYBRun\",\n    \"block\": \"[[[8,[39,0],null,[[\\\"@title\\\"],[[30,0,[\\\"loadedSoundCountSentence\\\"]]]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"grid items-start content-start justify-start flex-1 grid-cols-1 gap-2 md:grid-cols-2\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[30,0,[\\\"loadedItems\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[8,[39,3],null,[[\\\"@url\\\"],[[30,1,[\\\"url\\\"]]]],null],[1,\\\"\\\\n\\\"]],[1]],null],[13]],[\\\"item\\\"],false,[\\\"component-label\\\",\\\"each\\\",\\\"-track-array\\\",\\\"sound-display\\\"]]\",\n    \"moduleName\": \"docs/components/cached-sounds.hbs\",\n    \"isStrictMode\": false\n  });\n  let CachedSound = _exports.default = (_class = class CachedSound extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n    }\n    get loadedItems() {\n      return this.stereo.sounds;\n    }\n    get loadedSoundCountSentence() {\n      let count = this.stereo.sounds.length;\n      if (count === 1) {\n        return '1 Loaded Sound';\n      } else if (count > 1) {\n        return `${count} Loaded Sounds`;\n      } else {\n        return `Loaded Sounds`;\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, CachedSound);\n});","define(\"docs/components/component-label\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h3\n    {{! style=\"transform: translateX(calc(-100% - 1rem)) translateY(calc(100% + 1rem));\n  writing-mode: vertical-rl;\" }}\n    class='p-1 my-2 text-xs uppercase rounded text-surface-2 bg-on-surface-3 max-w-min whitespace-nowrap inilne-block w-max-min'\n  >{{@title}}</h3>\n  */\n  {\n    \"id\": \"i+gVZuEW\",\n    \"block\": \"[[[10,\\\"h3\\\"],[14,0,\\\"p-1 my-2 text-xs uppercase rounded text-surface-2 bg-on-surface-3 max-w-min whitespace-nowrap inilne-block w-max-min\\\"],[12],[1,[30,1]],[13]],[\\\"@title\\\"],false,[]]\",\n    \"moduleName\": \"docs/components/component-label.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/copy-button\", [\"exports\", \"ember-cli-clipboard/components/copy-button\"], function (_exports, _copyButton) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _copyButton.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-clipboard/components/copy-button\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/debug-details\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div\n    class='bg-surface-1 visible -mx-2 p-2 shadow-inner shadow-xl\n      {{if @show \"visible\" \"hidden\"}}'\n    ...attributes\n  >\n    {{yield (hash Section=(component 'debug-details/section'))}}\n  </div>\n  */\n  {\n    \"id\": \"aFM80I29\",\n    \"block\": \"[[[11,0],[16,0,[29,[\\\"bg-surface-1 visible -mx-2 p-2 shadow-inner shadow-xl\\\\n    \\\",[52,[30,1],\\\"visible\\\",\\\"hidden\\\"]]]],[17,2],[12],[1,\\\"\\\\n  \\\"],[18,3,[[28,[37,2],null,[[\\\"Section\\\"],[[50,\\\"debug-details/section\\\",0,null,null]]]]]],[1,\\\"\\\\n\\\"],[13]],[\\\"@show\\\",\\\"&attrs\\\",\\\"&default\\\"],false,[\\\"if\\\",\\\"yield\\\",\\\"hash\\\",\\\"component\\\"]]\",\n    \"moduleName\": \"docs/components/debug-details.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/debug-details/section\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h4 class='flex items-center justify-between my-2 text-xs uppercase'>\n    {{@title}}\n    {{yield to='button'}}\n  </h4>\n  <div class='mb-8'>{{yield to='content'}}</div>\n  */\n  {\n    \"id\": \"LMoQbsZM\",\n    \"block\": \"[[[10,\\\"h4\\\"],[14,0,\\\"flex items-center justify-between my-2 text-xs uppercase\\\"],[12],[1,\\\"\\\\n  \\\"],[1,[30,1]],[1,\\\"\\\\n  \\\"],[18,2,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"mb-8\\\"],[12],[18,3,null],[13]],[\\\"@title\\\",\\\"&button\\\",\\\"&content\\\"],false,[\\\"yield\\\"]]\",\n    \"moduleName\": \"docs/components/debug-details/section.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/diagnostic-controls\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _tracking, _object, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <ComponentLabel @title='Sound Loader' />\n  <form\n    ...attributes\n    {{on\n      'submit'\n      (prevent-default\n        (play-sound\n          this.url\n          useConnections=this.useConnections\n          metadata=this.formattedMetadata\n        )\n      )\n    }}\n  >\n    <div>\n      <div class='my-2'>\n        <label\n          for='url-property'\n          class='block text-base font-medium text-on-background'\n        >URL</label>\n  \n        <div class='flex mt-1 rounded-md shadow-sm'>\n          <div class='relative flex items-stretch flex-grow focus-within:z-10'>\n            <Input\n              id='url-property'\n              class='block w-full rounded-md sm:text-sm | border-on-surface-0 focus:ring-accent-0 focus:border-accent-0'\n              @type='text'\n              @value={{this.url}}\n              placeholder='Enter a URL'\n            />\n          </div>\n        </div>\n  \n        <div class='flex flex-wrap gap-1 mt-2'>\n          {{#each this.items as |item|}}\n            <button\n              type='button'\n              class='preset-chip'\n              aria-pressed='{{if (eq item.url this.url) \"true\" \"false\"}}'\n              {{on 'click' (fn this.selectPreset item)}}\n            >{{item.title}}</button>\n          {{/each}}\n        </div>\n  \n      </div>\n  \n      <div class='my-2'>\n        <label\n          for='metadata'\n          class='block text-base font-medium text-on-surface'\n        >Metadata</label>\n        <Textarea\n          id='metadata'\n          class='block w-full h-20 font-mono rounded-md border-on-surface-0 focus:ring-accent-0 focus:border-accent-0 sm:text-sm'\n          placeholder='{\"title\": \"Something\"}'\n          @value={{this.metadata}}\n          {{on 'change' this.updateMetadata}}\n        />\n        {{#if this.metadataError}}\n          <p class='mt-1 text-sm text-danger'>{{this.metadataError}}</p>\n        {{/if}}\n      </div>\n  \n      <div class='my-2'>\n        <label\n          class='block my-2 text-base font-medium text-on-surface'\n          for='strategy'\n        >Connections</label>\n  \n        {{#let (sound-is-loaded this.url) as |loaded|}}\n          <div class='flex flex-row gap-2 px-1 my-1 {{if loaded \"opacity-50\"}}'>\n            <label>\n              <input\n                class='border-on-surface-0 text-accent-0 focus:ring-accent-0'\n                type='radio'\n                name='strategy'\n                disabled={{loaded}}\n                value='default'\n                checked={{eq this.connectionStrategy 'default'}}\n                {{on 'change' this.setConnectionStrategy}}\n              />\n              Automatic\n            </label>\n  \n            <label>\n              <input\n                class='border-on-surface-0 text-accent-0 focus:ring-accent-0'\n                type='radio'\n                name='strategy'\n                disabled={{loaded}}\n                value='choose'\n                checked={{eq this.connectionStrategy 'choose'}}\n                {{on 'change' this.setConnectionStrategy}}\n              />\n              Choose\n            </label>\n          </div>\n        {{/let}}\n        {{#if\n          (or (eq this.connectionStrategy 'default') (sound-is-loaded this.url))\n        }}\n          <StrategyBreakdown class='grid' @url={{this.url}} as |data|>\n            <li\n              class='inline\n                {{if (eq data.info.status \"failure\") \"text-danger\"}}\n                {{if (eq data.info.status \"success\") \"text-success\"}}'\n            >\n              <span class='text-sm'>\n                {{svg-jar\n                  (concat 'connection-' data.info.status)\n                  class='inline w-4 h-4'\n                }}\n                {{data.item.name}}\n              </span>\n              <span class='text-sm opacity-70'>{{data.info.message}}</span>\n            </li>\n          </StrategyBreakdown>\n        {{else}}\n          <StrategyBreakdown\n            class='grid grid-cols-3 gap-2'\n            @url={{this.url}}\n            @selectedConnections={{this.selectedConnections}}\n            @onUpdateConnections={{this.updateSelectedStrategies}}\n            @allowSelection={{not (eq this.connectionStrategy 'default')}}\n          />\n        {{/if}}\n      </div>\n  \n      <div class='flex items-center gap-2'>\n        <button\n          {{on\n            'click'\n            (load-sound\n              this.url\n              useConnections=this.useConnections\n              metadata=this.formattedMetadata\n            )\n          }}\n          class='inline-flex items-center px-3 py-2 border rounded-md shadow-sm disabled:opacity-50 disabled:pointer-events-none text-on-accent-0 bg-accent-0 hover:bg-accent-0-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-accent-0'\n          type='button'\n          disabled={{or (sound-is-loaded this.url) (not this.url)}}\n        >\n          {{#if (sound-is-loading this.url)}}\n            {{svg-jar\n              'loading-outline'\n              width=20\n              height=25\n              title='Loading'\n              class='w-5 h-5 mr-3 -ml-1 animate-spin'\n            }}\n            Loading…\n          {{else if (sound-is-loaded this.url)}}\n            {{svg-jar\n              'load'\n              width=20\n              height=25\n              title='Load'\n              class='w-5 h-5 mr-3 -ml-1'\n            }}Loaded\n          {{else}}\n            {{svg-jar\n              'load'\n              width=20\n              height=25\n              title='Load'\n              class='w-5 h-5 mr-3 -ml-1'\n            }}Load\n          {{/if}}\n        </button>\n  \n        <button\n          {{on\n            'click'\n            (toggle-play-sound\n              this.url\n              useConnections=this.useConnections\n              metadata=this.formattedMetadata\n            )\n          }}\n          class='inline-flex items-center px-3 py-2 border rounded-md shadow-sm disabled:opacity-50 disabled:pointer-events-none text-on-accent-0 bg-accent-0 hover:bg-accent-0-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-accent-0'\n          type='button'\n          disabled={{not this.url}}\n        >\n          {{#if (sound-is-playing this.url)}}\n            {{svg-jar\n              'pause-outline'\n              class='w-5 h-5 mr-3 -ml-1'\n              width=20\n              height=25\n              title='Pause'\n            }}\n            Pause\n          {{else if (sound-is-loaded this.url)}}\n            {{svg-jar\n              'resume-outline'\n              class='w-5 h-5 mr-3 -ml-1'\n              width=20\n              height=25\n              title='Pause'\n            }}\n            Resume\n          {{else if (sound-is-loading this.url)}}\n            {{svg-jar\n              'loading-outline'\n              width=20\n              height=25\n              title='Loading'\n              class='w-5 h-5 mr-3 -ml-1 animate-spin'\n            }}\n            Loading\n          {{else}}\n            {{svg-jar\n              'play-outline'\n              width=20\n              height=25\n              class='w-5 h-5 mr-3 -ml-1'\n              title='Play'\n            }}\n            Play\n          {{/if}}\n  \n        </button>\n  \n        {{#if (sound-is-errored this.url)}}\n          <div class='flex gap-1 p-3 text-danger'>\n            <span>{{sound-error-details this.url}}</span>\n          </div>\n        {{/if}}\n  \n      </div>\n    </div>\n  </form>\n  */\n  {\n    \"id\": \"QMZXzG6X\",\n    \"block\": \"[[[8,[39,0],null,[[\\\"@title\\\"],[\\\"Sound Loader\\\"]],null],[1,\\\"\\\\n\\\"],[11,\\\"form\\\"],[17,1],[4,[38,1],[\\\"submit\\\",[28,[37,2],[[28,[37,3],[[30,0,[\\\"url\\\"]]],[[\\\"useConnections\\\",\\\"metadata\\\"],[[30,0,[\\\"useConnections\\\"]],[30,0,[\\\"formattedMetadata\\\"]]]]]],null]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"my-2\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"url-property\\\"],[14,0,\\\"block text-base font-medium text-on-background\\\"],[12],[1,\\\"URL\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"flex mt-1 rounded-md shadow-sm\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"relative flex items-stretch flex-grow focus-within:z-10\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[39,4],[[24,1,\\\"url-property\\\"],[24,0,\\\"block w-full rounded-md sm:text-sm | border-on-surface-0 focus:ring-accent-0 focus:border-accent-0\\\"],[24,\\\"placeholder\\\",\\\"Enter a URL\\\"]],[[\\\"@type\\\",\\\"@value\\\"],[\\\"text\\\",[30,0,[\\\"url\\\"]]]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"flex flex-wrap gap-1 mt-2\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[30,0,[\\\"items\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[11,\\\"button\\\"],[24,0,\\\"preset-chip\\\"],[16,\\\"aria-pressed\\\",[29,[[52,[28,[37,8],[[30,2,[\\\"url\\\"]],[30,0,[\\\"url\\\"]]],null],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,9],[[30,0,[\\\"selectPreset\\\"]],[30,2]],null]],null],[12],[1,[30,2,[\\\"title\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"my-2\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"metadata\\\"],[14,0,\\\"block text-base font-medium text-on-surface\\\"],[12],[1,\\\"Metadata\\\"],[13],[1,\\\"\\\\n      \\\"],[8,[39,10],[[24,1,\\\"metadata\\\"],[24,0,\\\"block w-full h-20 font-mono rounded-md border-on-surface-0 focus:ring-accent-0 focus:border-accent-0 sm:text-sm\\\"],[24,\\\"placeholder\\\",\\\"{\\\\\\\"title\\\\\\\": \\\\\\\"Something\\\\\\\"}\\\"],[4,[38,1],[\\\"change\\\",[30,0,[\\\"updateMetadata\\\"]]],null]],[[\\\"@value\\\"],[[30,0,[\\\"metadata\\\"]]]],null],[1,\\\"\\\"],[41,[30,0,[\\\"metadataError\\\"]],[[[1,\\\"        \\\"],[10,2],[14,0,\\\"mt-1 text-sm text-danger\\\"],[12],[1,[30,0,[\\\"metadataError\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"my-2\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,0,\\\"block my-2 text-base font-medium text-on-surface\\\"],[14,\\\"for\\\",\\\"strategy\\\"],[12],[1,\\\"Connections\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[44,[[28,[37,12],[[30,0,[\\\"url\\\"]]],null]],[[[1,\\\"        \\\"],[10,0],[15,0,[29,[\\\"flex flex-row gap-2 px-1 my-1 \\\",[52,[30,3],\\\"opacity-50\\\"]]]],[12],[1,\\\"\\\\n          \\\"],[10,\\\"label\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"input\\\"],[24,0,\\\"border-on-surface-0 text-accent-0 focus:ring-accent-0\\\"],[24,3,\\\"strategy\\\"],[16,\\\"disabled\\\",[30,3]],[24,2,\\\"default\\\"],[16,\\\"checked\\\",[28,[37,8],[[30,0,[\\\"connectionStrategy\\\"]],\\\"default\\\"],null]],[24,4,\\\"radio\\\"],[4,[38,1],[\\\"change\\\",[30,0,[\\\"setConnectionStrategy\\\"]]],null],[12],[13],[1,\\\"\\\\n            Automatic\\\\n          \\\"],[13],[1,\\\"\\\\n\\\\n          \\\"],[10,\\\"label\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"input\\\"],[24,0,\\\"border-on-surface-0 text-accent-0 focus:ring-accent-0\\\"],[24,3,\\\"strategy\\\"],[16,\\\"disabled\\\",[30,3]],[24,2,\\\"choose\\\"],[16,\\\"checked\\\",[28,[37,8],[[30,0,[\\\"connectionStrategy\\\"]],\\\"choose\\\"],null]],[24,4,\\\"radio\\\"],[4,[38,1],[\\\"change\\\",[30,0,[\\\"setConnectionStrategy\\\"]]],null],[12],[13],[1,\\\"\\\\n            Choose\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[3]]],[41,[28,[37,13],[[28,[37,8],[[30,0,[\\\"connectionStrategy\\\"]],\\\"default\\\"],null],[28,[37,12],[[30,0,[\\\"url\\\"]]],null]],null],[[[1,\\\"        \\\"],[8,[39,14],[[24,0,\\\"grid\\\"]],[[\\\"@url\\\"],[[30,0,[\\\"url\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"inline\\\\n              \\\",[52,[28,[37,8],[[30,4,[\\\"info\\\",\\\"status\\\"]],\\\"failure\\\"],null],\\\"text-danger\\\"],\\\"\\\\n              \\\",[52,[28,[37,8],[[30,4,[\\\"info\\\",\\\"status\\\"]],\\\"success\\\"],null],\\\"text-success\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"text-sm\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[28,[35,15],[[28,[37,16],[\\\"connection-\\\",[30,4,[\\\"info\\\",\\\"status\\\"]]],null]],[[\\\"class\\\"],[\\\"inline w-4 h-4\\\"]]]],[1,\\\"\\\\n              \\\"],[1,[30,4,[\\\"item\\\",\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"text-sm opacity-70\\\"],[12],[1,[30,4,[\\\"info\\\",\\\"message\\\"]]],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"]],[4]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[8,[39,14],[[24,0,\\\"grid grid-cols-3 gap-2\\\"]],[[\\\"@url\\\",\\\"@selectedConnections\\\",\\\"@onUpdateConnections\\\",\\\"@allowSelection\\\"],[[30,0,[\\\"url\\\"]],[30,0,[\\\"selectedConnections\\\"]],[30,0,[\\\"updateSelectedStrategies\\\"]],[28,[37,17],[[28,[37,8],[[30,0,[\\\"connectionStrategy\\\"]],\\\"default\\\"],null]],null]]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"flex items-center gap-2\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"inline-flex items-center px-3 py-2 border rounded-md shadow-sm disabled:opacity-50 disabled:pointer-events-none text-on-accent-0 bg-accent-0 hover:bg-accent-0-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-accent-0\\\"],[16,\\\"disabled\\\",[28,[37,13],[[28,[37,12],[[30,0,[\\\"url\\\"]]],null],[28,[37,17],[[30,0,[\\\"url\\\"]]],null]],null]],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,18],[[30,0,[\\\"url\\\"]]],[[\\\"useConnections\\\",\\\"metadata\\\"],[[30,0,[\\\"useConnections\\\"]],[30,0,[\\\"formattedMetadata\\\"]]]]]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,19],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"loading-outline\\\"],[[\\\"width\\\",\\\"height\\\",\\\"title\\\",\\\"class\\\"],[20,25,\\\"Loading\\\",\\\"w-5 h-5 mr-3 -ml-1 animate-spin\\\"]]]],[1,\\\"\\\\n          Loading…\\\\n\\\"]],[]],[[[41,[28,[37,12],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"load\\\"],[[\\\"width\\\",\\\"height\\\",\\\"title\\\",\\\"class\\\"],[20,25,\\\"Load\\\",\\\"w-5 h-5 mr-3 -ml-1\\\"]]]],[1,\\\"Loaded\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"load\\\"],[[\\\"width\\\",\\\"height\\\",\\\"title\\\",\\\"class\\\"],[20,25,\\\"Load\\\",\\\"w-5 h-5 mr-3 -ml-1\\\"]]]],[1,\\\"Load\\\\n        \\\"]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"inline-flex items-center px-3 py-2 border rounded-md shadow-sm disabled:opacity-50 disabled:pointer-events-none text-on-accent-0 bg-accent-0 hover:bg-accent-0-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-accent-0\\\"],[16,\\\"disabled\\\",[28,[37,17],[[30,0,[\\\"url\\\"]]],null]],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,20],[[30,0,[\\\"url\\\"]]],[[\\\"useConnections\\\",\\\"metadata\\\"],[[30,0,[\\\"useConnections\\\"]],[30,0,[\\\"formattedMetadata\\\"]]]]]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,21],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"pause-outline\\\"],[[\\\"class\\\",\\\"width\\\",\\\"height\\\",\\\"title\\\"],[\\\"w-5 h-5 mr-3 -ml-1\\\",20,25,\\\"Pause\\\"]]]],[1,\\\"\\\\n          Pause\\\\n\\\"]],[]],[[[41,[28,[37,12],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"resume-outline\\\"],[[\\\"class\\\",\\\"width\\\",\\\"height\\\",\\\"title\\\"],[\\\"w-5 h-5 mr-3 -ml-1\\\",20,25,\\\"Pause\\\"]]]],[1,\\\"\\\\n          Resume\\\\n\\\"]],[]],[[[41,[28,[37,19],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"loading-outline\\\"],[[\\\"width\\\",\\\"height\\\",\\\"title\\\",\\\"class\\\"],[20,25,\\\"Loading\\\",\\\"w-5 h-5 mr-3 -ml-1 animate-spin\\\"]]]],[1,\\\"\\\\n          Loading\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,15],[\\\"play-outline\\\"],[[\\\"width\\\",\\\"height\\\",\\\"class\\\",\\\"title\\\"],[20,25,\\\"w-5 h-5 mr-3 -ml-1\\\",\\\"Play\\\"]]]],[1,\\\"\\\\n          Play\\\\n        \\\"]],[]]]],[]]]],[]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,22],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"flex gap-1 p-3 text-danger\\\"],[12],[1,\\\"\\\\n          \\\"],[10,1],[12],[1,[28,[35,23],[[30,0,[\\\"url\\\"]]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"&attrs\\\",\\\"item\\\",\\\"loaded\\\",\\\"data\\\"],false,[\\\"component-label\\\",\\\"on\\\",\\\"prevent-default\\\",\\\"play-sound\\\",\\\"input\\\",\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"eq\\\",\\\"fn\\\",\\\"textarea\\\",\\\"let\\\",\\\"sound-is-loaded\\\",\\\"or\\\",\\\"strategy-breakdown\\\",\\\"svg-jar\\\",\\\"concat\\\",\\\"not\\\",\\\"load-sound\\\",\\\"sound-is-loading\\\",\\\"toggle-play-sound\\\",\\\"sound-is-playing\\\",\\\"sound-is-errored\\\",\\\"sound-error-details\\\"]]\",\n    \"moduleName\": \"docs/components/diagnostic-controls.hbs\",\n    \"isStrictMode\": false\n  });\n  let DiagnosticControls = _exports.default = (_class = class DiagnosticControls extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"selectedConnections\", _descriptor2, this);\n      _initializerDefineProperty(this, \"url\", _descriptor3, this);\n      _initializerDefineProperty(this, \"metadata\", _descriptor4, this);\n      _initializerDefineProperty(this, \"connectionStrategy\", _descriptor5, this);\n      _defineProperty(this, \"connections\", this.stereo.connectionLoader.connections);\n    }\n    get items() {\n      return this.args.testSounds ?? [];\n    }\n    setConnectionStrategy(option) {\n      this.connectionStrategy = option.target.value;\n    }\n    get useConnections() {\n      if (this.connectionStrategy === 'choose') {\n        return this.stereo.connectionLoader.names.filter(name => this.selectedConnections.includes(name));\n      }\n      return null;\n    }\n    updateSelectedStrategies(name, op) {\n      if (op) {\n        this.selectedConnections = this.selectedConnections.filter(d => d !== name);\n      } else {\n        this.selectedConnections = [name].concat(this.selectedConnections);\n      }\n    }\n    updateMetadata() {\n      let sound = this.url ? this.stereo.findSound(this.url) : null;\n      if (sound) {\n        sound.metadata = this.formattedMetadata;\n      }\n    }\n    get parsedMetadata() {\n      if (!this.metadata?.trim()) {\n        return {\n          value: {}\n        };\n      }\n      try {\n        return {\n          value: JSON.parse(this.metadata)\n        };\n      } catch (error) {\n        return {\n          value: {},\n          error: error.message\n        };\n      }\n    }\n    get formattedMetadata() {\n      return this.parsedMetadata.value;\n    }\n    get metadataError() {\n      return this.parsedMetadata.error;\n    }\n    selectPreset(item) {\n      this.url = item.url;\n      this.metadata = JSON.stringify({\n        title: item.title\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"selectedConnections\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return this.stereo.connectionLoader.names;\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"url\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"metadata\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"connectionStrategy\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 'default';\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"setConnectionStrategy\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setConnectionStrategy\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"updateSelectedStrategies\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"updateSelectedStrategies\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"updateMetadata\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"updateMetadata\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"selectPreset\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"selectPreset\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DiagnosticControls);\n});","define(\"docs/components/docs-code-highlight\", [\"exports\", \"ember-cli-addon-docs/components/docs-code-highlight\"], function (_exports, _docsCodeHighlight) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsCodeHighlight.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-code-highlight\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-demo\", [\"exports\", \"ember-cli-addon-docs/components/docs-demo\"], function (_exports, _docsDemo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsDemo.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-demo\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-demo/x-example\", [\"exports\", \"ember-cli-addon-docs/components/docs-demo/x-example\"], function (_exports, _xExample) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xExample.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-demo/x-example\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-demo/x-snippet\", [\"exports\", \"ember-cli-addon-docs/components/docs-demo/x-snippet\"], function (_exports, _xSnippet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xSnippet.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-demo/x-snippet\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-header\", [\"exports\", \"ember-cli-addon-docs/components/docs-header\"], function (_exports, _docsHeader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsHeader.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-header\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-header/link\", [\"exports\", \"ember-cli-addon-docs/components/docs-header/link\"], function (_exports, _link) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _link.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-header/link\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-header/search-box\", [\"exports\", \"ember-cli-addon-docs/components/docs-header/search-box\"], function (_exports, _searchBox) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _searchBox.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-header/search-box\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-header/search-result\", [\"exports\", \"ember-cli-addon-docs/components/docs-header/search-result\"], function (_exports, _searchResult) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _searchResult.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-header/search-result\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-header/search-results\", [\"exports\", \"ember-cli-addon-docs/components/docs-header/search-results\"], function (_exports, _searchResults) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _searchResults.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-header/search-results\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-header/version-selector\", [\"exports\", \"ember-cli-addon-docs/components/docs-header/version-selector\"], function (_exports, _versionSelector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _versionSelector.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-header/version-selector\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-hero\", [\"exports\", \"ember-cli-addon-docs/components/docs-hero\"], function (_exports, _docsHero) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsHero.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-hero\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-keyboard-shortcuts\", [\"exports\", \"ember-cli-addon-docs/components/docs-keyboard-shortcuts\"], function (_exports, _docsKeyboardShortcuts) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsKeyboardShortcuts.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-keyboard-shortcuts\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-link\", [\"exports\", \"ember-cli-addon-docs/components/docs-link\"], function (_exports, _docsLink) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsLink.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-link\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-logo\", [\"exports\", \"ember-cli-addon-docs/components/docs-logo\"], function (_exports, _docsLogo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsLogo.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-logo\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-modal-dialog\", [\"exports\", \"ember-cli-addon-docs/components/docs-modal-dialog\"], function (_exports, _docsModalDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsModalDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-modal-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-snippet\", [\"exports\", \"ember-cli-addon-docs/components/docs-snippet\"], function (_exports, _docsSnippet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsSnippet.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-snippet\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer\"], function (_exports, _docsViewer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsViewer.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-autogenerated-api-docs\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-autogenerated-api-docs\"], function (_exports, _xAutogeneratedApiDocs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xAutogeneratedApiDocs.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-autogenerated-api-docs\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-autogenerated-api-docs/module-nav\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-autogenerated-api-docs/module-nav\"], function (_exports, _moduleNav) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _moduleNav.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-autogenerated-api-docs/module-nav\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-current-page-index\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-current-page-index\"], function (_exports, _xCurrentPageIndex) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xCurrentPageIndex.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-current-page-index\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-main\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-main\"], function (_exports, _xMain) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xMain.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-main\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-nav-item\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-nav-item\"], function (_exports, _xNavItem) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xNavItem.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-nav-item\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-nav-list\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-nav-list\"], function (_exports, _xNavList) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xNavList.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-nav-list\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-nav\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-nav\"], function (_exports, _xNav) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xNav.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-nav\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs-viewer/x-section\", [\"exports\", \"ember-cli-addon-docs/components/docs-viewer/x-section\"], function (_exports, _xSection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xSection.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/components/docs-viewer/x-section\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/docs/attention-getter\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! template-lint-disable no-inline-styles }}\n  \n  <DocsDemo as |demo|>\n    <demo.example @name='attention-getter.hbs'>\n      {{#let '/sounds/attention.mp3' as |url|}}\n        <button\n          type='button'\n          {{on 'click' (toggle-play-sound url)}}\n          class='flex items-center gap-1'\n        >\n          {{#if (sound-is-playing url)}}\n            {{svg-jar 'pause-outline' height=16 width=16}}\n          {{else}}\n            {{svg-jar 'play-outline' width=16 height=16}}\n          {{/if}}\n          Really, it's easy\n        </button>\n      {{/let}}\n    </demo.example>\n    <demo.snippet @name='attention-getter.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"IS1PZWFg\",\n    \"block\": \"[[[1,\\\"\\\\n\\\"],[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"attention-getter.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[44,[\\\"/sounds/attention.mp3\\\"],[[[1,\\\"      \\\"],[11,\\\"button\\\"],[24,0,\\\"flex items-center gap-1\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[30,2]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,5],[[30,2]],null],[[[1,\\\"          \\\"],[1,[28,[35,6],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[16,16]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,6],[\\\"play-outline\\\"],[[\\\"width\\\",\\\"height\\\"],[16,16]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        Really, it's easy\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[2]]],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"attention-getter.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\",\\\"url\\\"],false,[\\\"docs-demo\\\",\\\"let\\\",\\\"on\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"svg-jar\\\"]]\",\n    \"moduleName\": \"docs/components/docs/attention-getter.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/autoplay-checking\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='autoplay.hbs'>\n      {{#if (autoplay-allowed)}}\n        Autoplay is allowed on this domain in your browser\n      {{else}}\n        Autoplay is not allowed on this domain in your browser\n      {{/if}}\n    </demo.example>\n    <demo.snippet @name='autoplay.hbs' />\n  </DocsDemo>\n  \n  <DocsDemo as |demo|>\n    <demo.example @name='autoplay-popup.hbs'>\n  \n      <a\n        id='launch_player'\n        class='underline text-accent-0'\n        title='Try to autoplay audio'\n        href='/autoplay-test/'\n        target='_blank'\n        rel='noopener noreferrer'\n        onclick=\"window.open(this.href, '/autoplay-test', 'resizable=yes,status=no,location=no,toolbar=no,menubar=no,fullscreen=no,scrollbars=no,dependent=no,width=320,left=20,height=350,top=20').focus(); return false;\"\n      >\n        Open new page (source below) and try to autoplay\n      </a>\n    </demo.example>\n    <demo.snippet @name='autoplay-example.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"I1SqDEHL\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[28,[37,2],null,null],[[[1,\\\"      Autoplay is allowed on this domain in your browser\\\\n\\\"]],[]],[[[1,\\\"      Autoplay is not allowed on this domain in your browser\\\\n\\\"]],[]]],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\\n\\\"],[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,2,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay-popup.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\\n    \\\"],[10,3],[14,1,\\\"launch_player\\\"],[14,0,\\\"underline text-accent-0\\\"],[14,\\\"title\\\",\\\"Try to autoplay audio\\\"],[14,6,\\\"/autoplay-test/\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[14,\\\"onclick\\\",\\\"window.open(this.href, '/autoplay-test', 'resizable=yes,status=no,location=no,toolbar=no,menubar=no,fullscreen=no,scrollbars=no,dependent=no,width=320,left=20,height=350,top=20').focus(); return false;\\\"],[12],[1,\\\"\\\\n      Open new page (source below) and try to autoplay\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,2,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay-example.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"demo\\\",\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"if\\\",\\\"autoplay-allowed\\\"]]\",\n    \"moduleName\": \"docs/components/docs/autoplay-checking.hbs\",\n    \"isStrictMode\": false\n  });\n  let AutoplayChecking = _exports.default = (_class = class AutoplayChecking extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"sound\", _descriptor2, this);\n    }\n    playAfterDelay(url) {\n      if (this.sound) {\n        this.sound.togglePause();\n      } else {\n        window.setTimeout(async () => {\n          let {\n            sound,\n            error /* failures */\n          } = await this.stereo.play(url);\n          this.sound = sound;\n          this.error = error;\n        }, 5000);\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"playAfterDelay\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"playAfterDelay\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, AutoplayChecking);\n});","define(\"docs/components/docs/autoplay-gotchas\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='autoplay-gotchas.hbs'>\n      <p>You can silence the thrown errors and handle them inline</p>\n      <div>\n        {{!-- {{#let \"https://streaming.koop.org/stream.aac\" as |url|}} --}}\n        <button\n          {{on 'click' this.togglePlaySound}}\n          type='button'\n          class='ui-button'\n        >\n          {{#if (sound-is-blocked this.url)}}\n            Autoplay Blocked!\n          {{else if (sound-is-playing this.url)}}\n            Pause\n          {{else}}\n            Play Sound\n          {{/if}}\n        </button>\n        {{!-- {{/let}} --}}\n      </div>\n  \n      {{#if this.error}}\n        <div class='text-danger text-sm px-1 py-2'>{{this.error}}</div>\n      {{/if}}\n    </demo.example>\n  \n    <demo.snippet @name='autoplay-gotchas.js' />\n    <demo.snippet @name='autoplay-gotchas.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"KXYMwGk8\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay-gotchas.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You can silence the thrown errors and handle them inline\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[12],[1,\\\"\\\\n\\\"],[1,\\\"      \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[30,0,[\\\"togglePlaySound\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          Autoplay Blocked!\\\\n\\\"]],[]],[[[41,[28,[37,4],[[30,0,[\\\"url\\\"]]],null],[[[1,\\\"          Pause\\\\n\\\"]],[]],[[[1,\\\"          Play Sound\\\\n        \\\"]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"text-danger text-sm px-1 py-2\\\"],[12],[1,[30,0,[\\\"error\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay-gotchas.js\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"autoplay-gotchas.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"on\\\",\\\"if\\\",\\\"sound-is-blocked\\\",\\\"sound-is-playing\\\"]]\",\n    \"moduleName\": \"docs/components/docs/autoplay-gotchas.hbs\",\n    \"isStrictMode\": false\n  });\n  let AutoplayGotchas = _exports.default = (_class = class AutoplayGotchas extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"sound\", _descriptor, this);\n      _initializerDefineProperty(this, \"url\", _descriptor2, this);\n      _initializerDefineProperty(this, \"stereo\", _descriptor3, this);\n    }\n    // BEGIN-SNIPPET autoplay-gotchas.js\n\n    async fetchUrl() {\n      return new Promise(resolve => {\n        setTimeout(() => resolve('https://streaming.koop.org/stream.aac'), 2000);\n      });\n    }\n    async togglePlaySound() {\n      this.url = await this.fetchUrl();\n      let {\n        sound\n      } = await this.stereo.load(this.url, {\n        silenceErrors: true\n      });\n      await sound.play();\n    }\n    // END-SNIPPET autoplay-gotchas.js\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"url\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"togglePlaySound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"togglePlaySound\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, AutoplayGotchas);\n});","define(\"docs/components/docs/cast-player\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"ember-stereo/services/stereo\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _stereo, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"ember-stereo/services/stereo\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div {{did-insert this.prepare}} {{will-destroy this.teardown}}>\n    <DocsDemo as |demo|>\n  \n      <demo.example @name='cast-player.hbs'>\n        <Docs::CastSupport />\n  \n        {{! BEGIN-SNIPPET cast-player.hbs }}\n        <div class='flex flex-wrap gap-2 mt-4'>\n          <button type='button' class='ui-button' {{cast-button}}>\n            {{#if (is-casting)}}\n              Casting to\n              {{this.deviceLabel}}\n            {{else if (casting-available)}}\n              Cast\n            {{else}}\n              No cast targets available\n            {{/if}}\n          </button>\n  \n          <button\n            type='button'\n            class='ui-button'\n            {{on 'click' this.setNowPlaying}}\n          >\n            Set now playing\n          </button>\n  \n          {{#if (is-casting)}}\n            <button\n              type='button'\n              class='ui-button'\n              {{on 'click' this.stopCasting}}\n            >\n              Stop casting\n            </button>\n          {{/if}}\n        </div>\n        {{! END-SNIPPET }}\n  \n        <dl class='grid grid-cols-2 gap-x-4 gap-y-1 mt-4 text-sm max-w-md'>\n          <dt class='font-semibold'><code>isCastingAvailable</code></dt>\n          <dd>{{if this.stereo.isCastingAvailable 'true' 'false'}}</dd>\n  \n          <dt class='font-semibold'><code>supportedCastType</code></dt>\n          <dd>{{or this.stereo.supportedCastType '—'}}</dd>\n  \n          <dt class='font-semibold'><code>isCasting</code></dt>\n          <dd>{{if this.stereo.isCasting 'true' 'false'}}</dd>\n  \n          <dt class='font-semibold'><code>castKind</code></dt>\n          <dd>{{or this.stereo.castKind '—'}}</dd>\n  \n          <dt class='font-semibold'><code>castDeviceName</code></dt>\n          <dd>{{or this.stereo.castDeviceName '—'}}</dd>\n  \n          <dt class='font-semibold'><code>sound.metadata.title</code></dt>\n          <dd>{{this.nowPlaying}}</dd>\n        </dl>\n  \n        <ul class='mt-4 text-sm'>\n          {{#each this.log as |entry|}}\n            <li>\n              <span class='font-mono'>{{entry.name}}</span>\n              &rarr;\n              {{entry.device}}\n            </li>\n          {{else}}\n            <li class='opacity-60'>No cast events yet.</li>\n          {{/each}}\n        </ul>\n      </demo.example>\n      <demo.snippet @name='cast-player.hbs' />\n      <demo.snippet @name='cast-player.js' />\n    </DocsDemo>\n  </div>\n  */\n  {\n    \"id\": \"gJLFFmeN\",\n    \"block\": \"[[[11,0],[4,[38,0],[[30,0,[\\\"prepare\\\"]]],null],[4,[38,1],[[30,0,[\\\"teardown\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"cast-player.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[39,3],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"      \\\"],[10,0],[14,0,\\\"flex flex-wrap gap-2 mt-4\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],null,null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,6],null,null],[[[1,\\\"            Casting to\\\\n            \\\"],[1,[30,0,[\\\"deviceLabel\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],null,null],[[[1,\\\"            Cast\\\\n\\\"]],[]],[[[1,\\\"            No cast targets available\\\\n          \\\"]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,8],[\\\"click\\\",[30,0,[\\\"setNowPlaying\\\"]]],null],[12],[1,\\\"\\\\n          Set now playing\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,6],null,null],[[[1,\\\"          \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,8],[\\\"click\\\",[30,0,[\\\"stopCasting\\\"]]],null],[12],[1,\\\"\\\\n            Stop casting\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"\\\\n      \\\"],[10,\\\"dl\\\"],[14,0,\\\"grid grid-cols-2 gap-x-4 gap-y-1 mt-4 text-sm max-w-md\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"dt\\\"],[14,0,\\\"font-semibold\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isCastingAvailable\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"dd\\\"],[12],[1,[52,[30,0,[\\\"stereo\\\",\\\"isCastingAvailable\\\"]],\\\"true\\\",\\\"false\\\"]],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"dt\\\"],[14,0,\\\"font-semibold\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"supportedCastType\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"dd\\\"],[12],[1,[28,[35,9],[[30,0,[\\\"stereo\\\",\\\"supportedCastType\\\"]],\\\"—\\\"],null]],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"dt\\\"],[14,0,\\\"font-semibold\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isCasting\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"dd\\\"],[12],[1,[52,[30,0,[\\\"stereo\\\",\\\"isCasting\\\"]],\\\"true\\\",\\\"false\\\"]],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"dt\\\"],[14,0,\\\"font-semibold\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castKind\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"dd\\\"],[12],[1,[28,[35,9],[[30,0,[\\\"stereo\\\",\\\"castKind\\\"]],\\\"—\\\"],null]],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"dt\\\"],[14,0,\\\"font-semibold\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castDeviceName\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"dd\\\"],[12],[1,[28,[35,9],[[30,0,[\\\"stereo\\\",\\\"castDeviceName\\\"]],\\\"—\\\"],null]],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"dt\\\"],[14,0,\\\"font-semibold\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.metadata.title\\\"],[13],[13],[1,\\\"\\\\n        \\\"],[10,\\\"dd\\\"],[12],[1,[30,0,[\\\"nowPlaying\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"ul\\\"],[14,0,\\\"mt-4 text-sm\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,11],[[28,[37,11],[[30,0,[\\\"log\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"font-mono\\\"],[12],[1,[30,2,[\\\"name\\\"]]],[13],[1,\\\"\\\\n            →\\\\n            \\\"],[1,[30,2,[\\\"device\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],[[[1,\\\"          \\\"],[10,\\\"li\\\"],[14,0,\\\"opacity-60\\\"],[12],[1,\\\"No cast events yet.\\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"cast-player.hbs\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"cast-player.js\\\"]],null],[1,\\\"\\\\n  \\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[13]],[\\\"demo\\\",\\\"entry\\\"],false,[\\\"did-insert\\\",\\\"will-destroy\\\",\\\"docs-demo\\\",\\\"docs/cast-support\\\",\\\"cast-button\\\",\\\"if\\\",\\\"is-casting\\\",\\\"casting-available\\\",\\\"on\\\",\\\"or\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n    \"moduleName\": \"docs/components/docs/cast-player.hbs\",\n    \"isStrictMode\": false\n  });\n  let CastPlayer = _exports.default = (_class = class CastPlayer extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      // BEGIN-SNIPPET cast-player.js\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _defineProperty(this, \"castEvents\", _stereo.SERVICE_EVENT_MAP.map(({\n        event\n      }) => event).filter(event => event.startsWith('audio-cast-')));\n      _initializerDefineProperty(this, \"log\", _descriptor2, this);\n    }\n    // Chromecast hands us the device's friendly name. AirPlay withholds it, so fall back to the kind.\n    get deviceLabel() {\n      return this.stereo.castDeviceName ?? this.stereo.castKind ?? 'a device';\n    }\n    prepare() {\n      this._handlers = this.castEvents.map(name => {\n        let handler = () => this._record(name);\n        this.stereo.on(name, handler);\n        return {\n          name,\n          handler\n        };\n      });\n    }\n    teardown() {\n      (this._handlers ?? []).forEach(({\n        name,\n        handler\n      }) => this.stereo.off(name, handler));\n    }\n    get sound() {\n      return this.stereo.currentSound;\n    }\n    get nowPlaying() {\n      return this.sound?.metadata?.title ?? '—';\n    }\n    setNowPlaying() {\n      if (!this.sound) {\n        return;\n      }\n      let stamp = new Date().toLocaleTimeString();\n      this.sound.metadata = {\n        ...this.sound.metadata,\n        title: `Track at ${stamp}`,\n        artist: 'ember-stereo demo'\n      };\n    }\n    stopCasting() {\n      this.stereo.stopCasting();\n    }\n    _record(name) {\n      this.log = [{\n        name,\n        device: this.deviceLabel\n      }, ...this.log].slice(0, 8);\n    }\n    // END-SNIPPET\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"log\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"prepare\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"prepare\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"teardown\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"teardown\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"setNowPlaying\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setNowPlaying\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"stopCasting\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"stopCasting\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, CastPlayer);\n});","define(\"docs/components/docs/cast-support\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#if (eq this.supportedKind 'airplay')}}\n    <Docs::CurrentBrowser /> supports <strong>AirPlay</strong>. The button below\n    opens the AirPlay picker, which lists whatever receivers it finds.\n  {{else if (eq this.supportedKind 'chromecast')}}\n    <Docs::CurrentBrowser /> supports <strong>Chromecast</strong>. The button\n    below lights up once a Chromecast is on your network.\n  {{else}}\n    <Docs::CurrentBrowser /> has <strong>no casting support</strong>. Neither\n    AirPlay nor Chromecast is available here, so the button below stays disabled\n    no matter what is on your network. Try Safari for AirPlay, or Chrome for\n    Chromecast.\n  {{/if}}\n  \n  */\n  {\n    \"id\": \"14oD3NY4\",\n    \"block\": \"[[[41,[28,[37,1],[[30,0,[\\\"supportedKind\\\"]],\\\"airplay\\\"],null],[[[1,\\\"  \\\"],[8,[39,2],null,null,null],[1,\\\" supports \\\"],[10,\\\"strong\\\"],[12],[1,\\\"AirPlay\\\"],[13],[1,\\\". The button below\\\\n  opens the AirPlay picker, which lists whatever receivers it finds.\\\\n\\\"]],[]],[[[41,[28,[37,1],[[30,0,[\\\"supportedKind\\\"]],\\\"chromecast\\\"],null],[[[1,\\\"  \\\"],[8,[39,2],null,null,null],[1,\\\" supports \\\"],[10,\\\"strong\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\". The button\\\\n  below lights up once a Chromecast is on your network.\\\\n\\\"]],[]],[[[1,\\\"  \\\"],[8,[39,2],null,null,null],[1,\\\" has \\\"],[10,\\\"strong\\\"],[12],[1,\\\"no casting support\\\"],[13],[1,\\\". Neither\\\\n  AirPlay nor Chromecast is available here, so the button below stays disabled\\\\n  no matter what is on your network. Try Safari for AirPlay, or Chrome for\\\\n  Chromecast.\\\\n\\\"]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"eq\\\",\\\"docs/current-browser\\\"]]\",\n    \"moduleName\": \"docs/components/docs/cast-support.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsCastSupport = _exports.default = (_class = class DocsCastSupport extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n    }\n    get supportedKind() {\n      return this.stereo.supportedCastType;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsCastSupport);\n});","define(\"docs/components/docs/current-browser\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{this.browserName}}\n  */\n  {\n    \"id\": \"1AuYJt7b\",\n    \"block\": \"[[[1,[30,0,[\\\"browserName\\\"]]]],[],false,[]]\",\n    \"moduleName\": \"docs/components/docs/current-browser.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsCurrentBrowser = _exports.default = (_class = class DocsCurrentBrowser extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"userAgent\", _descriptor, this);\n    }\n    get browserName() {\n      if (this.userAgent.get('browser.isChrome')) {\n        return 'Chrome';\n      } else if (this.userAgent.get('browser.isFirefox')) {\n        return 'Firefox';\n      } else if (this.userAgent.get('browser.isEdge')) {\n        return 'Edge';\n      } else if (this.userAgent.get('browser.isSafari')) {\n        return 'Safari';\n      } else {\n        return 'your browser';\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"userAgent\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsCurrentBrowser);\n});","define(\"docs/components/docs/current-os\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{this.osName}}\n  */\n  {\n    \"id\": \"kgJPfEs1\",\n    \"block\": \"[[[1,[30,0,[\\\"osName\\\"]]]],[],false,[]]\",\n    \"moduleName\": \"docs/components/docs/current-os.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsCurrentBrowser = _exports.default = (_class = class DocsCurrentBrowser extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"userAgent\", _descriptor, this);\n    }\n    get osName() {\n      if (this.userAgent.get('os.isAndroid')) {\n        return 'Android';\n      } else if (this.userAgent.get('os.isIOS')) {\n        return 'iOS';\n      } else if (this.userAgent.get('os.isLinux')) {\n        return 'Linux';\n      } else if (this.userAgent.get('os.isMacOS')) {\n        return 'Mac';\n      } else if (this.userAgent.get('os.isWindows')) {\n        return 'Windows';\n      } else {\n        return \"(whatever OS you're running)\";\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"userAgent\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsCurrentBrowser);\n});","define(\"docs/components/docs/custom-metadata\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! template-lint-disable no-inline-styles }}\n  \n  <DocsDemo as |demo|>\n    <demo.example @name='custom-metadata.hbs'>\n      <div>\n        <strong>Now Playing:\n          {{sound-metadata (current-sound) key='title'}}</strong>\n      </div>\n      <br />\n      <div class='flex place-content-between'>\n        {{#let 'http://streaming.koop.org/stream.mp3' as |url|}}\n          <button\n            {{on\n              'click'\n              (fn (toggle-play-sound url metadata=(hash title='91.7 KOOP')))\n            }}\n            type='button'\n            class='ui-button'\n          >\n            {{#if (sound-is-playing url)}}\n              Pause\n            {{else if (sound-is-loading url)}}\n              Loading…\n            {{else}}\n              Play KOOP\n            {{/if}}\n          </button>\n        {{/let}}\n  \n        {{#let 'https://fm939.wnyc.org/wnycfm.aac' as |url|}}\n          <button\n            {{on\n              'click'\n              (fn (toggle-play-sound url metadata=(hash title='WNYC')))\n            }}\n            type='button'\n            class='ui-button'\n          >\n            {{#if (sound-is-playing url)}}\n              Pause\n            {{else if (sound-is-loading url)}}\n              Loading…\n            {{else}}\n              Play WNYC\n            {{/if}}\n          </button>\n        {{/let}}\n      </div>\n    </demo.example>\n    <demo.snippet @name='custom-metadata.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"wHLM0OJw\",\n    \"block\": \"[[[1,\\\"\\\\n\\\"],[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"custom-metadata.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[12],[1,\\\"\\\\n      \\\"],[10,\\\"strong\\\"],[12],[1,\\\"Now Playing:\\\\n        \\\"],[1,[28,[35,1],[[28,[37,2],null,null]],[[\\\"key\\\"],[\\\"title\\\"]]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"flex place-content-between\\\"],[12],[1,\\\"\\\\n\\\"],[44,[\\\"http://streaming.koop.org/stream.mp3\\\"],[[[1,\\\"        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[\\\"click\\\",[28,[37,5],[[28,[37,6],[[30,2]],[[\\\"metadata\\\"],[[28,[37,7],null,[[\\\"title\\\"],[\\\"91.7 KOOP\\\"]]]]]]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[30,2]],null],[[[1,\\\"            Pause\\\\n\\\"]],[]],[[[41,[28,[37,10],[[30,2]],null],[[[1,\\\"            Loading…\\\\n\\\"]],[]],[[[1,\\\"            Play KOOP\\\\n          \\\"]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]]],[1,\\\"\\\\n\\\"],[44,[\\\"https://fm939.wnyc.org/wnycfm.aac\\\"],[[[1,\\\"        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[\\\"click\\\",[28,[37,5],[[28,[37,6],[[30,3]],[[\\\"metadata\\\"],[[28,[37,7],null,[[\\\"title\\\"],[\\\"WNYC\\\"]]]]]]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[30,3]],null],[[[1,\\\"            Pause\\\\n\\\"]],[]],[[[41,[28,[37,10],[[30,3]],null],[[[1,\\\"            Loading…\\\\n\\\"]],[]],[[[1,\\\"            Play WNYC\\\\n          \\\"]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[3]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"custom-metadata.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\",\\\"url\\\",\\\"url\\\"],false,[\\\"docs-demo\\\",\\\"sound-metadata\\\",\\\"current-sound\\\",\\\"let\\\",\\\"on\\\",\\\"fn\\\",\\\"toggle-play-sound\\\",\\\"hash\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"sound-is-loading\\\"]]\",\n    \"moduleName\": \"docs/components/docs/custom-metadata.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/custom-position-control\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='stereo-player'>\n    <div class='stereo-player-main'>\n      <div class='stereo-player-controls'>\n        <button\n          {{on 'click' (rewind-sound @identifier increment=5000)}}\n          disabled={{not (sound-is-rewindable @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{svg-jar\n            'skip-backward-outline'\n            height=20\n            width=30\n            title='Skip Backward'\n          }}\n        </button>\n  \n        <button\n          {{on 'click' (toggle-play-sound @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{#if (sound-is-playing @identifier)}}\n            {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}\n          {{else if (sound-is-loading @identifier)}}\n            {{svg-jar\n              'loading-outline'\n              height=20\n              width=30\n              title='Loading'\n              class='animate-spin'\n            }}\n          {{else if (sound-is-loaded @identifier)}}\n            {{svg-jar 'resume-outline' height=20 width=30 title='Pause'}}\n          {{else}}\n            {{svg-jar 'play-outline' height=20 width=30 title='Play'}}\n          {{/if}}\n        </button>\n  \n        <button\n          {{on 'click' (fastforward-sound @identifier increment=5000)}}\n          disabled={{not (sound-is-fastforwardable @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{svg-jar\n            'skip-forward-outline'\n            height=20\n            width=30\n            title='Skip Forward'\n          }}\n        </button>\n      </div>\n  \n      <div class='stereo-player-position'>\n        {{sound-position @identifier format='time'}}\n        {{#if (sound-is-seekable @identifier)}}\n          {{! template-lint-disable require-input-label }}\n          {{! BEGIN-SNIPPET position-modifiers.hbs }}\n          <div\n            {{sound-position-slider @identifier onChangePosition=this.onChangePosition}}\n            class='stereo-player-position-slider'\n          >\n            <div\n              {{sound-position-progress @identifier}}\n              class='stereo-player-position-progress'\n            ></div>\n          </div>\n          {{! END-SNIPPET }}\n        {{else}}\n          <div\n            class='{{if\n                (sound-is-playing @identifier)\n                \"from-accent-0 to-accent-2 bg-gradient-to-r animate-gradient-x animated\"\n                \"bg-on-surface-3\"\n              }}\n              w-full h-2 rounded-md inset-1 shadow-inset'\n          >\n          </div>\n        {{/if}}\n        {{sound-duration @identifier format='time'}}\n      </div>\n  \n      <div class='stereo-player-volume'>\n        <Input\n          {{stereo-volume}}\n          id='stereo-volume'\n          @type='range'\n          class='flex-auto flex-shrink w-16 lg:w-1/6'\n        />\n        <label for='stereo-volume' class='stereo-volume'>\n          <button type='button' {{on 'click' (toggle-stereo-mute)}}>\n            {{#if (gt (stereo-volume) 0)}}\n              {{svg-jar 'volume-low-outline' height=20 width=30}}\n            {{else}}\n              {{svg-jar 'volume-mute-outline' height=20 width=30}}\n            {{/if}}\n          </button>\n        </label>\n      </div>\n    </div>\n  \n    {{#if this.lastSelectedPosition}}\n      <div class=\"flex flex-auto text-sm py-2\">\n        Last selected position: {{this.lastSelectedPosition}}\n      </div>\n    {{/if}}\n  \n    {{#if (sound-is-errored @identifier)}}\n      <div class='stereo-player-errors'>\n        {{sound-error-details @identifier}}\n      </div>\n    {{/if}}\n  </div>\n  \n  \n  {{#unless @hideSource}}\n  <DocsDemo as |demo|>\n    <demo.snippet @name='position-modifiers.hbs' />\n  </DocsDemo>\n  {{/unless}}\n  \n  */\n  {\n    \"id\": \"F8/Qb0Xy\",\n    \"block\": \"[[[10,0],[14,0,\\\"stereo-player\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"stereo-player-main\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-controls\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,1],[[30,1]],null]],null]],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[30,1]],[[\\\"increment\\\"],[5000]]]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"skip-backward-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Skip Backward\\\"]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,5],[[30,1]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"loading-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\",\\\"class\\\"],[20,30,\\\"Loading\\\",\\\"animate-spin\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,9],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"resume-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"play-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Play\\\"]]]],[1,\\\"\\\\n        \\\"]],[]]]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,10],[[30,1]],null]],null]],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,11],[[30,1]],[[\\\"increment\\\"],[5000]]]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"skip-forward-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Skip Forward\\\"]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-position\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,12],[[30,1]],[[\\\"format\\\"],[\\\"time\\\"]]]],[1,\\\"\\\\n\\\"],[41,[28,[37,13],[[30,1]],null],[[[1,\\\"        \\\"],[11,0],[24,0,\\\"stereo-player-position-slider\\\"],[4,[38,14],[[30,1]],[[\\\"onChangePosition\\\"],[[30,0,[\\\"onChangePosition\\\"]]]]],[12],[1,\\\"\\\\n          \\\"],[11,0],[24,0,\\\"stereo-player-position-progress\\\"],[4,[38,15],[[30,1]],null],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[15,0,[29,[[52,[28,[37,7],[[30,1]],null],\\\"from-accent-0 to-accent-2 bg-gradient-to-r animate-gradient-x animated\\\",\\\"bg-on-surface-3\\\"],\\\"\\\\n            w-full h-2 rounded-md inset-1 shadow-inset\\\"]]],[12],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"],[1,[28,[35,16],[[30,1]],[[\\\"format\\\"],[\\\"time\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-volume\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,17],[[24,1,\\\"stereo-volume\\\"],[24,0,\\\"flex-auto flex-shrink w-16 lg:w-1/6\\\"],[4,[38,18],null,null]],[[\\\"@type\\\"],[\\\"range\\\"]],null],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"stereo-volume\\\"],[14,0,\\\"stereo-volume\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,19],null,null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,20],[[28,[37,18],null,null],0],null],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"volume-low-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[20,30]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"volume-mute-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[20,30]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"lastSelectedPosition\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"flex flex-auto text-sm py-2\\\"],[12],[1,\\\"\\\\n      Last selected position: \\\"],[1,[30,0,[\\\"lastSelectedPosition\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,21],[[30,1]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"stereo-player-errors\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,22],[[30,1]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\\n\\\"],[41,[51,[30,2]],[[[8,[39,24],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,3,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"position-modifiers.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[3]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@identifier\\\",\\\"@hideSource\\\",\\\"demo\\\"],false,[\\\"not\\\",\\\"sound-is-rewindable\\\",\\\"on\\\",\\\"rewind-sound\\\",\\\"svg-jar\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"sound-is-loading\\\",\\\"sound-is-loaded\\\",\\\"sound-is-fastforwardable\\\",\\\"fastforward-sound\\\",\\\"sound-position\\\",\\\"sound-is-seekable\\\",\\\"sound-position-slider\\\",\\\"sound-position-progress\\\",\\\"sound-duration\\\",\\\"input\\\",\\\"stereo-volume\\\",\\\"toggle-stereo-mute\\\",\\\"gt\\\",\\\"sound-is-errored\\\",\\\"sound-error-details\\\",\\\"unless\\\",\\\"docs-demo\\\"]]\",\n    \"moduleName\": \"docs/components/docs/custom-position-control.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsCustomPositionControlComponent = _exports.default = (_class = class DocsCustomPositionControlComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"lastSelectedPosition\", _descriptor, this);\n    }\n    onChangePosition(position /* event */) {\n      this.lastSelectedPosition = position;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"lastSelectedPosition\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"onChangePosition\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"onChangePosition\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsCustomPositionControlComponent);\n});","define(\"docs/components/docs/event-display\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='px-4 pb-4 border border-on-surface-2'>\n    <h3 class='pt-4 pb-2 text-sm text-center uppercase'>sound events</h3>\n    <EventDisplay @url={{@url}} class='text-white' />\n  </div>\n  */\n  {\n    \"id\": \"C0BMgjOS\",\n    \"block\": \"[[[10,0],[14,0,\\\"px-4 pb-4 border border-on-surface-2\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h3\\\"],[14,0,\\\"pt-4 pb-2 text-sm text-center uppercase\\\"],[12],[1,\\\"sound events\\\"],[13],[1,\\\"\\\\n  \\\"],[8,[39,0],[[24,0,\\\"text-white\\\"]],[[\\\"@url\\\"],[[30,1]]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"@url\\\"],false,[\\\"event-display\\\"]]\",\n    \"moduleName\": \"docs/components/docs/event-display.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/manual-position-control\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='stereo-player'>\n    <div class='stereo-player-main'>\n      <div class='stereo-player-controls'>\n  \n      </div>\n  \n      <div class='stereo-player-position'>\n        {{sound-position position=(or this.lastSelectedPosition @position) duration=@duration format='time'}}\n          {{! template-lint-disable require-input-label }}\n          {{! BEGIN-SNIPPET dummy-position-modifiers.hbs }}\n          <div\n            {{sound-position-slider position=(or this.lastSelectedPosition @position) duration=@duration onChangePosition=this.onChangePosition}}\n            class='stereo-player-position-slider'\n          >\n            <div\n              {{sound-position-progress position=(or this.lastSelectedPosition @position) duration=@duration}}\n              class='stereo-player-position-progress'\n            ></div>\n          </div>\n          {{! END-SNIPPET }}\n  \n        {{sound-duration duration=@duration format='time'}}\n      </div>\n    </div>\n  \n    {{#if this.lastSelectedPosition}}\n      <div class=\"flex flex-auto text-sm py-2\">\n        Last selected position: {{this.lastSelectedPosition}}\n      </div>\n    {{/if}}\n  </div>\n  \n  \n  {{#unless @hideSource}}\n  <DocsDemo as |demo|>\n    <demo.snippet @name='dummy-position-modifiers.hbs' />\n  </DocsDemo>\n  {{/unless}}\n  \n  */\n  {\n    \"id\": \"eDmo3V8G\",\n    \"block\": \"[[[10,0],[14,0,\\\"stereo-player\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"stereo-player-main\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-controls\\\"],[12],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-position\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,0],null,[[\\\"position\\\",\\\"duration\\\",\\\"format\\\"],[[28,[37,1],[[30,0,[\\\"lastSelectedPosition\\\"]],[30,1]],null],[30,2],\\\"time\\\"]]]],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[11,0],[24,0,\\\"stereo-player-position-slider\\\"],[4,[38,2],null,[[\\\"position\\\",\\\"duration\\\",\\\"onChangePosition\\\"],[[28,[37,1],[[30,0,[\\\"lastSelectedPosition\\\"]],[30,1]],null],[30,2],[30,0,[\\\"onChangePosition\\\"]]]]],[12],[1,\\\"\\\\n          \\\"],[11,0],[24,0,\\\"stereo-player-position-progress\\\"],[4,[38,3],null,[[\\\"position\\\",\\\"duration\\\"],[[28,[37,1],[[30,0,[\\\"lastSelectedPosition\\\"]],[30,1]],null],[30,2]]]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"\\\\n      \\\"],[1,[28,[35,4],null,[[\\\"duration\\\",\\\"format\\\"],[[30,2],\\\"time\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"lastSelectedPosition\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"flex flex-auto text-sm py-2\\\"],[12],[1,\\\"\\\\n      Last selected position: \\\"],[1,[30,0,[\\\"lastSelectedPosition\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\\n\\\"],[41,[51,[30,3]],[[[8,[39,7],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,4,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"dummy-position-modifiers.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[4]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@position\\\",\\\"@duration\\\",\\\"@hideSource\\\",\\\"demo\\\"],false,[\\\"sound-position\\\",\\\"or\\\",\\\"sound-position-slider\\\",\\\"sound-position-progress\\\",\\\"sound-duration\\\",\\\"if\\\",\\\"unless\\\",\\\"docs-demo\\\"]]\",\n    \"moduleName\": \"docs/components/docs/manual-position-control.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsCustomPositionControlComponent = _exports.default = (_class = class DocsCustomPositionControlComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"lastSelectedPosition\", _descriptor, this);\n    }\n    onChangePosition(position /* event */) {\n      this.lastSelectedPosition = position;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"lastSelectedPosition\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"onChangePosition\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"onChangePosition\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsCustomPositionControlComponent);\n});","define(\"docs/components/docs/other-browser\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{this.oppositeBrowser}}\n  */\n  {\n    \"id\": \"WcCLilhC\",\n    \"block\": \"[[[1,[30,0,[\\\"oppositeBrowser\\\"]]]],[],false,[]]\",\n    \"moduleName\": \"docs/components/docs/other-browser.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsCurrentBrowser = _exports.default = (_class = class DocsCurrentBrowser extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"userAgent\", _descriptor, this);\n    }\n    get oppositeBrowser() {\n      if (this.userAgent.get('browser.isChrome')) {\n        return 'Safari or Firefox';\n      } else if (this.userAgent.get('browser.isFirefox')) {\n        return 'Safari';\n      } else if (this.userAgent.get('browser.isEdge')) {\n        return 'Firefox';\n      } else if (this.userAgent.get('browser.isSafari')) {\n        return 'Firefox';\n      } else {\n        return 'your browser';\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"userAgent\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsCurrentBrowser);\n});","define(\"docs/components/docs/peek-snippet\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _component2, _tracking, _object, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='peek-snippet {{unless this.isExpanded \"is-collapsed\"}}'>\n    <DocsSnippet\n      @name={{@name}}\n      @unindent={{true}}\n      @language={{@language}}\n    />\n  \n    {{#unless this.isExpanded}}\n      <div class='peek-snippet-fade'></div>\n    {{/unless}}\n  </div>\n  \n  <button\n    type='button'\n    class='peek-snippet-toggle'\n    aria-expanded='{{if this.isExpanded \"true\" \"false\"}}'\n    {{on 'click' this.toggle}}\n  >\n    {{if this.isExpanded 'Hide' 'Show'}}\n    the full\n    {{this.label}}\n  </button>\n  \n  */\n  {\n    \"id\": \"Qj6bTZ4s\",\n    \"block\": \"[[[10,0],[15,0,[29,[\\\"peek-snippet \\\",[52,[51,[30,0,[\\\"isExpanded\\\"]]],\\\"is-collapsed\\\"]]]],[12],[1,\\\"\\\\n  \\\"],[8,[39,1],null,[[\\\"@name\\\",\\\"@unindent\\\",\\\"@language\\\"],[[30,1],true,[30,2]]],null],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,0,[\\\"isExpanded\\\"]]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"peek-snippet-fade\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[11,\\\"button\\\"],[24,0,\\\"peek-snippet-toggle\\\"],[16,\\\"aria-expanded\\\",[29,[[52,[30,0,[\\\"isExpanded\\\"]],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,3],[\\\"click\\\",[30,0,[\\\"toggle\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[1,[52,[30,0,[\\\"isExpanded\\\"]],\\\"Hide\\\",\\\"Show\\\"]],[1,\\\"\\\\n  the full\\\\n  \\\"],[1,[30,0,[\\\"label\\\"]]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@name\\\",\\\"@language\\\"],false,[\\\"unless\\\",\\\"docs-snippet\\\",\\\"if\\\",\\\"on\\\"]]\",\n    \"moduleName\": \"docs/components/docs/peek-snippet.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsPeekSnippetComponent = _exports.default = (_class = class DocsPeekSnippetComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"isExpanded\", _descriptor, this);\n    }\n    get label() {\n      return this.args.label ?? 'template';\n    }\n    toggle() {\n      this.isExpanded = !this.isExpanded;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"isExpanded\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"toggle\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"toggle\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsPeekSnippetComponent);\n});","define(\"docs/components/docs/proxy-example\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='proxy-example.hbs'>\n      <div class='grid gap-4 md:grid-cols-2'>\n        <div class='p-3 border rounded border-surface-3'>\n          <h4 class='font-bold mb-1'>Template helpers</h4>\n          <p class='text-xs opacity-70 mb-2'>\n            These only read. Nothing on this side ever loads the sound.\n          </p>\n          <ul class='text-sm font-mono'>\n            {{#let (find-sound this.url) as |sound|}}\n              <li>isPending: {{if sound.isPending 'true' 'false'}}</li>\n              <li>connection: {{or sound.connectionName '—'}}</li>\n            {{/let}}\n            <li>sound-is-loading:\n              {{if (sound-is-loading this.url) 'true' 'false'}}</li>\n            <li>sound-is-loaded:\n              {{if (sound-is-loaded this.url) 'true' 'false'}}</li>\n            <li>sound-is-playing:\n              {{if (sound-is-playing this.url) 'true' 'false'}}</li>\n          </ul>\n        </div>\n        <div class='p-3 border rounded border-surface-3'>\n          <h4 class='font-bold mb-1'>Service controls</h4>\n          <p class='text-xs opacity-70 mb-2'>\n            These drive the service directly. The helpers update anyway, because\n            both sides share one Sound.\n          </p>\n          <button\n            type='button'\n            class='ui-button'\n            {{on 'click' (load-sound this.url)}}\n          >\n            Load\n          </button>\n          <button\n            type='button'\n            class='ui-button'\n            {{on 'click' (toggle-play-sound this.url)}}\n          >\n            Toggle Play\n          </button>\n          <button type='button' class='ui-button' {{on 'click' this.remove}}>\n            Remove\n          </button>\n        </div>\n      </div>\n    </demo.example>\n    <demo.snippet @name='proxy-example.hbs' />\n    <demo.snippet @name='proxy-example.js' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"+yjvvJx+\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"proxy-example.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"grid gap-4 md:grid-cols-2\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"p-3 border rounded border-surface-3\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[14,0,\\\"font-bold mb-1\\\"],[12],[1,\\\"Template helpers\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"text-xs opacity-70 mb-2\\\"],[12],[1,\\\"\\\\n          These only read. Nothing on this side ever loads the sound.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"text-sm font-mono\\\"],[12],[1,\\\"\\\\n\\\"],[44,[[28,[37,2],[[30,0,[\\\"url\\\"]]],null]],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[12],[1,\\\"isPending: \\\"],[1,[52,[30,2,[\\\"isPending\\\"]],\\\"true\\\",\\\"false\\\"]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[12],[1,\\\"connection: \\\"],[1,[28,[35,4],[[30,2,[\\\"connectionName\\\"]],\\\"—\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[2]]],[1,\\\"          \\\"],[10,\\\"li\\\"],[12],[1,\\\"sound-is-loading:\\\\n            \\\"],[1,[52,[28,[37,5],[[30,0,[\\\"url\\\"]]],null],\\\"true\\\",\\\"false\\\"]],[13],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[1,\\\"sound-is-loaded:\\\\n            \\\"],[1,[52,[28,[37,6],[[30,0,[\\\"url\\\"]]],null],\\\"true\\\",\\\"false\\\"]],[13],[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[12],[1,\\\"sound-is-playing:\\\\n            \\\"],[1,[52,[28,[37,7],[[30,0,[\\\"url\\\"]]],null],\\\"true\\\",\\\"false\\\"]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"p-3 border rounded border-surface-3\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[14,0,\\\"font-bold mb-1\\\"],[12],[1,\\\"Service controls\\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"text-xs opacity-70 mb-2\\\"],[12],[1,\\\"\\\\n          These drive the service directly. The helpers update anyway, because\\\\n          both sides share one Sound.\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,8],[\\\"click\\\",[28,[37,9],[[30,0,[\\\"url\\\"]]],null]],null],[12],[1,\\\"\\\\n          Load\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,8],[\\\"click\\\",[28,[37,10],[[30,0,[\\\"url\\\"]]],null]],null],[12],[1,\\\"\\\\n          Toggle Play\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,8],[\\\"click\\\",[30,0,[\\\"remove\\\"]]],null],[12],[1,\\\"\\\\n          Remove\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"proxy-example.hbs\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"proxy-example.js\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\",\\\"sound\\\"],false,[\\\"docs-demo\\\",\\\"let\\\",\\\"find-sound\\\",\\\"if\\\",\\\"or\\\",\\\"sound-is-loading\\\",\\\"sound-is-loaded\\\",\\\"sound-is-playing\\\",\\\"on\\\",\\\"load-sound\\\",\\\"toggle-play-sound\\\"]]\",\n    \"moduleName\": \"docs/components/docs/proxy-example.hbs\",\n    \"isStrictMode\": false\n  });\n\n  // BEGIN-SNIPPET proxy-example.js\n  let ProxyExample = _exports.default = (_class = class ProxyExample extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"url\", _descriptor2, this);\n    }\n    remove() {\n      this.stereo.removeSound(this.url);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"url\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 'https://streaming.koop.org/stream.aac';\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"remove\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"remove\"), _class.prototype), _class);\n  // END-SNIPPET proxy-example.js\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ProxyExample);\n});","define(\"docs/components/docs/queued\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _tracking, _object, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='queued.hbs'>\n  \n      {{#if (sound-is-playing (current-sound))}}\n        <p>{{get (current-sound) 'url'}}</p>\n  \n        <button type='button' {{on 'click' (stop-sound (current-sound))}}>\n          Stop\n        </button>\n      {{else}}\n        <button type='button' {{on 'click' this.playSound}}>\n          Play Queue\n        </button>\n      {{/if}}\n  \n    </demo.example>\n    <demo.snippet @name='queued.hbs' />\n    <demo.snippet @name='queued.js' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"BlXv5MnU\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"queued.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,2],[[28,[37,3],null,null]],null],[[[1,\\\"      \\\"],[10,2],[12],[1,[28,[35,4],[[28,[37,3],null,null],\\\"url\\\"],null]],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,5],[\\\"click\\\",[28,[37,6],[[28,[37,3],null,null]],null]],null],[12],[1,\\\"\\\\n        Stop\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,5],[\\\"click\\\",[30,0,[\\\"playSound\\\"]]],null],[12],[1,\\\"\\\\n        Play Queue\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"queued.hbs\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"queued.js\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"current-sound\\\",\\\"get\\\",\\\"on\\\",\\\"stop-sound\\\"]]\",\n    \"moduleName\": \"docs/components/docs/queued.hbs\",\n    \"isStrictMode\": false\n  });\n\n  // BEGIN-SNIPPET queued.js\n  let Queued = _exports.default = (_class = class Queued extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"identifier\", _descriptor2, this);\n      _initializerDefineProperty(this, \"queue\", _descriptor3, this);\n    }\n    async playSound() {\n      this.queue = ['/sounds/attention.mp3', '/sounds/internet-on-computers.mp3', 'https://streaming.koop.org/stream.aac'];\n      let sound = await this.playNext();\n      sound.audioElement.setAttribute('id', `id-${Math.floor(Math.random() * 10000)}`);\n      this.stereo.on('audio-ended', ({\n        sound\n      }) => {\n        console.log(sound.audioElement);\n        this.playNext();\n      });\n    }\n    async playNext() {\n      let next = this.queue.shift();\n      if (next) {\n        let {\n          sound\n        } = await this.stereo.play(next);\n        return sound;\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"identifier\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"queue\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"playSound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"playSound\"), _class.prototype), _class);\n  // END-SNIPPET queued.js\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, Queued);\n});","define(\"docs/components/docs/service-errors-silence-error\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! template-lint-disable no-inline-styles }}\n  \n  <DocsDemo as |demo|>\n    <demo.example @name='service-errors-silence-errors.hbs'>\n      <p>You can silence the thrown errors and handle them inline</p>\n      <div style='flex place-content-between'>\n        <button\n          {{on 'click' (fn this.togglePlaySound '/sounds/unplayable-scooby.au')}}\n          type='button'\n          class='ui-button'\n        >\n          {{#if this.sound.isPlaying}}\n            Pause\n          {{else}}\n            Play Sound\n          {{/if}}\n        </button>\n      </div>\n  \n      {{#if this.error}}\n        <div class='px-1 py-2 text-sm text-danger'>{{this.error}}</div>\n      {{/if}}\n    </demo.example>\n    <demo.snippet @name='service-errors-silence-errors.js' />\n    <demo.snippet @name='service-errors-silence-errors.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"ediRkydz\",\n    \"block\": \"[[[1,\\\"\\\\n\\\"],[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-silence-errors.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You can silence the thrown errors and handle them inline\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,5,\\\"flex place-content-between\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"togglePlaySound\\\"]],\\\"/sounds/unplayable-scooby.au\\\"],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"sound\\\",\\\"isPlaying\\\"]],[[[1,\\\"          Pause\\\\n\\\"]],[]],[[[1,\\\"          Play Sound\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"px-1 py-2 text-sm text-danger\\\"],[12],[1,[30,0,[\\\"error\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-silence-errors.js\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-silence-errors.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"on\\\",\\\"fn\\\",\\\"if\\\"]]\",\n    \"moduleName\": \"docs/components/docs/service-errors-silence-error.hbs\",\n    \"isStrictMode\": false\n  });\n  let ServiceExample = _exports.default = (_class = class ServiceExample extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"sound\", _descriptor, this);\n      _initializerDefineProperty(this, \"error\", _descriptor2, this);\n      _initializerDefineProperty(this, \"stereo\", _descriptor3, this);\n    }\n    // BEGIN-SNIPPET service-errors-silence-errors.js\n    async togglePlaySound(url) {\n      this.error = false;\n      if (this.sound) {\n        this.sound.togglePause();\n      } else {\n        let {\n          sound,\n          error /* failures */\n        } = await this.stereo.play(url, {\n          silenceErrors: true\n        });\n        this.sound = sound;\n        this.error = error;\n      }\n    }\n    // END-SNIPPET service-errors-silence-errors.js\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"error\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"togglePlaySound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"togglePlaySound\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ServiceExample);\n});","define(\"docs/components/docs/service-errors-throw-error\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! template-lint-disable no-inline-styles }}\n  \n  <DocsDemo as |demo|>\n    <demo.example @name='service-errors-wild-west.hbs'>\n      <p>This is what happens when you don't catch the error (open your console)</p>\n      <div>\n        <button\n          {{on 'click' (fn this.togglePlaySound '/sounds/unplayable-scooby.au')}}\n          type='button'\n          class='ui-button'\n        >\n          {{#if this.sound.isPlaying}}\n            Pause\n          {{else}}\n            Play Sound\n          {{/if}}\n        </button>\n      </div>\n  \n      {{#if this.error}}\n        <div class='px-1 py-2 text-sm text-danger'>{{this.error}}</div>\n      {{/if}}\n    </demo.example>\n    <demo.snippet @name='service-errors-wild-west.js' />\n    <demo.snippet @name='service-errors-wild-west.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"AeDsLEPS\",\n    \"block\": \"[[[1,\\\"\\\\n\\\"],[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-wild-west.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This is what happens when you don't catch the error (open your console)\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"togglePlaySound\\\"]],\\\"/sounds/unplayable-scooby.au\\\"],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"sound\\\",\\\"isPlaying\\\"]],[[[1,\\\"          Pause\\\\n\\\"]],[]],[[[1,\\\"          Play Sound\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"px-1 py-2 text-sm text-danger\\\"],[12],[1,[30,0,[\\\"error\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-wild-west.js\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-wild-west.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"on\\\",\\\"fn\\\",\\\"if\\\"]]\",\n    \"moduleName\": \"docs/components/docs/service-errors-throw-error.hbs\",\n    \"isStrictMode\": false\n  });\n  let ServiceExample = _exports.default = (_class = class ServiceExample extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"sound\", _descriptor, this);\n      _initializerDefineProperty(this, \"error\", _descriptor2, this);\n      _initializerDefineProperty(this, \"stereo\", _descriptor3, this);\n    }\n    // BEGIN-SNIPPET service-errors-wild-west.js\n    async togglePlaySound(url) {\n      this.error = false;\n      if (this.sound) {\n        this.sound.togglePause();\n      } else {\n        let {\n          sound,\n          error /* failures */\n        } = await this.stereo.play(url);\n\n        // error gets thrown and this will never happen. catch your errors, mang\n        this.sound = sound;\n        this.error[url] = error;\n      }\n    }\n    // END-SNIPPET\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"error\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"togglePlaySound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"togglePlaySound\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ServiceExample);\n});","define(\"docs/components/docs/service-errors-try-catch\", [\"exports\", \"@ember/component\", \"ember-concurrency/async-arrow-runtime\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/service\", \"@ember/template-factory\"], function (_exports, _component, _asyncArrowRuntime, _component2, _tracking, _service, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/async-arrow-runtime\",0,\"@glimmer/component\",0,\"@glimmer/tracking\",0,\"@ember/service\",0,\"ember-concurrency\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='service-errors-try-catch.hbs'>\n      <p>Using a try/catch block with async/await</p>\n      <div>\n        <button\n          {{on\n            'click'\n            (perform this.playSoundTask '/sounds/unplayable-scooby.au')\n          }}\n          type='button'\n          class='ui-button'\n        >\n          {{#if this.playSoundTask.isRunning}}\n            Loading…\n          {{else if this.sound.isPlaying}}\n            Pause\n          {{else}}\n            Play Sound\n          {{/if}}\n        </button>\n      </div>\n  \n      {{#if this.error}}\n        <div class='px-1 py-2 text-sm text-danger'>{{this.error}}</div>\n      {{/if}}\n    </demo.example>\n    <demo.snippet @name='service-errors-try-catch.js' />\n    <demo.snippet @name='service-errors-try-catch.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"m7PM8heJ\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-try-catch.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Using a try/catch block with async/await\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"playSoundTask\\\"]],\\\"/sounds/unplayable-scooby.au\\\"],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"playSoundTask\\\",\\\"isRunning\\\"]],[[[1,\\\"          Loading…\\\\n\\\"]],[]],[[[41,[30,0,[\\\"sound\\\",\\\"isPlaying\\\"]],[[[1,\\\"          Pause\\\\n\\\"]],[]],[[[1,\\\"          Play Sound\\\\n        \\\"]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"px-1 py-2 text-sm text-danger\\\"],[12],[1,[30,0,[\\\"error\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-try-catch.js\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-try-catch.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"on\\\",\\\"perform\\\",\\\"if\\\"]]\",\n    \"moduleName\": \"docs/components/docs/service-errors-try-catch.hbs\",\n    \"isStrictMode\": false\n  });\n  let ServiceExample = _exports.default = (_class = class ServiceExample extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"sound\", _descriptor, this);\n      _initializerDefineProperty(this, \"error\", _descriptor2, this);\n      _initializerDefineProperty(this, \"stereo\", _descriptor3, this);\n      // BEGIN-SNIPPET service-errors-try-catch.js\n      _defineProperty(this, \"playSoundTask\", (0, _asyncArrowRuntime.buildTask)(() => ({\n        context: this,\n        generator: function* (url) {\n          this.error = false;\n          if (this.sound) {\n            this.sound.togglePause();\n          } else {\n            try {\n              let {\n                sound /* error, failures */\n              } = yield this.stereo.play(url);\n              this.sound = sound;\n            } catch (e) {\n              this.error = e.message;\n            }\n          }\n        }\n      }), null, \"playSoundTask\", null));\n    } // END-SNIPPET service-errors-try-catch.js\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"error\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ServiceExample);\n});","define(\"docs/components/docs/service-errors-try-then\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='service-errors-try-then.hbs'>\n      <p>Using a try/then/catch on the promise</p>\n      <div>\n        <button\n          {{on 'click' (fn this.togglePlaySound '/sounds/unplayable-scooby.au')}}\n          type='button'\n          class='ui-button'\n        >\n          {{#if this.sound.isPlaying}}\n            Pause\n          {{else}}\n            Play Sound\n          {{/if}}\n        </button>\n      </div>\n  \n      {{#if this.error}}\n        <div class='px-1 py-2 text-sm text-danger'>{{this.error}}</div>\n      {{/if}}\n    </demo.example>\n    <demo.snippet @name='service-errors-try-then.js' />\n    <demo.snippet @name='service-errors-try-then.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"oMJ+fQra\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-try-then.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Using a try/then/catch on the promise\\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"togglePlaySound\\\"]],\\\"/sounds/unplayable-scooby.au\\\"],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"sound\\\",\\\"isPlaying\\\"]],[[[1,\\\"          Pause\\\\n\\\"]],[]],[[[1,\\\"          Play Sound\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"px-1 py-2 text-sm text-danger\\\"],[12],[1,[30,0,[\\\"error\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-try-then.js\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-errors-try-then.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"on\\\",\\\"fn\\\",\\\"if\\\"]]\",\n    \"moduleName\": \"docs/components/docs/service-errors-try-then.hbs\",\n    \"isStrictMode\": false\n  });\n  let ServiceExample = _exports.default = (_class = class ServiceExample extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"sound\", _descriptor, this);\n      _initializerDefineProperty(this, \"error\", _descriptor2, this);\n      _initializerDefineProperty(this, \"stereo\", _descriptor3, this);\n    }\n    // BEGIN-SNIPPET service-errors-try-then.js\n    togglePlaySound(url) {\n      this.error = false;\n      if (this.sound) {\n        this.sound.togglePause();\n      } else {\n        this.stereo.play(url).then(({\n          sound /* error, failures */\n        }) => {\n          this.sound = sound;\n        }).catch(e => {\n          this.error = e.message;\n        });\n      }\n    }\n    // END-SNIPPET service-errors-try-then.js\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"error\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"togglePlaySound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"togglePlaySound\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ServiceExample);\n});","define(\"docs/components/docs/service-example\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='service-example.hbs'>\n      <button\n        type='button'\n        {{on\n          'click'\n          (fn this.togglePlaySound 'https://streaming.koop.org/stream.mp3')\n        }}\n        class='ui-button'\n      >\n        {{#if this.sound.isPlaying}}\n          Pause\n        {{else}}\n          Play\n        {{/if}}\n      </button>\n    </demo.example>\n    <demo.snippet @name='service-example.hbs' />\n    <demo.snippet @name='service-example.js' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"L+3Z/bsc\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"service-example.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"togglePlaySound\\\"]],\\\"https://streaming.koop.org/stream.mp3\\\"],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"sound\\\",\\\"isPlaying\\\"]],[[[1,\\\"        Pause\\\\n\\\"]],[]],[[[1,\\\"        Play\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-example.hbs\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"service-example.js\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\"],false,[\\\"docs-demo\\\",\\\"on\\\",\\\"fn\\\",\\\"if\\\"]]\",\n    \"moduleName\": \"docs/components/docs/service-example.hbs\",\n    \"isStrictMode\": false\n  });\n  let ServiceExample = _exports.default = (_class = class ServiceExample extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      // BEGIN-SNIPPET service-example.js\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"sound\", _descriptor2, this);\n    }\n    async togglePlaySound(url) {\n      if (this.sound) {\n        this.sound.togglePause();\n      } else {\n        let {\n          sound\n        } = await this.stereo.play(url);\n        this.sound = sound;\n      }\n    }\n    // END-SNIPPET\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"togglePlaySound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"togglePlaySound\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ServiceExample);\n});","define(\"docs/components/docs/stereo-player-changer\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='flex flex-wrap gap-2 mb-2'>\n    {{#each @sounds as |sound|}}\n      <button\n        type='button'\n        class='preset-chip'\n        aria-pressed='{{if (eq sound.url this.identifier) \"true\" \"false\"}}'\n        {{on 'click' (fn this.select sound.url)}}\n      >{{sound.title}}</button>\n    {{/each}}\n  </div>\n  \n  <Docs::StereoPlayerModifiers @identifier={{this.identifier}} />\n  \n  */\n  {\n    \"id\": \"s74PcfWZ\",\n    \"block\": \"[[[10,0],[14,0,\\\"flex flex-wrap gap-2 mb-2\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1]],null]],null],null,[[[1,\\\"    \\\"],[11,\\\"button\\\"],[24,0,\\\"preset-chip\\\"],[16,\\\"aria-pressed\\\",[29,[[52,[28,[37,3],[[30,2,[\\\"url\\\"]],[30,0,[\\\"identifier\\\"]]],null],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,4],[\\\"click\\\",[28,[37,5],[[30,0,[\\\"select\\\"]],[30,2,[\\\"url\\\"]]],null]],null],[12],[1,[30,2,[\\\"title\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[8,[39,6],null,[[\\\"@identifier\\\"],[[30,0,[\\\"identifier\\\"]]]],null],[1,\\\"\\\\n\\\"]],[\\\"@sounds\\\",\\\"sound\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"eq\\\",\\\"on\\\",\\\"fn\\\",\\\"docs/stereo-player-modifiers\\\"]]\",\n    \"moduleName\": \"docs/components/docs/stereo-player-changer.hbs\",\n    \"isStrictMode\": false\n  });\n  let StereoPlayerChanger = _exports.default = (_class = class StereoPlayerChanger extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"identifier\", _descriptor, this);\n    }\n    select(url) {\n      this.identifier = url;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"identifier\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return this.args.sounds[0].url;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"select\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"select\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, StereoPlayerChanger);\n});","define(\"docs/components/docs/stereo-player-example\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/template-factory\"], function (_exports, _component, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='stereo-player-example.hbs'>\n      <Docs::StereoPlayer\n        @identifier={{@identifier}}\n        class='demo-sound-display'\n      />\n    </demo.example>\n  \n    <Docs::PeekSnippet @name='stereo-player.hbs' @language='handlebars' />\n  </DocsDemo>\n  \n  */\n  {\n    \"id\": \"MbwPqHZs\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"stereo-player-example.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[39,1],[[24,0,\\\"demo-sound-display\\\"]],[[\\\"@identifier\\\"],[[30,2]]],null],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,2],null,[[\\\"@name\\\",\\\"@language\\\"],[\\\"stereo-player.hbs\\\",\\\"handlebars\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"]],[\\\"demo\\\",\\\"@identifier\\\"],false,[\\\"docs-demo\\\",\\\"docs/stereo-player\\\",\\\"docs/peek-snippet\\\"]]\",\n    \"moduleName\": \"docs/components/docs/stereo-player-example.hbs\",\n    \"isStrictMode\": false\n  });\n  class DocsStereoPlayerExampleComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      // BEGIN-SNIPPET stereo-player-example-controller.js\n      _defineProperty(this, \"onDemandUrl\", 'https://audio.wnyc.org/otm/otm04212017pod.mp3');\n      _defineProperty(this, \"onDemandOgg\", 'https://file-examples-com.github.io/uploads/2017/11/file_example_OOG_1MG.ogg');\n      _defineProperty(this, \"streamUrl\", 'https://streaming.koop.org/stream.mp3');\n    } // END-SNIPPET\n  }\n  _exports.default = DocsStereoPlayerExampleComponent;\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsStereoPlayerExampleComponent);\n});","define(\"docs/components/docs/stereo-player-modifiers\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! BEGIN-SNIPPET stereo-player.hbs }}\n  <div class='stereo-player'>\n    <div class='stereo-player-main'>\n      <div class='stereo-player-controls'>\n        <button\n          {{on 'click' (rewind-sound @identifier increment=5000)}}\n          disabled={{not (sound-is-rewindable @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{svg-jar\n            'skip-backward-outline'\n            height=20\n            width=30\n            title='Skip Backward'\n          }}\n        </button>\n  \n        <button\n          {{on 'click' (toggle-play-sound @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{#if (sound-is-playing @identifier)}}\n            {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}\n          {{else if (sound-is-loading @identifier)}}\n            {{svg-jar\n              'loading-outline'\n              height=20\n              width=30\n              title='Loading'\n              class='animate-spin'\n            }}\n          {{else if (sound-is-loaded @identifier)}}\n            {{svg-jar 'resume-outline' height=20 width=30 title='Pause'}}\n          {{else}}\n            {{svg-jar 'play-outline' height=20 width=30 title='Play'}}\n          {{/if}}\n        </button>\n  \n        <button\n          {{on 'click' (fastforward-sound @identifier increment=5000)}}\n          disabled={{not (sound-is-fastforwardable @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{svg-jar\n            'skip-forward-outline'\n            height=20\n            width=30\n            title='Skip Forward'\n          }}\n        </button>\n      </div>\n  \n      <div\n        class='stereo-player-position h-2 rounded-md bg-on-surface-3 inset-1'\n        {{sound-position-slider @identifier}}\n      >\n        {{#if (sound-is-seekable @identifier)}}\n          <div\n            class='h-2 rounded-md bg-accent-1 inset-1'\n            data-test-element='progress'\n            {{sound-position-progress @identifier}}\n          ></div>\n        {{else}}\n          <div\n            class='{{if\n                (sound-is-playing @identifier)\n                \"from-accent-0 to-accent-2 bg-gradient-to-r animate-gradient-x animated\"\n                \"bg-on-surface-3\"\n              }}\n              w-full h-2 rounded-md inset-1 shadow-inset'\n          >\n          </div>\n        {{/if}}\n      </div>\n  \n      {{! BEGIN-SNIPPET stereo-volume-control.hbs }}\n      <div class='stereo-player-volume'>\n        <Input\n          {{stereo-volume}}\n          id='stereo-volume'\n          @type='range'\n          class='flex-auto flex-shrink w-16 lg:w-1/6'\n        />\n        <label for='stereo-volume' class='stereo-volume'>\n          <button type='button' {{on 'click' (toggle-stereo-mute)}}>\n            {{#if (gt (stereo-volume) 0)}}\n              {{svg-jar 'volume-low-outline' height=20 width=30}}\n            {{else}}\n              {{svg-jar 'volume-mute-outline' height=20 width=30}}\n            {{/if}}\n          </button>\n        </label>\n      </div>\n      {{! END-SNIPPET }}\n    </div>\n  \n    {{#if (sound-is-errored @identifier)}}\n      <div class='stereo-player-errors'>\n        {{sound-error-details @identifier}}\n      </div>\n    {{/if}}\n  </div>\n  \n  {{! END-SNIPPET }}\n  */\n  {\n    \"id\": \"7+1aCTnh\",\n    \"block\": \"[[[10,0],[14,0,\\\"stereo-player\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"stereo-player-main\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-controls\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,1],[[30,1]],null]],null]],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[30,1]],[[\\\"increment\\\"],[5000]]]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"skip-backward-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Skip Backward\\\"]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,5],[[30,1]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"loading-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\",\\\"class\\\"],[20,30,\\\"Loading\\\",\\\"animate-spin\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,9],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"resume-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"play-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Play\\\"]]]],[1,\\\"\\\\n        \\\"]],[]]]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,10],[[30,1]],null]],null]],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,11],[[30,1]],[[\\\"increment\\\"],[5000]]]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"skip-forward-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Skip Forward\\\"]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,0],[24,0,\\\"stereo-player-position h-2 rounded-md bg-on-surface-3 inset-1\\\"],[4,[38,12],[[30,1]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,13],[[30,1]],null],[[[1,\\\"        \\\"],[11,0],[24,0,\\\"h-2 rounded-md bg-accent-1 inset-1\\\"],[24,\\\"data-test-element\\\",\\\"progress\\\"],[4,[38,14],[[30,1]],null],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[15,0,[29,[[52,[28,[37,7],[[30,1]],null],\\\"from-accent-0 to-accent-2 bg-gradient-to-r animate-gradient-x animated\\\",\\\"bg-on-surface-3\\\"],\\\"\\\\n            w-full h-2 rounded-md inset-1 shadow-inset\\\"]]],[12],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,0],[14,0,\\\"stereo-player-volume\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,15],[[24,1,\\\"stereo-volume\\\"],[24,0,\\\"flex-auto flex-shrink w-16 lg:w-1/6\\\"],[4,[38,16],null,null]],[[\\\"@type\\\"],[\\\"range\\\"]],null],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"stereo-volume\\\"],[14,0,\\\"stereo-volume\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,17],null,null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,18],[[28,[37,16],null,null],0],null],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"volume-low-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[20,30]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"volume-mute-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[20,30]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,19],[[30,1]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"stereo-player-errors\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,20],[[30,1]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"]],[\\\"@identifier\\\"],false,[\\\"not\\\",\\\"sound-is-rewindable\\\",\\\"on\\\",\\\"rewind-sound\\\",\\\"svg-jar\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"sound-is-loading\\\",\\\"sound-is-loaded\\\",\\\"sound-is-fastforwardable\\\",\\\"fastforward-sound\\\",\\\"sound-position-slider\\\",\\\"sound-is-seekable\\\",\\\"sound-position-progress\\\",\\\"input\\\",\\\"stereo-volume\\\",\\\"toggle-stereo-mute\\\",\\\"gt\\\",\\\"sound-is-errored\\\",\\\"sound-error-details\\\"]]\",\n    \"moduleName\": \"docs/components/docs/stereo-player-modifiers.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/stereo-player\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! BEGIN-SNIPPET stereo-player.hbs }}\n  <div class='stereo-player'>\n    <div class='stereo-player-main'>\n      <div class='stereo-player-controls'>\n        <button\n          {{on 'click' (rewind-sound @identifier increment=5000)}}\n          disabled={{not (sound-is-rewindable @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{svg-jar\n            'skip-backward-outline'\n            height=20\n            width=30\n            title='Skip Backward'\n          }}\n        </button>\n  \n        <button\n          {{on 'click' (toggle-play-sound @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{#if (sound-is-playing @identifier)}}\n            {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}\n          {{else if (sound-is-loading @identifier)}}\n            {{svg-jar\n              'loading-outline'\n              height=20\n              width=30\n              title='Loading'\n              class='animate-spin'\n            }}\n          {{else}}\n            {{svg-jar 'play-outline' height=20 width=30 title='Play'}}\n          {{/if}}\n        </button>\n  \n        <button\n          {{on 'click' (fastforward-sound @identifier increment=5000)}}\n          disabled={{not (sound-is-fastforwardable @identifier)}}\n          type='button'\n          class='stereo-button'\n        >\n          {{svg-jar\n            'skip-forward-outline'\n            height=20\n            width=30\n            title='Skip Forward'\n          }}\n        </button>\n      </div>\n  \n      <div class='stereo-player-position'>\n        {{sound-position @identifier format='time'}}\n        {{#if (sound-is-seekable @identifier)}}\n          {{! template-lint-disable require-input-label }}\n          <input\n            type='range'\n            class='flex-auto flex-shrink w-16 lg:w-1/6'\n            {{sound-position-slider @identifier}}\n          />\n        {{else}}\n          <div\n            class='{{if\n                (sound-is-playing @identifier)\n                \"from-accent-0 to-accent-2 bg-gradient-to-r animate-gradient-x animated\"\n                \"bg-on-surface-3\"\n              }}\n              w-full h-2 rounded-md inset-1 shadow-inset'\n          >\n          </div>\n        {{/if}}\n        {{sound-duration @identifier format='time'}}\n      </div>\n  \n      {{! BEGIN-SNIPPET stereo-volume-control.hbs }}\n      <div class='stereo-player-volume'>\n        <Input\n          {{stereo-volume}}\n          id='stereo-volume'\n          @type='range'\n          class='flex-auto flex-shrink w-16 lg:w-1/6'\n        />\n        <label for='stereo-volume' class='stereo-volume'>\n          <button type='button' {{on 'click' (toggle-stereo-mute)}}>\n            {{#if (gt (stereo-volume) 0)}}\n              {{svg-jar 'volume-low-outline' height=20 width=30}}\n            {{else}}\n              {{svg-jar 'volume-mute-outline' height=20 width=30}}\n            {{/if}}\n          </button>\n        </label>\n      </div>\n      {{! END-SNIPPET }}\n    </div>\n  \n    {{#if (sound-is-errored @identifier)}}\n      <div class='stereo-player-errors'>\n        {{sound-error-details @identifier}}\n      </div>\n    {{/if}}\n  </div>\n  \n  {{! END-SNIPPET }}\n  */\n  {\n    \"id\": \"p45VHL/B\",\n    \"block\": \"[[[10,0],[14,0,\\\"stereo-player\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"stereo-player-main\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-controls\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,1],[[30,1]],null]],null]],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[30,1]],[[\\\"increment\\\"],[5000]]]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"skip-backward-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Skip Backward\\\"]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,5],[[30,1]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[30,1]],null],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"loading-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\",\\\"class\\\"],[20,30,\\\"Loading\\\",\\\"animate-spin\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,4],[\\\"play-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Play\\\"]]]],[1,\\\"\\\\n        \\\"]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,9],[[30,1]],null]],null]],[24,0,\\\"stereo-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,10],[[30,1]],[[\\\"increment\\\"],[5000]]]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"skip-forward-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Skip Forward\\\"]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"stereo-player-position\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,11],[[30,1]],[[\\\"format\\\"],[\\\"time\\\"]]]],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[30,1]],null],[[[1,\\\"        \\\"],[11,\\\"input\\\"],[24,0,\\\"flex-auto flex-shrink w-16 lg:w-1/6\\\"],[24,4,\\\"range\\\"],[4,[38,13],[[30,1]],null],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[15,0,[29,[[52,[28,[37,7],[[30,1]],null],\\\"from-accent-0 to-accent-2 bg-gradient-to-r animate-gradient-x animated\\\",\\\"bg-on-surface-3\\\"],\\\"\\\\n            w-full h-2 rounded-md inset-1 shadow-inset\\\"]]],[12],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"],[1,[28,[35,14],[[30,1]],[[\\\"format\\\"],[\\\"time\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,0],[14,0,\\\"stereo-player-volume\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[39,15],[[24,1,\\\"stereo-volume\\\"],[24,0,\\\"flex-auto flex-shrink w-16 lg:w-1/6\\\"],[4,[38,16],null,null]],[[\\\"@type\\\"],[\\\"range\\\"]],null],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"stereo-volume\\\"],[14,0,\\\"stereo-volume\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,17],null,null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,18],[[28,[37,16],null,null],0],null],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"volume-low-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[20,30]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"volume-mute-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[20,30]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,19],[[30,1]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"stereo-player-errors\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,20],[[30,1]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"]],[\\\"@identifier\\\"],false,[\\\"not\\\",\\\"sound-is-rewindable\\\",\\\"on\\\",\\\"rewind-sound\\\",\\\"svg-jar\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"sound-is-loading\\\",\\\"sound-is-fastforwardable\\\",\\\"fastforward-sound\\\",\\\"sound-position\\\",\\\"sound-is-seekable\\\",\\\"sound-position-slider\\\",\\\"sound-duration\\\",\\\"input\\\",\\\"stereo-volume\\\",\\\"toggle-stereo-mute\\\",\\\"gt\\\",\\\"sound-is-errored\\\",\\\"sound-error-details\\\"]]\",\n    \"moduleName\": \"docs/components/docs/stereo-player.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/stereo-simple-example\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='stereo-simple.hbs' class='demo-sound-display'>\n      {{#let 'https://streaming.koop.org/stream.mp3' as |url|}}\n        <button type='button' {{on 'click' (toggle-play-sound url)}}>\n          {{#if (sound-is-playing url)}}\n            {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}\n          {{else if (sound-is-loaded url)}}\n            {{svg-jar 'resume-outline' height=20 width=30 title='Pause'}}\n          {{else if (sound-is-loading url)}}\n            {{svg-jar\n              'loading-outline'\n              height=20\n              width=30\n              title='Loading'\n              class='animate-spin'\n            }}\n          {{else}}\n            {{svg-jar 'play-outline' height=20 width=30 title='Play'}}\n          {{/if}}\n        </button>\n      {{/let}}\n    </demo.example>\n    <demo.snippet @name='stereo-simple.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"EdcxC3a9\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],[[24,0,\\\"demo-sound-display\\\"]],[[\\\"@name\\\"],[\\\"stereo-simple.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[44,[\\\"https://streaming.koop.org/stream.mp3\\\"],[[[1,\\\"      \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[30,2]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,5],[[30,2]],null],[[[1,\\\"          \\\"],[1,[28,[35,6],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[30,2]],null],[[[1,\\\"          \\\"],[1,[28,[35,6],[\\\"resume-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[30,2]],null],[[[1,\\\"          \\\"],[1,[28,[35,6],[\\\"loading-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\",\\\"class\\\"],[20,30,\\\"Loading\\\",\\\"animate-spin\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[28,[35,6],[\\\"play-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Play\\\"]]]],[1,\\\"\\\\n        \\\"]],[]]]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"]],[2]]],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"stereo-simple.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\",\\\"url\\\"],false,[\\\"docs-demo\\\",\\\"let\\\",\\\"on\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"svg-jar\\\",\\\"sound-is-loaded\\\",\\\"sound-is-loading\\\"]]\",\n    \"moduleName\": \"docs/components/docs/stereo-simple-example.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/strategy-breakdown\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <StrategyBreakdown class='grid' @url={{@identifier}} as |data|>\n    <li\n      class='inline\n        {{if (eq data.info.status \"failure\") \"text-danger\"}}\n        {{if (eq data.info.status \"success\") \"text-success\"}}'\n    >\n      <span class='text-sm'>\n        {{svg-jar (concat 'connection-' data.info.status) class='inline w-4 h-4'}}\n        {{data.item.name}}\n        Connection\n      </span>\n      <span class='text-sm opacity-70'>{{data.info.message}}</span>\n    </li>\n  </StrategyBreakdown>\n  */\n  {\n    \"id\": \"krGSF1bu\",\n    \"block\": \"[[[8,[39,0],[[24,0,\\\"grid\\\"]],[[\\\"@url\\\"],[[30,1]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"inline\\\\n      \\\",[52,[28,[37,2],[[30,2,[\\\"info\\\",\\\"status\\\"]],\\\"failure\\\"],null],\\\"text-danger\\\"],\\\"\\\\n      \\\",[52,[28,[37,2],[[30,2,[\\\"info\\\",\\\"status\\\"]],\\\"success\\\"],null],\\\"text-success\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"text-sm\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,3],[[28,[37,4],[\\\"connection-\\\",[30,2,[\\\"info\\\",\\\"status\\\"]]],null]],[[\\\"class\\\"],[\\\"inline w-4 h-4\\\"]]]],[1,\\\"\\\\n      \\\"],[1,[30,2,[\\\"item\\\",\\\"name\\\"]]],[1,\\\"\\\\n      Connection\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"text-sm opacity-70\\\"],[12],[1,[30,2,[\\\"info\\\",\\\"message\\\"]]],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"@identifier\\\",\\\"data\\\"],false,[\\\"strategy-breakdown\\\",\\\"if\\\",\\\"eq\\\",\\\"svg-jar\\\",\\\"concat\\\"]]\",\n    \"moduleName\": \"docs/components/docs/strategy-breakdown.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/template-errors-example\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='template-errors-example.hbs'>\n      <p>Errors are not thrown when using template helpers</p>\n      {{#let '/sounds/unplayable-scooby.au' as |url|}}\n        <button type='button' {{on 'click' (play-sound url)}} class='ui-button'>\n          {{#if (sound-is-playing url)}}\n            Pause\n          {{else}}\n            Play\n          {{/if}}\n        </button>\n        {{#if (sound-is-errored url)}}\n  \n          <div class='px-1 py-2 text-sm text-danger'>Errors:\n            {{sound-error-details url}}</div>\n        {{/if}}\n      {{/let}}\n    </demo.example>\n    <demo.snippet @name='template-errors-example.hbs' />\n  </DocsDemo>\n  */\n  {\n    \"id\": \"93bpuH+p\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"template-errors-example.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Errors are not thrown when using template helpers\\\"],[13],[1,\\\"\\\\n\\\"],[44,[\\\"/sounds/unplayable-scooby.au\\\"],[[[1,\\\"      \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[30,2]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,5],[[30,2]],null],[[[1,\\\"          Pause\\\\n\\\"]],[]],[[[1,\\\"          Play\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,6],[[30,2]],null],[[[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"px-1 py-2 text-sm text-danger\\\"],[12],[1,\\\"Errors:\\\\n          \\\"],[1,[28,[35,7],[[30,2]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[2]]],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\"],[\\\"template-errors-example.hbs\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"demo\\\",\\\"url\\\"],false,[\\\"docs-demo\\\",\\\"let\\\",\\\"on\\\",\\\"play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"sound-is-errored\\\",\\\"sound-error-details\\\"]]\",\n    \"moduleName\": \"docs/components/docs/template-errors-example.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/docs/theme-toggle\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <button\n    type='button'\n    class='theme-toggle'\n    title='{{if this.theme.isDark \"Switch to light mode\" \"Switch to dark mode\"}}'\n    aria-label='{{if this.theme.isDark \"Switch to light mode\" \"Switch to dark mode\"}}'\n    {{on 'click' this.toggle}}\n  >\n    {{#if this.theme.isDark}}\n      {{svg-jar 'sun-outline' height=18 width=18}}\n    {{else}}\n      {{svg-jar 'moon-outline' height=18 width=18}}\n    {{/if}}\n  </button>\n  \n  */\n  {\n    \"id\": \"jhAD6uNJ\",\n    \"block\": \"[[[11,\\\"button\\\"],[24,0,\\\"theme-toggle\\\"],[16,\\\"title\\\",[29,[[52,[30,0,[\\\"theme\\\",\\\"isDark\\\"]],\\\"Switch to light mode\\\",\\\"Switch to dark mode\\\"]]]],[16,\\\"aria-label\\\",[29,[[52,[30,0,[\\\"theme\\\",\\\"isDark\\\"]],\\\"Switch to light mode\\\",\\\"Switch to dark mode\\\"]]]],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[30,0,[\\\"toggle\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"theme\\\",\\\"isDark\\\"]],[[[1,\\\"    \\\"],[1,[28,[35,2],[\\\"sun-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[18,18]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,2],[\\\"moon-outline\\\"],[[\\\"height\\\",\\\"width\\\"],[18,18]]]],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"if\\\",\\\"on\\\",\\\"svg-jar\\\"]]\",\n    \"moduleName\": \"docs/components/docs/theme-toggle.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsThemeToggleComponent = _exports.default = (_class = class DocsThemeToggleComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"theme\", _descriptor, this);\n    }\n    toggle() {\n      this.theme.toggle();\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"theme\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"toggle\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"toggle\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsThemeToggleComponent);\n});","define(\"docs/components/docs/try-multiple-urls\", [\"exports\", \"@ember/component\", \"ember-concurrency/async-arrow-runtime\", \"@glimmer/component\", \"@ember/service\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _asyncArrowRuntime, _component2, _service, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/async-arrow-runtime\",0,\"@glimmer/component\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"ember-concurrency\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsDemo as |demo|>\n    <demo.example @name='try-multiple-urls.hbs'>\n      {{#let\n        (array\n          'https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg'\n          'https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3'\n        )\n        as |urls|\n      }}\n        <div>\n          <button\n            {{on 'click' (toggle-play-sound urls position=8000)}}\n            {{! i'm starting this at 8 seconds in because that's where the music starts }}\n            type='button'\n            class='ui-button'\n          >\n            {{#if (sound-is-playing urls)}}\n              Pause\n            {{else if (sound-is-loading urls)}}\n              Loading…\n            {{else}}\n              Play Sound\n            {{/if}}\n          </button>\n  \n          {{#if (sound-is-errored urls)}}\n            <div class='px-1 py-2 text-sm text-danger'>{{sound-error-details\n                urls\n              }}</div>\n          {{/if}}\n  \n          <div class='mt-2 text-sm'>\n            {{#let (find-sound urls) as |sound|}}\n              {{#if sound}}\n                This was successfully loaded using the\n                <em>{{sound.connectionName}}</em>\n                connection. The\n                <em>{{sound.mimeType}}</em>\n                format was the one that ended up working in\n                <Docs::CurrentBrowser />. Try this in\n                <Docs::OtherBrowser />\n                to compare.\n              {{/if}}\n            {{/let}}\n          </div>\n  \n        </div>\n      {{/let}}\n    </demo.example>\n    <demo.snippet\n      @name='try-multiple-urls.hbs'\n      @label='using just template helpers'\n    />\n    <demo.snippet\n      @name='try-multiple-urls-via-service.js'\n      @label=\"if you're a service type guy\"\n    />\n  </DocsDemo>\n  {{!--\n  <DocsDemo as |demo|>\n    <demo.example @name='try-multiple-urls-via-service.hbs'>\n      <p>Trying multiple urls with the service</p>\n      <div>\n        <button\n          {{on 'click' (perform this.playTask)}}\n          type='button'\n          class='ui-button'\n        >\n          {{#if this.sound.isPlaying}}\n            Pause\n          {{else if this.playTask.isRunning}}\n            Loading…\n          {{else}}\n            Play Sound\n          {{/if}}\n        </button>\n      </div>\n  \n      {{#if this.error}}\n        <div class='px-1 py-2 text-sm text-danger'>{{this.error}}</div>\n      {{/if}}\n    </demo.example>\n    <demo.snippet @name='try-multiple-urls-via-service.js'></demo.snippet>\n    <demo.snippet @name='try-multiple-urls-via-service.hbs'></demo.snippet>\n  </DocsDemo> --}}\n  */\n  {\n    \"id\": \"6NW2d+kh\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"example\\\"]],null,[[\\\"@name\\\"],[\\\"try-multiple-urls.hbs\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[44,[[28,[37,2],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\\\",\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\\\"],null]],[[[1,\\\"      \\\"],[10,0],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button\\\"],[24,4,\\\"button\\\"],[4,[38,3],[\\\"click\\\",[28,[37,4],[[30,2]],[[\\\"position\\\"],[8000]]]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,6],[[30,2]],null],[[[1,\\\"            Pause\\\\n\\\"]],[]],[[[41,[28,[37,7],[[30,2]],null],[[[1,\\\"            Loading…\\\\n\\\"]],[]],[[[1,\\\"            Play Sound\\\\n          \\\"]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,8],[[30,2]],null],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"px-1 py-2 text-sm text-danger\\\"],[12],[1,[28,[35,9],[[30,2]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mt-2 text-sm\\\"],[12],[1,\\\"\\\\n\\\"],[44,[[28,[37,10],[[30,2]],null]],[[[41,[30,3],[[[1,\\\"              This was successfully loaded using the\\\\n              \\\"],[10,\\\"em\\\"],[12],[1,[30,3,[\\\"connectionName\\\"]]],[13],[1,\\\"\\\\n              connection. The\\\\n              \\\"],[10,\\\"em\\\"],[12],[1,[30,3,[\\\"mimeType\\\"]]],[13],[1,\\\"\\\\n              format was the one that ended up working in\\\\n              \\\"],[8,[39,11],null,null,null],[1,\\\". Try this in\\\\n              \\\"],[8,[39,12],null,null,null],[1,\\\"\\\\n              to compare.\\\\n\\\"]],[]],null]],[3]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[2]]],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\",\\\"@label\\\"],[\\\"try-multiple-urls.hbs\\\",\\\"using just template helpers\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"snippet\\\"]],null,[[\\\"@name\\\",\\\"@label\\\"],[\\\"try-multiple-urls-via-service.js\\\",\\\"if you're a service type guy\\\"]],null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"]],[\\\"demo\\\",\\\"urls\\\",\\\"sound\\\"],false,[\\\"docs-demo\\\",\\\"let\\\",\\\"array\\\",\\\"on\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-playing\\\",\\\"sound-is-loading\\\",\\\"sound-is-errored\\\",\\\"sound-error-details\\\",\\\"find-sound\\\",\\\"docs/current-browser\\\",\\\"docs/other-browser\\\"]]\",\n    \"moduleName\": \"docs/components/docs/try-multiple-urls.hbs\",\n    \"isStrictMode\": false\n  });\n  let DocsTryMultipleUrlsComponent = _exports.default = (_class = class DocsTryMultipleUrlsComponent extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      // BEGIN-SNIPPET try-multiple-urls-via-service.js\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"sound\", _descriptor2, this);\n      _defineProperty(this, \"playTask\", (0, _asyncArrowRuntime.buildTask)(() => ({\n        context: this,\n        generator: function* () {\n          this.error = false;\n          if (this.sound) {\n            yield this.sound.togglePause();\n          } else {\n            try {\n              let {\n                sound /* error, failures */\n              } = yield this.stereo.playTask.perform(['https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg', 'https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3']);\n              this.sound = sound;\n            } catch (e) {\n              this.error = e.message;\n            }\n          }\n        }\n      }), null, \"playTask\", null));\n    } // END-SNIPPET try-multiple-urls-via-service.js\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, DocsTryMultipleUrlsComponent);\n});","define(\"docs/components/ember-modal-dialog-positioned-container\", [\"exports\", \"ember-modal-dialog/components/positioned-container\"], function (_exports, _positionedContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _positionedContainer.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/positioned-container\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-modal-dialog/-basic-dialog\", [\"exports\", \"ember-modal-dialog/components/basic-dialog\"], function (_exports, _basicDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _basicDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/basic-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-modal-dialog/-in-place-dialog\", [\"exports\", \"ember-modal-dialog/components/in-place-dialog\"], function (_exports, _inPlaceDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _inPlaceDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/in-place-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-modal-dialog/-liquid-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-dialog\"], function (_exports, _liquidDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _liquidDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/liquid-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-modal-dialog/-liquid-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-tether-dialog\"], function (_exports, _liquidTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _liquidTetherDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/liquid-tether-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-modal-dialog/-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/tether-dialog\"], function (_exports, _tetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _tetherDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/tether-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-modal-dialog/overlay\", [\"exports\", \"ember-modal-dialog/components/overlay\"], function (_exports, _overlay) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _overlay.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/overlay\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-tether\", [\"exports\", \"ember-tether/components/ember-tether\"], function (_exports, _emberTether) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberTether.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-tether/components/ember-tether\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/ember-wormhole\", [\"exports\", \"ember-wormhole/components/ember-wormhole\"], function (_exports, _emberWormhole) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberWormhole.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-wormhole/components/ember-wormhole\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/event-display\", [\"exports\", \"@ember/component\", \"ember-concurrency/async-arrow-runtime\", \"@glimmer/component\", \"ember-stereo/services/stereo\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/service\", \"@ember/array\", \"ember-concurrency\", \"@ember/template-factory\"], function (_exports, _component, _asyncArrowRuntime, _component2, _stereo, _tracking, _object, _service, _array, _emberConcurrency, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4;\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/async-arrow-runtime\",0,\"@glimmer/component\",0,\"ember-stereo/services/stereo\",0,\"@glimmer/tracking\",0,\"@ember/object\",0,\"@ember/service\",0,\"@ember/array\",0,\"@ember/object\",0,\"ember-concurrency\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div ...attributes>\n    {{#each this.eventListGroupings as |e|}}\n      <SoundProperties::Prop\n        @title={{e.name}}\n        @data={{if (gt e.count 1) e.count false}}\n        {{on 'click' (fn this.displayEvent e)}}\n        data-event-type={{e.type}}\n        class='cursor-pointer hover:shadow-md hover:bg-accent-0-hover'\n      />\n    {{/each}}\n  </div>\n  */\n  {\n    \"id\": \"gn8QVAXl\",\n    \"block\": \"[[[11,0],[17,1],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,0,[\\\"eventListGroupings\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[8,[39,2],[[16,\\\"data-event-type\\\",[30,2,[\\\"type\\\"]]],[24,0,\\\"cursor-pointer hover:shadow-md hover:bg-accent-0-hover\\\"],[4,[38,5],[\\\"click\\\",[28,[37,6],[[30,0,[\\\"displayEvent\\\"]],[30,2]],null]],null]],[[\\\"@title\\\",\\\"@data\\\"],[[30,2,[\\\"name\\\"]],[52,[28,[37,4],[[30,2,[\\\"count\\\"]],1],null],[30,2,[\\\"count\\\"]],false]]],null],[1,\\\"\\\\n\\\"]],[2]],null],[13]],[\\\"&attrs\\\",\\\"e\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"sound-properties/prop\\\",\\\"if\\\",\\\"gt\\\",\\\"on\\\",\\\"fn\\\"]]\",\n    \"moduleName\": \"docs/components/event-display.hbs\",\n    \"isStrictMode\": false\n  });\n  let EventDisplay = _exports.default = (_class = class EventDisplay extends _component2.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"eventsList\", _descriptor, this);\n      _initializerDefineProperty(this, \"sound\", _descriptor2, this);\n      _initializerDefineProperty(this, \"service\", _descriptor3, this);\n      _initializerDefineProperty(this, \"stereo\", _descriptor4, this);\n      _defineProperty(this, \"loadSoundFromUrlTask\", (0, _asyncArrowRuntime.buildTask)(() => ({\n        context: this,\n        generator: function* () {\n          if (this.args.url) {\n            this.sound = this.stereo.findSound(this.args.url);\n            this.addSoundEvents(this.sound);\n          } else {\n            this.service = this.stereo;\n            this.addServiceEvents(this.stereo);\n          }\n        }\n      }), {\n        debug: true\n      }, \"loadSoundFromUrlTask\", null));\n      this.loadSoundFromUrlTask.perform().catch(e => {\n        if (!(0, _emberConcurrency.didCancel)(e)) {\n          throw e;\n        }\n      });\n    }\n    get eventListGroupings() {\n      let groupedEvents = [];\n      this.eventsList.forEach(e => {\n        let lastItem = groupedEvents.pop();\n        if (lastItem && lastItem.name == e.name) {\n          (0, _object.set)(lastItem, 'count', lastItem.count + 1); // eslint-disable-line\n          groupedEvents.push(lastItem);\n        } else {\n          if (lastItem) {\n            groupedEvents.push(lastItem);\n          }\n          (0, _object.set)(e, 'count', 1); // eslint-disable-line\n          groupedEvents.push(e);\n        }\n      });\n      return groupedEvents.reverse().slice(0, 15);\n    }\n    willDestroy() {\n      super.willDestroy(...arguments);\n      if (this.service) {\n        this.removeEvents(this.service);\n      }\n      if (this.sound) {\n        this.removeEvents(this.sound);\n      }\n    }\n    addSoundEvents(item) {\n      if (!item) {\n        return;\n      }\n      _stereo.EVENT_MAP.forEach(e => {\n        item.on(e.event, data => {\n          this.eventsList.pushObject({\n            name: e.event,\n            data: data,\n            type: 'sound'\n          });\n        });\n      });\n    }\n    addServiceEvents(service) {\n      if (!service) {\n        return;\n      }\n      this.addSoundEvents(service);\n      _stereo.SERVICE_EVENT_MAP.forEach(e => {\n        service.on(e.event, data => {\n          this.eventsList.pushObject({\n            name: e.event,\n            data: data,\n            type: 'service'\n          });\n        });\n      });\n    }\n    removeEvents(/* item */) {}\n    async displayEvent(e) {\n      console.log(`$E = name: ${e.name}`); //eslint-disable-line\n      console.log(e.data); //eslint-disable-line\n      window.$E = e.data;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"eventsList\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return (0, _array.A)([]);\n    }\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"service\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"displayEvent\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"displayEvent\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, EventDisplay);\n});","define(\"docs/components/format-json\", [\"exports\", \"ember-format-json/components/format-json\"], function (_exports, _formatJson) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _formatJson.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-format-json/components/format-json\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/modal-dialog\", [\"exports\", \"ember-modal-dialog/components/modal-dialog\"], function (_exports, _modalDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _modalDialog.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/components/modal-dialog\"eaimeta@70e063a35619d71f\n});","define(\"docs/components/play-button\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _component2, _object, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/object\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <button\n    class='play-sound-button'\n    type='button'\n    {{on 'click' (toggle-play-sound @identifier metadata=@metadata)}}\n  >\n    <div class='play-sound-button-bg'></div>\n    {{#if (sound-is-errored @identifier)}}\n      {{svg-jar 'bomb-outline' class='stereo-icon' height='48' width='48'}}\n    {{else if (sound-is-playing @identifier)}}\n      {{svg-jar 'pause-outline' class='stereo-icon' height='48' width='48'}}\n      {{!-- {{else if (sound-is-playing-elsewhere @url)}}\n          {{svg-jar \"pause-outline\" class=\"stereo-icon\" height=\"48\" width=\"48\"}}\n   --}}\n    {{else if (sound-is-loading @identifier)}}\n      {{svg-jar\n        'loading-outline'\n        class='stereo-icon animate-spin'\n        height='48'\n        width='48'\n      }}\n    {{else}}\n      {{svg-jar 'play-outline' class='stereo-icon' height='48' width='48'}}\n    {{/if}}\n  </button>\n  */\n  {\n    \"id\": \"4GI1dPqy\",\n    \"block\": \"[[[11,\\\"button\\\"],[24,0,\\\"play-sound-button\\\"],[24,4,\\\"button\\\"],[4,[38,0],[\\\"click\\\",[28,[37,1],[[30,1]],[[\\\"metadata\\\"],[[30,2]]]]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"play-sound-button-bg\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[30,1]],null],[[[1,\\\"    \\\"],[1,[28,[35,4],[\\\"bomb-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,5],[[30,1]],null],[[[1,\\\"    \\\"],[1,[28,[35,4],[\\\"pause-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,6],[[30,1]],null],[[[1,\\\"    \\\"],[1,[28,[35,4],[\\\"loading-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon animate-spin\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,4],[\\\"play-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n  \\\"]],[]]]],[]]]],[]]],[13]],[\\\"@identifier\\\",\\\"@metadata\\\"],false,[\\\"on\\\",\\\"toggle-play-sound\\\",\\\"if\\\",\\\"sound-is-errored\\\",\\\"svg-jar\\\",\\\"sound-is-playing\\\",\\\"sound-is-loading\\\"]]\",\n    \"moduleName\": \"docs/components/play-button.hbs\",\n    \"isStrictMode\": false\n  });\n  let PlayButtonComponent = _exports.default = (_class = class PlayButtonComponent extends _component2.default {\n    draw(data, canvas /*, options, frame */) {\n      let h = canvas.height;\n      let w = canvas.width;\n      let ctx = canvas.getContext('2d');\n      ctx.clearRect(0, 0, w, h);\n      let percent = h / 255;\n      let increase = w / 128;\n      let point_count = 128;\n      let min = 5;\n      // let breakpoint = Math.floor(point_count / options.colors.length);\n\n      let drawLineSegment = (ctx, x, start, stop, color) => {\n        ctx.moveTo(x, start);\n        ctx.strokeStyle = color;\n        ctx.lineTo(x, stop);\n        ctx.stroke();\n        ctx.beginPath();\n      };\n      let drawLine = (ctx, x, start, stop, height) => {\n        var limit = height * 0.9;\n        if (stop >= limit) {\n          drawLineSegment(ctx, x, start, limit, 'red');\n          start = limit;\n        }\n        limit = height * 0.1;\n        if (stop >= limit) {\n          drawLineSegment(ctx, x, start, limit, 'aqua');\n          start = limit;\n        }\n        limit = 0;\n        if (stop >= limit) {\n          drawLineSegment(ctx, x, start, limit, 'red');\n          start = limit;\n        }\n      };\n      for (let point = 1; point <= point_count; point++) {\n        let p = data[point]; //get value\n        p += min;\n        p *= percent;\n        let x = increase * point;\n        let top = h / 2 + p / 2;\n        let bottom = top - p;\n        drawLine(ctx, x, top, bottom, h);\n\n        // ctx.moveTo(x, top);\n        // ctx.strokeStyle ='red';\n        // ctx.lineTo(x, top - (p / 2));\n        // ctx.stroke();\n        // ctx.beginPath();\n        // ctx.moveTo(x, top - (p / 2));\n        // ctx.strokeStyle='aqua';\n        // ctx.lineTo(x, top - p);\n        // ctx.stroke();\n        // ctx.beginPath();\n\n        // if ((mid - p) >  20) {\n        // ctx.strokeStyle='aqua';\n        // ctx.lineTo(x, top - p);\n        // ctx.stroke();\n        // }\n        // else {\n        //   ctx.strokeStyle='aqua';\n        //   ctx.lineTo(x, mid - p - 20);\n        //   ctx.stroke();\n        //   ctx.strokeStyle='red';\n        //   ctx.lineTo(mid - p - 20, mid - p);\n        //   ctx.stroke();\n        // }\n\n        // ctx.beginPath();\n      }\n    }\n    resizeCanvas(canvas, scale) {\n      if (!scale) {\n        scale = 1.75;\n      }\n      let parentElement = canvas.parentElement;\n      let dims = parentElement.getBoundingClientRect();\n      canvas.height = dims.height * scale;\n      canvas.width = dims.width * scale;\n    }\n  }, _applyDecoratedDescriptor(_class.prototype, \"draw\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"draw\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"resizeCanvas\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"resizeCanvas\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, PlayButtonComponent);\n});","define(\"docs/components/service-display\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <ComponentLabel @title='Stereo Service' />\n  \n  {{#let (current-sound) as |currentSound|}}\n    <div\n      class='flex flex-col p-2 mb-12 border rounded-md text-on-surface-0 bg-surface-2 border-surface-0'\n      ...attributes\n    >\n      <div class='md:flex'>\n        <div\n          class='flex flex-col justify-end flex-grow h-40 p-2 text-center align-middle border rounded-md shadow-inner md:h-auto bg-surface-1 border-surface-3'\n        >\n          <div class='flex flex-col justify-around gap-2 mb-4'>\n            <p class='font-lg'>\n              {{sound-metadata currentSound key='title'}}\n            </p>\n            <p class='text-xs break-all text-on-surface'>\n              {{get currentSound 'url'}}\n            </p>\n          </div>\n          <SoundDisplay::Position @url={{currentSound}} @class='flex flex-col' />\n        </div>\n  \n        <div class='flex flex-col p-2'>\n          <SoundDisplay::Controls @url={{currentSound}} />\n  \n          <div class='service-display-volume'>\n            <SoundDisplay::Volume />\n            {{! template-lint-disable require-input-label }}\n            <Input class='bg-surface-1' @type='range' {{stereo-volume}} />\n          </div>\n  \n        </div>\n      </div>\n  \n      <DebugDetails @show={{this.showDebugInfo}} class='mt-4' as |d|>\n        <d.Section @title='Events'>\n          <:content>\n            <EventDisplay />\n          </:content>\n        </d.Section>\n  \n      </DebugDetails>\n      <button\n        type='button'\n        class='flex items-center justify-center w-full p-2 text-center text-accent-0 hover:text-accent-0-hover'\n        {{on 'click' (toggle 'showDebugInfo' this)}}\n      >\n        {{#if this.showDebugInfo}}\n          <span class='sr-only'>Hide Debug</span>\n          {{svg-jar 'angle-up' class='w-4 h-4'}}\n        {{else}}\n          <span class='sr-only'>Show Debug</span>\n          {{svg-jar 'angle-down' class='w-4 h-4'}}\n        {{/if}}\n      </button>\n  \n    </div>\n  {{/let}}\n  */\n  {\n    \"id\": \"WpZDe09M\",\n    \"block\": \"[[[8,[39,0],null,[[\\\"@title\\\"],[\\\"Stereo Service\\\"]],null],[1,\\\"\\\\n\\\\n\\\"],[44,[[28,[37,2],null,null]],[[[1,\\\"  \\\"],[11,0],[24,0,\\\"flex flex-col p-2 mb-12 border rounded-md text-on-surface-0 bg-surface-2 border-surface-0\\\"],[17,2],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"md:flex\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"flex flex-col justify-end flex-grow h-40 p-2 text-center align-middle border rounded-md shadow-inner md:h-auto bg-surface-1 border-surface-3\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"flex flex-col justify-around gap-2 mb-4\\\"],[12],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"font-lg\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[[30,1]],[[\\\"key\\\"],[\\\"title\\\"]]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,2],[14,0,\\\"text-xs break-all text-on-surface\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[[30,1],\\\"url\\\"],null]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[8,[39,5],null,[[\\\"@url\\\",\\\"@class\\\"],[[30,1],\\\"flex flex-col\\\"]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"flex flex-col p-2\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,6],null,[[\\\"@url\\\"],[[30,1]]],null],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"service-display-volume\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[39,7],null,null,null],[1,\\\"\\\\n\\\"],[1,\\\"          \\\"],[8,[39,8],[[24,0,\\\"bg-surface-1\\\"],[4,[38,9],null,null]],[[\\\"@type\\\"],[\\\"range\\\"]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[8,[39,10],[[24,0,\\\"mt-4\\\"]],[[\\\"@show\\\"],[[30,0,[\\\"showDebugInfo\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,3,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[\\\"Events\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[39,11],null,null,null],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"]],[3]]]]],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"flex items-center justify-center w-full p-2 text-center text-accent-0 hover:text-accent-0-hover\\\"],[24,4,\\\"button\\\"],[4,[38,12],[\\\"click\\\",[28,[37,13],[\\\"showDebugInfo\\\",[30,0]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showDebugInfo\\\"]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"Hide Debug\\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,15],[\\\"angle-up\\\"],[[\\\"class\\\"],[\\\"w-4 h-4\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"Show Debug\\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,15],[\\\"angle-down\\\"],[[\\\"class\\\"],[\\\"w-4 h-4\\\"]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[1]]]],[\\\"currentSound\\\",\\\"&attrs\\\",\\\"d\\\"],false,[\\\"component-label\\\",\\\"let\\\",\\\"current-sound\\\",\\\"sound-metadata\\\",\\\"get\\\",\\\"sound-display/position\\\",\\\"sound-display/controls\\\",\\\"sound-display/volume\\\",\\\"input\\\",\\\"stereo-volume\\\",\\\"debug-details\\\",\\\"event-display\\\",\\\"on\\\",\\\"toggle\\\",\\\"if\\\",\\\"svg-jar\\\"]]\",\n    \"moduleName\": \"docs/components/service-display.hbs\",\n    \"isStrictMode\": false\n  });\n  let ServiceDisplay = _exports.default = (_class = class ServiceDisplay extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"showDebugInfo\", _descriptor2, this);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"showDebugInfo\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, ServiceDisplay);\n});","define(\"docs/components/sound-display\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div\n    class='p-2 border rounded-md text-on-surface-0 bg-surface-1 border-surface-3'\n    data-connection-name='{{this.loadedSound.connectionName}}'\n    ...attributes\n  >\n    <div class='flex justify-between mb-3'>\n      <span class='text-xs'>\n        {{#let this.loadedSound as |sound|}}\n          {{#if sound}}\n            {{#if sound.isLoading}}\n              <span class='opacity-50'>Loading…</span>\n            {{else if this.canSwitchConnections}}\n              <span class='relative inline-flex items-center group'>\n                <span\n                  class='border-b border-dotted border-on-surface-2 border-opacity-40 group-hover:border-opacity-100'\n                >{{or sound.connectionName '—'}} Sound</span>\n                {{svg-jar\n                  'angle-down'\n                  class='w-2 h-2 ml-1 opacity-40 text-on-surface-2 group-hover:opacity-100'\n                }}\n                <select\n                  class='absolute inset-0 w-full h-full p-0 m-0 bg-transparent border-0 opacity-0 appearance-none cursor-pointer focus:outline-none'\n                  aria-label='Switch connection'\n                  {{on 'change' this.switchConnection}}\n                >\n                  {{#unless sound.connectionKey}}\n                    <option value='' selected disabled>—</option>\n                  {{/unless}}\n                  {{#each this.connectionChoices as |strategy|}}\n                    <option\n                      value={{strategy.key}}\n                      selected={{eq strategy.key sound.connectionKey}}\n                    >{{strategy.connectionName}}</option>\n                  {{/each}}\n                </select>\n              </span>\n            {{else if sound.connectionName}}\n              {{sound.connectionName}}\n              Sound\n            {{/if}}\n            {{#unless sound.isLoading}}\n              {{#if sound.mimeType}}\n                ({{sound.mimeType}})\n              {{/if}}\n            {{/unless}}\n          {{else}}\n            Not Loaded\n          {{/if}}\n        {{/let}}\n      </span>\n      <button type='button' class='w-4 h-4' {{on 'click' this.removeSound}}>\n        {{svg-jar\n          'close'\n          class='w-4 h-4 text-on-surface-2 opacity-30 hover:opacity-100'\n        }}\n      </button>\n    </div>\n  \n    <span\n      class='{{unless this.isCurrentSound \"opacity-0\"}}\n        flex justify-center p-1 -ml-2 -mr-2 my-2 text-xs font-bold text-center text-on-surface-0 uppercase transform bg-accent-0'\n    >Current Sound</span>\n  \n    <div class='flex flex-col mb-4'>\n      <div class='text-center'>\n        {{or @title (sound-metadata this.url key='title')}}\n      </div>\n      <div class='text-sm text-center break-all opacity-50'>\n        {{this.url}}\n      </div>\n    </div>\n  \n    <SoundDisplay::Position @url={{this.url}} />\n    <SoundDisplay::Controls @url={{this.url}} />\n  \n    <DebugDetails @show={{this.showDebugInfo}} as |d|>\n      {{#let (find-sound this.url) as |sound|}}\n        <d.Section\n          @title={{if\n            this.usingSingleAudioElement\n            'Shared Audio Element'\n            'Audio Element'\n          }}\n        >\n          <:button>\n            <button\n              type='button'\n              class='text-xs underline uppercase'\n              {{on 'click' (fn this.inspectSound (find-sound this.url))}}\n            >\n              Inspect\n            </button>\n          </:button>\n          <:content>\n            <div\n              class='p-2 text-xs border rounded-md bg-surface-3\n                {{if\n                  this.hasControlOfAudioElement\n                  \"border-accent-1\"\n                  \"border-surface-0\"\n                }}'\n            >\n              {{sound.audioElement.outerHTML}}\n            </div>\n            {{#if this.usingSingleAudioElement}}\n              {{#if this.hasControlOfAudioElement}}\n                <p class='text-xs'>This sound has control of the element right now</p>\n              {{else}}\n                <p class='text-xs'>This sound is not in control of the element now</p>\n              {{/if}}\n  \n            {{/if}}\n          </:content>\n        </d.Section>\n      {{/let}}\n  \n      <d.Section @title='Connections'>\n        <:content>\n          <StrategyBreakdown\n            @url={{this.url}}\n            class='flex flex-col gap-1 justify-items-stretch'\n            as |data|\n          >\n            <li\n              class='inline\n                {{if (eq data.info.status \"failure\") \" text-danger \"}}\n                {{if (eq data.info.status \"success\") \" text-success \"}}\n                '\n            >\n              <span class='text-sm'>\n                {{svg-jar\n                  (concat 'connection-' data.info.status)\n                  class='inline w-4 h-4'\n                }}\n                {{data.item.name}}\n              </span>\n              <span class='text-sm opacity-70'>{{data.info.message}}</span>\n            </li>\n  \n          </StrategyBreakdown>\n        </:content>\n      </d.Section>\n  \n      <d.Section @title='Properties'>\n        <:content>\n          <SoundProperties @url={{this.url}} />\n        </:content>\n      </d.Section>\n  \n      <d.Section @title='Events'>\n        <:content>\n          <EventDisplay @url={{this.url}} />\n        </:content>\n      </d.Section>\n    </DebugDetails>\n  \n    <button\n      type='button'\n      class='flex items-center justify-center w-full p-1 text-center text-accent-0 hover:text-accent-0-hover'\n      {{on 'click' (toggle 'showDebugInfo' this)}}\n    >\n      {{#if this.showDebugInfo}}\n        <span class='sr-only'>Hide Debug</span>\n        {{svg-jar 'angle-up' class='w-4 h-4'}}\n      {{else}}\n        <span class='sr-only'></span>\n        {{svg-jar 'angle-down' class='w-4 h-4'}}\n      {{/if}}\n    </button>\n  \n    {{yield}}\n  \n  </div>\n  */\n  {\n    \"id\": \"4fYch43E\",\n    \"block\": \"[[[11,0],[24,0,\\\"p-2 border rounded-md text-on-surface-0 bg-surface-1 border-surface-3\\\"],[16,\\\"data-connection-name\\\",[29,[[30,0,[\\\"loadedSound\\\",\\\"connectionName\\\"]]]]],[17,1],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"flex justify-between mb-3\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"text-xs\\\"],[12],[1,\\\"\\\\n\\\"],[44,[[30,0,[\\\"loadedSound\\\"]]],[[[41,[30,2],[[[41,[30,2,[\\\"isLoading\\\"]],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"opacity-50\\\"],[12],[1,\\\"Loading…\\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,0,[\\\"canSwitchConnections\\\"]],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"relative inline-flex items-center group\\\"],[12],[1,\\\"\\\\n              \\\"],[10,1],[14,0,\\\"border-b border-dotted border-on-surface-2 border-opacity-40 group-hover:border-opacity-100\\\"],[12],[1,[28,[35,2],[[30,2,[\\\"connectionName\\\"]],\\\"—\\\"],null]],[1,\\\" Sound\\\"],[13],[1,\\\"\\\\n              \\\"],[1,[28,[35,3],[\\\"angle-down\\\"],[[\\\"class\\\"],[\\\"w-2 h-2 ml-1 opacity-40 text-on-surface-2 group-hover:opacity-100\\\"]]]],[1,\\\"\\\\n              \\\"],[11,\\\"select\\\"],[24,0,\\\"absolute inset-0 w-full h-full p-0 m-0 bg-transparent border-0 opacity-0 appearance-none cursor-pointer focus:outline-none\\\"],[24,\\\"aria-label\\\",\\\"Switch connection\\\"],[4,[38,4],[\\\"change\\\",[30,0,[\\\"switchConnection\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[41,[51,[30,2,[\\\"connectionKey\\\"]]],[[[1,\\\"                  \\\"],[10,\\\"option\\\"],[14,2,\\\"\\\"],[14,\\\"selected\\\",\\\"\\\"],[14,\\\"disabled\\\",\\\"\\\"],[12],[1,\\\"—\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[42,[28,[37,7],[[28,[37,7],[[30,0,[\\\"connectionChoices\\\"]]],null]],null],null,[[[1,\\\"                  \\\"],[10,\\\"option\\\"],[15,2,[30,3,[\\\"key\\\"]]],[15,\\\"selected\\\",[28,[37,8],[[30,3,[\\\"key\\\"]],[30,2,[\\\"connectionKey\\\"]]],null]],[12],[1,[30,3,[\\\"connectionName\\\"]]],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,2,[\\\"connectionName\\\"]],[[[1,\\\"            \\\"],[1,[30,2,[\\\"connectionName\\\"]]],[1,\\\"\\\\n            Sound\\\\n          \\\"]],[]],null]],[]]]],[]]],[41,[51,[30,2,[\\\"isLoading\\\"]]],[[[41,[30,2,[\\\"mimeType\\\"]],[[[1,\\\"              (\\\"],[1,[30,2,[\\\"mimeType\\\"]]],[1,\\\")\\\\n\\\"]],[]],null]],[]],null]],[]],[[[1,\\\"          Not Loaded\\\\n\\\"]],[]]]],[2]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"w-4 h-4\\\"],[24,4,\\\"button\\\"],[4,[38,4],[\\\"click\\\",[30,0,[\\\"removeSound\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,3],[\\\"close\\\"],[[\\\"class\\\"],[\\\"w-4 h-4 text-on-surface-2 opacity-30 hover:opacity-100\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,1],[15,0,[29,[[52,[51,[30,0,[\\\"isCurrentSound\\\"]]],\\\"opacity-0\\\"],\\\"\\\\n      flex justify-center p-1 -ml-2 -mr-2 my-2 text-xs font-bold text-center text-on-surface-0 uppercase transform bg-accent-0\\\"]]],[12],[1,\\\"Current Sound\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"flex flex-col mb-4\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,2],[[30,4],[28,[37,9],[[30,0,[\\\"url\\\"]]],[[\\\"key\\\"],[\\\"title\\\"]]]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"text-sm text-center break-all opacity-50\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"url\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,10],null,[[\\\"@url\\\"],[[30,0,[\\\"url\\\"]]]],null],[1,\\\"\\\\n  \\\"],[8,[39,11],null,[[\\\"@url\\\"],[[30,0,[\\\"url\\\"]]]],null],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,12],null,[[\\\"@show\\\"],[[30,0,[\\\"showDebugInfo\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[44,[[28,[37,13],[[30,0,[\\\"url\\\"]]],null]],[[[1,\\\"      \\\"],[8,[30,5,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[[52,[30,0,[\\\"usingSingleAudioElement\\\"]],\\\"Shared Audio Element\\\",\\\"Audio Element\\\"]]],[[\\\"button\\\",\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[11,\\\"button\\\"],[24,0,\\\"text-xs underline uppercase\\\"],[24,4,\\\"button\\\"],[4,[38,4],[\\\"click\\\",[28,[37,14],[[30,0,[\\\"inspectSound\\\"]],[28,[37,13],[[30,0,[\\\"url\\\"]]],null]],null]],null],[12],[1,\\\"\\\\n            Inspect\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],[[[1,\\\"\\\\n          \\\"],[10,0],[15,0,[29,[\\\"p-2 text-xs border rounded-md bg-surface-3\\\\n              \\\",[52,[30,0,[\\\"hasControlOfAudioElement\\\"]],\\\"border-accent-1\\\",\\\"border-surface-0\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[1,[30,6,[\\\"audioElement\\\",\\\"outerHTML\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"usingSingleAudioElement\\\"]],[[[41,[30,0,[\\\"hasControlOfAudioElement\\\"]],[[[1,\\\"              \\\"],[10,2],[14,0,\\\"text-xs\\\"],[12],[1,\\\"This sound has control of the element right now\\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"              \\\"],[10,2],[14,0,\\\"text-xs\\\"],[12],[1,\\\"This sound is not in control of the element now\\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[6]]],[1,\\\"\\\\n    \\\"],[8,[30,5,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[\\\"Connections\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[39,15],[[24,0,\\\"flex flex-col gap-1 justify-items-stretch\\\"]],[[\\\"@url\\\"],[[30,0,[\\\"url\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"inline\\\\n              \\\",[52,[28,[37,8],[[30,7,[\\\"info\\\",\\\"status\\\"]],\\\"failure\\\"],null],\\\" text-danger \\\"],\\\"\\\\n              \\\",[52,[28,[37,8],[[30,7,[\\\"info\\\",\\\"status\\\"]],\\\"success\\\"],null],\\\" text-success \\\"],\\\"\\\\n              \\\"]]],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"text-sm\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[28,[35,3],[[28,[37,16],[\\\"connection-\\\",[30,7,[\\\"info\\\",\\\"status\\\"]]],null]],[[\\\"class\\\"],[\\\"inline w-4 h-4\\\"]]]],[1,\\\"\\\\n              \\\"],[1,[30,7,[\\\"item\\\",\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"text-sm opacity-70\\\"],[12],[1,[30,7,[\\\"info\\\",\\\"message\\\"]]],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"]],[7]]]]],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,5,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[\\\"Properties\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[39,17],null,[[\\\"@url\\\"],[[30,0,[\\\"url\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,5,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[\\\"Events\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[39,18],null,[[\\\"@url\\\"],[[30,0,[\\\"url\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n  \\\"]],[5]]]]],[1,\\\"\\\\n\\\\n  \\\"],[11,\\\"button\\\"],[24,0,\\\"flex items-center justify-center w-full p-1 text-center text-accent-0 hover:text-accent-0-hover\\\"],[24,4,\\\"button\\\"],[4,[38,4],[\\\"click\\\",[28,[37,19],[\\\"showDebugInfo\\\",[30,0]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showDebugInfo\\\"]],[[[1,\\\"      \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"Hide Debug\\\"],[13],[1,\\\"\\\\n      \\\"],[1,[28,[35,3],[\\\"angle-up\\\"],[[\\\"class\\\"],[\\\"w-4 h-4\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[1,[28,[35,3],[\\\"angle-down\\\"],[[\\\"class\\\"],[\\\"w-4 h-4\\\"]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[18,8,null],[1,\\\"\\\\n\\\\n\\\"],[13]],[\\\"&attrs\\\",\\\"sound\\\",\\\"strategy\\\",\\\"@title\\\",\\\"d\\\",\\\"sound\\\",\\\"data\\\",\\\"&default\\\"],false,[\\\"let\\\",\\\"if\\\",\\\"or\\\",\\\"svg-jar\\\",\\\"on\\\",\\\"unless\\\",\\\"each\\\",\\\"-track-array\\\",\\\"eq\\\",\\\"sound-metadata\\\",\\\"sound-display/position\\\",\\\"sound-display/controls\\\",\\\"debug-details\\\",\\\"find-sound\\\",\\\"fn\\\",\\\"strategy-breakdown\\\",\\\"concat\\\",\\\"sound-properties\\\",\\\"event-display\\\",\\\"toggle\\\",\\\"yield\\\"]]\",\n    \"moduleName\": \"docs/components/sound-display.hbs\",\n    \"isStrictMode\": false\n  });\n  let SoundDisplay = _exports.default = (_class = class SoundDisplay extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"selectedConnections\", _descriptor2, this);\n    }\n    get loadedSound() {\n      return this.stereo.findSound(this.args.url);\n    }\n    get url() {\n      if (this.loadedSound) {\n        return this.loadedSound.url;\n      } else {\n        return this.args.url;\n      }\n    }\n    get usingSingleAudioElement() {\n      return this.stereo.useSharedAudioAccess;\n    }\n    get hasControlOfAudioElement() {\n      let connection = this.loadedSound?.connection;\n      return this.usingSingleAudioElement && !!connection?.sharedAudioAccess?.hasControl(connection);\n    }\n    get allConnections() {\n      return this.stereo.connectionLoader.connections;\n    }\n    get isCurrentSound() {\n      return this.stereo.currentSound === this.loadedSound;\n    }\n    get connectionChoices() {\n      let strategies = this.loadedSound?.strategies || [];\n      return strategies.filter(strategy => strategy.canPlay);\n    }\n    get canSwitchConnections() {\n      return this.connectionChoices.length > 1;\n    }\n    async switchConnection(event) {\n      let sound = this.loadedSound;\n      let key = event.target.value;\n      if (!sound || key === sound.connectionKey) {\n        return;\n      }\n      await sound.swap(key, {\n        timeout: 10000\n      });\n    }\n    inspectSound(sound) {\n      window.$E = sound;\n      console.log(`$E = `, sound);\n    }\n    async removeSound() {\n      this.stereo.removeSound(this.url);\n      if (this.args.onRemoval) {\n        this.args.onRemoval();\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"selectedConnections\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return this.stereo.connectionLoader.connections;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"switchConnection\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"switchConnection\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"inspectSound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"inspectSound\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"removeSound\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"removeSound\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, SoundDisplay);\n});","define(\"docs/components/sound-display/controls\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='flex justify-center gap-3 p-5'>\n    <button\n      type='button'\n      disabled={{not (sound-is-rewindable @url)}}\n      class='text-accent-0 hover:text-accent-0-hover disabled:opacity-30'\n      {{on 'click' (fn (rewind-sound @url increment=15000))}}\n    >\n      {{svg-jar\n        'skip-backward-outline'\n        class='stereo-icon'\n        height='24'\n        width='24'\n      }}\n    </button>\n  \n    {{#if (not (or (sound-is-loaded @url) (sound-is-loading @url)))}}\n      <button\n        type='button'\n        class='text-accent-0 hover:text-accent-0-hover disabled:opacity-30'\n        {{on 'click' (load-sound @url)}}\n      >\n        {{svg-jar 'load' class='stereo-icon' height='48' width='48'}}\n      </button>\n    {{/if}}\n  \n    <button\n      type='button'\n      class='text-accent-0 hover:text-accent-0-hover disabled:opacity-30'\n      {{on 'click' (toggle-play-sound @url metadata=(hash title=@title))}}\n    >\n      {{#if (sound-is-loading @url)}}\n        {{svg-jar\n          'loading-outline'\n          class='stereo-icon animate-spin'\n          height='48'\n          width='48'\n        }}\n      {{else if (sound-is-playing @url)}}\n        {{svg-jar 'pause-outline' class='stereo-icon' height='48' width='48'}}\n      {{else}}\n        {{svg-jar 'play-outline' class='stereo-icon' height='48' width='48'}}\n      {{/if}}\n    </button>\n  \n    <button\n      disabled={{not (sound-is-fastforwardable @url)}}\n      type='button'\n      class='text-accent-0 hover:text-accent-0-hover disabled:opacity-30'\n      {{on 'click' (fastforward-sound @url increment=15000)}}\n    >\n      {{svg-jar\n        'skip-forward-outline'\n        class='stereo-icon'\n        height='24'\n        width='24'\n      }}\n    </button>\n  \n    {{#if (sound-is-loaded @url)}}\n      <button\n        type='button'\n        class='text-accent-0 hover:text-accent-0-hover disabled:opacity-30'\n        {{on 'click' (stop-sound @url)}}\n      >\n        {{svg-jar 'stop-outline' class='stereo-icon' height='24' width='24'}}\n      </button>\n    {{/if}}\n  </div>\n  */\n  {\n    \"id\": \"sN1eP6fo\",\n    \"block\": \"[[[10,0],[14,0,\\\"flex justify-center gap-3 p-5\\\"],[12],[1,\\\"\\\\n  \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,1],[[30,1]],null]],null]],[24,0,\\\"text-accent-0 hover:text-accent-0-hover disabled:opacity-30\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,3],[[28,[37,4],[[30,1]],[[\\\"increment\\\"],[15000]]]],null]],null],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,5],[\\\"skip-backward-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"24\\\",\\\"24\\\"]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,0],[[28,[37,7],[[28,[37,8],[[30,1]],null],[28,[37,9],[[30,1]],null]],null]],null],[[[1,\\\"    \\\"],[11,\\\"button\\\"],[24,0,\\\"text-accent-0 hover:text-accent-0-hover disabled:opacity-30\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,10],[[30,1]],null]],null],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,5],[\\\"load\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[11,\\\"button\\\"],[24,0,\\\"text-accent-0 hover:text-accent-0-hover disabled:opacity-30\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,11],[[30,1]],[[\\\"metadata\\\"],[[28,[37,12],null,[[\\\"title\\\"],[[30,2]]]]]]]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[30,1]],null],[[[1,\\\"      \\\"],[1,[28,[35,5],[\\\"loading-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon animate-spin\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,13],[[30,1]],null],[[[1,\\\"      \\\"],[1,[28,[35,5],[\\\"pause-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[1,[28,[35,5],[\\\"play-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"48\\\",\\\"48\\\"]]]],[1,\\\"\\\\n    \\\"]],[]]]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,0],[[28,[37,14],[[30,1]],null]],null]],[24,0,\\\"text-accent-0 hover:text-accent-0-hover disabled:opacity-30\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,15],[[30,1]],[[\\\"increment\\\"],[15000]]]],null],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,5],[\\\"skip-forward-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"24\\\",\\\"24\\\"]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,8],[[30,1]],null],[[[1,\\\"    \\\"],[11,\\\"button\\\"],[24,0,\\\"text-accent-0 hover:text-accent-0-hover disabled:opacity-30\\\"],[24,4,\\\"button\\\"],[4,[38,2],[\\\"click\\\",[28,[37,16],[[30,1]],null]],null],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,5],[\\\"stop-outline\\\"],[[\\\"class\\\",\\\"height\\\",\\\"width\\\"],[\\\"stereo-icon\\\",\\\"24\\\",\\\"24\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[\\\"@url\\\",\\\"@title\\\"],false,[\\\"not\\\",\\\"sound-is-rewindable\\\",\\\"on\\\",\\\"fn\\\",\\\"rewind-sound\\\",\\\"svg-jar\\\",\\\"if\\\",\\\"or\\\",\\\"sound-is-loaded\\\",\\\"sound-is-loading\\\",\\\"load-sound\\\",\\\"toggle-play-sound\\\",\\\"hash\\\",\\\"sound-is-playing\\\",\\\"sound-is-fastforwardable\\\",\\\"fastforward-sound\\\",\\\"stop-sound\\\"]]\",\n    \"moduleName\": \"docs/components/sound-display/controls.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/sound-display/position\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/runloop\", \"@ember/service\", \"@ember/object\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _runloop, _service, _object, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/runloop\",0,\"@ember/service\",0,\"@ember/object\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='flex flex-col'>\n    <div\n      {{sound-position-slider @url}}\n      class='relative h-3 p-1 rounded bg-surface-2'\n    >\n      <div\n        class='{{if\n            (and (not (sound-is-seekable @url)) (sound-is-playing @url))\n            \"absolute inset-1 rounded-md shadow-inset from-accent-0 to-accent-2  bg-gradient-to-r animate-gradient-x animated\"\n          }}'\n      >\n  \n      </div>\n      <div\n        data-position-percent={{sound-position @url format='percentage'}}\n        {{sound-position-progress @url}}\n        class='h-full transition-all pointer-events-none rounded-xl bg-accent-0'\n      ></div>\n    </div>\n    <div class='flex justify-between mt-1 text-xs'>\n      <span>\n        {{sound-position @url format='time'}}\n      </span>\n      <span>\n        {{sound-duration @url format='time'}}\n      </span>\n    </div>\n  \n  </div>\n  */\n  {\n    \"id\": \"ExgzyBuG\",\n    \"block\": \"[[[10,0],[14,0,\\\"flex flex-col\\\"],[12],[1,\\\"\\\\n  \\\"],[11,0],[24,0,\\\"relative h-3 p-1 rounded bg-surface-2\\\"],[4,[38,0],[[30,1]],null],[12],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[[52,[28,[37,2],[[28,[37,3],[[28,[37,4],[[30,1]],null]],null],[28,[37,5],[[30,1]],null]],null],\\\"absolute inset-1 rounded-md shadow-inset from-accent-0 to-accent-2  bg-gradient-to-r animate-gradient-x animated\\\"]]]],[12],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[11,0],[16,\\\"data-position-percent\\\",[28,[37,6],[[30,1]],[[\\\"format\\\"],[\\\"percentage\\\"]]]],[24,0,\\\"h-full transition-all pointer-events-none rounded-xl bg-accent-0\\\"],[4,[38,7],[[30,1]],null],[12],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"flex justify-between mt-1 text-xs\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,6],[[30,1]],[[\\\"format\\\"],[\\\"time\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[12],[1,\\\"\\\\n      \\\"],[1,[28,[35,8],[[30,1]],[[\\\"format\\\"],[\\\"time\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13]],[\\\"@url\\\"],false,[\\\"sound-position-slider\\\",\\\"if\\\",\\\"and\\\",\\\"not\\\",\\\"sound-is-seekable\\\",\\\"sound-is-playing\\\",\\\"sound-position\\\",\\\"sound-position-progress\\\",\\\"sound-duration\\\"]]\",\n    \"moduleName\": \"docs/components/sound-display/position.hbs\",\n    \"isStrictMode\": false\n  });\n  let Position = _exports.default = (_class = class Position extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"element\", _descriptor2, this);\n      _initializerDefineProperty(this, \"dragAdjustment\", _descriptor3, this);\n    }\n    get loadedSound() {\n      return this.stereo.findSound(this.args.url);\n    }\n    didInsert(element) {\n      this.element = element;\n    }\n    handleTap(e) {\n      const {\n        center\n      } = e.gesture;\n      if (this.loadedSound.isFastForwardable && this.loadedSound.isRewindable && this.element) {\n        let rect = this.element.getBoundingClientRect();\n        let positionPercentage = (center.x - rect.x) / rect.width;\n        let newPosition = parseFloat(this.loadedSound.duration * positionPercentage, 10);\n        (0, _runloop.next)(() => {\n          this.loadedSound.position = parseInt(newPosition, 10);\n          this.dragAdjustment = 0;\n        });\n      }\n    }\n    updatePosition(e) {\n      let {\n        deltaX\n      } = e.gesture;\n      if (this.element) {\n        let width = this.element.getBoundingClientRect().width;\n        let changePercentage = deltaX / width;\n        let newPercentage = this.loadedSound.position / this.loadedSound.duration + changePercentage;\n        let newPosition = parseFloat(this.loadedSound.duration * newPercentage, 10);\n        (0, _runloop.next)(() => {\n          this.loadedSound.position = newPosition;\n          this.dragAdjustment = 0;\n        });\n      }\n    }\n    updatePlayheadPosition(e) {\n      let {\n        deltaX\n      } = e.gesture;\n      if (this.element) {\n        let width = this.element.getBoundingClientRect().width;\n        let percentage = this.loadedSound.position / this.loadedSound.duration;\n        let pxPosition = width * percentage;\n        if (pxPosition + deltaX < 0) {\n          deltaX = -pxPosition;\n        } else if (pxPosition + deltaX >= width) {\n          deltaX = width - pxPosition;\n        }\n      }\n      (0, _runloop.throttle)(this, () => {\n        this.dragAdjustment = deltaX;\n      }, 200);\n    }\n    handlePanEnd() {\n      this.dragAdjustment = 0;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"element\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"dragAdjustment\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"didInsert\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"didInsert\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"handleTap\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"handleTap\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"updatePosition\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"updatePosition\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"updatePlayheadPosition\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"updatePlayheadPosition\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"handlePanEnd\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"handlePanEnd\"), _class.prototype), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, Position);\n});","define(\"docs/components/sound-display/volume\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@glimmer/tracking\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _tracking, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2, _descriptor3;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class='flex justify-between' {{stereo-volume}}>\n    {{#each this.numOfNotches as |item time|}}\n      <span\n        class='w-2 h-2 rounded pointer-events-none\n          {{if (lte time this.activeNotches) \"bg-accent-0\" \"bg-surface-0\"}}'\n      ></span>\n    {{/each}}\n  </div>\n  */\n  {\n    \"id\": \"/2jpQLJ/\",\n    \"block\": \"[[[11,0],[24,0,\\\"flex justify-between\\\"],[4,[38,0],null,null],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[30,0,[\\\"numOfNotches\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[10,1],[15,0,[29,[\\\"w-2 h-2 rounded pointer-events-none\\\\n        \\\",[52,[28,[37,4],[[30,2],[30,0,[\\\"activeNotches\\\"]]],null],\\\"bg-accent-0\\\",\\\"bg-surface-0\\\"]]]],[12],[13],[1,\\\"\\\\n\\\"]],[1,2]],null],[13]],[\\\"item\\\",\\\"time\\\"],false,[\\\"stereo-volume\\\",\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"lte\\\"]]\",\n    \"moduleName\": \"docs/components/sound-display/volume.hbs\",\n    \"isStrictMode\": false\n  });\n  let Volume = _exports.default = (_class = class Volume extends _component2.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"dragAdjustment\", _descriptor2, this);\n      _initializerDefineProperty(this, \"alreadyChanged\", _descriptor3, this);\n      _defineProperty(this, \"notchCount\", 20);\n    }\n    get numOfNotches() {\n      return new Array(this.notchCount);\n    }\n    get activeNotches() {\n      return parseInt(this.stereo.volume / 100 * this.notchCount, 10);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"dragAdjustment\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"alreadyChanged\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, Volume);\n});","define(\"docs/components/sound-properties\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#let (find-sound @url) as |sound|}}\n    {{#let\n      (array\n        'isLoading'\n        'isPlaying'\n        'hasPlayed'\n        'duration'\n        'isStream'\n        'isRewindable'\n        'isLive'\n        'isFastForwardable'\n        'isSeekable'\n        'percentLoaded'\n        'currentTime'\n      )\n      as |props|\n    }}\n      <SoundProperties::Prop @title='id' @data={{sound.debugName}} />\n      {{#each props as |propName|}}\n        <SoundProperties::Prop\n          @title={{propName}}\n          @data={{or (get sound propName) 'false'}}\n        />\n      {{/each}}\n      <SoundProperties::Prop\n        @title='duration'\n        @data={{sound-duration sound format='time'}}\n      />\n      <SoundProperties::Prop\n        @title='position'\n        @data={{sound-position sound format='time'}}\n      />\n      <SoundProperties::Prop\n        @title='metadata'\n        @data={{json-stringify sound.metadata}}\n      />\n      <SoundProperties::Prop\n        @title='id3TagMetdata'\n        @data={{json-stringify sound.id3TagMetadata pretty=true}}\n      />\n    {{/let}}\n  {{/let}}\n  */\n  {\n    \"id\": \"OLa5BoCC\",\n    \"block\": \"[[[44,[[28,[37,1],[[30,1]],null]],[[[44,[[28,[37,2],[\\\"isLoading\\\",\\\"isPlaying\\\",\\\"hasPlayed\\\",\\\"duration\\\",\\\"isStream\\\",\\\"isRewindable\\\",\\\"isLive\\\",\\\"isFastForwardable\\\",\\\"isSeekable\\\",\\\"percentLoaded\\\",\\\"currentTime\\\"],null]],[[[1,\\\"    \\\"],[8,[39,3],null,[[\\\"@title\\\",\\\"@data\\\"],[\\\"id\\\",[30,2,[\\\"debugName\\\"]]]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,5],[[28,[37,5],[[30,3]],null]],null],null,[[[1,\\\"      \\\"],[8,[39,3],null,[[\\\"@title\\\",\\\"@data\\\"],[[30,4],[28,[37,6],[[28,[37,7],[[30,2],[30,4]],null],\\\"false\\\"],null]]],null],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"    \\\"],[8,[39,3],null,[[\\\"@title\\\",\\\"@data\\\"],[\\\"duration\\\",[28,[37,8],[[30,2]],[[\\\"format\\\"],[\\\"time\\\"]]]]],null],[1,\\\"\\\\n    \\\"],[8,[39,3],null,[[\\\"@title\\\",\\\"@data\\\"],[\\\"position\\\",[28,[37,9],[[30,2]],[[\\\"format\\\"],[\\\"time\\\"]]]]],null],[1,\\\"\\\\n    \\\"],[8,[39,3],null,[[\\\"@title\\\",\\\"@data\\\"],[\\\"metadata\\\",[28,[37,10],[[30,2,[\\\"metadata\\\"]]],null]]],null],[1,\\\"\\\\n    \\\"],[8,[39,3],null,[[\\\"@title\\\",\\\"@data\\\"],[\\\"id3TagMetdata\\\",[28,[37,10],[[30,2,[\\\"id3TagMetadata\\\"]]],[[\\\"pretty\\\"],[true]]]]],null],[1,\\\"\\\\n\\\"]],[3]]]],[2]]]],[\\\"@url\\\",\\\"sound\\\",\\\"props\\\",\\\"propName\\\"],false,[\\\"let\\\",\\\"find-sound\\\",\\\"array\\\",\\\"sound-properties/prop\\\",\\\"each\\\",\\\"-track-array\\\",\\\"or\\\",\\\"get\\\",\\\"sound-duration\\\",\\\"sound-position\\\",\\\"json-stringify\\\"]]\",\n    \"moduleName\": \"docs/components/sound-properties.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/sound-properties/prop\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div\n    class='inline-block mb-1 text-xs break-all border rounded border-surface-0 bg-surface-2'\n    ...attributes\n  >\n    <span class='inline-block py-1 pl-2 pr-1'>{{@title}}</span>\n  \n    {{#if @data}}\n      <span\n        class='inline-block py-1 pl-2 pr-2 bg-surface-1 border-on-surface'\n      >{{@data}}</span>\n    {{else if (has-block)}}\n      <span\n        class='inline-block py-1 pl-2 pr-2 bg-surface-1 border-on-surface'\n      >{{yield}}</span>\n    {{/if}}\n  </div>\n  */\n  {\n    \"id\": \"mAr1tiVn\",\n    \"block\": \"[[[11,0],[24,0,\\\"inline-block mb-1 text-xs break-all border rounded border-surface-0 bg-surface-2\\\"],[17,1],[12],[1,\\\"\\\\n  \\\"],[10,1],[14,0,\\\"inline-block py-1 pl-2 pr-1\\\"],[12],[1,[30,2]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,3],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"inline-block py-1 pl-2 pr-2 bg-surface-1 border-on-surface\\\"],[12],[1,[30,3]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[48,[30,4]],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"inline-block py-1 pl-2 pr-2 bg-surface-1 border-on-surface\\\"],[12],[18,4,null],[13],[1,\\\"\\\\n  \\\"]],[]],null]],[]]],[13]],[\\\"&attrs\\\",\\\"@title\\\",\\\"@data\\\",\\\"&default\\\"],false,[\\\"if\\\",\\\"has-block\\\",\\\"yield\\\"]]\",\n    \"moduleName\": \"docs/components/sound-properties/prop.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/components/strategy-breakdown\", [\"exports\", \"@ember/component\", \"@glimmer/component\", \"@ember/service\", \"@glimmer/tracking\", \"ember-stereo/-private/utils/stereo-url\", \"ember-stereo/-private/utils/strategy\", \"@ember/template-factory\"], function (_exports, _component, _component2, _service, _tracking, _stereoUrl, _strategy, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@glimmer/component\",0,\"@ember/service\",0,\"@glimmer/tracking\",0,\"ember-stereo/-private/utils/stereo-url\",0,\"ember-stereo/-private/utils/strategy\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <ol ...attributes>\n    {{#each this.strategyResults as |item|}}\n      {{#if (has-block)}}\n        {{yield\n          (hash\n            item=item\n            loadWasAttempted=this.loadWasAttempted\n            info=(strategy-status item loadWasAttempted=this.loadWasAttempted)\n          )\n        }}\n      {{else}}\n        <StrategyBreakdown::Connection\n          @item={{item}}\n          @loadWasAttempted={{this.loadWasAttempted}}\n          @allowSelection={{@allowSelection}}\n          @selectedConnections={{@selectedConnections}}\n          @onUpdateConnections={{@onUpdateConnections}}\n        />\n      {{/if}}\n    {{/each}}\n  </ol>\n  */\n  {\n    \"id\": \"LRvsm8x8\",\n    \"block\": \"[[[11,\\\"ol\\\"],[17,1],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,0,[\\\"strategyResults\\\"]]],null]],null],null,[[[41,[48,[30,6]],[[[1,\\\"      \\\"],[18,6,[[28,[37,5],null,[[\\\"item\\\",\\\"loadWasAttempted\\\",\\\"info\\\"],[[30,2],[30,0,[\\\"loadWasAttempted\\\"]],[28,[37,6],[[30,2]],[[\\\"loadWasAttempted\\\"],[[30,0,[\\\"loadWasAttempted\\\"]]]]]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[8,[39,7],null,[[\\\"@item\\\",\\\"@loadWasAttempted\\\",\\\"@allowSelection\\\",\\\"@selectedConnections\\\",\\\"@onUpdateConnections\\\"],[[30,2],[30,0,[\\\"loadWasAttempted\\\"]],[30,3],[30,4],[30,5]]],null],[1,\\\"\\\\n\\\"]],[]]]],[2]],null],[13]],[\\\"&attrs\\\",\\\"item\\\",\\\"@allowSelection\\\",\\\"@selectedConnections\\\",\\\"@onUpdateConnections\\\",\\\"&default\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"has-block\\\",\\\"yield\\\",\\\"hash\\\",\\\"strategy-status\\\",\\\"strategy-breakdown/connection\\\"]]\",\n    \"moduleName\": \"docs/components/strategy-breakdown.hbs\",\n    \"isStrictMode\": false\n  });\n  let StrategyBreakdown = _exports.default = (_class = class StrategyBreakdown extends _component2.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"sound\", _descriptor2, this);\n      this.sound = this.stereo.findSound(this.args.url);\n    }\n    get loadWasAttempted() {\n      return this.sound && (this.sound.isResolved || this.sound.isErrored);\n    }\n    get strategyResults() {\n      // The Sound records the strategies it tried (in order) on `_debug`.\n      if (this.sound && (this.sound.isResolved || this.sound.isErrored)) {\n        return this.filledOutResults(this.sound._debug);\n      }\n      return this.stereo.connectionLoader.connections.map(connection => {\n        return new _strategy.default(connection, this.args.url ? new _stereoUrl.default(this.args.url) : new _stereoUrl.default('./'));\n      });\n    }\n    filledOutResults(results) {\n      let tried = Array.isArray(results) ? results : [];\n      return this.stereo.connectionLoader.connections.map(connection => {\n        let found = tried.find(r => r.connectionClass.name === connection.name);\n        if (found) {\n          return found;\n        } else {\n          return new _strategy.default(connection, this.args.url ? new _stereoUrl.default(this.args.url) : new _stereoUrl.default('./'));\n        }\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"sound\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, StrategyBreakdown);\n});","define(\"docs/components/strategy-breakdown/connection\", [\"exports\", \"@ember/component\", \"@ember/component/template-only\", \"@ember/template-factory\"], function (_exports, _component, _templateOnly, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/template-only\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <li class='relative items-start text-base'>\n    {{#let\n      (unique-id)\n      (strategy-status @item loadWasAttempted=@loadWasAttempted)\n      (includes @item.key @selectedConnections)\n      as |id status selected|\n    }}\n      <label\n        class='{{unless selected \"opacity-50\"}}\n          hover:border-surface-3 relative block px-2 py-1 my-2 border rounded-md shadow-sm cursor-pointer bg-on-surface-3 border-on-surface-0 text-on-background hover:border-gray-400 focus:outline-none'\n      >\n        {{#if @allowSelection}}\n          <Input\n            class='sr-only'\n            @type='checkbox'\n            @checked={{selected}}\n            {{on 'click' (fn @onUpdateConnections @item.key selected)}}\n          />\n        {{else}}\n          <Input\n            class='sr-only'\n            @type='checkbox'\n            disabled={{true}}\n            @checked={{not (eq status.summary 'ineligible')}}\n          />\n        {{/if}}\n  \n        <p for={{id}} class='text-sm text-current'>{{@item.connectionName}}</p>\n  \n        <p id='{{id}}-description' class='block text-sm opacity-50'>\n          {{#if\n            (and\n              @allowSelection\n              (includes @item.key @selectedConnections)\n              (eq status.summary 'ineligible')\n            )\n          }}\n            It doesn't look like it'll work, but we'll try it anyway\n          {{else}}\n            {{status.message}}\n  \n          {{/if}}\n        </p>\n      </label>\n    {{/let}}\n  </li>\n  */\n  {\n    \"id\": \"+bpW8OlG\",\n    \"block\": \"[[[10,\\\"li\\\"],[14,0,\\\"relative items-start text-base\\\"],[12],[1,\\\"\\\\n\\\"],[44,[[28,[37,1],null,null],[28,[37,2],[[30,1]],[[\\\"loadWasAttempted\\\"],[[30,2]]]],[28,[37,3],[[30,1,[\\\"key\\\"]],[30,3]],null]],[[[1,\\\"    \\\"],[10,\\\"label\\\"],[15,0,[29,[[52,[51,[30,6]],\\\"opacity-50\\\"],\\\"\\\\n        hover:border-surface-3 relative block px-2 py-1 my-2 border rounded-md shadow-sm cursor-pointer bg-on-surface-3 border-on-surface-0 text-on-background hover:border-gray-400 focus:outline-none\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[30,7],[[[1,\\\"        \\\"],[8,[39,6],[[24,0,\\\"sr-only\\\"],[4,[38,7],[\\\"click\\\",[28,[37,8],[[30,8],[30,1,[\\\"key\\\"]],[30,6]],null]],null]],[[\\\"@type\\\",\\\"@checked\\\"],[\\\"checkbox\\\",[30,6]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[8,[39,6],[[24,0,\\\"sr-only\\\"],[16,\\\"disabled\\\",true]],[[\\\"@type\\\",\\\"@checked\\\"],[\\\"checkbox\\\",[28,[37,9],[[28,[37,10],[[30,5,[\\\"summary\\\"]],\\\"ineligible\\\"],null]],null]]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n      \\\"],[10,2],[15,\\\"for\\\",[30,4]],[14,0,\\\"text-sm text-current\\\"],[12],[1,[30,1,[\\\"connectionName\\\"]]],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,2],[15,1,[29,[[30,4],\\\"-description\\\"]]],[14,0,\\\"block text-sm opacity-50\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,11],[[30,7],[28,[37,3],[[30,1,[\\\"key\\\"]],[30,3]],null],[28,[37,10],[[30,5,[\\\"summary\\\"]],\\\"ineligible\\\"],null]],null],[[[1,\\\"          It doesn't look like it'll work, but we'll try it anyway\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[1,[30,5,[\\\"message\\\"]]],[1,\\\"\\\\n\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[4,5,6]]],[13]],[\\\"@item\\\",\\\"@loadWasAttempted\\\",\\\"@selectedConnections\\\",\\\"id\\\",\\\"status\\\",\\\"selected\\\",\\\"@allowSelection\\\",\\\"@onUpdateConnections\\\"],false,[\\\"let\\\",\\\"unique-id\\\",\\\"strategy-status\\\",\\\"includes\\\",\\\"unless\\\",\\\"if\\\",\\\"input\\\",\\\"on\\\",\\\"fn\\\",\\\"not\\\",\\\"eq\\\",\\\"and\\\"]]\",\n    \"moduleName\": \"docs/components/strategy-breakdown/connection.hbs\",\n    \"isStrictMode\": false\n  });\n  var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, (0, _templateOnly.default)());\n});","define(\"docs/container-debug-adapter\", [\"exports\", \"ember-resolver/container-debug-adapter\"], function (_exports, _containerDebugAdapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _containerDebugAdapter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-resolver/container-debug-adapter\"eaimeta@70e063a35619d71f\n});","define(\"docs/controllers/docs\", [\"exports\", \"@ember/controller\", \"@ember/service\"], function (_exports, _controller, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/controller\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsController = _exports.default = (_class = class DocsController extends _controller.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/controllers/docs/playing-sounds\", [\"exports\", \"ember-concurrency/async-arrow-runtime\", \"@ember/controller\", \"@ember/service\", \"ember-concurrency\"], function (_exports, _asyncArrowRuntime, _controller, _service, _emberConcurrency) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/async-arrow-runtime\",0,\"@ember/controller\",0,\"@ember/service\",0,\"ember-concurrency\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsUsageController = _exports.default = (_class = class DocsUsageController extends _controller.default {\n    constructor(...args) {\n      super(...args);\n      // BEGIN-SNIPPET application-controller.js\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      // END-SNIPPET\n      // BEGIN-SNIPPET application-controller.js\n      _defineProperty(this, \"onDemandUrl\", 'https://audio.wnyc.org/otm/otm04212017pod.mp3');\n      _defineProperty(this, \"onDemandOgg\", 'https://file-examples-com.github.io/uploads/2017/11/file_example_OOG_1MG.ogg');\n      _defineProperty(this, \"streamUrl\", 'https://streaming.koop.org/stream.aac');\n      // END-SNIPPET\n      // BEGIN_SNIPPET play-sound-decorator-promise.js\n      _defineProperty(this, \"loadAudioUrlTask\", (0, _asyncArrowRuntime.buildTask)(() => ({\n        context: this,\n        generator: function* () {\n          yield (0, _emberConcurrency.timeout)(200);\n          return yield [this.onDemandUrl];\n        }\n      }), null, \"loadAudioUrlTask\", null));\n    } // END-SNIPPET\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/data-adapter\", [\"exports\", \"@ember-data/debug/data-adapter\"], function (_exports, _dataAdapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _dataAdapter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/debug/data-adapter\"eaimeta@70e063a35619d71f\n});","define(\"docs/diagnostic\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader as |header|>\n    <header.link @route='diagnostic'>\n      Diagnostic\n    </header.link>\n    <Docs::ThemeToggle />\n  </DocsHeader>\n  <DocsViewer as |viewer|>\n    <viewer.nav as |nav|>\n      <nav.section @label='Diagnostic' />\n      <nav.item @label='Main' @route='diagnostic.index' />\n      <nav.item @label='Sync' @route='diagnostic.sync' />\n      <nav.item @label='Players' @route='diagnostic.players' />\n  \n    </viewer.nav>\n  \n    <viewer.main>\n      {{outlet}}\n    </viewer.main>\n  </DocsViewer>\n  */\n  {\n    \"id\": \"WaE5vs+a\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"link\\\"]],null,[[\\\"@route\\\"],[\\\"diagnostic\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Diagnostic\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[39,1],null,null,null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[8,[39,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,2,[\\\"nav\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Diagnostic\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Main\\\",\\\"diagnostic.index\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Sync\\\",\\\"diagnostic.sync\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Players\\\",\\\"diagnostic.players\\\"]],null],[1,\\\"\\\\n\\\\n  \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,2,[\\\"main\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[46,[28,[37,4],null,null],null,null,null],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"header\\\",\\\"viewer\\\",\\\"nav\\\"],false,[\\\"docs-header\\\",\\\"docs/theme-toggle\\\",\\\"docs-viewer\\\",\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"docs/diagnostic.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/diagnostic/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div>\n    <ServiceDisplay class='mb-12' />\n  \n    <DiagnosticControls\n      @class='diagnostic'\n      @testSounds={{@model.testSounds}}\n      class='mb-12'\n    />\n  \n    <CachedSounds />\n  </div>\n  */\n  {\n    \"id\": \"vkbaxCxU\",\n    \"block\": \"[[[10,0],[12],[1,\\\"\\\\n  \\\"],[8,[39,0],[[24,0,\\\"mb-12\\\"]],null,null],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,1],[[24,0,\\\"mb-12\\\"]],[[\\\"@class\\\",\\\"@testSounds\\\"],[\\\"diagnostic\\\",[30,1,[\\\"testSounds\\\"]]]],null],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13]],[\\\"@model\\\"],false,[\\\"service-display\\\",\\\"diagnostic-controls\\\",\\\"cached-sounds\\\"]]\",\n    \"moduleName\": \"docs/diagnostic/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/diagnostic/players\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h1 class='text-xl'>Player Test</h1>\n  \n  <div class='mb-6'>\n    <h2 class='text-lg'>One sound, two players</h2>\n    <p class='my-2 text-base'>Same URL, so the same\n      <code>Sound</code>. Play or seek either and the other should match exactly.\n      The top player positions with modifiers, the bottom one with helpers.</p>\n  \n    <Docs::StereoPlayerModifiers @identifier={{@model.url}} />\n    <Docs::StereoPlayer @identifier={{@model.url}} />\n  </div>\n  \n  <div class='mb-6'>\n    <h2 class='text-lg'>Swapping the identifier</h2>\n    <p class='my-2 text-base'>One player, a different sound behind it. Every\n      helper and modifier bound to the identifier should follow the selection,\n      while the service-wide volume stays put. A seekable file and a live stream\n      need different controls, so the transport should change with them. The\n      sound you leave keeps playing until you start another.</p>\n  \n    <Docs::StereoPlayerChanger @sounds={{@model.swappable}} />\n  </div>\n  \n  <div class='mb-6'>\n    <h2 class='text-lg'>A sound that cannot play</h2>\n    <p class='my-2 text-base'>Play should surface the error, not spin forever.</p>\n  \n    <Docs::StereoPlayer @identifier={{@model.unplayable}} />\n  </div>\n  \n  */\n  {\n    \"id\": \"ZQ5pEgzh\",\n    \"block\": \"[[[10,\\\"h1\\\"],[14,0,\\\"text-xl\\\"],[12],[1,\\\"Player Test\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mb-6\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"text-lg\\\"],[12],[1,\\\"One sound, two players\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"Same URL, so the same\\\\n    \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\". Play or seek either and the other should match exactly.\\\\n    The top player positions with modifiers, the bottom one with helpers.\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,0],null,[[\\\"@identifier\\\"],[[30,1,[\\\"url\\\"]]]],null],[1,\\\"\\\\n  \\\"],[8,[39,1],null,[[\\\"@identifier\\\"],[[30,1,[\\\"url\\\"]]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mb-6\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"text-lg\\\"],[12],[1,\\\"Swapping the identifier\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"One player, a different sound behind it. Every\\\\n    helper and modifier bound to the identifier should follow the selection,\\\\n    while the service-wide volume stays put. A seekable file and a live stream\\\\n    need different controls, so the transport should change with them. The\\\\n    sound you leave keeps playing until you start another.\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,2],null,[[\\\"@sounds\\\"],[[30,1,[\\\"swappable\\\"]]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mb-6\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"text-lg\\\"],[12],[1,\\\"A sound that cannot play\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"Play should surface the error, not spin forever.\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,1],null,[[\\\"@identifier\\\"],[[30,1,[\\\"unplayable\\\"]]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@model\\\"],false,[\\\"docs/stereo-player-modifiers\\\",\\\"docs/stereo-player\\\",\\\"docs/stereo-player-changer\\\"]]\",\n    \"moduleName\": \"docs/diagnostic/players.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/diagnostic/sync\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h1 class='text-xl'>Sync Test</h1>\n  <p class='my-2 text-base'>Each player below is provided a different identifier\n    format (a string, an object, and a promise), but each identifier resolves to\n    the same URL. Each set of players should stay in sync.</p>\n  <div class='flex flex-col mb-3'>\n    {{#each @model.testSounds as |testSound|}}\n      <div class='mb-4'>\n        <p><a\n            target='_blank'\n            rel='noopener noreferrer'\n            href='{{testSound.url}}'\n          >{{testSound.url}}</a></p>\n  \n        <div\n          class='grid items-start content-start justify-start flex-1 gap-2 md:grid-cols-3'\n        >\n          <SoundDisplay @url={{testSound.url}} @title={{testSound.title}} />\n          <SoundDisplay @url={{testSound.urlObject}} @title={{testSound.title}} />\n          <SoundDisplay\n            @url={{testSound.urlPromise}}\n            @title={{testSound.title}}\n          />\n        </div>\n  \n      </div>\n    {{/each}}\n  </div>\n  */\n  {\n    \"id\": \"acR7Cavh\",\n    \"block\": \"[[[10,\\\"h1\\\"],[14,0,\\\"text-xl\\\"],[12],[1,\\\"Sync Test\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"Each player below is provided a different identifier\\\\n  format (a string, an object, and a promise), but each identifier resolves to\\\\n  the same URL. Each set of players should stay in sync.\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"flex flex-col mb-3\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"testSounds\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mb-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,2],[12],[10,3],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[15,6,[29,[[30,2,[\\\"url\\\"]]]]],[12],[1,[30,2,[\\\"url\\\"]]],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"grid items-start content-start justify-start flex-1 gap-2 md:grid-cols-3\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,2],null,[[\\\"@url\\\",\\\"@title\\\"],[[30,2,[\\\"url\\\"]],[30,2,[\\\"title\\\"]]]],null],[1,\\\"\\\\n        \\\"],[8,[39,2],null,[[\\\"@url\\\",\\\"@title\\\"],[[30,2,[\\\"urlObject\\\"]],[30,2,[\\\"title\\\"]]]],null],[1,\\\"\\\\n        \\\"],[8,[39,2],null,[[\\\"@url\\\",\\\"@title\\\"],[[30,2,[\\\"urlPromise\\\"]],[30,2,[\\\"title\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[13]],[\\\"@model\\\",\\\"testSound\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"sound-display\\\"]]\",\n    \"moduleName\": \"docs/diagnostic/sync.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader as |header|>\n    <header.link @route='diagnostic'>\n      Diagnostic\n    </header.link>\n    <Docs::ThemeToggle />\n  </DocsHeader>\n  <DocsViewer as |viewer|>\n    <viewer.nav as |nav|>\n      <nav.section @label='Overview' />\n      <nav.item @label='Intro' @route='docs.index' />\n      <nav.item @label='Upgrading' @route='docs.upgrading' />\n      <nav.section @label='Usage' />\n      <nav.item @label='Playing Sounds' @route='docs.playing-sounds' />\n      <nav.item @label='Custom Metadata' @route='docs.metadata' />\n      <nav.item @label='Monitoring Events' @route='docs.event-monitoring' />\n      <nav.item @label='AirPlay & Chromecast' @route='docs.casting' />\n      <nav.item @label='Advanced' @route='docs.advanced' />\n      <nav.section @label='Gotchas' />\n      <nav.item @label='Browser Audio' @route='docs.browser-audio' />\n      <nav.section @label='Development' />\n      <nav.item @label='Testing' @route='docs.testing' />\n      <nav.item @label='Debugging' @route='docs.debugging' />\n    </viewer.nav>\n  \n    <viewer.main>\n      <div class='docs-container'>\n        <div class='docs-section'>\n          {{outlet}}\n        </div>\n      </div>\n    </viewer.main>\n  </DocsViewer>\n  */\n  {\n    \"id\": \"AWQp16Iz\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"link\\\"]],null,[[\\\"@route\\\"],[\\\"diagnostic\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Diagnostic\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[39,1],null,null,null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[8,[39,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,2,[\\\"nav\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Overview\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Intro\\\",\\\"docs.index\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Upgrading\\\",\\\"docs.upgrading\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Usage\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Playing Sounds\\\",\\\"docs.playing-sounds\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Custom Metadata\\\",\\\"docs.metadata\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Monitoring Events\\\",\\\"docs.event-monitoring\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"AirPlay & Chromecast\\\",\\\"docs.casting\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Advanced\\\",\\\"docs.advanced\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Gotchas\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Browser Audio\\\",\\\"docs.browser-audio\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Development\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Testing\\\",\\\"docs.testing\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Debugging\\\",\\\"docs.debugging\\\"]],null],[1,\\\"\\\\n  \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,2,[\\\"main\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"docs-container\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"docs-section\\\"],[12],[1,\\\"\\\\n        \\\"],[46,[28,[37,4],null,null],null,null,null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"header\\\",\\\"viewer\\\",\\\"nav\\\"],false,[\\\"docs-header\\\",\\\"docs/theme-toggle\\\",\\\"docs-viewer\\\",\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"docs/docs.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/advanced\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"advanced\" class=\"docs-md__h1\">Advanced</h1>\n      <p>A few patterns that go beyond a single play/pause button.</p>\n  \n        <h2 id=\"custom-position-controls\" class=\"docs-md__h2\"><a href=\"#custom-position-controls\" class=\"heading-anchor\">Custom position controls</a></h2>\n      <p>The <code>&#123;&#123;sound-position-slider&#125;&#125;</code> modifier turns any element into a scrubber bound to a sound's position. Point it at an identifier and it keeps the control and the playback in sync both ways. Drag to seek, and it tracks as the sound plays.</p>\n  \n  <p><Docs::CustomPositionControl @identifier=\"/sounds/works-just-like-a-vcr.mp3\"/></p>\n  \n  <p><Docs::CustomPositionControl @identifier=\"/sounds/works-just-like-a-vcr.mp3\" @hideSource={{true}}/></p>\n  <p>The same modifier works without a live sound, driven by plain <code>@position</code> and <code>@duration</code> values. This is useful for rendering a static or server-supplied progress bar:</p>\n  \n  <p><Docs::ManualPositionControl @position={{10000}} @duration={{50000}} @hideSource={{false}}/></p>\n  <p>For a read-only bar, <code>&#123;&#123;sound-position-progress&#125;&#125;</code> sizes an element to the sound's position instead. It takes the same <code>@position</code> and <code>@duration</code> fallbacks.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">sound-position-progress</span> @identifier&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\">&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">div</span>&gt;</span></span>\n  </code></pre>\n  \n        <h2 id=\"building-a-play-queue\" class=\"docs-md__h2\"><a href=\"#building-a-play-queue\" class=\"heading-anchor\">Building a play queue</a></h2>\n      <p>Because <code>current-sound</code> and the <code>audio-ended</code> event are app-wide, a queue is just \"play the next thing when the current one ends.\" Here a list of URLs plays through in order:</p>\n  \n  <p><Docs::Queued/></p>\n  <p>The pattern: keep your own ordered list, <code>play</code> the first item, and subscribe to <code>audio-ended</code> on the service to advance. See <a href=\"/docs/event-monitoring\"  class=\"docs-md__a\">Monitoring Events</a> for the full event list.</p>\n  \n        <h2 id=\"prewarming-a-connection\" class=\"docs-md__h2\"><a href=\"#prewarming-a-connection\" class=\"heading-anchor\">Prewarming a connection</a></h2>\n      <p><code>Howler</code> and <code>HLS</code> pull their library down as a lazy chunk, and <code>Chromecast</code> fetches the Cast SDK from <code>gstatic.com</code>. Whichever sound needs one first pays for that download before any audio is fetched, so if you know which is coming, warm it up first:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// e.g. a live stream that can rewind into a recorded HLS archive</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">prewarmConnection</span>(<span class=\"hljs-string\">&#x27;HLS&#x27;</span>);\n  </code></pre>\n  <p>It takes the name a connection is registered under and resolves once it's warm. Connections with nothing to download resolve immediately. <a href=\"https://github.com/jkeen/ember-stereo/blob/main/ember-stereo/CUSTOM_CONNECTIONS.md\"  class=\"docs-md__a\">Your own connections</a> become prewarmable by implementing <code>static preload()</code>.</p>\n  \n        <h2 id=\"working-with-the-sound-directly\" class=\"docs-md__h2\"><a href=\"#working-with-the-sound-directly\" class=\"heading-anchor\">Working with the Sound directly</a></h2>\n      <p>For anything more involved than the helpers cover, reach for the <code>Sound</code> object itself. Its lifecycle states, playback proxying, and connection swaps are documented in <a href=\"/docs/playing-sounds\"  class=\"docs-md__a\">Playing Sounds</a>.</p>\n  \n  <p><Docs::ProxyExample /></p>\n  </div>\n  */\n  {\n    \"id\": \"r23C4Hbp\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"advanced\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Advanced\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A few patterns that go beyond a single play/pause button.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"custom-position-controls\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#custom-position-controls\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Custom position controls\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{sound-position-slider}}\\\"],[13],[1,\\\" modifier turns any element into a scrubber bound to a sound's position. Point it at an identifier and it keeps the control and the playback in sync both ways. Drag to seek, and it tracks as the sound plays.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\",\\\"@hideSource\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\",true]],null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The same modifier works without a live sound, driven by plain \\\"],[10,\\\"code\\\"],[12],[1,\\\"@position\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"@duration\\\"],[13],[1,\\\" values. This is useful for rendering a static or server-supplied progress bar:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@position\\\",\\\"@duration\\\",\\\"@hideSource\\\"],[10000,50000,false]],null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"For a read-only bar, \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{sound-position-progress}}\\\"],[13],[1,\\\" sizes an element to the sound's position instead. It takes the same \\\"],[10,\\\"code\\\"],[12],[1,\\\"@position\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"@duration\\\"],[13],[1,\\\" fallbacks.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"div\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"sound-position-progress\\\"],[13],[1,\\\" @identifier}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\">\\\"],[13],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"div\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"building-a-play-queue\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#building-a-play-queue\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Building a play queue\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Because \\\"],[10,\\\"code\\\"],[12],[1,\\\"current-sound\\\"],[13],[1,\\\" and the \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio-ended\\\"],[13],[1,\\\" event are app-wide, a queue is just \\\\\\\"play the next thing when the current one ends.\\\\\\\" Here a list of URLs plays through in order:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,2],null,null,null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The pattern: keep your own ordered list, \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" the first item, and subscribe to \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio-ended\\\"],[13],[1,\\\" on the service to advance. See \\\"],[10,3],[14,6,\\\"/docs/event-monitoring\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Monitoring Events\\\"],[13],[1,\\\" for the full event list.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"prewarming-a-connection\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#prewarming-a-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Prewarming a connection\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"Howler\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"HLS\\\"],[13],[1,\\\" pull their library down as a lazy chunk, and \\\"],[10,\\\"code\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\" fetches the Cast SDK from \\\"],[10,\\\"code\\\"],[12],[1,\\\"gstatic.com\\\"],[13],[1,\\\". Whichever sound needs one first pays for that download before any audio is fetched, so if you know which is coming, warm it up first:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// e.g. a live stream that can rewind into a recorded HLS archive\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"prewarmConnection\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'HLS'\\\"],[13],[1,\\\");\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"It takes the name a connection is registered under and resolves once it's warm. Connections with nothing to download resolve immediately. \\\"],[10,3],[14,6,\\\"https://github.com/jkeen/ember-stereo/blob/main/ember-stereo/CUSTOM_CONNECTIONS.md\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Your own connections\\\"],[13],[1,\\\" become prewarmable by implementing \\\"],[10,\\\"code\\\"],[12],[1,\\\"static preload()\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"working-with-the-sound-directly\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#working-with-the-sound-directly\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Working with the Sound directly\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"For anything more involved than the helpers cover, reach for the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" object itself. Its lifecycle states, playback proxying, and connection swaps are documented in \\\"],[10,3],[14,6,\\\"/docs/playing-sounds\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,null,null],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/custom-position-control\\\",\\\"docs/manual-position-control\\\",\\\"docs/queued\\\",\\\"docs/proxy-example\\\"]]\",\n    \"moduleName\": \"docs/docs/advanced.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/browser-audio\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"browser-audio\" class=\"docs-md__h1\">Browser Audio</h1>\n      <p>Three things about audio on the web will bite you no matter which library you use: browsers disagree about formats, they block autoplay, and playback fails in ways you have to handle. <code>stereo</code> gives you a way through each.</p>\n  \n        <h2 id=\"audio-formats\" class=\"docs-md__h2\"><a href=\"#audio-formats\" class=\"heading-anchor\">Audio formats</a></h2>\n      <p>Different browsers support different <a href=\"https://caniuse.com/?search=audio%20format\"  class=\"docs-md__a\">audio formats</a>, and unless you're playing something universally supported like <code>mp3</code>, things get tricky.</p>\n  <p><a href=\"https://en.wikipedia.org/wiki/Opus_(audio_format)\"  class=\"docs-md__a\"><code>opus/ogg</code></a> is a fantastic audio format, but Safari and iOS don't care about it at all. <code>HLS</code> is a fantastic protocol for live streaming, but only Safari supports it natively, and the full featured <a href=\"https://github.com/video-dev/hls.js/\"  class=\"docs-md__a\"><code>hls.js</code></a> player that <code>stereo</code> provides a connection for runs everywhere except Safari and iOS. Doing anything fancy with audio on the web is still painful.</p>\n  <p>You'd probably rather serve listeners slimmer <code>.ogg</code> files or <code>hls</code> streams than <code>.mp3s</code>, without tracking that mess yourself.</p>\n  \n        <h3 id=\"this-is-how-you-do-it\" class=\"docs-md__h3\"><a href=\"#this-is-how-you-do-it\" class=\"heading-anchor\">This is how you do it</a></h3>\n      <p>Give <code>stereo</code> an array of urls in preferential order. It tries each url on each loaded connection and stops once one works.</p>\n  <p>To illustrate, here's this <a href=\"https://archive.org/details/KmartOctober1989\"  class=\"docs-md__a\">(incredible) digitized in-store cassette tape from K-Mart in 1989</a> from archive.org. The <code>ogg</code> version is <code>60M</code> and the <code>mp3</code> version is <code>200M</code>. Woof. The higher quality <code>60M</code> file is obviously preferable.</p>\n  \n  <p><Docs::TryMultipleUrls /></p>\n  <p>Looks like you're running {{docs/current-browser}} on {{docs/current-os}}</p>\n  \n        <h3 id=\"ogg\" class=\"docs-md__h3\"><a href=\"#ogg\" class=\"heading-anchor\">Ogg</a></h3>\n      <p>Here's what <Docs::CurrentBrowser /> for <Docs::CurrentOs /> told <code>ember-stereo</code> about the chances of this <code>ogg</code> file succeeding.</p>\n  \n  <p><Docs::StrategyBreakdown @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\"/></p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\"/></p>\n  \n        <h3 id=\"mp3\" class=\"docs-md__h3\"><a href=\"#mp3\" class=\"heading-anchor\">Mp3</a></h3>\n      <p>This for sure works on <Docs::CurrentBrowser /> for <Docs::CurrentOs />. Nothing to get excited about, but here are the details anyway:</p>\n  \n  <p><Docs::StrategyBreakdown @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\"/></p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\"/></p>\n  \n        <h2 id=\"autoplay-restrictions\" class=\"docs-md__h2\"><a href=\"#autoplay-restrictions\" class=\"heading-anchor\">Autoplay restrictions</a></h2>\n      <p>It used to be easy to play audio without autoplay blockers getting in the way. For those of us with good intentions, who aren't trying to do user-hostile things like play advertisements on page load, this is frustrating. Here's <a href=\"https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide\"  class=\"docs-md__a\">Mozilla's guide on autoplay</a> for the details.</p>\n  \n        <h3 id=\"checking-if-autoplay-is-allowed\" class=\"docs-md__h3\"><a href=\"#checking-if-autoplay-is-allowed\" class=\"heading-anchor\">Checking if autoplay is allowed</a></h3>\n      <p>You might want to check whether autoplay is allowed in your listener's browser and take extra steps if it isn't. Here's how.</p>\n  \n  <p><Docs::AutoplayChecking /></p>\n  \n        <h3 id=\"gotchas\" class=\"docs-md__h3\"><a href=\"#gotchas\" class=\"heading-anchor\">Gotchas</a></h3>\n      \n  <p><Docs::AutoplayGotchas /></p>\n  \n        <h2 id=\"error-handling\" class=\"docs-md__h2\"><a href=\"#error-handling\" class=\"heading-anchor\">Error handling</a></h2>\n      \n        <h3 id=\"through-the-template\" class=\"docs-md__h3\"><a href=\"#through-the-template\" class=\"heading-anchor\">Through the template</a></h3>\n      <p>Template action helpers don't throw when playback fails. Instead you check whether a sound errored, using a couple of helpers.</p>\n  \n  <p><Docs::TemplateErrorsExample /></p>\n  \n        <h3 id=\"through-the-service\" class=\"docs-md__h3\"><a href=\"#through-the-service\" class=\"heading-anchor\">Through the service</a></h3>\n      <p>Interacting with the service, you handle errors the way you'd expect.</p>\n  \n  <p><Docs::ServiceErrorsTryCatch /></p>\n  \n  <p><Docs::ServiceErrorsTryThen /></p>\n  \n  <p><Docs::ServiceErrorsSilenceError /></p>\n  \n  <p><Docs::ServiceErrorsThrowError /></p>\n  </div>\n  */\n  {\n    \"id\": \"by/coKAu\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"browser-audio\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Browser Audio\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Three things about audio on the web will bite you no matter which library you use: browsers disagree about formats, they block autoplay, and playback fails in ways you have to handle. \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" gives you a way through each.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"audio-formats\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#audio-formats\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Audio formats\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Different browsers support different \\\"],[10,3],[14,6,\\\"https://caniuse.com/?search=audio%20format\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"audio formats\\\"],[13],[1,\\\", and unless you're playing something universally supported like \\\"],[10,\\\"code\\\"],[12],[1,\\\"mp3\\\"],[13],[1,\\\", things get tricky.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,3],[14,6,\\\"https://en.wikipedia.org/wiki/Opus_(audio_format)\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"opus/ogg\\\"],[13],[13],[1,\\\" is a fantastic audio format, but Safari and iOS don't care about it at all. \\\"],[10,\\\"code\\\"],[12],[1,\\\"HLS\\\"],[13],[1,\\\" is a fantastic protocol for live streaming, but only Safari supports it natively, and the full featured \\\"],[10,3],[14,6,\\\"https://github.com/video-dev/hls.js/\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"hls.js\\\"],[13],[13],[1,\\\" player that \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" provides a connection for runs everywhere except Safari and iOS. Doing anything fancy with audio on the web is still painful.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"You'd probably rather serve listeners slimmer \\\"],[10,\\\"code\\\"],[12],[1,\\\".ogg\\\"],[13],[1,\\\" files or \\\"],[10,\\\"code\\\"],[12],[1,\\\"hls\\\"],[13],[1,\\\" streams than \\\"],[10,\\\"code\\\"],[12],[1,\\\".mp3s\\\"],[13],[1,\\\", without tracking that mess yourself.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"this-is-how-you-do-it\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#this-is-how-you-do-it\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"This is how you do it\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Give \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" an array of urls in preferential order. It tries each url on each loaded connection and stops once one works.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"To illustrate, here's this \\\"],[10,3],[14,6,\\\"https://archive.org/details/KmartOctober1989\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"(incredible) digitized in-store cassette tape from K-Mart in 1989\\\"],[13],[1,\\\" from archive.org. The \\\"],[10,\\\"code\\\"],[12],[1,\\\"ogg\\\"],[13],[1,\\\" version is \\\"],[10,\\\"code\\\"],[12],[1,\\\"60M\\\"],[13],[1,\\\" and the \\\"],[10,\\\"code\\\"],[12],[1,\\\"mp3\\\"],[13],[1,\\\" version is \\\"],[10,\\\"code\\\"],[12],[1,\\\"200M\\\"],[13],[1,\\\". Woof. The higher quality \\\"],[10,\\\"code\\\"],[12],[1,\\\"60M\\\"],[13],[1,\\\" file is obviously preferable.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,null,null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Looks like you're running \\\"],[1,[34,1]],[1,\\\" on \\\"],[1,[34,2]],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"ogg\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#ogg\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Ogg\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Here's what \\\"],[8,[39,1],null,null,null],[1,\\\" for \\\"],[8,[39,2],null,null,null],[1,\\\" told \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" about the chances of this \\\"],[10,\\\"code\\\"],[12],[1,\\\"ogg\\\"],[13],[1,\\\" file succeeding.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,4],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"mp3\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#mp3\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Mp3\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This for sure works on \\\"],[8,[39,1],null,null,null],[1,\\\" for \\\"],[8,[39,2],null,null,null],[1,\\\". Nothing to get excited about, but here are the details anyway:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,4],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"autoplay-restrictions\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#autoplay-restrictions\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Autoplay restrictions\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"It used to be easy to play audio without autoplay blockers getting in the way. For those of us with good intentions, who aren't trying to do user-hostile things like play advertisements on page load, this is frustrating. Here's \\\"],[10,3],[14,6,\\\"https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Mozilla's guide on autoplay\\\"],[13],[1,\\\" for the details.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"checking-if-autoplay-is-allowed\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#checking-if-autoplay-is-allowed\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Checking if autoplay is allowed\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You might want to check whether autoplay is allowed in your listener's browser and take extra steps if it isn't. Here's how.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,5],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"gotchas\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#gotchas\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Gotchas\\\"],[13],[13],[1,\\\"\\\\n    \\\\n\\\"],[10,2],[12],[8,[39,6],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"error-handling\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#error-handling\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Error handling\\\"],[13],[13],[1,\\\"\\\\n    \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"through-the-template\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#through-the-template\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Through the template\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Template action helpers don't throw when playback fails. Instead you check whether a sound errored, using a couple of helpers.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,7],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"through-the-service\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#through-the-service\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Through the service\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Interacting with the service, you handle errors the way you'd expect.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,8],null,null,null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,9],null,null,null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,10],null,null,null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,11],null,null,null],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/try-multiple-urls\\\",\\\"docs/current-browser\\\",\\\"docs/current-os\\\",\\\"docs/strategy-breakdown\\\",\\\"docs/stereo-player\\\",\\\"docs/autoplay-checking\\\",\\\"docs/autoplay-gotchas\\\",\\\"docs/template-errors-example\\\",\\\"docs/service-errors-try-catch\\\",\\\"docs/service-errors-try-then\\\",\\\"docs/service-errors-silence-error\\\",\\\"docs/service-errors-throw-error\\\"]]\",\n    \"moduleName\": \"docs/docs/browser-audio.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/casting\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"casting-airplay-chromecast-\" class=\"docs-md__h1\">Casting (AirPlay & Chromecast)</h1>\n      <p>Casting sends the audio to an AirPlay receiver or a Chromecast device instead of the local speakers. <code>ember-stereo</code> treats the remote device as another connection, that it automatically loads and injects when needed.</p>\n  \n        <h2 id=\"enabling-casting\" class=\"docs-md__h2\"><a href=\"#enabling-casting\" class=\"heading-anchor\">Enabling casting</a></h2>\n      \n          <ul class=\"docs-list-disc\"><li><strong>AirPlay</strong> uses Safari's own APIs and loads nothing extra.</li>\n  <li><strong>Chromecast</strong> lazily loads the Google Cast SDK from <code>gstatic.com</code> the first time a <code>&#123;&#123;cast-button&#125;&#125;</code> or <code>&#123;&#123;casting-available&#125;&#125;</code> renders.</li>\n  </ul>\n        <p>On Chrome, <code>&#123;&#123;casting-available&#125;&#125;</code> tracks whether a Chromecast is on the network, and the button disables itself when there is none. On Safari it only means AirPlay exists. WebKit reports receivers as unavailable even when the picker can find them, so <code>ember-stereo</code> ignores that signal and lets the picker show its own empty state.</p>\n  \n        <h2 id=\"sound-casturl\" class=\"docs-md__h2\"><a href=\"#sound-casturl\" class=\"heading-anchor\"><code>sound.castUrl</code></a></h2>\n      <p>When you cast the device fetches the audio directly, meaning if it can't reach it without your app's session or auth headers it won't play. Set <code>sound.castUrl</code> to a public or signed variant of the stream if you need it.</p>\n  \n        <h3 id=\"updating-metadata-mid-cast\" class=\"docs-md__h3\"><a href=\"#updating-metadata-mid-cast\" class=\"heading-anchor\">Updating metadata mid-cast</a></h3>\n      <p><strong>AirPlay</strong> reads metadata from the OS, so a change reaches the receiver as soon as it reaches the lock screen.</p>\n  <p><strong>Chromecast</strong> is handed metadata in the load request and keeps it, so set <code>sound.metadata</code> <strong>before</strong> casting. Changing it afterwards updates the lock screen and your own UI but not the device, and only a reload would refresh it. A live stream whose now-playing changes mid-listen keeps the title it started with until the next cast.</p>\n  \n        <h2 id=\"the-cast-button\" class=\"docs-md__h2\"><a href=\"#the-cast-button\" class=\"heading-anchor\">The cast button</a></h2>\n      <p><code>&#123;&#123;cast-button&#125;&#125;</code> turns a <code>&lt;button&gt;</code> into a cast control. Clicking it opens the device picker. The button disables itself when <code>&#123;&#123;casting-available&#125;&#125;</code> is false, and gets a <code>casting</code> class while connected, so you can style the connected state.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;button&#x27;</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">cast-button</span>&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\">&gt;</span>\n    Cast\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span></span>\n  </code></pre>\n  <p>Casting always follows the current sound. Whatever is playing when you pick a device moves to it, and anything you play afterwards goes there too, until you disconnect.</p>\n  \n        <h2 id=\"reading-cast-state-in-templates\" class=\"docs-md__h2\"><a href=\"#reading-cast-state-in-templates\" class=\"heading-anchor\">Reading cast state in templates</a></h2>\n      \n          <ul class=\"docs-list-disc\"><li><code>&#123;&#123;casting-available&#125;&#125;</code> - true when casting can be started right now. On Chrome that means a Chromecast is on the network. On Safari it is true whenever AirPlay exists.</li>\n  <li><code>&#123;&#123;is-casting&#125;&#125;</code> - true while the audio plays on a remote device.</li>\n  </ul>\n        <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;button&#x27;</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">cast-button</span>&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\">&gt;</span>\n    </span><span class=\"hljs-template-tag\">&#123;&#123;#<span class=\"hljs-name\"><span class=\"hljs-built_in\">if</span></span> (<span class=\"hljs-name\">is-casting</span>)&#125;&#125;</span><span class=\"language-xml\">\n      Casting…\n    </span><span class=\"hljs-template-tag\">&#123;&#123;<span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (casting-available)&#125;&#125;</span><span class=\"language-xml\">\n      Cast\n    </span><span class=\"hljs-template-tag\">&#123;&#123;<span class=\"hljs-keyword\">else</span>&#125;&#125;</span><span class=\"language-xml\">\n      No cast targets available\n    </span><span class=\"hljs-template-tag\">&#123;&#123;/<span class=\"hljs-name\"><span class=\"hljs-built_in\">if</span></span>&#125;&#125;</span><span class=\"language-xml\">\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span></span>\n  </code></pre>\n  \n        <h2 id=\"live-demo\" class=\"docs-md__h2\"><a href=\"#live-demo\" class=\"heading-anchor\">Live demo</a></h2>\n      <p>Stream:</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://streaming.koop.org/stream.aac\" /></p>\n  <p>Fixed audio:</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://audio.wnyc.org/bl/bl011421dpod.mp3\" /></p>\n  \n  <p><Docs::CastPlayer /></p>\n  \n        <h2 id=\"the-service-api\" class=\"docs-md__h2\"><a href=\"#the-service-api\" class=\"heading-anchor\">The service API</a></h2>\n      <p>The <code>stereo</code> service exposes:</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>isCastingAvailable</code> - <code>true</code> when casting can be started</li>\n  <li><code>isCasting</code> - <code>true</code> when audio is playing on a remote device</li>\n  <li><code>castDeviceName</code> - the device's name. Chromecast provides one, AirPlay doesn't, so this can be <code>null</code></li>\n  <li><code>castKind</code> - <code>&#39;airplay&#39;</code>, <code>&#39;chromecast&#39;</code>, or <code>null</code></li>\n  <li><code>castIconName</code> - <code>&#39;cast&#39;</code>, <code>&#39;airplay&#39;</code>, or <code>null</code>, for picking the right icon</li>\n  <li><code>supportedCastType</code> - which kind of casting this browser can do at all (<code>&#39;airplay&#39;</code>, <code>&#39;chromecast&#39;</code>, or <code>null</code>), even before any device is found</li>\n  <li><code>showCastMenu()</code> - open the device picker (what <code>&#123;&#123;cast-button&#125;&#125;</code> calls)</li>\n  <li><code>stopCasting()</code> - disconnect and return playback to the local device</li>\n  </ul>\n        \n        <h2 id=\"events\" class=\"docs-md__h2\"><a href=\"#events\" class=\"heading-anchor\">Events</a></h2>\n      <p>The service fires four cast events as casting starts and stops. See <a href=\"/docs/event-monitoring#casting-events\"  class=\"docs-md__a\">Events</a>.</p>\n  <p>Switching feeds mid-stream while casting needs nothing special from you. A remote device is just another connection, so <code>currentSound</code> and <code>swap</code> behave exactly as they do locally and your player code never needs a \"we're casting now\" branch.</p>\n  \n        <h2 id=\"which-airplay-receivers-actually-work\" class=\"docs-md__h2\"><a href=\"#which-airplay-receivers-actually-work\" class=\"heading-anchor\">Which AirPlay receivers actually work</a></h2>\n      <p>Not every device that shows up in Safari desktop's picker can play web audio.</p>\n  <p>AirPlay 2 receivers (Apple TV, HomePod, most hardware since about 2018) work everywhere. Audio-only receivers of the AirPort Express / 2011–2017 AV receiver vintage work perfectly from mobile Safari but not desktop Safari, and the failure is silent (which is very annoying). I can't seem to find a way to work around it, so beware that edge case.</p>\n  </div>\n  */\n  {\n    \"id\": \"Tmsy7n9k\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"casting-airplay-chromecast-\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Casting (AirPlay & Chromecast)\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Casting sends the audio to an AirPlay receiver or a Chromecast device instead of the local speakers. \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" treats the remote device as another connection, that it automatically loads and injects when needed.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"enabling-casting\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#enabling-casting\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Enabling casting\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"AirPlay\\\"],[13],[1,\\\" uses Safari's own APIs and loads nothing extra.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\" lazily loads the Google Cast SDK from \\\"],[10,\\\"code\\\"],[12],[1,\\\"gstatic.com\\\"],[13],[1,\\\" the first time a \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{cast-button}}\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" renders.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"On Chrome, \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" tracks whether a Chromecast is on the network, and the button disables itself when there is none. On Safari it only means AirPlay exists. WebKit reports receivers as unavailable even when the picker can find them, so \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" ignores that signal and lets the picker show its own empty state.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"sound-casturl\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#sound-casturl\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"When you cast the device fetches the audio directly, meaning if it can't reach it without your app's session or auth headers it won't play. Set \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[1,\\\" to a public or signed variant of the stream if you need it.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"updating-metadata-mid-cast\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#updating-metadata-mid-cast\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Updating metadata mid-cast\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"AirPlay\\\"],[13],[1,\\\" reads metadata from the OS, so a change reaches the receiver as soon as it reaches the lock screen.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\" is handed metadata in the load request and keeps it, so set \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.metadata\\\"],[13],[1,\\\" \\\"],[10,\\\"strong\\\"],[12],[1,\\\"before\\\"],[13],[1,\\\" casting. Changing it afterwards updates the lock screen and your own UI but not the device, and only a reload would refresh it. A live stream whose now-playing changes mid-listen keeps the title it started with until the next cast.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"the-cast-button\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#the-cast-button\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"The cast button\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"{{cast-button}}\\\"],[13],[1,\\\" turns a \\\"],[10,\\\"code\\\"],[12],[1,\\\"<button>\\\"],[13],[1,\\\" into a cast control. Clicking it opens the device picker. The button disables itself when \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" is false, and gets a \\\"],[10,\\\"code\\\"],[12],[1,\\\"casting\\\"],[13],[1,\\\" class while connected, so you can style the connected state.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'button'\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"cast-button\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\">\\\"],[13],[1,\\\"\\\\n  Cast\\\\n\\\"],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Casting always follows the current sound. Whatever is playing when you pick a device moves to it, and anything you play afterwards goes there too, until you disconnect.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"reading-cast-state-in-templates\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#reading-cast-state-in-templates\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Reading cast state in templates\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" - true when casting can be started right now. On Chrome that means a Chromecast is on the network. On Safari it is true whenever AirPlay exists.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"{{is-casting}}\\\"],[13],[1,\\\" - true while the audio plays on a remote device.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'button'\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"cast-button\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\">\\\"],[13],[1,\\\"\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{#\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[10,1],[14,0,\\\"hljs-built_in\\\"],[12],[1,\\\"if\\\"],[13],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"is-casting\\\"],[13],[1,\\\")}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n    Casting…\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"else\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (casting-available)}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n    Cast\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"else\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n    No cast targets available\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{/\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[10,1],[14,0,\\\"hljs-built_in\\\"],[12],[1,\\\"if\\\"],[13],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"live-demo\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#live-demo\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Live demo\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Stream:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"https://streaming.koop.org/stream.aac\\\"]],null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Fixed audio:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"https://audio.wnyc.org/bl/bl011421dpod.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"the-service-api\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#the-service-api\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"The service API\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service exposes:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isCastingAvailable\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"true\\\"],[13],[1,\\\" when casting can be started\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isCasting\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"true\\\"],[13],[1,\\\" when audio is playing on a remote device\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castDeviceName\\\"],[13],[1,\\\" - the device's name. Chromecast provides one, AirPlay doesn't, so this can be \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castKind\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"'airplay'\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"'chromecast'\\\"],[13],[1,\\\", or \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castIconName\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"'cast'\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"'airplay'\\\"],[13],[1,\\\", or \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\", for picking the right icon\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"supportedCastType\\\"],[13],[1,\\\" - which kind of casting this browser can do at all (\\\"],[10,\\\"code\\\"],[12],[1,\\\"'airplay'\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"'chromecast'\\\"],[13],[1,\\\", or \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\"), even before any device is found\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"showCastMenu()\\\"],[13],[1,\\\" - open the device picker (what \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{cast-button}}\\\"],[13],[1,\\\" calls)\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stopCasting()\\\"],[13],[1,\\\" - disconnect and return playback to the local device\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"events\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#events\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Events\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The service fires four cast events as casting starts and stops. See \\\"],[10,3],[14,6,\\\"/docs/event-monitoring#casting-events\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Events\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Switching feeds mid-stream while casting needs nothing special from you. A remote device is just another connection, so \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentSound\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"swap\\\"],[13],[1,\\\" behave exactly as they do locally and your player code never needs a \\\\\\\"we're casting now\\\\\\\" branch.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"which-airplay-receivers-actually-work\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#which-airplay-receivers-actually-work\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Which AirPlay receivers actually work\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Not every device that shows up in Safari desktop's picker can play web audio.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"AirPlay 2 receivers (Apple TV, HomePod, most hardware since about 2018) work everywhere. Audio-only receivers of the AirPort Express / 2011–2017 AV receiver vintage work perfectly from mobile Safari but not desktop Safari, and the failure is silent (which is very annoying). I can't seem to find a way to work around it, so beware that edge case.\\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/stereo-player\\\",\\\"docs/cast-player\\\"]]\",\n    \"moduleName\": \"docs/docs/casting.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/debugging\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"debugging\" class=\"docs-md__h1\">Debugging</h1>\n      <p><code>ember-stereo</code> logs its internals through the <a href=\"https://github.com/debug-js/debug\"  class=\"docs-md__a\"><code>debug</code></a> package, namespaced under <code>ember-stereo:*</code>. Nothing is logged until you opt in, so production stays quiet.</p>\n  \n        <h2 id=\"turning-on-logging\" class=\"docs-md__h2\"><a href=\"#turning-on-logging\" class=\"heading-anchor\">Turning on logging</a></h2>\n      <p>Set <code>localStorage.debug</code> in your browser console and reload:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// Everything ember-stereo has to say</span>\n  <span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:*&#x27;</span>;\n  \n  <span class=\"hljs-comment\">// Just one subsystem</span>\n  <span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:strategizer&#x27;</span>;\n  \n  <span class=\"hljs-comment\">// A few at once</span>\n  <span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:sound,ember-stereo:service&#x27;</span>;\n  </code></pre>\n  <p>To turn it back off: <code>localStorage.removeItem(&#39;debug&#39;)</code> (then reload).</p>\n  <p><code>audio-position-changed</code> fires about twenty times a second, so it logs under its own namespace. Leave it out when you're reading anything else:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:*,-ember-stereo:position&#x27;</span>;\n  </code></pre>\n  \n        <h2 id=\"the-namespaces\" class=\"docs-md__h2\"><a href=\"#the-namespaces\" class=\"heading-anchor\">The namespaces</a></h2>\n      <table class=\"docs-table-auto\">\n  <thead>\n  <tr class=\"docs-table-row\">\n  <th class=\"docs-border docs-px-4 docs-py-2\">Namespace</th>\n  <th class=\"docs-border docs-px-4 docs-py-2\">What it traces</th>\n  </tr>\n  </thead>\n  <tbody><tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:service</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The <code>stereo</code> service. Load/play requests, current-sound changes.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:position</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">Position ticks, split out because they drown everything else.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:sound</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">A <code>Sound</code>'s lifecycle.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:strategizer</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">How a URL is turned into an ordered list of connections to try.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:canPlay</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">Per-connection format/platform decisions during strategy building.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:one-at-at-time</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The \"only one sound plays\" arbitration.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:cast</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">Everything casting: availability, pickers, engage/disengage, swaps.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:shared-audio-access</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The shared audio element and its single-owner handoff.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:google-cast-sdk</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The Cast SDK session and its single-owner handoff.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:fake-element</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The test-environment fake media element (see <a href=\"/docs/testing\"  class=\"docs-md__a\">Testing</a>).</td>\n  </tr>\n  </tbody></table>\n  \n        <h2 id=\"inspecting-state-directly\" class=\"docs-md__h2\"><a href=\"#inspecting-state-directly\" class=\"heading-anchor\">Inspecting state directly</a></h2>\n      <p>The service also exposes a few read-only getters that are handy from the console:</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>stereo.currentSound</code> - the <code>Sound</code> currently loaded.</li>\n  <li><code>stereo.sounds</code> - every <code>Sound</code> asked to load, including pending and errored ones. Filter it for a subset, for example <code>stereo.sounds.filter((s) =&gt; s.isErrored)</code>.</li>\n  <li><code>stereo.connections</code> - the active connection instances, in priority order.</li>\n  <li><code>stereo.findSound(url).errors</code> - that sound's load failures, one per attempted connection.</li>\n  </ul>\n        <p>When a load fails, the error carries a <code>debugInfo</code> array describing every strategy that was tried and why each one was rejected.</p>\n  \n        <h2 id=\"gstatic-com-errors-in-the-console\" class=\"docs-md__h2\"><a href=\"#gstatic-com-errors-in-the-console\" class=\"heading-anchor\"><code>gstatic.com</code> errors in the console</a></h2>\n      <p>Rendering a cast control where no Cast receiver exists (Electron, a locked-down network) logs <code>ERR_UNEXPECTED</code> or <code>ERR_FAILED</code> fetching the Cast SDK. The loader fails gracefully and casting stays unavailable. Apps that never render casting UI never request it.</p>\n  </div>\n  */\n  {\n    \"id\": \"Uyv4xE5L\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"debugging\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Debugging\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" logs its internals through the \\\"],[10,3],[14,6,\\\"https://github.com/debug-js/debug\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"debug\\\"],[13],[13],[1,\\\" package, namespaced under \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:*\\\"],[13],[1,\\\". Nothing is logged until you opt in, so production stays quiet.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"turning-on-logging\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#turning-on-logging\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Turning on logging\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Set \\\"],[10,\\\"code\\\"],[12],[1,\\\"localStorage.debug\\\"],[13],[1,\\\" in your browser console and reload:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// Everything ember-stereo has to say\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:*'\\\"],[13],[1,\\\";\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// Just one subsystem\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:strategizer'\\\"],[13],[1,\\\";\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// A few at once\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:sound,ember-stereo:service'\\\"],[13],[1,\\\";\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"To turn it back off: \\\"],[10,\\\"code\\\"],[12],[1,\\\"localStorage.removeItem('debug')\\\"],[13],[1,\\\" (then reload).\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-position-changed\\\"],[13],[1,\\\" fires about twenty times a second, so it logs under its own namespace. Leave it out when you're reading anything else:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:*,-ember-stereo:position'\\\"],[13],[1,\\\";\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"the-namespaces\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#the-namespaces\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"The namespaces\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,\\\"table\\\"],[14,0,\\\"docs-table-auto\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Namespace\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"What it traces\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tbody\\\"],[12],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:service\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service. Load/play requests, current-sound changes.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:position\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Position ticks, split out because they drown everything else.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:sound\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"A \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\"'s lifecycle.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:strategizer\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"How a URL is turned into an ordered list of connections to try.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:canPlay\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Per-connection format/platform decisions during strategy building.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:one-at-at-time\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The \\\\\\\"only one sound plays\\\\\\\" arbitration.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:cast\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Everything casting: availability, pickers, engage/disengage, swaps.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:shared-audio-access\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The shared audio element and its single-owner handoff.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:google-cast-sdk\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The Cast SDK session and its single-owner handoff.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:fake-element\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The test-environment fake media element (see \\\"],[10,3],[14,6,\\\"/docs/testing\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Testing\\\"],[13],[1,\\\").\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"inspecting-state-directly\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#inspecting-state-directly\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Inspecting state directly\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The service also exposes a few read-only getters that are handy from the console:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.currentSound\\\"],[13],[1,\\\" - the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" currently loaded.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds\\\"],[13],[1,\\\" - every \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" asked to load, including pending and errored ones. Filter it for a subset, for example \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isErrored)\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.connections\\\"],[13],[1,\\\" - the active connection instances, in priority order.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url).errors\\\"],[13],[1,\\\" - that sound's load failures, one per attempted connection.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"When a load fails, the error carries a \\\"],[10,\\\"code\\\"],[12],[1,\\\"debugInfo\\\"],[13],[1,\\\" array describing every strategy that was tried and why each one was rejected.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"gstatic-com-errors-in-the-console\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#gstatic-com-errors-in-the-console\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"gstatic.com\\\"],[13],[1,\\\" errors in the console\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Rendering a cast control where no Cast receiver exists (Electron, a locked-down network) logs \\\"],[10,\\\"code\\\"],[12],[1,\\\"ERR_UNEXPECTED\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\"ERR_FAILED\\\"],[13],[1,\\\" fetching the Cast SDK. The loader fails gracefully and casting stays unavailable. Apps that never render casting UI never request it.\\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[]]\",\n    \"moduleName\": \"docs/docs/debugging.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/event-monitoring\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"events\" class=\"docs-md__h1\">Events</h1>\n      <p>You can monitor events on both the <code>stereo</code> service for when any sound emits an event, or on an individual sound for when that specific sound emits an event. For example,</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// Log when any sound starts playing</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-played&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">`<span class=\"hljs-subst\">${sound.url}</span> started playing`</span>);\n  });\n  \n  <span class=\"hljs-keyword\">let</span> sound = <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">url</span>);\n  sound.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-ended&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">sendEvent</span>(<span class=\"hljs-string\">&#x27;finished-listening&#x27;</span>, {\n      <span class=\"hljs-attr\">episodeId</span>: sound.<span class=\"hljs-property\">metadata</span>.<span class=\"hljs-property\">episodeId</span>,\n    });\n  });\n  \n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;current-sound-interrupted&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">sendEvent</span>(<span class=\"hljs-string\">&#x27;quit-listening&#x27;</span>, {\n      <span class=\"hljs-attr\">episodeId</span>: sound.<span class=\"hljs-property\">metadata</span>.<span class=\"hljs-property\">episodeId</span>,\n      <span class=\"hljs-attr\">position</span>: sound.<span class=\"hljs-property\">position</span>,\n    });\n  });\n  </code></pre>\n  <p><code>findSound</code> returns immediately, so you can attach listeners before the sound has loaded.</p>\n  \n        <h3 id=\"example\" class=\"docs-md__h3\"><a href=\"#example\" class=\"heading-anchor\">Example</a></h3>\n      <p>Play around with this one and watch the events fire below. Clicking an event puts it in your javascript console.</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"/sounds/internet-on-computers.mp3\" /></p>\n  \n  <p><Docs::EventDisplay @url=\"/sounds/internet-on-computers.mp3\" /></p>\n  \n        <h3 id=\"triggered-on-both-the-sound-and-relayed-through-the-stereo-service\" class=\"docs-md__h3\"><a href=\"#triggered-on-both-the-sound-and-relayed-through-the-stereo-service\" class=\"heading-anchor\">Triggered on both the sound and relayed through the stereo service</a></h3>\n      \n          <ul class=\"docs-list-disc\"><li><code>audio-played</code> ({ sound }) - the sound started playing</li>\n  <li><code>audio-paused</code> ({ sound }) - the sound was paused</li>\n  <li><code>audio-ended</code> ({ sound }) - the sound finished playing</li>\n  <li><code>audio-load-error</code> ({ sound }) - loading sound failed</li>\n  <li><code>audio-ready</code> ({ sound }) - the sound is ready to play</li>\n  <li><code>audio-will-rewind</code> ({sound, currentPosition, newPosition}) - fired before rewinding a sound</li>\n  <li><code>audio-will-fast-forward</code> ({sound, currentPosition, newPosition}) - fired before fast-forwarding a sound</li>\n  <li><code>audio-position-will-change</code> ({sound, currentPosition, newPosition}) - fired before audio position change</li>\n  <li><code>audio-loading</code> ({ sound }) - the sound started loading</li>\n  <li><code>audio-blocked</code> ({ sound }) - the browser blocked autoplay, so user input is needed</li>\n  <li><code>audio-duration-changed</code> ({ sound }) - the sound's duration changed</li>\n  <li><code>audio-metadata-changed</code> ({ old, new, sound }) - the sound's metadata was replaced</li>\n  <li><code>audio-position-changed</code> ({sound}) - the playing sound's position moved. Polled about every 50ms while the page is visible, and every 250ms while it's hidden, since nothing is painting then. It fires only when the position actually changes, so a paused or stalled sound is quiet.</li>\n  </ul>\n        \n        <h3 id=\"stereo-service-only-events\" class=\"docs-md__h3\"><a href=\"#stereo-service-only-events\" class=\"heading-anchor\">Stereo service-only events</a></h3>\n      \n          <ul class=\"docs-list-disc\"><li><code>current-sound-changed</code> ({sound, previousSound}) - triggered when the current sound changes. On initial play, previousSound will be undefined.</li>\n  <li><code>current-sound-interrupted</code> ({sound, previousSound}) - triggered when a sound has been playing and a new one takes its place by being played, pausing the first one</li>\n  <li><code>new-load-request</code> ({loadPromise, urlsOrPromise, options}) - triggered whenever <code>.load</code> or <code>.play</code> is called.</li>\n  <li><code>pre-load</code> (urlsToTry) - triggered whenever <code>.load</code> or <code>.play</code> is called.</li>\n  <li><code>volume-change</code> (volume) - the service volume was set</li>\n  <li><code>playback-speed-change</code> (speed) - the service playback speed was set</li>\n  </ul>\n        \n        <h3 id=\"casting-events\" class=\"docs-md__h3\"><a href=\"#casting-events\" class=\"heading-anchor\">Casting events</a></h3>\n      <p>These fire as casting connects and disconnects. See <a href=\"/docs/casting\"  class=\"docs-md__a\">Casting</a>.</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>audio-cast-availability-changed</code> - a cast device appeared or disappeared</li>\n  <li><code>audio-cast-connecting</code> - connecting to a device</li>\n  <li><code>audio-cast-connected</code> - audio is now playing on the device</li>\n  <li><code>audio-cast-disconnected</code> - playback returned to the local device</li>\n  </ul>\n        </div>\n  */\n  {\n    \"id\": \"3udYWVr0\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"events\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Events\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You can monitor events on both the \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service for when any sound emits an event, or on an individual sound for when that specific sound emits an event. For example,\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// Log when any sound starts playing\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-played'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"console\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"log\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"`\\\"],[10,1],[14,0,\\\"hljs-subst\\\"],[12],[1,\\\"${sound.url}\\\"],[13],[1,\\\" started playing`\\\"],[13],[1,\\\");\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" sound = \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\");\\\\nsound.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-ended'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"sendEvent\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'finished-listening'\\\"],[13],[1,\\\", {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\": sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\",\\\\n  });\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'current-sound-interrupted'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"sendEvent\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'quit-listening'\\\"],[13],[1,\\\", {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\": sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\",\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\": sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\",\\\\n  });\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\" returns immediately, so you can attach listeners before the sound has loaded.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"example\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#example\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Example\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Play around with this one and watch the events fire below. Clicking an event puts it in your javascript console.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"/sounds/internet-on-computers.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@url\\\"],[\\\"/sounds/internet-on-computers.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"triggered-on-both-the-sound-and-relayed-through-the-stereo-service\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#triggered-on-both-the-sound-and-relayed-through-the-stereo-service\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Triggered on both the sound and relayed through the stereo service\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-played\\\"],[13],[1,\\\" ({ sound }) - the sound started playing\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-paused\\\"],[13],[1,\\\" ({ sound }) - the sound was paused\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-ended\\\"],[13],[1,\\\" ({ sound }) - the sound finished playing\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-load-error\\\"],[13],[1,\\\" ({ sound }) - loading sound failed\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-ready\\\"],[13],[1,\\\" ({ sound }) - the sound is ready to play\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-will-rewind\\\"],[13],[1,\\\" ({sound, currentPosition, newPosition}) - fired before rewinding a sound\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-will-fast-forward\\\"],[13],[1,\\\" ({sound, currentPosition, newPosition}) - fired before fast-forwarding a sound\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-position-will-change\\\"],[13],[1,\\\" ({sound, currentPosition, newPosition}) - fired before audio position change\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-loading\\\"],[13],[1,\\\" ({ sound }) - the sound started loading\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-blocked\\\"],[13],[1,\\\" ({ sound }) - the browser blocked autoplay, so user input is needed\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-duration-changed\\\"],[13],[1,\\\" ({ sound }) - the sound's duration changed\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-metadata-changed\\\"],[13],[1,\\\" ({ old, new, sound }) - the sound's metadata was replaced\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-position-changed\\\"],[13],[1,\\\" ({sound}) - the playing sound's position moved. Polled about every 50ms while the page is visible, and every 250ms while it's hidden, since nothing is painting then. It fires only when the position actually changes, so a paused or stalled sound is quiet.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"stereo-service-only-events\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#stereo-service-only-events\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Stereo service-only events\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"current-sound-changed\\\"],[13],[1,\\\" ({sound, previousSound}) - triggered when the current sound changes. On initial play, previousSound will be undefined.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"current-sound-interrupted\\\"],[13],[1,\\\" ({sound, previousSound}) - triggered when a sound has been playing and a new one takes its place by being played, pausing the first one\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"new-load-request\\\"],[13],[1,\\\" ({loadPromise, urlsOrPromise, options}) - triggered whenever \\\"],[10,\\\"code\\\"],[12],[1,\\\".load\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\".play\\\"],[13],[1,\\\" is called.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"pre-load\\\"],[13],[1,\\\" (urlsToTry) - triggered whenever \\\"],[10,\\\"code\\\"],[12],[1,\\\".load\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\".play\\\"],[13],[1,\\\" is called.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"volume-change\\\"],[13],[1,\\\" (volume) - the service volume was set\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"playback-speed-change\\\"],[13],[1,\\\" (speed) - the service playback speed was set\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"casting-events\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#casting-events\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Casting events\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"These fire as casting connects and disconnects. See \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Casting\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-availability-changed\\\"],[13],[1,\\\" - a cast device appeared or disappeared\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-connecting\\\"],[13],[1,\\\" - connecting to a device\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-connected\\\"],[13],[1,\\\" - audio is now playing on the device\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-disconnected\\\"],[13],[1,\\\" - playback returned to the local device\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[13]],[],false,[\\\"docs/stereo-player\\\",\\\"docs/event-display\\\"]]\",\n    \"moduleName\": \"docs/docs/event-monitoring.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h3 id=\"ember-stereo\" class=\"docs-md__h3\"><a href=\"#ember-stereo\" class=\"heading-anchor\"><strong><code>ember-stereo</code></strong></a></h3>\n      \n  <p><span class=\"text-xl\">is an addon that makes it easy to reactively handle all sorts of audio files in your ember app.</span></p>\n  \n  <p><Docs::AttentionGetter /></p>\n  \n        <h1 id=\"install\" class=\"docs-md__h1\">Install</h1>\n      <pre class=\"docs-md__code\"><code class=\"language-shell\">ember install ember-stereo\n  </code></pre>\n  \n        <h2 id=\"connections\" class=\"docs-md__h2\"><a href=\"#connections\" class=\"heading-anchor\">Connections</a></h2>\n      <p>A connection is a plugin that knows how to play a particular kind of audio. Given a URL the service tries each one in turn until one works, always starting with a native <code>&lt;audio&gt;</code> element.</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>NativeAudio</code> - the browser's own <code>&lt;audio&gt;</code>. Plays whatever the browser supports, and goes first on mobile.</li>\n  <li><code>Howler</code> - <a href=\"https://github.com/goldfire/howler.js\"  class=\"docs-md__a\">howler.js</a>.</li>\n  <li><code>HLS</code> - <a href=\"https://github.com/video-dev/hls.js/\"  class=\"docs-md__a\">HLS.js</a>, for <a href=\"https://caniuse.com/http-live-streaming\"  class=\"docs-md__a\">HLS streams</a>.</li>\n  </ul>\n        <p>List the ones you want in <code>environment.js</code>, in the order to try them:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\">  <span class=\"hljs-attr\">emberStereo</span>: {\n      <span class=\"hljs-attr\">initialVolume</span>: <span class=\"hljs-number\">100</span>, <span class=\"hljs-comment\">// default = 100</span>\n      <span class=\"hljs-attr\">silenceErrors</span>: <span class=\"hljs-literal\">false</span>, <span class=\"hljs-comment\">// true = handle audio errors inline instead of throwing</span>\n      <span class=\"hljs-attr\">connections</span>: [ <span class=\"hljs-comment\">// default = &#x27;NativeAudio&#x27; only</span>\n        {<span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&#x27;NativeAudio&#x27;</span>},\n        {<span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&#x27;Howler&#x27;</span>},\n        {<span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&#x27;HLS&#x27;</span>}\n      ]\n    }\n  </code></pre>\n  <p><a href=\"/docs/casting\"  class=\"docs-md__a\">Casting</a> adds two more connections, which the service wires up automatically when needed.</p>\n  \n        <h2 id=\"history\" class=\"docs-md__h2\"><a href=\"#history\" class=\"heading-anchor\">History</a></h2>\n      <p>This project started as <a href=\"http://github.com/nypublicradio/ember-hifi\"  class=\"docs-md__a\"><code>ember-hifi</code></a> in 2016, an open source audio library funded by New York Public Radio and built by me (<a href=\"http://github.com/jkeen\"  class=\"docs-md__a\">Jeff Keen</a>) and my pal and former WNYC engineer <a href=\"http://github.com/noslouch\"  class=\"docs-md__a\">Brian Whitton</a>.</p>\n  </div>\n  */\n  {\n    \"id\": \"aIBKHDwu\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"ember-stereo\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#ember-stereo\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[13],[13],[13],[1,\\\"\\\\n    \\\\n\\\"],[10,2],[12],[10,1],[14,0,\\\"text-xl\\\"],[12],[1,\\\"is an addon that makes it easy to reactively handle all sorts of audio files in your ember app.\\\"],[13],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"install\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Install\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-shell\\\"],[12],[1,\\\"ember install ember-stereo\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"connections\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#connections\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Connections\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A connection is a plugin that knows how to play a particular kind of audio. Given a URL the service tries each one in turn until one works, always starting with a native \\\"],[10,\\\"code\\\"],[12],[1,\\\"<audio>\\\"],[13],[1,\\\" element.\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"NativeAudio\\\"],[13],[1,\\\" - the browser's own \\\"],[10,\\\"code\\\"],[12],[1,\\\"<audio>\\\"],[13],[1,\\\". Plays whatever the browser supports, and goes first on mobile.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Howler\\\"],[13],[1,\\\" - \\\"],[10,3],[14,6,\\\"https://github.com/goldfire/howler.js\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"howler.js\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"HLS\\\"],[13],[1,\\\" - \\\"],[10,3],[14,6,\\\"https://github.com/video-dev/hls.js/\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"HLS.js\\\"],[13],[1,\\\", for \\\"],[10,3],[14,6,\\\"https://caniuse.com/http-live-streaming\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"HLS streams\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"List the ones you want in \\\"],[10,\\\"code\\\"],[12],[1,\\\"environment.js\\\"],[13],[1,\\\", in the order to try them:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[1,\\\"  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"emberStereo\\\"],[13],[1,\\\": {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"initialVolume\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-number\\\"],[12],[1,\\\"100\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// default = 100\\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"silenceErrors\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-literal\\\"],[12],[1,\\\"false\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// true = handle audio errors inline instead of throwing\\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"connections\\\"],[13],[1,\\\": [ \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// default = 'NativeAudio' only\\\"],[13],[1,\\\"\\\\n      {\\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'NativeAudio'\\\"],[13],[1,\\\"},\\\\n      {\\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Howler'\\\"],[13],[1,\\\"},\\\\n      {\\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'HLS'\\\"],[13],[1,\\\"}\\\\n    ]\\\\n  }\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Casting\\\"],[13],[1,\\\" adds two more connections, which the service wires up automatically when needed.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"history\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#history\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"History\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This project started as \\\"],[10,3],[14,6,\\\"http://github.com/nypublicradio/ember-hifi\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-hifi\\\"],[13],[13],[1,\\\" in 2016, an open source audio library funded by New York Public Radio and built by me (\\\"],[10,3],[14,6,\\\"http://github.com/jkeen\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Jeff Keen\\\"],[13],[1,\\\") and my pal and former WNYC engineer \\\"],[10,3],[14,6,\\\"http://github.com/noslouch\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Brian Whitton\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/attention-getter\\\"]]\",\n    \"moduleName\": \"docs/docs/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/metadata\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"metadata\" class=\"docs-md__h1\">Metadata</h1>\n      <p>Sound objects can store whatever custom metadata you want. This info will stick around for as long as the sound is loaded. Pass in <code>metadata</code> object as an option to any of the <code>play</code> or <code>load</code> helpers and then retrieve that data wherever you need to.</p>\n  \n        <h3 id=\"media-session\" class=\"docs-md__h3\"><a href=\"#media-session\" class=\"heading-anchor\">Media Session</a></h3>\n      <p>When a sound is played, the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/MediaSession\"  class=\"docs-md__a\">MediaSession</a> will be updated with that sound's metadata, setting the media session's <code>title</code>, <code>artist</code>, <code>album</code>, and <code>artwork</code> to the corresponding metadata values. This is what the lock screen, notification shade, car display and macOS Now Playing widget show.</p>\n  <p>The sound's duration and position are reported too, so those controls can draw a timeline and offer scrubbing.</p>\n  \n        <h4 id=\"describing-a-timeline-the-audio-doesn-t-have\" class=\"docs-md__h4\"><a href=\"#describing-a-timeline-the-audio-doesn-t-have\" class=\"heading-anchor\">Describing a timeline the audio doesn't have</a></h4>\n      <p>Sometimes the media's own clock isn't the timeline a listener is moving through. A live stream has no duration, but if it's carrying a scheduled show, that show's window is the timeline your scrubber draws.</p>\n  <p>Pass a <code>timeline</code> in the metadata and it will be used instead of the sound's own duration and position. Both values are in milliseconds:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(streamUrl, {\n    <span class=\"hljs-attr\">metadata</span>: {\n      <span class=\"hljs-attr\">title</span>: <span class=\"hljs-string\">&#x27;Stronger Than Dirt&#x27;</span>,\n      <span class=\"hljs-attr\">timeline</span>: { <span class=\"hljs-attr\">duration</span>: <span class=\"hljs-number\">3600000</span>, <span class=\"hljs-attr\">position</span>: elapsedMs },\n    },\n  });\n  </code></pre>\n  <p>Supplying one also asserts there is something to scrub, so the OS will offer a scrubber even for a sound that reports itself unseekable.</p>\n  \n        <h4 id=\"overriding-the-controls\" class=\"docs-md__h4\"><a href=\"#overriding-the-controls\" class=\"heading-anchor\">Overriding the controls</a></h4>\n      <p>By default the transport buttons do the obvious thing to the sound: play, pause, stop, seek. When your app knows better, register handlers for a specific sound:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">registerMediaSessionActions</span>(streamUrl, {\n    <span class=\"hljs-comment\">// seeking back on a live stream means leaving it for a recording</span>\n    <span class=\"hljs-attr\">seekto</span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">positionMs</span>) =&gt;</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">rewindTo</span>(positionMs),\n    <span class=\"hljs-attr\">seekbackward</span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">offsetMs</span>) =&gt;</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">rewindTo</span>(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">elapsedMs</span> - offsetMs),\n    <span class=\"hljs-attr\">seekforward</span>: <span class=\"hljs-literal\">null</span>,\n  });\n  </code></pre>\n  <p>An action can be:</p>\n  \n          <ul class=\"docs-list-disc\"><li><strong>omitted</strong>, and the library's own behaviour applies</li>\n  <li><strong>a function</strong>, which is called instead, with <code>positionMs</code> for <code>seekto</code> and <code>offsetMs</code> for <code>seekbackward</code> / <code>seekforward</code></li>\n  <li><strong><code>null</code></strong>, which removes the control entirely</li>\n  </ul>\n        <p>That last one matters, because registering a handler is what makes the OS draw the button. A no-op handler leaves a button that does nothing when pressed; <code>null</code> means no button.</p>\n  <p><code>previoustrack</code> and <code>nexttrack</code> have no default behaviour, since a sound has no idea what the next track is. They appear only if you register them. On iOS they take the place of the seek buttons rather than joining them.</p>\n  <p>Handlers are keyed by identifier and persist until replaced, so tear them down when whatever registered them goes away:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">unregisterMediaSessionActions</span>(streamUrl);\n  </code></pre>\n  \n        <h3 id=\"examples\" class=\"docs-md__h3\"><a href=\"#examples\" class=\"heading-anchor\">Examples</a></h3>\n      \n  <p><Docs::CustomMetadata /></p>\n  <p>Metadata can also be passed through the service:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\">\n  @service stereo;\n  ...\n  @action\n  <span class=\"hljs-keyword\">async</span> <span class=\"hljs-title function_\">playSound</span>(<span class=\"hljs-params\"></span>) {\n    <span class=\"hljs-keyword\">let</span> { sound } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">show</span>.<span class=\"hljs-property\">audioUrl</span>, {\n      <span class=\"hljs-attr\">metadata</span>: {\n        <span class=\"hljs-attr\">title</span>: <span class=\"hljs-string\">&quot;title of audio&quot;</span>,\n        <span class=\"hljs-attr\">artist</span>: <span class=\"hljs-string\">&quot;artist&quot;</span>,\n        <span class=\"hljs-attr\">show</span>: <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">show</span>\n      }\n    })\n  }\n  </code></pre>\n  </div>\n  */\n  {\n    \"id\": \"H2hVjmiP\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"metadata\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Metadata\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Sound objects can store whatever custom metadata you want. This info will stick around for as long as the sound is loaded. Pass in \\\"],[10,\\\"code\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\" object as an option to any of the \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" helpers and then retrieve that data wherever you need to.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"media-session\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#media-session\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Media Session\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"When a sound is played, the \\\"],[10,3],[14,6,\\\"https://developer.mozilla.org/en-US/docs/Web/API/MediaSession\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"MediaSession\\\"],[13],[1,\\\" will be updated with that sound's metadata, setting the media session's \\\"],[10,\\\"code\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"artist\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"album\\\"],[13],[1,\\\", and \\\"],[10,\\\"code\\\"],[12],[1,\\\"artwork\\\"],[13],[1,\\\" to the corresponding metadata values. This is what the lock screen, notification shade, car display and macOS Now Playing widget show.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The sound's duration and position are reported too, so those controls can draw a timeline and offer scrubbing.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"describing-a-timeline-the-audio-doesn-t-have\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#describing-a-timeline-the-audio-doesn-t-have\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Describing a timeline the audio doesn't have\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Sometimes the media's own clock isn't the timeline a listener is moving through. A live stream has no duration, but if it's carrying a scheduled show, that show's window is the timeline your scrubber draws.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Pass a \\\"],[10,\\\"code\\\"],[12],[1,\\\"timeline\\\"],[13],[1,\\\" in the metadata and it will be used instead of the sound's own duration and position. Both values are in milliseconds:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(streamUrl, {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Stronger Than Dirt'\\\"],[13],[1,\\\",\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"timeline\\\"],[13],[1,\\\": { \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"duration\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-number\\\"],[12],[1,\\\"3600000\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\": elapsedMs },\\\\n  },\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Supplying one also asserts there is something to scrub, so the OS will offer a scrubber even for a sound that reports itself unseekable.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"overriding-the-controls\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#overriding-the-controls\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Overriding the controls\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"By default the transport buttons do the obvious thing to the sound: play, pause, stop, seek. When your app knows better, register handlers for a specific sound:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"registerMediaSessionActions\\\"],[13],[1,\\\"(streamUrl, {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// seeking back on a live stream means leaving it for a recording\\\"],[13],[1,\\\"\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"seekto\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"positionMs\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"rewindTo\\\"],[13],[1,\\\"(positionMs),\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"seekbackward\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"offsetMs\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"rewindTo\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"elapsedMs\\\"],[13],[1,\\\" - offsetMs),\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"seekforward\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-literal\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\",\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"An action can be:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"omitted\\\"],[13],[1,\\\", and the library's own behaviour applies\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"a function\\\"],[13],[1,\\\", which is called instead, with \\\"],[10,\\\"code\\\"],[12],[1,\\\"positionMs\\\"],[13],[1,\\\" for \\\"],[10,\\\"code\\\"],[12],[1,\\\"seekto\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"offsetMs\\\"],[13],[1,\\\" for \\\"],[10,\\\"code\\\"],[12],[1,\\\"seekbackward\\\"],[13],[1,\\\" / \\\"],[10,\\\"code\\\"],[12],[1,\\\"seekforward\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[13],[1,\\\", which removes the control entirely\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"That last one matters, because registering a handler is what makes the OS draw the button. A no-op handler leaves a button that does nothing when pressed; \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\" means no button.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"previoustrack\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"nexttrack\\\"],[13],[1,\\\" have no default behaviour, since a sound has no idea what the next track is. They appear only if you register them. On iOS they take the place of the seek buttons rather than joining them.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Handlers are keyed by identifier and persist until replaced, so tear them down when whatever registered them goes away:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"unregisterMediaSessionActions\\\"],[13],[1,\\\"(streamUrl);\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"examples\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#examples\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Examples\\\"],[13],[13],[1,\\\"\\\\n    \\\\n\\\"],[10,2],[12],[8,[39,0],null,null,null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Metadata can also be passed through the service:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[1,\\\"\\\\n@service stereo;\\\\n...\\\\n@action\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"async\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"playSound\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[13],[1,\\\") {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"show\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"audioUrl\\\"],[13],[1,\\\", {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": {\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"\\\\\\\"title of audio\\\\\\\"\\\"],[13],[1,\\\",\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"artist\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"\\\\\\\"artist\\\\\\\"\\\"],[13],[1,\\\",\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"show\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"show\\\"],[13],[1,\\\"\\\\n    }\\\\n  })\\\\n}\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/custom-metadata\\\"]]\",\n    \"moduleName\": \"docs/docs/metadata.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/playing-sounds\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"playing-sounds\" class=\"docs-md__h1\">Playing Sounds</h1>\n      <p><code>findSound</code>, <code>load</code>, and <code>play</code> all hand back a <strong><code>Sound</code></strong>: an identity-stable container that exists before any audio has loaded.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-keyword\">let</span> sound = <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(<span class=\"hljs-string\">&#x27;https://streaming.koop.org/stream.aac&#x27;</span>);\n  </code></pre>\n  <p><code>findSound</code> is synchronous and find-or-create, so asking for the same identifier twice gives you the same <code>Sound</code>. Its identity is the url rather than the connection underneath, so it survives a connection swap or <a href=\"/docs/casting\"  class=\"docs-md__a\">casting</a>. References and listeners you attach to it stay valid across all of that.</p>\n  <p>Most of the time you never touch it directly. Point a template helper at a url and it finds the sound for you:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">on</span> <span class=\"hljs-string\">&#x27;click&#x27;</span> (<span class=\"hljs-name\">toggle-play-sound</span> @identifier)&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\"> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;button&#x27;</span>&gt;</span>\n    Play/Pause\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span></span>\n  </code></pre>\n  <p>Helpers like <a href=\"/docs/api/helpers/sound-is-playing\"  class=\"docs-md__a\">sound-is-playing</a>, <a href=\"/docs/api/helpers/sound-is-loading\"  class=\"docs-md__a\">sound-is-loading</a>, <a href=\"/docs/api/helpers/sound-is-loaded\"  class=\"docs-md__a\">sound-is-loaded</a>, <a href=\"/docs/api/helpers/sound-is-errored\"  class=\"docs-md__a\">sound-is-errored</a>, <a href=\"/docs/api/helpers/sound-is-seekable\"  class=\"docs-md__a\">sound-is-seekable</a>, <a href=\"/docs/api/helpers/sound-is-rewindable\"  class=\"docs-md__a\">sound-is-rewindable</a>, <a href=\"/docs/api/helpers/sound-is-fastforwardable\"  class=\"docs-md__a\">sound-is-fastforwardable</a>, <a href=\"/docs/api/helpers/sound-is-blocked\"  class=\"docs-md__a\">sound-is-blocked</a>, <a href=\"/docs/api/helpers/sound-position\"  class=\"docs-md__a\">sound-position</a>, <a href=\"/docs/api/helpers/sound-duration\"  class=\"docs-md__a\">sound-duration</a>, <a href=\"/docs/api/helpers/sound-metadata\"  class=\"docs-md__a\">sound-metadata</a>, <a href=\"/docs/api/helpers/sound-error-details\"  class=\"docs-md__a\">sound-error-details</a>, and <a href=\"/docs/api/helpers/find-sound\"  class=\"docs-md__a\">find-sound</a> compose into a whole player without leaving the template.</p>\n  \n  <p><Docs::StereoPlayerExample @identifier=\"/sounds/works-just-like-a-vcr.mp3\" /></p>\n  \n        <h2 id=\"identifiers\" class=\"docs-md__h2\"><a href=\"#identifiers\" class=\"heading-anchor\">Identifiers</a></h2>\n      <p>An identifier is usually a url string, but it can also be an object with a <code>url</code> (and maybe a <code>mimeType</code>), an already loaded <code>Sound</code>, an array of any of those, or a promise resolving to any of those. Give an array when you have several versions of the same audio and want the best one that works, which is covered in <a href=\"/docs/browser-audio\"  class=\"docs-md__a\">Browser Audio</a>.</p>\n  \n        <h3 id=\"on-demand\" class=\"docs-md__h3\"><a href=\"#on-demand\" class=\"heading-anchor\">On demand</a></h3>\n      <p>This uses the same url as the player above. Sound state is app-wide, so both stay in sync.</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"/sounds/works-just-like-a-vcr.mp3\"/></p>\n  \n        <h3 id=\"streaming\" class=\"docs-md__h3\"><a href=\"#streaming\" class=\"heading-anchor\">Streaming</a></h3>\n      <p>A live stream reports a duration of ∞ and disables the position controls. Here's the live web stream of the scrappy Austin community radio station, KOOP.</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://streaming.koop.org/stream.mp3\"/></p>\n  \n        <h2 id=\"waiting-for-a-sound-to-load\" class=\"docs-md__h2\"><a href=\"#waiting-for-a-sound-to-load\" class=\"heading-anchor\">Waiting for a sound to load</a></h2>\n      <p>The <code>Sound</code> comes back before its audio does, so it answers its own loading state while you wait:</p>\n  \n          <ul class=\"docs-list-disc\"><li><strong><code>isPending</code></strong> - exists, but no connection has resolved yet</li>\n  <li><strong><code>isLoading</code></strong> - a load is in flight, or the stream is buffering on play</li>\n  <li><strong><code>isResolved</code></strong> - a connection is backing the sound</li>\n  <li><strong><code>isLoaded</code></strong> - the connection has enough to play</li>\n  <li><strong><code>isErrored</code></strong> - every playable strategy was tried and none worked. <code>errors</code> holds the per-strategy failures and <code>error</code> the most recent one</li>\n  </ul>\n        <p>These are reactive, so an indicator can render before the sound loads and update when something else loads or plays it.</p>\n  \n  <p><Docs::ProxyExample /></p>\n  \n        <h2 id=\"reading-playback-state\" class=\"docs-md__h2\"><a href=\"#reading-playback-state\" class=\"heading-anchor\">Reading playback state</a></h2>\n      <p>Once resolved, the <code>Sound</code> proxies the live state of whatever connection is backing it. The same object exposes:</p>\n  \n          <ul class=\"docs-list-disc\"><li><strong>Playback</strong>: <code>isPlaying</code>, <code>isPaused</code>, <code>isBlocked</code>, <code>hasPlayed</code></li>\n  <li><strong>Position</strong>: <code>position</code>, <code>duration</code>, <code>percentLoaded</code>, and for live/HLS streams <code>currentTime</code>, <code>startTime</code>, <code>endTime</code></li>\n  <li><strong>Capabilities</strong>: <code>isStream</code>, <code>isSeekable</code>, <code>isRewindable</code>, <code>isFastForwardable</code></li>\n  <li><strong>Identity & metadata</strong>: <code>url</code>, <code>mimeType</code>, <code>metadata</code>, <code>id3TagMetadata</code>, <code>connectionName</code></li>\n  <li><strong>Actions</strong>: <code>play</code>, <code>pause</code>, <code>stop</code>, <code>togglePause</code>, <code>rewind</code>, <code>fastForward</code>, <code>seek</code></li>\n  </ul>\n        <p>Each template helper reads one of these properties off the sound it finds.</p>\n  <p>To ask whether a sound is the one for a url, call <code>sound.hasUrl(url)</code> rather than comparing <code>sound.url</code> yourself. A sound can answer to more than one url, and two urls that differ only by a query string are usually the same audio. Pass <code>{ exact: true }</code> when the query string matters, as it does for cache-busted streams.</p>\n  \n        <h2 id=\"volume\" class=\"docs-md__h2\"><a href=\"#volume\" class=\"heading-anchor\">Volume</a></h2>\n      <p>Volume is global, so every sound plays at the same level. It defaults to 100, which is whatever the system volume is. The <code>&#123;&#123;stereo-volume&#125;&#125;</code> modifier turns a range input into a volume control, and <a href=\"/docs/api/helpers/toggle-stereo-mute\"  class=\"docs-md__a\">toggle-stereo-mute</a> handles muting.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;range&#x27;</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">stereo-volume</span>&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\"> /&gt;</span></span>\n  </code></pre>\n  <p>From the service, <code>stereo.volume</code> is a getter and setter. Mobile devices don't allow it, so <a href=\"/docs/api/helpers/stereo-volume-is-adjustable\"  class=\"docs-md__a\">stereo-volume-is-adjustable</a> tells you whether to render the control at all.</p>\n  \n        <h2 id=\"playback-speed\" class=\"docs-md__h2\"><a href=\"#playback-speed\" class=\"heading-anchor\">Playback speed</a></h2>\n      <p><code>stereo.playbackSpeed</code> reads and sets the rate of the current sound, where 1 is normal. Speed belongs to the sound rather than the service, so each sound remembers its own and a new one starts at 1. Switching to a sound at a different speed fires <code>playback-speed-change</code>. A live stream always plays at 1 whatever the setting.</p>\n  \n        <h2 id=\"load-options\" class=\"docs-md__h2\"><a href=\"#load-options\" class=\"heading-anchor\">Load options</a></h2>\n      <p><code>play</code> and <code>load</code> take an options hash alongside the identifier:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url, {\n    <span class=\"hljs-attr\">useConnections</span>: [<span class=\"hljs-string\">&#x27;HLS&#x27;</span>, <span class=\"hljs-string\">&#x27;NativeAudio&#x27;</span>],\n    <span class=\"hljs-attr\">metadata</span>: { <span class=\"hljs-attr\">title</span>: <span class=\"hljs-string\">&#x27;Works Just Like A VCR&#x27;</span> },\n    <span class=\"hljs-attr\">startPosition</span>: <span class=\"hljs-number\">90</span>,\n  });\n  \n  <span class=\"hljs-comment\">// or, for a live stream</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(streamUrl, { <span class=\"hljs-attr\">duration</span>: <span class=\"hljs-title class_\">Infinity</span> });\n  </code></pre>\n  \n          <ul class=\"docs-list-disc\"><li><strong><code>metadata</code></strong> stores whatever you want alongside the sound, and feeds the OS media controls. See <a href=\"/docs/metadata\"  class=\"docs-md__a\">Metadata</a>.</li>\n  <li><strong><code>useConnections</code></strong> limits which connections may be tried, in order of preference, instead of the full waterfall.</li>\n  <li><strong><code>startPosition</code></strong> (seconds) begins playback part way in. The connection is handed the offset as it's built, so the first thing it fetches is the piece you asked for.</li>\n  <li><strong><code>streamPauseGraceMs</code></strong> keeps a paused stream's connection open for this long before stopping it, so a listener who pauses briefly doesn't pay for a reconnect. Holding it costs bandwidth and, on a live stream, a slot on the streaming server, so the default is to stop as soon as it's paused. Pass <code>Infinity</code> to hold it until something explicitly stops it.</li>\n  <li><strong><code>duration</code></strong> (ms) declares how long the media is, skipping measurement rather than correcting it afterward. Pass <code>Infinity</code> for a live stream. Connections normally work this out themselves, but some cases defeat measurement.</li>\n  <li><strong><code>seekable</code></strong> declares if the media is seekable. Connections usually detect this on their own, but declaring it explicity takes the guesswork out.</li>\n  <li><strong><code>xhr</code></strong> passes <code>headers</code>, <code>withCredentials</code> and <code>method</code> through to connections that fetch over XHR.</li>\n  <li><strong><code>preview</code></strong> plays the sound without it becoming <code>currentSound</code>.</li>\n  <li><strong><code>silenceErrors</code></strong> returns the error on the result instead of throwing. Can also be set globally in <code>environment.js</code>.</li>\n  </ul>\n        \n        <h2 id=\"swapping-the-connection\" class=\"docs-md__h2\"><a href=\"#swapping-the-connection\" class=\"heading-anchor\">Swapping the connection</a></h2>\n      \n          <ul class=\"docs-list-disc\"><li><strong><code>sound.castUrl</code></strong> - a device-fetchable variant of the stream, used when <a href=\"/docs/casting\"  class=\"docs-md__a\">casting</a>. See the casting docs for why a separate url is needed.</li>\n  <li><strong><code>sound.swap(target)</code></strong> - replaces the backing connection while keeping the <code>Sound</code>'s identity and your references intact, carrying position and play-state across. Pass a connection key from the sound's own strategies (<code>sound.swap(&#39;hls&#39;)</code>) or a connection instance.</li>\n  </ul>\n        \n        <h2 id=\"interacting-with-the-service\" class=\"docs-md__h2\"><a href=\"#interacting-with-the-service\" class=\"heading-anchor\">Interacting with the service</a></h2>\n      <p>You can trigger sounds directly from the <code>stereo</code> service.</p>\n  \n  <p><Docs::ServiceExample /></p>\n  </div>\n  */\n  {\n    \"id\": \"bW6wnUPb\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"playing-sounds\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\", and \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" all hand back a \\\"],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[1,\\\": an identity-stable container that exists before any audio has loaded.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" sound = \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'https://streaming.koop.org/stream.aac'\\\"],[13],[1,\\\");\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\" is synchronous and find-or-create, so asking for the same identifier twice gives you the same \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\". Its identity is the url rather than the connection underneath, so it survives a connection swap or \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"casting\\\"],[13],[1,\\\". References and listeners you attach to it stay valid across all of that.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Most of the time you never touch it directly. Point a template helper at a url and it finds the sound for you:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'click'\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"toggle-play-sound\\\"],[13],[1,\\\" @identifier)}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'button'\\\"],[13],[1,\\\">\\\"],[13],[1,\\\"\\\\n  Play/Pause\\\\n\\\"],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Helpers like \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-playing\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-playing\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-loading\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-loading\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-loaded\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-loaded\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-errored\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-errored\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-seekable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-seekable\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-rewindable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-rewindable\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-fastforwardable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-fastforwardable\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-blocked\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-blocked\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-position\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-position\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-duration\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-duration\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-metadata\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-metadata\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-error-details\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-error-details\\\"],[13],[1,\\\", and \\\"],[10,3],[14,6,\\\"/docs/api/helpers/find-sound\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"find-sound\\\"],[13],[1,\\\" compose into a whole player without leaving the template.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"identifiers\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#identifiers\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Identifiers\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"An identifier is usually a url string, but it can also be an object with a \\\"],[10,\\\"code\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\" (and maybe a \\\"],[10,\\\"code\\\"],[12],[1,\\\"mimeType\\\"],[13],[1,\\\"), an already loaded \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\", an array of any of those, or a promise resolving to any of those. Give an array when you have several versions of the same audio and want the best one that works, which is covered in \\\"],[10,3],[14,6,\\\"/docs/browser-audio\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Browser Audio\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"on-demand\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#on-demand\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"On demand\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This uses the same url as the player above. Sound state is app-wide, so both stay in sync.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@identifier\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"streaming\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#streaming\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Streaming\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A live stream reports a duration of ∞ and disables the position controls. Here's the live web stream of the scrappy Austin community radio station, KOOP.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@identifier\\\"],[\\\"https://streaming.koop.org/stream.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"waiting-for-a-sound-to-load\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#waiting-for-a-sound-to-load\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Waiting for a sound to load\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" comes back before its audio does, so it answers its own loading state while you wait:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isPending\\\"],[13],[13],[1,\\\" - exists, but no connection has resolved yet\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isLoading\\\"],[13],[13],[1,\\\" - a load is in flight, or the stream is buffering on play\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isResolved\\\"],[13],[13],[1,\\\" - a connection is backing the sound\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isLoaded\\\"],[13],[13],[1,\\\" - the connection has enough to play\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isErrored\\\"],[13],[13],[1,\\\" - every playable strategy was tried and none worked. \\\"],[10,\\\"code\\\"],[12],[1,\\\"errors\\\"],[13],[1,\\\" holds the per-strategy failures and \\\"],[10,\\\"code\\\"],[12],[1,\\\"error\\\"],[13],[1,\\\" the most recent one\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"These are reactive, so an indicator can render before the sound loads and update when something else loads or plays it.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,2],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"reading-playback-state\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#reading-playback-state\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Reading playback state\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Once resolved, the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" proxies the live state of whatever connection is backing it. The same object exposes:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Playback\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"isPlaying\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isPaused\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isBlocked\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"hasPlayed\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Position\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"duration\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"percentLoaded\\\"],[13],[1,\\\", and for live/HLS streams \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentTime\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"startTime\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"endTime\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Capabilities\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"isStream\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isSeekable\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isRewindable\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isFastForwardable\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Identity & metadata\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"mimeType\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"id3TagMetadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"connectionName\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Actions\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"pause\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"stop\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"togglePause\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"rewind\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"fastForward\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"seek\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Each template helper reads one of these properties off the sound it finds.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"To ask whether a sound is the one for a url, call \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.hasUrl(url)\\\"],[13],[1,\\\" rather than comparing \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.url\\\"],[13],[1,\\\" yourself. A sound can answer to more than one url, and two urls that differ only by a query string are usually the same audio. Pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"{ exact: true }\\\"],[13],[1,\\\" when the query string matters, as it does for cache-busted streams.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"volume\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#volume\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Volume\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Volume is global, so every sound plays at the same level. It defaults to 100, which is whatever the system volume is. The \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{stereo-volume}}\\\"],[13],[1,\\\" modifier turns a range input into a volume control, and \\\"],[10,3],[14,6,\\\"/docs/api/helpers/toggle-stereo-mute\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"toggle-stereo-mute\\\"],[13],[1,\\\" handles muting.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"input\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'range'\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"stereo-volume\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\" />\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"From the service, \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.volume\\\"],[13],[1,\\\" is a getter and setter. Mobile devices don't allow it, so \\\"],[10,3],[14,6,\\\"/docs/api/helpers/stereo-volume-is-adjustable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"stereo-volume-is-adjustable\\\"],[13],[1,\\\" tells you whether to render the control at all.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"playback-speed\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#playback-speed\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Playback speed\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.playbackSpeed\\\"],[13],[1,\\\" reads and sets the rate of the current sound, where 1 is normal. Speed belongs to the sound rather than the service, so each sound remembers its own and a new one starts at 1. Switching to a sound at a different speed fires \\\"],[10,\\\"code\\\"],[12],[1,\\\"playback-speed-change\\\"],[13],[1,\\\". A live stream always plays at 1 whatever the setting.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"load-options\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#load-options\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Load options\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" take an options hash alongside the identifier:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url, {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"useConnections\\\"],[13],[1,\\\": [\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'HLS'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'NativeAudio'\\\"],[13],[1,\\\"],\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": { \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Works Just Like A VCR'\\\"],[13],[1,\\\" },\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"startPosition\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-number\\\"],[12],[1,\\\"90\\\"],[13],[1,\\\",\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// or, for a live stream\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(streamUrl, { \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"duration\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-title class_\\\"],[12],[1,\\\"Infinity\\\"],[13],[1,\\\" });\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"metadata\\\"],[13],[13],[1,\\\" stores whatever you want alongside the sound, and feeds the OS media controls. See \\\"],[10,3],[14,6,\\\"/docs/metadata\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Metadata\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"useConnections\\\"],[13],[13],[1,\\\" limits which connections may be tried, in order of preference, instead of the full waterfall.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"startPosition\\\"],[13],[13],[1,\\\" (seconds) begins playback part way in. The connection is handed the offset as it's built, so the first thing it fetches is the piece you asked for.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"streamPauseGraceMs\\\"],[13],[13],[1,\\\" keeps a paused stream's connection open for this long before stopping it, so a listener who pauses briefly doesn't pay for a reconnect. Holding it costs bandwidth and, on a live stream, a slot on the streaming server, so the default is to stop as soon as it's paused. Pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"Infinity\\\"],[13],[1,\\\" to hold it until something explicitly stops it.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"duration\\\"],[13],[13],[1,\\\" (ms) declares how long the media is, skipping measurement rather than correcting it afterward. Pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"Infinity\\\"],[13],[1,\\\" for a live stream. Connections normally work this out themselves, but some cases defeat measurement.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"seekable\\\"],[13],[13],[1,\\\" declares if the media is seekable. Connections usually detect this on their own, but declaring it explicity takes the guesswork out.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"xhr\\\"],[13],[13],[1,\\\" passes \\\"],[10,\\\"code\\\"],[12],[1,\\\"headers\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"withCredentials\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"method\\\"],[13],[1,\\\" through to connections that fetch over XHR.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"preview\\\"],[13],[13],[1,\\\" plays the sound without it becoming \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentSound\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"silenceErrors\\\"],[13],[13],[1,\\\" returns the error on the result instead of throwing. Can also be set globally in \\\"],[10,\\\"code\\\"],[12],[1,\\\"environment.js\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"swapping-the-connection\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#swapping-the-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Swapping the connection\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[13],[1,\\\" - a device-fetchable variant of the stream, used when \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"casting\\\"],[13],[1,\\\". See the casting docs for why a separate url is needed.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.swap(target)\\\"],[13],[13],[1,\\\" - replaces the backing connection while keeping the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\"'s identity and your references intact, carrying position and play-state across. Pass a connection key from the sound's own strategies (\\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.swap('hls')\\\"],[13],[1,\\\") or a connection instance.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"interacting-with-the-service\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#interacting-with-the-service\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Interacting with the service\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You can trigger sounds directly from the \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,null,null],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/stereo-player-example\\\",\\\"docs/stereo-player\\\",\\\"docs/proxy-example\\\",\\\"docs/service-example\\\"]]\",\n    \"moduleName\": \"docs/docs/playing-sounds.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/testing\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"testing\" class=\"docs-md__h1\">Testing</h1>\n      <p>If you need to test audio handling that involves <code>ember-stereo</code> in your app, you're gonna need this helper. It sets up and cleans up a few stereo-related items, but most importantly it stubs out the native browser audio and video elements replacing it with a FakeMediaElement that behaves sanely in the test environment.</p>\n  <p>You can control how the sound behaves by providing a url in one of these formats:</p>\n  \n        <h2 id=\"url-formats\" class=\"docs-md__h2\"><a href=\"#url-formats\" class=\"heading-anchor\">URL Formats</a></h2>\n      \n        <h4 id=\"urls-that-will-successfully-load-\" class=\"docs-md__h4\"><a href=\"#urls-that-will-successfully-load-\" class=\"heading-anchor\">URLs that will successfully load:</a></h4>\n      \n          <ul class=\"docs-list-disc\"><li><code>good/10000/test-url.mp3</code>: an mp3 that is 10 seconds long</li>\n  <li><code>good/stream/the-current.aac</code>: an aac audio stream, duration = Infinity, will behave like a stream does</li>\n  </ul>\n        \n        <h4 id=\"urls-that-will-fail\" class=\"docs-md__h4\"><a href=\"#urls-that-will-fail\" class=\"heading-anchor\">URLs that will fail</a></h4>\n      \n          <ul class=\"docs-list-disc\"><li><code>bad/codec-error/the-current.aac</code>: an aac sound that will fail with 'codec-error'</li>\n  <li><code>bad/some%20custom%20string/the-current.aac</code>: an aac sound that will fail with error message 'some custom string'</li>\n  </ul>\n        <p>Here's an example test, testing an example player, making sure that fast forward and rewind buttons are disabled.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-javascript\"><span class=\"hljs-keyword\">import</span> { setupStereoTest } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&#x27;ember-stereo/test-support/stereo-setup&#x27;</span>;\n  \n  <span class=\"hljs-title function_\">module</span>(<span class=\"hljs-string\">&#x27;Integration | Component | player&#x27;</span>, <span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">hooks</span>) {\n    <span class=\"hljs-title function_\">setupStereoTest</span>(hooks);\n  \n    <span class=\"hljs-title function_\">test</span>(<span class=\"hljs-string\">&#x27;it does not display rewind and ff buttons when stream&#x27;</span>, <span class=\"hljs-keyword\">async</span> <span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">assert</span>) {\n      <span class=\"hljs-keyword\">let</span> stereo = <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">owner</span>.<span class=\"hljs-title function_\">lookup</span>(<span class=\"hljs-string\">&#x27;service:stereo&#x27;</span>);\n      <span class=\"hljs-keyword\">await</span> stereo.<span class=\"hljs-title function_\">play</span>(<span class=\"hljs-string\">&#x27;/good/stream/test.mp3&#x27;</span>, {\n        <span class=\"hljs-attr\">metadata</span>: {\n          show,\n          track,\n        },\n      });\n      <span class=\"hljs-keyword\">await</span> <span class=\"hljs-title function_\">render</span>(hbs<span class=\"hljs-string\">`&lt;Player/&gt;`</span>);\n  \n      assert.<span class=\"hljs-title function_\">dom</span>(<span class=\"hljs-string\">&#x27;[data-test-element=&quot;fastforward-button&quot;]&#x27;</span>).<span class=\"hljs-title function_\">isDisabled</span>();\n      assert.<span class=\"hljs-title function_\">dom</span>(<span class=\"hljs-string\">&#x27;[data-test-element=&quot;rewind-button&quot;]&#x27;</span>).<span class=\"hljs-title function_\">isDisabled</span>();\n      assert.<span class=\"hljs-title function_\">dom</span>(<span class=\"hljs-string\">&#x27;[data-test-element=&quot;play-pause-button&quot;]&#x27;</span>).<span class=\"hljs-title function_\">exists</span>();\n    });\n  });\n  </code></pre>\n  </div>\n  */\n  {\n    \"id\": \"AD+m4tmk\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"testing\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Testing\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"If you need to test audio handling that involves \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" in your app, you're gonna need this helper. It sets up and cleans up a few stereo-related items, but most importantly it stubs out the native browser audio and video elements replacing it with a FakeMediaElement that behaves sanely in the test environment.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"You can control how the sound behaves by providing a url in one of these formats:\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"url-formats\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#url-formats\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"URL Formats\\\"],[13],[13],[1,\\\"\\\\n    \\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"urls-that-will-successfully-load-\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#urls-that-will-successfully-load-\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"URLs that will successfully load:\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"good/10000/test-url.mp3\\\"],[13],[1,\\\": an mp3 that is 10 seconds long\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"good/stream/the-current.aac\\\"],[13],[1,\\\": an aac audio stream, duration = Infinity, will behave like a stream does\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"urls-that-will-fail\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#urls-that-will-fail\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"URLs that will fail\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"bad/codec-error/the-current.aac\\\"],[13],[1,\\\": an aac sound that will fail with 'codec-error'\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"bad/some%20custom%20string/the-current.aac\\\"],[13],[1,\\\": an aac sound that will fail with error message 'some custom string'\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Here's an example test, testing an example player, making sure that fast forward and rewind buttons are disabled.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-javascript\\\"],[12],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"import\\\"],[13],[1,\\\" { setupStereoTest } \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"from\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo/test-support/stereo-setup'\\\"],[13],[1,\\\";\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"module\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Integration | Component | player'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"function\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"hooks\\\"],[13],[1,\\\") {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"setupStereoTest\\\"],[13],[1,\\\"(hooks);\\\\n\\\\n  \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"test\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'it does not display rewind and ff buttons when stream'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"async\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"function\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"assert\\\"],[13],[1,\\\") {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" stereo = \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"owner\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"lookup\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'service:stereo'\\\"],[13],[1,\\\");\\\\n    \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" stereo.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'/good/stream/test.mp3'\\\"],[13],[1,\\\", {\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": {\\\\n        show,\\\\n        track,\\\\n      },\\\\n    });\\\\n    \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"render\\\"],[13],[1,\\\"(hbs\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"`<Player/>`\\\"],[13],[1,\\\");\\\\n\\\\n    assert.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"dom\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'[data-test-element=\\\\\\\"fastforward-button\\\\\\\"]'\\\"],[13],[1,\\\").\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"isDisabled\\\"],[13],[1,\\\"();\\\\n    assert.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"dom\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'[data-test-element=\\\\\\\"rewind-button\\\\\\\"]'\\\"],[13],[1,\\\").\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"isDisabled\\\"],[13],[1,\\\"();\\\\n    assert.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"dom\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'[data-test-element=\\\\\\\"play-pause-button\\\\\\\"]'\\\"],[13],[1,\\\").\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"exists\\\"],[13],[1,\\\"();\\\\n  });\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[]]\",\n    \"moduleName\": \"docs/docs/testing.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/docs/upgrading\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"upgrading\" class=\"docs-md__h1\">Upgrading</h1>\n      \n        <h2 id=\"upgrading-to-6-0\" class=\"docs-md__h2\"><a href=\"#upgrading-to-6-0\" class=\"heading-anchor\">Upgrading to 6.0</a></h2>\n      <p>6.0 inverts the core model. 5.x jumped through hoops to fake a stable <strong><code>Sound</code></strong> (see <a href=\"/docs/playing-sounds\"  class=\"docs-md__a\">Playing Sounds</a>). Now it's real and reports <code>isLoading</code>, <code>errors</code>, and the <code>connection</code> that resolved it. This makes connection swapping (like, to the new Airplay and Chromecast connections) possible.</p>\n  <p><strong>Changes from 5.x -> 6.0</strong></p>\n  \n        <h3 id=\"1-findsound-is-synchronous-and-always-returns-a-sound\" class=\"docs-md__h3\"><a href=\"#1-findsound-is-synchronous-and-always-returns-a-sound\" class=\"heading-anchor\">1. <code>findSound</code> is synchronous and always returns a <code>Sound</code></a></h3>\n      <p>It find-or-creates and returns immediately, so drop any <code>await</code> in front of it. The returned <code>Sound</code> may still be pending, so replace \"is there a sound yet?\" presence checks with <code>isResolved</code> (a connection has resolved) or <code>isLoaded</code> (it's ready to play):</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE: undefined until the audio loaded</span>\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(url)) { <span class=\"hljs-comment\">/* … *\\/</span> }\n  \n  <span class=\"hljs-comment\">// AFTER: the Sound always exists, so check whether a connection resolved</span>\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(url)?.<span class=\"hljs-property\">isResolved</span>) { <span class=\"hljs-comment\">/* … *\\/</span> }\n  </code></pre>\n  <p>The Sound survives connection swaps and reports isLoading/isPending/isBlocked so listeners you attach to it before the sound is actually loaded stay valid now. When you genuinely need the underlying connection (and I don't know why you would) it's at <code>sound.connection</code>.</p>\n  \n        <h3 id=\"2-match-sounds-by-hasurl-not-url-\" class=\"docs-md__h3\"><a href=\"#2-match-sounds-by-hasurl-not-url-\" class=\"heading-anchor\">2. Match sounds by <code>hasUrl</code>, not <code>url ===</code></a></h3>\n      <p>A resolved <code>Sound</code> reports its connection's <em>normalized</em> URL, which won't <code>===</code> the raw identifier you handed in. Anywhere you compared event payloads against an identifier, switch to <code>hasUrl</code>:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-loaded&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-keyword\">if</span> (sound.<span class=\"hljs-property\">url</span> === <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">identifier</span>) { <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">attach</span>(sound); }\n  });\n  \n  <span class=\"hljs-comment\">// AFTER</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-loaded&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-keyword\">if</span> (sound.<span class=\"hljs-property\">hasUrl</span>?.(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">identifier</span>)) { <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">attach</span>(sound); }\n  });\n  </code></pre>\n  \n        <h3 id=\"3-guard-for-a-null-currentsound\" class=\"docs-md__h3\"><a href=\"#3-guard-for-a-null-currentsound\" class=\"heading-anchor\">3. Guard for a <code>null</code> currentSound</a></h3>\n      <p><code>stereo.currentSound</code> can now clear to <code>null</code> (for example when casting stops), so null-check it in your <code>current-sound-changed</code> handlers:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;current-sound-changed&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-keyword\">if</span> (!sound) { <span class=\"hljs-keyword\">return</span>; }\n    <span class=\"hljs-comment\">// …</span>\n  });\n  </code></pre>\n  \n        <h3 id=\"4-load-play-resolve-to-the-sound-not-the-connection\" class=\"docs-md__h3\"><a href=\"#4-load-play-resolve-to-the-sound-not-the-connection\" class=\"heading-anchor\">4. <code>load</code>/<code>play</code> resolve to the <code>Sound</code>, not the connection</a></h3>\n      <p><code>sound</code> means the same thing everywhere now: the identity-stable container. It's what events hand you, what <code>currentSound</code> holds, and what <code>load</code>/<code>play</code> resolve to. The connection is still available alongside it when you genuinely need it:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE: `sound` was the connection, and you were locked to it</span>\n  <span class=\"hljs-keyword\">let</span> { sound } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  \n  <span class=\"hljs-comment\">// AFTER: `sound` is the container, and the resolved connection is a sibling key. you probably don&#x27;t need the connection</span>\n  <span class=\"hljs-keyword\">let</span> { sound, connection } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  </code></pre>\n  <p>A <code>Sound</code> can now change the connection underneath it (see <a href=\"/docs/playing-sounds\"  class=\"docs-md__a\">Playing Sounds</a>), which is what makes failover and casting possible. </p>\n  \n        <h3 id=\"5-renamed-and-relocated\" class=\"docs-md__h3\"><a href=\"#5-renamed-and-relocated\" class=\"heading-anchor\">5. Renamed and relocated</a></h3>\n      <p>The vocabulary has been shifted a little in an attempt to make this more intuitive! A <strong><code>Sound</code></strong> is the identity-stable container you hold, a <strong>connection</strong> is the disposable implementation it plays through. The individual cache objects hanging off the stereo service are no longer needed, as all the relevant data lives on the <code>Sound</code>.</p>\n  <table class=\"docs-table-auto\">\n  <thead>\n  <tr class=\"docs-table-row\">\n  <th class=\"docs-border docs-px-4 docs-py-2\">Before</th>\n  <th class=\"docs-border docs-px-4 docs-py-2\">After</th>\n  </tr>\n  </thead>\n  <tbody><tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findLoadedSound(url)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(url)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.loadedSounds</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.sounds.filter((s) =&gt; s.isLoaded)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.loadedUrls</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.sounds.filter((s) =&gt; s.isLoaded).map((s) =&gt; s.url)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.cachedErrors</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.sounds.filter((s) =&gt; s.isErrored)</code>, then read <code>sound.errors</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.errorCache.find(url)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(url).errors</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>sound.urlsAreEqual(a, b)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>sound.hasUrl(identifier)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>failure.erroredSound</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>failure.erroredConnection</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>strategy.createSound()</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>strategy.createConnection()</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.metadataCache.store(url, data)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(url).metadata = data</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.urlCache.resolve(identifier)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(identifier).resolveUrls()</code></td>\n  </tr>\n  </tbody></table>\n  <p>Metadata reads are unchanged: <code>sound.metadata</code>, <code>stereo.currentMetadata</code>, <code>&#123;&#123;sound-metadata identifier&#125;&#125;</code>.</p>\n  <p>Some of them return something different than they used to:</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>sound.hasUrl</code> answers while a <code>Sound</code> is still pending, falling back to the identifier it was built with. It used to return <code>undefined</code>.</li>\n  <li><code>stereo.sounds</code> replaces the old cache-backed lists. It holds every <code>Sound</code> a load was attempted on, including pending and errored ones so filter it for the subset you want.</li>\n  <li><code>sound.url</code> can change over the life of the sound. A <code>Sound</code> outlives the connection under it, so failing over to another url or handing playback to a cast device moves <code>url</code> with it. In 5.x the sound was the connection, so its url never moved.</li>\n  <li><code>sound.url</code> is <code>undefined</code> until a <code>Sound</code> built from a promise resolves, because no url is known yet. 5.x had no pending sound to ask.</li>\n  </ul>\n        <p><code>stereo.play()</code> and <code>stereo.load()</code> with no url now reject instead of failing deeper in (sometimes silently)</p>\n  \n        <h3 id=\"casting-is-new-and-opt-in\" class=\"docs-md__h3\"><a href=\"#casting-is-new-and-opt-in\" class=\"heading-anchor\">Casting is new, and opt-in</a></h3>\n      <p>Nothing above is required to get it, and nothing breaks if you ignore it. If you do want AirPlay or Chromecast, the only thing your app has to supply is a <code>sound.castUrl</code>, a url the device can fetch on its own. See <a href=\"/docs/casting\"  class=\"docs-md__a\">Casting</a>.</p>\n  <hr class=\"docs-md__hr\">\n        <h2 id=\"coming-from-a-6-0-beta\" class=\"docs-md__h2\"><a href=\"#coming-from-a-6-0-beta\" class=\"heading-anchor\">Coming from a 6.0 beta</a></h2>\n      <p>If you tracked <code>6.0.0-beta.x</code>, everything above already applies to you. Two significant things changed between the last beta and 6.0 final.</p>\n  \n        <h3 id=\"entity-is-gone-sound-is-the-container\" class=\"docs-md__h3\"><a href=\"#entity-is-gone-sound-is-the-container\" class=\"heading-anchor\"><code>entity</code> is gone, <code>sound</code> is the container</a></h3>\n      <p>The betas resolved <code>{ sound, entity, failures }</code>, where <code>sound</code> was the connection and <code>entity</code> was the container. Trying to preserve the old API wasn't worth the vocab confusion. Naming is hard! <code>sound</code> is now the container everywhere, and the implementation rides alongside as <code>connection</code>:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE (beta)</span>\n  <span class=\"hljs-keyword\">let</span> { sound, entity } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  entity.<span class=\"hljs-title function_\">play</span>(); <span class=\"hljs-comment\">// the durable one</span>\n  sound.<span class=\"hljs-title function_\">play</span>(); <span class=\"hljs-comment\">// the disposable one</span>\n  \n  <span class=\"hljs-comment\">// AFTER</span>\n  <span class=\"hljs-keyword\">let</span> { sound, connection } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  sound.<span class=\"hljs-title function_\">play</span>(); <span class=\"hljs-comment\">// the durable one</span>\n  </code></pre>\n  <p>Anywhere you reached for <code>.entity</code> to get the real object, that's just <code>.sound</code> now.</p>\n  \n        <h3 id=\"sound-value-is-sound-connection\" class=\"docs-md__h3\"><a href=\"#sound-value-is-sound-connection\" class=\"heading-anchor\"><code>sound.value</code> is <code>sound.connection</code></a></h3>\n      <p>Same rename, on the <code>Sound</code> itself. <code>value</code> was a holdover from the 5.x sound-proxy architecture, and .connection makes more sense in the 6.x world.</p>\n  <hr class=\"docs-md__hr\">\n        <h2 id=\"upgrading-from-hifi\" class=\"docs-md__h2\"><a href=\"#upgrading-from-hifi\" class=\"heading-anchor\">Upgrading from Hifi</a></h2>\n      <p>If you're coming from <a href=\"http://github.com/nypublicradio/ember-hifi\"  class=\"docs-md__a\">ember-hifi</a>, welcome!</p>\n  \n        <h3 id=\"why-upgrade-\" class=\"docs-md__h3\"><a href=\"#why-upgrade-\" class=\"heading-anchor\">Why upgrade?</a></h3>\n      \n          <ol class=\"docs-list-decimal\"><li>Handy template helpers make things ridiculously simpler!</li>\n  <li>Stereo uses <a href=\"http://ember-concurrency.com\"  class=\"docs-md__a\">ember-concurrency</a> tasks instead of the home rolled mixture of rat-nested promises I devised back in 2015 when that sort of thing was in vogue. If you're using <code>ember-concurrency</code> tasks in your app you can change your <code>play</code> and <code>load</code> calls to use the task versions, at <code>this.stereo.playTask</code> and <code>this.stereo.loadTask</code></li>\n  <li>Improved tooling to help deal with autoplay problems. An <code>audio-blocked</code> event was added, as well as an <code>autoplay-allowed</code> helper and a <code>sound-is-blocked</code> helper to help deal with autoplay issues. (<a href=\"https://github.com/nypublicradio/ember-hifi/issues/44\"  class=\"docs-md__a\">fixes hifi issue #44</a>)</li>\n  <li>Better defaults. Volume is now by default at 100, aka system volume. You can set <code>initialVolume: 50</code> in the environment configuration if you want to keep it at its former level.</li>\n  <li>Better docs, better tests, better future! (<a href=\"https://github.com/nypublicradio/ember-hifi/issues/25\"  class=\"docs-md__a\">fixes hifi issue #25</a>)</li>\n  </ol>\n        \n        <h3 id=\"upgrade-your-existing-app\" class=\"docs-md__h3\"><a href=\"#upgrade-your-existing-app\" class=\"heading-anchor\">Upgrade your existing app</a></h3>\n      \n          <ol class=\"docs-list-decimal\"><li>Find anything that says \"hifi\", \"ember-hifi\", or \"emberHifi\" and rename it \"stereo\", \"ember-stereo\", or \"emberStereo\", respectively. The hifi service is probably the one you'll have the most of, and maybe your environment config.</li>\n  <li>Any event handlers that were expecting <code>(sound)</code> should now have a new signature and need to be changed to <code>({sound})</code>\n  e.g.</li>\n  </ol>\n        <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">//BEFORE</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">hifi</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;event-name&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">sound</span>) =&gt;</span> {\n    <span class=\"hljs-comment\">/* handler *\\/</span>\n  });\n  \n  <span class=\"hljs-comment\">//AFTER</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;event-name&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-comment\">/* handler *\\/</span>\n  });\n  </code></pre>\n  \n          <ol class=\"docs-list-decimal\"><li>Whatever tricks you had implement to do in order to catch that uncatchable 'All Promises Failed' error in <code>hifi</code> you can remove them. <code>play</code> and <code>load</code> requests will now fail sanely. And if you don't want them to throw errors at all, instead returning the error as part of the response, you can pass <code>silenceErrors: true</code> as an option. (fixes hifi issue <a href=\"https://github.com/nypublicradio/ember-hifi/issues/86\"  class=\"docs-md__a\">#86</a> and <a href=\"https://github.com/nypublicradio/ember-hifi/issues/16\"  class=\"docs-md__a\">#16</a>)</li>\n  <li><code>this.stereo.connections</code> has been renamed to <code>this.stereo.connectionNames</code>. <code>this.stereo.connections</code> now returns the actual connection objects.</li>\n  </ol>\n        </div>\n  */\n  {\n    \"id\": \"GqG4HqNC\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"upgrading\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Upgrading\\\"],[13],[1,\\\"\\\\n    \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"upgrading-to-6-0\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#upgrading-to-6-0\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Upgrading to 6.0\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"6.0 inverts the core model. 5.x jumped through hoops to fake a stable \\\"],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[1,\\\" (see \\\"],[10,3],[14,6,\\\"/docs/playing-sounds\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\"). Now it's real and reports \\\"],[10,\\\"code\\\"],[12],[1,\\\"isLoading\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"errors\\\"],[13],[1,\\\", and the \\\"],[10,\\\"code\\\"],[12],[1,\\\"connection\\\"],[13],[1,\\\" that resolved it. This makes connection swapping (like, to the new Airplay and Chromecast connections) possible.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"Changes from 5.x -> 6.0\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"1-findsound-is-synchronous-and-always-returns-a-sound\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#1-findsound-is-synchronous-and-always-returns-a-sound\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"1. \\\"],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\" is synchronous and always returns a \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"It find-or-creates and returns immediately, so drop any \\\"],[10,\\\"code\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" in front of it. The returned \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" may still be pending, so replace \\\\\\\"is there a sound yet?\\\\\\\" presence checks with \\\"],[10,\\\"code\\\"],[12],[1,\\\"isResolved\\\"],[13],[1,\\\" (a connection has resolved) or \\\"],[10,\\\"code\\\"],[12],[1,\\\"isLoaded\\\"],[13],[1,\\\" (it's ready to play):\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE: undefined until the audio loaded\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(url)) { \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* … */\\\"],[13],[1,\\\" }\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER: the Sound always exists, so check whether a connection resolved\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(url)?.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"isResolved\\\"],[13],[1,\\\") { \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* … */\\\"],[13],[1,\\\" }\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The Sound survives connection swaps and reports isLoading/isPending/isBlocked so listeners you attach to it before the sound is actually loaded stay valid now. When you genuinely need the underlying connection (and I don't know why you would) it's at \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.connection\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"2-match-sounds-by-hasurl-not-url-\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#2-match-sounds-by-hasurl-not-url-\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"2. Match sounds by \\\"],[10,\\\"code\\\"],[12],[1,\\\"hasUrl\\\"],[13],[1,\\\", not \\\"],[10,\\\"code\\\"],[12],[1,\\\"url ===\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A resolved \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" reports its connection's \\\"],[10,\\\"em\\\"],[12],[1,\\\"normalized\\\"],[13],[1,\\\" URL, which won't \\\"],[10,\\\"code\\\"],[12],[1,\\\"===\\\"],[13],[1,\\\" the raw identifier you handed in. Anywhere you compared event payloads against an identifier, switch to \\\"],[10,\\\"code\\\"],[12],[1,\\\"hasUrl\\\"],[13],[1,\\\":\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-loaded'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\" === \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"identifier\\\"],[13],[1,\\\") { \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"attach\\\"],[13],[1,\\\"(sound); }\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-loaded'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"hasUrl\\\"],[13],[1,\\\"?.(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"identifier\\\"],[13],[1,\\\")) { \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"attach\\\"],[13],[1,\\\"(sound); }\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"3-guard-for-a-null-currentsound\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#3-guard-for-a-null-currentsound\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"3. Guard for a \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\" currentSound\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.currentSound\\\"],[13],[1,\\\" can now clear to \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\" (for example when casting stops), so null-check it in your \\\"],[10,\\\"code\\\"],[12],[1,\\\"current-sound-changed\\\"],[13],[1,\\\" handlers:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'current-sound-changed'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (!sound) { \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"return\\\"],[13],[1,\\\"; }\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// …\\\"],[13],[1,\\\"\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"4-load-play-resolve-to-the-sound-not-the-connection\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#4-load-play-resolve-to-the-sound-not-the-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"4. \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\"/\\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" resolve to the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\", not the connection\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" means the same thing everywhere now: the identity-stable container. It's what events hand you, what \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentSound\\\"],[13],[1,\\\" holds, and what \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\"/\\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" resolve to. The connection is still available alongside it when you genuinely need it:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE: `sound` was the connection, and you were locked to it\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER: `sound` is the container, and the resolved connection is a sibling key. you probably don't need the connection\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound, connection } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"A \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" can now change the connection underneath it (see \\\"],[10,3],[14,6,\\\"/docs/playing-sounds\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\"), which is what makes failover and casting possible. \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"5-renamed-and-relocated\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#5-renamed-and-relocated\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"5. Renamed and relocated\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The vocabulary has been shifted a little in an attempt to make this more intuitive! A \\\"],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[1,\\\" is the identity-stable container you hold, a \\\"],[10,\\\"strong\\\"],[12],[1,\\\"connection\\\"],[13],[1,\\\" is the disposable implementation it plays through. The individual cache objects hanging off the stereo service are no longer needed, as all the relevant data lives on the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"table\\\"],[14,0,\\\"docs-table-auto\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Before\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"After\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tbody\\\"],[12],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findLoadedSound(url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.loadedSounds\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isLoaded)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.loadedUrls\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isLoaded).map((s) => s.url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.cachedErrors\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isErrored)\\\"],[13],[1,\\\", then read \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.errors\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.errorCache.find(url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url).errors\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.urlsAreEqual(a, b)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.hasUrl(identifier)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"failure.erroredSound\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"failure.erroredConnection\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"strategy.createSound()\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"strategy.createConnection()\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.metadataCache.store(url, data)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url).metadata = data\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.urlCache.resolve(identifier)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(identifier).resolveUrls()\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Metadata reads are unchanged: \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.metadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.currentMetadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{sound-metadata identifier}}\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Some of them return something different than they used to:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.hasUrl\\\"],[13],[1,\\\" answers while a \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" is still pending, falling back to the identifier it was built with. It used to return \\\"],[10,\\\"code\\\"],[12],[1,\\\"undefined\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds\\\"],[13],[1,\\\" replaces the old cache-backed lists. It holds every \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" a load was attempted on, including pending and errored ones so filter it for the subset you want.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.url\\\"],[13],[1,\\\" can change over the life of the sound. A \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" outlives the connection under it, so failing over to another url or handing playback to a cast device moves \\\"],[10,\\\"code\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\" with it. In 5.x the sound was the connection, so its url never moved.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.url\\\"],[13],[1,\\\" is \\\"],[10,\\\"code\\\"],[12],[1,\\\"undefined\\\"],[13],[1,\\\" until a \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" built from a promise resolves, because no url is known yet. 5.x had no pending sound to ask.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.play()\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.load()\\\"],[13],[1,\\\" with no url now reject instead of failing deeper in (sometimes silently)\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"casting-is-new-and-opt-in\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#casting-is-new-and-opt-in\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Casting is new, and opt-in\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Nothing above is required to get it, and nothing breaks if you ignore it. If you do want AirPlay or Chromecast, the only thing your app has to supply is a \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[1,\\\", a url the device can fetch on its own. See \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Casting\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"hr\\\"],[14,0,\\\"docs-md__hr\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"coming-from-a-6-0-beta\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#coming-from-a-6-0-beta\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Coming from a 6.0 beta\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"If you tracked \\\"],[10,\\\"code\\\"],[12],[1,\\\"6.0.0-beta.x\\\"],[13],[1,\\\", everything above already applies to you. Two significant things changed between the last beta and 6.0 final.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"entity-is-gone-sound-is-the-container\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#entity-is-gone-sound-is-the-container\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"entity\\\"],[13],[1,\\\" is gone, \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" is the container\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The betas resolved \\\"],[10,\\\"code\\\"],[12],[1,\\\"{ sound, entity, failures }\\\"],[13],[1,\\\", where \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" was the connection and \\\"],[10,\\\"code\\\"],[12],[1,\\\"entity\\\"],[13],[1,\\\" was the container. Trying to preserve the old API wasn't worth the vocab confusion. Naming is hard! \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" is now the container everywhere, and the implementation rides alongside as \\\"],[10,\\\"code\\\"],[12],[1,\\\"connection\\\"],[13],[1,\\\":\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE (beta)\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound, entity } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\nentity.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(); \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// the durable one\\\"],[13],[1,\\\"\\\\nsound.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(); \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// the disposable one\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound, connection } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\nsound.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(); \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// the durable one\\\"],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Anywhere you reached for \\\"],[10,\\\"code\\\"],[12],[1,\\\".entity\\\"],[13],[1,\\\" to get the real object, that's just \\\"],[10,\\\"code\\\"],[12],[1,\\\".sound\\\"],[13],[1,\\\" now.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"sound-value-is-sound-connection\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#sound-value-is-sound-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.value\\\"],[13],[1,\\\" is \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.connection\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Same rename, on the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" itself. \\\"],[10,\\\"code\\\"],[12],[1,\\\"value\\\"],[13],[1,\\\" was a holdover from the 5.x sound-proxy architecture, and .connection makes more sense in the 6.x world.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"hr\\\"],[14,0,\\\"docs-md__hr\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"upgrading-from-hifi\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#upgrading-from-hifi\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Upgrading from Hifi\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"If you're coming from \\\"],[10,3],[14,6,\\\"http://github.com/nypublicradio/ember-hifi\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"ember-hifi\\\"],[13],[1,\\\", welcome!\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"why-upgrade-\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#why-upgrade-\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Why upgrade?\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ol\\\"],[14,0,\\\"docs-list-decimal\\\"],[12],[10,\\\"li\\\"],[12],[1,\\\"Handy template helpers make things ridiculously simpler!\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Stereo uses \\\"],[10,3],[14,6,\\\"http://ember-concurrency.com\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"ember-concurrency\\\"],[13],[1,\\\" tasks instead of the home rolled mixture of rat-nested promises I devised back in 2015 when that sort of thing was in vogue. If you're using \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-concurrency\\\"],[13],[1,\\\" tasks in your app you can change your \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" calls to use the task versions, at \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.playTask\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.loadTask\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Improved tooling to help deal with autoplay problems. An \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio-blocked\\\"],[13],[1,\\\" event was added, as well as an \\\"],[10,\\\"code\\\"],[12],[1,\\\"autoplay-allowed\\\"],[13],[1,\\\" helper and a \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound-is-blocked\\\"],[13],[1,\\\" helper to help deal with autoplay issues. (\\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/44\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"fixes hifi issue #44\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Better defaults. Volume is now by default at 100, aka system volume. You can set \\\"],[10,\\\"code\\\"],[12],[1,\\\"initialVolume: 50\\\"],[13],[1,\\\" in the environment configuration if you want to keep it at its former level.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Better docs, better tests, better future! (\\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/25\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"fixes hifi issue #25\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"upgrade-your-existing-app\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#upgrade-your-existing-app\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Upgrade your existing app\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ol\\\"],[14,0,\\\"docs-list-decimal\\\"],[12],[10,\\\"li\\\"],[12],[1,\\\"Find anything that says \\\\\\\"hifi\\\\\\\", \\\\\\\"ember-hifi\\\\\\\", or \\\\\\\"emberHifi\\\\\\\" and rename it \\\\\\\"stereo\\\\\\\", \\\\\\\"ember-stereo\\\\\\\", or \\\\\\\"emberStereo\\\\\\\", respectively. The hifi service is probably the one you'll have the most of, and maybe your environment config.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Any event handlers that were expecting \\\"],[10,\\\"code\\\"],[12],[1,\\\"(sound)\\\"],[13],[1,\\\" should now have a new signature and need to be changed to \\\"],[10,\\\"code\\\"],[12],[1,\\\"({sound})\\\"],[13],[1,\\\"\\\\ne.g.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"//BEFORE\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"hifi\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'event-name'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* handler */\\\"],[13],[1,\\\"\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"//AFTER\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'event-name'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* handler */\\\"],[13],[1,\\\"\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ol\\\"],[14,0,\\\"docs-list-decimal\\\"],[12],[10,\\\"li\\\"],[12],[1,\\\"Whatever tricks you had implement to do in order to catch that uncatchable 'All Promises Failed' error in \\\"],[10,\\\"code\\\"],[12],[1,\\\"hifi\\\"],[13],[1,\\\" you can remove them. \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" requests will now fail sanely. And if you don't want them to throw errors at all, instead returning the error as part of the response, you can pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"silenceErrors: true\\\"],[13],[1,\\\" as an option. (fixes hifi issue \\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/86\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"#86\\\"],[13],[1,\\\" and \\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/16\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"#16\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.connections\\\"],[13],[1,\\\" has been renamed to \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.connectionNames\\\"],[13],[1,\\\". \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.connections\\\"],[13],[1,\\\" now returns the actual connection objects.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[13]],[],false,[]]\",\n    \"moduleName\": \"docs/docs/upgrading.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/helpers/and\", [\"exports\", \"ember-truth-helpers/helpers/and\"], function (_exports, _and) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _and.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/and\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/app-version\", [\"exports\", \"@ember/component/helper\", \"docs/config/environment\", \"ember-cli-app-version/utils/regexp\"], function (_exports, _helper, _environment, _regexp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.appVersion = appVersion;\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/helper\",0,\"docs/config/environment\",0,\"ember-cli-app-version/utils/regexp\"eaimeta@70e063a35619d71f\n  function appVersion(_, hash = {}) {\n    const version = _environment.default.APP.version;\n    // e.g. 1.0.0-alpha.1+4jds75hf\n\n    // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n    let versionOnly = hash.versionOnly || hash.hideSha;\n    let shaOnly = hash.shaOnly || hash.hideVersion;\n    let match = null;\n    if (versionOnly) {\n      if (hash.showExtended) {\n        match = version.match(_regexp.versionExtendedRegExp); // 1.0.0-alpha.1\n      }\n      // Fallback to just version\n      if (!match) {\n        match = version.match(_regexp.versionRegExp); // 1.0.0\n      }\n    }\n    if (shaOnly) {\n      match = version.match(_regexp.shaRegExp); // 4jds75hf\n    }\n    return match ? match[0] : version;\n  }\n  var _default = _exports.default = (0, _helper.helper)(appVersion);\n});","define(\"docs/helpers/append\", [\"exports\", \"ember-composable-helpers/helpers/append\"], function (_exports, _append) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"append\", {\n    enumerable: true,\n    get: function () {\n      return _append.append;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _append.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/append\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/autoplay-allowed\", [\"exports\", \"ember-stereo/helpers/autoplay-allowed\"], function (_exports, _autoplayAllowed) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _autoplayAllowed.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/autoplay-allowed\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/break-on\", [\"exports\", \"ember-cli-addon-docs/helpers/break-on\"], function (_exports, _breakOn) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _breakOn.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/helpers/break-on\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/call\", [\"exports\", \"ember-composable-helpers/helpers/call\"], function (_exports, _call) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"call\", {\n    enumerable: true,\n    get: function () {\n      return _call.call;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _call.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/call\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/cancel-all\", [\"exports\", \"ember-concurrency/helpers/cancel-all\"], function (_exports, _cancelAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _cancelAll.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/helpers/cancel-all\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/capitalize\", [\"exports\", \"ember-cli-addon-docs/helpers/capitalize\"], function (_exports, _capitalize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _capitalize.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/helpers/capitalize\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/casting-available\", [\"exports\", \"ember-stereo/helpers/casting-available\"], function (_exports, _castingAvailable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _castingAvailable.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/casting-available\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/chunk\", [\"exports\", \"ember-composable-helpers/helpers/chunk\"], function (_exports, _chunk) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"chunk\", {\n    enumerable: true,\n    get: function () {\n      return _chunk.chunk;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _chunk.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/chunk\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/compact\", [\"exports\", \"ember-composable-helpers/helpers/compact\"], function (_exports, _compact) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _compact.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/compact\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/compute\", [\"exports\", \"ember-composable-helpers/helpers/compute\"], function (_exports, _compute) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"compute\", {\n    enumerable: true,\n    get: function () {\n      return _compute.compute;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _compute.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/compute\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/current-sound\", [\"exports\", \"ember-stereo/helpers/current-sound\"], function (_exports, _currentSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _currentSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/current-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/dec\", [\"exports\", \"ember-composable-helpers/helpers/dec\"], function (_exports, _dec) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"dec\", {\n    enumerable: true,\n    get: function () {\n      return _dec.dec;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _dec.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/dec\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/drop\", [\"exports\", \"ember-composable-helpers/helpers/drop\"], function (_exports, _drop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _drop.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/drop\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/ensure-safe-component\", [\"exports\", \"@embroider/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _util.EnsureSafeComponentHelper;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@embroider/util\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/entries\", [\"exports\", \"ember-composable-helpers/helpers/entries\"], function (_exports, _entries) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _entries.default;\n    }\n  });\n  Object.defineProperty(_exports, \"entries\", {\n    enumerable: true,\n    get: function () {\n      return _entries.entries;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/entries\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/eq\"], function (_exports, _eq) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _eq.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/eq\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/fastforward-sound\", [\"exports\", \"ember-stereo/helpers/fastforward-sound\"], function (_exports, _fastforwardSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _fastforwardSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/fastforward-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/filter-by\", [\"exports\", \"ember-composable-helpers/helpers/filter-by\"], function (_exports, _filterBy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _filterBy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/filter-by\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/filter\", [\"exports\", \"ember-composable-helpers/helpers/filter\"], function (_exports, _filter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _filter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/filter\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/find-by\", [\"exports\", \"ember-composable-helpers/helpers/find-by\"], function (_exports, _findBy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _findBy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/find-by\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/find-sound\", [\"exports\", \"ember-stereo/helpers/find-sound\"], function (_exports, _findSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _findSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/find-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/flatten\", [\"exports\", \"ember-composable-helpers/helpers/flatten\"], function (_exports, _flatten) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _flatten.default;\n    }\n  });\n  Object.defineProperty(_exports, \"flatten\", {\n    enumerable: true,\n    get: function () {\n      return _flatten.flatten;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/flatten\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/from-entries\", [\"exports\", \"ember-composable-helpers/helpers/from-entries\"], function (_exports, _fromEntries) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _fromEntries.default;\n    }\n  });\n  Object.defineProperty(_exports, \"fromEntries\", {\n    enumerable: true,\n    get: function () {\n      return _fromEntries.fromEntries;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/from-entries\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/get-code-snippet\", [\"exports\", \"ember-code-snippet/helpers/get-code-snippet\"], function (_exports, _getCodeSnippet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _getCodeSnippet.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-code-snippet/helpers/get-code-snippet\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/group-by\", [\"exports\", \"ember-composable-helpers/helpers/group-by\"], function (_exports, _groupBy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _groupBy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/group-by\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/gt\", [\"exports\", \"ember-truth-helpers/helpers/gt\"], function (_exports, _gt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _gt.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/gt\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/gte\", [\"exports\", \"ember-truth-helpers/helpers/gte\"], function (_exports, _gte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _gte.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/gte\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/has-next\", [\"exports\", \"ember-composable-helpers/helpers/has-next\"], function (_exports, _hasNext) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _hasNext.default;\n    }\n  });\n  Object.defineProperty(_exports, \"hasNext\", {\n    enumerable: true,\n    get: function () {\n      return _hasNext.hasNext;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/has-next\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/has-previous\", [\"exports\", \"ember-composable-helpers/helpers/has-previous\"], function (_exports, _hasPrevious) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _hasPrevious.default;\n    }\n  });\n  Object.defineProperty(_exports, \"hasPrevious\", {\n    enumerable: true,\n    get: function () {\n      return _hasPrevious.hasPrevious;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/has-previous\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/if-key\", [\"exports\", \"ember-keyboard/helpers/if-key.js\"], function (_exports, _ifKey) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _ifKey.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-keyboard/helpers/if-key.js\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/ignore-children\", [\"exports\", \"ember-modal-dialog/helpers/ignore-children\"], function (_exports, _ignoreChildren) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _ignoreChildren.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/helpers/ignore-children\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/inc\", [\"exports\", \"ember-composable-helpers/helpers/inc\"], function (_exports, _inc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _inc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"inc\", {\n    enumerable: true,\n    get: function () {\n      return _inc.inc;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/inc\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/includes\", [\"exports\", \"ember-composable-helpers/helpers/includes\"], function (_exports, _includes) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _includes.default;\n    }\n  });\n  Object.defineProperty(_exports, \"includes\", {\n    enumerable: true,\n    get: function () {\n      return _includes.includes;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/includes\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/intersect\", [\"exports\", \"ember-composable-helpers/helpers/intersect\"], function (_exports, _intersect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _intersect.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/intersect\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/invoke\", [\"exports\", \"ember-composable-helpers/helpers/invoke\"], function (_exports, _invoke) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _invoke.default;\n    }\n  });\n  Object.defineProperty(_exports, \"invoke\", {\n    enumerable: true,\n    get: function () {\n      return _invoke.invoke;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/invoke\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/is-array\", [\"exports\", \"ember-truth-helpers/helpers/is-array\"], function (_exports, _isArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isArray.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/is-array\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/is-casting\", [\"exports\", \"ember-stereo/helpers/is-casting\"], function (_exports, _isCasting) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isCasting.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/is-casting\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/is-clipboard-supported\", [\"exports\", \"ember-cli-clipboard/helpers/is-clipboard-supported\"], function (_exports, _isClipboardSupported) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isClipboardSupported.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-clipboard/helpers/is-clipboard-supported\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/is-empty\", [\"exports\", \"ember-truth-helpers/helpers/is-empty\"], function (_exports, _isEmpty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isEmpty.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/is-empty\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/is-equal\", [\"exports\", \"ember-truth-helpers/helpers/is-equal\"], function (_exports, _isEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _isEqual.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/is-equal\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/join\", [\"exports\", \"ember-composable-helpers/helpers/join\"], function (_exports, _join) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _join.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/join\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/json-stringify\", [\"exports\", \"ember-stereo/helpers/json-stringify\"], function (_exports, _jsonStringify) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _jsonStringify.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/json-stringify\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/keys\", [\"exports\", \"ember-composable-helpers/helpers/keys\"], function (_exports, _keys) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _keys.default;\n    }\n  });\n  Object.defineProperty(_exports, \"keys\", {\n    enumerable: true,\n    get: function () {\n      return _keys.keys;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/keys\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/load-sound\", [\"exports\", \"ember-stereo/helpers/load-sound\"], function (_exports, _loadSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _loadSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/load-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/lt\", [\"exports\", \"ember-truth-helpers/helpers/lt\"], function (_exports, _lt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _lt.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/lt\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/lte\", [\"exports\", \"ember-truth-helpers/helpers/lte\"], function (_exports, _lte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _lte.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/lte\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/map-by\", [\"exports\", \"ember-composable-helpers/helpers/map-by\"], function (_exports, _mapBy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _mapBy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/map-by\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/map\", [\"exports\", \"ember-composable-helpers/helpers/map\"], function (_exports, _map) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _map.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/map\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/next\", [\"exports\", \"ember-composable-helpers/helpers/next\"], function (_exports, _next) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _next.default;\n    }\n  });\n  Object.defineProperty(_exports, \"next\", {\n    enumerable: true,\n    get: function () {\n      return _next.next;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/next\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/noop\", [\"exports\", \"ember-composable-helpers/helpers/noop\"], function (_exports, _noop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _noop.default;\n    }\n  });\n  Object.defineProperty(_exports, \"noop\", {\n    enumerable: true,\n    get: function () {\n      return _noop.noop;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/noop\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-eq\"], function (_exports, _notEq) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _notEq.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/not-eq\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/not\", [\"exports\", \"ember-truth-helpers/helpers/not\"], function (_exports, _not) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _not.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/not\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/numeric-duration\", [\"exports\", \"ember-stereo/helpers/numeric-duration\"], function (_exports, _numericDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _numericDuration.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/numeric-duration\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/object-at\", [\"exports\", \"ember-composable-helpers/helpers/object-at\"], function (_exports, _objectAt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _objectAt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"objectAt\", {\n    enumerable: true,\n    get: function () {\n      return _objectAt.objectAt;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/object-at\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/on-key\", [\"exports\", \"ember-keyboard/helpers/on-key.js\"], function (_exports, _onKey) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _onKey.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-keyboard/helpers/on-key.js\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/optional\", [\"exports\", \"ember-composable-helpers/helpers/optional\"], function (_exports, _optional) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _optional.default;\n    }\n  });\n  Object.defineProperty(_exports, \"optional\", {\n    enumerable: true,\n    get: function () {\n      return _optional.optional;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/optional\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/or\", [\"exports\", \"ember-truth-helpers/helpers/or\"], function (_exports, _or) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _or.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/or\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/page-title\", [\"exports\", \"ember-page-title/helpers/page-title\"], function (_exports, _pageTitle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pageTitle.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-page-title/helpers/page-title\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/pause-sound\", [\"exports\", \"ember-stereo/helpers/pause-sound\"], function (_exports, _pauseSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pauseSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/pause-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/perform\", [\"exports\", \"ember-concurrency/helpers/perform\"], function (_exports, _perform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _perform.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/helpers/perform\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/pick\", [\"exports\", \"ember-composable-helpers/helpers/pick\"], function (_exports, _pick) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pick.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pick\", {\n    enumerable: true,\n    get: function () {\n      return _pick.pick;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/pick\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/pipe-action\", [\"exports\", \"ember-composable-helpers/helpers/pipe-action\"], function (_exports, _pipeAction) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pipeAction.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/pipe-action\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/pipe\", [\"exports\", \"ember-composable-helpers/helpers/pipe\"], function (_exports, _pipe) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pipe.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pipe\", {\n    enumerable: true,\n    get: function () {\n      return _pipe.pipe;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/pipe\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/play-sound\", [\"exports\", \"ember-stereo/helpers/play-sound\"], function (_exports, _playSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _playSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/play-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/pluralize\", [\"exports\", \"ember-inflector/lib/helpers/pluralize\"], function (_exports, _pluralize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-inflector/lib/helpers/pluralize\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = _pluralize.default;\n});","define(\"docs/helpers/prevent-default\", [\"exports\", \"ember-event-helpers/helpers/prevent-default\"], function (_exports, _preventDefault) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _preventDefault.default;\n    }\n  });\n  Object.defineProperty(_exports, \"preventDefault\", {\n    enumerable: true,\n    get: function () {\n      return _preventDefault.preventDefault;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-event-helpers/helpers/prevent-default\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/previous\", [\"exports\", \"ember-composable-helpers/helpers/previous\"], function (_exports, _previous) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _previous.default;\n    }\n  });\n  Object.defineProperty(_exports, \"previous\", {\n    enumerable: true,\n    get: function () {\n      return _previous.previous;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/previous\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/queue\", [\"exports\", \"ember-composable-helpers/helpers/queue\"], function (_exports, _queue) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _queue.default;\n    }\n  });\n  Object.defineProperty(_exports, \"queue\", {\n    enumerable: true,\n    get: function () {\n      return _queue.queue;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/queue\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/range\", [\"exports\", \"ember-composable-helpers/helpers/range\"], function (_exports, _range) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _range.default;\n    }\n  });\n  Object.defineProperty(_exports, \"range\", {\n    enumerable: true,\n    get: function () {\n      return _range.range;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/range\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/reduce\", [\"exports\", \"ember-composable-helpers/helpers/reduce\"], function (_exports, _reduce) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _reduce.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/reduce\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/reject-by\", [\"exports\", \"ember-composable-helpers/helpers/reject-by\"], function (_exports, _rejectBy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _rejectBy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/reject-by\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/repeat\", [\"exports\", \"ember-composable-helpers/helpers/repeat\"], function (_exports, _repeat) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _repeat.default;\n    }\n  });\n  Object.defineProperty(_exports, \"repeat\", {\n    enumerable: true,\n    get: function () {\n      return _repeat.repeat;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/repeat\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/reverse\", [\"exports\", \"ember-composable-helpers/helpers/reverse\"], function (_exports, _reverse) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _reverse.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/reverse\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/rewind-sound\", [\"exports\", \"ember-stereo/helpers/rewind-sound\"], function (_exports, _rewindSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _rewindSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/rewind-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/seek-sound\", [\"exports\", \"ember-stereo/helpers/seek-sound\"], function (_exports, _seekSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _seekSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/seek-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/set\", [\"exports\", \"ember-set-helper/helpers/set\"], function (_exports, _set) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _set.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-set-helper/helpers/set\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/shuffle\", [\"exports\", \"ember-composable-helpers/helpers/shuffle\"], function (_exports, _shuffle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _shuffle.default;\n    }\n  });\n  Object.defineProperty(_exports, \"shuffle\", {\n    enumerable: true,\n    get: function () {\n      return _shuffle.shuffle;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/shuffle\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/singularize\", [\"exports\", \"ember-inflector/lib/helpers/singularize\"], function (_exports, _singularize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-inflector/lib/helpers/singularize\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = _singularize.default;\n});","define(\"docs/helpers/slice\", [\"exports\", \"ember-composable-helpers/helpers/slice\"], function (_exports, _slice) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _slice.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/slice\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sort-by\", [\"exports\", \"ember-composable-helpers/helpers/sort-by\"], function (_exports, _sortBy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _sortBy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/sort-by\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-duration\", [\"exports\", \"ember-stereo/helpers/sound-duration\"], function (_exports, _soundDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundDuration.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-duration\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-end-timestamp\", [\"exports\", \"ember-stereo/helpers/sound-end-timestamp\"], function (_exports, _soundEndTimestamp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundEndTimestamp.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-end-timestamp\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-error-details\", [\"exports\", \"ember-stereo/helpers/sound-error-details\"], function (_exports, _soundErrorDetails) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundErrorDetails.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-error-details\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-blocked\", [\"exports\", \"ember-stereo/helpers/sound-is-blocked\"], function (_exports, _soundIsBlocked) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsBlocked.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-blocked\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-errored\", [\"exports\", \"ember-stereo/helpers/sound-is-errored\"], function (_exports, _soundIsErrored) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsErrored.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-errored\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-fastforwardable\", [\"exports\", \"ember-stereo/helpers/sound-is-fastforwardable\"], function (_exports, _soundIsFastforwardable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsFastforwardable.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-fastforwardable\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-loaded\", [\"exports\", \"ember-stereo/helpers/sound-is-loaded\"], function (_exports, _soundIsLoaded) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsLoaded.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-loaded\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-loading\", [\"exports\", \"ember-stereo/helpers/sound-is-loading\"], function (_exports, _soundIsLoading) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsLoading.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-loading\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-playing\", [\"exports\", \"ember-stereo/helpers/sound-is-playing\"], function (_exports, _soundIsPlaying) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsPlaying.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-playing\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-rewindable\", [\"exports\", \"ember-stereo/helpers/sound-is-rewindable\"], function (_exports, _soundIsRewindable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsRewindable.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-rewindable\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-is-seekable\", [\"exports\", \"ember-stereo/helpers/sound-is-seekable\"], function (_exports, _soundIsSeekable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundIsSeekable.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-is-seekable\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-metadata\", [\"exports\", \"ember-stereo/helpers/sound-metadata\"], function (_exports, _soundMetadata) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundMetadata.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-metadata\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-position-timestamp\", [\"exports\", \"ember-stereo/helpers/sound-position-timestamp\"], function (_exports, _soundPositionTimestamp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundPositionTimestamp.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-position-timestamp\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-position\", [\"exports\", \"ember-stereo/helpers/sound-position\"], function (_exports, _soundPosition) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundPosition.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-position\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/sound-start-timestamp\", [\"exports\", \"ember-stereo/helpers/sound-start-timestamp\"], function (_exports, _soundStartTimestamp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundStartTimestamp.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/sound-start-timestamp\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/stereo-volume-is-adjustable\", [\"exports\", \"ember-stereo/helpers/stereo-volume-is-adjustable\"], function (_exports, _stereoVolumeIsAdjustable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _stereoVolumeIsAdjustable.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/stereo-volume-is-adjustable\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/stereo-volume\", [\"exports\", \"ember-stereo/helpers/stereo-volume\"], function (_exports, _stereoVolume) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _stereoVolume.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/stereo-volume\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/stop-propagation\", [\"exports\", \"ember-event-helpers/helpers/stop-propagation\"], function (_exports, _stopPropagation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _stopPropagation.default;\n    }\n  });\n  Object.defineProperty(_exports, \"stopPropagation\", {\n    enumerable: true,\n    get: function () {\n      return _stopPropagation.stopPropagation;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-event-helpers/helpers/stop-propagation\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/stop-sound\", [\"exports\", \"ember-stereo/helpers/stop-sound\"], function (_exports, _stopSound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _stopSound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/stop-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/strategy-status\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/component/helper\"eaimeta@70e063a35619d71f\n  function color(item, loadWasAttempted) {\n    if (loadWasAttempted) {\n      if (item.success) {\n        return 'green-500';\n      } else if (item.canPlay && !item.tried) {\n        return 'gray-800';\n      } else if (item.canPlay && item.tried) {\n        return 'red';\n      } else if (!item.canPlay) {\n        return 'gray-800';\n      }\n    } else {\n      if (item.canPlay) {\n        return 'gray-800';\n      } else if (!item.canPlay) {\n        return 'gray-800';\n      }\n    }\n  }\n  function status(item, loadWasAttempted = false) {\n    if (loadWasAttempted) {\n      if (item.success) {\n        return 'success';\n      } else if (item.canPlay && !item.tried) {\n        return 'eligible';\n      } else if (item.canPlay && item.tried) {\n        return 'failure';\n      } else {\n        //} if (!item.canPlay) {\n        return 'ineligible';\n      }\n    } else {\n      if (item.canPlay) {\n        return 'eligible';\n      } else {\n        return 'ineligible';\n      }\n    }\n  }\n  function message(item, loadWasAttempted) {\n    if (loadWasAttempted) {\n      if (item.success) {\n        return 'succeeded';\n      } else if (item.canPlay && item.tried) {\n        return item.error || 'attempted and failed';\n      } else if (item.canPlay && !item.tried) {\n        return 'was not attempted';\n      } else if (!item.canPlay) {\n        return 'ineligible, not attempted';\n      }\n    } else {\n      if (item.canPlay) {\n        return 'is eligible, will attempt';\n      } else if (!item.canPlay) {\n        return 'is ineligible, will not attempt';\n      }\n    }\n  }\n  var _default = _exports.default = (0, _helper.helper)(function strategyStatus(params, hash) {\n    let [item] = params;\n    let {\n      loadWasAttempted,\n      userSelected\n    } = hash;\n    return {\n      color: color(item, loadWasAttempted),\n      status: status(item, loadWasAttempted, userSelected),\n      message: message(item, loadWasAttempted, userSelected)\n    };\n  });\n});","define(\"docs/helpers/svg-jar\", [\"exports\", \"ember-svg-jar/helpers/svg-jar\"], function (_exports, _svgJar) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _svgJar.default;\n    }\n  });\n  Object.defineProperty(_exports, \"svgJar\", {\n    enumerable: true,\n    get: function () {\n      return _svgJar.svgJar;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-svg-jar/helpers/svg-jar\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/take\", [\"exports\", \"ember-composable-helpers/helpers/take\"], function (_exports, _take) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _take.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/take\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/task\", [\"exports\", \"ember-concurrency/helpers/task\"], function (_exports, _task) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _task.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-concurrency/helpers/task\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/toggle-action\", [\"exports\", \"ember-composable-helpers/helpers/toggle-action\"], function (_exports, _toggleAction) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _toggleAction.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/toggle-action\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/toggle-play-sound\", [\"exports\", \"ember-stereo/helpers/toggle-play-sound\"], function (_exports, _togglePlaySound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _togglePlaySound.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/toggle-play-sound\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/toggle-stereo-mute\", [\"exports\", \"ember-stereo/helpers/toggle-stereo-mute\"], function (_exports, _toggleStereoMute) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _toggleStereoMute.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/helpers/toggle-stereo-mute\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/toggle\", [\"exports\", \"ember-composable-helpers/helpers/toggle\"], function (_exports, _toggle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _toggle.default;\n    }\n  });\n  Object.defineProperty(_exports, \"toggle\", {\n    enumerable: true,\n    get: function () {\n      return _toggle.toggle;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/toggle\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/type-signature\", [\"exports\", \"ember-cli-addon-docs/helpers/type-signature\"], function (_exports, _typeSignature) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _typeSignature.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/helpers/type-signature\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/union\", [\"exports\", \"ember-composable-helpers/helpers/union\"], function (_exports, _union) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _union.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/union\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/user-agent\", [\"exports\", \"ember-useragent/helpers/user-agent\"], function (_exports, _userAgent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _userAgent.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-useragent/helpers/user-agent\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/values\", [\"exports\", \"ember-composable-helpers/helpers/values\"], function (_exports, _values) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _values.default;\n    }\n  });\n  Object.defineProperty(_exports, \"values\", {\n    enumerable: true,\n    get: function () {\n      return _values.values;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/values\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/without\", [\"exports\", \"ember-composable-helpers/helpers/without\"], function (_exports, _without) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _without.default;\n    }\n  });\n  Object.defineProperty(_exports, \"without\", {\n    enumerable: true,\n    get: function () {\n      return _without.without;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-composable-helpers/helpers/without\"eaimeta@70e063a35619d71f\n});","define(\"docs/helpers/xor\", [\"exports\", \"ember-truth-helpers/helpers/xor\"], function (_exports, _xor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _xor.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-truth-helpers/helpers/xor\"eaimeta@70e063a35619d71f\n});","define(\"docs/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader as |header|>\n    <header.link @route='diagnostic'>\n      Diagnostic\n    </header.link>\n  </DocsHeader>\n  <DocsHero\n    @logo='ember'\n    @slimHeading='Ember Stereo'\n    @byline='Ember stereo makes it easy to play audio in your modern ember app'\n  />\n  \n  <div\n    class='docs-px-4 md:docs-px-8 lg:docs-px-20 docs-mx-auto md:docs-mx-0 docs-mt-6 md:docs-mt-12 md:docs-min-w-0 md:docs-flex-1 ember-view'\n  >\n    <Docs::AttentionGetter />\n  </div>\n  */\n  {\n    \"id\": \"Rozqhnbn\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"link\\\"]],null,[[\\\"@route\\\"],[\\\"diagnostic\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Diagnostic\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[8,[39,1],null,[[\\\"@logo\\\",\\\"@slimHeading\\\",\\\"@byline\\\"],[\\\"ember\\\",\\\"Ember Stereo\\\",\\\"Ember stereo makes it easy to play audio in your modern ember app\\\"]],null],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"docs-px-4 md:docs-px-8 lg:docs-px-20 docs-mx-auto md:docs-mx-0 docs-mt-6 md:docs-mt-12 md:docs-min-w-0 md:docs-flex-1 ember-view\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13]],[\\\"header\\\"],false,[\\\"docs-header\\\",\\\"docs-hero\\\",\\\"docs/attention-getter\\\"]]\",\n    \"moduleName\": \"docs/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/initializers/app-version\", [\"exports\", \"ember-cli-app-version/initializer-factory\", \"docs/config/environment\"], function (_exports, _initializerFactory, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-app-version/initializer-factory\",0,\"docs/config/environment\"eaimeta@70e063a35619d71f\n  let name, version;\n  if (_environment.default.APP) {\n    name = _environment.default.APP.name;\n    version = _environment.default.APP.version;\n  }\n  var _default = _exports.default = {\n    name: 'App Version',\n    initialize: (0, _initializerFactory.default)(name, version)\n  };\n});","define(\"docs/initializers/ember-data\", [\"exports\", \"@ember-data/request-utils/deprecation-support\"], function (_exports, _deprecationSupport) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/request-utils/deprecation-support\"eaimeta@70e063a35619d71f\n  /*\n    This code initializes EmberData in an Ember application.\n  */\n  var _default = _exports.default = {\n    name: 'ember-data',\n    initialize(application) {\n      application.registerOptionsForType('serializer', {\n        singleton: false\n      });\n      application.registerOptionsForType('adapter', {\n        singleton: false\n      });\n    }\n  };\n});","define(\"docs/initializers/route-anchor-jump\", [\"exports\", \"ember-cli-addon-docs/initializers/route-anchor-jump\"], function (_exports, _routeAnchorJump) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _routeAnchorJump.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function () {\n      return _routeAnchorJump.initialize;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/initializers/route-anchor-jump\"eaimeta@70e063a35619d71f\n});","define(\"docs/instance-initializers/add-modals-container\", [\"exports\", \"ember-modal-dialog/instance-initializers/add-modals-container\"], function (_exports, _addModalsContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-modal-dialog/instance-initializers/add-modals-container\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = {\n    name: 'add-modals-container',\n    initialize: _addModalsContainer.default\n  };\n});","define(\"docs/instance-initializers/clear-double-boot\", [\"exports\", \"ember-cli-fastboot/instance-initializers/clear-double-boot\"], function (_exports, _clearDoubleBoot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _clearDoubleBoot.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-fastboot/instance-initializers/clear-double-boot\"eaimeta@70e063a35619d71f\n});","define(\"docs/instance-initializers/ember-router-scroll\", [\"exports\", \"@nullvoxpopuli/ember-router-scroll/instance-initializers/ember-router-scroll\"], function (_exports, _emberRouterScroll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberRouterScroll.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@nullvoxpopuli/ember-router-scroll/instance-initializers/ember-router-scroll\"eaimeta@70e063a35619d71f\n});","define(\"docs/instance-initializers/user-agent\", [\"exports\", \"ember-useragent/instance-initializers/user-agent\"], function (_exports, _userAgent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _userAgent.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function () {\n      return _userAgent.initialize;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-useragent/instance-initializers/user-agent\"eaimeta@70e063a35619d71f\n});","define(\"docs/locations/none\", [\"exports\", \"ember-cli-fastboot/locations/none\"], function (_exports, _none) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _none.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-fastboot/locations/none\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/cast-button\", [\"exports\", \"ember-stereo/modifiers/cast-button\"], function (_exports, _castButton) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _castButton.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/modifiers/cast-button\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/clipboard\", [\"exports\", \"ember-cli-clipboard/modifiers/clipboard\"], function (_exports, _clipboard) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _clipboard.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-clipboard/modifiers/clipboard\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/did-insert\", [\"exports\", \"@ember/render-modifiers/modifiers/did-insert\"], function (_exports, _didInsert) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _didInsert.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/render-modifiers/modifiers/did-insert\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/did-pan\", [\"exports\", \"ember-gesture-modifiers/modifiers/did-pan\"], function (_exports, _didPan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _didPan.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-gesture-modifiers/modifiers/did-pan\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/did-update\", [\"exports\", \"@ember/render-modifiers/modifiers/did-update\"], function (_exports, _didUpdate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _didUpdate.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/render-modifiers/modifiers/did-update\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/on-key\", [\"exports\", \"ember-keyboard/modifiers/on-key.js\"], function (_exports, _onKey) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _onKey.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-keyboard/modifiers/on-key.js\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/sound-position-progress\", [\"exports\", \"ember-stereo/modifiers/sound-position-progress\"], function (_exports, _soundPositionProgress) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundPositionProgress.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/modifiers/sound-position-progress\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/sound-position-slider\", [\"exports\", \"ember-stereo/modifiers/sound-position-slider\"], function (_exports, _soundPositionSlider) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _soundPositionSlider.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/modifiers/sound-position-slider\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/stereo-volume\", [\"exports\", \"ember-stereo/modifiers/stereo-volume\"], function (_exports, _stereoVolume) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _stereoVolume.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/modifiers/stereo-volume\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/style\", [\"exports\", \"ember-style-modifier/modifiers/style\"], function (_exports, _style) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _style.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-style-modifier/modifiers/style\"eaimeta@70e063a35619d71f\n});","define(\"docs/modifiers/will-destroy\", [\"exports\", \"@ember/render-modifiers/modifiers/will-destroy\"], function (_exports, _willDestroy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _willDestroy.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/render-modifiers/modifiers/will-destroy\"eaimeta@70e063a35619d71f\n});","define(\"docs/not-found\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader />\n  \n  <DocsViewer as |viewer|>\n    <viewer.nav />\n  \n    <viewer.main>\n      <div class='docs-container'>\n        <h1>Not found</h1>\n        <p>This page doesn\"t exist. <LinkTo @route='index'>Head home?</LinkTo></p>\n      </div>\n    </viewer.main>\n  </DocsViewer>\n  */\n  {\n    \"id\": \"HZjfuKfG\",\n    \"block\": \"[[[8,[39,0],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[8,[39,1],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"nav\\\"]],null,null,null],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,1,[\\\"main\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"docs-container\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[12],[1,\\\"Not found\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"This page doesn\\\\\\\"t exist. \\\"],[8,[39,2],null,[[\\\"@route\\\"],[\\\"index\\\"]],[[\\\"default\\\"],[[[[1,\\\"Head home?\\\"]],[]]]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"viewer\\\"],false,[\\\"docs-header\\\",\\\"docs-viewer\\\",\\\"link-to\\\"]]\",\n    \"moduleName\": \"docs/not-found.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/router\", [\"exports\", \"ember-cli-addon-docs/router\", \"docs/config/environment\"], function (_exports, _router, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/router\",0,\"docs/config/environment\"eaimeta@70e063a35619d71f\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  class Router extends _router.default {\n    constructor(...args) {\n      super(...args);\n      _defineProperty(this, \"location\", _environment.default.locationType);\n      _defineProperty(this, \"rootURL\", _environment.default.rootURL);\n    }\n  }\n  _exports.default = Router;\n  Router.map(function () {\n    (0, _router.docsRoute)(this, function () {\n      /* Your docs routes go here */\n      this.route('install');\n      this.route('upgrading');\n      this.route('usage');\n      this.route('playing-sounds');\n      this.route('browser-audio');\n      this.route('metadata');\n      this.route('event-monitoring');\n      this.route('casting');\n\n      // Retired pages, kept so their urls still land somewhere.\n      this.route('autoplay');\n      this.route('audio-format');\n      this.route('error-handling');\n      this.route('waiting-for-sounds');\n      this.route('volume');\n      this.route('advanced');\n      this.route('testing');\n      this.route('debugging');\n    });\n    this.route('diagnostic', function () {\n      this.route('index');\n      this.route('sync');\n      this.route('players');\n    });\n    this.route('autoplay-test');\n    this.route('not-found', {\n      path: '/*path'\n    });\n  });\n});","define(\"docs/routes/autoplay-test\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  // eslint-disable-next-line ember/no-test-import-export\n  class AutoplayTestRoute extends _route.default {}\n  _exports.default = AutoplayTestRoute;\n});","define(\"docs/routes/autoplay\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class AutoplayRoute extends _route.default {}\n  _exports.default = AutoplayRoute;\n});","define(\"docs/routes/diagnostic\", [\"exports\", \"@ember/routing/route\", \"docs/utils/test-sounds\", \"@ember/service\"], function (_exports, _route, _testSounds, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"docs/utils/test-sounds\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let Diagnostic = _exports.default = (_class = class Diagnostic extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n    }\n    model() {\n      return {\n        testSounds: _testSounds.default,\n        connections: this.stereo.connectionLoader.connections\n      };\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/routes/diagnostic/index\", [\"exports\", \"@ember/routing/route\", \"docs/utils/test-sounds\"], function (_exports, _route, _testSounds) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"docs/utils/test-sounds\"eaimeta@70e063a35619d71f\n  class Index extends _route.default {\n    model() {\n      return {\n        testSounds: _testSounds.default\n      };\n    }\n  }\n  _exports.default = Index;\n});","define(\"docs/routes/diagnostic/players\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class Players extends _route.default {\n    model() {\n      return {\n        url: '/sounds/works-just-like-a-vcr.mp3',\n        swappable: [{\n          title: 'Local mp3',\n          url: '/sounds/works-just-like-a-vcr.mp3'\n        }, {\n          title: 'Another local mp3',\n          url: '/sounds/video-professor.mp3'\n        }, {\n          title: 'Short clip',\n          url: '/sounds/attention.mp3'\n        }, {\n          title: 'Remote ogg',\n          url: 'https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg'\n        }, {\n          title: 'Live stream',\n          url: 'https://stream.wqxr.org/wqxr'\n        }],\n        unplayable: '/sounds/unplayable-scooby.au'\n      };\n    }\n  }\n  _exports.default = Players;\n});","define(\"docs/routes/diagnostic/sync\", [\"exports\", \"@ember/routing/route\", \"docs/utils/test-sounds\"], function (_exports, _route, _testSounds) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"docs/utils/test-sounds\"eaimeta@70e063a35619d71f\n  class Sync extends _route.default {\n    model() {\n      return {\n        testSounds: _testSounds.default.slice(0, 3)\n      };\n    }\n  }\n  _exports.default = Sync;\n});","define(\"docs/routes/docs\", [\"exports\", \"ember-cli-addon-docs/routes/docs\"], function (_exports, _docs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docs.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/routes/docs\"eaimeta@70e063a35619d71f\n});","define(\"docs/routes/docs/api/item\", [\"exports\", \"ember-cli-addon-docs/routes/docs/api/item\"], function (_exports, _item) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _item.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/routes/docs/api/item\"eaimeta@70e063a35619d71f\n});","define(\"docs/routes/docs/audio-format\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsAudioFormatRoute = _exports.default = (_class = class DocsAudioFormatRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"router\", _descriptor, this);\n    }\n    redirect() {\n      this.router.replaceWith('docs.browser-audio');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/routes/docs/autoplay\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsAutoplayRoute = _exports.default = (_class = class DocsAutoplayRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"router\", _descriptor, this);\n    }\n    redirect() {\n      this.router.replaceWith('docs.browser-audio');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/routes/docs/error-handling\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsErrorHandlingRoute = _exports.default = (_class = class DocsErrorHandlingRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"router\", _descriptor, this);\n    }\n    redirect() {\n      this.router.replaceWith('docs.browser-audio');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/routes/docs/testing\", [\"exports\", \"@ember/routing/route\"], function (_exports, _route) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\"eaimeta@70e063a35619d71f\n  class DocsTestingRoute extends _route.default {}\n  _exports.default = DocsTestingRoute;\n});","define(\"docs/routes/docs/volume\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsVolumeRoute = _exports.default = (_class = class DocsVolumeRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"router\", _descriptor, this);\n    }\n    redirect() {\n      this.router.replaceWith('docs.playing-sounds');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/routes/docs/waiting-for-sounds\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let DocsWaitingForSoundsRoute = _exports.default = (_class = class DocsWaitingForSoundsRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"router\", _descriptor, this);\n    }\n    redirect() {\n      this.router.replaceWith('docs.playing-sounds');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/routes/index\", [\"exports\", \"@ember/routing/route\", \"@ember/service\"], function (_exports, _route, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor, _descriptor2;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/routing/route\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let IndexRoute = _exports.default = (_class = class IndexRoute extends _route.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n      _initializerDefineProperty(this, \"router\", _descriptor2, this);\n    }\n    redirect() {\n      this.router.replaceWith('docs.index');\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/services/-ensure-registered\", [\"exports\", \"@embroider/util/services/ensure-registered\"], function (_exports, _ensureRegistered) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _ensureRegistered.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@embroider/util/services/ensure-registered\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/audio\", [\"exports\", \"@ember/service\"], function (_exports, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  let Audio = _exports.default = (_class = class Audio extends _service.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"stereo\", _descriptor, this);\n    }\n    async playGood() {\n      return this.stereo.play('/good/1252/ok.mp3');\n    }\n    async playBad() {\n      return this.stereo.play('/bad/1252/ok.mp3');\n    }\n    async playBlank() {\n      return await this.stereo.play();\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"stereo\", [_service.service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n});","define(\"docs/services/docs-routes\", [\"exports\", \"ember-cli-addon-docs/services/docs-routes\"], function (_exports, _docsRoutes) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsRoutes.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/services/docs-routes\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/docs-search\", [\"exports\", \"ember-cli-addon-docs/services/docs-search\"], function (_exports, _docsSearch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsSearch.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/services/docs-search\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/docs-store\", [\"exports\", \"ember-cli-addon-docs/services/docs-store\"], function (_exports, _docsStore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _docsStore.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/services/docs-store\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/fastboot\", [\"exports\", \"ember-cli-fastboot/services/fastboot\"], function (_exports, _fastboot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _fastboot.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-fastboot/services/fastboot\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/keyboard\", [\"exports\", \"ember-keyboard/services/keyboard.js\"], function (_exports, _keyboard) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _keyboard.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-keyboard/services/keyboard.js\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/modal-dialog\", [\"exports\", \"@ember/object\", \"@ember/service\", \"docs/config/environment\", \"ember-modal-dialog/utils/config-utils\"], function (_exports, _object, _service, _environment, _configUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"docs/config/environment\",0,\"ember-modal-dialog/utils/config-utils\"eaimeta@70e063a35619d71f\n  function computedFromConfig(prop) {\n    return (0, _object.computed)(function () {\n      return _environment.default['ember-modal-dialog'] && _environment.default['ember-modal-dialog'][prop];\n    });\n  }\n  var _default = _exports.default = _service.default.extend({\n    hasEmberTether: computedFromConfig('hasEmberTether'),\n    hasLiquidWormhole: computedFromConfig('hasLiquidWormhole'),\n    hasLiquidTether: computedFromConfig('hasLiquidTether'),\n    destinationElementId: (0, _object.computed)(function () {\n      return (0, _configUtils.getDestinationElementIdFromConfig)(_environment.default);\n    })\n  });\n});","define(\"docs/services/page-title\", [\"exports\", \"ember-page-title/services/page-title\"], function (_exports, _pageTitle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _pageTitle.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-page-title/services/page-title\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/project-version\", [\"exports\", \"ember-cli-addon-docs/services/project-version\"], function (_exports, _projectVersion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _projectVersion.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-addon-docs/services/project-version\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/router-scroll\", [\"exports\", \"@nullvoxpopuli/ember-router-scroll/services/router-scroll\"], function (_exports, _routerScroll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _routerScroll.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@nullvoxpopuli/ember-router-scroll/services/router-scroll\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/stereo\", [\"exports\", \"ember-stereo/services/stereo\"], function (_exports, _stereo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _stereo.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/services/stereo\"eaimeta@70e063a35619d71f\n});","define(\"docs/services/store\", [\"exports\", \"@ember/debug\", \"ember-data/store\"], function (_exports, _debug, _store) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _store.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"ember-data/store\"eaimeta@70e063a35619d71f\n  (false && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the store service. Use `export { default } from 'ember-data/store';` in app/services/store.js instead\", false, {\n    id: 'ember-data:deprecate-legacy-imports',\n    for: 'ember-data',\n    until: '6.0',\n    since: {\n      enabled: '5.2',\n      available: '4.13'\n    }\n  }));\n});","define(\"docs/services/theme\", [\"exports\", \"@ember/service\", \"@glimmer/tracking\"], function (_exports, _service, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/service\",0,\"@glimmer/tracking\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\n  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\n  function _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\n  function _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\n  function _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\n  const STORAGE_KEY = 'ember-stereo-docs:theme';\n  let ThemeService = _exports.default = (_class = class ThemeService extends _service.default {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"preference\", _descriptor, this);\n    }\n    get storedPreference() {\n      try {\n        return localStorage.getItem(STORAGE_KEY);\n      } catch (e) {\n        return null;\n      }\n    }\n    get systemPrefersDark() {\n      return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n    }\n    get isDark() {\n      return this.preference ? this.preference === 'dark' : this.systemPrefersDark;\n    }\n    toggle() {\n      this.preference = this.isDark ? 'light' : 'dark';\n      document.documentElement.dataset.theme = this.preference;\n      try {\n        localStorage.setItem(STORAGE_KEY, this.preference);\n      } catch (e) {\n        // A browser with storage disabled still gets the toggle for this session.\n      }\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"preference\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return this.storedPreference;\n    }\n  }), _class);\n});","define(\"docs/services/user-agent\", [\"exports\", \"ember-useragent/services/user-agent\"], function (_exports, _userAgent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _userAgent.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-useragent/services/user-agent\"eaimeta@70e063a35619d71f\n});","define(\"docs/stereo-connections/base\", [\"exports\", \"ember-stereo/stereo-connections/base\"], function (_exports, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _base.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/stereo-connections/base\"eaimeta@70e063a35619d71f\n});","define(\"docs/stereo-connections/chromecast\", [\"exports\", \"ember-stereo/stereo-connections/chromecast\"], function (_exports, _chromecast) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _chromecast.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/stereo-connections/chromecast\"eaimeta@70e063a35619d71f\n});","define(\"docs/stereo-connections/hls\", [\"exports\", \"ember-stereo/stereo-connections/hls\"], function (_exports, _hls) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _hls.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/stereo-connections/hls\"eaimeta@70e063a35619d71f\n});","define(\"docs/stereo-connections/howler\", [\"exports\", \"ember-stereo/stereo-connections/howler\"], function (_exports, _howler) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _howler.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/stereo-connections/howler\"eaimeta@70e063a35619d71f\n});","define(\"docs/stereo-connections/native-audio-casting\", [\"exports\", \"ember-stereo/stereo-connections/native-audio-casting\"], function (_exports, _nativeAudioCasting) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _nativeAudioCasting.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/stereo-connections/native-audio-casting\"eaimeta@70e063a35619d71f\n});","define(\"docs/stereo-connections/native-audio\", [\"exports\", \"ember-stereo/stereo-connections/native-audio\"], function (_exports, _nativeAudio) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _nativeAudio.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-stereo/stereo-connections/native-audio\"eaimeta@70e063a35619d71f\n});","define(\"docs/templates/application\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{outlet}}\n  <DocsKeyboardShortcuts />\n  */\n  {\n    \"id\": \"8DwMDQe6\",\n    \"block\": \"[[[46,[28,[37,1],null,null],null,null,null],[1,\\\"\\\\n\\\"],[8,[39,2],null,null,null]],[],false,[\\\"component\\\",\\\"-outlet\\\",\\\"docs-keyboard-shortcuts\\\"]]\",\n    \"moduleName\": \"docs/templates/application.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/autoplay-test\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{! // BEGIN-SNIPPET autoplay-example.hbs }}\n  \n  <div class='mb-4'>\n    <h3 class='text-lg font-bold'>Ember-Stereo Autoplay Test</h3>\n    {{#if (autoplay-allowed)}}\n      This audio should automatically play without user input\n    {{else}}\n      This audio should not automatically play without user input\n    {{/if}}\n  </div>\n  \n  {{#let '/sounds/foghorn-leghorn.mp3' as |url|}}\n    {{! template-lint-disable no-pointer-down-event-binding }}\n    <button\n      type='button'\n      class='ui-button with-icon max-w-min'\n      {{on 'mousedown' (toggle-play-sound url)}}\n      {{did-insert (play-sound url)}}\n    >\n      {{#if (sound-is-playing url)}}\n        {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}\n        Playing\n      {{else if (sound-is-loading url)}}\n        {{svg-jar\n          'loading-outline'\n          height=20\n          width=30\n          title='Loading'\n          class='animate-spin'\n        }}\n        Loading\n      {{else}}\n        {{svg-jar 'play-outline' height=20 width=30 title='Play'}}\n        Play\n      {{/if}}\n    </button>\n  \n    {{#if (sound-is-blocked url)}}\n      {{! template-lint-disable no-invalid-interactive }}\n      <div class='autoplay-blocked-overlay' {{on 'click' (play-sound url)}}>\n        Oy! The audio was blocked by the browser and someone's gotta give this\n        overlay a click in order for audio to resume\n      </div>\n    {{/if}}\n  \n    {{sound-error-details url}}\n  {{/let}}\n  \n  {{! // END-SNIPPET }}\n  \n  {{outlet}}\n  */\n  {\n    \"id\": \"fOh5Idt1\",\n    \"block\": \"[[[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"mb-4\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h3\\\"],[14,0,\\\"text-lg font-bold\\\"],[12],[1,\\\"Ember-Stereo Autoplay Test\\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,1],null,null],[[[1,\\\"    This audio should automatically play without user input\\\\n\\\"]],[]],[[[1,\\\"    This audio should not automatically play without user input\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[44,[\\\"/sounds/foghorn-leghorn.mp3\\\"],[[[1,\\\"  \\\"],[11,\\\"button\\\"],[24,0,\\\"ui-button with-icon max-w-min\\\"],[24,4,\\\"button\\\"],[4,[38,3],[\\\"mousedown\\\",[28,[37,4],[[30,1]],null]],null],[4,[38,5],[[28,[37,6],[[30,1]],null]],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[30,1]],null],[[[1,\\\"      \\\"],[1,[28,[35,8],[\\\"pause-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Pause\\\"]]]],[1,\\\"\\\\n      Playing\\\\n\\\"]],[]],[[[41,[28,[37,9],[[30,1]],null],[[[1,\\\"      \\\"],[1,[28,[35,8],[\\\"loading-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\",\\\"class\\\"],[20,30,\\\"Loading\\\",\\\"animate-spin\\\"]]]],[1,\\\"\\\\n      Loading\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[1,[28,[35,8],[\\\"play-outline\\\"],[[\\\"height\\\",\\\"width\\\",\\\"title\\\"],[20,30,\\\"Play\\\"]]]],[1,\\\"\\\\n      Play\\\\n    \\\"]],[]]]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,10],[[30,1]],null],[[[1,\\\"    \\\"],[11,0],[24,0,\\\"autoplay-blocked-overlay\\\"],[4,[38,3],[\\\"click\\\",[28,[37,6],[[30,1]],null]],null],[12],[1,\\\"\\\\n      Oy! The audio was blocked by the browser and someone's gotta give this\\\\n      overlay a click in order for audio to resume\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[1,[28,[35,11],[[30,1]],null]],[1,\\\"\\\\n\\\"]],[1]]],[1,\\\"\\\\n\\\"],[1,\\\"\\\\n\\\"],[46,[28,[37,13],null,null],null,null,null]],[\\\"url\\\"],false,[\\\"if\\\",\\\"autoplay-allowed\\\",\\\"let\\\",\\\"on\\\",\\\"toggle-play-sound\\\",\\\"did-insert\\\",\\\"play-sound\\\",\\\"sound-is-playing\\\",\\\"svg-jar\\\",\\\"sound-is-loading\\\",\\\"sound-is-blocked\\\",\\\"sound-error-details\\\",\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"docs/templates/autoplay-test.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/diagnostic\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader as |header|>\n    <header.link @route='diagnostic'>\n      Diagnostic\n    </header.link>\n    <Docs::ThemeToggle />\n  </DocsHeader>\n  <DocsViewer as |viewer|>\n    <viewer.nav as |nav|>\n      <nav.section @label='Diagnostic' />\n      <nav.item @label='Main' @route='diagnostic.index' />\n      <nav.item @label='Sync' @route='diagnostic.sync' />\n      <nav.item @label='Players' @route='diagnostic.players' />\n  \n    </viewer.nav>\n  \n    <viewer.main>\n      {{outlet}}\n    </viewer.main>\n  </DocsViewer>\n  */\n  {\n    \"id\": \"iLJKHSOa\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"link\\\"]],null,[[\\\"@route\\\"],[\\\"diagnostic\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Diagnostic\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[39,1],null,null,null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[8,[39,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,2,[\\\"nav\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Diagnostic\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Main\\\",\\\"diagnostic.index\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Sync\\\",\\\"diagnostic.sync\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Players\\\",\\\"diagnostic.players\\\"]],null],[1,\\\"\\\\n\\\\n  \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,2,[\\\"main\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[46,[28,[37,4],null,null],null,null,null],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"header\\\",\\\"viewer\\\",\\\"nav\\\"],false,[\\\"docs-header\\\",\\\"docs/theme-toggle\\\",\\\"docs-viewer\\\",\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"docs/templates/diagnostic.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/diagnostic/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div>\n    <ServiceDisplay class='mb-12' />\n  \n    <DiagnosticControls\n      @class='diagnostic'\n      @testSounds={{@model.testSounds}}\n      class='mb-12'\n    />\n  \n    <CachedSounds />\n  </div>\n  */\n  {\n    \"id\": \"0PPmr6As\",\n    \"block\": \"[[[10,0],[12],[1,\\\"\\\\n  \\\"],[8,[39,0],[[24,0,\\\"mb-12\\\"]],null,null],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,1],[[24,0,\\\"mb-12\\\"]],[[\\\"@class\\\",\\\"@testSounds\\\"],[\\\"diagnostic\\\",[30,1,[\\\"testSounds\\\"]]]],null],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13]],[\\\"@model\\\"],false,[\\\"service-display\\\",\\\"diagnostic-controls\\\",\\\"cached-sounds\\\"]]\",\n    \"moduleName\": \"docs/templates/diagnostic/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/diagnostic/players\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h1 class='text-xl'>Player Test</h1>\n  \n  <div class='mb-6'>\n    <h2 class='text-lg'>One sound, two players</h2>\n    <p class='my-2 text-base'>Same URL, so the same\n      <code>Sound</code>. Play or seek either and the other should match exactly.\n      The top player positions with modifiers, the bottom one with helpers.</p>\n  \n    <Docs::StereoPlayerModifiers @identifier={{@model.url}} />\n    <Docs::StereoPlayer @identifier={{@model.url}} />\n  </div>\n  \n  <div class='mb-6'>\n    <h2 class='text-lg'>Swapping the identifier</h2>\n    <p class='my-2 text-base'>One player, a different sound behind it. Every\n      helper and modifier bound to the identifier should follow the selection,\n      while the service-wide volume stays put. A seekable file and a live stream\n      need different controls, so the transport should change with them. The\n      sound you leave keeps playing until you start another.</p>\n  \n    <Docs::StereoPlayerChanger @sounds={{@model.swappable}} />\n  </div>\n  \n  <div class='mb-6'>\n    <h2 class='text-lg'>A sound that cannot play</h2>\n    <p class='my-2 text-base'>Play should surface the error, not spin forever.</p>\n  \n    <Docs::StereoPlayer @identifier={{@model.unplayable}} />\n  </div>\n  \n  */\n  {\n    \"id\": \"qP0YU5xf\",\n    \"block\": \"[[[10,\\\"h1\\\"],[14,0,\\\"text-xl\\\"],[12],[1,\\\"Player Test\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mb-6\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"text-lg\\\"],[12],[1,\\\"One sound, two players\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"Same URL, so the same\\\\n    \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\". Play or seek either and the other should match exactly.\\\\n    The top player positions with modifiers, the bottom one with helpers.\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,0],null,[[\\\"@identifier\\\"],[[30,1,[\\\"url\\\"]]]],null],[1,\\\"\\\\n  \\\"],[8,[39,1],null,[[\\\"@identifier\\\"],[[30,1,[\\\"url\\\"]]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mb-6\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"text-lg\\\"],[12],[1,\\\"Swapping the identifier\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"One player, a different sound behind it. Every\\\\n    helper and modifier bound to the identifier should follow the selection,\\\\n    while the service-wide volume stays put. A seekable file and a live stream\\\\n    need different controls, so the transport should change with them. The\\\\n    sound you leave keeps playing until you start another.\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,2],null,[[\\\"@sounds\\\"],[[30,1,[\\\"swappable\\\"]]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mb-6\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h2\\\"],[14,0,\\\"text-lg\\\"],[12],[1,\\\"A sound that cannot play\\\"],[13],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"Play should surface the error, not spin forever.\\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[39,1],null,[[\\\"@identifier\\\"],[[30,1,[\\\"unplayable\\\"]]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"@model\\\"],false,[\\\"docs/stereo-player-modifiers\\\",\\\"docs/stereo-player\\\",\\\"docs/stereo-player-changer\\\"]]\",\n    \"moduleName\": \"docs/templates/diagnostic/players.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/diagnostic/sync\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <h1 class='text-xl'>Sync Test</h1>\n  <p class='my-2 text-base'>Each player below is provided a different identifier\n    format (a string, an object, and a promise), but each identifier resolves to\n    the same URL. Each set of players should stay in sync.</p>\n  <div class='flex flex-col mb-3'>\n    {{#each @model.testSounds as |testSound|}}\n      <div class='mb-4'>\n        <p><a\n            target='_blank'\n            rel='noopener noreferrer'\n            href='{{testSound.url}}'\n          >{{testSound.url}}</a></p>\n  \n        <div\n          class='grid items-start content-start justify-start flex-1 gap-2 md:grid-cols-3'\n        >\n          <SoundDisplay @url={{testSound.url}} @title={{testSound.title}} />\n          <SoundDisplay @url={{testSound.urlObject}} @title={{testSound.title}} />\n          <SoundDisplay\n            @url={{testSound.urlPromise}}\n            @title={{testSound.title}}\n          />\n        </div>\n  \n      </div>\n    {{/each}}\n  </div>\n  */\n  {\n    \"id\": \"2IwRIJh1\",\n    \"block\": \"[[[10,\\\"h1\\\"],[14,0,\\\"text-xl\\\"],[12],[1,\\\"Sync Test\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[14,0,\\\"my-2 text-base\\\"],[12],[1,\\\"Each player below is provided a different identifier\\\\n  format (a string, an object, and a promise), but each identifier resolves to\\\\n  the same URL. Each set of players should stay in sync.\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"flex flex-col mb-3\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"testSounds\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mb-4\\\"],[12],[1,\\\"\\\\n      \\\"],[10,2],[12],[10,3],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[15,6,[29,[[30,2,[\\\"url\\\"]]]]],[12],[1,[30,2,[\\\"url\\\"]]],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"grid items-start content-start justify-start flex-1 gap-2 md:grid-cols-3\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[39,2],null,[[\\\"@url\\\",\\\"@title\\\"],[[30,2,[\\\"url\\\"]],[30,2,[\\\"title\\\"]]]],null],[1,\\\"\\\\n        \\\"],[8,[39,2],null,[[\\\"@url\\\",\\\"@title\\\"],[[30,2,[\\\"urlObject\\\"]],[30,2,[\\\"title\\\"]]]],null],[1,\\\"\\\\n        \\\"],[8,[39,2],null,[[\\\"@url\\\",\\\"@title\\\"],[[30,2,[\\\"urlPromise\\\"]],[30,2,[\\\"title\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[13]],[\\\"@model\\\",\\\"testSound\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"sound-display\\\"]]\",\n    \"moduleName\": \"docs/templates/diagnostic/sync.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader as |header|>\n    <header.link @route='diagnostic'>\n      Diagnostic\n    </header.link>\n    <Docs::ThemeToggle />\n  </DocsHeader>\n  <DocsViewer as |viewer|>\n    <viewer.nav as |nav|>\n      <nav.section @label='Overview' />\n      <nav.item @label='Intro' @route='docs.index' />\n      <nav.item @label='Upgrading' @route='docs.upgrading' />\n      <nav.section @label='Usage' />\n      <nav.item @label='Playing Sounds' @route='docs.playing-sounds' />\n      <nav.item @label='Custom Metadata' @route='docs.metadata' />\n      <nav.item @label='Monitoring Events' @route='docs.event-monitoring' />\n      <nav.item @label='AirPlay & Chromecast' @route='docs.casting' />\n      <nav.item @label='Advanced' @route='docs.advanced' />\n      <nav.section @label='Gotchas' />\n      <nav.item @label='Browser Audio' @route='docs.browser-audio' />\n      <nav.section @label='Development' />\n      <nav.item @label='Testing' @route='docs.testing' />\n      <nav.item @label='Debugging' @route='docs.debugging' />\n    </viewer.nav>\n  \n    <viewer.main>\n      <div class='docs-container'>\n        <div class='docs-section'>\n          {{outlet}}\n        </div>\n      </div>\n    </viewer.main>\n  </DocsViewer>\n  */\n  {\n    \"id\": \"iAfChkaC\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"link\\\"]],null,[[\\\"@route\\\"],[\\\"diagnostic\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Diagnostic\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[8,[39,1],null,null,null],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[8,[39,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,2,[\\\"nav\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Overview\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Intro\\\",\\\"docs.index\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Upgrading\\\",\\\"docs.upgrading\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Usage\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Playing Sounds\\\",\\\"docs.playing-sounds\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Custom Metadata\\\",\\\"docs.metadata\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Monitoring Events\\\",\\\"docs.event-monitoring\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"AirPlay & Chromecast\\\",\\\"docs.casting\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Advanced\\\",\\\"docs.advanced\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Gotchas\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Browser Audio\\\",\\\"docs.browser-audio\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"section\\\"]],null,[[\\\"@label\\\"],[\\\"Development\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Testing\\\",\\\"docs.testing\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"item\\\"]],null,[[\\\"@label\\\",\\\"@route\\\"],[\\\"Debugging\\\",\\\"docs.debugging\\\"]],null],[1,\\\"\\\\n  \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,2,[\\\"main\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"docs-container\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"docs-section\\\"],[12],[1,\\\"\\\\n        \\\"],[46,[28,[37,4],null,null],null,null,null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"header\\\",\\\"viewer\\\",\\\"nav\\\"],false,[\\\"docs-header\\\",\\\"docs/theme-toggle\\\",\\\"docs-viewer\\\",\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"docs/templates/docs.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/advanced\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"advanced\" class=\"docs-md__h1\">Advanced</h1>\n      <p>A few patterns that go beyond a single play/pause button.</p>\n  \n        <h2 id=\"custom-position-controls\" class=\"docs-md__h2\"><a href=\"#custom-position-controls\" class=\"heading-anchor\">Custom position controls</a></h2>\n      <p>The <code>&#123;&#123;sound-position-slider&#125;&#125;</code> modifier turns any element into a scrubber bound to a sound's position. Point it at an identifier and it keeps the control and the playback in sync both ways. Drag to seek, and it tracks as the sound plays.</p>\n  \n  <p><Docs::CustomPositionControl @identifier=\"/sounds/works-just-like-a-vcr.mp3\"/></p>\n  \n  <p><Docs::CustomPositionControl @identifier=\"/sounds/works-just-like-a-vcr.mp3\" @hideSource={{true}}/></p>\n  <p>The same modifier works without a live sound, driven by plain <code>@position</code> and <code>@duration</code> values. This is useful for rendering a static or server-supplied progress bar:</p>\n  \n  <p><Docs::ManualPositionControl @position={{10000}} @duration={{50000}} @hideSource={{false}}/></p>\n  <p>For a read-only bar, <code>&#123;&#123;sound-position-progress&#125;&#125;</code> sizes an element to the sound's position instead. It takes the same <code>@position</code> and <code>@duration</code> fallbacks.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">sound-position-progress</span> @identifier&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\">&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">div</span>&gt;</span></span>\n  </code></pre>\n  \n        <h2 id=\"building-a-play-queue\" class=\"docs-md__h2\"><a href=\"#building-a-play-queue\" class=\"heading-anchor\">Building a play queue</a></h2>\n      <p>Because <code>current-sound</code> and the <code>audio-ended</code> event are app-wide, a queue is just \"play the next thing when the current one ends.\" Here a list of URLs plays through in order:</p>\n  \n  <p><Docs::Queued/></p>\n  <p>The pattern: keep your own ordered list, <code>play</code> the first item, and subscribe to <code>audio-ended</code> on the service to advance. See <a href=\"/docs/event-monitoring\"  class=\"docs-md__a\">Monitoring Events</a> for the full event list.</p>\n  \n        <h2 id=\"prewarming-a-connection\" class=\"docs-md__h2\"><a href=\"#prewarming-a-connection\" class=\"heading-anchor\">Prewarming a connection</a></h2>\n      <p><code>Howler</code> and <code>HLS</code> pull their library down as a lazy chunk, and <code>Chromecast</code> fetches the Cast SDK from <code>gstatic.com</code>. Whichever sound needs one first pays for that download before any audio is fetched, so if you know which is coming, warm it up first:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// e.g. a live stream that can rewind into a recorded HLS archive</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">prewarmConnection</span>(<span class=\"hljs-string\">&#x27;HLS&#x27;</span>);\n  </code></pre>\n  <p>It takes the name a connection is registered under and resolves once it's warm. Connections with nothing to download resolve immediately. <a href=\"https://github.com/jkeen/ember-stereo/blob/main/ember-stereo/CUSTOM_CONNECTIONS.md\"  class=\"docs-md__a\">Your own connections</a> become prewarmable by implementing <code>static preload()</code>.</p>\n  \n        <h2 id=\"working-with-the-sound-directly\" class=\"docs-md__h2\"><a href=\"#working-with-the-sound-directly\" class=\"heading-anchor\">Working with the Sound directly</a></h2>\n      <p>For anything more involved than the helpers cover, reach for the <code>Sound</code> object itself. Its lifecycle states, playback proxying, and connection swaps are documented in <a href=\"/docs/playing-sounds\"  class=\"docs-md__a\">Playing Sounds</a>.</p>\n  \n  <p><Docs::ProxyExample /></p>\n  </div>\n  */\n  {\n    \"id\": \"O4U+3bER\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"advanced\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Advanced\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A few patterns that go beyond a single play/pause button.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"custom-position-controls\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#custom-position-controls\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Custom position controls\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{sound-position-slider}}\\\"],[13],[1,\\\" modifier turns any element into a scrubber bound to a sound's position. Point it at an identifier and it keeps the control and the playback in sync both ways. Drag to seek, and it tracks as the sound plays.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\",\\\"@hideSource\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\",true]],null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The same modifier works without a live sound, driven by plain \\\"],[10,\\\"code\\\"],[12],[1,\\\"@position\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"@duration\\\"],[13],[1,\\\" values. This is useful for rendering a static or server-supplied progress bar:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@position\\\",\\\"@duration\\\",\\\"@hideSource\\\"],[10000,50000,false]],null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"For a read-only bar, \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{sound-position-progress}}\\\"],[13],[1,\\\" sizes an element to the sound's position instead. It takes the same \\\"],[10,\\\"code\\\"],[12],[1,\\\"@position\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"@duration\\\"],[13],[1,\\\" fallbacks.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"div\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"sound-position-progress\\\"],[13],[1,\\\" @identifier}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\">\\\"],[13],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"div\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"building-a-play-queue\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#building-a-play-queue\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Building a play queue\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Because \\\"],[10,\\\"code\\\"],[12],[1,\\\"current-sound\\\"],[13],[1,\\\" and the \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio-ended\\\"],[13],[1,\\\" event are app-wide, a queue is just \\\\\\\"play the next thing when the current one ends.\\\\\\\" Here a list of URLs plays through in order:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,2],null,null,null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The pattern: keep your own ordered list, \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" the first item, and subscribe to \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio-ended\\\"],[13],[1,\\\" on the service to advance. See \\\"],[10,3],[14,6,\\\"/docs/event-monitoring\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Monitoring Events\\\"],[13],[1,\\\" for the full event list.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"prewarming-a-connection\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#prewarming-a-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Prewarming a connection\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"Howler\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"HLS\\\"],[13],[1,\\\" pull their library down as a lazy chunk, and \\\"],[10,\\\"code\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\" fetches the Cast SDK from \\\"],[10,\\\"code\\\"],[12],[1,\\\"gstatic.com\\\"],[13],[1,\\\". Whichever sound needs one first pays for that download before any audio is fetched, so if you know which is coming, warm it up first:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// e.g. a live stream that can rewind into a recorded HLS archive\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"prewarmConnection\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'HLS'\\\"],[13],[1,\\\");\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"It takes the name a connection is registered under and resolves once it's warm. Connections with nothing to download resolve immediately. \\\"],[10,3],[14,6,\\\"https://github.com/jkeen/ember-stereo/blob/main/ember-stereo/CUSTOM_CONNECTIONS.md\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Your own connections\\\"],[13],[1,\\\" become prewarmable by implementing \\\"],[10,\\\"code\\\"],[12],[1,\\\"static preload()\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"working-with-the-sound-directly\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#working-with-the-sound-directly\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Working with the Sound directly\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"For anything more involved than the helpers cover, reach for the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" object itself. Its lifecycle states, playback proxying, and connection swaps are documented in \\\"],[10,3],[14,6,\\\"/docs/playing-sounds\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,null,null],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/custom-position-control\\\",\\\"docs/manual-position-control\\\",\\\"docs/queued\\\",\\\"docs/proxy-example\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/advanced.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/api/item\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#if this.model.isComponent}}\n    <Api::XComponent @component={{this.model}} />\n  {{else if this.model.isClass}}\n    <Api::XClass @class={{this.model}} />\n  {{else}}\n    <Api::XModule @module={{this.model}} />\n  {{/if}}\n  */\n  {\n    \"id\": \"5ukddb8q\",\n    \"block\": \"[[[41,[30,0,[\\\"model\\\",\\\"isComponent\\\"]],[[[1,\\\"  \\\"],[8,[39,1],null,[[\\\"@component\\\"],[[30,0,[\\\"model\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,0,[\\\"model\\\",\\\"isClass\\\"]],[[[1,\\\"  \\\"],[8,[39,2],null,[[\\\"@class\\\"],[[30,0,[\\\"model\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"  \\\"],[8,[39,3],null,[[\\\"@module\\\"],[[30,0,[\\\"model\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"api/x-component\\\",\\\"api/x-class\\\",\\\"api/x-module\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/api/item.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/browser-audio\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"browser-audio\" class=\"docs-md__h1\">Browser Audio</h1>\n      <p>Three things about audio on the web will bite you no matter which library you use: browsers disagree about formats, they block autoplay, and playback fails in ways you have to handle. <code>stereo</code> gives you a way through each.</p>\n  \n        <h2 id=\"audio-formats\" class=\"docs-md__h2\"><a href=\"#audio-formats\" class=\"heading-anchor\">Audio formats</a></h2>\n      <p>Different browsers support different <a href=\"https://caniuse.com/?search=audio%20format\"  class=\"docs-md__a\">audio formats</a>, and unless you're playing something universally supported like <code>mp3</code>, things get tricky.</p>\n  <p><a href=\"https://en.wikipedia.org/wiki/Opus_(audio_format)\"  class=\"docs-md__a\"><code>opus/ogg</code></a> is a fantastic audio format, but Safari and iOS don't care about it at all. <code>HLS</code> is a fantastic protocol for live streaming, but only Safari supports it natively, and the full featured <a href=\"https://github.com/video-dev/hls.js/\"  class=\"docs-md__a\"><code>hls.js</code></a> player that <code>stereo</code> provides a connection for runs everywhere except Safari and iOS. Doing anything fancy with audio on the web is still painful.</p>\n  <p>You'd probably rather serve listeners slimmer <code>.ogg</code> files or <code>hls</code> streams than <code>.mp3s</code>, without tracking that mess yourself.</p>\n  \n        <h3 id=\"this-is-how-you-do-it\" class=\"docs-md__h3\"><a href=\"#this-is-how-you-do-it\" class=\"heading-anchor\">This is how you do it</a></h3>\n      <p>Give <code>stereo</code> an array of urls in preferential order. It tries each url on each loaded connection and stops once one works.</p>\n  <p>To illustrate, here's this <a href=\"https://archive.org/details/KmartOctober1989\"  class=\"docs-md__a\">(incredible) digitized in-store cassette tape from K-Mart in 1989</a> from archive.org. The <code>ogg</code> version is <code>60M</code> and the <code>mp3</code> version is <code>200M</code>. Woof. The higher quality <code>60M</code> file is obviously preferable.</p>\n  \n  <p><Docs::TryMultipleUrls /></p>\n  <p>Looks like you're running {{docs/current-browser}} on {{docs/current-os}}</p>\n  \n        <h3 id=\"ogg\" class=\"docs-md__h3\"><a href=\"#ogg\" class=\"heading-anchor\">Ogg</a></h3>\n      <p>Here's what <Docs::CurrentBrowser /> for <Docs::CurrentOs /> told <code>ember-stereo</code> about the chances of this <code>ogg</code> file succeeding.</p>\n  \n  <p><Docs::StrategyBreakdown @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\"/></p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\"/></p>\n  \n        <h3 id=\"mp3\" class=\"docs-md__h3\"><a href=\"#mp3\" class=\"heading-anchor\">Mp3</a></h3>\n      <p>This for sure works on <Docs::CurrentBrowser /> for <Docs::CurrentOs />. Nothing to get excited about, but here are the details anyway:</p>\n  \n  <p><Docs::StrategyBreakdown @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\"/></p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\"/></p>\n  \n        <h2 id=\"autoplay-restrictions\" class=\"docs-md__h2\"><a href=\"#autoplay-restrictions\" class=\"heading-anchor\">Autoplay restrictions</a></h2>\n      <p>It used to be easy to play audio without autoplay blockers getting in the way. For those of us with good intentions, who aren't trying to do user-hostile things like play advertisements on page load, this is frustrating. Here's <a href=\"https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide\"  class=\"docs-md__a\">Mozilla's guide on autoplay</a> for the details.</p>\n  \n        <h3 id=\"checking-if-autoplay-is-allowed\" class=\"docs-md__h3\"><a href=\"#checking-if-autoplay-is-allowed\" class=\"heading-anchor\">Checking if autoplay is allowed</a></h3>\n      <p>You might want to check whether autoplay is allowed in your listener's browser and take extra steps if it isn't. Here's how.</p>\n  \n  <p><Docs::AutoplayChecking /></p>\n  \n        <h3 id=\"gotchas\" class=\"docs-md__h3\"><a href=\"#gotchas\" class=\"heading-anchor\">Gotchas</a></h3>\n      \n  <p><Docs::AutoplayGotchas /></p>\n  \n        <h2 id=\"error-handling\" class=\"docs-md__h2\"><a href=\"#error-handling\" class=\"heading-anchor\">Error handling</a></h2>\n      \n        <h3 id=\"through-the-template\" class=\"docs-md__h3\"><a href=\"#through-the-template\" class=\"heading-anchor\">Through the template</a></h3>\n      <p>Template action helpers don't throw when playback fails. Instead you check whether a sound errored, using a couple of helpers.</p>\n  \n  <p><Docs::TemplateErrorsExample /></p>\n  \n        <h3 id=\"through-the-service\" class=\"docs-md__h3\"><a href=\"#through-the-service\" class=\"heading-anchor\">Through the service</a></h3>\n      <p>Interacting with the service, you handle errors the way you'd expect.</p>\n  \n  <p><Docs::ServiceErrorsTryCatch /></p>\n  \n  <p><Docs::ServiceErrorsTryThen /></p>\n  \n  <p><Docs::ServiceErrorsSilenceError /></p>\n  \n  <p><Docs::ServiceErrorsThrowError /></p>\n  </div>\n  */\n  {\n    \"id\": \"LkoqZup9\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"browser-audio\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Browser Audio\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Three things about audio on the web will bite you no matter which library you use: browsers disagree about formats, they block autoplay, and playback fails in ways you have to handle. \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" gives you a way through each.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"audio-formats\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#audio-formats\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Audio formats\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Different browsers support different \\\"],[10,3],[14,6,\\\"https://caniuse.com/?search=audio%20format\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"audio formats\\\"],[13],[1,\\\", and unless you're playing something universally supported like \\\"],[10,\\\"code\\\"],[12],[1,\\\"mp3\\\"],[13],[1,\\\", things get tricky.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,3],[14,6,\\\"https://en.wikipedia.org/wiki/Opus_(audio_format)\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"opus/ogg\\\"],[13],[13],[1,\\\" is a fantastic audio format, but Safari and iOS don't care about it at all. \\\"],[10,\\\"code\\\"],[12],[1,\\\"HLS\\\"],[13],[1,\\\" is a fantastic protocol for live streaming, but only Safari supports it natively, and the full featured \\\"],[10,3],[14,6,\\\"https://github.com/video-dev/hls.js/\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"hls.js\\\"],[13],[13],[1,\\\" player that \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" provides a connection for runs everywhere except Safari and iOS. Doing anything fancy with audio on the web is still painful.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"You'd probably rather serve listeners slimmer \\\"],[10,\\\"code\\\"],[12],[1,\\\".ogg\\\"],[13],[1,\\\" files or \\\"],[10,\\\"code\\\"],[12],[1,\\\"hls\\\"],[13],[1,\\\" streams than \\\"],[10,\\\"code\\\"],[12],[1,\\\".mp3s\\\"],[13],[1,\\\", without tracking that mess yourself.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"this-is-how-you-do-it\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#this-is-how-you-do-it\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"This is how you do it\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Give \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" an array of urls in preferential order. It tries each url on each loaded connection and stops once one works.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"To illustrate, here's this \\\"],[10,3],[14,6,\\\"https://archive.org/details/KmartOctober1989\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"(incredible) digitized in-store cassette tape from K-Mart in 1989\\\"],[13],[1,\\\" from archive.org. The \\\"],[10,\\\"code\\\"],[12],[1,\\\"ogg\\\"],[13],[1,\\\" version is \\\"],[10,\\\"code\\\"],[12],[1,\\\"60M\\\"],[13],[1,\\\" and the \\\"],[10,\\\"code\\\"],[12],[1,\\\"mp3\\\"],[13],[1,\\\" version is \\\"],[10,\\\"code\\\"],[12],[1,\\\"200M\\\"],[13],[1,\\\". Woof. The higher quality \\\"],[10,\\\"code\\\"],[12],[1,\\\"60M\\\"],[13],[1,\\\" file is obviously preferable.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,null,null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Looks like you're running \\\"],[1,[34,1]],[1,\\\" on \\\"],[1,[34,2]],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"ogg\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#ogg\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Ogg\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Here's what \\\"],[8,[39,1],null,null,null],[1,\\\" for \\\"],[8,[39,2],null,null,null],[1,\\\" told \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" about the chances of this \\\"],[10,\\\"code\\\"],[12],[1,\\\"ogg\\\"],[13],[1,\\\" file succeeding.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,4],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"mp3\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#mp3\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Mp3\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This for sure works on \\\"],[8,[39,1],null,null,null],[1,\\\" for \\\"],[8,[39,2],null,null,null],[1,\\\". Nothing to get excited about, but here are the details anyway:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,4],null,[[\\\"@identifier\\\"],[\\\"https://archive.org/download/KmartOctober1989/Kmart%20October%201989.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"autoplay-restrictions\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#autoplay-restrictions\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Autoplay restrictions\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"It used to be easy to play audio without autoplay blockers getting in the way. For those of us with good intentions, who aren't trying to do user-hostile things like play advertisements on page load, this is frustrating. Here's \\\"],[10,3],[14,6,\\\"https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Mozilla's guide on autoplay\\\"],[13],[1,\\\" for the details.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"checking-if-autoplay-is-allowed\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#checking-if-autoplay-is-allowed\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Checking if autoplay is allowed\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You might want to check whether autoplay is allowed in your listener's browser and take extra steps if it isn't. Here's how.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,5],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"gotchas\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#gotchas\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Gotchas\\\"],[13],[13],[1,\\\"\\\\n    \\\\n\\\"],[10,2],[12],[8,[39,6],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"error-handling\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#error-handling\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Error handling\\\"],[13],[13],[1,\\\"\\\\n    \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"through-the-template\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#through-the-template\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Through the template\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Template action helpers don't throw when playback fails. Instead you check whether a sound errored, using a couple of helpers.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,7],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"through-the-service\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#through-the-service\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Through the service\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Interacting with the service, you handle errors the way you'd expect.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,8],null,null,null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,9],null,null,null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,10],null,null,null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,11],null,null,null],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/try-multiple-urls\\\",\\\"docs/current-browser\\\",\\\"docs/current-os\\\",\\\"docs/strategy-breakdown\\\",\\\"docs/stereo-player\\\",\\\"docs/autoplay-checking\\\",\\\"docs/autoplay-gotchas\\\",\\\"docs/template-errors-example\\\",\\\"docs/service-errors-try-catch\\\",\\\"docs/service-errors-try-then\\\",\\\"docs/service-errors-silence-error\\\",\\\"docs/service-errors-throw-error\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/browser-audio.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/casting\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"casting-airplay-chromecast-\" class=\"docs-md__h1\">Casting (AirPlay & Chromecast)</h1>\n      <p>Casting sends the audio to an AirPlay receiver or a Chromecast device instead of the local speakers. <code>ember-stereo</code> treats the remote device as another connection, that it automatically loads and injects when needed.</p>\n  \n        <h2 id=\"enabling-casting\" class=\"docs-md__h2\"><a href=\"#enabling-casting\" class=\"heading-anchor\">Enabling casting</a></h2>\n      \n          <ul class=\"docs-list-disc\"><li><strong>AirPlay</strong> uses Safari's own APIs and loads nothing extra.</li>\n  <li><strong>Chromecast</strong> lazily loads the Google Cast SDK from <code>gstatic.com</code> the first time a <code>&#123;&#123;cast-button&#125;&#125;</code> or <code>&#123;&#123;casting-available&#125;&#125;</code> renders.</li>\n  </ul>\n        <p>On Chrome, <code>&#123;&#123;casting-available&#125;&#125;</code> tracks whether a Chromecast is on the network, and the button disables itself when there is none. On Safari it only means AirPlay exists. WebKit reports receivers as unavailable even when the picker can find them, so <code>ember-stereo</code> ignores that signal and lets the picker show its own empty state.</p>\n  \n        <h2 id=\"sound-casturl\" class=\"docs-md__h2\"><a href=\"#sound-casturl\" class=\"heading-anchor\"><code>sound.castUrl</code></a></h2>\n      <p>When you cast the device fetches the audio directly, meaning if it can't reach it without your app's session or auth headers it won't play. Set <code>sound.castUrl</code> to a public or signed variant of the stream if you need it.</p>\n  \n        <h3 id=\"updating-metadata-mid-cast\" class=\"docs-md__h3\"><a href=\"#updating-metadata-mid-cast\" class=\"heading-anchor\">Updating metadata mid-cast</a></h3>\n      <p><strong>AirPlay</strong> reads metadata from the OS, so a change reaches the receiver as soon as it reaches the lock screen.</p>\n  <p><strong>Chromecast</strong> is handed metadata in the load request and keeps it, so set <code>sound.metadata</code> <strong>before</strong> casting. Changing it afterwards updates the lock screen and your own UI but not the device, and only a reload would refresh it. A live stream whose now-playing changes mid-listen keeps the title it started with until the next cast.</p>\n  \n        <h2 id=\"the-cast-button\" class=\"docs-md__h2\"><a href=\"#the-cast-button\" class=\"heading-anchor\">The cast button</a></h2>\n      <p><code>&#123;&#123;cast-button&#125;&#125;</code> turns a <code>&lt;button&gt;</code> into a cast control. Clicking it opens the device picker. The button disables itself when <code>&#123;&#123;casting-available&#125;&#125;</code> is false, and gets a <code>casting</code> class while connected, so you can style the connected state.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;button&#x27;</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">cast-button</span>&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\">&gt;</span>\n    Cast\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span></span>\n  </code></pre>\n  <p>Casting always follows the current sound. Whatever is playing when you pick a device moves to it, and anything you play afterwards goes there too, until you disconnect.</p>\n  \n        <h2 id=\"reading-cast-state-in-templates\" class=\"docs-md__h2\"><a href=\"#reading-cast-state-in-templates\" class=\"heading-anchor\">Reading cast state in templates</a></h2>\n      \n          <ul class=\"docs-list-disc\"><li><code>&#123;&#123;casting-available&#125;&#125;</code> - true when casting can be started right now. On Chrome that means a Chromecast is on the network. On Safari it is true whenever AirPlay exists.</li>\n  <li><code>&#123;&#123;is-casting&#125;&#125;</code> - true while the audio plays on a remote device.</li>\n  </ul>\n        <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;button&#x27;</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">cast-button</span>&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\">&gt;</span>\n    </span><span class=\"hljs-template-tag\">&#123;&#123;#<span class=\"hljs-name\"><span class=\"hljs-built_in\">if</span></span> (<span class=\"hljs-name\">is-casting</span>)&#125;&#125;</span><span class=\"language-xml\">\n      Casting…\n    </span><span class=\"hljs-template-tag\">&#123;&#123;<span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (casting-available)&#125;&#125;</span><span class=\"language-xml\">\n      Cast\n    </span><span class=\"hljs-template-tag\">&#123;&#123;<span class=\"hljs-keyword\">else</span>&#125;&#125;</span><span class=\"language-xml\">\n      No cast targets available\n    </span><span class=\"hljs-template-tag\">&#123;&#123;/<span class=\"hljs-name\"><span class=\"hljs-built_in\">if</span></span>&#125;&#125;</span><span class=\"language-xml\">\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span></span>\n  </code></pre>\n  \n        <h2 id=\"live-demo\" class=\"docs-md__h2\"><a href=\"#live-demo\" class=\"heading-anchor\">Live demo</a></h2>\n      <p>Stream:</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://streaming.koop.org/stream.aac\" /></p>\n  <p>Fixed audio:</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://audio.wnyc.org/bl/bl011421dpod.mp3\" /></p>\n  \n  <p><Docs::CastPlayer /></p>\n  \n        <h2 id=\"the-service-api\" class=\"docs-md__h2\"><a href=\"#the-service-api\" class=\"heading-anchor\">The service API</a></h2>\n      <p>The <code>stereo</code> service exposes:</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>isCastingAvailable</code> - <code>true</code> when casting can be started</li>\n  <li><code>isCasting</code> - <code>true</code> when audio is playing on a remote device</li>\n  <li><code>castDeviceName</code> - the device's name. Chromecast provides one, AirPlay doesn't, so this can be <code>null</code></li>\n  <li><code>castKind</code> - <code>&#39;airplay&#39;</code>, <code>&#39;chromecast&#39;</code>, or <code>null</code></li>\n  <li><code>castIconName</code> - <code>&#39;cast&#39;</code>, <code>&#39;airplay&#39;</code>, or <code>null</code>, for picking the right icon</li>\n  <li><code>supportedCastType</code> - which kind of casting this browser can do at all (<code>&#39;airplay&#39;</code>, <code>&#39;chromecast&#39;</code>, or <code>null</code>), even before any device is found</li>\n  <li><code>showCastMenu()</code> - open the device picker (what <code>&#123;&#123;cast-button&#125;&#125;</code> calls)</li>\n  <li><code>stopCasting()</code> - disconnect and return playback to the local device</li>\n  </ul>\n        \n        <h2 id=\"events\" class=\"docs-md__h2\"><a href=\"#events\" class=\"heading-anchor\">Events</a></h2>\n      <p>The service fires four cast events as casting starts and stops. See <a href=\"/docs/event-monitoring#casting-events\"  class=\"docs-md__a\">Events</a>.</p>\n  <p>Switching feeds mid-stream while casting needs nothing special from you. A remote device is just another connection, so <code>currentSound</code> and <code>swap</code> behave exactly as they do locally and your player code never needs a \"we're casting now\" branch.</p>\n  \n        <h2 id=\"which-airplay-receivers-actually-work\" class=\"docs-md__h2\"><a href=\"#which-airplay-receivers-actually-work\" class=\"heading-anchor\">Which AirPlay receivers actually work</a></h2>\n      <p>Not every device that shows up in Safari desktop's picker can play web audio.</p>\n  <p>AirPlay 2 receivers (Apple TV, HomePod, most hardware since about 2018) work everywhere. Audio-only receivers of the AirPort Express / 2011–2017 AV receiver vintage work perfectly from mobile Safari but not desktop Safari, and the failure is silent (which is very annoying). I can't seem to find a way to work around it, so beware that edge case.</p>\n  </div>\n  */\n  {\n    \"id\": \"M6C/veS7\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"casting-airplay-chromecast-\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Casting (AirPlay & Chromecast)\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Casting sends the audio to an AirPlay receiver or a Chromecast device instead of the local speakers. \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" treats the remote device as another connection, that it automatically loads and injects when needed.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"enabling-casting\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#enabling-casting\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Enabling casting\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"AirPlay\\\"],[13],[1,\\\" uses Safari's own APIs and loads nothing extra.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\" lazily loads the Google Cast SDK from \\\"],[10,\\\"code\\\"],[12],[1,\\\"gstatic.com\\\"],[13],[1,\\\" the first time a \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{cast-button}}\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" renders.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"On Chrome, \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" tracks whether a Chromecast is on the network, and the button disables itself when there is none. On Safari it only means AirPlay exists. WebKit reports receivers as unavailable even when the picker can find them, so \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" ignores that signal and lets the picker show its own empty state.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"sound-casturl\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#sound-casturl\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"When you cast the device fetches the audio directly, meaning if it can't reach it without your app's session or auth headers it won't play. Set \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[1,\\\" to a public or signed variant of the stream if you need it.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"updating-metadata-mid-cast\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#updating-metadata-mid-cast\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Updating metadata mid-cast\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"AirPlay\\\"],[13],[1,\\\" reads metadata from the OS, so a change reaches the receiver as soon as it reaches the lock screen.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"Chromecast\\\"],[13],[1,\\\" is handed metadata in the load request and keeps it, so set \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.metadata\\\"],[13],[1,\\\" \\\"],[10,\\\"strong\\\"],[12],[1,\\\"before\\\"],[13],[1,\\\" casting. Changing it afterwards updates the lock screen and your own UI but not the device, and only a reload would refresh it. A live stream whose now-playing changes mid-listen keeps the title it started with until the next cast.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"the-cast-button\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#the-cast-button\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"The cast button\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"{{cast-button}}\\\"],[13],[1,\\\" turns a \\\"],[10,\\\"code\\\"],[12],[1,\\\"<button>\\\"],[13],[1,\\\" into a cast control. Clicking it opens the device picker. The button disables itself when \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" is false, and gets a \\\"],[10,\\\"code\\\"],[12],[1,\\\"casting\\\"],[13],[1,\\\" class while connected, so you can style the connected state.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'button'\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"cast-button\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\">\\\"],[13],[1,\\\"\\\\n  Cast\\\\n\\\"],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Casting always follows the current sound. Whatever is playing when you pick a device moves to it, and anything you play afterwards goes there too, until you disconnect.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"reading-cast-state-in-templates\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#reading-cast-state-in-templates\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Reading cast state in templates\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"{{casting-available}}\\\"],[13],[1,\\\" - true when casting can be started right now. On Chrome that means a Chromecast is on the network. On Safari it is true whenever AirPlay exists.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"{{is-casting}}\\\"],[13],[1,\\\" - true while the audio plays on a remote device.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'button'\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"cast-button\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\">\\\"],[13],[1,\\\"\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{#\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[10,1],[14,0,\\\"hljs-built_in\\\"],[12],[1,\\\"if\\\"],[13],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"is-casting\\\"],[13],[1,\\\")}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n    Casting…\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"else\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (casting-available)}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n    Cast\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"else\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n    No cast targets available\\\\n  \\\"],[13],[10,1],[14,0,\\\"hljs-template-tag\\\"],[12],[1,\\\"{{/\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[10,1],[14,0,\\\"hljs-built_in\\\"],[12],[1,\\\"if\\\"],[13],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"live-demo\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#live-demo\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Live demo\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Stream:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"https://streaming.koop.org/stream.aac\\\"]],null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Fixed audio:\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"https://audio.wnyc.org/bl/bl011421dpod.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"the-service-api\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#the-service-api\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"The service API\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service exposes:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isCastingAvailable\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"true\\\"],[13],[1,\\\" when casting can be started\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isCasting\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"true\\\"],[13],[1,\\\" when audio is playing on a remote device\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castDeviceName\\\"],[13],[1,\\\" - the device's name. Chromecast provides one, AirPlay doesn't, so this can be \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castKind\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"'airplay'\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"'chromecast'\\\"],[13],[1,\\\", or \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"castIconName\\\"],[13],[1,\\\" - \\\"],[10,\\\"code\\\"],[12],[1,\\\"'cast'\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"'airplay'\\\"],[13],[1,\\\", or \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\", for picking the right icon\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"supportedCastType\\\"],[13],[1,\\\" - which kind of casting this browser can do at all (\\\"],[10,\\\"code\\\"],[12],[1,\\\"'airplay'\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"'chromecast'\\\"],[13],[1,\\\", or \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\"), even before any device is found\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"showCastMenu()\\\"],[13],[1,\\\" - open the device picker (what \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{cast-button}}\\\"],[13],[1,\\\" calls)\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stopCasting()\\\"],[13],[1,\\\" - disconnect and return playback to the local device\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"events\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#events\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Events\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The service fires four cast events as casting starts and stops. See \\\"],[10,3],[14,6,\\\"/docs/event-monitoring#casting-events\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Events\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Switching feeds mid-stream while casting needs nothing special from you. A remote device is just another connection, so \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentSound\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"swap\\\"],[13],[1,\\\" behave exactly as they do locally and your player code never needs a \\\\\\\"we're casting now\\\\\\\" branch.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"which-airplay-receivers-actually-work\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#which-airplay-receivers-actually-work\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Which AirPlay receivers actually work\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Not every device that shows up in Safari desktop's picker can play web audio.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"AirPlay 2 receivers (Apple TV, HomePod, most hardware since about 2018) work everywhere. Audio-only receivers of the AirPort Express / 2011–2017 AV receiver vintage work perfectly from mobile Safari but not desktop Safari, and the failure is silent (which is very annoying). I can't seem to find a way to work around it, so beware that edge case.\\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/stereo-player\\\",\\\"docs/cast-player\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/casting.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/debugging\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"debugging\" class=\"docs-md__h1\">Debugging</h1>\n      <p><code>ember-stereo</code> logs its internals through the <a href=\"https://github.com/debug-js/debug\"  class=\"docs-md__a\"><code>debug</code></a> package, namespaced under <code>ember-stereo:*</code>. Nothing is logged until you opt in, so production stays quiet.</p>\n  \n        <h2 id=\"turning-on-logging\" class=\"docs-md__h2\"><a href=\"#turning-on-logging\" class=\"heading-anchor\">Turning on logging</a></h2>\n      <p>Set <code>localStorage.debug</code> in your browser console and reload:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// Everything ember-stereo has to say</span>\n  <span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:*&#x27;</span>;\n  \n  <span class=\"hljs-comment\">// Just one subsystem</span>\n  <span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:strategizer&#x27;</span>;\n  \n  <span class=\"hljs-comment\">// A few at once</span>\n  <span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:sound,ember-stereo:service&#x27;</span>;\n  </code></pre>\n  <p>To turn it back off: <code>localStorage.removeItem(&#39;debug&#39;)</code> (then reload).</p>\n  <p><code>audio-position-changed</code> fires about twenty times a second, so it logs under its own namespace. Leave it out when you're reading anything else:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">localStorage</span>.<span class=\"hljs-property\">debug</span> = <span class=\"hljs-string\">&#x27;ember-stereo:*,-ember-stereo:position&#x27;</span>;\n  </code></pre>\n  \n        <h2 id=\"the-namespaces\" class=\"docs-md__h2\"><a href=\"#the-namespaces\" class=\"heading-anchor\">The namespaces</a></h2>\n      <table class=\"docs-table-auto\">\n  <thead>\n  <tr class=\"docs-table-row\">\n  <th class=\"docs-border docs-px-4 docs-py-2\">Namespace</th>\n  <th class=\"docs-border docs-px-4 docs-py-2\">What it traces</th>\n  </tr>\n  </thead>\n  <tbody><tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:service</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The <code>stereo</code> service. Load/play requests, current-sound changes.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:position</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">Position ticks, split out because they drown everything else.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:sound</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">A <code>Sound</code>'s lifecycle.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:strategizer</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">How a URL is turned into an ordered list of connections to try.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:canPlay</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">Per-connection format/platform decisions during strategy building.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:one-at-at-time</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The \"only one sound plays\" arbitration.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:cast</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">Everything casting: availability, pickers, engage/disengage, swaps.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:shared-audio-access</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The shared audio element and its single-owner handoff.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:google-cast-sdk</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The Cast SDK session and its single-owner handoff.</td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>ember-stereo:fake-element</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\">The test-environment fake media element (see <a href=\"/docs/testing\"  class=\"docs-md__a\">Testing</a>).</td>\n  </tr>\n  </tbody></table>\n  \n        <h2 id=\"inspecting-state-directly\" class=\"docs-md__h2\"><a href=\"#inspecting-state-directly\" class=\"heading-anchor\">Inspecting state directly</a></h2>\n      <p>The service also exposes a few read-only getters that are handy from the console:</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>stereo.currentSound</code> - the <code>Sound</code> currently loaded.</li>\n  <li><code>stereo.sounds</code> - every <code>Sound</code> asked to load, including pending and errored ones. Filter it for a subset, for example <code>stereo.sounds.filter((s) =&gt; s.isErrored)</code>.</li>\n  <li><code>stereo.connections</code> - the active connection instances, in priority order.</li>\n  <li><code>stereo.findSound(url).errors</code> - that sound's load failures, one per attempted connection.</li>\n  </ul>\n        <p>When a load fails, the error carries a <code>debugInfo</code> array describing every strategy that was tried and why each one was rejected.</p>\n  \n        <h2 id=\"gstatic-com-errors-in-the-console\" class=\"docs-md__h2\"><a href=\"#gstatic-com-errors-in-the-console\" class=\"heading-anchor\"><code>gstatic.com</code> errors in the console</a></h2>\n      <p>Rendering a cast control where no Cast receiver exists (Electron, a locked-down network) logs <code>ERR_UNEXPECTED</code> or <code>ERR_FAILED</code> fetching the Cast SDK. The loader fails gracefully and casting stays unavailable. Apps that never render casting UI never request it.</p>\n  </div>\n  */\n  {\n    \"id\": \"LLM+nL84\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"debugging\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Debugging\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" logs its internals through the \\\"],[10,3],[14,6,\\\"https://github.com/debug-js/debug\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"debug\\\"],[13],[13],[1,\\\" package, namespaced under \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:*\\\"],[13],[1,\\\". Nothing is logged until you opt in, so production stays quiet.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"turning-on-logging\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#turning-on-logging\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Turning on logging\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Set \\\"],[10,\\\"code\\\"],[12],[1,\\\"localStorage.debug\\\"],[13],[1,\\\" in your browser console and reload:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// Everything ember-stereo has to say\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:*'\\\"],[13],[1,\\\";\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// Just one subsystem\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:strategizer'\\\"],[13],[1,\\\";\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// A few at once\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:sound,ember-stereo:service'\\\"],[13],[1,\\\";\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"To turn it back off: \\\"],[10,\\\"code\\\"],[12],[1,\\\"localStorage.removeItem('debug')\\\"],[13],[1,\\\" (then reload).\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-position-changed\\\"],[13],[1,\\\" fires about twenty times a second, so it logs under its own namespace. Leave it out when you're reading anything else:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"localStorage\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"debug\\\"],[13],[1,\\\" = \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo:*,-ember-stereo:position'\\\"],[13],[1,\\\";\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"the-namespaces\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#the-namespaces\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"The namespaces\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,\\\"table\\\"],[14,0,\\\"docs-table-auto\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Namespace\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"What it traces\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tbody\\\"],[12],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:service\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service. Load/play requests, current-sound changes.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:position\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Position ticks, split out because they drown everything else.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:sound\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"A \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\"'s lifecycle.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:strategizer\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"How a URL is turned into an ordered list of connections to try.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:canPlay\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Per-connection format/platform decisions during strategy building.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:one-at-at-time\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The \\\\\\\"only one sound plays\\\\\\\" arbitration.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:cast\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Everything casting: availability, pickers, engage/disengage, swaps.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:shared-audio-access\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The shared audio element and its single-owner handoff.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:google-cast-sdk\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The Cast SDK session and its single-owner handoff.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo:fake-element\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"The test-environment fake media element (see \\\"],[10,3],[14,6,\\\"/docs/testing\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Testing\\\"],[13],[1,\\\").\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"inspecting-state-directly\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#inspecting-state-directly\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Inspecting state directly\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The service also exposes a few read-only getters that are handy from the console:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.currentSound\\\"],[13],[1,\\\" - the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" currently loaded.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds\\\"],[13],[1,\\\" - every \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" asked to load, including pending and errored ones. Filter it for a subset, for example \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isErrored)\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.connections\\\"],[13],[1,\\\" - the active connection instances, in priority order.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url).errors\\\"],[13],[1,\\\" - that sound's load failures, one per attempted connection.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"When a load fails, the error carries a \\\"],[10,\\\"code\\\"],[12],[1,\\\"debugInfo\\\"],[13],[1,\\\" array describing every strategy that was tried and why each one was rejected.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"gstatic-com-errors-in-the-console\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#gstatic-com-errors-in-the-console\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"gstatic.com\\\"],[13],[1,\\\" errors in the console\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Rendering a cast control where no Cast receiver exists (Electron, a locked-down network) logs \\\"],[10,\\\"code\\\"],[12],[1,\\\"ERR_UNEXPECTED\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\"ERR_FAILED\\\"],[13],[1,\\\" fetching the Cast SDK. The loader fails gracefully and casting stays unavailable. Apps that never render casting UI never request it.\\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[]]\",\n    \"moduleName\": \"docs/templates/docs/debugging.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/event-monitoring\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"events\" class=\"docs-md__h1\">Events</h1>\n      <p>You can monitor events on both the <code>stereo</code> service for when any sound emits an event, or on an individual sound for when that specific sound emits an event. For example,</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// Log when any sound starts playing</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-played&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">`<span class=\"hljs-subst\">${sound.url}</span> started playing`</span>);\n  });\n  \n  <span class=\"hljs-keyword\">let</span> sound = <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">url</span>);\n  sound.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-ended&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">sendEvent</span>(<span class=\"hljs-string\">&#x27;finished-listening&#x27;</span>, {\n      <span class=\"hljs-attr\">episodeId</span>: sound.<span class=\"hljs-property\">metadata</span>.<span class=\"hljs-property\">episodeId</span>,\n    });\n  });\n  \n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;current-sound-interrupted&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">sendEvent</span>(<span class=\"hljs-string\">&#x27;quit-listening&#x27;</span>, {\n      <span class=\"hljs-attr\">episodeId</span>: sound.<span class=\"hljs-property\">metadata</span>.<span class=\"hljs-property\">episodeId</span>,\n      <span class=\"hljs-attr\">position</span>: sound.<span class=\"hljs-property\">position</span>,\n    });\n  });\n  </code></pre>\n  <p><code>findSound</code> returns immediately, so you can attach listeners before the sound has loaded.</p>\n  \n        <h3 id=\"example\" class=\"docs-md__h3\"><a href=\"#example\" class=\"heading-anchor\">Example</a></h3>\n      <p>Play around with this one and watch the events fire below. Clicking an event puts it in your javascript console.</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"/sounds/internet-on-computers.mp3\" /></p>\n  \n  <p><Docs::EventDisplay @url=\"/sounds/internet-on-computers.mp3\" /></p>\n  \n        <h3 id=\"triggered-on-both-the-sound-and-relayed-through-the-stereo-service\" class=\"docs-md__h3\"><a href=\"#triggered-on-both-the-sound-and-relayed-through-the-stereo-service\" class=\"heading-anchor\">Triggered on both the sound and relayed through the stereo service</a></h3>\n      \n          <ul class=\"docs-list-disc\"><li><code>audio-played</code> ({ sound }) - the sound started playing</li>\n  <li><code>audio-paused</code> ({ sound }) - the sound was paused</li>\n  <li><code>audio-ended</code> ({ sound }) - the sound finished playing</li>\n  <li><code>audio-load-error</code> ({ sound }) - loading sound failed</li>\n  <li><code>audio-ready</code> ({ sound }) - the sound is ready to play</li>\n  <li><code>audio-will-rewind</code> ({sound, currentPosition, newPosition}) - fired before rewinding a sound</li>\n  <li><code>audio-will-fast-forward</code> ({sound, currentPosition, newPosition}) - fired before fast-forwarding a sound</li>\n  <li><code>audio-position-will-change</code> ({sound, currentPosition, newPosition}) - fired before audio position change</li>\n  <li><code>audio-loading</code> ({ sound }) - the sound started loading</li>\n  <li><code>audio-blocked</code> ({ sound }) - the browser blocked autoplay, so user input is needed</li>\n  <li><code>audio-duration-changed</code> ({ sound }) - the sound's duration changed</li>\n  <li><code>audio-metadata-changed</code> ({ old, new, sound }) - the sound's metadata was replaced</li>\n  <li><code>audio-position-changed</code> ({sound}) - the playing sound's position moved. Polled about every 50ms while the page is visible, and every 250ms while it's hidden, since nothing is painting then. It fires only when the position actually changes, so a paused or stalled sound is quiet.</li>\n  </ul>\n        \n        <h3 id=\"stereo-service-only-events\" class=\"docs-md__h3\"><a href=\"#stereo-service-only-events\" class=\"heading-anchor\">Stereo service-only events</a></h3>\n      \n          <ul class=\"docs-list-disc\"><li><code>current-sound-changed</code> ({sound, previousSound}) - triggered when the current sound changes. On initial play, previousSound will be undefined.</li>\n  <li><code>current-sound-interrupted</code> ({sound, previousSound}) - triggered when a sound has been playing and a new one takes its place by being played, pausing the first one</li>\n  <li><code>new-load-request</code> ({loadPromise, urlsOrPromise, options}) - triggered whenever <code>.load</code> or <code>.play</code> is called.</li>\n  <li><code>pre-load</code> (urlsToTry) - triggered whenever <code>.load</code> or <code>.play</code> is called.</li>\n  <li><code>volume-change</code> (volume) - the service volume was set</li>\n  <li><code>playback-speed-change</code> (speed) - the service playback speed was set</li>\n  </ul>\n        \n        <h3 id=\"casting-events\" class=\"docs-md__h3\"><a href=\"#casting-events\" class=\"heading-anchor\">Casting events</a></h3>\n      <p>These fire as casting connects and disconnects. See <a href=\"/docs/casting\"  class=\"docs-md__a\">Casting</a>.</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>audio-cast-availability-changed</code> - a cast device appeared or disappeared</li>\n  <li><code>audio-cast-connecting</code> - connecting to a device</li>\n  <li><code>audio-cast-connected</code> - audio is now playing on the device</li>\n  <li><code>audio-cast-disconnected</code> - playback returned to the local device</li>\n  </ul>\n        </div>\n  */\n  {\n    \"id\": \"7CA0IrnD\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"events\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Events\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You can monitor events on both the \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service for when any sound emits an event, or on an individual sound for when that specific sound emits an event. For example,\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// Log when any sound starts playing\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-played'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"console\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"log\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"`\\\"],[10,1],[14,0,\\\"hljs-subst\\\"],[12],[1,\\\"${sound.url}\\\"],[13],[1,\\\" started playing`\\\"],[13],[1,\\\");\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" sound = \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\");\\\\nsound.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-ended'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"sendEvent\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'finished-listening'\\\"],[13],[1,\\\", {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\": sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\",\\\\n  });\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'current-sound-interrupted'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"sendEvent\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'quit-listening'\\\"],[13],[1,\\\", {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\": sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"episodeId\\\"],[13],[1,\\\",\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\": sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\",\\\\n  });\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\" returns immediately, so you can attach listeners before the sound has loaded.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"example\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#example\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Example\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Play around with this one and watch the events fire below. Clicking an event puts it in your javascript console.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"/sounds/internet-on-computers.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@url\\\"],[\\\"/sounds/internet-on-computers.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"triggered-on-both-the-sound-and-relayed-through-the-stereo-service\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#triggered-on-both-the-sound-and-relayed-through-the-stereo-service\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Triggered on both the sound and relayed through the stereo service\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-played\\\"],[13],[1,\\\" ({ sound }) - the sound started playing\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-paused\\\"],[13],[1,\\\" ({ sound }) - the sound was paused\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-ended\\\"],[13],[1,\\\" ({ sound }) - the sound finished playing\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-load-error\\\"],[13],[1,\\\" ({ sound }) - loading sound failed\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-ready\\\"],[13],[1,\\\" ({ sound }) - the sound is ready to play\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-will-rewind\\\"],[13],[1,\\\" ({sound, currentPosition, newPosition}) - fired before rewinding a sound\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-will-fast-forward\\\"],[13],[1,\\\" ({sound, currentPosition, newPosition}) - fired before fast-forwarding a sound\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-position-will-change\\\"],[13],[1,\\\" ({sound, currentPosition, newPosition}) - fired before audio position change\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-loading\\\"],[13],[1,\\\" ({ sound }) - the sound started loading\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-blocked\\\"],[13],[1,\\\" ({ sound }) - the browser blocked autoplay, so user input is needed\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-duration-changed\\\"],[13],[1,\\\" ({ sound }) - the sound's duration changed\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-metadata-changed\\\"],[13],[1,\\\" ({ old, new, sound }) - the sound's metadata was replaced\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-position-changed\\\"],[13],[1,\\\" ({sound}) - the playing sound's position moved. Polled about every 50ms while the page is visible, and every 250ms while it's hidden, since nothing is painting then. It fires only when the position actually changes, so a paused or stalled sound is quiet.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"stereo-service-only-events\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#stereo-service-only-events\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Stereo service-only events\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"current-sound-changed\\\"],[13],[1,\\\" ({sound, previousSound}) - triggered when the current sound changes. On initial play, previousSound will be undefined.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"current-sound-interrupted\\\"],[13],[1,\\\" ({sound, previousSound}) - triggered when a sound has been playing and a new one takes its place by being played, pausing the first one\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"new-load-request\\\"],[13],[1,\\\" ({loadPromise, urlsOrPromise, options}) - triggered whenever \\\"],[10,\\\"code\\\"],[12],[1,\\\".load\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\".play\\\"],[13],[1,\\\" is called.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"pre-load\\\"],[13],[1,\\\" (urlsToTry) - triggered whenever \\\"],[10,\\\"code\\\"],[12],[1,\\\".load\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\".play\\\"],[13],[1,\\\" is called.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"volume-change\\\"],[13],[1,\\\" (volume) - the service volume was set\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"playback-speed-change\\\"],[13],[1,\\\" (speed) - the service playback speed was set\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"casting-events\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#casting-events\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Casting events\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"These fire as casting connects and disconnects. See \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Casting\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-availability-changed\\\"],[13],[1,\\\" - a cast device appeared or disappeared\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-connecting\\\"],[13],[1,\\\" - connecting to a device\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-connected\\\"],[13],[1,\\\" - audio is now playing on the device\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"audio-cast-disconnected\\\"],[13],[1,\\\" - playback returned to the local device\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[13]],[],false,[\\\"docs/stereo-player\\\",\\\"docs/event-display\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/event-monitoring.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h3 id=\"ember-stereo\" class=\"docs-md__h3\"><a href=\"#ember-stereo\" class=\"heading-anchor\"><strong><code>ember-stereo</code></strong></a></h3>\n      \n  <p><span class=\"text-xl\">is an addon that makes it easy to reactively handle all sorts of audio files in your ember app.</span></p>\n  \n  <p><Docs::AttentionGetter /></p>\n  \n        <h1 id=\"install\" class=\"docs-md__h1\">Install</h1>\n      <pre class=\"docs-md__code\"><code class=\"language-shell\">ember install ember-stereo\n  </code></pre>\n  \n        <h2 id=\"connections\" class=\"docs-md__h2\"><a href=\"#connections\" class=\"heading-anchor\">Connections</a></h2>\n      <p>A connection is a plugin that knows how to play a particular kind of audio. Given a URL the service tries each one in turn until one works, always starting with a native <code>&lt;audio&gt;</code> element.</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>NativeAudio</code> - the browser's own <code>&lt;audio&gt;</code>. Plays whatever the browser supports, and goes first on mobile.</li>\n  <li><code>Howler</code> - <a href=\"https://github.com/goldfire/howler.js\"  class=\"docs-md__a\">howler.js</a>.</li>\n  <li><code>HLS</code> - <a href=\"https://github.com/video-dev/hls.js/\"  class=\"docs-md__a\">HLS.js</a>, for <a href=\"https://caniuse.com/http-live-streaming\"  class=\"docs-md__a\">HLS streams</a>.</li>\n  </ul>\n        <p>List the ones you want in <code>environment.js</code>, in the order to try them:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\">  <span class=\"hljs-attr\">emberStereo</span>: {\n      <span class=\"hljs-attr\">initialVolume</span>: <span class=\"hljs-number\">100</span>, <span class=\"hljs-comment\">// default = 100</span>\n      <span class=\"hljs-attr\">silenceErrors</span>: <span class=\"hljs-literal\">false</span>, <span class=\"hljs-comment\">// true = handle audio errors inline instead of throwing</span>\n      <span class=\"hljs-attr\">connections</span>: [ <span class=\"hljs-comment\">// default = &#x27;NativeAudio&#x27; only</span>\n        {<span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&#x27;NativeAudio&#x27;</span>},\n        {<span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&#x27;Howler&#x27;</span>},\n        {<span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&#x27;HLS&#x27;</span>}\n      ]\n    }\n  </code></pre>\n  <p><a href=\"/docs/casting\"  class=\"docs-md__a\">Casting</a> adds two more connections, which the service wires up automatically when needed.</p>\n  \n        <h2 id=\"history\" class=\"docs-md__h2\"><a href=\"#history\" class=\"heading-anchor\">History</a></h2>\n      <p>This project started as <a href=\"http://github.com/nypublicradio/ember-hifi\"  class=\"docs-md__a\"><code>ember-hifi</code></a> in 2016, an open source audio library funded by New York Public Radio and built by me (<a href=\"http://github.com/jkeen\"  class=\"docs-md__a\">Jeff Keen</a>) and my pal and former WNYC engineer <a href=\"http://github.com/noslouch\"  class=\"docs-md__a\">Brian Whitton</a>.</p>\n  </div>\n  */\n  {\n    \"id\": \"ehUjUCse\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"ember-stereo\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#ember-stereo\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[13],[13],[13],[1,\\\"\\\\n    \\\\n\\\"],[10,2],[12],[10,1],[14,0,\\\"text-xl\\\"],[12],[1,\\\"is an addon that makes it easy to reactively handle all sorts of audio files in your ember app.\\\"],[13],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"install\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Install\\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-shell\\\"],[12],[1,\\\"ember install ember-stereo\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"connections\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#connections\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Connections\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A connection is a plugin that knows how to play a particular kind of audio. Given a URL the service tries each one in turn until one works, always starting with a native \\\"],[10,\\\"code\\\"],[12],[1,\\\"<audio>\\\"],[13],[1,\\\" element.\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"NativeAudio\\\"],[13],[1,\\\" - the browser's own \\\"],[10,\\\"code\\\"],[12],[1,\\\"<audio>\\\"],[13],[1,\\\". Plays whatever the browser supports, and goes first on mobile.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Howler\\\"],[13],[1,\\\" - \\\"],[10,3],[14,6,\\\"https://github.com/goldfire/howler.js\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"howler.js\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"HLS\\\"],[13],[1,\\\" - \\\"],[10,3],[14,6,\\\"https://github.com/video-dev/hls.js/\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"HLS.js\\\"],[13],[1,\\\", for \\\"],[10,3],[14,6,\\\"https://caniuse.com/http-live-streaming\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"HLS streams\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"List the ones you want in \\\"],[10,\\\"code\\\"],[12],[1,\\\"environment.js\\\"],[13],[1,\\\", in the order to try them:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[1,\\\"  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"emberStereo\\\"],[13],[1,\\\": {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"initialVolume\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-number\\\"],[12],[1,\\\"100\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// default = 100\\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"silenceErrors\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-literal\\\"],[12],[1,\\\"false\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// true = handle audio errors inline instead of throwing\\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"connections\\\"],[13],[1,\\\": [ \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// default = 'NativeAudio' only\\\"],[13],[1,\\\"\\\\n      {\\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'NativeAudio'\\\"],[13],[1,\\\"},\\\\n      {\\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Howler'\\\"],[13],[1,\\\"},\\\\n      {\\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'HLS'\\\"],[13],[1,\\\"}\\\\n    ]\\\\n  }\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Casting\\\"],[13],[1,\\\" adds two more connections, which the service wires up automatically when needed.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"history\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#history\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"History\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This project started as \\\"],[10,3],[14,6,\\\"http://github.com/nypublicradio/ember-hifi\\\"],[14,0,\\\"docs-md__a\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"ember-hifi\\\"],[13],[13],[1,\\\" in 2016, an open source audio library funded by New York Public Radio and built by me (\\\"],[10,3],[14,6,\\\"http://github.com/jkeen\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Jeff Keen\\\"],[13],[1,\\\") and my pal and former WNYC engineer \\\"],[10,3],[14,6,\\\"http://github.com/noslouch\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Brian Whitton\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/attention-getter\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/metadata\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"metadata\" class=\"docs-md__h1\">Metadata</h1>\n      <p>Sound objects can store whatever custom metadata you want. This info will stick around for as long as the sound is loaded. Pass in <code>metadata</code> object as an option to any of the <code>play</code> or <code>load</code> helpers and then retrieve that data wherever you need to.</p>\n  \n        <h3 id=\"media-session\" class=\"docs-md__h3\"><a href=\"#media-session\" class=\"heading-anchor\">Media Session</a></h3>\n      <p>When a sound is played, the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/MediaSession\"  class=\"docs-md__a\">MediaSession</a> will be updated with that sound's metadata, setting the media session's <code>title</code>, <code>artist</code>, <code>album</code>, and <code>artwork</code> to the corresponding metadata values. This is what the lock screen, notification shade, car display and macOS Now Playing widget show.</p>\n  <p>The sound's duration and position are reported too, so those controls can draw a timeline and offer scrubbing.</p>\n  \n        <h4 id=\"describing-a-timeline-the-audio-doesn-t-have\" class=\"docs-md__h4\"><a href=\"#describing-a-timeline-the-audio-doesn-t-have\" class=\"heading-anchor\">Describing a timeline the audio doesn't have</a></h4>\n      <p>Sometimes the media's own clock isn't the timeline a listener is moving through. A live stream has no duration, but if it's carrying a scheduled show, that show's window is the timeline your scrubber draws.</p>\n  <p>Pass a <code>timeline</code> in the metadata and it will be used instead of the sound's own duration and position. Both values are in milliseconds:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(streamUrl, {\n    <span class=\"hljs-attr\">metadata</span>: {\n      <span class=\"hljs-attr\">title</span>: <span class=\"hljs-string\">&#x27;Stronger Than Dirt&#x27;</span>,\n      <span class=\"hljs-attr\">timeline</span>: { <span class=\"hljs-attr\">duration</span>: <span class=\"hljs-number\">3600000</span>, <span class=\"hljs-attr\">position</span>: elapsedMs },\n    },\n  });\n  </code></pre>\n  <p>Supplying one also asserts there is something to scrub, so the OS will offer a scrubber even for a sound that reports itself unseekable.</p>\n  \n        <h4 id=\"overriding-the-controls\" class=\"docs-md__h4\"><a href=\"#overriding-the-controls\" class=\"heading-anchor\">Overriding the controls</a></h4>\n      <p>By default the transport buttons do the obvious thing to the sound: play, pause, stop, seek. When your app knows better, register handlers for a specific sound:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">registerMediaSessionActions</span>(streamUrl, {\n    <span class=\"hljs-comment\">// seeking back on a live stream means leaving it for a recording</span>\n    <span class=\"hljs-attr\">seekto</span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">positionMs</span>) =&gt;</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">rewindTo</span>(positionMs),\n    <span class=\"hljs-attr\">seekbackward</span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">offsetMs</span>) =&gt;</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">rewindTo</span>(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">elapsedMs</span> - offsetMs),\n    <span class=\"hljs-attr\">seekforward</span>: <span class=\"hljs-literal\">null</span>,\n  });\n  </code></pre>\n  <p>An action can be:</p>\n  \n          <ul class=\"docs-list-disc\"><li><strong>omitted</strong>, and the library's own behaviour applies</li>\n  <li><strong>a function</strong>, which is called instead, with <code>positionMs</code> for <code>seekto</code> and <code>offsetMs</code> for <code>seekbackward</code> / <code>seekforward</code></li>\n  <li><strong><code>null</code></strong>, which removes the control entirely</li>\n  </ul>\n        <p>That last one matters, because registering a handler is what makes the OS draw the button. A no-op handler leaves a button that does nothing when pressed; <code>null</code> means no button.</p>\n  <p><code>previoustrack</code> and <code>nexttrack</code> have no default behaviour, since a sound has no idea what the next track is. They appear only if you register them. On iOS they take the place of the seek buttons rather than joining them.</p>\n  <p>Handlers are keyed by identifier and persist until replaced, so tear them down when whatever registered them goes away:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">unregisterMediaSessionActions</span>(streamUrl);\n  </code></pre>\n  \n        <h3 id=\"examples\" class=\"docs-md__h3\"><a href=\"#examples\" class=\"heading-anchor\">Examples</a></h3>\n      \n  <p><Docs::CustomMetadata /></p>\n  <p>Metadata can also be passed through the service:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\">\n  @service stereo;\n  ...\n  @action\n  <span class=\"hljs-keyword\">async</span> <span class=\"hljs-title function_\">playSound</span>(<span class=\"hljs-params\"></span>) {\n    <span class=\"hljs-keyword\">let</span> { sound } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">show</span>.<span class=\"hljs-property\">audioUrl</span>, {\n      <span class=\"hljs-attr\">metadata</span>: {\n        <span class=\"hljs-attr\">title</span>: <span class=\"hljs-string\">&quot;title of audio&quot;</span>,\n        <span class=\"hljs-attr\">artist</span>: <span class=\"hljs-string\">&quot;artist&quot;</span>,\n        <span class=\"hljs-attr\">show</span>: <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">show</span>\n      }\n    })\n  }\n  </code></pre>\n  </div>\n  */\n  {\n    \"id\": \"HbiA2l38\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"metadata\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Metadata\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Sound objects can store whatever custom metadata you want. This info will stick around for as long as the sound is loaded. Pass in \\\"],[10,\\\"code\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\" object as an option to any of the \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" or \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" helpers and then retrieve that data wherever you need to.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"media-session\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#media-session\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Media Session\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"When a sound is played, the \\\"],[10,3],[14,6,\\\"https://developer.mozilla.org/en-US/docs/Web/API/MediaSession\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"MediaSession\\\"],[13],[1,\\\" will be updated with that sound's metadata, setting the media session's \\\"],[10,\\\"code\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"artist\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"album\\\"],[13],[1,\\\", and \\\"],[10,\\\"code\\\"],[12],[1,\\\"artwork\\\"],[13],[1,\\\" to the corresponding metadata values. This is what the lock screen, notification shade, car display and macOS Now Playing widget show.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The sound's duration and position are reported too, so those controls can draw a timeline and offer scrubbing.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"describing-a-timeline-the-audio-doesn-t-have\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#describing-a-timeline-the-audio-doesn-t-have\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Describing a timeline the audio doesn't have\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Sometimes the media's own clock isn't the timeline a listener is moving through. A live stream has no duration, but if it's carrying a scheduled show, that show's window is the timeline your scrubber draws.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Pass a \\\"],[10,\\\"code\\\"],[12],[1,\\\"timeline\\\"],[13],[1,\\\" in the metadata and it will be used instead of the sound's own duration and position. Both values are in milliseconds:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(streamUrl, {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Stronger Than Dirt'\\\"],[13],[1,\\\",\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"timeline\\\"],[13],[1,\\\": { \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"duration\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-number\\\"],[12],[1,\\\"3600000\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\": elapsedMs },\\\\n  },\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Supplying one also asserts there is something to scrub, so the OS will offer a scrubber even for a sound that reports itself unseekable.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"overriding-the-controls\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#overriding-the-controls\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Overriding the controls\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"By default the transport buttons do the obvious thing to the sound: play, pause, stop, seek. When your app knows better, register handlers for a specific sound:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"registerMediaSessionActions\\\"],[13],[1,\\\"(streamUrl, {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// seeking back on a live stream means leaving it for a recording\\\"],[13],[1,\\\"\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"seekto\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"positionMs\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"rewindTo\\\"],[13],[1,\\\"(positionMs),\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"seekbackward\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"offsetMs\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"rewindTo\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"elapsedMs\\\"],[13],[1,\\\" - offsetMs),\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"seekforward\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-literal\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\",\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"An action can be:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"omitted\\\"],[13],[1,\\\", and the library's own behaviour applies\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"a function\\\"],[13],[1,\\\", which is called instead, with \\\"],[10,\\\"code\\\"],[12],[1,\\\"positionMs\\\"],[13],[1,\\\" for \\\"],[10,\\\"code\\\"],[12],[1,\\\"seekto\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"offsetMs\\\"],[13],[1,\\\" for \\\"],[10,\\\"code\\\"],[12],[1,\\\"seekbackward\\\"],[13],[1,\\\" / \\\"],[10,\\\"code\\\"],[12],[1,\\\"seekforward\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[13],[1,\\\", which removes the control entirely\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"That last one matters, because registering a handler is what makes the OS draw the button. A no-op handler leaves a button that does nothing when pressed; \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\" means no button.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"previoustrack\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"nexttrack\\\"],[13],[1,\\\" have no default behaviour, since a sound has no idea what the next track is. They appear only if you register them. On iOS they take the place of the seek buttons rather than joining them.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Handlers are keyed by identifier and persist until replaced, so tear them down when whatever registered them goes away:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"unregisterMediaSessionActions\\\"],[13],[1,\\\"(streamUrl);\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"examples\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#examples\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Examples\\\"],[13],[13],[1,\\\"\\\\n    \\\\n\\\"],[10,2],[12],[8,[39,0],null,null,null],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Metadata can also be passed through the service:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[1,\\\"\\\\n@service stereo;\\\\n...\\\\n@action\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"async\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"playSound\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[13],[1,\\\") {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"show\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"audioUrl\\\"],[13],[1,\\\", {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": {\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"\\\\\\\"title of audio\\\\\\\"\\\"],[13],[1,\\\",\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"artist\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"\\\\\\\"artist\\\\\\\"\\\"],[13],[1,\\\",\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"show\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"show\\\"],[13],[1,\\\"\\\\n    }\\\\n  })\\\\n}\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/custom-metadata\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/metadata.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/playing-sounds\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"playing-sounds\" class=\"docs-md__h1\">Playing Sounds</h1>\n      <p><code>findSound</code>, <code>load</code>, and <code>play</code> all hand back a <strong><code>Sound</code></strong>: an identity-stable container that exists before any audio has loaded.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-keyword\">let</span> sound = <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(<span class=\"hljs-string\">&#x27;https://streaming.koop.org/stream.aac&#x27;</span>);\n  </code></pre>\n  <p><code>findSound</code> is synchronous and find-or-create, so asking for the same identifier twice gives you the same <code>Sound</code>. Its identity is the url rather than the connection underneath, so it survives a connection swap or <a href=\"/docs/casting\"  class=\"docs-md__a\">casting</a>. References and listeners you attach to it stay valid across all of that.</p>\n  <p>Most of the time you never touch it directly. Point a template helper at a url and it finds the sound for you:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">on</span> <span class=\"hljs-string\">&#x27;click&#x27;</span> (<span class=\"hljs-name\">toggle-play-sound</span> @identifier)&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\"> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;button&#x27;</span>&gt;</span>\n    Play/Pause\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span></span>\n  </code></pre>\n  <p>Helpers like <a href=\"/docs/api/helpers/sound-is-playing\"  class=\"docs-md__a\">sound-is-playing</a>, <a href=\"/docs/api/helpers/sound-is-loading\"  class=\"docs-md__a\">sound-is-loading</a>, <a href=\"/docs/api/helpers/sound-is-loaded\"  class=\"docs-md__a\">sound-is-loaded</a>, <a href=\"/docs/api/helpers/sound-is-errored\"  class=\"docs-md__a\">sound-is-errored</a>, <a href=\"/docs/api/helpers/sound-is-seekable\"  class=\"docs-md__a\">sound-is-seekable</a>, <a href=\"/docs/api/helpers/sound-is-rewindable\"  class=\"docs-md__a\">sound-is-rewindable</a>, <a href=\"/docs/api/helpers/sound-is-fastforwardable\"  class=\"docs-md__a\">sound-is-fastforwardable</a>, <a href=\"/docs/api/helpers/sound-is-blocked\"  class=\"docs-md__a\">sound-is-blocked</a>, <a href=\"/docs/api/helpers/sound-position\"  class=\"docs-md__a\">sound-position</a>, <a href=\"/docs/api/helpers/sound-duration\"  class=\"docs-md__a\">sound-duration</a>, <a href=\"/docs/api/helpers/sound-metadata\"  class=\"docs-md__a\">sound-metadata</a>, <a href=\"/docs/api/helpers/sound-error-details\"  class=\"docs-md__a\">sound-error-details</a>, and <a href=\"/docs/api/helpers/find-sound\"  class=\"docs-md__a\">find-sound</a> compose into a whole player without leaving the template.</p>\n  \n  <p><Docs::StereoPlayerExample @identifier=\"/sounds/works-just-like-a-vcr.mp3\" /></p>\n  \n        <h2 id=\"identifiers\" class=\"docs-md__h2\"><a href=\"#identifiers\" class=\"heading-anchor\">Identifiers</a></h2>\n      <p>An identifier is usually a url string, but it can also be an object with a <code>url</code> (and maybe a <code>mimeType</code>), an already loaded <code>Sound</code>, an array of any of those, or a promise resolving to any of those. Give an array when you have several versions of the same audio and want the best one that works, which is covered in <a href=\"/docs/browser-audio\"  class=\"docs-md__a\">Browser Audio</a>.</p>\n  \n        <h3 id=\"on-demand\" class=\"docs-md__h3\"><a href=\"#on-demand\" class=\"heading-anchor\">On demand</a></h3>\n      <p>This uses the same url as the player above. Sound state is app-wide, so both stay in sync.</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"/sounds/works-just-like-a-vcr.mp3\"/></p>\n  \n        <h3 id=\"streaming\" class=\"docs-md__h3\"><a href=\"#streaming\" class=\"heading-anchor\">Streaming</a></h3>\n      <p>A live stream reports a duration of ∞ and disables the position controls. Here's the live web stream of the scrappy Austin community radio station, KOOP.</p>\n  \n  <p><Docs::StereoPlayer @identifier=\"https://streaming.koop.org/stream.mp3\"/></p>\n  \n        <h2 id=\"waiting-for-a-sound-to-load\" class=\"docs-md__h2\"><a href=\"#waiting-for-a-sound-to-load\" class=\"heading-anchor\">Waiting for a sound to load</a></h2>\n      <p>The <code>Sound</code> comes back before its audio does, so it answers its own loading state while you wait:</p>\n  \n          <ul class=\"docs-list-disc\"><li><strong><code>isPending</code></strong> - exists, but no connection has resolved yet</li>\n  <li><strong><code>isLoading</code></strong> - a load is in flight, or the stream is buffering on play</li>\n  <li><strong><code>isResolved</code></strong> - a connection is backing the sound</li>\n  <li><strong><code>isLoaded</code></strong> - the connection has enough to play</li>\n  <li><strong><code>isErrored</code></strong> - every playable strategy was tried and none worked. <code>errors</code> holds the per-strategy failures and <code>error</code> the most recent one</li>\n  </ul>\n        <p>These are reactive, so an indicator can render before the sound loads and update when something else loads or plays it.</p>\n  \n  <p><Docs::ProxyExample /></p>\n  \n        <h2 id=\"reading-playback-state\" class=\"docs-md__h2\"><a href=\"#reading-playback-state\" class=\"heading-anchor\">Reading playback state</a></h2>\n      <p>Once resolved, the <code>Sound</code> proxies the live state of whatever connection is backing it. The same object exposes:</p>\n  \n          <ul class=\"docs-list-disc\"><li><strong>Playback</strong>: <code>isPlaying</code>, <code>isPaused</code>, <code>isBlocked</code>, <code>hasPlayed</code></li>\n  <li><strong>Position</strong>: <code>position</code>, <code>duration</code>, <code>percentLoaded</code>, and for live/HLS streams <code>currentTime</code>, <code>startTime</code>, <code>endTime</code></li>\n  <li><strong>Capabilities</strong>: <code>isStream</code>, <code>isSeekable</code>, <code>isRewindable</code>, <code>isFastForwardable</code></li>\n  <li><strong>Identity & metadata</strong>: <code>url</code>, <code>mimeType</code>, <code>metadata</code>, <code>id3TagMetadata</code>, <code>connectionName</code></li>\n  <li><strong>Actions</strong>: <code>play</code>, <code>pause</code>, <code>stop</code>, <code>togglePause</code>, <code>rewind</code>, <code>fastForward</code>, <code>seek</code></li>\n  </ul>\n        <p>Each template helper reads one of these properties off the sound it finds.</p>\n  <p>To ask whether a sound is the one for a url, call <code>sound.hasUrl(url)</code> rather than comparing <code>sound.url</code> yourself. A sound can answer to more than one url, and two urls that differ only by a query string are usually the same audio. Pass <code>{ exact: true }</code> when the query string matters, as it does for cache-busted streams.</p>\n  \n        <h2 id=\"volume\" class=\"docs-md__h2\"><a href=\"#volume\" class=\"heading-anchor\">Volume</a></h2>\n      <p>Volume is global, so every sound plays at the same level. It defaults to 100, which is whatever the system volume is. The <code>&#123;&#123;stereo-volume&#125;&#125;</code> modifier turns a range input into a volume control, and <a href=\"/docs/api/helpers/toggle-stereo-mute\"  class=\"docs-md__a\">toggle-stereo-mute</a> handles muting.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-hbs\"><span class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&#x27;range&#x27;</span> </span></span><span class=\"hljs-template-variable\">&#123;&#123;<span class=\"hljs-name\">stereo-volume</span>&#125;&#125;</span><span class=\"language-xml\"><span class=\"hljs-tag\"> /&gt;</span></span>\n  </code></pre>\n  <p>From the service, <code>stereo.volume</code> is a getter and setter. Mobile devices don't allow it, so <a href=\"/docs/api/helpers/stereo-volume-is-adjustable\"  class=\"docs-md__a\">stereo-volume-is-adjustable</a> tells you whether to render the control at all.</p>\n  \n        <h2 id=\"playback-speed\" class=\"docs-md__h2\"><a href=\"#playback-speed\" class=\"heading-anchor\">Playback speed</a></h2>\n      <p><code>stereo.playbackSpeed</code> reads and sets the rate of the current sound, where 1 is normal. Speed belongs to the sound rather than the service, so each sound remembers its own and a new one starts at 1. Switching to a sound at a different speed fires <code>playback-speed-change</code>. A live stream always plays at 1 whatever the setting.</p>\n  \n        <h2 id=\"load-options\" class=\"docs-md__h2\"><a href=\"#load-options\" class=\"heading-anchor\">Load options</a></h2>\n      <p><code>play</code> and <code>load</code> take an options hash alongside the identifier:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url, {\n    <span class=\"hljs-attr\">useConnections</span>: [<span class=\"hljs-string\">&#x27;HLS&#x27;</span>, <span class=\"hljs-string\">&#x27;NativeAudio&#x27;</span>],\n    <span class=\"hljs-attr\">metadata</span>: { <span class=\"hljs-attr\">title</span>: <span class=\"hljs-string\">&#x27;Works Just Like A VCR&#x27;</span> },\n    <span class=\"hljs-attr\">startPosition</span>: <span class=\"hljs-number\">90</span>,\n  });\n  \n  <span class=\"hljs-comment\">// or, for a live stream</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(streamUrl, { <span class=\"hljs-attr\">duration</span>: <span class=\"hljs-title class_\">Infinity</span> });\n  </code></pre>\n  \n          <ul class=\"docs-list-disc\"><li><strong><code>metadata</code></strong> stores whatever you want alongside the sound, and feeds the OS media controls. See <a href=\"/docs/metadata\"  class=\"docs-md__a\">Metadata</a>.</li>\n  <li><strong><code>useConnections</code></strong> limits which connections may be tried, in order of preference, instead of the full waterfall.</li>\n  <li><strong><code>startPosition</code></strong> (seconds) begins playback part way in. The connection is handed the offset as it's built, so the first thing it fetches is the piece you asked for.</li>\n  <li><strong><code>streamPauseGraceMs</code></strong> keeps a paused stream's connection open for this long before stopping it, so a listener who pauses briefly doesn't pay for a reconnect. Holding it costs bandwidth and, on a live stream, a slot on the streaming server, so the default is to stop as soon as it's paused. Pass <code>Infinity</code> to hold it until something explicitly stops it.</li>\n  <li><strong><code>duration</code></strong> (ms) declares how long the media is, skipping measurement rather than correcting it afterward. Pass <code>Infinity</code> for a live stream. Connections normally work this out themselves, but some cases defeat measurement.</li>\n  <li><strong><code>seekable</code></strong> declares if the media is seekable. Connections usually detect this on their own, but declaring it explicity takes the guesswork out.</li>\n  <li><strong><code>xhr</code></strong> passes <code>headers</code>, <code>withCredentials</code> and <code>method</code> through to connections that fetch over XHR.</li>\n  <li><strong><code>preview</code></strong> plays the sound without it becoming <code>currentSound</code>.</li>\n  <li><strong><code>silenceErrors</code></strong> returns the error on the result instead of throwing. Can also be set globally in <code>environment.js</code>.</li>\n  </ul>\n        \n        <h2 id=\"swapping-the-connection\" class=\"docs-md__h2\"><a href=\"#swapping-the-connection\" class=\"heading-anchor\">Swapping the connection</a></h2>\n      \n          <ul class=\"docs-list-disc\"><li><strong><code>sound.castUrl</code></strong> - a device-fetchable variant of the stream, used when <a href=\"/docs/casting\"  class=\"docs-md__a\">casting</a>. See the casting docs for why a separate url is needed.</li>\n  <li><strong><code>sound.swap(target)</code></strong> - replaces the backing connection while keeping the <code>Sound</code>'s identity and your references intact, carrying position and play-state across. Pass a connection key from the sound's own strategies (<code>sound.swap(&#39;hls&#39;)</code>) or a connection instance.</li>\n  </ul>\n        \n        <h2 id=\"interacting-with-the-service\" class=\"docs-md__h2\"><a href=\"#interacting-with-the-service\" class=\"heading-anchor\">Interacting with the service</a></h2>\n      <p>You can trigger sounds directly from the <code>stereo</code> service.</p>\n  \n  <p><Docs::ServiceExample /></p>\n  </div>\n  */\n  {\n    \"id\": \"ajGDShlD\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"playing-sounds\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\", and \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" all hand back a \\\"],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[1,\\\": an identity-stable container that exists before any audio has loaded.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" sound = \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'https://streaming.koop.org/stream.aac'\\\"],[13],[1,\\\");\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\" is synchronous and find-or-create, so asking for the same identifier twice gives you the same \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\". Its identity is the url rather than the connection underneath, so it survives a connection swap or \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"casting\\\"],[13],[1,\\\". References and listeners you attach to it stay valid across all of that.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Most of the time you never touch it directly. Point a template helper at a url and it finds the sound for you:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'click'\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"toggle-play-sound\\\"],[13],[1,\\\" @identifier)}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'button'\\\"],[13],[1,\\\">\\\"],[13],[1,\\\"\\\\n  Play/Pause\\\\n\\\"],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"</\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"button\\\"],[13],[1,\\\">\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Helpers like \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-playing\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-playing\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-loading\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-loading\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-loaded\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-loaded\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-errored\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-errored\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-seekable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-seekable\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-rewindable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-rewindable\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-fastforwardable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-fastforwardable\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-is-blocked\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-is-blocked\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-position\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-position\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-duration\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-duration\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-metadata\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-metadata\\\"],[13],[1,\\\", \\\"],[10,3],[14,6,\\\"/docs/api/helpers/sound-error-details\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"sound-error-details\\\"],[13],[1,\\\", and \\\"],[10,3],[14,6,\\\"/docs/api/helpers/find-sound\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"find-sound\\\"],[13],[1,\\\" compose into a whole player without leaving the template.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,0],null,[[\\\"@identifier\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"identifiers\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#identifiers\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Identifiers\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"An identifier is usually a url string, but it can also be an object with a \\\"],[10,\\\"code\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\" (and maybe a \\\"],[10,\\\"code\\\"],[12],[1,\\\"mimeType\\\"],[13],[1,\\\"), an already loaded \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\", an array of any of those, or a promise resolving to any of those. Give an array when you have several versions of the same audio and want the best one that works, which is covered in \\\"],[10,3],[14,6,\\\"/docs/browser-audio\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Browser Audio\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"on-demand\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#on-demand\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"On demand\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"This uses the same url as the player above. Sound state is app-wide, so both stay in sync.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@identifier\\\"],[\\\"/sounds/works-just-like-a-vcr.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"streaming\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#streaming\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Streaming\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A live stream reports a duration of ∞ and disables the position controls. Here's the live web stream of the scrappy Austin community radio station, KOOP.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,1],null,[[\\\"@identifier\\\"],[\\\"https://streaming.koop.org/stream.mp3\\\"]],null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"waiting-for-a-sound-to-load\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#waiting-for-a-sound-to-load\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Waiting for a sound to load\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" comes back before its audio does, so it answers its own loading state while you wait:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isPending\\\"],[13],[13],[1,\\\" - exists, but no connection has resolved yet\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isLoading\\\"],[13],[13],[1,\\\" - a load is in flight, or the stream is buffering on play\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isResolved\\\"],[13],[13],[1,\\\" - a connection is backing the sound\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isLoaded\\\"],[13],[13],[1,\\\" - the connection has enough to play\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"isErrored\\\"],[13],[13],[1,\\\" - every playable strategy was tried and none worked. \\\"],[10,\\\"code\\\"],[12],[1,\\\"errors\\\"],[13],[1,\\\" holds the per-strategy failures and \\\"],[10,\\\"code\\\"],[12],[1,\\\"error\\\"],[13],[1,\\\" the most recent one\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"These are reactive, so an indicator can render before the sound loads and update when something else loads or plays it.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,2],null,null,null],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"reading-playback-state\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#reading-playback-state\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Reading playback state\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Once resolved, the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" proxies the live state of whatever connection is backing it. The same object exposes:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Playback\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"isPlaying\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isPaused\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isBlocked\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"hasPlayed\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Position\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"position\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"duration\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"percentLoaded\\\"],[13],[1,\\\", and for live/HLS streams \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentTime\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"startTime\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"endTime\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Capabilities\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"isStream\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isSeekable\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isRewindable\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"isFastForwardable\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Identity & metadata\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"mimeType\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"id3TagMetadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"connectionName\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[1,\\\"Actions\\\"],[13],[1,\\\": \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"pause\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"stop\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"togglePause\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"rewind\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"fastForward\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"seek\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Each template helper reads one of these properties off the sound it finds.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"To ask whether a sound is the one for a url, call \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.hasUrl(url)\\\"],[13],[1,\\\" rather than comparing \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.url\\\"],[13],[1,\\\" yourself. A sound can answer to more than one url, and two urls that differ only by a query string are usually the same audio. Pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"{ exact: true }\\\"],[13],[1,\\\" when the query string matters, as it does for cache-busted streams.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"volume\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#volume\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Volume\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Volume is global, so every sound plays at the same level. It defaults to 100, which is whatever the system volume is. The \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{stereo-volume}}\\\"],[13],[1,\\\" modifier turns a range input into a volume control, and \\\"],[10,3],[14,6,\\\"/docs/api/helpers/toggle-stereo-mute\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"toggle-stereo-mute\\\"],[13],[1,\\\" handles muting.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-hbs\\\"],[12],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\"<\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"input\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"type\\\"],[13],[1,\\\"=\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'range'\\\"],[13],[1,\\\" \\\"],[13],[13],[10,1],[14,0,\\\"hljs-template-variable\\\"],[12],[1,\\\"{{\\\"],[10,1],[14,0,\\\"hljs-name\\\"],[12],[1,\\\"stereo-volume\\\"],[13],[1,\\\"}}\\\"],[13],[10,1],[14,0,\\\"language-xml\\\"],[12],[10,1],[14,0,\\\"hljs-tag\\\"],[12],[1,\\\" />\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"From the service, \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.volume\\\"],[13],[1,\\\" is a getter and setter. Mobile devices don't allow it, so \\\"],[10,3],[14,6,\\\"/docs/api/helpers/stereo-volume-is-adjustable\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"stereo-volume-is-adjustable\\\"],[13],[1,\\\" tells you whether to render the control at all.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"playback-speed\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#playback-speed\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Playback speed\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.playbackSpeed\\\"],[13],[1,\\\" reads and sets the rate of the current sound, where 1 is normal. Speed belongs to the sound rather than the service, so each sound remembers its own and a new one starts at 1. Switching to a sound at a different speed fires \\\"],[10,\\\"code\\\"],[12],[1,\\\"playback-speed-change\\\"],[13],[1,\\\". A live stream always plays at 1 whatever the setting.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"load-options\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#load-options\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Load options\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" take an options hash alongside the identifier:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url, {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"useConnections\\\"],[13],[1,\\\": [\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'HLS'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'NativeAudio'\\\"],[13],[1,\\\"],\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": { \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"title\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Works Just Like A VCR'\\\"],[13],[1,\\\" },\\\\n  \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"startPosition\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-number\\\"],[12],[1,\\\"90\\\"],[13],[1,\\\",\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// or, for a live stream\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(streamUrl, { \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"duration\\\"],[13],[1,\\\": \\\"],[10,1],[14,0,\\\"hljs-title class_\\\"],[12],[1,\\\"Infinity\\\"],[13],[1,\\\" });\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"metadata\\\"],[13],[13],[1,\\\" stores whatever you want alongside the sound, and feeds the OS media controls. See \\\"],[10,3],[14,6,\\\"/docs/metadata\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Metadata\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"useConnections\\\"],[13],[13],[1,\\\" limits which connections may be tried, in order of preference, instead of the full waterfall.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"startPosition\\\"],[13],[13],[1,\\\" (seconds) begins playback part way in. The connection is handed the offset as it's built, so the first thing it fetches is the piece you asked for.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"streamPauseGraceMs\\\"],[13],[13],[1,\\\" keeps a paused stream's connection open for this long before stopping it, so a listener who pauses briefly doesn't pay for a reconnect. Holding it costs bandwidth and, on a live stream, a slot on the streaming server, so the default is to stop as soon as it's paused. Pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"Infinity\\\"],[13],[1,\\\" to hold it until something explicitly stops it.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"duration\\\"],[13],[13],[1,\\\" (ms) declares how long the media is, skipping measurement rather than correcting it afterward. Pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"Infinity\\\"],[13],[1,\\\" for a live stream. Connections normally work this out themselves, but some cases defeat measurement.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"seekable\\\"],[13],[13],[1,\\\" declares if the media is seekable. Connections usually detect this on their own, but declaring it explicity takes the guesswork out.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"xhr\\\"],[13],[13],[1,\\\" passes \\\"],[10,\\\"code\\\"],[12],[1,\\\"headers\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"withCredentials\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"method\\\"],[13],[1,\\\" through to connections that fetch over XHR.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"preview\\\"],[13],[13],[1,\\\" plays the sound without it becoming \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentSound\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"silenceErrors\\\"],[13],[13],[1,\\\" returns the error on the result instead of throwing. Can also be set globally in \\\"],[10,\\\"code\\\"],[12],[1,\\\"environment.js\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"swapping-the-connection\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#swapping-the-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Swapping the connection\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[13],[1,\\\" - a device-fetchable variant of the stream, used when \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"casting\\\"],[13],[1,\\\". See the casting docs for why a separate url is needed.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.swap(target)\\\"],[13],[13],[1,\\\" - replaces the backing connection while keeping the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\"'s identity and your references intact, carrying position and play-state across. Pass a connection key from the sound's own strategies (\\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.swap('hls')\\\"],[13],[1,\\\") or a connection instance.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"interacting-with-the-service\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#interacting-with-the-service\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Interacting with the service\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"You can trigger sounds directly from the \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\" service.\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[8,[39,3],null,null,null],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"docs/stereo-player-example\\\",\\\"docs/stereo-player\\\",\\\"docs/proxy-example\\\",\\\"docs/service-example\\\"]]\",\n    \"moduleName\": \"docs/templates/docs/playing-sounds.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/testing\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"testing\" class=\"docs-md__h1\">Testing</h1>\n      <p>If you need to test audio handling that involves <code>ember-stereo</code> in your app, you're gonna need this helper. It sets up and cleans up a few stereo-related items, but most importantly it stubs out the native browser audio and video elements replacing it with a FakeMediaElement that behaves sanely in the test environment.</p>\n  <p>You can control how the sound behaves by providing a url in one of these formats:</p>\n  \n        <h2 id=\"url-formats\" class=\"docs-md__h2\"><a href=\"#url-formats\" class=\"heading-anchor\">URL Formats</a></h2>\n      \n        <h4 id=\"urls-that-will-successfully-load-\" class=\"docs-md__h4\"><a href=\"#urls-that-will-successfully-load-\" class=\"heading-anchor\">URLs that will successfully load:</a></h4>\n      \n          <ul class=\"docs-list-disc\"><li><code>good/10000/test-url.mp3</code>: an mp3 that is 10 seconds long</li>\n  <li><code>good/stream/the-current.aac</code>: an aac audio stream, duration = Infinity, will behave like a stream does</li>\n  </ul>\n        \n        <h4 id=\"urls-that-will-fail\" class=\"docs-md__h4\"><a href=\"#urls-that-will-fail\" class=\"heading-anchor\">URLs that will fail</a></h4>\n      \n          <ul class=\"docs-list-disc\"><li><code>bad/codec-error/the-current.aac</code>: an aac sound that will fail with 'codec-error'</li>\n  <li><code>bad/some%20custom%20string/the-current.aac</code>: an aac sound that will fail with error message 'some custom string'</li>\n  </ul>\n        <p>Here's an example test, testing an example player, making sure that fast forward and rewind buttons are disabled.</p>\n  <pre class=\"docs-md__code\"><code class=\"language-javascript\"><span class=\"hljs-keyword\">import</span> { setupStereoTest } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&#x27;ember-stereo/test-support/stereo-setup&#x27;</span>;\n  \n  <span class=\"hljs-title function_\">module</span>(<span class=\"hljs-string\">&#x27;Integration | Component | player&#x27;</span>, <span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">hooks</span>) {\n    <span class=\"hljs-title function_\">setupStereoTest</span>(hooks);\n  \n    <span class=\"hljs-title function_\">test</span>(<span class=\"hljs-string\">&#x27;it does not display rewind and ff buttons when stream&#x27;</span>, <span class=\"hljs-keyword\">async</span> <span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">assert</span>) {\n      <span class=\"hljs-keyword\">let</span> stereo = <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">owner</span>.<span class=\"hljs-title function_\">lookup</span>(<span class=\"hljs-string\">&#x27;service:stereo&#x27;</span>);\n      <span class=\"hljs-keyword\">await</span> stereo.<span class=\"hljs-title function_\">play</span>(<span class=\"hljs-string\">&#x27;/good/stream/test.mp3&#x27;</span>, {\n        <span class=\"hljs-attr\">metadata</span>: {\n          show,\n          track,\n        },\n      });\n      <span class=\"hljs-keyword\">await</span> <span class=\"hljs-title function_\">render</span>(hbs<span class=\"hljs-string\">`&lt;Player/&gt;`</span>);\n  \n      assert.<span class=\"hljs-title function_\">dom</span>(<span class=\"hljs-string\">&#x27;[data-test-element=&quot;fastforward-button&quot;]&#x27;</span>).<span class=\"hljs-title function_\">isDisabled</span>();\n      assert.<span class=\"hljs-title function_\">dom</span>(<span class=\"hljs-string\">&#x27;[data-test-element=&quot;rewind-button&quot;]&#x27;</span>).<span class=\"hljs-title function_\">isDisabled</span>();\n      assert.<span class=\"hljs-title function_\">dom</span>(<span class=\"hljs-string\">&#x27;[data-test-element=&quot;play-pause-button&quot;]&#x27;</span>).<span class=\"hljs-title function_\">exists</span>();\n    });\n  });\n  </code></pre>\n  </div>\n  */\n  {\n    \"id\": \"7ICZzLKI\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"testing\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Testing\\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"If you need to test audio handling that involves \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-stereo\\\"],[13],[1,\\\" in your app, you're gonna need this helper. It sets up and cleans up a few stereo-related items, but most importantly it stubs out the native browser audio and video elements replacing it with a FakeMediaElement that behaves sanely in the test environment.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"You can control how the sound behaves by providing a url in one of these formats:\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"url-formats\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#url-formats\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"URL Formats\\\"],[13],[13],[1,\\\"\\\\n    \\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"urls-that-will-successfully-load-\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#urls-that-will-successfully-load-\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"URLs that will successfully load:\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"good/10000/test-url.mp3\\\"],[13],[1,\\\": an mp3 that is 10 seconds long\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"good/stream/the-current.aac\\\"],[13],[1,\\\": an aac audio stream, duration = Infinity, will behave like a stream does\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h4\\\"],[14,1,\\\"urls-that-will-fail\\\"],[14,0,\\\"docs-md__h4\\\"],[12],[10,3],[14,6,\\\"#urls-that-will-fail\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"URLs that will fail\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"bad/codec-error/the-current.aac\\\"],[13],[1,\\\": an aac sound that will fail with 'codec-error'\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"bad/some%20custom%20string/the-current.aac\\\"],[13],[1,\\\": an aac sound that will fail with error message 'some custom string'\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"Here's an example test, testing an example player, making sure that fast forward and rewind buttons are disabled.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-javascript\\\"],[12],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"import\\\"],[13],[1,\\\" { setupStereoTest } \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"from\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'ember-stereo/test-support/stereo-setup'\\\"],[13],[1,\\\";\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"module\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'Integration | Component | player'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"function\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"hooks\\\"],[13],[1,\\\") {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"setupStereoTest\\\"],[13],[1,\\\"(hooks);\\\\n\\\\n  \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"test\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'it does not display rewind and ff buttons when stream'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"async\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"function\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"assert\\\"],[13],[1,\\\") {\\\\n    \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" stereo = \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"owner\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"lookup\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'service:stereo'\\\"],[13],[1,\\\");\\\\n    \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" stereo.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'/good/stream/test.mp3'\\\"],[13],[1,\\\", {\\\\n      \\\"],[10,1],[14,0,\\\"hljs-attr\\\"],[12],[1,\\\"metadata\\\"],[13],[1,\\\": {\\\\n        show,\\\\n        track,\\\\n      },\\\\n    });\\\\n    \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"render\\\"],[13],[1,\\\"(hbs\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"`<Player/>`\\\"],[13],[1,\\\");\\\\n\\\\n    assert.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"dom\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'[data-test-element=\\\\\\\"fastforward-button\\\\\\\"]'\\\"],[13],[1,\\\").\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"isDisabled\\\"],[13],[1,\\\"();\\\\n    assert.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"dom\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'[data-test-element=\\\\\\\"rewind-button\\\\\\\"]'\\\"],[13],[1,\\\").\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"isDisabled\\\"],[13],[1,\\\"();\\\\n    assert.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"dom\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'[data-test-element=\\\\\\\"play-pause-button\\\\\\\"]'\\\"],[13],[1,\\\").\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"exists\\\"],[13],[1,\\\"();\\\\n  });\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[]]\",\n    \"moduleName\": \"docs/templates/docs/testing.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/docs/upgrading\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"docs-md\">\n        <h1 id=\"upgrading\" class=\"docs-md__h1\">Upgrading</h1>\n      \n        <h2 id=\"upgrading-to-6-0\" class=\"docs-md__h2\"><a href=\"#upgrading-to-6-0\" class=\"heading-anchor\">Upgrading to 6.0</a></h2>\n      <p>6.0 inverts the core model. 5.x jumped through hoops to fake a stable <strong><code>Sound</code></strong> (see <a href=\"/docs/playing-sounds\"  class=\"docs-md__a\">Playing Sounds</a>). Now it's real and reports <code>isLoading</code>, <code>errors</code>, and the <code>connection</code> that resolved it. This makes connection swapping (like, to the new Airplay and Chromecast connections) possible.</p>\n  <p><strong>Changes from 5.x -> 6.0</strong></p>\n  \n        <h3 id=\"1-findsound-is-synchronous-and-always-returns-a-sound\" class=\"docs-md__h3\"><a href=\"#1-findsound-is-synchronous-and-always-returns-a-sound\" class=\"heading-anchor\">1. <code>findSound</code> is synchronous and always returns a <code>Sound</code></a></h3>\n      <p>It find-or-creates and returns immediately, so drop any <code>await</code> in front of it. The returned <code>Sound</code> may still be pending, so replace \"is there a sound yet?\" presence checks with <code>isResolved</code> (a connection has resolved) or <code>isLoaded</code> (it's ready to play):</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE: undefined until the audio loaded</span>\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(url)) { <span class=\"hljs-comment\">/* … *\\/</span> }\n  \n  <span class=\"hljs-comment\">// AFTER: the Sound always exists, so check whether a connection resolved</span>\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">findSound</span>(url)?.<span class=\"hljs-property\">isResolved</span>) { <span class=\"hljs-comment\">/* … *\\/</span> }\n  </code></pre>\n  <p>The Sound survives connection swaps and reports isLoading/isPending/isBlocked so listeners you attach to it before the sound is actually loaded stay valid now. When you genuinely need the underlying connection (and I don't know why you would) it's at <code>sound.connection</code>.</p>\n  \n        <h3 id=\"2-match-sounds-by-hasurl-not-url-\" class=\"docs-md__h3\"><a href=\"#2-match-sounds-by-hasurl-not-url-\" class=\"heading-anchor\">2. Match sounds by <code>hasUrl</code>, not <code>url ===</code></a></h3>\n      <p>A resolved <code>Sound</code> reports its connection's <em>normalized</em> URL, which won't <code>===</code> the raw identifier you handed in. Anywhere you compared event payloads against an identifier, switch to <code>hasUrl</code>:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-loaded&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-keyword\">if</span> (sound.<span class=\"hljs-property\">url</span> === <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">identifier</span>) { <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">attach</span>(sound); }\n  });\n  \n  <span class=\"hljs-comment\">// AFTER</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;audio-loaded&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-keyword\">if</span> (sound.<span class=\"hljs-property\">hasUrl</span>?.(<span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">identifier</span>)) { <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-title function_\">attach</span>(sound); }\n  });\n  </code></pre>\n  \n        <h3 id=\"3-guard-for-a-null-currentsound\" class=\"docs-md__h3\"><a href=\"#3-guard-for-a-null-currentsound\" class=\"heading-anchor\">3. Guard for a <code>null</code> currentSound</a></h3>\n      <p><code>stereo.currentSound</code> can now clear to <code>null</code> (for example when casting stops), so null-check it in your <code>current-sound-changed</code> handlers:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;current-sound-changed&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-keyword\">if</span> (!sound) { <span class=\"hljs-keyword\">return</span>; }\n    <span class=\"hljs-comment\">// …</span>\n  });\n  </code></pre>\n  \n        <h3 id=\"4-load-play-resolve-to-the-sound-not-the-connection\" class=\"docs-md__h3\"><a href=\"#4-load-play-resolve-to-the-sound-not-the-connection\" class=\"heading-anchor\">4. <code>load</code>/<code>play</code> resolve to the <code>Sound</code>, not the connection</a></h3>\n      <p><code>sound</code> means the same thing everywhere now: the identity-stable container. It's what events hand you, what <code>currentSound</code> holds, and what <code>load</code>/<code>play</code> resolve to. The connection is still available alongside it when you genuinely need it:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE: `sound` was the connection, and you were locked to it</span>\n  <span class=\"hljs-keyword\">let</span> { sound } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  \n  <span class=\"hljs-comment\">// AFTER: `sound` is the container, and the resolved connection is a sibling key. you probably don&#x27;t need the connection</span>\n  <span class=\"hljs-keyword\">let</span> { sound, connection } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  </code></pre>\n  <p>A <code>Sound</code> can now change the connection underneath it (see <a href=\"/docs/playing-sounds\"  class=\"docs-md__a\">Playing Sounds</a>), which is what makes failover and casting possible. </p>\n  \n        <h3 id=\"5-renamed-and-relocated\" class=\"docs-md__h3\"><a href=\"#5-renamed-and-relocated\" class=\"heading-anchor\">5. Renamed and relocated</a></h3>\n      <p>The vocabulary has been shifted a little in an attempt to make this more intuitive! A <strong><code>Sound</code></strong> is the identity-stable container you hold, a <strong>connection</strong> is the disposable implementation it plays through. The individual cache objects hanging off the stereo service are no longer needed, as all the relevant data lives on the <code>Sound</code>.</p>\n  <table class=\"docs-table-auto\">\n  <thead>\n  <tr class=\"docs-table-row\">\n  <th class=\"docs-border docs-px-4 docs-py-2\">Before</th>\n  <th class=\"docs-border docs-px-4 docs-py-2\">After</th>\n  </tr>\n  </thead>\n  <tbody><tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findLoadedSound(url)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(url)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.loadedSounds</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.sounds.filter((s) =&gt; s.isLoaded)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.loadedUrls</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.sounds.filter((s) =&gt; s.isLoaded).map((s) =&gt; s.url)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.cachedErrors</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.sounds.filter((s) =&gt; s.isErrored)</code>, then read <code>sound.errors</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.errorCache.find(url)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(url).errors</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>sound.urlsAreEqual(a, b)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>sound.hasUrl(identifier)</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>failure.erroredSound</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>failure.erroredConnection</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>strategy.createSound()</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>strategy.createConnection()</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.metadataCache.store(url, data)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(url).metadata = data</code></td>\n  </tr>\n  <tr class=\"docs-table-row\">\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.urlCache.resolve(identifier)</code></td>\n  <td class=\"docs-border docs-px-4 docs-py-2\"><code>stereo.findSound(identifier).resolveUrls()</code></td>\n  </tr>\n  </tbody></table>\n  <p>Metadata reads are unchanged: <code>sound.metadata</code>, <code>stereo.currentMetadata</code>, <code>&#123;&#123;sound-metadata identifier&#125;&#125;</code>.</p>\n  <p>Some of them return something different than they used to:</p>\n  \n          <ul class=\"docs-list-disc\"><li><code>sound.hasUrl</code> answers while a <code>Sound</code> is still pending, falling back to the identifier it was built with. It used to return <code>undefined</code>.</li>\n  <li><code>stereo.sounds</code> replaces the old cache-backed lists. It holds every <code>Sound</code> a load was attempted on, including pending and errored ones so filter it for the subset you want.</li>\n  <li><code>sound.url</code> can change over the life of the sound. A <code>Sound</code> outlives the connection under it, so failing over to another url or handing playback to a cast device moves <code>url</code> with it. In 5.x the sound was the connection, so its url never moved.</li>\n  <li><code>sound.url</code> is <code>undefined</code> until a <code>Sound</code> built from a promise resolves, because no url is known yet. 5.x had no pending sound to ask.</li>\n  </ul>\n        <p><code>stereo.play()</code> and <code>stereo.load()</code> with no url now reject instead of failing deeper in (sometimes silently)</p>\n  \n        <h3 id=\"casting-is-new-and-opt-in\" class=\"docs-md__h3\"><a href=\"#casting-is-new-and-opt-in\" class=\"heading-anchor\">Casting is new, and opt-in</a></h3>\n      <p>Nothing above is required to get it, and nothing breaks if you ignore it. If you do want AirPlay or Chromecast, the only thing your app has to supply is a <code>sound.castUrl</code>, a url the device can fetch on its own. See <a href=\"/docs/casting\"  class=\"docs-md__a\">Casting</a>.</p>\n  <hr class=\"docs-md__hr\">\n        <h2 id=\"coming-from-a-6-0-beta\" class=\"docs-md__h2\"><a href=\"#coming-from-a-6-0-beta\" class=\"heading-anchor\">Coming from a 6.0 beta</a></h2>\n      <p>If you tracked <code>6.0.0-beta.x</code>, everything above already applies to you. Two significant things changed between the last beta and 6.0 final.</p>\n  \n        <h3 id=\"entity-is-gone-sound-is-the-container\" class=\"docs-md__h3\"><a href=\"#entity-is-gone-sound-is-the-container\" class=\"heading-anchor\"><code>entity</code> is gone, <code>sound</code> is the container</a></h3>\n      <p>The betas resolved <code>{ sound, entity, failures }</code>, where <code>sound</code> was the connection and <code>entity</code> was the container. Trying to preserve the old API wasn't worth the vocab confusion. Naming is hard! <code>sound</code> is now the container everywhere, and the implementation rides alongside as <code>connection</code>:</p>\n  <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">// BEFORE (beta)</span>\n  <span class=\"hljs-keyword\">let</span> { sound, entity } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  entity.<span class=\"hljs-title function_\">play</span>(); <span class=\"hljs-comment\">// the durable one</span>\n  sound.<span class=\"hljs-title function_\">play</span>(); <span class=\"hljs-comment\">// the disposable one</span>\n  \n  <span class=\"hljs-comment\">// AFTER</span>\n  <span class=\"hljs-keyword\">let</span> { sound, connection } = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">play</span>(url);\n  sound.<span class=\"hljs-title function_\">play</span>(); <span class=\"hljs-comment\">// the durable one</span>\n  </code></pre>\n  <p>Anywhere you reached for <code>.entity</code> to get the real object, that's just <code>.sound</code> now.</p>\n  \n        <h3 id=\"sound-value-is-sound-connection\" class=\"docs-md__h3\"><a href=\"#sound-value-is-sound-connection\" class=\"heading-anchor\"><code>sound.value</code> is <code>sound.connection</code></a></h3>\n      <p>Same rename, on the <code>Sound</code> itself. <code>value</code> was a holdover from the 5.x sound-proxy architecture, and .connection makes more sense in the 6.x world.</p>\n  <hr class=\"docs-md__hr\">\n        <h2 id=\"upgrading-from-hifi\" class=\"docs-md__h2\"><a href=\"#upgrading-from-hifi\" class=\"heading-anchor\">Upgrading from Hifi</a></h2>\n      <p>If you're coming from <a href=\"http://github.com/nypublicradio/ember-hifi\"  class=\"docs-md__a\">ember-hifi</a>, welcome!</p>\n  \n        <h3 id=\"why-upgrade-\" class=\"docs-md__h3\"><a href=\"#why-upgrade-\" class=\"heading-anchor\">Why upgrade?</a></h3>\n      \n          <ol class=\"docs-list-decimal\"><li>Handy template helpers make things ridiculously simpler!</li>\n  <li>Stereo uses <a href=\"http://ember-concurrency.com\"  class=\"docs-md__a\">ember-concurrency</a> tasks instead of the home rolled mixture of rat-nested promises I devised back in 2015 when that sort of thing was in vogue. If you're using <code>ember-concurrency</code> tasks in your app you can change your <code>play</code> and <code>load</code> calls to use the task versions, at <code>this.stereo.playTask</code> and <code>this.stereo.loadTask</code></li>\n  <li>Improved tooling to help deal with autoplay problems. An <code>audio-blocked</code> event was added, as well as an <code>autoplay-allowed</code> helper and a <code>sound-is-blocked</code> helper to help deal with autoplay issues. (<a href=\"https://github.com/nypublicradio/ember-hifi/issues/44\"  class=\"docs-md__a\">fixes hifi issue #44</a>)</li>\n  <li>Better defaults. Volume is now by default at 100, aka system volume. You can set <code>initialVolume: 50</code> in the environment configuration if you want to keep it at its former level.</li>\n  <li>Better docs, better tests, better future! (<a href=\"https://github.com/nypublicradio/ember-hifi/issues/25\"  class=\"docs-md__a\">fixes hifi issue #25</a>)</li>\n  </ol>\n        \n        <h3 id=\"upgrade-your-existing-app\" class=\"docs-md__h3\"><a href=\"#upgrade-your-existing-app\" class=\"heading-anchor\">Upgrade your existing app</a></h3>\n      \n          <ol class=\"docs-list-decimal\"><li>Find anything that says \"hifi\", \"ember-hifi\", or \"emberHifi\" and rename it \"stereo\", \"ember-stereo\", or \"emberStereo\", respectively. The hifi service is probably the one you'll have the most of, and maybe your environment config.</li>\n  <li>Any event handlers that were expecting <code>(sound)</code> should now have a new signature and need to be changed to <code>({sound})</code>\n  e.g.</li>\n  </ol>\n        <pre class=\"docs-md__code\"><code class=\"language-js\"><span class=\"hljs-comment\">//BEFORE</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">hifi</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;event-name&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">sound</span>) =&gt;</span> {\n    <span class=\"hljs-comment\">/* handler *\\/</span>\n  });\n  \n  <span class=\"hljs-comment\">//AFTER</span>\n  <span class=\"hljs-variable language_\">this</span>.<span class=\"hljs-property\">stereo</span>.<span class=\"hljs-title function_\">on</span>(<span class=\"hljs-string\">&#x27;event-name&#x27;</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">{ sound }</span>) =&gt;</span> {\n    <span class=\"hljs-comment\">/* handler *\\/</span>\n  });\n  </code></pre>\n  \n          <ol class=\"docs-list-decimal\"><li>Whatever tricks you had implement to do in order to catch that uncatchable 'All Promises Failed' error in <code>hifi</code> you can remove them. <code>play</code> and <code>load</code> requests will now fail sanely. And if you don't want them to throw errors at all, instead returning the error as part of the response, you can pass <code>silenceErrors: true</code> as an option. (fixes hifi issue <a href=\"https://github.com/nypublicradio/ember-hifi/issues/86\"  class=\"docs-md__a\">#86</a> and <a href=\"https://github.com/nypublicradio/ember-hifi/issues/16\"  class=\"docs-md__a\">#16</a>)</li>\n  <li><code>this.stereo.connections</code> has been renamed to <code>this.stereo.connectionNames</code>. <code>this.stereo.connections</code> now returns the actual connection objects.</li>\n  </ol>\n        </div>\n  */\n  {\n    \"id\": \"egdV/vJT\",\n    \"block\": \"[[[10,0],[14,0,\\\"docs-md\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[14,1,\\\"upgrading\\\"],[14,0,\\\"docs-md__h1\\\"],[12],[1,\\\"Upgrading\\\"],[13],[1,\\\"\\\\n    \\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"upgrading-to-6-0\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#upgrading-to-6-0\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Upgrading to 6.0\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"6.0 inverts the core model. 5.x jumped through hoops to fake a stable \\\"],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[1,\\\" (see \\\"],[10,3],[14,6,\\\"/docs/playing-sounds\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\"). Now it's real and reports \\\"],[10,\\\"code\\\"],[12],[1,\\\"isLoading\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"errors\\\"],[13],[1,\\\", and the \\\"],[10,\\\"code\\\"],[12],[1,\\\"connection\\\"],[13],[1,\\\" that resolved it. This makes connection swapping (like, to the new Airplay and Chromecast connections) possible.\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[10,\\\"strong\\\"],[12],[1,\\\"Changes from 5.x -> 6.0\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"1-findsound-is-synchronous-and-always-returns-a-sound\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#1-findsound-is-synchronous-and-always-returns-a-sound\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"1. \\\"],[10,\\\"code\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\" is synchronous and always returns a \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"It find-or-creates and returns immediately, so drop any \\\"],[10,\\\"code\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" in front of it. The returned \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" may still be pending, so replace \\\\\\\"is there a sound yet?\\\\\\\" presence checks with \\\"],[10,\\\"code\\\"],[12],[1,\\\"isResolved\\\"],[13],[1,\\\" (a connection has resolved) or \\\"],[10,\\\"code\\\"],[12],[1,\\\"isLoaded\\\"],[13],[1,\\\" (it's ready to play):\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE: undefined until the audio loaded\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(url)) { \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* … */\\\"],[13],[1,\\\" }\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER: the Sound always exists, so check whether a connection resolved\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"findSound\\\"],[13],[1,\\\"(url)?.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"isResolved\\\"],[13],[1,\\\") { \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* … */\\\"],[13],[1,\\\" }\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"The Sound survives connection swaps and reports isLoading/isPending/isBlocked so listeners you attach to it before the sound is actually loaded stay valid now. When you genuinely need the underlying connection (and I don't know why you would) it's at \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.connection\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"2-match-sounds-by-hasurl-not-url-\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#2-match-sounds-by-hasurl-not-url-\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"2. Match sounds by \\\"],[10,\\\"code\\\"],[12],[1,\\\"hasUrl\\\"],[13],[1,\\\", not \\\"],[10,\\\"code\\\"],[12],[1,\\\"url ===\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"A resolved \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" reports its connection's \\\"],[10,\\\"em\\\"],[12],[1,\\\"normalized\\\"],[13],[1,\\\" URL, which won't \\\"],[10,\\\"code\\\"],[12],[1,\\\"===\\\"],[13],[1,\\\" the raw identifier you handed in. Anywhere you compared event payloads against an identifier, switch to \\\"],[10,\\\"code\\\"],[12],[1,\\\"hasUrl\\\"],[13],[1,\\\":\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-loaded'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\" === \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"identifier\\\"],[13],[1,\\\") { \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"attach\\\"],[13],[1,\\\"(sound); }\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'audio-loaded'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (sound.\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"hasUrl\\\"],[13],[1,\\\"?.(\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"identifier\\\"],[13],[1,\\\")) { \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"attach\\\"],[13],[1,\\\"(sound); }\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"3-guard-for-a-null-currentsound\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#3-guard-for-a-null-currentsound\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"3. Guard for a \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\" currentSound\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.currentSound\\\"],[13],[1,\\\" can now clear to \\\"],[10,\\\"code\\\"],[12],[1,\\\"null\\\"],[13],[1,\\\" (for example when casting stops), so null-check it in your \\\"],[10,\\\"code\\\"],[12],[1,\\\"current-sound-changed\\\"],[13],[1,\\\" handlers:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'current-sound-changed'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"if\\\"],[13],[1,\\\" (!sound) { \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"return\\\"],[13],[1,\\\"; }\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// …\\\"],[13],[1,\\\"\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"4-load-play-resolve-to-the-sound-not-the-connection\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#4-load-play-resolve-to-the-sound-not-the-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"4. \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\"/\\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" resolve to the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\", not the connection\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" means the same thing everywhere now: the identity-stable container. It's what events hand you, what \\\"],[10,\\\"code\\\"],[12],[1,\\\"currentSound\\\"],[13],[1,\\\" holds, and what \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\"/\\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" resolve to. The connection is still available alongside it when you genuinely need it:\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE: `sound` was the connection, and you were locked to it\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER: `sound` is the container, and the resolved connection is a sibling key. you probably don't need the connection\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound, connection } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"A \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" can now change the connection underneath it (see \\\"],[10,3],[14,6,\\\"/docs/playing-sounds\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Playing Sounds\\\"],[13],[1,\\\"), which is what makes failover and casting possible. \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"5-renamed-and-relocated\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#5-renamed-and-relocated\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"5. Renamed and relocated\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The vocabulary has been shifted a little in an attempt to make this more intuitive! A \\\"],[10,\\\"strong\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[13],[1,\\\" is the identity-stable container you hold, a \\\"],[10,\\\"strong\\\"],[12],[1,\\\"connection\\\"],[13],[1,\\\" is the disposable implementation it plays through. The individual cache objects hanging off the stereo service are no longer needed, as all the relevant data lives on the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"table\\\"],[14,0,\\\"docs-table-auto\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"Before\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"th\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[1,\\\"After\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tbody\\\"],[12],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findLoadedSound(url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.loadedSounds\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isLoaded)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.loadedUrls\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isLoaded).map((s) => s.url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.cachedErrors\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds.filter((s) => s.isErrored)\\\"],[13],[1,\\\", then read \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.errors\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.errorCache.find(url)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url).errors\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.urlsAreEqual(a, b)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.hasUrl(identifier)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"failure.erroredSound\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"failure.erroredConnection\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"strategy.createSound()\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"strategy.createConnection()\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.metadataCache.store(url, data)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(url).metadata = data\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"tr\\\"],[14,0,\\\"docs-table-row\\\"],[12],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.urlCache.resolve(identifier)\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"td\\\"],[14,0,\\\"docs-border docs-px-4 docs-py-2\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.findSound(identifier).resolveUrls()\\\"],[13],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Metadata reads are unchanged: \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.metadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.currentMetadata\\\"],[13],[1,\\\", \\\"],[10,\\\"code\\\"],[12],[1,\\\"{{sound-metadata identifier}}\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Some of them return something different than they used to:\\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"docs-list-disc\\\"],[12],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.hasUrl\\\"],[13],[1,\\\" answers while a \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" is still pending, falling back to the identifier it was built with. It used to return \\\"],[10,\\\"code\\\"],[12],[1,\\\"undefined\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.sounds\\\"],[13],[1,\\\" replaces the old cache-backed lists. It holds every \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" a load was attempted on, including pending and errored ones so filter it for the subset you want.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.url\\\"],[13],[1,\\\" can change over the life of the sound. A \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" outlives the connection under it, so failing over to another url or handing playback to a cast device moves \\\"],[10,\\\"code\\\"],[12],[1,\\\"url\\\"],[13],[1,\\\" with it. In 5.x the sound was the connection, so its url never moved.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.url\\\"],[13],[1,\\\" is \\\"],[10,\\\"code\\\"],[12],[1,\\\"undefined\\\"],[13],[1,\\\" until a \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" built from a promise resolves, because no url is known yet. 5.x had no pending sound to ask.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[10,\\\"code\\\"],[12],[1,\\\"stereo.play()\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"stereo.load()\\\"],[13],[1,\\\" with no url now reject instead of failing deeper in (sometimes silently)\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"casting-is-new-and-opt-in\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#casting-is-new-and-opt-in\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Casting is new, and opt-in\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Nothing above is required to get it, and nothing breaks if you ignore it. If you do want AirPlay or Chromecast, the only thing your app has to supply is a \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.castUrl\\\"],[13],[1,\\\", a url the device can fetch on its own. See \\\"],[10,3],[14,6,\\\"/docs/casting\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"Casting\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"hr\\\"],[14,0,\\\"docs-md__hr\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"coming-from-a-6-0-beta\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#coming-from-a-6-0-beta\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Coming from a 6.0 beta\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"If you tracked \\\"],[10,\\\"code\\\"],[12],[1,\\\"6.0.0-beta.x\\\"],[13],[1,\\\", everything above already applies to you. Two significant things changed between the last beta and 6.0 final.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"entity-is-gone-sound-is-the-container\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#entity-is-gone-sound-is-the-container\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"entity\\\"],[13],[1,\\\" is gone, \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" is the container\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"The betas resolved \\\"],[10,\\\"code\\\"],[12],[1,\\\"{ sound, entity, failures }\\\"],[13],[1,\\\", where \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" was the connection and \\\"],[10,\\\"code\\\"],[12],[1,\\\"entity\\\"],[13],[1,\\\" was the container. Trying to preserve the old API wasn't worth the vocab confusion. Naming is hard! \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\" is now the container everywhere, and the implementation rides alongside as \\\"],[10,\\\"code\\\"],[12],[1,\\\"connection\\\"],[13],[1,\\\":\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// BEFORE (beta)\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound, entity } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\nentity.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(); \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// the durable one\\\"],[13],[1,\\\"\\\\nsound.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(); \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// the disposable one\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// AFTER\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"let\\\"],[13],[1,\\\" { sound, connection } = \\\"],[10,1],[14,0,\\\"hljs-keyword\\\"],[12],[1,\\\"await\\\"],[13],[1,\\\" \\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(url);\\\\nsound.\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\"(); \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"// the durable one\\\"],[13],[1,\\\"\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,2],[12],[1,\\\"Anywhere you reached for \\\"],[10,\\\"code\\\"],[12],[1,\\\".entity\\\"],[13],[1,\\\" to get the real object, that's just \\\"],[10,\\\"code\\\"],[12],[1,\\\".sound\\\"],[13],[1,\\\" now.\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"sound-value-is-sound-connection\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#sound-value-is-sound-connection\\\"],[14,0,\\\"heading-anchor\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"sound.value\\\"],[13],[1,\\\" is \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound.connection\\\"],[13],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"Same rename, on the \\\"],[10,\\\"code\\\"],[12],[1,\\\"Sound\\\"],[13],[1,\\\" itself. \\\"],[10,\\\"code\\\"],[12],[1,\\\"value\\\"],[13],[1,\\\" was a holdover from the 5.x sound-proxy architecture, and .connection makes more sense in the 6.x world.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"hr\\\"],[14,0,\\\"docs-md__hr\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"upgrading-from-hifi\\\"],[14,0,\\\"docs-md__h2\\\"],[12],[10,3],[14,6,\\\"#upgrading-from-hifi\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Upgrading from Hifi\\\"],[13],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"If you're coming from \\\"],[10,3],[14,6,\\\"http://github.com/nypublicradio/ember-hifi\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"ember-hifi\\\"],[13],[1,\\\", welcome!\\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"why-upgrade-\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#why-upgrade-\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Why upgrade?\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ol\\\"],[14,0,\\\"docs-list-decimal\\\"],[12],[10,\\\"li\\\"],[12],[1,\\\"Handy template helpers make things ridiculously simpler!\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Stereo uses \\\"],[10,3],[14,6,\\\"http://ember-concurrency.com\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"ember-concurrency\\\"],[13],[1,\\\" tasks instead of the home rolled mixture of rat-nested promises I devised back in 2015 when that sort of thing was in vogue. If you're using \\\"],[10,\\\"code\\\"],[12],[1,\\\"ember-concurrency\\\"],[13],[1,\\\" tasks in your app you can change your \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" calls to use the task versions, at \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.playTask\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.loadTask\\\"],[13],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Improved tooling to help deal with autoplay problems. An \\\"],[10,\\\"code\\\"],[12],[1,\\\"audio-blocked\\\"],[13],[1,\\\" event was added, as well as an \\\"],[10,\\\"code\\\"],[12],[1,\\\"autoplay-allowed\\\"],[13],[1,\\\" helper and a \\\"],[10,\\\"code\\\"],[12],[1,\\\"sound-is-blocked\\\"],[13],[1,\\\" helper to help deal with autoplay issues. (\\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/44\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"fixes hifi issue #44\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Better defaults. Volume is now by default at 100, aka system volume. You can set \\\"],[10,\\\"code\\\"],[12],[1,\\\"initialVolume: 50\\\"],[13],[1,\\\" in the environment configuration if you want to keep it at its former level.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Better docs, better tests, better future! (\\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/25\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"fixes hifi issue #25\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\\n      \\\"],[10,\\\"h3\\\"],[14,1,\\\"upgrade-your-existing-app\\\"],[14,0,\\\"docs-md__h3\\\"],[12],[10,3],[14,6,\\\"#upgrade-your-existing-app\\\"],[14,0,\\\"heading-anchor\\\"],[12],[1,\\\"Upgrade your existing app\\\"],[13],[13],[1,\\\"\\\\n    \\\\n        \\\"],[10,\\\"ol\\\"],[14,0,\\\"docs-list-decimal\\\"],[12],[10,\\\"li\\\"],[12],[1,\\\"Find anything that says \\\\\\\"hifi\\\\\\\", \\\\\\\"ember-hifi\\\\\\\", or \\\\\\\"emberHifi\\\\\\\" and rename it \\\\\\\"stereo\\\\\\\", \\\\\\\"ember-stereo\\\\\\\", or \\\\\\\"emberStereo\\\\\\\", respectively. The hifi service is probably the one you'll have the most of, and maybe your environment config.\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[1,\\\"Any event handlers that were expecting \\\"],[10,\\\"code\\\"],[12],[1,\\\"(sound)\\\"],[13],[1,\\\" should now have a new signature and need to be changed to \\\"],[10,\\\"code\\\"],[12],[1,\\\"({sound})\\\"],[13],[1,\\\"\\\\ne.g.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"pre\\\"],[14,0,\\\"docs-md__code\\\"],[12],[10,\\\"code\\\"],[14,0,\\\"language-js\\\"],[12],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"//BEFORE\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"hifi\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'event-name'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"sound\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* handler */\\\"],[13],[1,\\\"\\\\n});\\\\n\\\\n\\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"//AFTER\\\"],[13],[1,\\\"\\\\n\\\"],[10,1],[14,0,\\\"hljs-variable language_\\\"],[12],[1,\\\"this\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-property\\\"],[12],[1,\\\"stereo\\\"],[13],[1,\\\".\\\"],[10,1],[14,0,\\\"hljs-title function_\\\"],[12],[1,\\\"on\\\"],[13],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-string\\\"],[12],[1,\\\"'event-name'\\\"],[13],[1,\\\", \\\"],[10,1],[14,0,\\\"hljs-function\\\"],[12],[1,\\\"(\\\"],[10,1],[14,0,\\\"hljs-params\\\"],[12],[1,\\\"{ sound }\\\"],[13],[1,\\\") =>\\\"],[13],[1,\\\" {\\\\n  \\\"],[10,1],[14,0,\\\"hljs-comment\\\"],[12],[1,\\\"/* handler */\\\"],[13],[1,\\\"\\\\n});\\\\n\\\"],[13],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"ol\\\"],[14,0,\\\"docs-list-decimal\\\"],[12],[10,\\\"li\\\"],[12],[1,\\\"Whatever tricks you had implement to do in order to catch that uncatchable 'All Promises Failed' error in \\\"],[10,\\\"code\\\"],[12],[1,\\\"hifi\\\"],[13],[1,\\\" you can remove them. \\\"],[10,\\\"code\\\"],[12],[1,\\\"play\\\"],[13],[1,\\\" and \\\"],[10,\\\"code\\\"],[12],[1,\\\"load\\\"],[13],[1,\\\" requests will now fail sanely. And if you don't want them to throw errors at all, instead returning the error as part of the response, you can pass \\\"],[10,\\\"code\\\"],[12],[1,\\\"silenceErrors: true\\\"],[13],[1,\\\" as an option. (fixes hifi issue \\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/86\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"#86\\\"],[13],[1,\\\" and \\\"],[10,3],[14,6,\\\"https://github.com/nypublicradio/ember-hifi/issues/16\\\"],[14,0,\\\"docs-md__a\\\"],[12],[1,\\\"#16\\\"],[13],[1,\\\")\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"li\\\"],[12],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.connections\\\"],[13],[1,\\\" has been renamed to \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.connectionNames\\\"],[13],[1,\\\". \\\"],[10,\\\"code\\\"],[12],[1,\\\"this.stereo.connections\\\"],[13],[1,\\\" now returns the actual connection objects.\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n      \\\"],[13]],[],false,[]]\",\n    \"moduleName\": \"docs/templates/docs/upgrading.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader as |header|>\n    <header.link @route='diagnostic'>\n      Diagnostic\n    </header.link>\n  </DocsHeader>\n  <DocsHero\n    @logo='ember'\n    @slimHeading='Ember Stereo'\n    @byline='Ember stereo makes it easy to play audio in your modern ember app'\n  />\n  \n  <div\n    class='docs-px-4 md:docs-px-8 lg:docs-px-20 docs-mx-auto md:docs-mx-0 docs-mt-6 md:docs-mt-12 md:docs-min-w-0 md:docs-flex-1 ember-view'\n  >\n    <Docs::AttentionGetter />\n  </div>\n  */\n  {\n    \"id\": \"Q9Nr2MGH\",\n    \"block\": \"[[[8,[39,0],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"link\\\"]],null,[[\\\"@route\\\"],[\\\"diagnostic\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    Diagnostic\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[1]]]]],[1,\\\"\\\\n\\\"],[8,[39,1],null,[[\\\"@logo\\\",\\\"@slimHeading\\\",\\\"@byline\\\"],[\\\"ember\\\",\\\"Ember Stereo\\\",\\\"Ember stereo makes it easy to play audio in your modern ember app\\\"]],null],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"docs-px-4 md:docs-px-8 lg:docs-px-20 docs-mx-auto md:docs-mx-0 docs-mt-6 md:docs-mt-12 md:docs-min-w-0 md:docs-flex-1 ember-view\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[39,2],null,null,null],[1,\\\"\\\\n\\\"],[13]],[\\\"header\\\"],false,[\\\"docs-header\\\",\\\"docs-hero\\\",\\\"docs/attention-getter\\\"]]\",\n    \"moduleName\": \"docs/templates/index.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/templates/not-found\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n  var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <DocsHeader />\n  \n  <DocsViewer as |viewer|>\n    <viewer.nav />\n  \n    <viewer.main>\n      <div class='docs-container'>\n        <h1>Not found</h1>\n        <p>This page doesn\"t exist. <LinkTo @route='index'>Head home?</LinkTo></p>\n      </div>\n    </viewer.main>\n  </DocsViewer>\n  */\n  {\n    \"id\": \"yutLdU3M\",\n    \"block\": \"[[[8,[39,0],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[8,[39,1],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"nav\\\"]],null,null,null],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,1,[\\\"main\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"docs-container\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h1\\\"],[12],[1,\\\"Not found\\\"],[13],[1,\\\"\\\\n      \\\"],[10,2],[12],[1,\\\"This page doesn\\\\\\\"t exist. \\\"],[8,[39,2],null,[[\\\"@route\\\"],[\\\"index\\\"]],[[\\\"default\\\"],[[[[1,\\\"Head home?\\\"]],[]]]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[1]]]]]],[\\\"viewer\\\"],false,[\\\"docs-header\\\",\\\"docs-viewer\\\",\\\"link-to\\\"]]\",\n    \"moduleName\": \"docs/templates/not-found.hbs\",\n    \"isStrictMode\": false\n  });\n});","define(\"docs/transforms/boolean\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _transform.BooleanTransform;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  (false && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the BooleanTransform. Use `export { BooleanTransform as default } from '@ember-data/serializer/transform';` in app/transforms/boolean.js instead\", false, {\n    id: 'ember-data:deprecate-legacy-imports',\n    for: 'ember-data',\n    until: '6.0',\n    since: {\n      enabled: '5.2',\n      available: '4.13'\n    }\n  }));\n});","define(\"docs/transforms/date\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _transform.DateTransform;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  (false && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the DateTransform. Use `export { DateTransform as default } from '@ember-data/serializer/transform';` in app/transforms/date.js instead\", false, {\n    id: 'ember-data:deprecate-legacy-imports',\n    for: 'ember-data',\n    until: '6.0',\n    since: {\n      enabled: '5.2',\n      available: '4.13'\n    }\n  }));\n});","define(\"docs/transforms/number\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _transform.NumberTransform;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  (false && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the NumberTransform. Use `export { NumberTransform as default } from '@ember-data/serializer/transform';` in app/transforms/number.js instead\", false, {\n    id: 'ember-data:deprecate-legacy-imports',\n    for: 'ember-data',\n    until: '6.0',\n    since: {\n      enabled: '5.2',\n      available: '4.13'\n    }\n  }));\n});","define(\"docs/transforms/string\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _transform.StringTransform;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n  (false && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the StringTransform. Use `export { StringTransform as default } from '@ember-data/serializer/transform';` in app/transforms/string.js instead\", false, {\n    id: 'ember-data:deprecate-legacy-imports',\n    for: 'ember-data',\n    until: '6.0',\n    since: {\n      enabled: '5.2',\n      available: '4.13'\n    }\n  }));\n});","define(\"docs/utils/parse-touch-data\", [\"exports\", \"ember-gesture-modifiers/utils/parse-touch-data\"], function (_exports, _parseTouchData) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"isHorizontal\", {\n    enumerable: true,\n    get: function () {\n      return _parseTouchData.isHorizontal;\n    }\n  });\n  Object.defineProperty(_exports, \"isVertical\", {\n    enumerable: true,\n    get: function () {\n      return _parseTouchData.isVertical;\n    }\n  });\n  Object.defineProperty(_exports, \"parseInitialTouchData\", {\n    enumerable: true,\n    get: function () {\n      return _parseTouchData.parseInitialTouchData;\n    }\n  });\n  Object.defineProperty(_exports, \"parseTouchData\", {\n    enumerable: true,\n    get: function () {\n      return _parseTouchData.parseTouchData;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"ember-gesture-modifiers/utils/parse-touch-data\"eaimeta@70e063a35619d71f\n});","define(\"docs/utils/test-sounds\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.WNYC_HLS_STREAM = _exports.WNYC_AAC_STREAM = _exports.WFMU_STREAM = _exports.THE_CURRENT_STREAM = _exports.STREAM_WITHOUT_EXTENSION = _exports.OGG_WITH_CORS = _exports.OGG_FILE = _exports.MP3_ON_DEMAND_2 = _exports.MP3_ON_DEMAND = _exports.KOOP_STREAM = _exports.KMART_SHOPPERS = _exports.KLKT_STREAM = _exports.KEXP_STREAM = _exports.INVALID_STREAM = _exports.HLS_FIXED_TEST = _exports.HLS_BIPBOP = void 0;\n  0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n  const WNYC_AAC_STREAM = _exports.WNYC_AAC_STREAM = {\n    title: 'WNYC Live Stream (aac)',\n    url: 'https://fm939.wnyc.org/wnycfm.aac'\n  };\n  const WNYC_HLS_STREAM = _exports.WNYC_HLS_STREAM = {\n    title: 'WNYC Live Stream (hls)',\n    url: 'https://hls-live.wnyc.org/wnycfm/playlist.m3u8'\n  };\n  const MP3_ON_DEMAND_2 = _exports.MP3_ON_DEMAND_2 = {\n    title: 'Brian Lehrer Show (mp3)',\n    url: 'https://audio.wnyc.org/bl/bl011421dpod.mp3'\n  };\n  const MP3_ON_DEMAND = _exports.MP3_ON_DEMAND = {\n    title: 'On The Media (mp3)',\n    url: 'https://www.podtrac.com/pts/redirect.mp3/audio.wnyc.org/otm/otm04212017pod.mp3'\n  };\n  const STREAM_WITHOUT_EXTENSION = _exports.STREAM_WITHOUT_EXTENSION = {\n    title: 'WQXR Live Stream (no mime type)',\n    url: 'https://stream.wqxr.org/wqxr'\n  };\n  const THE_CURRENT_STREAM = _exports.THE_CURRENT_STREAM = {\n    title: 'The Current Live Stream (aac)',\n    url: 'https://current.stream.publicradio.org/current.aac'\n  };\n  const KOOP_STREAM = _exports.KOOP_STREAM = {\n    title: 'KOOP Live Stream (aac)',\n    url: 'https://streaming.koop.org/stream.aac'\n  };\n  const INVALID_STREAM = _exports.INVALID_STREAM = {\n    title: 'Invalid Stream',\n    url: 'https://streaming.koop.org/streamz.mp3'\n  };\n  const OGG_FILE = _exports.OGG_FILE = {\n    title: 'Test Sound (ogg)',\n    url: 'https://upload.wikimedia.org/wikipedia/commons/c/c8/Example.ogg'\n  };\n  const OGG_WITH_CORS = _exports.OGG_WITH_CORS = {\n    title: 'Test Sound 2 (ogg)',\n    url: 'https://filesamples.com/samples/audio/ogg/sample4.ogg'\n  };\n  const KEXP_STREAM = _exports.KEXP_STREAM = {\n    title: 'KEXP (aac)',\n    url: 'https://kexp-aacplus-64.streamguys1.com/kexp64.aac'\n  };\n  const KLKT_STREAM = _exports.KLKT_STREAM = {\n    title: 'KLKT Live Stream (mp3)',\n    url: 'https://klkt.broadcasttool.stream/play'\n  };\n  const WFMU_STREAM = _exports.WFMU_STREAM = {\n    title: 'WFMU (mp3, no extension)',\n    url: 'https://stream0.wfmu.org/freeform-128k'\n  };\n  const HLS_FIXED_TEST = _exports.HLS_FIXED_TEST = {\n    title: 'HLS Fixed Test',\n    url: 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8'\n  };\n  const HLS_BIPBOP = _exports.HLS_BIPBOP = {\n    title: 'Apple BipBop (hls)',\n    url: 'https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8'\n  };\n  const KMART_SHOPPERS = _exports.KMART_SHOPPERS = {\n    title: 'Attention K-Mart Shoppers',\n    url: 'https://archive.org/download/KmartOctober1989/Kmart%20October%201989.ogg'\n  };\n  let testSounds = [KEXP_STREAM, KOOP_STREAM, THE_CURRENT_STREAM, OGG_WITH_CORS, KMART_SHOPPERS, OGG_FILE, KLKT_STREAM, WNYC_HLS_STREAM, WNYC_AAC_STREAM, MP3_ON_DEMAND_2, MP3_ON_DEMAND, HLS_FIXED_TEST, HLS_BIPBOP, WFMU_STREAM, STREAM_WITHOUT_EXTENSION, INVALID_STREAM].map(sound => {\n    sound.urlObject = {\n      url: sound.url\n    };\n    sound.urlPromise = new Promise(resolve => {\n      setTimeout(() => {\n        console.log(`resolving promise: ${sound.url}`);\n        resolve({\n          url: `${sound.url}`\n        });\n      }, 2000);\n    });\n    return sound;\n  });\n  var _default = _exports.default = testSounds;\n});","define(\"docs/utils/touch-utils\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.findTouchById = findTouchById;\n  _exports.isSimulatedMouseEvent = isSimulatedMouseEvent;\n  0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n  // https://developer.mozilla.org/en-US/docs/Web/API/Touch_events#Finding_an_ongoing_touch\n  function findTouchById(touchList, identifier) {\n    for (let i = 0; i < touchList.length; i++) {\n      let touch = touchList.item(i);\n      if (touch.identifier === identifier) {\n        return touch;\n      }\n    }\n  }\n\n  // If defaults are not prevented, certain touch events on devices will also send mouse\n  // events.  For example, a quick 'touchstart', 'touchend' might also fire 'mousedown',\n  // 'mouseup', and 'clickevents'; Someplatforms leave telltale signs of these events, which\n  // is useful when we want to distinguish a touch from a click but can't guarantee that\n  // defaults on a touch event were prevented.\n\n  // NOTE:\n  // This won't detect simulated events from mobile safari, but in our setup those are intercepted and replaced\n  // with events from fastclick, which we can detect.\n  function isSimulatedMouseEvent(mouseEvent) {\n    if (mouseEvent) {\n      // https://developer.mozilla.org/en-US/docs/Web/API/InputDeviceCapabilities\n      const isChromeFakeEvent = mouseEvent.sourceCapabilities && mouseEvent.sourceCapabilities.firesTouchEvents === true;\n      // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/mozInputSource\n      const isMozFakeEvent = mouseEvent.mozInputSource === 5;\n      // https://github.com/ftlabs/fastclick/blob/3db9f899c25b7b2e1517dc5cc17494ec9094bc43/lib/fastclick.js#L304\n      const isFastClickFakeEvent = mouseEvent.forwardedTouchEvent === true;\n      return isChromeFakeEvent || isMozFakeEvent || isFastClickFakeEvent;\n    }\n    return false;\n  }\n});","define('docs/config/environment', [], function() {\n  if (typeof FastBoot !== 'undefined') {\nreturn FastBoot.config('docs');\n} else {\nvar prefix = 'docs';try {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n}\n});\n","\nif (typeof FastBoot === 'undefined') {\n  if (!runningTests) {\n    require('docs/app')['default'].create({\"name\":\"docs\",\"version\":\"0.0.0+c59e49bf\"});\n  }\n}\n\n"],"mappings":"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","ignoreList":[]}