dreamio/docs/turns/2026-05-25-queue-vlc-subtitles-until-media-start.html

380 lines
385 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Queue VLC Subtitles Until Media Start</title>
<style>
:root {
color-scheme: light;
--ink: oklch(22% 0.02 275);
--muted: oklch(45% 0.025 275);
--paper: oklch(98% 0.006 275);
--panel: oklch(100% 0.004 275);
--line: oklch(88% 0.018 275);
--accent: oklch(58% 0.18 288);
--accent-soft: oklch(94% 0.035 288);
--code-bg: oklch(25% 0.025 275);
--code-ink: oklch(96% 0.01 275);
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--paper);
color: var(--ink);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.55;
}
main { max-width: 1040px; margin: 0 auto; padding: 48px 24px 64px; }
header { max-width: 760px; margin-bottom: 36px; }
.eyebrow { color: var(--accent); font-size: 0.78rem; font-weight: 760; letter-spacing: 0.08em; text-transform: uppercase; }
h1 { font-size: clamp(2.1rem, 5vw, 4rem); line-height: 0.98; margin: 10px 0 18px; letter-spacing: 0; }
h2 { margin: 34px 0 10px; font-size: 1.25rem; line-height: 1.2; }
p { max-width: 74ch; margin: 0 0 14px; }
ul { margin: 8px 0 18px; padding-left: 1.2rem; max-width: 78ch; }
li { margin: 6px 0; }
code { font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace; font-size: 0.92em; }
.summary {
border: 1px solid var(--line);
background: var(--panel);
border-radius: 8px;
padding: 18px 20px;
box-shadow: 0 20px 50px oklch(55% 0.08 275 / 0.08);
}
.meta { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 18px; }
.pill { background: var(--accent-soft); color: oklch(35% 0.11 288); border-radius: 999px; padding: 5px 10px; font-size: 0.82rem; font-weight: 680; }
.diff-shell { margin-top: 16px; overflow: auto; border: 1px solid var(--line); border-radius: 8px; background: oklch(16% 0.012 275); }
.diff-shell > * { min-width: 780px; }
pre {
background: var(--code-bg);
color: var(--code-ink);
border-radius: 8px;
padding: 14px 16px;
overflow: auto;
}
a { color: var(--accent); }
section { border-top: 1px solid var(--line); padding-top: 2px; }
</style>
</head>
<body>
<main>
<header>
<div class="eyebrow">Dreamio turn record</div>
<h1>Queue VLC Subtitles Until Media Start</h1>
<p class="summary">Fixed a startup race introduced by the real local range buffer: subtitle candidates can now arrive during the cache probe and wait safely until VLC has an active media item.</p>
<div class="meta">
<span class="pill">Issue dreamio-qyh</span>
<span class="pill">May 25, 2026</span>
<span class="pill">Native playback</span>
</div>
</header>
<section>
<h2>Summary</h2>
<p>The native VLC backend now queues external subtitle candidates received before media startup completes. Once the local-cache or direct VLC media item is created and playback begins, the queued candidates are flushed through the existing subtitle attachment path.</p>
</section>
<section>
<h2>Changes Made</h2>
<ul>
<li>Added a pending subtitle queue and URL set to <code>VLCNativePlaybackBackend</code>.</li>
<li>Reset the queue and startup flag for each new playback request.</li>
<li>Marked media as started inside <code>startVLCMedia</code>, then flushed queued subtitles.</li>
<li>Kept the existing attachment, dedupe, delayed refresh, display-name preservation, and auto-selection behavior intact.</li>
</ul>
</section>
<section>
<h2>Context</h2>
<p>The logs showed subtitle attachments happening after <code>cache-probe</code> but before <code>opening mode=local-cache</code>. With the real range cache, VLC media creation is delayed by the async probe and local server setup. The native player still forwarded buffered subtitles immediately, so <code>addPlaybackSlave</code> was called while VLC had no active media item.</p>
</section>
<section>
<h2>Important Implementation Details</h2>
<p>The fix treats pre-media subtitle candidates as valid work, not duplicates. Candidates queued during startup are not inserted into <code>attachedSubtitleURLs</code>; they are held separately so the later flush can attach them normally once VLC is ready.</p>
<p>When subtitles arrive after media startup, behavior is unchanged. They still attach immediately and use the existing delayed refresh timers to wait for VLC to expose external subtitle tracks.</p>
</section>
<section>
<h2>Relevant Diff Snippets</h2>
<p>Rendered with <code>@pierre/diffs/ssr</code> from the one-file patch for <code>Dreamio/VLCNativePlaybackBackend.swift</code>.</p>
<div class="diff-shell"><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/VLCNativePlaybackBackend.swift</bdi></div></div><div data-metadata=""><span data-additions-count="">+48</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 83"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">27 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="28" data-line-index="27,27"><span data-line-number-content="">28</span></div><div data-line-type="context" data-column-number="29" data-line-index="28,28"><span data-line-number-content="">29</span></div><div data-line-type="context" data-column-number="30" data-line-index="29,29"><span data-line-number-content="">30</span></div><div data-gutter-buffer="buffer" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh);"></div><div data-line-type="context" data-column-number="31" data-line-index="33,33"><span data-line-number-content="">31</span></div><div data-line-type="context" data-column-number="32" data-line-index="34,34"><span data-line-number-content="">32</span></div><div data-line-type="context" data-column-number="33" data-line-index="35,35"><span data-line-number-content="">33</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">20 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="54" data-line-index="56,56"><span data-line-number-content="">54</span></div><div data-line-type="context" data-column-number="55" data-line-index="57,57"><span data-line-number-content="">55</span></div><div data-line-type="context" data-column-number="56" data-line-index="58,58"><span data-line-number-content="">56</span></div><div data-gutter-buffer="buffer" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh);"></div><div data-line-type="context" data-column-number="57" data-line-index="62,62"><span data-line-number-content="">57</span></div><div data-line-type="context" data-column-number="58" data-line-index="63,63"><span data-line-number-content="">58</span></div><div data-line-type="context" data-column-number="59" data-line-index="64,64"><span data-line-number-content="">59</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">295 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="355" data-line-index="360,360"><span data-line-number-content="">355</span></div><div data-line-type="context" data-column-number="356" data-line-index="361,361"><span data-line-number-content="">356</span></div><div data-line-type="context" data-column-number="357" data-line-index="362,362"><span data-line-number-content="">357</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="358" data-line-index="365,365"><span data-line-number-content="">358</span></div><div data-line-type="context" data-column-number="359" data-line-index="366,366"><span data-line-number-content="">359</span></div><div data-line-type="context" data-column-number="360" data-line-index="367,367"><span data-line-number-content="">360</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="371" data-line-index="378,378"><span data-line-number-content="">371</span></div><div data-line-type="context" data-column-number="372" data-line-index="379,379"><span data-line-number-content="">372</span></div><div data-line-type="context" data-column-number="373" data-line-index="380,380"><span data-line-number-content="">373</span></div><div data-gutter-buffer="buffer" data-buffer-size="10" style="grid-row: span 10;min-height:calc(10 * 1lh);"></div><div data-line-type="context" data-column-number="374" data-line-index="391,391"><span data-line-number-content="">374</span></div><div data-line-type="context" data-column-number="375" data-line-index="392,392"><span data-line-number-content="">375</span></div><div data-line-type="context" data-column-number="376" data-line-index="393,393"><span data-line-number-content="">376</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">36 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="413" data-line-index="430,430"><span data-line-number-content="">413</span></div><div data-line-type="context" data-column-number="414" data-line-index="431,431"><span data-line-number-content="">414</span></div><div data-line-type="context" data-column-number="415" data-line-index="432,432"><span data-line-number-content="">415</span></div><div data-gutter-buffer="buffer" data-buffer-size="30" style="grid-row: span 30;min-height:calc(30 * 1lh);"></div><div data-line-type="context" data-column-number="416" data-line-index="463,463"><span data-line-number-content="">416</span></div><div data-line-type="context" data-column-number="417" data-line-index="464,464"><span data-line-number-content="">417</span></div><div data-line-type="context" data-column-number="418" data-line-index="465,465"><span data-line-number-content="">418</span></div></div><div data-content="" style="grid-row: span 83"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">27 unmodified lines</span></div></div></div><div data-line="28" data-alt-line="28" data-line-type="context" data-line-index="27,27"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lastLoggedState: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="29" data-alt-line="29" data-line-type="context" data-line-index="28,28"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lastBufferingLogTime: Date</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="30" data-alt-line="30" data-line-type="context" data-line-index="29,29"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedSubtitleURLs </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Set</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>()</span></div><div data-content-buffer="" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh)"></div><div data-line="31" data-alt-line="34" data-line-type="context" data-line-index="33,33"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didAutoSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="32" data-alt-line="35" data-line-type="context" data-line-index="34,34"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didUserSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="33" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> autoSelectedSubtitleTrackID: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int32</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">20 unmodified lines</span></div></div></div><div data-line="54" data-alt-line="57" data-line-type="context" data-line-index="56,56"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> canImport</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">MobileVLCKit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="55" data-alt-line="58" data-line-type="context" data-line-index="57,57"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> playbackStartupTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="56" data-alt-line="59" data-line-type="context" data-line-index="58,58"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh)"></div><div data-line="57" data-alt-line="63" data-line-type="context" data-line-index="62,62"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didAutoSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="58" data-alt-line="64" data-line-type="context" data-line-index="63,63"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didUserSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="59" data-alt-line="65" data-line-type="context" data-line-index="64,64"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> autoSelectedSubtitleTrackID </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">295 unmodified lines</span></div></div></div><div data-line="355" data-alt-line="361" data-line-type="context" data-line-index="360,360"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] opening mode=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">playbackMode</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> cachingMs=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">cachingMilliseconds</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> url=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">URLRedactor.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">redactedURLString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="356" data-alt-line="362" data-line-type="context" data-line-index="361,361"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="357" data-alt-line="363" data-line-type="context" data-line-index="362,362"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> mediaPlayer.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">play</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="358" data-alt-line="366" data-line-type="context" data-line-index="365,365"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="359" data-alt-line="367" data-line-type="context" data-line-index="366,366">
</div><div data-line="360" data-alt-line="368" data-line-type="context" data-line-index="367,367"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> addRemoteHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> media</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: VLCMedia, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">request</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: NativePlaybackRequest</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line="371" data-alt-line="379" data-line-type="context" data-line-index="378,378"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="372" data-alt-line="380" data-line-type="context" data-line-index="379,379">
</div><div data-line="373" data-alt-line="381" data-line-type="context" data-line-index="380,380"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> attachSubtitles</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidates</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="10" style="grid-row: span 10;min-height:calc(10 * 1lh)"></div><div data-line="374" data-alt-line="392" data-line-type="context" data-line-index="391,391"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedCount </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="375" data-alt-line="393" data-line-type="context" data-line-index="392,392"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duplicateCount </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="376" data-alt-line="394" data-line-type="context" data-line-index="393,393"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> baselineTrackIDs </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Set</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">rawSubtitleTracks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.filter </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">id</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> >=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">\.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">id</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">36 unmodified lines</span></div></div></div><div data-line="413" data-alt-line="431" data-line-type="context" data-line-index="430,430"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedCount</span></div><div data-line="414" data-alt-line="432" data-line-type="context" data-line-index="431,431"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="415" data-alt-line="433" data-line-type="context" data-line-index="432,432">
</div><div data-content-buffer="" data-buffer-size="30" style="grid-row: span 30;min-height:calc(30 * 1lh)"></div><div data-line="416" data-alt-line="464" data-line-type="context" data-line-index="463,463"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rawSubtitleTracks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">SubtitleTrack</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="417" data-alt-line="465" data-line-type="context" data-line-index="464,464"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> names </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">videoSubTitlesNames</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> as?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">] </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="418" data-alt-line="466" data-line-type="context" data-line-index="465,465"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> indexes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">videoSubTitlesIndexes</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> as?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [NSNumber] </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 83"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">27 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="28" data-line-index="27,27"><span data-line-number-content="">28</span></div><div data-line-type="context" data-column-number="29" data-line-index="28,28"><span data-line-number-content="">29</span></div><div data-line-type="context" data-column-number="30" data-line-index="29,29"><span data-line-number-content="">30</span></div><div data-line-type="change-addition" data-column-number="31" data-line-index="30,30"><span data-line-number-content="">31</span></div><div data-line-type="change-addition" data-column-number="32" data-line-index="31,31"><span data-line-number-content="">32</span></div><div data-line-type="change-addition" data-column-number="33" data-line-index="32,32"><span data-line-number-content="">33</span></div><div data-line-type="context" data-column-number="34" data-line-index="33,33"><span data-line-number-content="">34</span></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">20 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="57" data-line-index="56,56"><span data-line-number-content="">57</span></div><div data-line-type="context" data-column-number="58" data-line-index="57,57"><span data-line-number-content="">58</span></div><div data-line-type="context" data-column-number="59" data-line-index="58,58"><span data-line-number-content="">59</span></div><div data-line-type="change-addition" data-column-number="60" data-line-index="59,59"><span data-line-number-content="">60</span></div><div data-line-type="change-addition" data-column-number="61" data-line-index="60,60"><span data-line-number-content="">61</span></div><div data-line-type="change-addition" data-column-number="62" data-line-index="61,61"><span data-line-number-content="">62</span></div><div data-line-type="context" data-column-number="63" data-line-index="62,62"><span data-line-number-content="">63</span></div><div data-line-type="context" data-column-number="64" data-line-index="63,63"><span data-line-number-content="">64</span></div><div data-line-type="context" data-column-number="65" data-line-index="64,64"><span data-line-number-content="">65</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">295 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="361" data-line-index="360,360"><span data-line-number-content="">361</span></div><div data-line-type="context" data-column-number="362" data-line-index="361,361"><span data-line-number-content="">362</span></div><div data-line-type="context" data-column-number="363" data-line-index="362,362"><span data-line-number-content="">363</span></div><div data-line-type="change-addition" data-column-number="364" data-line-index="363,363"><span data-line-number-content="">364</span></div><div data-line-type="change-addition" data-column-number="365" data-line-index="364,364"><span data-line-number-content="">365</span></div><div data-line-type="context" data-column-number="366" data-line-index="365,365"><span data-line-number-content="">366</span></div><div data-line-type="context" data-column-number="367" data-line-index="366,366"><span data-line-number-content="">367</span></div><div data-line-type="context" data-column-number="368" data-line-index="367,367"><span data-line-number-content="">368</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="379" data-line-index="378,378"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="379,379"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="380,380"><span data-line-number-content="">381</span></div><div data-line-type="change-addition" data-column-number="382" data-line-index="381,381"><span data-line-number-content="">382</span></div><div data-line-type="change-addition" data-column-number="383" data-line-index="382,382"><span data-line-number-content="">383</span></div><div data-line-type="change-addition" data-column-number="384" data-line-index="383,383"><span data-line-number-content="">384</span></div><div data-line-type="change-addition" data-column-number="385" data-line-index="384,384"><span data-line-number-content="">385</span></div><div data-line-type="change-addition" data-column-number="386" data-line-index="385,385"><span data-line-number-content="">386</span></div><div data-line-type="change-addition" data-column-number="387" data-line-index="386,386"><span data-line-number-content="">387</span></div><div data-line-type="change-addition" data-column-number="388" data-line-index="387,387"><span data-line-number-content="">388</span></div><div data-line-type="change-addition" data-column-number="389" data-line-index="388,388"><span data-line-number-content="">389</span></div><div data-line-type="change-addition" data-column-number="390" data-line-index="389,389"><span data-line-number-content="">390</span></div><div data-line-type="change-addition" data-column-number="391" data-line-index="390,390"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="391,391"><span data-line-number-content="">392</span></div><div data-line-type="context" data-column-number="393" data-line-index="392,392"><span data-line-number-content="">393</span></div><div data-line-type="context" data-column-number="394" data-line-index="393,393"><span data-line-number-content="">394</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">36 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="431" data-line-index="430,430"><span data-line-number-content="">431</span></div><div data-line-type="context" data-column-number="432" data-line-index="431,431"><span data-line-number-content="">432</span></div><div data-line-type="context" data-column-number="433" data-line-index="432,432"><span data-line-number-content="">433</span></div><div data-line-type="change-addition" data-column-number="434" data-line-index="433,433"><span data-line-number-content="">434</span></div><div data-line-type="change-addition" data-column-number="435" data-line-index="434,434"><span data-line-number-content="">435</span></div><div data-line-type="change-addition" data-column-number="436" data-line-index="435,435"><span data-line-number-content="">436</span></div><div data-line-type="change-addition" data-column-number="437" data-line-index="436,436"><span data-line-number-content="">437</span></div><div data-line-type="change-addition" data-column-number="438" data-line-index="437,437"><span data-line-number-content="">438</span></div><div data-line-type="change-addition" data-column-number="439" data-line-index="438,438"><span data-line-number-content="">439</span></div><div data-line-type="change-addition" data-column-number="440" data-line-index="439,439"><span data-line-number-content="">440</span></div><div data-line-type="change-addition" data-column-number="441" data-line-index="440,440"><span data-line-number-content="">441</span></div><div data-line-type="change-addition" data-column-number="442" data-line-index="441,441"><span data-line-number-content="">442</span></div><div data-line-type="change-addition" data-column-number="443" data-line-index="442,442"><span data-line-number-content="">443</span></div><div data-line-type="change-addition" data-column-number="444" data-line-index="443,443"><span data-line-number-content="">444</span></div><div data-line-type="change-addition" data-column-number="445" data-line-index="444,444"><span data-line-number-content="">445</span></div><div data-line-type="change-addition" data-column-number="446" data-line-index="445,445"><span data-line-number-content="">446</span></div><div data-line-type="change-addition" data-column-number="447" data-line-index="446,446"><span data-line-number-content="">447</span></div><div data-line-type="change-addition" data-column-number="448" data-line-index="447,447"><span data-line-number-content="">448</span></div><div data-line-type="change-addition" data-column-number="449" data-line-index="448,448"><span data-line-number-content="">449</span></div><div data-line-type="change-addition" data-column-number="450" data-line-index="449,449"><span data-line-number-content="">450</span></div><div data-line-type="change-addition" data-column-number="451" data-line-index="450,450"><span data-line-number-content="">451</span></div><div data-line-type="change-addition" data-column-number="452" data-line-index="451,451"><span data-line-number-content="">452</span></div><div data-line-type="change-addition" data-column-number="453" data-line-index="452,452"><span data-line-number-content="">453</span></div><div data-line-type="change-addition" data-column-number="454" data-line-index="453,453"><span data-line-number-content="">454</span></div><div data-line-type="change-addition" data-column-number="455" data-line-index="454,454"><span data-line-number-content="">455</span></div><div data-line-type="change-addition" data-column-number="456" data-line-index="455,455"><span data-line-number-content="">456</span></div><div data-line-type="change-addition" data-column-number="457" data-line-index="456,456"><span data-line-number-content="">457</span></div><div data-line-type="change-addition" data-column-number="458" data-line-index="457,457"><span data-line-number-content="">458</span></div><div data-line-type="change-addition" data-column-number="459" data-line-index="458,458"><span data-line-number-content="">459</span></div><div data-line-type="change-addition" data-column-number="460" data-line-index="459,459"><span data-line-number-content="">460</span></div><div data-line-type="change-addition" data-column-number="461" data-line-index="460,460"><span data-line-number-content="">461</span></div><div data-line-type="change-addition" data-column-number="462" data-line-index="461,461"><span data-line-number-content="">462</span></div><div data-line-type="change-addition" data-column-number="463" data-line-index="462,462"><span data-line-number-content="">463</span></div><div data-line-type="context" data-column-number="464" data-line-index="463,463"><span data-line-number-content="">464</span></div><div data-line-type="context" data-column-number="465" data-line-index="464,464"><span data-line-number-content="">465</span></div><div data-line-type="context" data-column-number="466" data-line-index="465,465"><span data-line-number-content="">466</span></div></div><div data-content="" style="grid-row: span 83"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">27 unmodified lines</span></div></div></div><div data-line="28" data-alt-line="28" data-line-type="context" data-line-index="27,27"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lastLoggedState: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="29" data-alt-line="29" data-line-type="context" data-line-index="28,28"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lastBufferingLogTime: Date</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="30" data-alt-line="30" data-line-type="context" data-line-index="29,29"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedSubtitleURLs </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Set</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>()</span></div><div data-line="31" data-line-type="change-addition" data-line-index="30,30"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleCandidates: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="32" data-line-type="change-addition" data-line-index="31,31"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleURLs </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Set</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>()</span></div><div data-line="33" data-line-type="change-addition" data-line-index="32,32"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> hasStartedMedia </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="34" data-alt-line="31" data-line-type="context" data-line-index="33,33"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didAutoSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="35" data-alt-line="32" data-line-type="context" data-line-index="34,34"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didUserSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="36" data-alt-line="33" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> autoSelectedSubtitleTrackID: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int32</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">20 unmodified lines</span></div></div></div><div data-line="57" data-alt-line="54" data-line-type="context" data-line-index="56,56"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> canImport</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">MobileVLCKit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="58" data-alt-line="55" data-line-type="context" data-line-index="57,57"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> playbackStartupTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="59" data-alt-line="56" data-line-type="context" data-line-index="58,58"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="60" data-line-type="change-addition" data-line-index="59,59"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleCandidates.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="61" data-line-type="change-addition" data-line-index="60,60"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="62" data-line-type="change-addition" data-line-index="61,61"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> hasStartedMedia </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="63" data-alt-line="57" data-line-type="context" data-line-index="62,62"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didAutoSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="64" data-alt-line="58" data-line-type="context" data-line-index="63,63"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> didUserSelectSubtitleTrack </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></div><div data-line="65" data-alt-line="59" data-line-type="context" data-line-index="64,64"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> autoSelectedSubtitleTrackID </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">295 unmodified lines</span></div></div></div><div data-line="361" data-alt-line="355" data-line-type="context" data-line-index="360,360"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] opening mode=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">playbackMode</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> cachingMs=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">cachingMilliseconds</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> url=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">URLRedactor.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">redactedURLString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="362" data-alt-line="356" data-line-type="context" data-line-index="361,361"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="363" data-alt-line="357" data-line-type="context" data-line-index="362,362"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> mediaPlayer.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">play</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="364" data-line-type="change-addition" data-line-index="363,363"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> hasStartedMedia </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span></div><div data-line="365" data-line-type="change-addition" data-line-index="364,364"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> flushPendingSubtitleCandidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="366" data-alt-line="358" data-line-type="context" data-line-index="365,365"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="367" data-alt-line="359" data-line-type="context" data-line-index="366,366">
</div><div data-line="368" data-alt-line="360" data-line-type="context" data-line-index="367,367"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> addRemoteHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> media</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: VLCMedia, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">request</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: NativePlaybackRequest</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line="379" data-alt-line="371" data-line-type="context" data-line-index="378,378"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="380" data-alt-line="372" data-line-type="context" data-line-index="379,379">
</div><div data-line="381" data-alt-line="373" data-line-type="context" data-line-index="380,380"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> attachSubtitles</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidates</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="382" data-line-type="change-addition" data-line-index="381,381"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> hasStartedMedia </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="383" data-line-type="change-addition" data-line-index="382,382"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queued </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> queuePendingSubtitleCandidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="384" data-line-type="change-addition" data-line-index="383,383"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="385" data-line-type="change-addition" data-line-index="384,384"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">candidates.isEmpty </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="386" data-line-type="change-addition" data-line-index="385,385"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] subtitle candidates=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">candidates.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> queued=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">queued</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> reason=media-not-started"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="387" data-line-type="change-addition" data-line-index="386,386"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="388" data-line-type="change-addition" data-line-index="387,387"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="389" data-line-type="change-addition" data-line-index="388,388"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queued</span></div><div data-line="390" data-line-type="change-addition" data-line-index="389,389"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="391" data-line-type="change-addition" data-line-index="390,390">
</div><div data-line="392" data-alt-line="374" data-line-type="context" data-line-index="391,391"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedCount </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="393" data-alt-line="375" data-line-type="context" data-line-index="392,392"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duplicateCount </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="394" data-alt-line="376" data-line-type="context" data-line-index="393,393"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> baselineTrackIDs </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Set</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">rawSubtitleTracks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.filter </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">id</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> >=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">\.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">id</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">36 unmodified lines</span></div></div></div><div data-line="431" data-alt-line="413" data-line-type="context" data-line-index="430,430"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> attachedCount</span></div><div data-line="432" data-alt-line="414" data-line-type="context" data-line-index="431,431"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="433" data-alt-line="415" data-line-type="context" data-line-index="432,432">
</div><div data-line="434" data-line-type="change-addition" data-line-index="433,433"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> queuePendingSubtitleCandidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidates</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="435" data-line-type="change-addition" data-line-index="434,434"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queuedCount </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="436" data-line-type="change-addition" data-line-index="435,435"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> candidates.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forEach</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> candidate </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="437" data-line-type="change-addition" data-line-index="436,436"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">attachedSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="438" data-line-type="change-addition" data-line-index="437,437"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">pendingSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="439" data-line-type="change-addition" data-line-index="438,438"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="440" data-line-type="change-addition" data-line-index="439,439"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="441" data-line-type="change-addition" data-line-index="440,440"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="442" data-line-type="change-addition" data-line-index="441,441">
</div><div data-line="443" data-line-type="change-addition" data-line-index="442,442"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="444" data-line-type="change-addition" data-line-index="443,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleCandidates.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="445" data-line-type="change-addition" data-line-index="444,444"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queuedCount </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="446" data-line-type="change-addition" data-line-index="445,445"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="447" data-line-type="change-addition" data-line-index="446,446"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queuedCount</span></div><div data-line="448" data-line-type="change-addition" data-line-index="447,447"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="449" data-line-type="change-addition" data-line-index="448,448">
</div><div data-line="450" data-line-type="change-addition" data-line-index="449,449"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> flushPendingSubtitleCandidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="451" data-line-type="change-addition" data-line-index="450,450"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">pendingSubtitleCandidates.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="452" data-line-type="change-addition" data-line-index="451,451"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="453" data-line-type="change-addition" data-line-index="452,452"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="454" data-line-type="change-addition" data-line-index="453,453">
</div><div data-line="455" data-line-type="change-addition" data-line-index="454,454"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> candidates </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleCandidates</span></div><div data-line="456" data-line-type="change-addition" data-line-index="455,455"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleCandidates.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="457" data-line-type="change-addition" data-line-index="456,456"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pendingSubtitleURLs.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="458" data-line-type="change-addition" data-line-index="457,457"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="459" data-line-type="change-addition" data-line-index="458,458"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] flushing queued subtitles count=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">candidates.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="460" data-line-type="change-addition" data-line-index="459,459"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="461" data-line-type="change-addition" data-line-index="460,460"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> _ </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> attachSubtitles</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="462" data-line-type="change-addition" data-line-index="461,461"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="463" data-line-type="change-addition" data-line-index="462,462">
</div><div data-line="464" data-alt-line="416" data-line-type="context" data-line-index="463,463"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rawSubtitleTracks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">SubtitleTrack</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="465" data-alt-line="417" data-line-type="context" data-line-index="464,464"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> names </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">videoSubTitlesNames</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> as?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">] </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="466" data-alt-line="418" data-line-type="context" data-line-index="465,465"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> indexes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">videoSubTitlesIndexes</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> as?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [NSNumber] </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div></div></code></pre></div>
</section>
<section>
<h2>New Changes as of May 25, 2026 at 6:55 PM EDT</h2>
<h3>Summary of changes</h3>
<p>After the queue fix landed, device logs showed the queued subtitles flushing after VLC media startup, but VLC still exposed no subtitle tracks. The remaining problem was the subtitle URL shape: Stremio provider download URLs are extensionless and VLC accepts them without creating visible external subtitle tracks.</p>
<p>The subtitle resolver now downloads resolvable subtitle bodies and caches them as local files with real subtitle extensions before handing them to VLC. Stremio download URLs are still parsed as candidates, but they are no longer treated as direct VLC-ready subtitle files.</p>
<h3>Why this change was made</h3>
<p>The native backend debug output showed <code>ext=none</code> for every attached Stremio subtitle and <code>visible=0</code> after attachment. Caching the subtitle payload gives VLC a local <code>.srt</code>, <code>.vtt</code>, or <code>.ass</code> file, which is a more reliable attachment target than a provider download endpoint.</p>
<h3>Code diffs</h3>
<div class="diff-shell"><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/StreamResolver.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+79</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 117"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-line-type="context" data-column-number="37" data-line-index="36,36"><span data-line-number-content="">37</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="38" data-line-index="38,38"><span data-line-number-content="">38</span></div><div data-line-type="change-deletion" data-column-number="39" data-line-index="39,39"><span data-line-number-content="">39</span></div><div data-gutter-buffer="buffer" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh);"></div><div data-line-type="context" data-column-number="40" data-line-index="44,43"><span data-line-number-content="">40</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="41" data-line-index="46,45"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="47,46"><span data-line-number-content="">42</span></div><div data-line-type="context" data-column-number="43" data-line-index="48,47"><span data-line-number-content="">43</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">25 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="69" data-line-index="74,73"><span data-line-number-content="">69</span></div><div data-line-type="context" data-column-number="70" data-line-index="75,74"><span data-line-number-content="">70</span></div><div data-line-type="context" data-column-number="71" data-line-index="76,75"><span data-line-number-content="">71</span></div><div data-gutter-buffer="buffer" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh);"></div><div data-line-type="context" data-column-number="72" data-line-index="81,80"><span data-line-number-content="">72</span></div><div data-line-type="context" data-column-number="73" data-line-index="82,81"><span data-line-number-content="">73</span></div><div data-line-type="context" data-column-number="74" data-line-index="83,82"><span data-line-number-content="">74</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="87" data-line-index="96,95"><span data-line-number-content="">87</span></div><div data-line-type="context" data-column-number="88" data-line-index="97,96"><span data-line-number-content="">88</span></div><div data-line-type="context" data-column-number="89" data-line-index="98,97"><span data-line-number-content="">89</span></div><div data-gutter-buffer="buffer" data-buffer-size="25" style="grid-row: span 25;min-height:calc(25 * 1lh);"></div><div data-line-type="context" data-column-number="90" data-line-index="124,123"><span data-line-number-content="">90</span></div><div data-line-type="context" data-column-number="91" data-line-index="125,124"><span data-line-number-content="">91</span></div><div data-line-type="context" data-column-number="92" data-line-index="126,125"><span data-line-number-content="">92</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="131" data-line-index="165,164"><span data-line-number-content="">131</span></div><div data-line-type="context" data-column-number="132" data-line-index="166,165"><span data-line-number-content="">132</span></div><div data-line-type="context" data-column-number="133" data-line-index="167,166"><span data-line-number-content="">133</span></div><div data-line-type="change-deletion" data-column-number="134" data-line-index="168,167"><span data-line-number-content="">134</span></div><div data-line-type="context" data-column-number="135" data-line-index="169,168"><span data-line-number-content="">135</span></div><div data-line-type="context" data-column-number="136" data-line-index="170,169"><span data-line-number-content="">136</span></div><div data-line-type="context" data-column-number="137" data-line-index="171,170"><span data-line-number-content="">137</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">16 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="154" data-line-index="188,187"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="189,188"><span data-line-number-content="">155</span></div><div data-line-type="context" data-column-number="156" data-line-index="190,189"><span data-line-number-content="">156</span></div><div data-gutter-buffer="buffer" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh);"></div><div data-line-type="context" data-column-number="157" data-line-index="235,234"><span data-line-number-content="">157</span></div><div data-line-type="context" data-column-number="158" data-line-index="236,235"><span data-line-number-content="">158</span></div><div data-line-type="context" data-column-number="159" data-line-index="237,236"><span data-line-number-content="">159</span></div></div><div data-content="" style="grid-row: span 117"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line="35" data-alt-line="35" data-line-type="context" data-line-index="34,34">
</div><div data-line="36" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">final</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> class</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> SubtitleResolver</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> SubtitleResolving </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="37" data-alt-line="37" data-line-type="context" data-line-index="36,36"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session: URLSession</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="38" data-alt-line="39" data-line-type="context" data-line-index="38,38">
</div><div data-line="39" data-line-type="change-deletion" data-line-index="39,39"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">session</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URLSession </span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">shared</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></span></div><div data-content-buffer="" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh)"></div><div data-line="40" data-alt-line="44" data-line-type="context" data-line-index="44,43"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">session</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="41" data-alt-line="46" data-line-type="context" data-line-index="46,45"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="42" data-alt-line="47" data-line-type="context" data-line-index="47,46">
</div><div data-line="43" data-alt-line="48" data-line-type="context" data-line-index="48,47"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> resolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidate</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">25 unmodified lines</span></div></div></div><div data-line="69" data-alt-line="74" data-line-type="context" data-line-index="74,73"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> finalURL, label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> candidate.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">label</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> candidate.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="70" data-alt-line="75" data-line-type="context" data-line-index="75,74"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="71" data-alt-line="76" data-line-type="context" data-line-index="76,75">
</div><div data-content-buffer="" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh)"></div><div data-line="72" data-alt-line="81" data-line-type="context" data-line-index="81,80"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">bestPlayableCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="73" data-alt-line="82" data-line-type="context" data-line-index="82,81"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> from</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data,</span></div><div data-line="74" data-alt-line="83" data-line-type="context" data-line-index="83,82"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseURL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> response.url,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="87" data-alt-line="96" data-line-type="context" data-line-index="96,95"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="88" data-alt-line="97" data-line-type="context" data-line-index="97,96"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="89" data-alt-line="98" data-line-type="context" data-line-index="98,97">
</div><div data-content-buffer="" data-buffer-size="25" style="grid-row: span 25;min-height:calc(25 * 1lh)"></div><div data-line="90" data-alt-line="124" data-line-type="context" data-line-index="124,123"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bestPlayableCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="91" data-alt-line="125" data-line-type="context" data-line-index="125,124"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> from</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data,</span></div><div data-line="92" data-alt-line="126" data-line-type="context" data-line-index="126,125"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseURL</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line="131" data-alt-line="165" data-line-type="context" data-line-index="165,164"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">lowercased</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="132" data-alt-line="166" data-line-type="context" data-line-index="166,165"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"srt"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"vtt"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"ass"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"ssa"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"sub"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">pathExtension</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.lowercased</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">())</span></div><div data-line="133" data-alt-line="167" data-line-type="context" data-line-index="167,166"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".srt?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".vtt?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ass?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ssa?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".sub?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".srt&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".vtt&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ass&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ssa&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".sub&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">].</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">where</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> lowercased.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="134" data-line-type="change-deletion" data-line-index="168,167"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> isStremioSubtitleDownloadURL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="135" data-alt-line="168" data-line-type="context" data-line-index="169,168"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="136" data-alt-line="169" data-line-type="context" data-line-index="170,169">
</div><div data-line="137" data-alt-line="170" data-line-type="context" data-line-index="171,170"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> shouldResolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> url</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">16 unmodified lines</span></div></div></div><div data-line="154" data-alt-line="187" data-line-type="context" data-line-index="188,187"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> path.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> #"(^|/)download(/|$)"#</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, options</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">regularExpression</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="155" data-alt-line="188" data-line-type="context" data-line-index="189,188"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="156" data-alt-line="189" data-line-type="context" data-line-index="190,189">
</div><div data-content-buffer="" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh)"></div><div data-line="157" data-alt-line="234" data-line-type="context" data-line-index="235,234"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> logRejected</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidate</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: SubtitleCandidate, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">responseURL</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="158" data-alt-line="235" data-line-type="context" data-line-index="236,235"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="159" data-alt-line="236" data-line-type="context" data-line-index="237,236"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseDescription </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseURL.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> URLRedactor.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">redactedURLString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "none"</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 117"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-line-type="context" data-column-number="37" data-line-index="36,36"><span data-line-number-content="">37</span></div><div data-line-type="change-addition" data-column-number="38" data-line-index="37,37"><span data-line-number-content="">38</span></div><div data-line-type="context" data-column-number="39" data-line-index="38,38"><span data-line-number-content="">39</span></div><div data-line-type="change-addition" data-column-number="40" data-line-index="40,39"><span data-line-number-content="">40</span></div><div data-line-type="change-addition" data-column-number="41" data-line-index="41,40"><span data-line-number-content="">41</span></div><div data-line-type="change-addition" data-column-number="42" data-line-index="42,41"><span data-line-number-content="">42</span></div><div data-line-type="change-addition" data-column-number="43" data-line-index="43,42"><span data-line-number-content="">43</span></div><div data-line-type="context" data-column-number="44" data-line-index="44,43"><span data-line-number-content="">44</span></div><div data-line-type="change-addition" data-column-number="45" data-line-index="45,44"><span data-line-number-content="">45</span></div><div data-line-type="context" data-column-number="46" data-line-index="46,45"><span data-line-number-content="">46</span></div><div data-line-type="context" data-column-number="47" data-line-index="47,46"><span data-line-number-content="">47</span></div><div data-line-type="context" data-column-number="48" data-line-index="48,47"><span data-line-number-content="">48</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">25 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="74" data-line-index="74,73"><span data-line-number-content="">74</span></div><div data-line-type="context" data-column-number="75" data-line-index="75,74"><span data-line-number-content="">75</span></div><div data-line-type="context" data-column-number="76" data-line-index="76,75"><span data-line-number-content="">76</span></div><div data-line-type="change-addition" data-column-number="77" data-line-index="77,76"><span data-line-number-content="">77</span></div><div data-line-type="change-addition" data-column-number="78" data-line-index="78,77"><span data-line-number-content="">78</span></div><div data-line-type="change-addition" data-column-number="79" data-line-index="79,78"><span data-line-number-content="">79</span></div><div data-line-type="change-addition" data-column-number="80" data-line-index="80,79"><span data-line-number-content="">80</span></div><div data-line-type="context" data-column-number="81" data-line-index="81,80"><span data-line-number-content="">81</span></div><div data-line-type="context" data-column-number="82" data-line-index="82,81"><span data-line-number-content="">82</span></div><div data-line-type="context" data-column-number="83" data-line-index="83,82"><span data-line-number-content="">83</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="96" data-line-index="96,95"><span data-line-number-content="">96</span></div><div data-line-type="context" data-column-number="97" data-line-index="97,96"><span data-line-number-content="">97</span></div><div data-line-type="context" data-column-number="98" data-line-index="98,97"><span data-line-number-content="">98</span></div><div data-line-type="change-addition" data-column-number="99" data-line-index="99,98"><span data-line-number-content="">99</span></div><div data-line-type="change-addition" data-column-number="100" data-line-index="100,99"><span data-line-number-content="">100</span></div><div data-line-type="change-addition" data-column-number="101" data-line-index="101,100"><span data-line-number-content="">101</span></div><div data-line-type="change-addition" data-column-number="102" data-line-index="102,101"><span data-line-number-content="">102</span></div><div data-line-type="change-addition" data-column-number="103" data-line-index="103,102"><span data-line-number-content="">103</span></div><div data-line-type="change-addition" data-column-number="104" data-line-index="104,103"><span data-line-number-content="">104</span></div><div data-line-type="change-addition" data-column-number="105" data-line-index="105,104"><span data-line-number-content="">105</span></div><div data-line-type="change-addition" data-column-number="106" data-line-index="106,105"><span data-line-number-content="">106</span></div><div data-line-type="change-addition" data-column-number="107" data-line-index="107,106"><span data-line-number-content="">107</span></div><div data-line-type="change-addition" data-column-number="108" data-line-index="108,107"><span data-line-number-content="">108</span></div><div data-line-type="change-addition" data-column-number="109" data-line-index="109,108"><span data-line-number-content="">109</span></div><div data-line-type="change-addition" data-column-number="110" data-line-index="110,109"><span data-line-number-content="">110</span></div><div data-line-type="change-addition" data-column-number="111" data-line-index="111,110"><span data-line-number-content="">111</span></div><div data-line-type="change-addition" data-column-number="112" data-line-index="112,111"><span data-line-number-content="">112</span></div><div data-line-type="change-addition" data-column-number="113" data-line-index="113,112"><span data-line-number-content="">113</span></div><div data-line-type="change-addition" data-column-number="114" data-line-index="114,113"><span data-line-number-content="">114</span></div><div data-line-type="change-addition" data-column-number="115" data-line-index="115,114"><span data-line-number-content="">115</span></div><div data-line-type="change-addition" data-column-number="116" data-line-index="116,115"><span data-line-number-content="">116</span></div><div data-line-type="change-addition" data-column-number="117" data-line-index="117,116"><span data-line-number-content="">117</span></div><div data-line-type="change-addition" data-column-number="118" data-line-index="118,117"><span data-line-number-content="">118</span></div><div data-line-type="change-addition" data-column-number="119" data-line-index="119,118"><span data-line-number-content="">119</span></div><div data-line-type="change-addition" data-column-number="120" data-line-index="120,119"><span data-line-number-content="">120</span></div><div data-line-type="change-addition" data-column-number="121" data-line-index="121,120"><span data-line-number-content="">121</span></div><div data-line-type="change-addition" data-column-number="122" data-line-index="122,121"><span data-line-number-content="">122</span></div><div data-line-type="change-addition" data-column-number="123" data-line-index="123,122"><span data-line-number-content="">123</span></div><div data-line-type="context" data-column-number="124" data-line-index="124,123"><span data-line-number-content="">124</span></div><div data-line-type="context" data-column-number="125" data-line-index="125,124"><span data-line-number-content="">125</span></div><div data-line-type="context" data-column-number="126" data-line-index="126,125"><span data-line-number-content="">126</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="165" data-line-index="165,164"><span data-line-number-content="">165</span></div><div data-line-type="context" data-column-number="166" data-line-index="166,165"><span data-line-number-content="">166</span></div><div data-line-type="context" data-column-number="167" data-line-index="167,166"><span data-line-number-content="">167</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="168" data-line-index="169,168"><span data-line-number-content="">168</span></div><div data-line-type="context" data-column-number="169" data-line-index="170,169"><span data-line-number-content="">169</span></div><div data-line-type="context" data-column-number="170" data-line-index="171,170"><span data-line-number-content="">170</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">16 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="187" data-line-index="188,187"><span data-line-number-content="">187</span></div><div data-line-type="context" data-column-number="188" data-line-index="189,188"><span data-line-number-content="">188</span></div><div data-line-type="context" data-column-number="189" data-line-index="190,189"><span data-line-number-content="">189</span></div><div data-line-type="change-addition" data-column-number="190" data-line-index="191,190"><span data-line-number-content="">190</span></div><div data-line-type="change-addition" data-column-number="191" data-line-index="192,191"><span data-line-number-content="">191</span></div><div data-line-type="change-addition" data-column-number="192" data-line-index="193,192"><span data-line-number-content="">192</span></div><div data-line-type="change-addition" data-column-number="193" data-line-index="194,193"><span data-line-number-content="">193</span></div><div data-line-type="change-addition" data-column-number="194" data-line-index="195,194"><span data-line-number-content="">194</span></div><div data-line-type="change-addition" data-column-number="195" data-line-index="196,195"><span data-line-number-content="">195</span></div><div data-line-type="change-addition" data-column-number="196" data-line-index="197,196"><span data-line-number-content="">196</span></div><div data-line-type="change-addition" data-column-number="197" data-line-index="198,197"><span data-line-number-content="">197</span></div><div data-line-type="change-addition" data-column-number="198" data-line-index="199,198"><span data-line-number-content="">198</span></div><div data-line-type="change-addition" data-column-number="199" data-line-index="200,199"><span data-line-number-content="">199</span></div><div data-line-type="change-addition" data-column-number="200" data-line-index="201,200"><span data-line-number-content="">200</span></div><div data-line-type="change-addition" data-column-number="201" data-line-index="202,201"><span data-line-number-content="">201</span></div><div data-line-type="change-addition" data-column-number="202" data-line-index="203,202"><span data-line-number-content="">202</span></div><div data-line-type="change-addition" data-column-number="203" data-line-index="204,203"><span data-line-number-content="">203</span></div><div data-line-type="change-addition" data-column-number="204" data-line-index="205,204"><span data-line-number-content="">204</span></div><div data-line-type="change-addition" data-column-number="205" data-line-index="206,205"><span data-line-number-content="">205</span></div><div data-line-type="change-addition" data-column-number="206" data-line-index="207,206"><span data-line-number-content="">206</span></div><div data-line-type="change-addition" data-column-number="207" data-line-index="208,207"><span data-line-number-content="">207</span></div><div data-line-type="change-addition" data-column-number="208" data-line-index="209,208"><span data-line-number-content="">208</span></div><div data-line-type="change-addition" data-column-number="209" data-line-index="210,209"><span data-line-number-content="">209</span></div><div data-line-type="change-addition" data-column-number="210" data-line-index="211,210"><span data-line-number-content="">210</span></div><div data-line-type="change-addition" data-column-number="211" data-line-index="212,211"><span data-line-number-content="">211</span></div><div data-line-type="change-addition" data-column-number="212" data-line-index="213,212"><span data-line-number-content="">212</span></div><div data-line-type="change-addition" data-column-number="213" data-line-index="214,213"><span data-line-number-content="">213</span></div><div data-line-type="change-addition" data-column-number="214" data-line-index="215,214"><span data-line-number-content="">214</span></div><div data-line-type="change-addition" data-column-number="215" data-line-index="216,215"><span data-line-number-content="">215</span></div><div data-line-type="change-addition" data-column-number="216" data-line-index="217,216"><span data-line-number-content="">216</span></div><div data-line-type="change-addition" data-column-number="217" data-line-index="218,217"><span data-line-number-content="">217</span></div><div data-line-type="change-addition" data-column-number="218" data-line-index="219,218"><span data-line-number-content="">218</span></div><div data-line-type="change-addition" data-column-number="219" data-line-index="220,219"><span data-line-number-content="">219</span></div><div data-line-type="change-addition" data-column-number="220" data-line-index="221,220"><span data-line-number-content="">220</span></div><div data-line-type="change-addition" data-column-number="221" data-line-index="222,221"><span data-line-number-content="">221</span></div><div data-line-type="change-addition" data-column-number="222" data-line-index="223,222"><span data-line-number-content="">222</span></div><div data-line-type="change-addition" data-column-number="223" data-line-index="224,223"><span data-line-number-content="">223</span></div><div data-line-type="change-addition" data-column-number="224" data-line-index="225,224"><span data-line-number-content="">224</span></div><div data-line-type="change-addition" data-column-number="225" data-line-index="226,225"><span data-line-number-content="">225</span></div><div data-line-type="change-addition" data-column-number="226" data-line-index="227,226"><span data-line-number-content="">226</span></div><div data-line-type="change-addition" data-column-number="227" data-line-index="228,227"><span data-line-number-content="">227</span></div><div data-line-type="change-addition" data-column-number="228" data-line-index="229,228"><span data-line-number-content="">228</span></div><div data-line-type="change-addition" data-column-number="229" data-line-index="230,229"><span data-line-number-content="">229</span></div><div data-line-type="change-addition" data-column-number="230" data-line-index="231,230"><span data-line-number-content="">230</span></div><div data-line-type="change-addition" data-column-number="231" data-line-index="232,231"><span data-line-number-content="">231</span></div><div data-line-type="change-addition" data-column-number="232" data-line-index="233,232"><span data-line-number-content="">232</span></div><div data-line-type="change-addition" data-column-number="233" data-line-index="234,233"><span data-line-number-content="">233</span></div><div data-line-type="context" data-column-number="234" data-line-index="235,234"><span data-line-number-content="">234</span></div><div data-line-type="context" data-column-number="235" data-line-index="236,235"><span data-line-number-content="">235</span></div><div data-line-type="context" data-column-number="236" data-line-index="237,236"><span data-line-number-content="">236</span></div></div><div data-content="" style="grid-row: span 117"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line="35" data-alt-line="35" data-line-type="context" data-line-index="34,34">
</div><div data-line="36" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">final</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> class</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> SubtitleResolver</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> SubtitleResolving </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="37" data-alt-line="37" data-line-type="context" data-line-index="36,36"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session: URLSession</span></div><div data-line="38" data-line-type="change-addition" data-line-index="37,37"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheDirectory: URL</span></div><div data-line="39" data-alt-line="38" data-line-type="context" data-line-index="38,38">
</div><div data-line="40" data-line-type="change-addition" data-line-index="40,39"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="41" data-line-type="change-addition" data-line-index="41,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> session</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URLSession </span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">shared</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="42" data-line-type="change-addition" data-line-index="42,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheDirectory</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL </span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> FileManager.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">default</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">temporaryDirectory</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">appendingPathComponent</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"DreamioSubtitles"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, isDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="43" data-line-type="change-addition" data-line-index="43,42"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="44" data-alt-line="40" data-line-type="context" data-line-index="44,43"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">session</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session</span></div><div data-line="45" data-line-type="change-addition" data-line-index="45,44"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">cacheDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheDirectory</span></div><div data-line="46" data-alt-line="41" data-line-type="context" data-line-index="46,45"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="47" data-alt-line="42" data-line-type="context" data-line-index="47,46">
</div><div data-line="48" data-alt-line="43" data-line-type="context" data-line-index="48,47"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> resolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidate</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">25 unmodified lines</span></div></div></div><div data-line="74" data-alt-line="69" data-line-type="context" data-line-index="74,73"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> finalURL, label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> candidate.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">label</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> candidate.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="75" data-alt-line="70" data-line-type="context" data-line-index="75,74"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="76" data-alt-line="71" data-line-type="context" data-line-index="76,75">
</div><div data-line="77" data-line-type="change-addition" data-line-index="77,76"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cachedCandidate </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheSubtitleDataIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data, original</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="78" data-line-type="change-addition" data-line-index="78,77"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cachedCandidate</span></div><div data-line="79" data-line-type="change-addition" data-line-index="79,78"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="80" data-line-type="change-addition" data-line-index="80,79">
</div><div data-line="81" data-alt-line="72" data-line-type="context" data-line-index="81,80"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">bestPlayableCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="82" data-alt-line="73" data-line-type="context" data-line-index="82,81"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> from</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data,</span></div><div data-line="83" data-alt-line="74" data-line-type="context" data-line-index="83,82"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseURL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> response.url,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="96" data-alt-line="87" data-line-type="context" data-line-index="96,95"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="97" data-alt-line="88" data-line-type="context" data-line-index="97,96"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="98" data-alt-line="89" data-line-type="context" data-line-index="98,97">
</div><div data-line="99" data-line-type="change-addition" data-line-index="99,98"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheSubtitleDataIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">original</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="100" data-line-type="change-addition" data-line-index="100,99"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> subtitleType </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">subtitleType</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="101" data-line-type="change-addition" data-line-index="101,100"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="102" data-line-type="change-addition" data-line-index="102,101"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="103" data-line-type="change-addition" data-line-index="103,102">
</div><div data-line="104" data-line-type="change-addition" data-line-index="104,103"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="105" data-line-type="change-addition" data-line-index="105,104"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> FileManager.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">default</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">createDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="106" data-line-type="change-addition" data-line-index="106,105"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheDirectory,</span></div><div data-line="107" data-line-type="change-addition" data-line-index="107,106"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> withIntermediateDirectories</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span></div><div data-line="108" data-line-type="change-addition" data-line-index="108,107"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="109" data-line-type="change-addition" data-line-index="109,108"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> filename </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">UUID</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">uuidString</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">subtitleType.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">fileExtension</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span></div><div data-line="110" data-line-type="change-addition" data-line-index="110,109"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fileURL </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheDirectory.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">appendingPathComponent</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">filename</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="111" data-line-type="change-addition" data-line-index="111,110"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">write</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fileURL, options</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">atomic</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="112" data-line-type="change-addition" data-line-index="112,111"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="113" data-line-type="change-addition" data-line-index="113,112"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioSubtitles] cached subtitle url=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">URLRedactor.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">redactedURLString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">original.url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> file=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fileURL.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">lastPathComponent</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="114" data-line-type="change-addition" data-line-index="114,113"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="115" data-line-type="change-addition" data-line-index="115,114"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fileURL, label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> original.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">label</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> original.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="116" data-line-type="change-addition" data-line-index="116,115"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> catch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="117" data-line-type="change-addition" data-line-index="117,116"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="118" data-line-type="change-addition" data-line-index="118,117"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioSubtitles] cache failure=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">error.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">localizedDescription</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> url=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">URLRedactor.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">redactedURLString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">original.url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="119" data-line-type="change-addition" data-line-index="119,118"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="120" data-line-type="change-addition" data-line-index="120,119"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="121" data-line-type="change-addition" data-line-index="121,120"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="122" data-line-type="change-addition" data-line-index="122,121"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="123" data-line-type="change-addition" data-line-index="123,122">
</div><div data-line="124" data-alt-line="90" data-line-type="context" data-line-index="124,123"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bestPlayableCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="125" data-alt-line="91" data-line-type="context" data-line-index="125,124"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> from</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data,</span></div><div data-line="126" data-alt-line="92" data-line-type="context" data-line-index="126,125"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseURL</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line="165" data-alt-line="131" data-line-type="context" data-line-index="165,164"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">lowercased</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="166" data-alt-line="132" data-line-type="context" data-line-index="166,165"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"srt"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"vtt"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"ass"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"ssa"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"sub"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">pathExtension</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.lowercased</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">())</span></div><div data-line="167" data-alt-line="133" data-line-type="context" data-line-index="167,166"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".srt?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".vtt?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ass?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ssa?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".sub?"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".srt&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".vtt&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ass&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".ssa&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">".sub&#x26;"</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">].</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">where</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> lowercased.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="168" data-alt-line="135" data-line-type="context" data-line-index="169,168"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="169" data-alt-line="136" data-line-type="context" data-line-index="170,169">
</div><div data-line="170" data-alt-line="137" data-line-type="context" data-line-index="171,170"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> shouldResolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> url</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">16 unmodified lines</span></div></div></div><div data-line="187" data-alt-line="154" data-line-type="context" data-line-index="188,187"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> path.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> #"(^|/)download(/|$)"#</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, options</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">regularExpression</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="188" data-alt-line="155" data-line-type="context" data-line-index="189,188"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="189" data-alt-line="156" data-line-type="context" data-line-index="190,189">
</div><div data-line="190" data-line-type="change-addition" data-line-index="191,190"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> enum</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> SubtitlePayloadType</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="191" data-line-type="change-addition" data-line-index="192,191"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> case</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> srt</span></div><div data-line="192" data-line-type="change-addition" data-line-index="193,192"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> case</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> vtt</span></div><div data-line="193" data-line-type="change-addition" data-line-index="194,193"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> case</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> ass</span></div><div data-line="194" data-line-type="change-addition" data-line-index="195,194">
</div><div data-line="195" data-line-type="change-addition" data-line-index="196,195"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fileExtension: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="196" data-line-type="change-addition" data-line-index="197,196"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> switch</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="197" data-line-type="change-addition" data-line-index="198,197"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> case</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">srt</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span></div><div data-line="198" data-line-type="change-addition" data-line-index="199,198"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "srt"</span></div><div data-line="199" data-line-type="change-addition" data-line-index="200,199"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> case</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">vtt</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span></div><div data-line="200" data-line-type="change-addition" data-line-index="201,200"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "vtt"</span></div><div data-line="201" data-line-type="change-addition" data-line-index="202,201"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> case</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">ass</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span></div><div data-line="202" data-line-type="change-addition" data-line-index="203,202"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "ass"</span></div><div data-line="203" data-line-type="change-addition" data-line-index="204,203"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="204" data-line-type="change-addition" data-line-index="205,204"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="205" data-line-type="change-addition" data-line-index="206,205"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="206" data-line-type="change-addition" data-line-index="207,206">
</div><div data-line="207" data-line-type="change-addition" data-line-index="208,207"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> subtitleType</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> SubtitlePayloadType</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="208" data-line-type="change-addition" data-line-index="209,208"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data.isEmpty,</span></div><div data-line="209" data-line-type="change-addition" data-line-index="210,209"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> text </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data.prefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4096</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, encoding</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .utf8</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)?</span></div><div data-line="210" data-line-type="change-addition" data-line-index="211,210"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">trimmingCharacters</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">whitespacesAndNewlines</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="211" data-line-type="change-addition" data-line-index="212,211"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">text.isEmpty</span></div><div data-line="212" data-line-type="change-addition" data-line-index="213,212"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="213" data-line-type="change-addition" data-line-index="214,213"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="214" data-line-type="change-addition" data-line-index="215,214"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="215" data-line-type="change-addition" data-line-index="216,215">
</div><div data-line="216" data-line-type="change-addition" data-line-index="217,216"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> text.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">lowercased</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="217" data-line-type="change-addition" data-line-index="218,217"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"webvtt"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="218" data-line-type="change-addition" data-line-index="219,218"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">vtt</span></div><div data-line="219" data-line-type="change-addition" data-line-index="220,219"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="220" data-line-type="change-addition" data-line-index="221,220"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[script info]"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="221" data-line-type="change-addition" data-line-index="222,221"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#61D5C0;--diffs-token-light:#16A994">\n</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">[events]"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="222" data-line-type="change-addition" data-line-index="223,222"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ||</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#61D5C0;--diffs-token-light:#16A994">\r\n</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">[events]"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="223" data-line-type="change-addition" data-line-index="224,223"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">ass</span></div><div data-line="224" data-line-type="change-addition" data-line-index="225,224"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="225" data-line-type="change-addition" data-line-index="226,225"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lowercased.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="226" data-line-type="change-addition" data-line-index="227,226"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> #"(?m)^\d+\s*[\r\n]+(?:\d{1,2}:)?\d{2}:\d{2}[,.]\d{3}\s*-->\s*(?:\d{1,2}:)?\d{2}:\d{2}[,.]\d{3}"#</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="227" data-line-type="change-addition" data-line-index="228,227"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> options</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">regularExpression</span></div><div data-line="228" data-line-type="change-addition" data-line-index="229,228"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="229" data-line-type="change-addition" data-line-index="230,229"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">srt</span></div><div data-line="230" data-line-type="change-addition" data-line-index="231,230"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="231" data-line-type="change-addition" data-line-index="232,231"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="232" data-line-type="change-addition" data-line-index="233,232"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="233" data-line-type="change-addition" data-line-index="234,233">
</div><div data-line="234" data-alt-line="157" data-line-type="context" data-line-index="235,234"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> logRejected</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> candidate</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: SubtitleCandidate, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">responseURL</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="235" data-alt-line="158" data-line-type="context" data-line-index="236,235"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="236" data-alt-line="159" data-line-type="context" data-line-index="237,236"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseDescription </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseURL.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> URLRedactor.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">redactedURLString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "none"</span></div></div></code></pre><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Tests/StreamResolverTests.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-1</span><span data-additions-count="">+43</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 79"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="16" data-line-index="15,15"><span data-line-number-content="">16</span></div><div data-line-type="context" data-column-number="17" data-line-index="16,16"><span data-line-number-content="">17</span></div><div data-line-type="context" data-column-number="18" data-line-index="17,17"><span data-line-number-content="">18</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="19" data-line-index="19,19"><span data-line-number-content="">19</span></div><div data-line-type="context" data-column-number="20" data-line-index="20,20"><span data-line-number-content="">20</span></div><div data-line-type="context" data-column-number="21" data-line-index="21,21"><span data-line-number-content="">21</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">248 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="270" data-line-index="270,270"><span data-line-number-content="">270</span></div><div data-line-type="context" data-column-number="271" data-line-index="271,271"><span data-line-number-content="">271</span></div><div data-line-type="context" data-column-number="272" data-line-index="272,272"><span data-line-number-content="">272</span></div><div data-line-type="change-deletion" data-column-number="273" data-line-index="273,273"><span data-line-number-content="">273</span></div><div data-line-type="context" data-column-number="274" data-line-index="275,274"><span data-line-number-content="">274</span></div><div data-line-type="context" data-column-number="275" data-line-index="276,275"><span data-line-number-content="">275</span></div><div data-line-type="context" data-column-number="276" data-line-index="277,276"><span data-line-number-content="">276</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">160 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="437" data-line-index="438,437"><span data-line-number-content="">437</span></div><div data-line-type="context" data-column-number="438" data-line-index="439,438"><span data-line-number-content="">438</span></div><div data-line-type="context" data-column-number="439" data-line-index="440,439"><span data-line-number-content="">439</span></div><div data-gutter-buffer="buffer" data-buffer-size="38" style="grid-row: span 38;min-height:calc(38 * 1lh);"></div><div data-line-type="context" data-column-number="440" data-line-index="479,478"><span data-line-number-content="">440</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="441" data-line-index="481,480"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="482,481"><span data-line-number-content="">442</span></div><div data-line-type="context" data-column-number="443" data-line-index="483,482"><span data-line-number-content="">443</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">14 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="458" data-line-index="498,497"><span data-line-number-content="">458</span></div><div data-line-type="context" data-column-number="459" data-line-index="499,498"><span data-line-number-content="">459</span></div><div data-line-type="context" data-column-number="460" data-line-index="500,499"><span data-line-number-content="">460</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="461" data-line-index="502,501"><span data-line-number-content="">461</span></div><div data-line-type="context" data-column-number="462" data-line-index="503,502"><span data-line-number-content="">462</span></div><div data-line-type="context" data-column-number="463" data-line-index="504,503"><span data-line-number-content="">463</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="476" data-line-index="517,516"><span data-line-number-content="">476</span></div><div data-line-type="context" data-column-number="477" data-line-index="518,517"><span data-line-number-content="">477</span></div><div data-line-type="context" data-column-number="478" data-line-index="519,518"><span data-line-number-content="">478</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="479" data-line-index="521,520"><span data-line-number-content="">479</span></div><div data-line-type="context" data-column-number="480" data-line-index="522,521"><span data-line-number-content="">480</span></div><div data-line-type="context" data-column-number="481" data-line-index="523,522"><span data-line-number-content="">481</span></div></div><div data-content="" style="grid-row: span 79"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line="16" data-alt-line="16" data-line-type="context" data-line-index="15,15"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testStremioSubtitleDownloadURLParsing</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="17" data-alt-line="17" data-line-type="context" data-line-index="16,16"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testOpenSubtitlesV3DownloadResponseResolution</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="18" data-alt-line="18" data-line-type="context" data-line-index="17,17"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testOpenSubtitlesNestedDownloadResponseResolution</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="19" data-alt-line="20" data-line-type="context" data-line-index="19,19"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverDownloadJSONReturningLink</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="20" data-alt-line="21" data-line-type="context" data-line-index="20,20"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRedirectToDirectSubtitle</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="21" data-alt-line="22" data-line-type="context" data-line-index="21,21"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRejectsNonSubtitleAPIResponse</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">248 unmodified lines</span></div></div></div><div data-line="270" data-alt-line="271" data-line-type="context" data-line-index="270,270"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"https://subs5.strem.io/en/download/subencoding-stremio-utf8/src-api/file/1952341941"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="271" data-alt-line="272" data-line-type="context" data-line-index="271,271"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">label</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"English"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="272" data-alt-line="273" data-line-type="context" data-line-index="272,272"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"eng"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="273" data-line-type="change-deletion" data-line-index="273,273"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">SubtitleResolver.isDirectSubtitleFile</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected Stremio subtitle downloads to be </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">attachable without another resolver hop</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="274" data-alt-line="275" data-line-type="context" data-line-index="275,274"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="275" data-alt-line="276" data-line-type="context" data-line-index="276,275">
</div><div data-line="276" data-alt-line="277" data-line-type="context" data-line-index="277,276"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testContentRangeParsing</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">160 unmodified lines</span></div></div></div><div data-line="437" data-alt-line="438" data-line-type="context" data-line-index="438,437"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"eng"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="438" data-alt-line="439" data-line-type="context" data-line-index="439,438"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="439" data-alt-line="440" data-line-type="context" data-line-index="440,439">
</div><div data-content-buffer="" data-buffer-size="38" style="grid-row: span 38;min-height:calc(38 * 1lh)"></div><div data-line="440" data-alt-line="479" data-line-type="context" data-line-index="479,478"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverDownloadJSONReturningLink</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="441" data-alt-line="481" data-line-type="context" data-line-index="481,480"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="442" data-alt-line="482" data-line-type="context" data-line-index="482,481"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://api.opensubtitles.com/api/v1/download/123"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="443" data-alt-line="483" data-line-type="context" data-line-index="483,482"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">14 unmodified lines</span></div></div></div><div data-line="458" data-alt-line="498" data-line-type="context" data-line-index="498,497"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="459" data-alt-line="499" data-line-type="context" data-line-index="499,498">
</div><div data-line="460" data-alt-line="500" data-line-type="context" data-line-index="500,499"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRedirectToDirectSubtitle</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="461" data-alt-line="502" data-line-type="context" data-line-index="502,501"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="462" data-alt-line="503" data-line-type="context" data-line-index="503,502"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://api.opensubtitles.com/api/v1/download/redirect"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="463" data-alt-line="504" data-line-type="context" data-line-index="504,503"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="476" data-alt-line="517" data-line-type="context" data-line-index="517,516"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="477" data-alt-line="518" data-line-type="context" data-line-index="518,517">
</div><div data-line="478" data-alt-line="519" data-line-type="context" data-line-index="519,518"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRejectsNonSubtitleAPIResponse</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="479" data-alt-line="521" data-line-type="context" data-line-index="521,520"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="480" data-alt-line="522" data-line-type="context" data-line-index="522,521"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://api.opensubtitles.com/api/v1/download/not-found"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="481" data-alt-line="523" data-line-type="context" data-line-index="523,522"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 79"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="16" data-line-index="15,15"><span data-line-number-content="">16</span></div><div data-line-type="context" data-column-number="17" data-line-index="16,16"><span data-line-number-content="">17</span></div><div data-line-type="context" data-column-number="18" data-line-index="17,17"><span data-line-number-content="">18</span></div><div data-line-type="change-addition" data-column-number="19" data-line-index="18,18"><span data-line-number-content="">19</span></div><div data-line-type="context" data-column-number="20" data-line-index="19,19"><span data-line-number-content="">20</span></div><div data-line-type="context" data-column-number="21" data-line-index="20,20"><span data-line-number-content="">21</span></div><div data-line-type="context" data-column-number="22" data-line-index="21,21"><span data-line-number-content="">22</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">248 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="271" data-line-index="270,270"><span data-line-number-content="">271</span></div><div data-line-type="context" data-column-number="272" data-line-index="271,271"><span data-line-number-content="">272</span></div><div data-line-type="context" data-column-number="273" data-line-index="272,272"><span data-line-number-content="">273</span></div><div data-line-type="change-addition" data-column-number="274" data-line-index="274,273"><span data-line-number-content="">274</span></div><div data-line-type="context" data-column-number="275" data-line-index="275,274"><span data-line-number-content="">275</span></div><div data-line-type="context" data-column-number="276" data-line-index="276,275"><span data-line-number-content="">276</span></div><div data-line-type="context" data-column-number="277" data-line-index="277,276"><span data-line-number-content="">277</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">160 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="438" data-line-index="438,437"><span data-line-number-content="">438</span></div><div data-line-type="context" data-column-number="439" data-line-index="439,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="440,439"><span data-line-number-content="">440</span></div><div data-line-type="change-addition" data-column-number="441" data-line-index="441,440"><span data-line-number-content="">441</span></div><div data-line-type="change-addition" data-column-number="442" data-line-index="442,441"><span data-line-number-content="">442</span></div><div data-line-type="change-addition" data-column-number="443" data-line-index="443,442"><span data-line-number-content="">443</span></div><div data-line-type="change-addition" data-column-number="444" data-line-index="444,443"><span data-line-number-content="">444</span></div><div data-line-type="change-addition" data-column-number="445" data-line-index="445,444"><span data-line-number-content="">445</span></div><div data-line-type="change-addition" data-column-number="446" data-line-index="446,445"><span data-line-number-content="">446</span></div><div data-line-type="change-addition" data-column-number="447" data-line-index="447,446"><span data-line-number-content="">447</span></div><div data-line-type="change-addition" data-column-number="448" data-line-index="448,447"><span data-line-number-content="">448</span></div><div data-line-type="change-addition" data-column-number="449" data-line-index="449,448"><span data-line-number-content="">449</span></div><div data-line-type="change-addition" data-column-number="450" data-line-index="450,449"><span data-line-number-content="">450</span></div><div data-line-type="change-addition" data-column-number="451" data-line-index="451,450"><span data-line-number-content="">451</span></div><div data-line-type="change-addition" data-column-number="452" data-line-index="452,451"><span data-line-number-content="">452</span></div><div data-line-type="change-addition" data-column-number="453" data-line-index="453,452"><span data-line-number-content="">453</span></div><div data-line-type="change-addition" data-column-number="454" data-line-index="454,453"><span data-line-number-content="">454</span></div><div data-line-type="change-addition" data-column-number="455" data-line-index="455,454"><span data-line-number-content="">455</span></div><div data-line-type="change-addition" data-column-number="456" data-line-index="456,455"><span data-line-number-content="">456</span></div><div data-line-type="change-addition" data-column-number="457" data-line-index="457,456"><span data-line-number-content="">457</span></div><div data-line-type="change-addition" data-column-number="458" data-line-index="458,457"><span data-line-number-content="">458</span></div><div data-line-type="change-addition" data-column-number="459" data-line-index="459,458"><span data-line-number-content="">459</span></div><div data-line-type="change-addition" data-column-number="460" data-line-index="460,459"><span data-line-number-content="">460</span></div><div data-line-type="change-addition" data-column-number="461" data-line-index="461,460"><span data-line-number-content="">461</span></div><div data-line-type="change-addition" data-column-number="462" data-line-index="462,461"><span data-line-number-content="">462</span></div><div data-line-type="change-addition" data-column-number="463" data-line-index="463,462"><span data-line-number-content="">463</span></div><div data-line-type="change-addition" data-column-number="464" data-line-index="464,463"><span data-line-number-content="">464</span></div><div data-line-type="change-addition" data-column-number="465" data-line-index="465,464"><span data-line-number-content="">465</span></div><div data-line-type="change-addition" data-column-number="466" data-line-index="466,465"><span data-line-number-content="">466</span></div><div data-line-type="change-addition" data-column-number="467" data-line-index="467,466"><span data-line-number-content="">467</span></div><div data-line-type="change-addition" data-column-number="468" data-line-index="468,467"><span data-line-number-content="">468</span></div><div data-line-type="change-addition" data-column-number="469" data-line-index="469,468"><span data-line-number-content="">469</span></div><div data-line-type="change-addition" data-column-number="470" data-line-index="470,469"><span data-line-number-content="">470</span></div><div data-line-type="change-addition" data-column-number="471" data-line-index="471,470"><span data-line-number-content="">471</span></div><div data-line-type="change-addition" data-column-number="472" data-line-index="472,471"><span data-line-number-content="">472</span></div><div data-line-type="change-addition" data-column-number="473" data-line-index="473,472"><span data-line-number-content="">473</span></div><div data-line-type="change-addition" data-column-number="474" data-line-index="474,473"><span data-line-number-content="">474</span></div><div data-line-type="change-addition" data-column-number="475" data-line-index="475,474"><span data-line-number-content="">475</span></div><div data-line-type="change-addition" data-column-number="476" data-line-index="476,475"><span data-line-number-content="">476</span></div><div data-line-type="change-addition" data-column-number="477" data-line-index="477,476"><span data-line-number-content="">477</span></div><div data-line-type="change-addition" data-column-number="478" data-line-index="478,477"><span data-line-number-content="">478</span></div><div data-line-type="context" data-column-number="479" data-line-index="479,478"><span data-line-number-content="">479</span></div><div data-line-type="change-addition" data-column-number="480" data-line-index="480,479"><span data-line-number-content="">480</span></div><div data-line-type="context" data-column-number="481" data-line-index="481,480"><span data-line-number-content="">481</span></div><div data-line-type="context" data-column-number="482" data-line-index="482,481"><span data-line-number-content="">482</span></div><div data-line-type="context" data-column-number="483" data-line-index="483,482"><span data-line-number-content="">483</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">14 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="498" data-line-index="498,497"><span data-line-number-content="">498</span></div><div data-line-type="context" data-column-number="499" data-line-index="499,498"><span data-line-number-content="">499</span></div><div data-line-type="context" data-column-number="500" data-line-index="500,499"><span data-line-number-content="">500</span></div><div data-line-type="change-addition" data-column-number="501" data-line-index="501,500"><span data-line-number-content="">501</span></div><div data-line-type="context" data-column-number="502" data-line-index="502,501"><span data-line-number-content="">502</span></div><div data-line-type="context" data-column-number="503" data-line-index="503,502"><span data-line-number-content="">503</span></div><div data-line-type="context" data-column-number="504" data-line-index="504,503"><span data-line-number-content="">504</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="517" data-line-index="517,516"><span data-line-number-content="">517</span></div><div data-line-type="context" data-column-number="518" data-line-index="518,517"><span data-line-number-content="">518</span></div><div data-line-type="context" data-column-number="519" data-line-index="519,518"><span data-line-number-content="">519</span></div><div data-line-type="change-addition" data-column-number="520" data-line-index="520,519"><span data-line-number-content="">520</span></div><div data-line-type="context" data-column-number="521" data-line-index="521,520"><span data-line-number-content="">521</span></div><div data-line-type="context" data-column-number="522" data-line-index="522,521"><span data-line-number-content="">522</span></div><div data-line-type="context" data-column-number="523" data-line-index="523,522"><span data-line-number-content="">523</span></div></div><div data-content="" style="grid-row: span 79"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line="16" data-alt-line="16" data-line-type="context" data-line-index="15,15"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testStremioSubtitleDownloadURLParsing</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="17" data-alt-line="17" data-line-type="context" data-line-index="16,16"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testOpenSubtitlesV3DownloadResponseResolution</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="18" data-alt-line="18" data-line-type="context" data-line-index="17,17"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testOpenSubtitlesNestedDownloadResponseResolution</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="19" data-line-type="change-addition" data-line-index="18,18"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverCachesStremioDownloadBody</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="20" data-alt-line="19" data-line-type="context" data-line-index="19,19"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverDownloadJSONReturningLink</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="21" data-alt-line="20" data-line-type="context" data-line-index="20,20"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRedirectToDirectSubtitle</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="22" data-alt-line="21" data-line-type="context" data-line-index="21,21"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRejectsNonSubtitleAPIResponse</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">248 unmodified lines</span></div></div></div><div data-line="271" data-alt-line="270" data-line-type="context" data-line-index="270,270"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">absoluteString</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"https://subs5.strem.io/en/download/subencoding-stremio-utf8/src-api/file/1952341941"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="272" data-alt-line="271" data-line-type="context" data-line-index="271,271"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">label</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"English"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="273" data-alt-line="272" data-line-type="context" data-line-index="272,272"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"eng"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="274" data-line-type="change-addition" data-line-index="274,273"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">SubtitleResolver.isDirectSubtitleFile</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidates</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected Stremio subtitle downloads to be </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">resolved before VLC attachment</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="275" data-alt-line="274" data-line-type="context" data-line-index="275,274"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="276" data-alt-line="275" data-line-type="context" data-line-index="276,275">
</div><div data-line="277" data-alt-line="276" data-line-type="context" data-line-index="277,276"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testContentRangeParsing</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">160 unmodified lines</span></div></div></div><div data-line="438" data-alt-line="437" data-line-type="context" data-line-index="438,437"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"eng"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="439" data-alt-line="438" data-line-type="context" data-line-index="439,438"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="440" data-alt-line="439" data-line-type="context" data-line-index="440,439">
</div><div data-line="441" data-line-type="change-addition" data-line-index="441,440"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverCachesStremioDownloadBody</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="442" data-line-type="change-addition" data-line-index="442,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> sourceURL </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://subs5.strem.io/en/download/subencoding-stremio-utf8/src-api/file/1952341941"</span></div><div data-line="443" data-line-type="change-addition" data-line-index="443,442"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> subtitleBody </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> """</span></div><div data-line="444" data-line-type="change-addition" data-line-index="444,443"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> 1</span></div><div data-line="445" data-line-type="change-addition" data-line-index="445,444"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> 00:00:01,000 --> 00:00:02,000</span></div><div data-line="446" data-line-type="change-addition" data-line-index="446,445"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> Hello from Stremio</span></div><div data-line="447" data-line-type="change-addition" data-line-index="447,446">
</div><div data-line="448" data-line-type="change-addition" data-line-index="448,447"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> """</span></div><div data-line="449" data-line-type="change-addition" data-line-index="449,448"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="450" data-line-type="change-addition" data-line-index="450,449"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="451" data-line-type="change-addition" data-line-index="451,450"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> sourceURL</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="452" data-line-type="change-addition" data-line-index="452,451"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="453" data-line-type="change-addition" data-line-index="453,452"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> sourceURL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="454" data-line-type="change-addition" data-line-index="454,453"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> subtitleBody.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">using</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .utf8</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span></div><div data-line="455" data-line-type="change-addition" data-line-index="455,454"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="456" data-line-type="change-addition" data-line-index="456,455"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ]</span></div><div data-line="457" data-line-type="change-addition" data-line-index="457,456">
</div><div data-line="458" data-line-type="change-addition" data-line-index="458,457"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheDirectory </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> FileManager.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">default</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">temporaryDirectory</span></div><div data-line="459" data-line-type="change-addition" data-line-index="459,458"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">appendingPathComponent</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"DreamioSubtitleResolverTests-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">UUID</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">uuidString</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, isDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="460" data-line-type="change-addition" data-line-index="460,459"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> defer</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="461" data-line-type="change-addition" data-line-index="461,460"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> FileManager.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">default</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeItem</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="462" data-line-type="change-addition" data-line-index="462,461"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="463" data-line-type="change-addition" data-line-index="463,462">
</div><div data-line="464" data-line-type="change-addition" data-line-index="464,463"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> resolver </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> SubtitleResolver</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">session</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mockSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cacheDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheDirectory</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="465" data-line-type="change-addition" data-line-index="465,464"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> candidate </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> resolver.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">resolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">SubtitleCandidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="466" data-line-type="change-addition" data-line-index="466,465"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> sourceURL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="467" data-line-type="change-addition" data-line-index="467,466"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "English"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="468" data-line-type="change-addition" data-line-index="468,467"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> language</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "eng"</span></div><div data-line="469" data-line-type="change-addition" data-line-index="469,468"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ))</span></div><div data-line="470" data-line-type="change-addition" data-line-index="470,469">
</div><div data-line="471" data-line-type="change-addition" data-line-index="471,470"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">isFileURL</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="472" data-line-type="change-addition" data-line-index="472,471"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">pathExtension</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"srt"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="473" data-line-type="change-addition" data-line-index="473,472"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">label</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"English"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="474" data-line-type="change-addition" data-line-index="474,473"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">language</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"eng"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="475" data-line-type="change-addition" data-line-index="475,474"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cachedBody </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentsOf</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> candidate</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.url, encoding</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .utf8</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="476" data-line-type="change-addition" data-line-index="476,475"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cachedBody, subtitleBody</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="477" data-line-type="change-addition" data-line-index="477,476"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="478" data-line-type="change-addition" data-line-index="478,477">
</div><div data-line="479" data-alt-line="440" data-line-type="context" data-line-index="479,478"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverDownloadJSONReturningLink</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="480" data-line-type="change-addition" data-line-index="480,479"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="481" data-alt-line="441" data-line-type="context" data-line-index="481,480"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="482" data-alt-line="442" data-line-type="context" data-line-index="482,481"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://api.opensubtitles.com/api/v1/download/123"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="483" data-alt-line="443" data-line-type="context" data-line-index="483,482"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">14 unmodified lines</span></div></div></div><div data-line="498" data-alt-line="458" data-line-type="context" data-line-index="498,497"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="499" data-alt-line="459" data-line-type="context" data-line-index="499,498">
</div><div data-line="500" data-alt-line="460" data-line-type="context" data-line-index="500,499"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRedirectToDirectSubtitle</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="501" data-line-type="change-addition" data-line-index="501,500"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="502" data-alt-line="461" data-line-type="context" data-line-index="502,501"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="503" data-alt-line="462" data-line-type="context" data-line-index="503,502"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://api.opensubtitles.com/api/v1/download/redirect"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="504" data-alt-line="463" data-line-type="context" data-line-index="504,503"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="517" data-alt-line="476" data-line-type="context" data-line-index="517,516"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="518" data-alt-line="477" data-line-type="context" data-line-index="518,517">
</div><div data-line="519" data-alt-line="478" data-line-type="context" data-line-index="519,518"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSubtitleResolverRejectsNonSubtitleAPIResponse</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="520" data-line-type="change-addition" data-line-index="520,519"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="521" data-alt-line="479" data-line-type="context" data-line-index="521,520"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handlers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span></div><div data-line="522" data-alt-line="480" data-line-type="context" data-line-index="522,521"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://api.opensubtitles.com/api/v1/download/not-found"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></div><div data-line="523" data-alt-line="481" data-line-type="context" data-line-index="523,522"><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div></div></code></pre></div>
<h3>Related issues or PRs</h3>
<p>Related Beads issue: <code>dreamio-771</code>.</p>
</section>
<section>
<h2>Expected Impact for End-Users</h2>
<p>When an MKV stream opens through the real local range buffer, subtitles discovered before playback should still appear in the captions menu and be eligible for auto-selection once VLC exposes the track list. Stremio subtitle downloads should now reach VLC as local subtitle files rather than extensionless provider URLs.</p>
</section>
<section>
<h2>Validation</h2>
<ul>
<li>Ran <code>git diff --check</code>: passed.</li>
<li>Ran <code>pod install</code> to restore missing local CocoaPods support files in this worktree.</li>
<li>Ran <code>xcodebuild -workspace Dreamio.xcworkspace -scheme Dreamio -destination 'generic/platform=iOS Simulator' -quiet build</code>: passed.</li>
<li>Ran <code>swiftc -parse-as-library -D DEBUG Dreamio/StreamCandidate.swift Dreamio/StreamResolver.swift Dreamio/ProgressiveHTTPRangeCache.swift Tests/StreamResolverTests.swift -o /tmp/StreamResolverTests &amp;&amp; /tmp/StreamResolverTests</code>: passed, including the new Stremio subtitle cache test.</li>
<li>The build still reports existing MobileVLCKit warnings about simulator deployment target and a run-script phase, but compilation succeeded.</li>
</ul>
</section>
<section>
<h2>Issues, Limitations, and Mitigations</h2>
<p>This addresses the pre-media attachment race shown in the logs and the follow-on issue where extensionless Stremio subtitle download URLs were accepted by VLC without visible tracks. If a provider returns a compressed archive, a non-UTF-8 payload, or a format outside SRT, VTT, ASS, SSA, and SUB, that would still need a separate resolver enhancement.</p>
</section>
<section>
<h2>Follow-up Work</h2>
<ul>
<li>Re-test on device with the South Park stream and confirm the log order changes to queued subtitles followed by <code>flushing queued subtitles</code> after <code>opening mode=local-cache</code>.</li>
<li>Re-test on device and look for <code>[DreamioSubtitles] cached subtitle</code> followed by VLC attachment logs with <code>ext=srt</code>, <code>ext=vtt</code>, or <code>ext=ass</code>.</li>
<li>If tracks still do not appear after local caching, capture whether VLC receives file URLs and whether MobileVLCKit reports any subtitle import errors.</li>
</ul>
</section>
</main>
</body>
</html>