Object.assign(window.search, {"doc_urls":["index.html#jellytau-documentation","requirements.html#requirements-specification","requirements.html#1-user-requirements","requirements.html#2-software-requirements","requirements.html#21-integration-requirements","requirements.html#22-jellyfin-api-requirements","requirements.html#23-development-requirements","requirements.html#3-traceability-matrix","requirements.html#user-requirements-to-software-requirements","requirements.html#4-test-traceability","requirements.html#unit-tests-to-software-requirements","requirements.html#integration-tests","requirements.html#5-technical-debt","requirements.html#open-items-carried-over-from-the-v060-codebase-audit","requirements.html#linux-keyring-integration-workaround","requirements.html#platform-playback-backend-parity-linux-vs-android","requirements.html#frontend-playback-code-duplication","traceability.html#code-traceability-matrix","traceability.html#summary","traceability.html#requirements-by-type","traceability.html#user-requirements-ur","traceability.html#integration-requirements-ir","traceability.html#development-requirements-dr","traceability.html#jellyfin-api-requirements-ja","traceability.html#detailed-mapping","traceability.html#ir-003","traceability.html#ir-004","traceability.html#ir-006","traceability.html#ir-008","traceability.html#ir-009","traceability.html#ir-010","traceability.html#ir-011","traceability.html#ir-012","traceability.html#ir-013","traceability.html#ir-014","traceability.html#ir-015","traceability.html#ir-016","traceability.html#ir-018","traceability.html#ir-019","traceability.html#ir-020","traceability.html#ir-021","traceability.html#ir-022","traceability.html#ir-023","traceability.html#ir-024","traceability.html#ir-025","traceability.html#ir-026","traceability.html#ir-027","traceability.html#ir-028","traceability.html#ir-030","traceability.html#ir-031","traceability.html#dr-001","traceability.html#dr-002","traceability.html#dr-003","traceability.html#dr-004","traceability.html#dr-005","traceability.html#dr-006","traceability.html#dr-007","traceability.html#dr-009","traceability.html#dr-010","traceability.html#dr-011","traceability.html#dr-012","traceability.html#dr-013","traceability.html#dr-014","traceability.html#dr-015","traceability.html#dr-016","traceability.html#dr-017","traceability.html#dr-018","traceability.html#dr-020","traceability.html#dr-021","traceability.html#dr-022","traceability.html#dr-023","traceability.html#dr-024","traceability.html#dr-025","traceability.html#dr-026","traceability.html#dr-027","traceability.html#dr-028","traceability.html#dr-029","traceability.html#dr-030","traceability.html#dr-032","traceability.html#dr-033","traceability.html#dr-034","traceability.html#dr-035","traceability.html#dr-036","traceability.html#dr-037","traceability.html#dr-038","traceability.html#dr-039","traceability.html#dr-040","traceability.html#dr-041","traceability.html#dr-042","traceability.html#dr-043","traceability.html#dr-044","traceability.html#dr-045","traceability.html#dr-047","traceability.html#dr-048","traceability.html#dr-049","traceability.html#dr-050","traceability.html#dr-051","traceability.html#dr-052","traceability.html#dr-053","traceability.html#dr-054","traceability.html#dr-055","traceability.html#dr-056","traceability.html#dr-057","traceability.html#dr-058","traceability.html#dr-059","traceability.html#dr-060","traceability.html#dr-061","traceability.html#dr-062","traceability.html#dr-063","traceability.html#dr-064","traceability.html#dr-065","traceability.html#dr-066","traceability.html#dr-067","traceability.html#dr-068","traceability.html#dr-069","traceability.html#dr-070","traceability.html#dr-074","traceability.html#dr-075","traceability.html#dr-076","traceability.html#dr-077","traceability.html#dr-078","traceability.html#dr-079","traceability.html#dr-080","traceability.html#dr-081","traceability.html#dr-082","traceability.html#dr-083","traceability.html#dr-084","traceability.html#dr-085","traceability.html#dr-086","traceability.html#dr-087","traceability.html#dr-088","traceability.html#dr-089","traceability.html#dr-090","traceability.html#dr-091","traceability.html#dr-092","traceability.html#dr-093","traceability.html#dr-095","traceability.html#dr-096","traceability.html#dr-097","traceability.html#dr-098","traceability.html#dr-099","traceability.html#dr-100","traceability.html#dr-101","traceability.html#dr-102","traceability.html#dr-103","traceability.html#dr-104","traceability.html#dr-105","traceability.html#dr-106","traceability.html#dr-107","traceability.html#dr-108","traceability.html#dr-109","traceability.html#dr-110","traceability.html#dr-111","traceability.html#dr-112","traceability.html#dr-113","traceability.html#dr-114","traceability.html#dr-115","traceability.html#dr-116","traceability.html#dr-117","traceability.html#dr-118","traceability.html#dr-119","traceability.html#dr-120","traceability.html#dr-123","traceability.html#dr-126","traceability.html#dr-127","traceability.html#dr-128","traceability.html#dr-129","traceability.html#dr-130","traceability.html#dr-131","traceability.html#dr-132","traceability.html#dr-133","traceability.html#dr-134","traceability.html#dr-135","traceability.html#dr-136","traceability.html#dr-137","traceability.html#dr-140","traceability.html#dr-141","traceability.html#dr-142","traceability.html#dr-143","traceability.html#dr-147","traceability.html#dr-148","traceability.html#dr-149","traceability.html#dr-150","traceability.html#dr-151","traceability.html#dr-152","traceability.html#dr-153","traceability.html#dr-154","traceability.html#dr-155","traceability.html#dr-156","traceability.html#dr-157","traceability.html#dr-158","traceability.html#dr-159","traceability.html#dr-160","traceability.html#dr-162","traceability.html#dr-167","traceability.html#dr-168","traceability.html#dr-169","traceability.html#dr-170","traceability.html#dr-171","traceability.html#dr-173","traceability.html#dr-174","traceability.html#dr-175","traceability.html#dr-176","traceability.html#dr-177","traceability.html#dr-178","traceability.html#dr-179","traceability.html#dr-180","traceability.html#dr-181","traceability.html#dr-182","traceability.html#dr-183","traceability.html#dr-185","traceability.html#dr-186","traceability.html#dr-188","traceability.html#dr-189","traceability.html#dr-193","traceability.html#dr-195","traceability.html#dr-196","traceability.html#dr-197","traceability.html#dr-198","traceability.html#dr-201","traceability.html#dr-203","traceability.html#dr-204","traceability.html#dr-205","traceability.html#dr-206","traceability.html#dr-207","traceability.html#dr-209","traceability.html#dr-210","traceability.html#dr-211","traceability.html#dr-212","traceability.html#dr-213","traceability.html#dr-215","traceability.html#dr-216","traceability.html#dr-217","traceability.html#dr-218","traceability.html#dr-219","traceability.html#dr-220","traceability.html#dr-221","traceability.html#dr-223","traceability.html#dr-224","traceability.html#ja-001","traceability.html#ja-002","traceability.html#ja-003","traceability.html#ja-004","traceability.html#ja-005","traceability.html#ja-006","traceability.html#ja-007","traceability.html#ja-008","traceability.html#ja-009","traceability.html#ja-010","traceability.html#ja-011","traceability.html#ja-012","traceability.html#ja-013","traceability.html#ja-014","traceability.html#ja-015","traceability.html#ja-016","traceability.html#ja-017","traceability.html#ja-018","traceability.html#ja-019","traceability.html#ja-020","traceability.html#ja-021","traceability.html#ja-022","traceability.html#ja-023","traceability.html#ja-024","traceability.html#ja-025","traceability.html#ja-026","traceability.html#ja-028","traceability.html#ja-029","traceability.html#ja-030","traceability.html#ja-031","traceability.html#ja-032","traceability.html#ja-033","traceability.html#ja-034","traceability.html#ja-035","traceability.html#ja-036","traceability.html#ur-003","traceability.html#ur-004","traceability.html#ur-005","traceability.html#ur-008","traceability.html#ur-009","traceability.html#ur-018","traceability.html#ur-019","traceability.html#ur-020","traceability.html#ur-021","traceability.html#ur-023","traceability.html#ur-025","traceability.html#ur-026","traceability.html#ur-027","traceability.html#ur-034","traceability.html#ur-040","traceability.html#ur-041","traceability.html#ur-053","traceability.html#ur-055","traceability.html#ur-056","traceability.html#ur-062","traceability.html#ur-064","traceability.html#ut-010","traceability.html#ut-024","traceability.html#ut-052","traceability.html#ut-060","traceability.html#ut-061","traceability.html#ut-062","traceability.html#ut-066","traceability.html#ut-071","traceability.html#ut-085","traceability.html#ut-086","traceability.html#ut-087","traceability.html#ut-088","traceability.html#ut-089","traceability.html#ut-090","traceability.html#ut-091","traceability.html#ut-092","traceability.html#ut-093","traceability.html#ut-094","traceability.html#ut-095","traceability.html#ut-096","traceability.html#ut-097","traceability.html#ut-098","traceability.html#ut-105","traceability.html#ut-106","traceability.html#ut-117","traceability.html#ut-118","traceability.html#ut-119","traceability.html#ut-123","traceability.html#ut-124","traceability.html#ut-131","traceability.html#ut-132","traceability.html#ut-133","traceability.html#ut-134","traceability.html#ut-135","traceability.html#ut-136","traceability.html#ut-137","traceability.html#ut-138","traceability.html#ut-139","traceability.html#ut-149","traceability.html#ut-158","traceability.html#ut-159","traceability.html#ut-160","traceability.html#ut-181","traceability.html#ut-182","traceability.html#ur-067","traceability.html#it-013","traceability.html#ut-186","traceability.html#ut-192","traceability.html#ut-211","traceability.html#ur-006","traceability.html#ur-013","traceability.html#ur-015","traceability.html#ur-016","traceability.html#ur-022","traceability.html#ur-024","traceability.html#ur-043","traceability.html#ur-049","traceability.html#ur-050","traceability.html#ur-071","traceability.html#ur-073","traceability.html#ur-074","traceability.html#it-003","traceability.html#it-004","traceability.html#it-016","traceability.html#ut-003","traceability.html#ut-004","traceability.html#ut-005","traceability.html#ut-012","traceability.html#ut-026","traceability.html#ut-027","traceability.html#ut-028","traceability.html#ut-029","traceability.html#ut-030","traceability.html#ut-031","traceability.html#ut-032","traceability.html#ut-033","traceability.html#ut-051","traceability.html#ut-059","traceability.html#ut-067","traceability.html#ut-072","traceability.html#ut-073","traceability.html#ut-074","traceability.html#ut-075","traceability.html#ut-076","traceability.html#ut-077","traceability.html#ut-078","traceability.html#ut-079","traceability.html#ut-080","traceability.html#ut-081","traceability.html#ut-082","traceability.html#ut-099","traceability.html#ut-100","traceability.html#ut-101","traceability.html#ut-102","traceability.html#ut-104","traceability.html#ut-107","traceability.html#ut-108","traceability.html#ut-109","traceability.html#ut-110","traceability.html#ut-111","traceability.html#ut-112","traceability.html#ut-113","traceability.html#ut-114","traceability.html#ut-116","traceability.html#ut-120","traceability.html#ut-130","traceability.html#ut-140","traceability.html#ut-151","traceability.html#ut-170","traceability.html#ur-002","traceability.html#ur-007","traceability.html#ur-011","traceability.html#ur-029","traceability.html#ur-030","traceability.html#ur-031","traceability.html#ur-032","traceability.html#ur-035","traceability.html#ur-036","traceability.html#ur-037","traceability.html#ur-038","traceability.html#ur-042","traceability.html#ur-046","traceability.html#ur-047","traceability.html#ur-048","traceability.html#ur-051","traceability.html#ur-052","traceability.html#ur-057","traceability.html#ur-058","traceability.html#ur-063","traceability.html#ur-065","traceability.html#ur-068","traceability.html#ur-069","traceability.html#ur-075","traceability.html#ur-076","traceability.html#ur-078","traceability.html#ut-145","traceability.html#ut-146","traceability.html#ut-167","traceability.html#ut-168","traceability.html#ur-028","traceability.html#ur-054","traceability.html#ur-066","traceability.html#ut-174","traceability.html#ur-061","traceability.html#ut-143","traceability.html#ut-144","traceability.html#ut-147","traceability.html#ut-175","traceability.html#ut-184","traceability.html#ut-185","traceability.html#ut-187","traceability.html#ut-188","traceability.html#ut-189","traceability.html#ur-017","traceability.html#ur-039","traceability.html#ut-207","traceability.html#ur-010","traceability.html#ut-183","traceability.html#ur-012","traceability.html#ur-059","traceability.html#ut-208","traceability.html#ur-060","traceability.html#ur-072","traceability.html#ur-077","traceability.html#ut-201","traceability.html#ut-206","traceability.html#ut-209","traceability.html#ur-033","traceability.html#ur-045","traceability.html#it-017","traceability.html#ut-014","traceability.html#ut-015","traceability.html#ut-016","traceability.html#ut-017","traceability.html#ut-018","traceability.html#ut-019","traceability.html#ut-020","traceability.html#ut-021","traceability.html#ut-022","traceability.html#ut-023","traceability.html#ut-025","traceability.html#ut-042","traceability.html#ut-043","traceability.html#ut-044","traceability.html#ut-083","traceability.html#ut-084","traceability.html#ut-103","traceability.html#ut-115","traceability.html#ut-121","traceability.html#ut-122","traceability.html#ut-125","traceability.html#ut-126","traceability.html#ut-127","traceability.html#ut-141","traceability.html#ut-142","traceability.html#ut-148","traceability.html#ut-150","traceability.html#ut-152","traceability.html#ut-154","traceability.html#ut-155","traceability.html#ut-156","traceability.html#ut-157","traceability.html#ut-161","traceability.html#ut-162","traceability.html#ut-163","traceability.html#ut-164","traceability.html#ut-166","traceability.html#ut-171","traceability.html#ut-172","traceability.html#ut-173","traceability.html#ut-176","traceability.html#ut-177","traceability.html#ut-178","traceability.html#ut-179","traceability.html#ut-180","traceability.html#ut-190","traceability.html#ut-191","traceability.html#ut-193","traceability.html#ut-194","traceability.html#ut-195","traceability.html#ut-196","traceability.html#ut-197","traceability.html#ut-198","traceability.html#ut-200","traceability.html#ut-202","traceability.html#ut-203","traceability.html#ut-205","traceability.html#ur-014","traceability.html#ur-044","traceability.html#ut-204","traceability.html#ut-210","traceability-ci.html#requirement-traceability-cicd-pipeline","traceability-ci.html#overview","traceability-ci.html#gitea-actions-workflows","traceability-ci.html#what-gets-validated","traceability-ci.html#1-trace-extraction","traceability-ci.html#2-coverage-thresholds","traceability-ci.html#2b-dangling-requirement-ids","traceability-ci.html#3-modified-file-checking","traceability-ci.html#how-to-add-traces-to-new-code","traceability-ci.html#typescriptsvelte-example","traceability-ci.html#rust-example","traceability-ci.html#test-example","traceability-ci.html#traces-format","traceability-ci.html#workflow-behavior","traceability-ci.html#on-push-to-main-branch","traceability-ci.html#on-pull-request","traceability-ci.html#failure-scenarios","traceability-ci.html#viewing-reports","traceability-ci.html#in-gitea-actions-ui","traceability-ci.html#locally","traceability-ci.html#coverage-goals","traceability-ci.html#current-status","traceability-ci.html#targets","traceability-ci.html#improving-coverage","traceability-ci.html#for-missing-user-requirements-ur","traceability-ci.html#for-missing-integration-requirements-ir","traceability-ci.html#for-missing-development-requirements-dr","traceability-ci.html#for-jellyfin-api-requirements-ja","traceability-ci.html#example-pr-checklist","traceability-ci.html#troubleshooting","traceability-ci.html#coverage-below-minimum-threshold","traceability-ci.html#new-files-without-traces","traceability-ci.html#invalid-json-format","traceability-ci.html#integration-with-development","traceability-ci.html#before-committing","traceability-ci.html#in-your-ide","traceability-ci.html#git-hooks","traceability-ci.html#references","traceability-ci.html#support","traces-quick-ref.html#traces-quick-reference-guide","traces-quick-ref.html#what-are-traces","traces-quick-ref.html#quick-examples","traces-quick-ref.html#typescript","traces-quick-ref.html#svelte","traces-quick-ref.html#rust","traces-quick-ref.html#requirement-types","traces-quick-ref.html#where-to-find-requirements","traces-quick-ref.html#how-to-add-traces","traces-quick-ref.html#step-1-find-the-requirement","traces-quick-ref.html#step-2-add-comment","traces-quick-ref.html#step-3-run-extraction","traces-quick-ref.html#common-patterns","traces-quick-ref.html#single-requirement","traces-quick-ref.html#multiple-requirements-same-type","traces-quick-ref.html#multiple-types","traces-quick-ref.html#test-coverage","traces-quick-ref.html#modulesfiles","traces-quick-ref.html#validation","traces-quick-ref.html#check-your-changes","traces-quick-ref.html#before-committing","traces-quick-ref.html#cicd-validation","traces-quick-ref.html#tips--tricks","traces-quick-ref.html#find-related-code","traces-quick-ref.html#update-your-editor","traces-quick-ref.html#find-untraced-code","traces-quick-ref.html#faq","traces-quick-ref.html#see-also","architecture/index.html#jellytau-software-architecture","architecture/index.html#architecture-overview","architecture/index.html#architecture-principles","architecture/index.html#detailed-documentation","architecture/index.html#file-structure-summary","architecture/index.html#key-architecture-changes","architecture/01-rust-backend.html#rust-backend-architecture","architecture/01-rust-backend.html#media-session-state-machine","architecture/01-rust-backend.html#player-state-machine-low-level-playback","architecture/01-rust-backend.html#playback-mode-state-machine","architecture/01-rust-backend.html#media-item--source","architecture/01-rust-backend.html#queue-manager","architecture/01-rust-backend.html#favorites-system","architecture/01-rust-backend.html#marking","architecture/01-rust-backend.html#browsing","architecture/01-rust-backend.html#player-backend-trait","architecture/01-rust-backend.html#player-controller","architecture/01-rust-backend.html#playlist-system","architecture/01-rust-backend.html#tauri-commands-player","architecture/01-rust-backend.html#domain-vocabulary-owned-by-rust","architecture/01-rust-backend.html#search-scope-and-the-taxonomy-boundary","architecture/01-rust-backend.html#library-exclusions","architecture/01-rust-backend.html#streaming-quality-ladder","architecture/01-rust-backend.html#background-workers","architecture/01-rust-backend.html#catalog-indexer","architecture/02-svelte-frontend.html#svelte-frontend-architecture","architecture/02-svelte-frontend.html#store-structure","architecture/02-svelte-frontend.html#music-library-architecture","architecture/02-svelte-frontend.html#playback-reporting-service","architecture/02-svelte-frontend.html#repository-architecture-rust-based","architecture/02-svelte-frontend.html#playback-mode-system","architecture/02-svelte-frontend.html#database-service-abstraction","architecture/02-svelte-frontend.html#component-hierarchy","architecture/02-svelte-frontend.html#miniplayer-behavior","architecture/02-svelte-frontend.html#sleep-timer-architecture","architecture/02-svelte-frontend.html#auto-play-episode-limit","architecture/02-svelte-frontend.html#player-page-navigation-guard","architecture/02-svelte-frontend.html#playlist-management-ui","architecture/02-svelte-frontend.html#app-shell-and-chrome","architecture/02-svelte-frontend.html#visibility-rules","architecture/02-svelte-frontend.html#the-structural-fix-worth-not-undoing","architecture/02-svelte-frontend.html#accountmenu","architecture/02-svelte-frontend.html#library-mosaic","architecture/02-svelte-frontend.html#series-and-episode-navigation","architecture/02-svelte-frontend.html#downloaded-browse","architecture/02-svelte-frontend.html#safe-area-insets","architecture/02-svelte-frontend.html#native-video-store","architecture/02-svelte-frontend.html#logging","architecture/03-data-flow.html#data-flow","architecture/03-data-flow.html#repository-query-flow-cache-first","architecture/03-data-flow.html#search-flow-locally-indexed","architecture/03-data-flow.html#playback-initiation-flow","architecture/03-data-flow.html#playback-mode-transfer-flow","architecture/03-data-flow.html#queue-navigation-flow","architecture/03-data-flow.html#volume-control-flow","architecture/04-type-sync-and-threading.html#type-synchronization--thread-safety","architecture/04-type-sync-and-threading.html#playerstate-rust--typescript","architecture/04-type-sync-and-threading.html#mediaitem-serialization","architecture/04-type-sync-and-threading.html#tauri-v2-ipc-parameter-naming-convention","architecture/04-type-sync-and-threading.html#rust-backend-thread-safety","architecture/04-type-sync-and-threading.html#frontend-stores","architecture/05-platform-backends.html#platform-specific-player-backends","architecture/05-platform-backends.html#player-events-system","architecture/05-platform-backends.html#html5-video-adapter-webview-rendered-video","architecture/05-platform-backends.html#mpvbackend-linux","architecture/05-platform-backends.html#exoplayerbackend-android","architecture/05-platform-backends.html#audio-settings-on-exoplayer","architecture/05-platform-backends.html#the-equalizer-and-where-its-vocabulary-lives","architecture/05-platform-backends.html#background-audio-handoff-android","architecture/05-platform-backends.html#native-video-compositing-android","architecture/05-platform-backends.html#android-mediasession--remote-volume-control","architecture/05-platform-backends.html#android-album-art-caching","architecture/05-platform-backends.html#backend-initialization","architecture/06-downloads-and-offline.html#download-manager--offline-architecture","architecture/06-downloads-and-offline.html#overview","architecture/06-downloads-and-offline.html#download-worker","architecture/06-downloads-and-offline.html#smart-caching-engine","architecture/06-downloads-and-offline.html#one-storage-model-cache-entries-are-downloads","architecture/06-downloads-and-offline.html#offline-catalog-visibility","architecture/06-downloads-and-offline.html#download-commands","architecture/06-downloads-and-offline.html#offline-commands","architecture/06-downloads-and-offline.html#player-integration","architecture/06-downloads-and-offline.html#frontend-downloads-store","architecture/06-downloads-and-offline.html#download-ui-components","architecture/06-downloads-and-offline.html#database-schema","architecture/07-connectivity.html#connectivity--network-architecture","architecture/07-connectivity.html#http-client-with-retry-logic","architecture/07-connectivity.html#connectivity-monitor","architecture/07-connectivity.html#source-of-truth-repository-traffic","architecture/07-connectivity.html#time-window-debounce-offline--instant-recovery-online","architecture/07-connectivity.html#offline-only-recovery-probe","architecture/07-connectivity.html#network-resilience-architecture","architecture/08-database-design.html#offline-database-design","architecture/08-database-design.html#entity-relationship-diagram","architecture/08-database-design.html#table-definitions","architecture/08-database-design.html#servers","architecture/08-database-design.html#users","architecture/08-database-design.html#libraries","architecture/08-database-design.html#items","architecture/08-database-design.html#media_streams","architecture/08-database-design.html#user_data","architecture/08-database-design.html#downloads","architecture/08-database-design.html#sync_queue","architecture/08-database-design.html#thumbnails","architecture/08-database-design.html#playlists-for-localsynced-playlists","architecture/08-database-design.html#key-queries","architecture/08-database-design.html#get-items-for-offline-library-browsing","architecture/08-database-design.html#resume--continue-watching","architecture/08-database-design.html#offline-search","architecture/08-database-design.html#download-queue-management","architecture/08-database-design.html#sync-queue-processing","architecture/08-database-design.html#data-flow","architecture/08-database-design.html#online-mode","architecture/08-database-design.html#offline-mode","architecture/08-database-design.html#sync-on-reconnect","architecture/08-database-design.html#storage-estimates","architecture/08-database-design.html#rust-module-structure","architecture/09-security.html#security","architecture/09-security.html#authentication-token-storage","architecture/09-security.html#secure-storage-module","architecture/09-security.html#network-security","architecture/09-security.html#webview-content-security-policy","architecture/09-security.html#asset-protocol-scope","architecture/09-security.html#local-data-protection","architecture/09-security.html#path-confinement-and-input-binding","architecture/09-security.html#filesystem-path-confinement","architecture/09-security.html#query-and-url-construction","architecture/09-security.html#security-considerations","ux-flows.html#jellytau-ux-flows--screen-transitions","ux-flows.html#1-core-navigation-structure","ux-flows.html#11-navigation-system","ux-flows.html#12-account-menu","ux-flows.html#13-chrome-availability","ux-flows.html#14-known-deviations","ux-flows.html#2-initial-app-launch-flow","ux-flows.html#21-first-time-launch","ux-flows.html#22-subsequent-launches","ux-flows.html#3-audio-playback-flows","ux-flows.html#31-starting-audio-playback","ux-flows.html#32-miniplayer--full-player-transition","ux-flows.html#33-full-player--back-to-browsing","ux-flows.html#4-video-playback-flows","ux-flows.html#41-starting-video-playback","ux-flows.html#42-video-player-screen-ir-003-ir-004-ur-003","ux-flows.html#43-exiting-video-player","ux-flows.html#5-music-library-navigation-flows","ux-flows.html#51-music-category-landing-page","ux-flows.html#52-albums-view-flow","ux-flows.html#53-artist-navigation","ux-flows.html#5a-library-page-layouts","ux-flows.html#5a1-card-shape-follows-the-media-not-the-page","ux-flows.html#5a2-grid-vs-list","ux-flows.html#5a3-what-a-card-shows","ux-flows.html#5a4-known-deviations","ux-flows.html#5b-video-detail-page-composition","ux-flows.html#5b1-which-surface-renders","ux-flows.html#5b2-episode-focus-view--section-order","ux-flows.html#5b3-movie-detail--section-order","ux-flows.html#5b4-series-detail--section-order","ux-flows.html#5b5-home-card-interaction--tap-opens-long-press-plays","ux-flows.html#5c-favourites","ux-flows.html#5c1-the-heart-appears-wherever-an-item-does","ux-flows.html#5c2-three-ways-back-to-what-you-favourited","ux-flows.html#5c3-removing-a-favourite-removes-it-everywhere-at-once","ux-flows.html#5c4-offline","ux-flows.html#5c5-known-deviations","ux-flows.html#6-search-flow","ux-flows.html#61-scope-is-inherited-from-context","ux-flows.html#62-search-page-layout","ux-flows.html#63-result-group-order-is-user-configurable","ux-flows.html#64-known-deviations","ux-flows.html#7-download-flows","ux-flows.html#71-initiating-downloads","ux-flows.html#72-downloads--a-browsable-offline-library-not-a-flat-list","ux-flows.html#73-the-downloaded-browse-surface","ux-flows.html#74-transfers-activity-view","ux-flows.html#75-navigation--entry-points","ux-flows.html#77-known-deviations","ux-flows.html#8-settings--account-flows","ux-flows.html#81-settings-navigation","ux-flows.html#82-logout-flow","ux-flows.html#9-background--lock-screen-behavior","ux-flows.html#91-audio-playback-in-background-android","ux-flows.html#92-video-playback-in-background-android--pip--background-audio","ux-flows.html#10-error-states--edge-cases","ux-flows.html#101-network-loss-during-streaming","ux-flows.html#102-server-unreachable","ux-flows.html#103-download-failed","ux-flows.html#11-platform-specific-ux-patterns","ux-flows.html#111-android-specific","ux-flows.html#112-linux-desktop-specific","ux-flows.html#12-ux-principles-summary","ux-flows.html#121-core-principles","ux-flows.html#122-animation--transitions","ux-flows.html#123-touch-targets-mobile","ux-flows.html#13-future-ux-enhancements","ux-flows.html#131-planned-features","ux-flows.html#132-accessibility-enhancements","specs/index.html#specs-index","specs/index.html#what-lives-here","specs/index.html#partially-implemented","specs/index.html#not-started","specs/index.html#design-authority","specs/index.html#where-the-shipped-specs-went","specs/SPEC-TEMPLATE.html#spec","specs/SPEC-TEMPLATE.html#summary","specs/SPEC-TEMPLATE.html#motivation","specs/SPEC-TEMPLATE.html#layer-assignment","specs/SPEC-TEMPLATE.html#design","specs/SPEC-TEMPLATE.html#out-of-scope","specs/SPEC-TEMPLATE.html#acceptance-criteria","specs/SPEC-TEMPLATE.html#testing","specs/SPEC-TEMPLATE.html#traces","specs/SPEC-TEMPLATE.html#notes-for-the-implementer","specs/SPEC-REVIEW-CHECKLIST.html#spec-review-checklist","specs/SPEC-REVIEW-CHECKLIST.html#boundary-the-one-that-bites","specs/SPEC-REVIEW-CHECKLIST.html#ipc-contract","specs/SPEC-REVIEW-CHECKLIST.html#requirements--traceability","specs/SPEC-REVIEW-CHECKLIST.html#lifecycle","specs/SPEC-REVIEW-CHECKLIST.html#conflicts--hygiene","specs/playback-backend-unification.html#spec-playback-backend-unification--findings-and-strategy","specs/playback-backend-unification.html#summary","specs/playback-backend-unification.html#motivation","specs/playback-backend-unification.html#findings","specs/playback-backend-unification.html#1-the-current-architecture-is-not-what-the-docs-describe","specs/playback-backend-unification.html#2-native-video-cannot-be-composited-with-a-tauri-webview","specs/playback-backend-unification.html#3-mpv-would-regress-streaming-quality","specs/playback-backend-unification.html#4-crossfade-is-architecturally-blocked-on-mpv","specs/playback-backend-unification.html#5-engine-comparison-summary","specs/playback-backend-unification.html#6-two-further-options-ruled-out","specs/playback-backend-unification.html#7-if-libmpv-is-ever-revisited-on-android","specs/playback-backend-unification.html#decision","specs/playback-backend-unification.html#corrections-to-existing-docs","specs/playback-backend-unification.html#layer-assignment","specs/playback-backend-unification.html#out-of-scope","specs/playback-backend-unification.html#acceptance-criteria","specs/playback-backend-unification.html#testing","specs/playback-backend-unification.html#traces","specs/playback-backend-unification.html#notes-for-the-implementer","specs/linux-native-video-spike.html#spec-linux-native-video--bounded-compositing-spike","specs/linux-native-video-spike.html#summary","specs/linux-native-video-spike.html#motivation","specs/linux-native-video-spike.html#the-blocker-a-green-spike-does-not-clear","specs/linux-native-video-spike.html#layer-assignment","specs/linux-native-video-spike.html#design","specs/linux-native-video-spike.html#what-gets-built","specs/linux-native-video-spike.html#bindings","specs/linux-native-video-spike.html#ipc","specs/linux-native-video-spike.html#gates","specs/linux-native-video-spike.html#time-box","specs/linux-native-video-spike.html#result-2026-08-21","specs/linux-native-video-spike.html#three-traps-each-of-which-cost-a-debugging-cycle","specs/linux-native-video-spike.html#hardware-decode-through-the-render-api","specs/linux-native-video-spike.html#what-is-still-open","specs/linux-native-video-spike.html#out-of-scope","specs/linux-native-video-spike.html#why-windows-is-unaffected-and-cheaper","specs/linux-native-video-spike.html#does-this-add-a-backend","specs/linux-native-video-spike.html#acceptance-criteria","specs/linux-native-video-spike.html#testing","specs/linux-native-video-spike.html#traces","specs/linux-native-video-spike.html#notes-for-the-implementer","specs/backend-owned-stream-selection.html#spec-backend-owned-stream-selection","specs/backend-owned-stream-selection.html#summary","specs/backend-owned-stream-selection.html#motivation","specs/backend-owned-stream-selection.html#the-prior-question","specs/backend-owned-stream-selection.html#layer-assignment","specs/backend-owned-stream-selection.html#the-line","specs/backend-owned-stream-selection.html#design","specs/backend-owned-stream-selection.html#the-contract","specs/backend-owned-stream-selection.html#re-negotiation","specs/backend-owned-stream-selection.html#phases","specs/backend-owned-stream-selection.html#out-of-scope","specs/backend-owned-stream-selection.html#acceptance-criteria","specs/backend-owned-stream-selection.html#testing","specs/backend-owned-stream-selection.html#traces","specs/backend-owned-stream-selection.html#notes-for-the-implementer","specs/player-facade-enforcement.html#spec-enforce-the-unified-player-boundary","specs/player-facade-enforcement.html#summary","specs/player-facade-enforcement.html#motivation","specs/player-facade-enforcement.html#layer-assignment","specs/player-facade-enforcement.html#design","specs/player-facade-enforcement.html#1-narrow-the-principle-to-what-it-actually-means","specs/player-facade-enforcement.html#2-fill-the-facade-gaps-group-b","specs/player-facade-enforcement.html#3-migrate-group-a","specs/player-facade-enforcement.html#4-add-the-lint-rule-the-part-that-makes-it-stick","specs/player-facade-enforcement.html#out-of-scope","specs/player-facade-enforcement.html#acceptance-criteria","specs/player-facade-enforcement.html#testing","specs/player-facade-enforcement.html#traces","specs/player-facade-enforcement.html#notes-for-the-implementer","specs/windows-native-audio-backend.html#spec-windows-native-audio-backend","specs/windows-native-audio-backend.html#summary","specs/windows-native-audio-backend.html#motivation","specs/windows-native-audio-backend.html#layer-assignment","specs/windows-native-audio-backend.html#design","specs/windows-native-audio-backend.html#engine-choice","specs/windows-native-audio-backend.html#structure","specs/windows-native-audio-backend.html#build","specs/windows-native-audio-backend.html#verified-build-mechanics","specs/windows-native-audio-backend.html#size-and-shipping","specs/windows-native-audio-backend.html#out-of-scope","specs/windows-native-audio-backend.html#acceptance-criteria","specs/windows-native-audio-backend.html#testing","specs/windows-native-audio-backend.html#traces","specs/windows-native-audio-backend.html#notes-for-the-implementer","specs/libmpv2-migration.html#spec-migrate-to-libmpv2-and-declare-the-project-licence","specs/libmpv2-migration.html#summary","specs/libmpv2-migration.html#motivation","specs/libmpv2-migration.html#the-dependency-is-dead","specs/libmpv2-migration.html#the-project-has-no-licence","specs/libmpv2-migration.html#design","specs/libmpv2-migration.html#part-1--licence","specs/libmpv2-migration.html#part-2--libmpv--libmpv2","specs/libmpv2-migration.html#layer-assignment","specs/libmpv2-migration.html#out-of-scope","specs/libmpv2-migration.html#acceptance-criteria","specs/libmpv2-migration.html#testing","specs/libmpv2-migration.html#traces","specs/libmpv2-migration.html#notes-for-the-implementer","specs/read-through-media-cache.html#spec-two-path-media--selectable-playback-bitrate-independent-whole-file-download","specs/read-through-media-cache.html#summary","specs/read-through-media-cache.html#motivation","specs/read-through-media-cache.html#layer-assignment","specs/read-through-media-cache.html#design","specs/read-through-media-cache.html#dr-121--bitrate-selection-in-the-player","specs/read-through-media-cache.html#dr-122--the-playback-path-is-ephemeral","specs/read-through-media-cache.html#dr-123--the-download-path-is-independent","specs/read-through-media-cache.html#dr-124--keep-playback-bytes-only-when-they--are--the-download","specs/read-through-media-cache.html#dr-125--promotion-rendition-and-invalidation","specs/read-through-media-cache.html#gating","specs/read-through-media-cache.html#out-of-scope","specs/read-through-media-cache.html#acceptance-criteria","specs/read-through-media-cache.html#testing","specs/read-through-media-cache.html#traces","specs/read-through-media-cache.html#notes-for-the-implementer","specs/scoped-search.html#spec-context-scoped-search-with-filter-chips-and-configurable-group-order","specs/scoped-search.html#summary","specs/scoped-search.html#motivation","specs/scoped-search.html#background-what-already-exists","specs/scoped-search.html#design","specs/scoped-search.html#scope-model","specs/scoped-search.html#route--scope-resolution-dr-063","specs/scoped-search.html#scope-is-a-starting-point-not-a-lock-dr-064","specs/scoped-search.html#threading-scope-through-the-store-dr-065","specs/scoped-search.html#group-order-dr-066-dr-067","specs/scoped-search.html#out-of-scope","specs/scoped-search.html#acceptance-criteria","specs/scoped-search.html#testing","specs/scoped-search.html#notes-for-the-implementer","specs/scoped-search-boundary.html#spec-move-search-scope-taxonomy-behind-the-rust-boundary","specs/scoped-search-boundary.html#why-this-spec-exists","specs/scoped-search-boundary.html#what-is--not--a-leak-leave-it-alone","specs/scoped-search-boundary.html#the-boundary-rule-after-this-change","specs/scoped-search-boundary.html#design","specs/scoped-search-boundary.html#rust-owns-scope--item-types-query-side","specs/scoped-search-boundary.html#rust-owns-result-bucketing-result-side","specs/scoped-search-boundary.html#-the-search-event-wrinkle--both-payloads-must-change","specs/scoped-search-boundary.html#what-the-frontend-keeps-all-pure-presentation","specs/scoped-search-boundary.html#frontend-call-site-changes","specs/scoped-search-boundary.html#out-of-scope","specs/scoped-search-boundary.html#acceptance-criteria","specs/scoped-search-boundary.html#testing","specs/scoped-search-boundary.html#traces","specs/scoped-search-boundary.html#notes-for-the-implementer","specs/scoped-search-boundary-implementation.html#spec-land-the-scoped-search-boundary-fix-implementation","specs/scoped-search-boundary-implementation.html#summary","specs/scoped-search-boundary-implementation.html#motivation","specs/scoped-search-boundary-implementation.html#layer-assignment","specs/scoped-search-boundary-implementation.html#design","specs/scoped-search-boundary-implementation.html#staging-land-it-in-two-reviewable-pieces","specs/scoped-search-boundary-implementation.html#stage-1--delivered-july-2026","specs/scoped-search-boundary-implementation.html#-the-search-event-dual-payload-stage-2","specs/scoped-search-boundary-implementation.html#note-on-searchoptionsscope-and-specta","specs/scoped-search-boundary-implementation.html#out-of-scope","specs/scoped-search-boundary-implementation.html#acceptance-criteria","specs/scoped-search-boundary-implementation.html#testing","specs/scoped-search-boundary-implementation.html#traces","specs/scoped-search-boundary-implementation.html#notes-for-the-implementer","specs/frontend-domain-model.html#spec-remove-jellyfin-specific-models-from-the-frontend","specs/frontend-domain-model.html#summary","specs/frontend-domain-model.html#motivation","specs/frontend-domain-model.html#layer-assignment","specs/frontend-domain-model.html#design","specs/frontend-domain-model.html#single-canonical-model-one-location-isolated-mappings","specs/frontend-domain-model.html#the-domain-model-rust","specs/frontend-domain-model.html#-the-search-event--dual-payload-rule-applies-again","specs/frontend-domain-model.html#frontend-after","specs/frontend-domain-model.html#phased-migration","specs/frontend-domain-model.html#out-of-scope","specs/frontend-domain-model.html#acceptance-criteria","specs/frontend-domain-model.html#testing","specs/frontend-domain-model.html#traces","specs/frontend-domain-model.html#notes-for-the-implementer","specs/build-provenance.html#spec-build-provenance-git-describe--build-profile","specs/build-provenance.html#summary","specs/build-provenance.html#motivation","specs/build-provenance.html#what-this-deliberately-does--not--do","specs/build-provenance.html#layer-assignment","specs/build-provenance.html#design","specs/build-provenance.html#buildrs","specs/build-provenance.html#the-provenance-type","specs/build-provenance.html#command","specs/build-provenance.html#settings--about","specs/build-provenance.html#removing-one-version-file","specs/build-provenance.html#out-of-scope","specs/build-provenance.html#acceptance-criteria","specs/build-provenance.html#testing","specs/build-provenance.html#traces","specs/build-provenance.html#notes-for-the-implementer","build/build-release.html#build--release-workflow","build/build-release.html#overview","build/build-release.html#workflow-triggers","build/build-release.html#automatic-trigger","build/build-release.html#manual-trigger","build/build-release.html#version-tagging","build/build-release.html#format","build/build-release.html#creating-a-release","build/build-release.html#release-status","build/build-release.html#workflow-steps","build/build-release.html#1-test-phase","build/build-release.html#2-build-linux-phase","build/build-release.html#3-build-android-phase","build/build-release.html#4-create-release-phase","build/build-release.html#artifacts","build/build-release.html#linux-artifacts","build/build-release.html#android-artifacts","build/build-release.html#release-notes","build/build-release.html#build-matrix","build/build-release.html#troubleshooting","build/build-release.html#build-fails-during-test-phase","build/build-release.html#linux-build-fails","build/build-release.html#android-build-fails","build/build-release.html#release-not-created","build/build-release.html#github-release-vs-gitea","build/build-release.html#customization","build/build-release.html#change-release-notes-template","build/build-release.html#add-new-platforms","build/build-release.html#change-build-targets","build/build-release.html#monitoring","build/build-release.html#check-status","build/build-release.html#notifications","build/build-release.html#performance","build/build-release.html#build-times-approximate","build/build-release.html#caching","build/build-release.html#security","build/build-release.html#secrets","build/build-release.html#verification","build/build-release.html#best-practices","build/build-release.html#versioning","build/build-release.html#testing-before-release","build/build-release.html#documentation","build/build-release.html#example-release-workflow","build/build-release.html#references","release-checklist.html#release-checklist","release-checklist.html#pre-release-1-2-days-before","release-checklist.html#update-version-day-before","release-checklist.html#final-check-before-release","release-checklist.html#release-tag--push","release-checklist.html#during-release-while-workflow-runs","release-checklist.html#after-release-workflow-complete","release-checklist.html#rollback-if-issues-found","release-checklist.html#version-examples","release-checklist.html#major-release","release-checklist.html#minor-release","release-checklist.html#patch-release","release-checklist.html#pre-releases","release-checklist.html#file-locations","release-checklist.html#troubleshooting","release-checklist.html#tests-fail-before-release","release-checklist.html#build-fails-in-ci","release-checklist.html#release-already-exists","release-checklist.html#artifacts-missing","release-checklist.html#performance-tips","release-checklist.html#template-release-notes","release-checklist.html#quick-commands","build/build-desktop-packages.html#desktop-packaging-linux-arch-windows","build/build-desktop-packages.html#one-builder-image-shared-with-ci","build/build-desktop-packages.html#linux-deb--rpm","build/build-desktop-packages.html#arch-linux-pacman-package","build/build-desktop-packages.html#windows-nsis-installer-cross-compiled-from-linux","build/build-windows.html#windows-build","build/build-windows.html#how-playback-works-on-windows","build/build-windows.html#cross-compiling-from-linux-msvc--cargo-xwin","build/build-windows.html#caveats","build/build-windows.html#outstanding-for-a-first-class-windows-release","defect-windows.html#defect-windows--which-bugs-were-present-when","defect-windows.html#present-since-the-first-release","defect-windows.html#why-they-took-so-long-to-surface","defect-windows.html#introduced-by-a-feature-fixed-later","defect-windows.html#short-windows-one-release-or-less","defect-windows.html#fixed-twice--never-actually-broken","defect-windows.html#recurring-shapes","defect-windows.html#reproducing-this","build/docker.html#docker--cicd-setup-for-jellytau","build/docker.html#overview","build/docker.html#quick-start","build/docker.html#docker-usage","build/docker.html#prerequisites","build/docker.html#building-the-docker-image","build/docker.html#using-docker-compose","build/docker.html#extracting-build-artifacts","build/docker.html#gitea-act-cicd-pipeline","build/docker.html#workflow-triggers","build/docker.html#setting-up-the-builder-image","build/docker.html#setting-up-gitea-act","build/docker.html#customizing-the-workflow","build/docker.html#environment-setup-in-ci","build/docker.html#secret-variables","build/docker.html#troubleshooting","build/docker.html#out-of-memory-during-build","build/docker.html#android-sdk-download-timeout","build/docker.html#rust-compilation-errors","build/docker.html#cache-issues","build/docker.html#performance-tips","build/docker.html#security-considerations","build/docker.html#next-steps","build/docker.html#references","build/build-builder-image.html#building-and-pushing-the-jellytau-builder-image","build/build-builder-image.html#prerequisites","build/build-builder-image.html#building-the-builder-image","build/build-builder-image.html#step-1-build-the-image-locally","build/build-builder-image.html#step-2-tag-for-your-registry","build/build-builder-image.html#step-3-login-to-your-registry","build/build-builder-image.html#step-4-push-to-registry","build/build-builder-image.html#complete-one-liner","build/build-builder-image.html#verifying-the-build","build/build-builder-image.html#using-in-cicd","build/build-builder-image.html#updating-the-builder-image","build/build-builder-image.html#image-contents","build/build-builder-image.html#build-time","build/build-builder-image.html#storage","build/build-builder-image.html#troubleshooting","build/build-builder-image.html#image-not-found-in-ci","build/build-builder-image.html#build-fails-with-command-not-found","build/build-builder-image.html#registry-authentication-in-ci","build/build-builder-image.html#references","api-redirect.html#rust-api-reference"],"index":{"documentStore":{"docInfo":{"0":{"body":52,"breadcrumbs":3,"title":2},"1":{"body":25,"breadcrumbs":4,"title":2},"10":{"body":4303,"breadcrumbs":6,"title":4},"100":{"body":16,"breadcrumbs":4,"title":2},"1000":{"body":47,"breadcrumbs":3,"title":1},"1001":{"body":50,"breadcrumbs":4,"title":2},"1002":{"body":7,"breadcrumbs":5,"title":3},"1003":{"body":23,"breadcrumbs":3,"title":1},"1004":{"body":0,"breadcrumbs":4,"title":2},"1005":{"body":25,"breadcrumbs":4,"title":2},"1006":{"body":21,"breadcrumbs":4,"title":2},"1007":{"body":0,"breadcrumbs":4,"title":2},"1008":{"body":28,"breadcrumbs":3,"title":1},"1009":{"body":30,"breadcrumbs":4,"title":2},"101":{"body":10,"breadcrumbs":4,"title":2},"1010":{"body":27,"breadcrumbs":4,"title":2},"1011":{"body":0,"breadcrumbs":4,"title":2},"1012":{"body":18,"breadcrumbs":5,"title":3},"1013":{"body":18,"breadcrumbs":6,"title":4},"1014":{"body":27,"breadcrumbs":6,"title":4},"1015":{"body":20,"breadcrumbs":6,"title":4},"1016":{"body":0,"breadcrumbs":3,"title":1},"1017":{"body":73,"breadcrumbs":4,"title":2},"1018":{"body":44,"breadcrumbs":4,"title":2},"1019":{"body":17,"breadcrumbs":4,"title":2},"102":{"body":10,"breadcrumbs":4,"title":2},"1020":{"body":15,"breadcrumbs":4,"title":2},"1021":{"body":0,"breadcrumbs":3,"title":1},"1022":{"body":22,"breadcrumbs":7,"title":5},"1023":{"body":16,"breadcrumbs":5,"title":3},"1024":{"body":18,"breadcrumbs":5,"title":3},"1025":{"body":14,"breadcrumbs":4,"title":2},"1026":{"body":29,"breadcrumbs":6,"title":4},"1027":{"body":0,"breadcrumbs":3,"title":1},"1028":{"body":24,"breadcrumbs":6,"title":4},"1029":{"body":28,"breadcrumbs":5,"title":3},"103":{"body":10,"breadcrumbs":4,"title":2},"1030":{"body":21,"breadcrumbs":5,"title":3},"1031":{"body":0,"breadcrumbs":3,"title":1},"1032":{"body":14,"breadcrumbs":4,"title":2},"1033":{"body":9,"breadcrumbs":3,"title":1},"1034":{"body":0,"breadcrumbs":3,"title":1},"1035":{"body":19,"breadcrumbs":5,"title":3},"1036":{"body":10,"breadcrumbs":3,"title":1},"1037":{"body":0,"breadcrumbs":3,"title":1},"1038":{"body":9,"breadcrumbs":3,"title":1},"1039":{"body":14,"breadcrumbs":3,"title":1},"104":{"body":17,"breadcrumbs":4,"title":2},"1040":{"body":0,"breadcrumbs":4,"title":2},"1041":{"body":16,"breadcrumbs":3,"title":1},"1042":{"body":26,"breadcrumbs":5,"title":3},"1043":{"body":14,"breadcrumbs":3,"title":1},"1044":{"body":80,"breadcrumbs":5,"title":3},"1045":{"body":18,"breadcrumbs":3,"title":1},"1046":{"body":5,"breadcrumbs":4,"title":2},"1047":{"body":29,"breadcrumbs":8,"title":6},"1048":{"body":87,"breadcrumbs":6,"title":4},"1049":{"body":46,"breadcrumbs":6,"title":4},"105":{"body":10,"breadcrumbs":4,"title":2},"1050":{"body":64,"breadcrumbs":5,"title":3},"1051":{"body":16,"breadcrumbs":6,"title":4},"1052":{"body":144,"breadcrumbs":5,"title":3},"1053":{"body":56,"breadcrumbs":5,"title":3},"1054":{"body":0,"breadcrumbs":4,"title":2},"1055":{"body":13,"breadcrumbs":4,"title":2},"1056":{"body":9,"breadcrumbs":4,"title":2},"1057":{"body":9,"breadcrumbs":4,"title":2},"1058":{"body":16,"breadcrumbs":4,"title":2},"1059":{"body":21,"breadcrumbs":4,"title":2},"106":{"body":15,"breadcrumbs":4,"title":2},"1060":{"body":0,"breadcrumbs":3,"title":1},"1061":{"body":16,"breadcrumbs":6,"title":4},"1062":{"body":25,"breadcrumbs":5,"title":3},"1063":{"body":13,"breadcrumbs":5,"title":3},"1064":{"body":12,"breadcrumbs":4,"title":2},"1065":{"body":31,"breadcrumbs":4,"title":2},"1066":{"body":55,"breadcrumbs":5,"title":3},"1067":{"body":88,"breadcrumbs":4,"title":2},"1068":{"body":16,"breadcrumbs":7,"title":5},"1069":{"body":143,"breadcrumbs":7,"title":5},"107":{"body":39,"breadcrumbs":4,"title":2},"1070":{"body":53,"breadcrumbs":5,"title":3},"1071":{"body":72,"breadcrumbs":6,"title":4},"1072":{"body":83,"breadcrumbs":8,"title":6},"1073":{"body":30,"breadcrumbs":4,"title":2},"1074":{"body":63,"breadcrumbs":5,"title":3},"1075":{"body":149,"breadcrumbs":8,"title":6},"1076":{"body":37,"breadcrumbs":3,"title":1},"1077":{"body":25,"breadcrumbs":7,"title":5},"1078":{"body":88,"breadcrumbs":6,"title":4},"1079":{"body":205,"breadcrumbs":5,"title":3},"108":{"body":119,"breadcrumbs":4,"title":2},"1080":{"body":141,"breadcrumbs":5,"title":3},"1081":{"body":240,"breadcrumbs":6,"title":4},"1082":{"body":83,"breadcrumbs":7,"title":5},"1083":{"body":76,"breadcrumbs":7,"title":5},"1084":{"body":97,"breadcrumbs":4,"title":2},"1085":{"body":55,"breadcrumbs":3,"title":1},"1086":{"body":12,"breadcrumbs":5,"title":4},"1087":{"body":32,"breadcrumbs":2,"title":1},"1088":{"body":44,"breadcrumbs":3,"title":2},"1089":{"body":0,"breadcrumbs":3,"title":2},"109":{"body":33,"breadcrumbs":4,"title":2},"1090":{"body":17,"breadcrumbs":2,"title":1},"1091":{"body":23,"breadcrumbs":4,"title":3},"1092":{"body":78,"breadcrumbs":4,"title":3},"1093":{"body":18,"breadcrumbs":4,"title":3},"1094":{"body":46,"breadcrumbs":5,"title":4},"1095":{"body":15,"breadcrumbs":3,"title":2},"1096":{"body":37,"breadcrumbs":5,"title":4},"1097":{"body":56,"breadcrumbs":5,"title":4},"1098":{"body":73,"breadcrumbs":3,"title":2},"1099":{"body":0,"breadcrumbs":4,"title":3},"11":{"body":221,"breadcrumbs":4,"title":2},"110":{"body":15,"breadcrumbs":4,"title":2},"1100":{"body":20,"breadcrumbs":3,"title":2},"1101":{"body":0,"breadcrumbs":2,"title":1},"1102":{"body":25,"breadcrumbs":5,"title":4},"1103":{"body":13,"breadcrumbs":5,"title":4},"1104":{"body":18,"breadcrumbs":4,"title":3},"1105":{"body":21,"breadcrumbs":3,"title":2},"1106":{"body":37,"breadcrumbs":3,"title":2},"1107":{"body":33,"breadcrumbs":3,"title":2},"1108":{"body":27,"breadcrumbs":3,"title":2},"1109":{"body":13,"breadcrumbs":2,"title":1},"111":{"body":33,"breadcrumbs":4,"title":2},"1110":{"body":14,"breadcrumbs":7,"title":5},"1111":{"body":14,"breadcrumbs":3,"title":1},"1112":{"body":0,"breadcrumbs":5,"title":3},"1113":{"body":26,"breadcrumbs":7,"title":5},"1114":{"body":11,"breadcrumbs":6,"title":4},"1115":{"body":5,"breadcrumbs":6,"title":4},"1116":{"body":4,"breadcrumbs":6,"title":4},"1117":{"body":17,"breadcrumbs":5,"title":3},"1118":{"body":28,"breadcrumbs":4,"title":2},"1119":{"body":25,"breadcrumbs":4,"title":2},"112":{"body":21,"breadcrumbs":4,"title":2},"1120":{"body":43,"breadcrumbs":5,"title":3},"1121":{"body":61,"breadcrumbs":4,"title":2},"1122":{"body":17,"breadcrumbs":4,"title":2},"1123":{"body":10,"breadcrumbs":3,"title":1},"1124":{"body":0,"breadcrumbs":3,"title":1},"1125":{"body":22,"breadcrumbs":5,"title":3},"1126":{"body":15,"breadcrumbs":6,"title":4},"1127":{"body":26,"breadcrumbs":5,"title":3},"1128":{"body":8,"breadcrumbs":3,"title":1},"1129":{"body":12,"breadcrumbs":7,"title":3},"113":{"body":9,"breadcrumbs":4,"title":2},"114":{"body":9,"breadcrumbs":4,"title":2},"115":{"body":9,"breadcrumbs":4,"title":2},"116":{"body":137,"breadcrumbs":4,"title":2},"117":{"body":9,"breadcrumbs":4,"title":2},"118":{"body":15,"breadcrumbs":4,"title":2},"119":{"body":15,"breadcrumbs":4,"title":2},"12":{"body":0,"breadcrumbs":5,"title":3},"120":{"body":49,"breadcrumbs":4,"title":2},"121":{"body":15,"breadcrumbs":4,"title":2},"122":{"body":17,"breadcrumbs":4,"title":2},"123":{"body":15,"breadcrumbs":4,"title":2},"124":{"body":145,"breadcrumbs":4,"title":2},"125":{"body":131,"breadcrumbs":4,"title":2},"126":{"body":15,"breadcrumbs":4,"title":2},"127":{"body":99,"breadcrumbs":4,"title":2},"128":{"body":9,"breadcrumbs":4,"title":2},"129":{"body":21,"breadcrumbs":4,"title":2},"13":{"body":680,"breadcrumbs":9,"title":7},"130":{"body":15,"breadcrumbs":4,"title":2},"131":{"body":27,"breadcrumbs":4,"title":2},"132":{"body":10,"breadcrumbs":4,"title":2},"133":{"body":17,"breadcrumbs":4,"title":2},"134":{"body":15,"breadcrumbs":4,"title":2},"135":{"body":71,"breadcrumbs":4,"title":2},"136":{"body":9,"breadcrumbs":4,"title":2},"137":{"body":9,"breadcrumbs":4,"title":2},"138":{"body":66,"breadcrumbs":4,"title":2},"139":{"body":27,"breadcrumbs":4,"title":2},"14":{"body":191,"breadcrumbs":6,"title":4},"140":{"body":15,"breadcrumbs":4,"title":2},"141":{"body":15,"breadcrumbs":4,"title":2},"142":{"body":56,"breadcrumbs":4,"title":2},"143":{"body":47,"breadcrumbs":4,"title":2},"144":{"body":39,"breadcrumbs":4,"title":2},"145":{"body":9,"breadcrumbs":4,"title":2},"146":{"body":63,"breadcrumbs":4,"title":2},"147":{"body":49,"breadcrumbs":4,"title":2},"148":{"body":15,"breadcrumbs":4,"title":2},"149":{"body":38,"breadcrumbs":4,"title":2},"15":{"body":324,"breadcrumbs":9,"title":7},"150":{"body":45,"breadcrumbs":4,"title":2},"151":{"body":59,"breadcrumbs":4,"title":2},"152":{"body":38,"breadcrumbs":4,"title":2},"153":{"body":39,"breadcrumbs":4,"title":2},"154":{"body":31,"breadcrumbs":4,"title":2},"155":{"body":17,"breadcrumbs":4,"title":2},"156":{"body":114,"breadcrumbs":4,"title":2},"157":{"body":84,"breadcrumbs":4,"title":2},"158":{"body":51,"breadcrumbs":4,"title":2},"159":{"body":33,"breadcrumbs":4,"title":2},"16":{"body":164,"breadcrumbs":6,"title":4},"160":{"body":93,"breadcrumbs":4,"title":2},"161":{"body":140,"breadcrumbs":4,"title":2},"162":{"body":55,"breadcrumbs":4,"title":2},"163":{"body":17,"breadcrumbs":4,"title":2},"164":{"body":44,"breadcrumbs":4,"title":2},"165":{"body":24,"breadcrumbs":4,"title":2},"166":{"body":65,"breadcrumbs":4,"title":2},"167":{"body":49,"breadcrumbs":4,"title":2},"168":{"body":115,"breadcrumbs":4,"title":2},"169":{"body":86,"breadcrumbs":4,"title":2},"17":{"body":3,"breadcrumbs":5,"title":3},"170":{"body":15,"breadcrumbs":4,"title":2},"171":{"body":16,"breadcrumbs":4,"title":2},"172":{"body":38,"breadcrumbs":4,"title":2},"173":{"body":24,"breadcrumbs":4,"title":2},"174":{"body":131,"breadcrumbs":4,"title":2},"175":{"body":24,"breadcrumbs":4,"title":2},"176":{"body":21,"breadcrumbs":4,"title":2},"177":{"body":69,"breadcrumbs":4,"title":2},"178":{"body":77,"breadcrumbs":4,"title":2},"179":{"body":33,"breadcrumbs":4,"title":2},"18":{"body":27,"breadcrumbs":3,"title":1},"180":{"body":10,"breadcrumbs":4,"title":2},"181":{"body":24,"breadcrumbs":4,"title":2},"182":{"body":27,"breadcrumbs":4,"title":2},"183":{"body":9,"breadcrumbs":4,"title":2},"184":{"body":15,"breadcrumbs":4,"title":2},"185":{"body":10,"breadcrumbs":4,"title":2},"186":{"body":51,"breadcrumbs":4,"title":2},"187":{"body":38,"breadcrumbs":4,"title":2},"188":{"body":15,"breadcrumbs":4,"title":2},"189":{"body":9,"breadcrumbs":4,"title":2},"19":{"body":0,"breadcrumbs":4,"title":2},"190":{"body":42,"breadcrumbs":4,"title":2},"191":{"body":24,"breadcrumbs":4,"title":2},"192":{"body":9,"breadcrumbs":4,"title":2},"193":{"body":268,"breadcrumbs":4,"title":2},"194":{"body":17,"breadcrumbs":4,"title":2},"195":{"body":43,"breadcrumbs":4,"title":2},"196":{"body":22,"breadcrumbs":4,"title":2},"197":{"body":17,"breadcrumbs":4,"title":2},"198":{"body":66,"breadcrumbs":4,"title":2},"199":{"body":120,"breadcrumbs":4,"title":2},"2":{"body":1865,"breadcrumbs":5,"title":3},"20":{"body":152,"breadcrumbs":5,"title":3},"200":{"body":51,"breadcrumbs":4,"title":2},"201":{"body":70,"breadcrumbs":4,"title":2},"202":{"body":165,"breadcrumbs":4,"title":2},"203":{"body":63,"breadcrumbs":4,"title":2},"204":{"body":97,"breadcrumbs":4,"title":2},"205":{"body":114,"breadcrumbs":4,"title":2},"206":{"body":45,"breadcrumbs":4,"title":2},"207":{"body":74,"breadcrumbs":4,"title":2},"208":{"body":27,"breadcrumbs":4,"title":2},"209":{"body":9,"breadcrumbs":4,"title":2},"21":{"body":50,"breadcrumbs":5,"title":3},"210":{"body":9,"breadcrumbs":4,"title":2},"211":{"body":9,"breadcrumbs":4,"title":2},"212":{"body":15,"breadcrumbs":4,"title":2},"213":{"body":34,"breadcrumbs":4,"title":2},"214":{"body":17,"breadcrumbs":4,"title":2},"215":{"body":9,"breadcrumbs":4,"title":2},"216":{"body":21,"breadcrumbs":4,"title":2},"217":{"body":54,"breadcrumbs":4,"title":2},"218":{"body":24,"breadcrumbs":4,"title":2},"219":{"body":59,"breadcrumbs":4,"title":2},"22":{"body":378,"breadcrumbs":5,"title":3},"220":{"body":17,"breadcrumbs":4,"title":2},"221":{"body":31,"breadcrumbs":4,"title":2},"222":{"body":9,"breadcrumbs":4,"title":2},"223":{"body":11,"breadcrumbs":4,"title":2},"224":{"body":17,"breadcrumbs":4,"title":2},"225":{"body":313,"breadcrumbs":4,"title":2},"226":{"body":59,"breadcrumbs":4,"title":2},"227":{"body":73,"breadcrumbs":4,"title":2},"228":{"body":66,"breadcrumbs":4,"title":2},"229":{"body":10,"breadcrumbs":4,"title":2},"23":{"body":70,"breadcrumbs":6,"title":4},"230":{"body":9,"breadcrumbs":4,"title":2},"231":{"body":10,"breadcrumbs":4,"title":2},"232":{"body":34,"breadcrumbs":4,"title":2},"233":{"body":114,"breadcrumbs":4,"title":2},"234":{"body":17,"breadcrumbs":4,"title":2},"235":{"body":11,"breadcrumbs":4,"title":2},"236":{"body":19,"breadcrumbs":4,"title":2},"237":{"body":38,"breadcrumbs":4,"title":2},"238":{"body":37,"breadcrumbs":4,"title":2},"239":{"body":10,"breadcrumbs":4,"title":2},"24":{"body":0,"breadcrumbs":4,"title":2},"240":{"body":17,"breadcrumbs":4,"title":2},"241":{"body":10,"breadcrumbs":4,"title":2},"242":{"body":24,"breadcrumbs":4,"title":2},"243":{"body":17,"breadcrumbs":4,"title":2},"244":{"body":17,"breadcrumbs":4,"title":2},"245":{"body":10,"breadcrumbs":4,"title":2},"246":{"body":54,"breadcrumbs":4,"title":2},"247":{"body":16,"breadcrumbs":4,"title":2},"248":{"body":17,"breadcrumbs":4,"title":2},"249":{"body":17,"breadcrumbs":4,"title":2},"25":{"body":22,"breadcrumbs":4,"title":2},"250":{"body":17,"breadcrumbs":4,"title":2},"251":{"body":37,"breadcrumbs":4,"title":2},"252":{"body":30,"breadcrumbs":4,"title":2},"253":{"body":30,"breadcrumbs":4,"title":2},"254":{"body":17,"breadcrumbs":4,"title":2},"255":{"body":10,"breadcrumbs":4,"title":2},"256":{"body":10,"breadcrumbs":4,"title":2},"257":{"body":10,"breadcrumbs":4,"title":2},"258":{"body":10,"breadcrumbs":4,"title":2},"259":{"body":42,"breadcrumbs":4,"title":2},"26":{"body":15,"breadcrumbs":4,"title":2},"260":{"body":23,"breadcrumbs":4,"title":2},"261":{"body":23,"breadcrumbs":4,"title":2},"262":{"body":16,"breadcrumbs":4,"title":2},"263":{"body":29,"breadcrumbs":4,"title":2},"264":{"body":23,"breadcrumbs":4,"title":2},"265":{"body":10,"breadcrumbs":4,"title":2},"266":{"body":22,"breadcrumbs":4,"title":2},"267":{"body":23,"breadcrumbs":4,"title":2},"268":{"body":23,"breadcrumbs":4,"title":2},"269":{"body":72,"breadcrumbs":4,"title":2},"27":{"body":31,"breadcrumbs":4,"title":2},"270":{"body":51,"breadcrumbs":4,"title":2},"271":{"body":24,"breadcrumbs":4,"title":2},"272":{"body":17,"breadcrumbs":4,"title":2},"273":{"body":17,"breadcrumbs":4,"title":2},"274":{"body":304,"breadcrumbs":4,"title":2},"275":{"body":446,"breadcrumbs":4,"title":2},"276":{"body":695,"breadcrumbs":4,"title":2},"277":{"body":29,"breadcrumbs":4,"title":2},"278":{"body":92,"breadcrumbs":4,"title":2},"279":{"body":139,"breadcrumbs":4,"title":2},"28":{"body":10,"breadcrumbs":4,"title":2},"280":{"body":125,"breadcrumbs":4,"title":2},"281":{"body":338,"breadcrumbs":4,"title":2},"282":{"body":87,"breadcrumbs":4,"title":2},"283":{"body":214,"breadcrumbs":4,"title":2},"284":{"body":475,"breadcrumbs":4,"title":2},"285":{"body":140,"breadcrumbs":4,"title":2},"286":{"body":165,"breadcrumbs":4,"title":2},"287":{"body":122,"breadcrumbs":4,"title":2},"288":{"body":522,"breadcrumbs":4,"title":2},"289":{"body":41,"breadcrumbs":4,"title":2},"29":{"body":41,"breadcrumbs":4,"title":2},"290":{"body":137,"breadcrumbs":4,"title":2},"291":{"body":375,"breadcrumbs":4,"title":2},"292":{"body":114,"breadcrumbs":4,"title":2},"293":{"body":112,"breadcrumbs":4,"title":2},"294":{"body":49,"breadcrumbs":4,"title":2},"295":{"body":9,"breadcrumbs":4,"title":2},"296":{"body":9,"breadcrumbs":4,"title":2},"297":{"body":9,"breadcrumbs":4,"title":2},"298":{"body":27,"breadcrumbs":4,"title":2},"299":{"body":62,"breadcrumbs":4,"title":2},"3":{"body":0,"breadcrumbs":5,"title":3},"30":{"body":24,"breadcrumbs":4,"title":2},"300":{"body":9,"breadcrumbs":4,"title":2},"301":{"body":9,"breadcrumbs":4,"title":2},"302":{"body":9,"breadcrumbs":4,"title":2},"303":{"body":16,"breadcrumbs":4,"title":2},"304":{"body":16,"breadcrumbs":4,"title":2},"305":{"body":16,"breadcrumbs":4,"title":2},"306":{"body":9,"breadcrumbs":4,"title":2},"307":{"body":9,"breadcrumbs":4,"title":2},"308":{"body":9,"breadcrumbs":4,"title":2},"309":{"body":15,"breadcrumbs":4,"title":2},"31":{"body":10,"breadcrumbs":4,"title":2},"310":{"body":21,"breadcrumbs":4,"title":2},"311":{"body":15,"breadcrumbs":4,"title":2},"312":{"body":9,"breadcrumbs":4,"title":2},"313":{"body":9,"breadcrumbs":4,"title":2},"314":{"body":9,"breadcrumbs":4,"title":2},"315":{"body":9,"breadcrumbs":4,"title":2},"316":{"body":9,"breadcrumbs":4,"title":2},"317":{"body":21,"breadcrumbs":4,"title":2},"318":{"body":21,"breadcrumbs":4,"title":2},"319":{"body":58,"breadcrumbs":4,"title":2},"32":{"body":16,"breadcrumbs":4,"title":2},"320":{"body":9,"breadcrumbs":4,"title":2},"321":{"body":17,"breadcrumbs":4,"title":2},"322":{"body":15,"breadcrumbs":4,"title":2},"323":{"body":9,"breadcrumbs":4,"title":2},"324":{"body":9,"breadcrumbs":4,"title":2},"325":{"body":9,"breadcrumbs":4,"title":2},"326":{"body":9,"breadcrumbs":4,"title":2},"327":{"body":9,"breadcrumbs":4,"title":2},"328":{"body":9,"breadcrumbs":4,"title":2},"329":{"body":9,"breadcrumbs":4,"title":2},"33":{"body":24,"breadcrumbs":4,"title":2},"330":{"body":9,"breadcrumbs":4,"title":2},"331":{"body":9,"breadcrumbs":4,"title":2},"332":{"body":9,"breadcrumbs":4,"title":2},"333":{"body":15,"breadcrumbs":4,"title":2},"334":{"body":9,"breadcrumbs":4,"title":2},"335":{"body":9,"breadcrumbs":4,"title":2},"336":{"body":9,"breadcrumbs":4,"title":2},"337":{"body":45,"breadcrumbs":4,"title":2},"338":{"body":37,"breadcrumbs":4,"title":2},"339":{"body":286,"breadcrumbs":4,"title":2},"34":{"body":69,"breadcrumbs":4,"title":2},"340":{"body":29,"breadcrumbs":3,"title":1},"341":{"body":9,"breadcrumbs":4,"title":2},"342":{"body":9,"breadcrumbs":4,"title":2},"343":{"body":30,"breadcrumbs":4,"title":2},"344":{"body":59,"breadcrumbs":4,"title":2},"345":{"body":15,"breadcrumbs":4,"title":2},"346":{"body":107,"breadcrumbs":4,"title":2},"347":{"body":17,"breadcrumbs":4,"title":2},"348":{"body":10,"breadcrumbs":4,"title":2},"349":{"body":23,"breadcrumbs":4,"title":2},"35":{"body":10,"breadcrumbs":4,"title":2},"350":{"body":16,"breadcrumbs":4,"title":2},"351":{"body":149,"breadcrumbs":4,"title":2},"352":{"body":60,"breadcrumbs":4,"title":2},"353":{"body":448,"breadcrumbs":4,"title":2},"354":{"body":42,"breadcrumbs":4,"title":2},"355":{"body":328,"breadcrumbs":4,"title":2},"356":{"body":10,"breadcrumbs":3,"title":1},"357":{"body":10,"breadcrumbs":3,"title":1},"358":{"body":10,"breadcrumbs":3,"title":1},"359":{"body":12,"breadcrumbs":4,"title":2},"36":{"body":118,"breadcrumbs":4,"title":2},"360":{"body":12,"breadcrumbs":4,"title":2},"361":{"body":12,"breadcrumbs":4,"title":2},"362":{"body":13,"breadcrumbs":4,"title":2},"363":{"body":17,"breadcrumbs":4,"title":2},"364":{"body":10,"breadcrumbs":4,"title":2},"365":{"body":10,"breadcrumbs":4,"title":2},"366":{"body":10,"breadcrumbs":4,"title":2},"367":{"body":10,"breadcrumbs":4,"title":2},"368":{"body":10,"breadcrumbs":4,"title":2},"369":{"body":10,"breadcrumbs":4,"title":2},"37":{"body":23,"breadcrumbs":4,"title":2},"370":{"body":10,"breadcrumbs":4,"title":2},"371":{"body":10,"breadcrumbs":4,"title":2},"372":{"body":24,"breadcrumbs":4,"title":2},"373":{"body":10,"breadcrumbs":4,"title":2},"374":{"body":10,"breadcrumbs":4,"title":2},"375":{"body":10,"breadcrumbs":4,"title":2},"376":{"body":10,"breadcrumbs":4,"title":2},"377":{"body":10,"breadcrumbs":4,"title":2},"378":{"body":10,"breadcrumbs":4,"title":2},"379":{"body":10,"breadcrumbs":4,"title":2},"38":{"body":36,"breadcrumbs":4,"title":2},"380":{"body":10,"breadcrumbs":4,"title":2},"381":{"body":10,"breadcrumbs":4,"title":2},"382":{"body":10,"breadcrumbs":4,"title":2},"383":{"body":10,"breadcrumbs":4,"title":2},"384":{"body":10,"breadcrumbs":4,"title":2},"385":{"body":24,"breadcrumbs":4,"title":2},"386":{"body":45,"breadcrumbs":4,"title":2},"387":{"body":31,"breadcrumbs":4,"title":2},"388":{"body":17,"breadcrumbs":4,"title":2},"389":{"body":58,"breadcrumbs":4,"title":2},"39":{"body":59,"breadcrumbs":4,"title":2},"390":{"body":44,"breadcrumbs":4,"title":2},"391":{"body":17,"breadcrumbs":4,"title":2},"392":{"body":10,"breadcrumbs":4,"title":2},"393":{"body":10,"breadcrumbs":4,"title":2},"394":{"body":24,"breadcrumbs":4,"title":2},"395":{"body":17,"breadcrumbs":4,"title":2},"396":{"body":17,"breadcrumbs":4,"title":2},"397":{"body":17,"breadcrumbs":4,"title":2},"398":{"body":30,"breadcrumbs":4,"title":2},"399":{"body":17,"breadcrumbs":4,"title":2},"4":{"body":788,"breadcrumbs":5,"title":3},"40":{"body":10,"breadcrumbs":4,"title":2},"400":{"body":24,"breadcrumbs":4,"title":2},"401":{"body":9,"breadcrumbs":4,"title":2},"402":{"body":51,"breadcrumbs":4,"title":2},"403":{"body":58,"breadcrumbs":4,"title":2},"404":{"body":158,"breadcrumbs":4,"title":2},"405":{"body":125,"breadcrumbs":4,"title":2},"406":{"body":77,"breadcrumbs":4,"title":2},"407":{"body":33,"breadcrumbs":4,"title":2},"408":{"body":15,"breadcrumbs":4,"title":2},"409":{"body":17,"breadcrumbs":4,"title":2},"41":{"body":31,"breadcrumbs":4,"title":2},"410":{"body":52,"breadcrumbs":4,"title":2},"411":{"body":49,"breadcrumbs":4,"title":2},"412":{"body":37,"breadcrumbs":4,"title":2},"413":{"body":27,"breadcrumbs":4,"title":2},"414":{"body":9,"breadcrumbs":4,"title":2},"415":{"body":17,"breadcrumbs":4,"title":2},"416":{"body":10,"breadcrumbs":4,"title":2},"417":{"body":10,"breadcrumbs":4,"title":2},"418":{"body":39,"breadcrumbs":4,"title":2},"419":{"body":15,"breadcrumbs":4,"title":2},"42":{"body":10,"breadcrumbs":4,"title":2},"420":{"body":157,"breadcrumbs":4,"title":2},"421":{"body":9,"breadcrumbs":4,"title":2},"422":{"body":69,"breadcrumbs":4,"title":2},"423":{"body":63,"breadcrumbs":4,"title":2},"424":{"body":178,"breadcrumbs":4,"title":2},"425":{"body":87,"breadcrumbs":4,"title":2},"426":{"body":176,"breadcrumbs":4,"title":2},"427":{"body":85,"breadcrumbs":4,"title":2},"428":{"body":313,"breadcrumbs":4,"title":2},"429":{"body":108,"breadcrumbs":4,"title":2},"43":{"body":64,"breadcrumbs":4,"title":2},"430":{"body":37,"breadcrumbs":4,"title":2},"431":{"body":23,"breadcrumbs":4,"title":2},"432":{"body":9,"breadcrumbs":4,"title":2},"433":{"body":165,"breadcrumbs":4,"title":2},"434":{"body":15,"breadcrumbs":4,"title":2},"435":{"body":45,"breadcrumbs":4,"title":2},"436":{"body":69,"breadcrumbs":4,"title":2},"437":{"body":15,"breadcrumbs":4,"title":2},"438":{"body":27,"breadcrumbs":4,"title":2},"439":{"body":21,"breadcrumbs":4,"title":2},"44":{"body":15,"breadcrumbs":4,"title":2},"440":{"body":21,"breadcrumbs":4,"title":2},"441":{"body":51,"breadcrumbs":4,"title":2},"442":{"body":9,"breadcrumbs":4,"title":2},"443":{"body":15,"breadcrumbs":4,"title":2},"444":{"body":15,"breadcrumbs":4,"title":2},"445":{"body":9,"breadcrumbs":4,"title":2},"446":{"body":34,"breadcrumbs":4,"title":2},"447":{"body":9,"breadcrumbs":4,"title":2},"448":{"body":73,"breadcrumbs":4,"title":2},"449":{"body":9,"breadcrumbs":4,"title":2},"45":{"body":9,"breadcrumbs":4,"title":2},"450":{"body":15,"breadcrumbs":4,"title":2},"451":{"body":105,"breadcrumbs":4,"title":2},"452":{"body":15,"breadcrumbs":4,"title":2},"453":{"body":149,"breadcrumbs":4,"title":2},"454":{"body":73,"breadcrumbs":4,"title":2},"455":{"body":9,"breadcrumbs":4,"title":2},"456":{"body":52,"breadcrumbs":4,"title":2},"457":{"body":9,"breadcrumbs":4,"title":2},"458":{"body":28,"breadcrumbs":4,"title":2},"459":{"body":15,"breadcrumbs":4,"title":2},"46":{"body":10,"breadcrumbs":4,"title":2},"460":{"body":66,"breadcrumbs":4,"title":2},"461":{"body":9,"breadcrumbs":4,"title":2},"462":{"body":87,"breadcrumbs":4,"title":2},"463":{"body":10,"breadcrumbs":4,"title":2},"464":{"body":10,"breadcrumbs":3,"title":1},"465":{"body":20,"breadcrumbs":4,"title":2},"466":{"body":20,"breadcrumbs":4,"title":2},"467":{"body":20,"breadcrumbs":4,"title":2},"468":{"body":20,"breadcrumbs":4,"title":2},"469":{"body":20,"breadcrumbs":4,"title":2},"47":{"body":10,"breadcrumbs":4,"title":2},"470":{"body":20,"breadcrumbs":4,"title":2},"471":{"body":20,"breadcrumbs":4,"title":2},"472":{"body":20,"breadcrumbs":4,"title":2},"473":{"body":20,"breadcrumbs":4,"title":2},"474":{"body":20,"breadcrumbs":4,"title":2},"475":{"body":20,"breadcrumbs":4,"title":2},"476":{"body":10,"breadcrumbs":4,"title":2},"477":{"body":10,"breadcrumbs":4,"title":2},"478":{"body":10,"breadcrumbs":4,"title":2},"479":{"body":10,"breadcrumbs":4,"title":2},"48":{"body":17,"breadcrumbs":4,"title":2},"480":{"body":10,"breadcrumbs":4,"title":2},"481":{"body":45,"breadcrumbs":4,"title":2},"482":{"body":17,"breadcrumbs":4,"title":2},"483":{"body":17,"breadcrumbs":4,"title":2},"484":{"body":80,"breadcrumbs":4,"title":2},"485":{"body":24,"breadcrumbs":4,"title":2},"486":{"body":17,"breadcrumbs":4,"title":2},"487":{"body":80,"breadcrumbs":4,"title":2},"488":{"body":21,"breadcrumbs":4,"title":2},"489":{"body":10,"breadcrumbs":4,"title":2},"49":{"body":15,"breadcrumbs":4,"title":2},"490":{"body":24,"breadcrumbs":4,"title":2},"491":{"body":10,"breadcrumbs":4,"title":2},"492":{"body":31,"breadcrumbs":4,"title":2},"493":{"body":17,"breadcrumbs":4,"title":2},"494":{"body":24,"breadcrumbs":4,"title":2},"495":{"body":31,"breadcrumbs":4,"title":2},"496":{"body":24,"breadcrumbs":4,"title":2},"497":{"body":31,"breadcrumbs":4,"title":2},"498":{"body":10,"breadcrumbs":4,"title":2},"499":{"body":10,"breadcrumbs":4,"title":2},"5":{"body":378,"breadcrumbs":6,"title":4},"50":{"body":110,"breadcrumbs":4,"title":2},"500":{"body":10,"breadcrumbs":4,"title":2},"501":{"body":52,"breadcrumbs":4,"title":2},"502":{"body":17,"breadcrumbs":4,"title":2},"503":{"body":24,"breadcrumbs":4,"title":2},"504":{"body":38,"breadcrumbs":4,"title":2},"505":{"body":24,"breadcrumbs":4,"title":2},"506":{"body":48,"breadcrumbs":4,"title":2},"507":{"body":24,"breadcrumbs":4,"title":2},"508":{"body":31,"breadcrumbs":4,"title":2},"509":{"body":24,"breadcrumbs":4,"title":2},"51":{"body":20,"breadcrumbs":4,"title":2},"510":{"body":17,"breadcrumbs":4,"title":2},"511":{"body":17,"breadcrumbs":4,"title":2},"512":{"body":11,"breadcrumbs":4,"title":2},"513":{"body":10,"breadcrumbs":4,"title":2},"514":{"body":10,"breadcrumbs":4,"title":2},"515":{"body":15,"breadcrumbs":4,"title":2},"516":{"body":12,"breadcrumbs":4,"title":2},"517":{"body":10,"breadcrumbs":4,"title":2},"518":{"body":17,"breadcrumbs":4,"title":2},"519":{"body":19,"breadcrumbs":4,"title":2},"52":{"body":18,"breadcrumbs":4,"title":2},"520":{"body":73,"breadcrumbs":4,"title":2},"521":{"body":73,"breadcrumbs":4,"title":2},"522":{"body":10,"breadcrumbs":4,"title":2},"523":{"body":10,"breadcrumbs":4,"title":2},"524":{"body":59,"breadcrumbs":4,"title":2},"525":{"body":10,"breadcrumbs":4,"title":2},"526":{"body":8,"breadcrumbs":6,"title":4},"527":{"body":27,"breadcrumbs":3,"title":1},"528":{"body":65,"breadcrumbs":5,"title":3},"529":{"body":0,"breadcrumbs":4,"title":2},"53":{"body":111,"breadcrumbs":4,"title":2},"530":{"body":20,"breadcrumbs":5,"title":3},"531":{"body":185,"breadcrumbs":5,"title":3},"532":{"body":69,"breadcrumbs":6,"title":4},"533":{"body":18,"breadcrumbs":6,"title":4},"534":{"body":9,"breadcrumbs":6,"title":4},"535":{"body":11,"breadcrumbs":4,"title":2},"536":{"body":10,"breadcrumbs":4,"title":2},"537":{"body":13,"breadcrumbs":4,"title":2},"538":{"body":61,"breadcrumbs":4,"title":2},"539":{"body":0,"breadcrumbs":4,"title":2},"54":{"body":104,"breadcrumbs":4,"title":2},"540":{"body":13,"breadcrumbs":5,"title":3},"541":{"body":20,"breadcrumbs":4,"title":2},"542":{"body":34,"breadcrumbs":4,"title":2},"543":{"body":0,"breadcrumbs":4,"title":2},"544":{"body":21,"breadcrumbs":5,"title":3},"545":{"body":16,"breadcrumbs":3,"title":1},"546":{"body":0,"breadcrumbs":4,"title":2},"547":{"body":37,"breadcrumbs":4,"title":2},"548":{"body":36,"breadcrumbs":3,"title":1},"549":{"body":0,"breadcrumbs":4,"title":2},"55":{"body":15,"breadcrumbs":4,"title":2},"550":{"body":14,"breadcrumbs":6,"title":4},"551":{"body":17,"breadcrumbs":6,"title":4},"552":{"body":15,"breadcrumbs":6,"title":4},"553":{"body":14,"breadcrumbs":6,"title":4},"554":{"body":27,"breadcrumbs":5,"title":3},"555":{"body":0,"breadcrumbs":3,"title":1},"556":{"body":23,"breadcrumbs":6,"title":4},"557":{"body":26,"breadcrumbs":6,"title":4},"558":{"body":21,"breadcrumbs":5,"title":3},"559":{"body":0,"breadcrumbs":4,"title":2},"56":{"body":57,"breadcrumbs":4,"title":2},"560":{"body":19,"breadcrumbs":4,"title":2},"561":{"body":15,"breadcrumbs":3,"title":1},"562":{"body":22,"breadcrumbs":4,"title":2},"563":{"body":10,"breadcrumbs":3,"title":1},"564":{"body":23,"breadcrumbs":3,"title":1},"565":{"body":0,"breadcrumbs":7,"title":4},"566":{"body":17,"breadcrumbs":4,"title":1},"567":{"body":0,"breadcrumbs":5,"title":2},"568":{"body":24,"breadcrumbs":4,"title":1},"569":{"body":11,"breadcrumbs":4,"title":1},"57":{"body":77,"breadcrumbs":4,"title":2},"570":{"body":18,"breadcrumbs":4,"title":1},"571":{"body":49,"breadcrumbs":5,"title":2},"572":{"body":16,"breadcrumbs":5,"title":2},"573":{"body":0,"breadcrumbs":5,"title":2},"574":{"body":16,"breadcrumbs":7,"title":4},"575":{"body":14,"breadcrumbs":7,"title":4},"576":{"body":12,"breadcrumbs":7,"title":4},"577":{"body":0,"breadcrumbs":5,"title":2},"578":{"body":5,"breadcrumbs":5,"title":2},"579":{"body":9,"breadcrumbs":7,"title":4},"58":{"body":9,"breadcrumbs":4,"title":2},"580":{"body":9,"breadcrumbs":5,"title":2},"581":{"body":8,"breadcrumbs":5,"title":2},"582":{"body":14,"breadcrumbs":4,"title":1},"583":{"body":0,"breadcrumbs":4,"title":1},"584":{"body":23,"breadcrumbs":5,"title":2},"585":{"body":19,"breadcrumbs":5,"title":2},"586":{"body":26,"breadcrumbs":5,"title":2},"587":{"body":0,"breadcrumbs":5,"title":2},"588":{"body":20,"breadcrumbs":6,"title":3},"589":{"body":13,"breadcrumbs":5,"title":2},"59":{"body":60,"breadcrumbs":4,"title":2},"590":{"body":13,"breadcrumbs":6,"title":3},"591":{"body":56,"breadcrumbs":4,"title":1},"592":{"body":29,"breadcrumbs":4,"title":1},"593":{"body":18,"breadcrumbs":4,"title":3},"594":{"body":18,"breadcrumbs":3,"title":2},"595":{"body":340,"breadcrumbs":3,"title":2},"596":{"body":243,"breadcrumbs":3,"title":2},"597":{"body":362,"breadcrumbs":4,"title":3},"598":{"body":138,"breadcrumbs":4,"title":3},"599":{"body":3,"breadcrumbs":6,"title":3},"6":{"body":16599,"breadcrumbs":5,"title":3},"60":{"body":55,"breadcrumbs":4,"title":2},"600":{"body":502,"breadcrumbs":7,"title":4},"601":{"body":122,"breadcrumbs":9,"title":6},"602":{"body":224,"breadcrumbs":7,"title":4},"603":{"body":71,"breadcrumbs":6,"title":3},"604":{"body":74,"breadcrumbs":5,"title":2},"605":{"body":50,"breadcrumbs":5,"title":2},"606":{"body":80,"breadcrumbs":4,"title":1},"607":{"body":156,"breadcrumbs":4,"title":1},"608":{"body":82,"breadcrumbs":6,"title":3},"609":{"body":77,"breadcrumbs":5,"title":2},"61":{"body":44,"breadcrumbs":4,"title":2},"610":{"body":231,"breadcrumbs":5,"title":2},"611":{"body":62,"breadcrumbs":6,"title":3},"612":{"body":14,"breadcrumbs":7,"title":4},"613":{"body":119,"breadcrumbs":7,"title":4},"614":{"body":92,"breadcrumbs":5,"title":2},"615":{"body":100,"breadcrumbs":6,"title":3},"616":{"body":50,"breadcrumbs":5,"title":2},"617":{"body":74,"breadcrumbs":5,"title":2},"618":{"body":0,"breadcrumbs":6,"title":3},"619":{"body":49,"breadcrumbs":5,"title":2},"62":{"body":28,"breadcrumbs":4,"title":2},"620":{"body":222,"breadcrumbs":6,"title":3},"621":{"body":198,"breadcrumbs":6,"title":3},"622":{"body":225,"breadcrumbs":7,"title":4},"623":{"body":157,"breadcrumbs":6,"title":3},"624":{"body":175,"breadcrumbs":6,"title":3},"625":{"body":106,"breadcrumbs":5,"title":2},"626":{"body":97,"breadcrumbs":5,"title":2},"627":{"body":284,"breadcrumbs":6,"title":3},"628":{"body":214,"breadcrumbs":7,"title":4},"629":{"body":75,"breadcrumbs":7,"title":4},"63":{"body":34,"breadcrumbs":4,"title":2},"630":{"body":161,"breadcrumbs":6,"title":3},"631":{"body":48,"breadcrumbs":6,"title":3},"632":{"body":64,"breadcrumbs":5,"title":2},"633":{"body":36,"breadcrumbs":7,"title":4},"634":{"body":76,"breadcrumbs":4,"title":1},"635":{"body":97,"breadcrumbs":5,"title":2},"636":{"body":114,"breadcrumbs":6,"title":3},"637":{"body":73,"breadcrumbs":5,"title":2},"638":{"body":91,"breadcrumbs":6,"title":3},"639":{"body":89,"breadcrumbs":6,"title":3},"64":{"body":22,"breadcrumbs":4,"title":2},"640":{"body":69,"breadcrumbs":4,"title":1},"641":{"body":0,"breadcrumbs":5,"title":2},"642":{"body":170,"breadcrumbs":8,"title":5},"643":{"body":238,"breadcrumbs":7,"title":4},"644":{"body":81,"breadcrumbs":6,"title":3},"645":{"body":81,"breadcrumbs":7,"title":4},"646":{"body":28,"breadcrumbs":6,"title":3},"647":{"body":121,"breadcrumbs":6,"title":3},"648":{"body":0,"breadcrumbs":8,"title":4},"649":{"body":70,"breadcrumbs":7,"title":3},"65":{"body":22,"breadcrumbs":4,"title":2},"650":{"body":28,"breadcrumbs":6,"title":2},"651":{"body":142,"breadcrumbs":10,"title":6},"652":{"body":39,"breadcrumbs":8,"title":4},"653":{"body":29,"breadcrumbs":6,"title":2},"654":{"body":0,"breadcrumbs":7,"title":4},"655":{"body":210,"breadcrumbs":6,"title":3},"656":{"body":164,"breadcrumbs":9,"title":6},"657":{"body":140,"breadcrumbs":5,"title":2},"658":{"body":127,"breadcrumbs":5,"title":2},"659":{"body":160,"breadcrumbs":6,"title":3},"66":{"body":10,"breadcrumbs":4,"title":2},"660":{"body":98,"breadcrumbs":6,"title":3},"661":{"body":306,"breadcrumbs":7,"title":4},"662":{"body":257,"breadcrumbs":7,"title":4},"663":{"body":316,"breadcrumbs":8,"title":5},"664":{"body":255,"breadcrumbs":7,"title":4},"665":{"body":36,"breadcrumbs":5,"title":2},"666":{"body":0,"breadcrumbs":7,"title":4},"667":{"body":68,"breadcrumbs":4,"title":1},"668":{"body":145,"breadcrumbs":5,"title":2},"669":{"body":115,"breadcrumbs":6,"title":3},"67":{"body":67,"breadcrumbs":4,"title":2},"670":{"body":122,"breadcrumbs":9,"title":6},"671":{"body":84,"breadcrumbs":6,"title":3},"672":{"body":85,"breadcrumbs":5,"title":2},"673":{"body":21,"breadcrumbs":5,"title":2},"674":{"body":35,"breadcrumbs":5,"title":2},"675":{"body":78,"breadcrumbs":6,"title":3},"676":{"body":56,"breadcrumbs":6,"title":3},"677":{"body":68,"breadcrumbs":5,"title":2},"678":{"body":0,"breadcrumbs":5,"title":3},"679":{"body":100,"breadcrumbs":6,"title":4},"68":{"body":28,"breadcrumbs":4,"title":2},"680":{"body":28,"breadcrumbs":4,"title":2},"681":{"body":84,"breadcrumbs":6,"title":4},"682":{"body":55,"breadcrumbs":9,"title":7},"683":{"body":167,"breadcrumbs":5,"title":3},"684":{"body":109,"breadcrumbs":5,"title":3},"685":{"body":0,"breadcrumbs":6,"title":3},"686":{"body":256,"breadcrumbs":6,"title":3},"687":{"body":0,"breadcrumbs":5,"title":2},"688":{"body":35,"breadcrumbs":4,"title":1},"689":{"body":49,"breadcrumbs":4,"title":1},"69":{"body":10,"breadcrumbs":4,"title":2},"690":{"body":48,"breadcrumbs":4,"title":1},"691":{"body":247,"breadcrumbs":4,"title":1},"692":{"body":53,"breadcrumbs":4,"title":1},"693":{"body":99,"breadcrumbs":4,"title":1},"694":{"body":88,"breadcrumbs":4,"title":1},"695":{"body":66,"breadcrumbs":4,"title":1},"696":{"body":52,"breadcrumbs":4,"title":1},"697":{"body":76,"breadcrumbs":6,"title":3},"698":{"body":0,"breadcrumbs":5,"title":2},"699":{"body":20,"breadcrumbs":7,"title":4},"7":{"body":0,"breadcrumbs":5,"title":3},"70":{"body":98,"breadcrumbs":4,"title":2},"700":{"body":19,"breadcrumbs":6,"title":3},"701":{"body":11,"breadcrumbs":5,"title":2},"702":{"body":38,"breadcrumbs":6,"title":3},"703":{"body":27,"breadcrumbs":6,"title":3},"704":{"body":0,"breadcrumbs":5,"title":2},"705":{"body":31,"breadcrumbs":5,"title":2},"706":{"body":23,"breadcrumbs":5,"title":2},"707":{"body":23,"breadcrumbs":5,"title":2},"708":{"body":56,"breadcrumbs":5,"title":2},"709":{"body":46,"breadcrumbs":6,"title":3},"71":{"body":93,"breadcrumbs":4,"title":2},"710":{"body":0,"breadcrumbs":3,"title":1},"711":{"body":70,"breadcrumbs":5,"title":3},"712":{"body":44,"breadcrumbs":5,"title":3},"713":{"body":77,"breadcrumbs":4,"title":2},"714":{"body":404,"breadcrumbs":6,"title":4},"715":{"body":60,"breadcrumbs":5,"title":3},"716":{"body":22,"breadcrumbs":5,"title":3},"717":{"body":19,"breadcrumbs":6,"title":4},"718":{"body":87,"breadcrumbs":5,"title":3},"719":{"body":51,"breadcrumbs":5,"title":3},"72":{"body":10,"breadcrumbs":4,"title":2},"720":{"body":57,"breadcrumbs":4,"title":2},"721":{"body":11,"breadcrumbs":7,"title":5},"722":{"body":0,"breadcrumbs":6,"title":4},"723":{"body":111,"breadcrumbs":5,"title":3},"724":{"body":110,"breadcrumbs":5,"title":3},"725":{"body":56,"breadcrumbs":5,"title":3},"726":{"body":41,"breadcrumbs":5,"title":3},"727":{"body":0,"breadcrumbs":7,"title":5},"728":{"body":86,"breadcrumbs":6,"title":4},"729":{"body":61,"breadcrumbs":5,"title":3},"73":{"body":41,"breadcrumbs":4,"title":2},"730":{"body":0,"breadcrumbs":6,"title":4},"731":{"body":190,"breadcrumbs":6,"title":4},"732":{"body":97,"breadcrumbs":7,"title":5},"733":{"body":119,"breadcrumbs":7,"title":5},"734":{"body":0,"breadcrumbs":6,"title":4},"735":{"body":79,"breadcrumbs":6,"title":4},"736":{"body":138,"breadcrumbs":12,"title":10},"737":{"body":86,"breadcrumbs":6,"title":4},"738":{"body":0,"breadcrumbs":7,"title":5},"739":{"body":52,"breadcrumbs":7,"title":5},"74":{"body":16,"breadcrumbs":4,"title":2},"740":{"body":89,"breadcrumbs":6,"title":4},"741":{"body":46,"breadcrumbs":5,"title":3},"742":{"body":19,"breadcrumbs":6,"title":4},"743":{"body":87,"breadcrumbs":8,"title":6},"744":{"body":113,"breadcrumbs":6,"title":4},"745":{"body":73,"breadcrumbs":5,"title":3},"746":{"body":36,"breadcrumbs":5,"title":3},"747":{"body":26,"breadcrumbs":7,"title":5},"748":{"body":85,"breadcrumbs":5,"title":3},"749":{"body":188,"breadcrumbs":8,"title":6},"75":{"body":129,"breadcrumbs":4,"title":2},"750":{"body":23,"breadcrumbs":7,"title":5},"751":{"body":183,"breadcrumbs":7,"title":5},"752":{"body":187,"breadcrumbs":11,"title":9},"753":{"body":27,"breadcrumbs":4,"title":2},"754":{"body":133,"breadcrumbs":7,"title":5},"755":{"body":168,"breadcrumbs":7,"title":5},"756":{"body":31,"breadcrumbs":8,"title":6},"757":{"body":47,"breadcrumbs":4,"title":2},"758":{"body":70,"breadcrumbs":5,"title":3},"759":{"body":30,"breadcrumbs":5,"title":3},"76":{"body":82,"breadcrumbs":4,"title":2},"760":{"body":146,"breadcrumbs":6,"title":4},"761":{"body":70,"breadcrumbs":6,"title":4},"762":{"body":210,"breadcrumbs":8,"title":6},"763":{"body":60,"breadcrumbs":5,"title":3},"764":{"body":0,"breadcrumbs":5,"title":3},"765":{"body":88,"breadcrumbs":5,"title":3},"766":{"body":200,"breadcrumbs":9,"title":7},"767":{"body":286,"breadcrumbs":6,"title":4},"768":{"body":75,"breadcrumbs":6,"title":4},"769":{"body":39,"breadcrumbs":6,"title":4},"77":{"body":130,"breadcrumbs":4,"title":2},"770":{"body":96,"breadcrumbs":5,"title":3},"771":{"body":0,"breadcrumbs":6,"title":4},"772":{"body":144,"breadcrumbs":5,"title":3},"773":{"body":63,"breadcrumbs":5,"title":3},"774":{"body":0,"breadcrumbs":7,"title":5},"775":{"body":69,"breadcrumbs":7,"title":5},"776":{"body":237,"breadcrumbs":10,"title":8},"777":{"body":0,"breadcrumbs":7,"title":5},"778":{"body":44,"breadcrumbs":7,"title":5},"779":{"body":27,"breadcrumbs":5,"title":3},"78":{"body":9,"breadcrumbs":4,"title":2},"780":{"body":44,"breadcrumbs":5,"title":3},"781":{"body":0,"breadcrumbs":7,"title":5},"782":{"body":65,"breadcrumbs":5,"title":3},"783":{"body":48,"breadcrumbs":6,"title":4},"784":{"body":0,"breadcrumbs":6,"title":4},"785":{"body":81,"breadcrumbs":5,"title":3},"786":{"body":37,"breadcrumbs":5,"title":3},"787":{"body":35,"breadcrumbs":6,"title":4},"788":{"body":0,"breadcrumbs":6,"title":4},"789":{"body":83,"breadcrumbs":5,"title":3},"79":{"body":15,"breadcrumbs":4,"title":2},"790":{"body":25,"breadcrumbs":5,"title":3},"791":{"body":15,"breadcrumbs":4,"title":2},"792":{"body":105,"breadcrumbs":4,"title":2},"793":{"body":70,"breadcrumbs":4,"title":2},"794":{"body":96,"breadcrumbs":3,"title":1},"795":{"body":43,"breadcrumbs":4,"title":2},"796":{"body":144,"breadcrumbs":5,"title":3},"797":{"body":9,"breadcrumbs":3,"title":1},"798":{"body":0,"breadcrumbs":3,"title":1},"799":{"body":0,"breadcrumbs":3,"title":1},"8":{"body":710,"breadcrumbs":6,"title":4},"80":{"body":17,"breadcrumbs":4,"title":2},"800":{"body":6,"breadcrumbs":4,"title":2},"801":{"body":0,"breadcrumbs":3,"title":1},"802":{"body":0,"breadcrumbs":4,"title":2},"803":{"body":38,"breadcrumbs":4,"title":2},"804":{"body":0,"breadcrumbs":3,"title":1},"805":{"body":0,"breadcrumbs":3,"title":1},"806":{"body":0,"breadcrumbs":4,"title":2},"807":{"body":57,"breadcrumbs":6,"title":3},"808":{"body":123,"breadcrumbs":6,"title":3},"809":{"body":53,"breadcrumbs":5,"title":2},"81":{"body":52,"breadcrumbs":4,"title":2},"810":{"body":27,"breadcrumbs":5,"title":2},"811":{"body":57,"breadcrumbs":4,"title":1},"812":{"body":58,"breadcrumbs":5,"title":2},"813":{"body":45,"breadcrumbs":9,"title":6},"814":{"body":45,"breadcrumbs":4,"title":1},"815":{"body":45,"breadcrumbs":4,"title":1},"816":{"body":0,"breadcrumbs":4,"title":1},"817":{"body":85,"breadcrumbs":8,"title":5},"818":{"body":226,"breadcrumbs":9,"title":6},"819":{"body":113,"breadcrumbs":8,"title":5},"82":{"body":87,"breadcrumbs":4,"title":2},"820":{"body":46,"breadcrumbs":8,"title":5},"821":{"body":69,"breadcrumbs":7,"title":4},"822":{"body":63,"breadcrumbs":9,"title":6},"823":{"body":109,"breadcrumbs":7,"title":4},"824":{"body":67,"breadcrumbs":4,"title":1},"825":{"body":89,"breadcrumbs":6,"title":3},"826":{"body":33,"breadcrumbs":5,"title":2},"827":{"body":13,"breadcrumbs":5,"title":2},"828":{"body":23,"breadcrumbs":5,"title":2},"829":{"body":2,"breadcrumbs":4,"title":1},"83":{"body":77,"breadcrumbs":4,"title":2},"830":{"body":12,"breadcrumbs":4,"title":1},"831":{"body":35,"breadcrumbs":5,"title":2},"832":{"body":98,"breadcrumbs":11,"title":7},"833":{"body":56,"breadcrumbs":5,"title":1},"834":{"body":198,"breadcrumbs":5,"title":1},"835":{"body":93,"breadcrumbs":8,"title":4},"836":{"body":161,"breadcrumbs":6,"title":2},"837":{"body":7,"breadcrumbs":5,"title":1},"838":{"body":71,"breadcrumbs":6,"title":2},"839":{"body":54,"breadcrumbs":5,"title":1},"84":{"body":82,"breadcrumbs":4,"title":2},"840":{"body":19,"breadcrumbs":5,"title":1},"841":{"body":135,"breadcrumbs":5,"title":1},"842":{"body":18,"breadcrumbs":6,"title":2},"843":{"body":197,"breadcrumbs":8,"title":4},"844":{"body":127,"breadcrumbs":10,"title":6},"845":{"body":157,"breadcrumbs":9,"title":5},"846":{"body":423,"breadcrumbs":6,"title":2},"847":{"body":41,"breadcrumbs":6,"title":2},"848":{"body":142,"breadcrumbs":7,"title":3},"849":{"body":151,"breadcrumbs":6,"title":2},"85":{"body":51,"breadcrumbs":4,"title":2},"850":{"body":133,"breadcrumbs":6,"title":2},"851":{"body":61,"breadcrumbs":5,"title":1},"852":{"body":14,"breadcrumbs":5,"title":1},"853":{"body":96,"breadcrumbs":6,"title":2},"854":{"body":89,"breadcrumbs":9,"title":5},"855":{"body":49,"breadcrumbs":5,"title":1},"856":{"body":137,"breadcrumbs":5,"title":1},"857":{"body":77,"breadcrumbs":6,"title":2},"858":{"body":164,"breadcrumbs":6,"title":2},"859":{"body":69,"breadcrumbs":5,"title":1},"86":{"body":22,"breadcrumbs":4,"title":2},"860":{"body":0,"breadcrumbs":5,"title":1},"861":{"body":97,"breadcrumbs":5,"title":1},"862":{"body":61,"breadcrumbs":6,"title":2},"863":{"body":97,"breadcrumbs":5,"title":1},"864":{"body":49,"breadcrumbs":6,"title":2},"865":{"body":92,"breadcrumbs":6,"title":2},"866":{"body":60,"breadcrumbs":5,"title":1},"867":{"body":45,"breadcrumbs":5,"title":1},"868":{"body":56,"breadcrumbs":6,"title":2},"869":{"body":61,"breadcrumbs":8,"title":5},"87":{"body":16,"breadcrumbs":4,"title":2},"870":{"body":50,"breadcrumbs":4,"title":1},"871":{"body":193,"breadcrumbs":4,"title":1},"872":{"body":119,"breadcrumbs":5,"title":2},"873":{"body":0,"breadcrumbs":4,"title":1},"874":{"body":51,"breadcrumbs":8,"title":5},"875":{"body":37,"breadcrumbs":9,"title":6},"876":{"body":79,"breadcrumbs":6,"title":3},"877":{"body":75,"breadcrumbs":10,"title":7},"878":{"body":42,"breadcrumbs":5,"title":2},"879":{"body":131,"breadcrumbs":5,"title":2},"88":{"body":27,"breadcrumbs":4,"title":2},"880":{"body":97,"breadcrumbs":4,"title":1},"881":{"body":63,"breadcrumbs":4,"title":1},"882":{"body":107,"breadcrumbs":5,"title":2},"883":{"body":62,"breadcrumbs":9,"title":5},"884":{"body":51,"breadcrumbs":5,"title":1},"885":{"body":77,"breadcrumbs":5,"title":1},"886":{"body":88,"breadcrumbs":6,"title":2},"887":{"body":0,"breadcrumbs":5,"title":1},"888":{"body":97,"breadcrumbs":6,"title":2},"889":{"body":70,"breadcrumbs":5,"title":1},"89":{"body":9,"breadcrumbs":4,"title":2},"890":{"body":66,"breadcrumbs":5,"title":1},"891":{"body":147,"breadcrumbs":7,"title":3},"892":{"body":82,"breadcrumbs":6,"title":2},"893":{"body":26,"breadcrumbs":6,"title":2},"894":{"body":94,"breadcrumbs":6,"title":2},"895":{"body":70,"breadcrumbs":5,"title":1},"896":{"body":40,"breadcrumbs":5,"title":1},"897":{"body":54,"breadcrumbs":6,"title":2},"898":{"body":46,"breadcrumbs":8,"title":6},"899":{"body":40,"breadcrumbs":3,"title":1},"9":{"body":0,"breadcrumbs":5,"title":3},"90":{"body":9,"breadcrumbs":4,"title":2},"900":{"body":0,"breadcrumbs":3,"title":1},"901":{"body":65,"breadcrumbs":4,"title":2},"902":{"body":25,"breadcrumbs":4,"title":2},"903":{"body":0,"breadcrumbs":3,"title":1},"904":{"body":116,"breadcrumbs":5,"title":3},"905":{"body":130,"breadcrumbs":6,"title":4},"906":{"body":27,"breadcrumbs":4,"title":2},"907":{"body":26,"breadcrumbs":4,"title":2},"908":{"body":112,"breadcrumbs":4,"title":2},"909":{"body":77,"breadcrumbs":3,"title":1},"91":{"body":9,"breadcrumbs":4,"title":2},"910":{"body":16,"breadcrumbs":3,"title":1},"911":{"body":61,"breadcrumbs":4,"title":2},"912":{"body":125,"breadcrumbs":15,"title":11},"913":{"body":52,"breadcrumbs":5,"title":1},"914":{"body":86,"breadcrumbs":5,"title":1},"915":{"body":134,"breadcrumbs":6,"title":2},"916":{"body":0,"breadcrumbs":5,"title":1},"917":{"body":85,"breadcrumbs":9,"title":5},"918":{"body":20,"breadcrumbs":9,"title":5},"919":{"body":77,"breadcrumbs":9,"title":5},"92":{"body":101,"breadcrumbs":4,"title":2},"920":{"body":102,"breadcrumbs":10,"title":6},"921":{"body":105,"breadcrumbs":9,"title":5},"922":{"body":13,"breadcrumbs":5,"title":1},"923":{"body":65,"breadcrumbs":6,"title":2},"924":{"body":115,"breadcrumbs":6,"title":2},"925":{"body":64,"breadcrumbs":5,"title":1},"926":{"body":54,"breadcrumbs":5,"title":1},"927":{"body":54,"breadcrumbs":6,"title":2},"928":{"body":129,"breadcrumbs":11,"title":9},"929":{"body":51,"breadcrumbs":3,"title":1},"93":{"body":41,"breadcrumbs":4,"title":2},"930":{"body":32,"breadcrumbs":3,"title":1},"931":{"body":112,"breadcrumbs":5,"title":3},"932":{"body":0,"breadcrumbs":3,"title":1},"933":{"body":37,"breadcrumbs":4,"title":2},"934":{"body":34,"breadcrumbs":7,"title":5},"935":{"body":45,"breadcrumbs":8,"title":6},"936":{"body":34,"breadcrumbs":8,"title":6},"937":{"body":101,"breadcrumbs":8,"title":6},"938":{"body":26,"breadcrumbs":4,"title":2},"939":{"body":94,"breadcrumbs":4,"title":2},"94":{"body":10,"breadcrumbs":4,"title":2},"940":{"body":100,"breadcrumbs":3,"title":1},"941":{"body":34,"breadcrumbs":4,"title":2},"942":{"body":92,"breadcrumbs":11,"title":8},"943":{"body":122,"breadcrumbs":5,"title":2},"944":{"body":54,"breadcrumbs":6,"title":3},"945":{"body":23,"breadcrumbs":6,"title":3},"946":{"body":0,"breadcrumbs":4,"title":1},"947":{"body":148,"breadcrumbs":10,"title":7},"948":{"body":95,"breadcrumbs":9,"title":6},"949":{"body":53,"breadcrumbs":9,"title":6},"95":{"body":9,"breadcrumbs":4,"title":2},"950":{"body":138,"breadcrumbs":7,"title":4},"951":{"body":44,"breadcrumbs":7,"title":4},"952":{"body":28,"breadcrumbs":5,"title":2},"953":{"body":96,"breadcrumbs":5,"title":2},"954":{"body":80,"breadcrumbs":4,"title":1},"955":{"body":46,"breadcrumbs":4,"title":1},"956":{"body":90,"breadcrumbs":5,"title":2},"957":{"body":54,"breadcrumbs":11,"title":7},"958":{"body":44,"breadcrumbs":5,"title":1},"959":{"body":127,"breadcrumbs":5,"title":1},"96":{"body":21,"breadcrumbs":4,"title":2},"960":{"body":155,"breadcrumbs":6,"title":2},"961":{"body":33,"breadcrumbs":5,"title":1},"962":{"body":99,"breadcrumbs":9,"title":5},"963":{"body":96,"breadcrumbs":9,"title":5},"964":{"body":55,"breadcrumbs":10,"title":6},"965":{"body":26,"breadcrumbs":7,"title":3},"966":{"body":58,"breadcrumbs":6,"title":2},"967":{"body":132,"breadcrumbs":6,"title":2},"968":{"body":108,"breadcrumbs":5,"title":1},"969":{"body":69,"breadcrumbs":5,"title":1},"97":{"body":141,"breadcrumbs":4,"title":2},"970":{"body":75,"breadcrumbs":6,"title":2},"971":{"body":201,"breadcrumbs":9,"title":6},"972":{"body":75,"breadcrumbs":4,"title":1},"973":{"body":89,"breadcrumbs":4,"title":1},"974":{"body":179,"breadcrumbs":5,"title":2},"975":{"body":0,"breadcrumbs":4,"title":1},"976":{"body":138,"breadcrumbs":10,"title":7},"977":{"body":249,"breadcrumbs":6,"title":3},"978":{"body":32,"breadcrumbs":10,"title":7},"979":{"body":49,"breadcrumbs":4,"title":1},"98":{"body":9,"breadcrumbs":4,"title":2},"980":{"body":140,"breadcrumbs":5,"title":2},"981":{"body":35,"breadcrumbs":5,"title":2},"982":{"body":95,"breadcrumbs":5,"title":2},"983":{"body":69,"breadcrumbs":4,"title":1},"984":{"body":28,"breadcrumbs":4,"title":1},"985":{"body":81,"breadcrumbs":5,"title":2},"986":{"body":65,"breadcrumbs":9,"title":7},"987":{"body":46,"breadcrumbs":3,"title":1},"988":{"body":67,"breadcrumbs":3,"title":1},"989":{"body":58,"breadcrumbs":3,"title":1},"99":{"body":17,"breadcrumbs":4,"title":2},"990":{"body":114,"breadcrumbs":4,"title":2},"991":{"body":0,"breadcrumbs":3,"title":1},"992":{"body":91,"breadcrumbs":3,"title":1},"993":{"body":85,"breadcrumbs":4,"title":2},"994":{"body":38,"breadcrumbs":3,"title":1},"995":{"body":38,"breadcrumbs":3,"title":1},"996":{"body":43,"breadcrumbs":6,"title":4},"997":{"body":31,"breadcrumbs":4,"title":2},"998":{"body":131,"breadcrumbs":4,"title":2},"999":{"body":74,"breadcrumbs":3,"title":1}},"docs":{"0":{"body":"Cross-platform Jellyfin client — business logic in a Rust backend, SvelteKit + TypeScript frontend, talking over Tauri v2 IPC. Requirements Specification — user, integration, and development requirements. Traceability Matrix — generated map from requirements to code (regenerated on every publish). Architecture — backend, frontend, data flow, platform backends. Rust API Reference — rustdoc for the src-tauri backend. This site is published automatically from master by the publish-docs CI job.","breadcrumbs":"Introduction » JellyTau Documentation","id":"0","title":"JellyTau Documentation"},"1":{"body":"This document captures JellyTau's user requirements, software requirements, traceability matrix, test traceability, and known technical debt. For a narrative overview of the system design, see docs/architecture/ . For development workflows, see the README and scripts/README.md .","breadcrumbs":"Requirements Specification » Requirements Specification","id":"1","title":"Requirements Specification"},"10":{"body":"Test ID Test Description Traces To Status UT-001 Player state transitions DR-001 Pending UT-002 MediaItem source URL resolution DR-002, DR-003 Pending UT-003 Queue next/previous navigation DR-005 Pending UT-004 Queue shuffle order generation DR-005 Pending UT-005 Queue repeat mode behavior DR-005 Pending UT-006 Jellyfin authentication flow IR-009 Pending UT-007 Jellyfin library items parsing IR-010 Pending UT-008 Repository pattern online/offline switching DR-013 Pending UT-009 Offline mutation queue persistence DR-014 Pending UT-010 Download queue management DR-015 Done UT-011 Resume position storage and retrieval DR-022 Pending UT-012 Sleep timer countdown logic DR-029 Pending UT-013 Playback progress reporting throttling DR-028 Pending UT-014 Database open and in-memory mode IR-013, DR-012 Done UT-015 Database migrations run successfully IR-013, DR-012 Done UT-016 All database tables created IR-013, DR-012 Done UT-017 FTS5 search table created IR-013, DR-012 Done UT-018 Server CRUD operations IR-013, DR-012 Done UT-019 User CRUD operations IR-013, DR-012 Done UT-020 Cascade delete server removes users IR-013, DR-012 Done UT-021 Item insert and FTS search IR-013, DR-012 Done UT-022 User data playback position storage IR-013, DR-012, DR-022 Done UT-023 Sync queue operations IR-013, DR-014 Done UT-024 Downloads table operations IR-013, DR-015 Done UT-025 Migrations are idempotent IR-013, DR-012 Done UT-026 NullBackend volume default value DR-004 Done UT-027 NullBackend set volume DR-004 Done UT-028 NullBackend volume clamping (high/low) DR-004 Done UT-029 NullBackend volume boundary values DR-004 Done UT-030 PlayerController volume default DR-004, DR-009 Done UT-031 PlayerController set volume DR-004, DR-009 Done UT-032 PlayerController muted default DR-004, DR-009 Done UT-033 PlayerController volume delegates to backend DR-004, DR-009 Done UT-034 Download event serialization roundtrip DR-015 Done UT-035 Download event completed serialization DR-015 Done UT-036 Download event failed serialization DR-015 Done UT-037 Download worker exponential backoff DR-015 Done UT-038 Download worker error retryable check DR-015 Done UT-039 Download manager creation DR-015 Done UT-040 Download manager set max concurrent DR-015 Done UT-041 Download info serialization DR-015 Done UT-042 Download command filename sanitization DR-015, DR-018 Done UT-043 Download command filename extension preservation DR-015, DR-018 Done UT-044 Offline item serialization DR-017 Done UT-045 Smart cache default config DR-015 Done UT-046 Smart cache album affinity tracking DR-015 Done UT-047 Smart cache queue precache config DR-015 Done UT-048 Smart cache storage limit check DR-015 Done UT-049 Playlist create (offline) DR-019, JA-019 Done UT-050 Playlist delete (offline) DR-019, JA-019 Done UT-051 Playlist rename (offline) DR-019, JA-019 Done UT-052 Playlist get items (offline) DR-019, JA-019 Done UT-053 Playlist add items (offline) DR-019, JA-020 Done UT-054 Playlist remove items (offline) DR-019, JA-020 Done UT-055 Playlist reorder items (offline) DR-019, JA-020 Done UT-056 Playlist entry serialization DR-019, JA-019 Done UT-057 Playlist Tauri command param naming (camelCase) DR-019, JA-019, JA-020 Done UT-058 Playlist repository client methods DR-019, JA-019, JA-020 Done UT-059 Audio-only stream URL builder for a video item (selected audio-stream index) JA-032, DR-052 Pending UT-060 Background-audio handoff state machine (background→audio, foreground→video; no dual audio) DR-052 Pending UT-061 Background-audio Tauri command param naming (camelCase) DR-052 Pending UT-062 setBackgroundAudioEnabled reports whether the native bridge was actually reached (missing bridge, stale proxy, throwing method) so a dead bridge cannot look armed UR-040, IR-025, DR-051 Done UT-067 Offline get_items gates the synced-catalog UNION on the catalog-browse flag (downloads only when off, full catalog when on) DR-078 Done UT-068 Catalog visibility resolves to serverReachable || showServerCatalog, and is pushed to the backend on every change of either input DR-078, DR-079 Done UT-069 isConnected follows backend reachability alone: false when the server is unreachable on a live link, true for a reachable server while navigator.onLine is false DR-079 Done UT-070 Hybrid get_items returns an empty offline result as-is when the catalog-browse gate is off, without querying the server DR-080 Done UT-066 WiFi-only download gate: cellular and metered WiFi blocked, unmetered WiFi/Ethernet allowed, unknown/none fail closed, desktop default ungated; plus the frontend network reporter (transport reporting, change subscription, teardown, fail-open queries) DR-074 Done UT-071 Byte-size formatter: zero/negative/non-finite → \"0 B\"; decimal unit thresholds; 2–3 significant-figure banding; trailing-zero trimming; largest-unit cap DR-085 Done UT-072 Downloaded-only browse returns a downloaded leaf and its container, filtered to the requested album parent; a non-downloaded sibling is omitted DR-082, DR-083 Done UT-073 An empty downloaded-only browse is authoritative — no rows, no error — regardless of the catalog-browse flag DR-082 Done UT-074 Only libraries with downloaded content are listed; an empty one is omitted DR-082 Done UT-075 Disk usage reports a leaf's own size, a container's summed descendants, and reconciles the device total with the sum of leaves DR-085 Done UT-076 Downloaded library browse lists album containers, not their individual tracks; drilling into the album returns the tracks DR-082, DR-083 Done UT-077 Downloaded TV library browse lists the series, not seasons/episodes; drilling returns the season then the episode DR-082, DR-083 Done UT-078 A downloaded leaf with no cached container (e.g. a movie) still surfaces at the library level DR-082, DR-083 Done UT-079 Each EQ preset returns a 10-band gain curve within range; Flat is all zeros; Bass Boost lifts lows and leaves highs flat DR-030 Done UT-080 with_equalizer_normalised clamps out-of-range gains and forces the band vector to exactly 10 entries (pad short, truncate long) DR-030 Done UT-081 Old persisted AudioSettings JSON without EQ fields loads as disabled + flat DR-030 Done UT-082 EQ fields serialize as camelCase (equalizerEnabled/equalizerBands) and round-trip DR-030 Done UT-083 EQ filter entries are empty when disabled or when the curve is flat (clears the af filter) IR-020 Done UT-084 Enabled EQ builds one peaking equalizer per non-zero band at the right frequency and gain inside a single lavfi chain IR-020 Done UT-085 A first tap resolves to togglePlayPause immediately — no deferral and no timer DR-092, DR-098 Done UT-086 A second tap inside the window seeks (+30 s right half, −10 s left half) with the matching feedback side and re-toggles play/pause, so the two toggles cancel and the play state is unchanged by a double tap DR-092, DR-098 Done UT-087 A tap after the window, and the tap following a consumed pair, are each fresh first taps that toggle (there is no third-tap case); repeated double taps keep seeking; cancel() makes the next tap a first tap so an interpreted swipe cannot seek DR-092, DR-098 Done UT-088 resolveSeekTarget applies the delta to the reported position, clamps into [0, duration - END_SEEK_MARGIN_SECONDS], chains off an in-flight pending target so rapid skips accumulate, and ignores that target once the player reports past it DR-092, DR-095 Done UT-089 A touch drag on the video seek bar seeks to the dragged position, never toggles play/pause, and never alters brightness — the container gesture layer stays out of a control drag entirely DR-098, DR-099 Done UT-090 The seek bar commits its seek on touchend even when the engine never fires change, and commits exactly once when both signals arrive DR-099 Done UT-091 Transport intents (play/pause/toggle) reach the backend even while a video adapter is registered, and never call the adapter's own play/pause/toggle — the webview must not decide play-vs-pause from the DOM DR-097 Done UT-092 shouldReuseActivePlayback reuses backend playback for an already-loaded audio track but never for video, and never when an explicit start position or a next-episode restart was requested DR-100 Done UT-093 resolvePlayerSurface returns video only with a stream URL, pending for video whose stream URL is still missing (never audio), and audio for audio content DR-100 Done UT-094 parseNativeInsets accepts the bridge's JSON or a decoded object, and coerces missing/negative/non-finite edges to 0 rather than emitting NaNpx (which would invalidate the whole padding declaration) DR-112 Done UT-095 safeAreaCssVars/applySafeAreaInsets emit px-suffixed jt-inset custom properties for all four edges DR-112 Done UT-096 readNativeInsets returns null with no bridge and survives a stale WebView proxy (missing or throwing get) instead of throwing out of layout init IR-031, DR-112 Done UT-097 initSafeArea primes the document on start, re-applies on jellytau-insets-changed (rotation, nav-mode switch), unsubscribes on teardown, and writes nothing without a bridge so env() still wins on iOS/desktop IR-031, DR-112 Done UT-098 shellReservesBottomInset gives the bottom inset to BottomUi wherever one renders and to the app shell only on routes without one, so the gesture bar is never ignored nor double-padded DR-112 Done UT-099 A Jellyfin item payload carrying UserData.IsFavorite maps to MediaItem.user_data.is_favorite DR-113, JA-034 Done UT-100 OnlineRepository::get_favorites builds Filters=IsFavorite + Recursive=true + the scope's IncludeItemTypes, and omits the type filter entirely for SearchScope::All DR-115, JA-033 Done UT-101 OfflineRepository::get_favorites returns only is_favorite = 1 rows, honours the scope type filter, and stays downloads-only when the catalog-browse gate is off DR-115 Done UT-102 The save_to_cache favourite mirror does not overwrite a row with pending_sync = 1 DR-114 Done UT-103 The reconnect drain pushes pending favourites, clears pending_sync, and leaves failed rows pending DR-120 Done UT-104 get_items with favorites_only filters online (endpoint) and offline (SQL) DR-116 Done UT-105 favorites store precedence: override beats userData.isFavorite beats false DR-119 Done UT-106 Un-favouriting removes an item from a favourites listing view DR-117, DR-119 Done UT-107 The hybrid background refresh emits favorites-changed only for ids whose favourite state actually flipped DR-120 Done UT-109 Search covers synced-but-not-downloaded items when catalog browse is on, and stays downloads-only when off DR-108 Done UT-110 Search item-type filter is bound, not interpolated: a quote-bearing type neither errors nor widens results DR-108 Done UT-111 FTS prefix queries quote each token, so apostrophes/hyphens/slashes are data; empty or punctuation-only input returns no rows rather than erroring DR-108 Done UT-112 Repeated catalog passes leave one items_fts entry per item, not one per pass DR-110 Done UT-113 The stale-catalog sweep removes vanished synced rows, keeps downloaded ones, keeps uncrawled types, and stays scoped to one server DR-110 Done UT-114 Cached people are reachable from unscoped search and excluded from scoped search DR-111 Done UT-115 Re-index staleness policy: never-indexed and unparseable timestamps are due, fresh ones are not, future ones are not DR-109 Done UT-116 resolve_local_media_path returns a completed download's file, and None for an in-progress download, a row whose file has been deleted, or an unknown item DR-123 Done UT-118 resolveVideoSource prefers a downloaded file, never marks a local file as needing transcoding, and falls back to streaming for a blank path DR-123 Done UT-119 The audio-only handoff picks a downloaded file over the audio-only stream URL, preserving the Jellyfin id for progress sync DR-128 Done UT-120 Expiry reclaim takes only expired temporary entries: derived from completed_at+TTL, honouring an expires_at override, never a user download, and disabled by a zero TTL DR-127 Done UT-108 LRU eviction reclaims only 'auto' downloads and never a user's own, even when the user's is the oldest DR-126 Done UT-117 A background audio-only stream cut short resumes where it died instead of ending the episode; a real end still advances; the absolute position is compared against the runtime; retries at a stuck position give up. A recoverable error resumes music and video too, with growing backoff, leaving the rest of the queue intact and the seekable stream's URL untouched; local and DirectUrl sources are excluded DR-129 Done UT-124 downloadedFilePath leaves a completed download's absolute path alone (POSIX and Windows) and only roots one that is still relative DR-133 Done UT-125 A NULL media_type resolves from the item type — Movie and Episode as video, a track as audio — an uncached item still defaults to audio, and an explicit media_type overrides the item DR-135 Done UT-126 Requeueing takes only video rows downloaded under the audio default, clearing their URL, and leaves correctly-typed video rows and real audio downloads alone DR-136 Done UT-127 The media server bounds and confines every response: a range-less request yields one chunk rather than the whole file, no range exceeds the chunk cap, explicit/open-ended/suffix ranges resolve correctly, a range past the end is unsatisfiable rather than clamped, a malformed header falls back to the first chunk, path traversal and unrelated absolute paths are refused, a wrong or absent token is rejected, and content type comes from the extension then the magic bytes DR-137 Done UT-121 An EOF reads as the last observed timestamp, not zero: live readings win while the file is loaded, a not-yet-established duration is not recorded as a real zero, a seek updates the position before the next poll, and loading a new file clears the previous one's DR-130 Done UT-122 The sync-queue drain pushes queued playback reports oldest-first, defers failures for the next reconnect, abandons a row after MAX_SYNC_ATTEMPTS, ignores other users' rows, and parses both payload dialects DR-131 Done UT-123 Pending-sync rows describe themselves: every queueable operation has a label, an unknown one still renders, the item title falls back to its id, and rows list oldest-first DR-132 Done UT-130 Video and background-audio stream URLs omit AudioStreamIndex when no track was chosen, and carry the exact index when one was DR-140 Done UT-131 The Episode Focus View hero offers a download control DR-142 Done UT-132 The series name links to the series and the SxEy badge to that season's anchor DR-142 Done UT-133 Cast renders below the \"More Episodes\" strip, never above it DR-062, DR-142 Done UT-134 The episode strip is hidden when the episode has no siblings DR-142 Done UT-135 An episode with no seriesId still renders the Focus View, with title, Play and download DR-142 Done UT-136 episodeRedirectTarget sends a bare episode page into its series' Focus View, and returns null with no series DR-142 Done UT-137 Going offline with the toggle off pushes the closed gate and bumps catalogFilterVersion DR-143 Done UT-138 The version bumps only after set_show_server_catalog resolves, never before DR-143 Done UT-139 A failed visibility push is retried on the next identical transition rather than latched DR-143 Done UT-140 useOfflineFilterReload skips the value a page already loaded under and reloads on each later change DR-143 Done UT-141 The advertised channel cap: an unknown or zero reading falls back to stereo, a real route keeps its channels, an absurd driver reading is capped at 7.1, and mono is taken at its word DR-141 Done UT-148 Forcing a transcode from the client: an undecodable default track forces one, a decodable track does not, the default track decides rather than the first, the first decides when nothing is marked default, and neither an audio-less source nor an unnamed codec is second-guessed DR-149 Done UT-149 createAdapter returns the native adapter only when Rust reports native AND experimentalNativeVideo is on; the flag off forces HTML5 even when Rust says native, and the flag on never promotes a platform Rust reported as HTML5 DR-150 Done UT-150 set-version.sh stamps all four manifests without touching dependency versions, and the Android versionCode is monotonic across an upgrade sequence, clears the 1000 floor, and survives a prerelease suffix DR-153 Done UT-151 An unreportable stop lands in the queue and is pushed by the existing drain; re-queueing the same item supersedes the earlier position rather than adding a row, distinct items keep their own positions, and an abandoned row is not revived by a later report DR-154 Done UT-152 Caching a server result mirrors its watch position locally — including for an item carrying a position but no favourite flag — without inventing a row for an item the server reported no user data for, and without pulling a still-unsynced local position backwards DR-155 Done UT-162 Each downloaded library lists only its own media: the music library shows the album and neither the film nor the series, the movie library only the film, the TV library only the series DR-163 Done UT-163 partial_path appends rather than replacing the extension, so it matches what the cleanup paths delete, keeps two sources for one title apart, and still produces a sidecar for an extension-less target DR-165 Done UT-170 queue_album_tracks queues a row for every track of the album — including tracks the cache holds without an album_id and tracks it has never seen at all — links each one to its album so offline browsing can find it, returns the row ids in track order, and is idempotent: re-queuing fills the gaps without duplicating rows or resetting a completed track. cached_album_tracks (the offline fallback) finds tracks by either album link and does not sweep in another album's DR-173 Done UT-171 resolve_pending_download_urls restricted to a set of row ids resolves only those rows and leaves other pending rows untouched, and an empty id set resolves nothing rather than sweeping everything DR-173 Done UT-172 album_file_names gives every track of an album its own file: a title repeated within the album (deluxe edition, two discs) is disambiguated by track number and item id instead of the second download overwriting the first, an unambiguous title keeps its own name, and path separators in a title are sanitised so a track cannot escape the album directory DR-173 Done UT-164 resume_offset appends only when the server answered 206; a 200 after a Range request restarts the file, because that body is the whole stream DR-166 Done UT-165 A registered download starts unflagged, signal sets the flag its worker reads, signalling an unregistered id reports not-in-flight, clear forgets it, and re-registering drops a previous stop so a resumed download does not halt instantly DR-164 Done UT-166 original quality re-encodes audio the webview cannot decode (E-AC-3/AC-3/DTS/TrueHD) to AAC without capping bitrate or resolution, keeps the Static=true direct copy for audio that plays here (AAC/MP3/Opus/Vorbis/FLAC) and for an unknown codec, leaves the explicit quality presets untouched, and picks the served track by the same default-or-first rule the streaming verdict uses DR-171 Done UT-155 A seek during a background-audio handoff re-opens the stream at the requested absolute position (StartTimeTicks) and rebases the handoff to it, while a seek outside a handoff stays an ordinary seek and invents no base DR-159 Done UT-154 mark_unplayed parses to QueuedOp::MarkUnplayed and is rejected without an item id, and a queued un-mark drains to the server as clear_watch_history DR-158 Done UT-156 A capped step reaches the transcode URL as all four of its parts (total ceiling, the video/audio split summing to the cap, and a MaxHeight), the uncapped default keeps the historical 20/18 Mbps allowance and constrains no resolution, and the background-audio handoff takes the lower of the cap and its own 384 kbps DR-162 Done UT-157 The quality ladder is internally consistent — video + audio equals the cap at every step, audio never consumes the budget, only Original is uncapped — descends in bitrate, resolution and audio share together, and round-trips through the serde token it is persisted as DR-162 Done UT-158 Justified rows fill the container width exactly and never overflow it, every tile in a row shares one height, and each tile's width follows its own aspect ratio — a 16:9 tile coming out more than twice the width of a 2:3 tile at the same height DR-174 Done UT-159 The awkward cases of the packing: a short last row is left at the target height rather than stretched across the container, a last row that would overflow is brought down, an extreme ratio is clamped instead of taking a row to itself, a missing or nonsensical ratio falls back to square instead of collapsing the tile, an unmeasured container renders nothing rather than 1px tiles, and every tile is placed exactly once in order DR-174 Done UT-160 The default row height suits its container: it grows with the width, stays inside its bounds, and at phone width still fits two 16:9 tiles side by side DR-174 Done UT-161 A collection type maps to its favourites scope (movies/tvshows/music), every other kind — Live TV, channels, box sets, books, unknown — maps to none rather than to All, and a constructed library carries the scope across the wire as favoritesScope, omitted entirely when it has none DR-175 Done UT-167 The mosaic's composition: the cross-library favourites entry leads, each library is followed by its own category tile pointing at that category's tab, a category shared by two libraries still yields one tile, a library kind favourites do not carve up yields none, a scope the page offers no tab for is ignored, and every tile is uniquely keyed DR-174, DR-175 Done UT-168 Subtitles are negotiated as sidecars, never burned in: the requested SubtitleStreamIndex is the explicit \"none\" sentinel (-1) rather than omitted, every text format we can render (srt/subrip/ass/ssa/vtt) is advertised as External, and the burn-in verdict is by format — text never forces it, image formats (PGSSUB, dvdsub) always do, case-insensitively. The same sentinel rides the stream URL itself, so a stream re-opened without a fresh negotiation cannot inherit a subtitle. And the verdict reaches the picker: a subtitle stream carries supportsExternalDelivery — set only for subtitles, false for a bitmap format and for one the server left unnamed — which drops the tracks the app could never draw from the menu, the children and the native play request alike, without even fetching their URLs, while a stream carrying no verdict at all is still offered DR-176 Done UT-173 Every video stream URL carries a PlaySessionId, each open mints a fresh one, and the open reports the session it superseded so that job can be stopped DR-177 Done UT-174 A fatal HLS network error is read against the absolute position: mid-film — including after a quality switch, where the seek offset carries the whole resume position — it is retried rather than reported as the end of the stream, the last tenth of a known runtime is treated as the end, an unknown runtime retries, and retries stop once the budget is spent DR-177 Done UT-175 A stream reload that never becomes playable is reported as a failure instead of resolving as success, so the caller can revert its selection rather than leave the UI claiming a stream that is not playing DR-177 Done UT-176 A handoff's position is floored at its base: with no tick yet landed the exit position is the point the screen was locked at rather than 0, and once ticks are flowing (the base already applied natively) it is not added twice DR-178 Done UT-177 Webview-rendered media's reported position and duration are the controller's, and are dropped the moment that element stops being the player — on teardown, and when a handoff takes over DR-178 Done UT-178 A stop report at position 0 is withheld rather than sent (it would clear the resume point), while a real position is still reported from either rendering path — the element's on the webview path, the backend's on the native one DR-179 Done UT-179 An audio-only episode that ends naturally is reported stopped at its runtime, so Jellyfin marks it played; a truncated stream, which is about to be re-opened, reports nothing DR-179 Done UT-180 Position ticks report progress to the server, throttled to one report per item per window rather than one per tick DR-179 Done UT-181 The handoff plan matches its source: a downloaded file takes no base and a seek, a stream takes the base and no seek, and a handoff at 0:00 takes neither; a downloaded handoff's absolute seek stays an ordinary seek instead of a stream rebuild DR-180 Done UT-153 Scroll handling per navigation kind: a forward move always lands at the top even when the previous page was scrolled and even when the target was visited before, Back restores that route's own saved offset (and the top when it has none), offsets are kept per route rather than shared, a repeated Back still restores, and the initial load leaves the container alone DR-156 Done UT-142 The audio codecs offered for video direct play: a Dolby device's real MediaCodecList output drops ac3/eac3, AMR and raw PCM are dropped too, a fully-supported list is passed through untouched, a list with nothing decodable still claims aac, and stray spacing or casing does not decide whether the user gets sound DR-148 Done UT-143 Subtitle URLs resolve to plain strings before they reach the markup (never a Promise), unresolvable tracks are dropped, a stale selection collapses to \"Off\", and a server-default track is never auto-selected UR-020, DR-023 Done UT-144 VideoPlayer actually renders children carrying data-stream-index, with no default attribute and no async getSubtitleUrl() bound to src UR-020, DR-023 Done UT-145 The frontend's subtitle payload survives the IPC hop: a camelCase PlayItemRequest carrying subtitles deserializes, create_media_item lands them on MediaItem.subtitles in the order sent, and a request without the field still defaults to empty UR-020, IR-016 Done UT-146 The subtitle JSON serialized across the JNI boundary uses the keys JellyTauPlayer.load() reads — url, language, label and mime_type, never mimeType UR-020, IR-016, JA-008 Done UT-147 The native subtitle payload and the track-selection index come from the same resolved list: the wire shape keeps mime_type and stream order, playerPlayItem actually sends it, and the index is a position in the sent list (so a track whose URL failed to resolve cannot shift the others) rather than the menu's row number UR-020, IR-016 Done UT-182 An HLS video URL never carries StartTimeTicks — with a position supplied or not — while the master playlist, codec, media source and chosen audio track still ride on it DR-181 Done UT-183 A reloaded stream is resumed by seeking the element to the absolute position with the transcode offset cleared to zero — never by carrying the position as an offset base, which since DR-181 would display the position while playing the item from its start — and a reload to 0:00 waits for no seek DR-181 Done UT-184 The native reveal rule fires on state === \"playing\" and on a position tick carrying a position or a duration, and on nothing else — not buffering, paused, stopped, ended or error, not an empty tick, and not a negative position DR-182 Done UT-188 The control-bar auto-hide rule permits hiding only during uninterrupted playback: it declines while paused, while a seek is in flight, and while a track/subtitle/quality menu is open — asserted against the pure shouldHideControls rule rather than a clock or a DOM DR-189 Done UT-189 On the native path the player never calls player_report_state — driven through the real 10-second progress interval under fake timers, which is the call site that mattered; asserting on a freshly mounted player passes with the guard deleted and guards nothing DR-195 Done UT-187 On the native path the play overlay follows the backend: it clears when the backend resumes after a pause and is raised again when the backend pauses, and the system bars are hidden on player entry rather than only by the fullscreen button DR-186, DR-187 Done UT-186 Every attribute the native-video compositing block in app.css targets is set somewhere in the app — [data-app-shell] in particular — so a selector aimed at nothing fails the suite instead of failing silently on a device DR-185 Done UT-185 Mounted on the native path (backend reports native, opt-in flag on, no