@hopeplayer/core 1.3.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/HopePlayerElement.d.ts +29 -4
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/NativeEme-CXosVcw8.js +80 -0
- package/dist/chunks/NativeEme-CXosVcw8.js.map +1 -0
- package/dist/chunks/{accessibility-CehDBG3h.js → accessibility-DFx4CE0H.js} +45 -41
- package/dist/chunks/accessibility-DFx4CE0H.js.map +1 -0
- package/dist/chunks/{ads-BFmyld9u.js → ads-C4tDPsUs.js} +3 -3
- package/dist/chunks/ads-C4tDPsUs.js.map +1 -0
- package/dist/chunks/analytics-DEjTAJO9.js +281 -0
- package/dist/chunks/analytics-DEjTAJO9.js.map +1 -0
- package/dist/chunks/{cast-DJXOJLEZ.js → cast-Baxvu76A.js} +2 -2
- package/dist/chunks/{cast-DJXOJLEZ.js.map → cast-Baxvu76A.js.map} +1 -1
- package/dist/chunks/dash-CWjy-y7B.js +22 -0
- package/dist/chunks/dash-CWjy-y7B.js.map +1 -0
- package/dist/chunks/{history-YQ9A8HBv.js → history-CvydU0aN.js} +2 -2
- package/dist/chunks/{history-YQ9A8HBv.js.map → history-CvydU0aN.js.map} +1 -1
- package/dist/chunks/keySystems-CNzjRq6e.js +70 -0
- package/dist/chunks/keySystems-CNzjRq6e.js.map +1 -0
- package/dist/chunks/{markers-BmcD53SJ.js → markers-Dr4-CCxE.js} +2 -2
- package/dist/chunks/{markers-BmcD53SJ.js.map → markers-Dr4-CCxE.js.map} +1 -1
- package/dist/chunks/{player-BVkwkn4b.js → player-DV4Hf5Cw.js} +1320 -993
- package/dist/chunks/player-DV4Hf5Cw.js.map +1 -0
- package/dist/chunks/{playlist-jDbObKz3.js → playlist-DJsdK6xm.js} +29 -21
- package/dist/chunks/playlist-DJsdK6xm.js.map +1 -0
- package/dist/chunks/pluginHost-GxNfyP5E.js +566 -0
- package/dist/chunks/pluginHost-GxNfyP5E.js.map +1 -0
- package/dist/chunks/{redirectScreen-CFZKtEdv.js → redirectScreen-BT_26-5g.js} +2 -2
- package/dist/chunks/{redirectScreen-CFZKtEdv.js.map → redirectScreen-BT_26-5g.js.map} +1 -1
- package/dist/chunks/{rewardedUnlock-Cn4_68a3.js → rewardedUnlock-jFOdzfSq.js} +2 -2
- package/dist/chunks/{rewardedUnlock-Cn4_68a3.js.map → rewardedUnlock-jFOdzfSq.js.map} +1 -1
- package/dist/chunks/{segments-DXARAkpS.js → segments--hl_QVrI.js} +2 -2
- package/dist/chunks/{segments-DXARAkpS.js.map → segments--hl_QVrI.js.map} +1 -1
- package/dist/chunks/{skipSegments-U0aUwoDt.js → skipSegments-vJMhdiJn.js} +55 -42
- package/dist/chunks/{skipSegments-U0aUwoDt.js.map → skipSegments-vJMhdiJn.js.map} +1 -1
- package/dist/chunks/{spriteThumbnails-DLfTFsPU.js → spriteThumbnails-BoxVY--_.js} +76 -53
- package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +1 -0
- package/dist/chunks/{statsPanel-DSClIwA3.js → statsPanel-D0DtoFgS.js} +2 -2
- package/dist/chunks/statsPanel-D0DtoFgS.js.map +1 -0
- package/dist/chunks/{story-Ce56rEaN.js → story-BRkhSDhR.js} +2 -2
- package/dist/chunks/{story-Ce56rEaN.js.map → story-BRkhSDhR.js.map} +1 -1
- package/dist/controls/ControlBar.d.ts +2 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +5 -0
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/drm/NativeEme.d.ts +23 -0
- package/dist/drm/NativeEme.d.ts.map +1 -0
- package/dist/drm/keySystems.d.ts +18 -0
- package/dist/drm/keySystems.d.ts.map +1 -0
- package/dist/hls/SourceManager.d.ts +31 -5
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hls/dashEngine.d.ts +85 -0
- package/dist/hls/dashEngine.d.ts.map +1 -0
- package/dist/hls/sourceGroups.d.ts.map +1 -1
- package/dist/hope-player.js +6 -3
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +3 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/keyboard/KeyboardController.d.ts +14 -0
- package/dist/keyboard/KeyboardController.d.ts.map +1 -1
- package/dist/plugin-api/PluginAds.d.ts +61 -0
- package/dist/plugin-api/PluginAds.d.ts.map +1 -0
- package/dist/plugin-api/PluginHost.d.ts +71 -0
- package/dist/plugin-api/PluginHost.d.ts.map +1 -0
- package/dist/plugin-api/registry.d.ts +10 -0
- package/dist/plugin-api/registry.d.ts.map +1 -0
- package/dist/plugin-api/types.d.ts +209 -0
- package/dist/plugin-api/types.d.ts.map +1 -0
- package/dist/plugins/accessibility/Accessibility.d.ts +5 -0
- package/dist/plugins/accessibility/Accessibility.d.ts.map +1 -1
- package/dist/plugins/ads/AdsController.d.ts +2 -0
- package/dist/plugins/ads/AdsController.d.ts.map +1 -1
- package/dist/plugins/analytics/QoeTracker.d.ts +71 -0
- package/dist/plugins/analytics/QoeTracker.d.ts.map +1 -0
- package/dist/plugins/analytics/index.d.ts +6 -0
- package/dist/plugins/analytics/index.d.ts.map +1 -0
- package/dist/plugins/playlist/PlaylistRunner.d.ts +2 -0
- package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
- package/dist/plugins/skip-segments/index.d.ts +2 -0
- package/dist/plugins/skip-segments/index.d.ts.map +1 -1
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +8 -0
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
- package/dist/screens/ErrorScreen.d.ts +1 -1
- package/dist/screens/ErrorScreen.d.ts.map +1 -1
- package/dist/types/index.d.ts +159 -4
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/chunks/accessibility-CehDBG3h.js.map +0 -1
- package/dist/chunks/ads-BFmyld9u.js.map +0 -1
- package/dist/chunks/player-BVkwkn4b.js.map +0 -1
- package/dist/chunks/playlist-jDbObKz3.js.map +0 -1
- package/dist/chunks/spriteThumbnails-DLfTFsPU.js.map +0 -1
- package/dist/chunks/statsPanel-DSClIwA3.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
**An open-source, monetization-first video player** — a framework-agnostic `<hope-player>` custom element (Shadow DOM, TypeScript) with Google IMA, Prebid, rewarded ads, sponsorships, out-of-page ad triggers and Chromecast with TV ads built in. Every feature is its own lazy-loaded chunk: nothing you don't configure is downloaded.
|
|
4
4
|
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://www.umutyaldiz.com/hopecoreplayer"><img src="https://raw.githubusercontent.com/umutyaldiz/hopecoreplayer/main/docs/media/demo.webp" width="720" alt="HopeCorePlayer playing a video: captions, a Skip intro button, seek bar preview thumbnails with chapter names, the HD quality badge and the Accessibility menu"></a>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
5
9
|
Full docs, live demos and the options reference: **[umutyaldiz.com/hopecoreplayer](https://umutyaldiz.com/hopecoreplayer)**
|
|
6
10
|
|
|
7
11
|
## Quick start (CDN, no build step)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { HopePlayerOptions } from './types';
|
|
1
|
+
import type { HopePlayerOptions, HopeQoeMetrics } from './types';
|
|
2
2
|
import type Hls from 'hls.js';
|
|
3
3
|
import { type PlaybackEngineInfo } from './hls/SourceManager';
|
|
4
4
|
import { ErrorLog } from './debug/ErrorLog';
|
|
5
|
+
import type { HopePlugin, PluginInstanceHandle, PluginLoader } from './plugin-api/types';
|
|
5
6
|
/** Paket sürümü — build sırasında package.json'dan gömülür. */
|
|
6
7
|
export declare const HOPE_PLAYER_VERSION: string;
|
|
7
8
|
/** <hope-player> — çekirdek oynatma ve kontroller; plugin'ler ilgili option verilince dinamik import edilir. */
|
|
@@ -87,11 +88,19 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
87
88
|
private geoChecker;
|
|
88
89
|
private redirectScreen;
|
|
89
90
|
private redirectKey;
|
|
90
|
-
|
|
91
|
-
private
|
|
91
|
+
/** Eklentileri çalıştıran taraf — yalnızca bir eklenti kullanılınca indirilir (plugin-api/PluginHost). */
|
|
92
|
+
private pluginHost;
|
|
93
|
+
/** Seçenekler uygulanırken eklenti senkronu bitince çözülür (reklam tag dönüşümü bekler). */
|
|
94
|
+
private settlePlugins;
|
|
95
|
+
private pluginsSettled;
|
|
96
|
+
/** `player.use()` ile çalışırken eklenenler. */
|
|
97
|
+
private readonly runtimePlugins;
|
|
98
|
+
private offGlobalPlugins;
|
|
92
99
|
private accessibility;
|
|
93
100
|
private accessibilityKey;
|
|
94
101
|
private playbackHistory;
|
|
102
|
+
private qoeTracker;
|
|
103
|
+
private analyticsKey;
|
|
95
104
|
private historyKey;
|
|
96
105
|
private qrResume;
|
|
97
106
|
private pauseAd;
|
|
@@ -170,7 +179,11 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
170
179
|
set options(value: HopePlayerOptions);
|
|
171
180
|
play(): Promise<void>;
|
|
172
181
|
pause(): void;
|
|
173
|
-
/**
|
|
182
|
+
/** Kaynak yüklenmeden önce kurulur — ilk oynatma ölçülsün. */
|
|
183
|
+
private applyAnalytics;
|
|
184
|
+
/** Oturumun deneyim (QoE) ölçümleri — `options.analytics` kapalıysa null. */
|
|
185
|
+
get qoe(): HopeQoeMetrics | null;
|
|
186
|
+
/** Şu anki oynatma yolu: `native` (MP4/WebM), `native-hls` (tarayıcının HLS'i), `hls.js` ya da `dash.js` — teşhis için. */
|
|
174
187
|
get playbackEngine(): PlaybackEngineInfo;
|
|
175
188
|
/** Paket sürümü (ör. "1.0.4"). */
|
|
176
189
|
static readonly version: string;
|
|
@@ -192,6 +205,14 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
192
205
|
private readonly onContextMenu;
|
|
193
206
|
/** hls.js ile oynatılıyorsa hls.js instance'ı (olaylar, `bandwidthEstimate`, `levels`...); değilse `null`. */
|
|
194
207
|
get hls(): Hls | null;
|
|
208
|
+
/** Eklenti ekler (sayfa yenilenene ya da `remove()` çağrılana kadar). */
|
|
209
|
+
use<O>(plugin: HopePlugin<O> | PluginLoader, options?: O): PluginInstanceHandle;
|
|
210
|
+
/** Eklentiyi sayfadaki tüm player'lara ekler. */
|
|
211
|
+
static use<O>(plugin: HopePlugin<O> | PluginLoader, options?: O): () => void;
|
|
212
|
+
private syncPlugins;
|
|
213
|
+
private markPluginsPending;
|
|
214
|
+
private adTagTransform;
|
|
215
|
+
private doSyncPlugins;
|
|
195
216
|
/** `options.qrResume` kuruluysa "telefonundan devam et" QR ekranını manuel göster (ör. entegratörün kendi "telefona gönder" butonu) — otomatik gösterim kuralları (minElapsed/minRemaining) burada uygulanmaz. */
|
|
196
217
|
showQrResume(): void;
|
|
197
218
|
get showRemainingTime(): boolean;
|
|
@@ -227,6 +248,10 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
227
248
|
private sourceHeight;
|
|
228
249
|
private isSourceLocked;
|
|
229
250
|
/** Başlangıç kaynağı: `selected` (ya da ilk); kilitliyse serbest kaynakların en yükseği. */
|
|
251
|
+
/** `qualityLimit.max` üstü yükseklikler; hepsi üstündeyse en düşüğü kalır. */
|
|
252
|
+
private limitSources;
|
|
253
|
+
/** Veri tasarrufu açık ve tarayıcı tasarruf / yavaş bağlantı bildiriyorsa üst sınır (px). */
|
|
254
|
+
private dataSaverHeight;
|
|
230
255
|
private pickInitialSource;
|
|
231
256
|
private renderSourceQualities;
|
|
232
257
|
/** Kilitli kalite var mı (ödüllü reklam butonu yalnızca o zaman görünür) ve en yükseğinin etiketi. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgC,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC/
|
|
1
|
+
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var m = Object.defineProperty;
|
|
2
|
+
var w = (n, e, s) => e in n ? m(n, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : n[e] = s;
|
|
3
|
+
var h = (n, e, s) => w(n, typeof e != "symbol" ? e + "" : e, s);
|
|
4
|
+
import { drmEntries as v, KEY_SYSTEMS as y } from "./keySystems-CNzjRq6e.js";
|
|
5
|
+
const E = ['video/mp4; codecs="avc1.42E01E"', 'video/mp4; codecs="avc1.640028"', 'video/webm; codecs="vp9"'], g = ['audio/mp4; codecs="mp4a.40.2"'];
|
|
6
|
+
class L {
|
|
7
|
+
constructor(e, s, i) {
|
|
8
|
+
h(this, "setup", null);
|
|
9
|
+
h(this, "sessions", []);
|
|
10
|
+
/** Aynı initData için ikinci oturum açılmaz. */
|
|
11
|
+
h(this, "seen", /* @__PURE__ */ new Set());
|
|
12
|
+
h(this, "disposed", !1);
|
|
13
|
+
h(this, "onEncrypted", (e) => {
|
|
14
|
+
if (!e.initData) return;
|
|
15
|
+
const s = new Uint8Array(e.initData), i = `${e.initDataType}:${Array.from(s.subarray(0, 64)).join(",")}:${s.length}`;
|
|
16
|
+
this.seen.has(i) || (this.seen.add(i), this.handle(e.initDataType, s).catch((a) => this.fail(a)));
|
|
17
|
+
});
|
|
18
|
+
this.video = e, this.drm = s, this.cb = i, e.addEventListener("encrypted", this.onEncrypted);
|
|
19
|
+
}
|
|
20
|
+
destroy() {
|
|
21
|
+
this.disposed = !0, this.video.removeEventListener("encrypted", this.onEncrypted);
|
|
22
|
+
for (const e of this.sessions.splice(0)) e.close().catch(() => {
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async handle(e, s) {
|
|
26
|
+
this.setup ?? (this.setup = this.createKeys(e));
|
|
27
|
+
const i = await this.setup;
|
|
28
|
+
if (!i || this.disposed) return;
|
|
29
|
+
const a = this.video.mediaKeys;
|
|
30
|
+
if (!a) return;
|
|
31
|
+
const r = a.createSession();
|
|
32
|
+
this.sessions.push(r), r.addEventListener("message", (t) => {
|
|
33
|
+
this.license(i.name, i.lic, r, new Uint8Array(t.message), s).catch((c) => this.fail(c, i.name));
|
|
34
|
+
}), await r.generateRequest(e, s);
|
|
35
|
+
}
|
|
36
|
+
async createKeys(e) {
|
|
37
|
+
var i;
|
|
38
|
+
if (!navigator.requestMediaKeySystemAccess) throw new Error("EME is not supported");
|
|
39
|
+
const s = /\.m3u8|mpegurl/i.test(this.video.currentSrc || this.video.src);
|
|
40
|
+
for (const [a, r] of v(this.drm)) {
|
|
41
|
+
const t = a === "widevine" ? ((i = this.drm.widevine) == null ? void 0 : i.robustness) ?? "" : "", c = a === "fairplay" && s ? [{ contentType: "application/vnd.apple.mpegurl", robustness: "" }] : E.map((o) => ({ contentType: o, robustness: t })), u = {
|
|
42
|
+
initDataTypes: [e],
|
|
43
|
+
videoCapabilities: c,
|
|
44
|
+
...a === "fairplay" && s ? {} : { audioCapabilities: g.map((o) => ({ contentType: o, robustness: t })) }
|
|
45
|
+
};
|
|
46
|
+
let d;
|
|
47
|
+
try {
|
|
48
|
+
d = await navigator.requestMediaKeySystemAccess(y[a], [u]);
|
|
49
|
+
} catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const p = await d.createMediaKeys();
|
|
53
|
+
if (a === "fairplay") {
|
|
54
|
+
const o = await b(this.drm.fairplay.certificateUrl, { headers: r.headers, credentials: r.withCredentials ? "include" : "same-origin" });
|
|
55
|
+
await p.setServerCertificate(o);
|
|
56
|
+
}
|
|
57
|
+
return this.disposed ? null : (await this.video.setMediaKeys(p), { name: a, lic: r });
|
|
58
|
+
}
|
|
59
|
+
throw new Error("None of the configured DRM systems is supported by this browser");
|
|
60
|
+
}
|
|
61
|
+
async license(e, s, i, a, r) {
|
|
62
|
+
var l, f;
|
|
63
|
+
const t = e === "fairplay" ? this.drm.fairplay : void 0, c = t != null && t.prepareLicenseRequest ? await t.prepareLicenseRequest(a, r) : a, u = { ...typeof c == "string" || t != null && t.prepareLicenseRequest ? {} : { "Content-Type": "application/octet-stream" }, ...s.headers }, d = await fetch(s.licenseUrl, { method: "POST", body: c, headers: u, credentials: s.withCredentials ? "include" : "same-origin" });
|
|
64
|
+
if (!d.ok) throw new Error(`License request failed (HTTP ${d.status})`);
|
|
65
|
+
const p = await d.arrayBuffer(), o = t != null && t.parseLicenseResponse ? await t.parseLicenseResponse(p) : p;
|
|
66
|
+
this.disposed || (await i.update(o), (f = (l = this.cb).onLicense) == null || f.call(l, y[e]));
|
|
67
|
+
}
|
|
68
|
+
fail(e, s) {
|
|
69
|
+
this.disposed || this.cb.onError((e == null ? void 0 : e.message) ?? String(e), s ? y[s] : void 0);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function b(n, e) {
|
|
73
|
+
const s = await fetch(n, e);
|
|
74
|
+
if (!s.ok) throw new Error(`Certificate request failed (HTTP ${s.status})`);
|
|
75
|
+
return s.arrayBuffer();
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
L as NativeEme
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=NativeEme-CXosVcw8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeEme-CXosVcw8.js","sources":["../../src/drm/NativeEme.ts"],"sourcesContent":["// Native oynatmada (Safari HLS / FairPlay, şifreli MP4) EME: `encrypted` olayında anahtar sistemi, oturum, lisans.\nimport type { HopeDrmLicense, HopeDrmOptions } from '../types';\nimport { KEY_SYSTEMS, drmEntries, type DrmName } from './keySystems';\n\nexport interface NativeEmeCallbacks {\n onError(message: string, keySystem?: string): void;\n onLicense?(keySystem: string): void;\n}\n\nconst VIDEO_TYPES = ['video/mp4; codecs=\"avc1.42E01E\"', 'video/mp4; codecs=\"avc1.640028\"', 'video/webm; codecs=\"vp9\"'];\nconst AUDIO_TYPES = ['audio/mp4; codecs=\"mp4a.40.2\"'];\n\nexport class NativeEme {\n private setup: Promise<{ name: DrmName; lic: HopeDrmLicense } | null> | null = null;\n private readonly sessions: MediaKeySession[] = [];\n /** Aynı initData için ikinci oturum açılmaz. */\n private readonly seen = new Set<string>();\n private disposed = false;\n\n constructor(\n private readonly video: HTMLVideoElement,\n private readonly drm: HopeDrmOptions,\n private readonly cb: NativeEmeCallbacks\n ) {\n video.addEventListener('encrypted', this.onEncrypted);\n }\n\n destroy(): void {\n this.disposed = true;\n this.video.removeEventListener('encrypted', this.onEncrypted);\n for (const s of this.sessions.splice(0)) void s.close().catch(() => {});\n }\n\n private readonly onEncrypted = (e: MediaEncryptedEvent): void => {\n if (!e.initData) return;\n const initData = new Uint8Array(e.initData) as Uint8Array<ArrayBuffer>;\n const key = `${e.initDataType}:${Array.from(initData.subarray(0, 64)).join(',')}:${initData.length}`;\n if (this.seen.has(key)) return;\n this.seen.add(key);\n void this.handle(e.initDataType, initData).catch((err) => this.fail(err));\n };\n\n private async handle(initDataType: string, initData: Uint8Array): Promise<void> {\n this.setup ??= this.createKeys(initDataType);\n const chosen = await this.setup;\n if (!chosen || this.disposed) return;\n const keys = this.video.mediaKeys;\n if (!keys) return;\n const session = keys.createSession();\n this.sessions.push(session);\n session.addEventListener('message', (ev) => {\n void this.license(chosen.name, chosen.lic, session, new Uint8Array((ev as MediaKeyMessageEvent).message), initData).catch((err) => this.fail(err, chosen.name));\n });\n await session.generateRequest(initDataType, initData as Uint8Array<ArrayBuffer>);\n }\n\n private async createKeys(initDataType: string): Promise<{ name: DrmName; lic: HopeDrmLicense } | null> {\n if (!navigator.requestMediaKeySystemAccess) throw new Error('EME is not supported');\n const hlsNative = /\\.m3u8|mpegurl/i.test(this.video.currentSrc || this.video.src);\n for (const [name, lic] of drmEntries(this.drm)) {\n const robustness = name === 'widevine' ? (this.drm.widevine?.robustness ?? '') : '';\n const videoCapabilities =\n name === 'fairplay' && hlsNative ? [{ contentType: 'application/vnd.apple.mpegurl', robustness: '' }] : VIDEO_TYPES.map((contentType) => ({ contentType, robustness }));\n const config: MediaKeySystemConfiguration = {\n initDataTypes: [initDataType],\n videoCapabilities,\n ...(name === 'fairplay' && hlsNative ? {} : { audioCapabilities: AUDIO_TYPES.map((contentType) => ({ contentType, robustness })) }),\n };\n let access: MediaKeySystemAccess;\n try {\n access = await navigator.requestMediaKeySystemAccess(KEY_SYSTEMS[name], [config]);\n } catch {\n continue;\n }\n const keys = await access.createMediaKeys();\n if (name === 'fairplay') {\n const cert = await fetchBinary(this.drm.fairplay!.certificateUrl, { headers: lic.headers, credentials: lic.withCredentials ? 'include' : 'same-origin' });\n await keys.setServerCertificate(cert);\n }\n if (this.disposed) return null;\n await this.video.setMediaKeys(keys);\n return { name, lic };\n }\n throw new Error('None of the configured DRM systems is supported by this browser');\n }\n\n private async license(name: DrmName, lic: HopeDrmLicense, session: MediaKeySession, message: Uint8Array, initData: Uint8Array): Promise<void> {\n const fp = name === 'fairplay' ? this.drm.fairplay : undefined;\n const body = fp?.prepareLicenseRequest ? await fp.prepareLicenseRequest(message, initData) : message;\n const headers: Record<string, string> = { ...(typeof body === 'string' || fp?.prepareLicenseRequest ? {} : { 'Content-Type': 'application/octet-stream' }), ...lic.headers };\n const res = await fetch(lic.licenseUrl, { method: 'POST', body: body as BodyInit, headers, credentials: lic.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) throw new Error(`License request failed (HTTP ${res.status})`);\n const raw = await res.arrayBuffer();\n const out = fp?.parseLicenseResponse ? await fp.parseLicenseResponse(raw) : raw;\n if (this.disposed) return;\n await session.update(out);\n this.cb.onLicense?.(KEY_SYSTEMS[name]);\n }\n\n private fail(err: unknown, name?: DrmName): void {\n if (this.disposed) return;\n this.cb.onError((err as Error)?.message ?? String(err), name ? KEY_SYSTEMS[name] : undefined);\n }\n}\n\nasync function fetchBinary(url: string, init: RequestInit): Promise<ArrayBuffer> {\n const res = await fetch(url, init);\n if (!res.ok) throw new Error(`Certificate request failed (HTTP ${res.status})`);\n return res.arrayBuffer();\n}\n"],"names":["VIDEO_TYPES","AUDIO_TYPES","NativeEme","video","drm","cb","__publicField","initData","key","err","s","initDataType","chosen","keys","session","ev","hlsNative","name","lic","drmEntries","robustness","_a","videoCapabilities","contentType","config","access","KEY_SYSTEMS","cert","fetchBinary","message","fp","body","headers","res","raw","out","_b","url","init"],"mappings":"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"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var a = (n, t, e) =>
|
|
4
|
-
const
|
|
1
|
+
var C = Object.defineProperty;
|
|
2
|
+
var M = (n, t, e) => t in n ? C(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var a = (n, t, e) => M(n, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
const D = {
|
|
5
5
|
protanopia: [0.567, 0.433, 0, 0.558, 0.442, 0, 0, 0.242, 0.758],
|
|
6
6
|
deuteranopia: [0.625, 0.375, 0, 0.7, 0.3, 0, 0, 0.3, 0.7],
|
|
7
7
|
tritanopia: [0.95, 0.05, 0, 0, 0.433, 0.567, 0, 0.475, 0.525]
|
|
8
|
-
},
|
|
8
|
+
}, F = {
|
|
9
9
|
protanopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],
|
|
10
10
|
deuteranopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],
|
|
11
11
|
tritanopia: [1, 0, 0.7, 0, 1, 0.7, 0, 0, 0]
|
|
12
|
-
},
|
|
13
|
-
function
|
|
12
|
+
}, L = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
13
|
+
function O(n, t) {
|
|
14
14
|
const e = new Array(9);
|
|
15
15
|
for (let s = 0; s < 3; s++) for (let o = 0; o < 3; o++) e[s * 3 + o] = n[s * 3] * t[o] + n[s * 3 + 1] * t[3 + o] + n[s * 3 + 2] * t[6 + o];
|
|
16
16
|
return e;
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
const t =
|
|
20
|
-
return
|
|
18
|
+
function I(n) {
|
|
19
|
+
const t = D[n], e = L.map((o, i) => o - t[i]), s = O(F[n], e);
|
|
20
|
+
return L.map((o, i) => o + s[i]);
|
|
21
21
|
}
|
|
22
|
-
const
|
|
23
|
-
function
|
|
24
|
-
let t =
|
|
22
|
+
const z = /* @__PURE__ */ new Map();
|
|
23
|
+
function P(n) {
|
|
24
|
+
let t = z.get(n);
|
|
25
25
|
if (!t) {
|
|
26
|
-
const e =
|
|
27
|
-
t = `url("data:image/svg+xml,${encodeURIComponent(o)}#f")`,
|
|
26
|
+
const e = I(n).map((i) => Math.round(i * 1e3) / 1e3), o = `<svg xmlns='http://www.w3.org/2000/svg'><filter id='f' color-interpolation-filters='sRGB'><feColorMatrix type='matrix' values='${[e[0], e[1], e[2], 0, 0, e[3], e[4], e[5], 0, 0, e[6], e[7], e[8], 0, 0, 0, 0, 0, 1, 0].join(" ")}'/></filter></svg>`;
|
|
27
|
+
t = `url("data:image/svg+xml,${encodeURIComponent(o)}#f")`, z.set(n, t);
|
|
28
28
|
}
|
|
29
29
|
return t;
|
|
30
30
|
}
|
|
31
|
-
const
|
|
31
|
+
const Y = [1, 1.25, 1.5, 2, 3], K = [1, 1.5, 2, 3], X = ["none", "grayscale", "daylight", "night", "contrast", "protanopia", "deuteranopia", "tritanopia"], w = "hp-accessibility", d = 0.15, S = "accessibility", B = 6, T = 'button:not(.hp-center-play), a, input, [role="slider"], [part="control-bar"], .hp-chip, .hp-chip-panel, .hp-shortcuts, .hp-top-bar', A = {
|
|
32
32
|
none: "",
|
|
33
33
|
grayscale: "grayscale(1)",
|
|
34
34
|
// Aydınlık ortamda (gün ışığında ekran) seçilebilirlik: daha parlak, daha kontrastlı.
|
|
@@ -39,7 +39,7 @@ const I = [1, 1.25, 1.5, 2, 3], P = [1, 1.5, 2, 3], Y = ["none", "grayscale", "d
|
|
|
39
39
|
protanopia: "",
|
|
40
40
|
deuteranopia: "",
|
|
41
41
|
tritanopia: ""
|
|
42
|
-
}, p = (n) => `<svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="width:var(--hp-ctrl-icon-size);height:var(--hp-ctrl-icon-size)">${n}</svg>`,
|
|
42
|
+
}, p = (n) => `<svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="width:var(--hp-ctrl-icon-size);height:var(--hp-ctrl-icon-size)">${n}</svg>`, $ = {
|
|
43
43
|
// Büyüteç + artı
|
|
44
44
|
zoom: p('<circle cx="11" cy="11" r="6.5"/><path d="M20.5 20.5l-4.9-4.9M11 8.2v5.6M8.2 11h5.6"/>'),
|
|
45
45
|
// Yarısı dolu daire (renk / kontrast)
|
|
@@ -51,7 +51,7 @@ const I = [1, 1.25, 1.5, 2, 3], P = [1, 1.5, 2, 3], Y = ["none", "grayscale", "d
|
|
|
51
51
|
// Büyüyen kare (dışa oklar)
|
|
52
52
|
largeControls: p('<path d="M9 4H4v5M15 4h5v5M9 20H4v-5M15 20h5v-5"/><rect x="8.5" y="8.5" width="7" height="7" rx="1.2"/>')
|
|
53
53
|
};
|
|
54
|
-
class
|
|
54
|
+
class N {
|
|
55
55
|
constructor(t, e) {
|
|
56
56
|
a(this, "state", { zoom: 1, filter: "none", mono: !1, boost: 1, largeControls: !1 });
|
|
57
57
|
a(this, "zoomLevels");
|
|
@@ -83,7 +83,7 @@ class T {
|
|
|
83
83
|
// ── Yakınlaştırma: sürükle, iki parmak ──
|
|
84
84
|
a(this, "onPointerDown", (t) => {
|
|
85
85
|
const e = t.composedPath()[0];
|
|
86
|
-
if (!(e instanceof Element && e.closest(
|
|
86
|
+
if (!(e instanceof Element && e.closest(T))) {
|
|
87
87
|
if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: t.clientX, y: t.clientY }), this.touches.size === 2)) {
|
|
88
88
|
this.pinch = { dist: this.touchDistance(), zoom: this.state.zoom }, this.drag = null;
|
|
89
89
|
return;
|
|
@@ -103,7 +103,7 @@ class T {
|
|
|
103
103
|
});
|
|
104
104
|
a(this, "onPointerUp", (t) => {
|
|
105
105
|
var e;
|
|
106
|
-
this.touches.delete(t.pointerId), this.pinch && this.touches.size < 2 && (this.pinch = null, this.syncQuickButtons(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:accessibility", { detail: { ...this.state, changed: "zoom" } }))), ((e = this.drag) == null ? void 0 : e.id) === t.pointerId && (Math.hypot(t.clientX - this.drag.x, t.clientY - this.drag.y) >
|
|
106
|
+
this.touches.delete(t.pointerId), this.pinch && this.touches.size < 2 && (this.pinch = null, this.syncQuickButtons(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:accessibility", { detail: { ...this.state, changed: "zoom" } }))), ((e = this.drag) == null ? void 0 : e.id) === t.pointerId && (Math.hypot(t.clientX - this.drag.x, t.clientY - this.drag.y) > B && this.swallowNextClick(), this.drag = null);
|
|
107
107
|
});
|
|
108
108
|
// ── Klavye ──
|
|
109
109
|
a(this, "onKeyDown", (t) => {
|
|
@@ -119,7 +119,7 @@ class T {
|
|
|
119
119
|
this.zoomLevels.length < 2 || (t.key === "+" || t.key === "=" ? (t.preventDefault(), this.setZoom(this.zoomLevels.find((e) => e > this.state.zoom + 1e-3) ?? this.state.zoom)) : t.key === "-" || t.key === "_" ? (t.preventDefault(), this.setZoom([...this.zoomLevels].reverse().find((e) => e < this.state.zoom - 1e-3) ?? 1)) : t.key === "0" && this.state.zoom > 1 ? (t.preventDefault(), this.setZoom(1)) : t.shiftKey && this.state.zoom > 1 && t.key.startsWith("Arrow") && (t.preventDefault(), t.key === "ArrowLeft" && (this.panX = c(this.panX - d)), t.key === "ArrowRight" && (this.panX = c(this.panX + d)), t.key === "ArrowUp" && (this.panY = c(this.panY - d)), t.key === "ArrowDown" && (this.panY = c(this.panY + d)), this.applyZoom()));
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
|
-
if (this.ctx = t, this.options = e, this.zoomLevels = e.zoom === !1 ? [] :
|
|
122
|
+
if (this.ctx = t, this.options = e, this.zoomLevels = e.zoom === !1 ? [] : k(Array.isArray(e.zoom) ? e.zoom : Y), this.boostLevels = e.audio === !1 ? [] : k(e.boostLevels ?? K), this.filters = e.filters === !1 ? [] : Array.isArray(e.filters) ? ["none", ...e.filters.filter((s) => s !== "none" && s in A)] : X, this.restore(), t.registerSubmenu(this.menu()), t.hostEl.addEventListener("keydown", this.onKeyDown, !0), this.zoomLevels.length > 1) {
|
|
123
123
|
const s = t.videoAreaEl;
|
|
124
124
|
s.addEventListener("pointerdown", this.onPointerDown), s.addEventListener("pointermove", this.onPointerMove), s.addEventListener("pointerup", this.onPointerUp), s.addEventListener("pointercancel", this.onPointerUp), window.addEventListener("resize", this.applyZoom);
|
|
125
125
|
}
|
|
@@ -127,7 +127,7 @@ class T {
|
|
|
127
127
|
}
|
|
128
128
|
destroy() {
|
|
129
129
|
const t = this.ctx.videoEl;
|
|
130
|
-
this.ctx.unregisterSubmenu(
|
|
130
|
+
this.ctx.unregisterSubmenu(S), this.ctx.hostEl.removeEventListener("keydown", this.onKeyDown, !0);
|
|
131
131
|
const e = this.ctx.videoAreaEl;
|
|
132
132
|
e.removeEventListener("pointerdown", this.onPointerDown), e.removeEventListener("pointermove", this.onPointerMove), e.removeEventListener("pointerup", this.onPointerUp), e.removeEventListener("pointercancel", this.onPointerUp), t.removeEventListener("play", this.resumeAudio), window.removeEventListener("resize", this.applyZoom), this.closeShortcuts();
|
|
133
133
|
for (const s of this.quickButtons.values()) s.remove();
|
|
@@ -141,7 +141,7 @@ class T {
|
|
|
141
141
|
menu() {
|
|
142
142
|
const t = this.ctx.i18n;
|
|
143
143
|
return {
|
|
144
|
-
key:
|
|
144
|
+
key: S,
|
|
145
145
|
title: t.a11yMenu,
|
|
146
146
|
getValueLabel: () => "",
|
|
147
147
|
getItems: () => {
|
|
@@ -226,7 +226,7 @@ class T {
|
|
|
226
226
|
i == null || i.remove(), this.quickButtons.delete(o.id);
|
|
227
227
|
continue;
|
|
228
228
|
}
|
|
229
|
-
i || (i = document.createElement("button"), i.type = "button", i.className = "hp-chip hp-a11y-quick hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer", i.setAttribute("part", `a11y-quick a11y-quick-${o.id}`), i.setAttribute("data-a11y", o.id), i.innerHTML =
|
|
229
|
+
i || (i = document.createElement("button"), i.type = "button", i.className = "hp-chip hp-a11y-quick hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer", i.setAttribute("part", `a11y-quick a11y-quick-${o.id}`), i.setAttribute("data-a11y", o.id), i.innerHTML = $[o.id], this.ctx.addQuickButton(i, o.def, () => [this.menu()]), this.quickButtons.set(o.id, i)), i.setAttribute("aria-label", o.label);
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
filterLabel(t) {
|
|
@@ -254,7 +254,7 @@ class T {
|
|
|
254
254
|
}
|
|
255
255
|
applyFilter() {
|
|
256
256
|
const t = this.state.filter;
|
|
257
|
-
this.ctx.videoEl.style.filter = t === "protanopia" || t === "deuteranopia" || t === "tritanopia" ?
|
|
257
|
+
this.ctx.videoEl.style.filter = t === "protanopia" || t === "deuteranopia" || t === "tritanopia" ? P(t) : A[t];
|
|
258
258
|
}
|
|
259
259
|
// ── Ses (Web Audio) ──
|
|
260
260
|
/**
|
|
@@ -291,7 +291,7 @@ class T {
|
|
|
291
291
|
restore() {
|
|
292
292
|
if (this.options.remember !== !1)
|
|
293
293
|
try {
|
|
294
|
-
const t = JSON.parse(localStorage.getItem(
|
|
294
|
+
const t = JSON.parse(localStorage.getItem(w) ?? "null");
|
|
295
295
|
if (!t) return;
|
|
296
296
|
t.filter && this.filters.includes(t.filter) && (this.state.filter = t.filter), typeof t.mono == "boolean" && this.boostLevels.length && (this.state.mono = t.mono), typeof t.boost == "number" && this.boostLevels.includes(t.boost) && (this.state.boost = t.boost), typeof t.largeControls == "boolean" && this.options.largeControls !== !1 && (this.state.largeControls = t.largeControls);
|
|
297
297
|
} catch {
|
|
@@ -301,7 +301,7 @@ class T {
|
|
|
301
301
|
if (this.options.remember !== !1)
|
|
302
302
|
try {
|
|
303
303
|
const { filter: t, mono: e, boost: s, largeControls: o } = this.state;
|
|
304
|
-
localStorage.setItem(
|
|
304
|
+
localStorage.setItem(w, JSON.stringify({ filter: t, mono: e, boost: s, largeControls: o }));
|
|
305
305
|
} catch {
|
|
306
306
|
}
|
|
307
307
|
}
|
|
@@ -317,6 +317,7 @@ class T {
|
|
|
317
317
|
}
|
|
318
318
|
// ── Kısayol paneli ──
|
|
319
319
|
openShortcuts() {
|
|
320
|
+
var v, g;
|
|
320
321
|
if (this.shortcutsEl) return;
|
|
321
322
|
const t = this.ctx.i18n, e = document.createElement("div");
|
|
322
323
|
e.className = "hp-shortcuts", e.setAttribute("part", "shortcuts"), e.setAttribute("role", "dialog"), e.setAttribute("aria-modal", "true"), e.setAttribute("aria-labelledby", "hp-shortcuts-title");
|
|
@@ -333,23 +334,26 @@ class T {
|
|
|
333
334
|
[["←", "→", "J", "L"], t.a11yKeySeek(this.ctx.seekStep())],
|
|
334
335
|
[["↑", "↓"], t.a11yKeyVolume],
|
|
335
336
|
[["M"], t.a11yKeyMute],
|
|
336
|
-
[["F"], t.a11yKeyFullscreen]
|
|
337
|
+
[["F"], t.a11yKeyFullscreen],
|
|
338
|
+
[[",", "."], t.a11yKeyFrame]
|
|
337
339
|
];
|
|
338
|
-
this.zoomLevels.length > 1 && (h.push([["+", "−", "0"], t.a11yKeyZoom]), h.push([["Shift", "+", "←↑↓→"], t.a11yKeyPan]))
|
|
340
|
+
this.zoomLevels.length > 1 && (h.push([["+", "−", "0"], t.a11yKeyZoom]), h.push([["Shift", "+", "←↑↓→"], t.a11yKeyPan]));
|
|
341
|
+
for (const l of ((g = (v = this.ctx).extraShortcuts) == null ? void 0 : g.call(v)) ?? []) h.push([l.keys, l.description]);
|
|
342
|
+
h.push([["?"], t.a11yKeyShortcuts]);
|
|
339
343
|
const f = document.createElement("dl");
|
|
340
344
|
f.className = "hp-shortcuts-list";
|
|
341
345
|
for (const [l, m] of h) {
|
|
342
346
|
const y = document.createElement("dt");
|
|
343
|
-
for (const
|
|
344
|
-
if (
|
|
347
|
+
for (const E of l) {
|
|
348
|
+
if (E === "+" && l[0] === "Shift") {
|
|
345
349
|
y.append(" + ");
|
|
346
350
|
continue;
|
|
347
351
|
}
|
|
348
|
-
const
|
|
349
|
-
|
|
352
|
+
const x = document.createElement("kbd");
|
|
353
|
+
x.textContent = E, y.appendChild(x);
|
|
350
354
|
}
|
|
351
|
-
const
|
|
352
|
-
|
|
355
|
+
const b = document.createElement("dd");
|
|
356
|
+
b.textContent = m, f.append(y, b);
|
|
353
357
|
}
|
|
354
358
|
s.append(o, f), e.appendChild(s), e.addEventListener("click", (l) => {
|
|
355
359
|
l.stopPropagation(), l.target === e && this.closeShortcuts();
|
|
@@ -365,16 +369,16 @@ class T {
|
|
|
365
369
|
this.shortcutsEl.remove(), this.shortcutsEl = null, t && this.ctx.hostEl.focus({ preventScroll: !0 });
|
|
366
370
|
}
|
|
367
371
|
}
|
|
368
|
-
function
|
|
372
|
+
function k(n) {
|
|
369
373
|
const t = n.filter((e) => Number.isFinite(e) && e >= 1 && e <= 8);
|
|
370
374
|
return [.../* @__PURE__ */ new Set([1, ...t])].sort((e, s) => e - s);
|
|
371
375
|
}
|
|
372
376
|
const c = (n) => Math.min(1, Math.max(-1, n)), u = (n) => `${Math.round(n * 100)}%`;
|
|
373
|
-
function
|
|
374
|
-
return new
|
|
377
|
+
function Z(n, t) {
|
|
378
|
+
return new N(n, t);
|
|
375
379
|
}
|
|
376
380
|
export {
|
|
377
|
-
|
|
378
|
-
|
|
381
|
+
N as Accessibility,
|
|
382
|
+
Z as installAccessibility
|
|
379
383
|
};
|
|
380
|
-
//# sourceMappingURL=accessibility-
|
|
384
|
+
//# sourceMappingURL=accessibility-DFx4CE0H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessibility-DFx4CE0H.js","sources":["../../src/plugins/accessibility/colorBlind.ts","../../src/plugins/accessibility/Accessibility.ts","../../src/plugins/accessibility/index.ts"],"sourcesContent":["// Renk körlüğü filtreleri: daltonizasyon (renk körünün ayırt edemediği renk farkını gördüğü kanallara kaydırma).\n// Simülasyon matrisi S ile: M = I + E·(I − S). E hatayı görülebilen kanallara dağıtır. Sonuç tek bir 3×3 renk\n// matrisi — CSS `filter: url(...)` ile bir SVG feColorMatrix olarak uygulanır (shadow DOM'da #id başvurusu tarayıcıdan\n// tarayıcıya değiştiği için filtre veri adresinin içinde gelir).\n\ntype M3 = [number, number, number, number, number, number, number, number, number];\ntype Kind = 'protanopia' | 'deuteranopia' | 'tritanopia';\n\n/** RGB uzayında yaygın kullanılan renk körlüğü simülasyon matrisleri. */\nconst SIMULATE: Record<Kind, M3> = {\n protanopia: [0.567, 0.433, 0, 0.558, 0.442, 0, 0, 0.242, 0.758],\n deuteranopia: [0.625, 0.375, 0, 0.7, 0.3, 0, 0, 0.3, 0.7],\n tritanopia: [0.95, 0.05, 0, 0, 0.433, 0.567, 0, 0.475, 0.525],\n};\n\n/** Kırmızı / yeşil körlüğünde hata yeşil ve maviye; mavi körlüğünde kırmızı ve yeşile kaydırılır. */\nconst SHIFT: Record<Kind, M3> = {\n protanopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],\n deuteranopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],\n tritanopia: [1, 0, 0.7, 0, 1, 0.7, 0, 0, 0],\n};\n\nconst I: M3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\nfunction mul(a: M3, b: M3): M3 {\n const r = new Array<number>(9) as M3;\n for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) r[i * 3 + j] = a[i * 3]! * b[j]! + a[i * 3 + 1]! * b[3 + j]! + a[i * 3 + 2]! * b[6 + j]!;\n return r;\n}\n\nexport function daltonizeMatrix(kind: Kind): M3 {\n const s = SIMULATE[kind];\n const err = I.map((v, i) => v - s[i]!) as M3;\n const shifted = mul(SHIFT[kind], err);\n return I.map((v, i) => v + shifted[i]!) as M3;\n}\n\nconst cache = new Map<Kind, string>();\n\nexport function colorBlindFilterUrl(kind: Kind): string {\n let url = cache.get(kind);\n if (!url) {\n const m = daltonizeMatrix(kind).map((n) => Math.round(n * 1000) / 1000);\n const values = [m[0], m[1], m[2], 0, 0, m[3], m[4], m[5], 0, 0, m[6], m[7], m[8], 0, 0, 0, 0, 0, 1, 0].join(' ');\n const svg = `<svg xmlns='http://www.w3.org/2000/svg'><filter id='f' color-interpolation-filters='sRGB'><feColorMatrix type='matrix' values='${values}'/></filter></svg>`;\n url = `url(\"data:image/svg+xml,${encodeURIComponent(svg)}#f\")`;\n cache.set(kind, url);\n }\n return url;\n}\n","import type { AccessibilityFilter, AccessibilityOptions, AccessibilityState } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../../controls/SettingsMenu';\nimport { colorBlindFilterUrl } from './colorBlind';\n\nexport interface AccessibilityPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n videoAreaEl: HTMLElement;\n i18n: HopeLocaleStrings;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n /** Ayarlar butonunun sağına hızlı erişim butonu (SettingsMenu.addQuickButton). */\n addQuickButton(btn: HTMLButtonElement, getDef: () => SettingsSubmenuDef, getParents: () => SettingsSubmenuDef[]): void;\n /** Klavyeyle sarma adımı (sn) — kısayol listesinde gösterilir. */\n seekStep(): number;\n /** Eklentilerin kısayolları (listeye eklenir). */\n extraShortcuts?(): Array<{ keys: string[]; description: string }>;\n}\n\nconst DEFAULT_ZOOM = [1, 1.25, 1.5, 2, 3];\nconst DEFAULT_BOOST = [1, 1.5, 2, 3];\nconst ALL_FILTERS: AccessibilityFilter[] = ['none', 'grayscale', 'daylight', 'night', 'contrast', 'protanopia', 'deuteranopia', 'tritanopia'];\nconst STORAGE_KEY = 'hp-accessibility';\n/** Shift + ok ile bir adımda kaydırma (yakınlaştırılmış alanın oranı). */\nconst PAN_STEP = 0.15;\nconst SUBMENU_KEY = 'accessibility';\n/** Bundan fazla kayan basış sürükleme sayılır — ardından gelen tık yutulur. */\nconst DRAG_THRESHOLD_PX = 6;\n/**\n * Bunların üstünde başlayan sürükleme / iki parmak görüntüyü kaydırmaz (butonlar, ilerleme çubuğu, menüler). Ortadaki\n * oynat butonu hariç: duraklatılmışken bütün alanı kaplıyor — onun üstünde de kaydırılabilmeli.\n */\nconst CONTROL_SELECTOR = 'button:not(.hp-center-play), a, input, [role=\"slider\"], [part=\"control-bar\"], .hp-chip, .hp-chip-panel, .hp-shortcuts, .hp-top-bar';\n\n/** CSS filtreleri. Renk körlüğü filtreleri SVG renk matrisi (daltonizasyon) — bkz. colorBlind.ts. */\nconst CSS_FILTERS: Record<AccessibilityFilter, string> = {\n none: '',\n grayscale: 'grayscale(1)',\n // Aydınlık ortamda (gün ışığında ekran) seçilebilirlik: daha parlak, daha kontrastlı.\n daylight: 'brightness(1.18) contrast(1.18) saturate(1.1)',\n // Gece: sıcak ton, mavi ışık azaltılmış, biraz karartılmış.\n night: 'sepia(0.4) saturate(1.15) hue-rotate(-12deg) brightness(0.9)',\n contrast: 'contrast(1.55) saturate(1.25)',\n protanopia: '',\n deuteranopia: '',\n tritanopia: '',\n};\n\ntype QuickId = 'zoom' | 'filter' | 'mono' | 'boost' | 'largeControls';\n\n/** Hızlı erişim butonlarının ikonları (satır içi SVG — ikon fontunda karşılıkları yok). */\nconst svg = (body: string): string =>\n `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"width:var(--hp-ctrl-icon-size);height:var(--hp-ctrl-icon-size)\">${body}</svg>`;\nconst QUICK_ICONS: Record<QuickId, string> = {\n // Büyüteç + artı\n zoom: svg('<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"M20.5 20.5l-4.9-4.9M11 8.2v5.6M8.2 11h5.6\"/>'),\n // Yarısı dolu daire (renk / kontrast)\n filter: svg('<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 3.5a8.5 8.5 0 0 1 0 17z\" fill=\"currentColor\" stroke=\"none\"/>'),\n // Tek dalgalı hoparlör + \"1\"\n mono: svg('<path d=\"M4 9.5h3.5L12 5.5v13l-4.5-4H4z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5\"/><path d=\"M19 8.5v7\"/>'),\n // Hoparlör + artı\n boost: svg('<path d=\"M3 9.5h3.5L11 5.5v13l-4.5-4H3z\"/><path d=\"M14.5 12h6M17.5 9v6\"/>'),\n // Büyüyen kare (dışa oklar)\n largeControls: svg('<path d=\"M9 4H4v5M15 4h5v5M9 20H4v-5M15 20h5v-5\"/><rect x=\"8.5\" y=\"8.5\" width=\"7\" height=\"7\" rx=\"1.2\"/>'),\n};\ninterface AudioGraph {\n ctx: AudioContext;\n gain: GainNode;\n}\n\n/**\n * Erişilebilirlik alt menüsü: yakınlaştırma (sürükle / Shift+ok / iki parmak), görüntü filtreleri, mono ses, ses\n * güçlendirme (Web Audio), büyük kontroller ve klavye kısayolları paneli (`?`). Seçimler tarayıcıda hatırlanır.\n */\nexport class Accessibility {\n private readonly state: AccessibilityState = { zoom: 1, filter: 'none', mono: false, boost: 1, largeControls: false };\n private readonly zoomLevels: number[];\n private readonly boostLevels: number[];\n private readonly filters: AccessibilityFilter[];\n /** Kaydırma — her eksende -1…1 (yakınlaştırılmış görüntünün kenarına kadar). */\n private panX = 0;\n private panY = 0;\n private graph: AudioGraph | null = null;\n private shortcutsEl: HTMLDivElement | null = null;\n private drag: { id: number; x: number; y: number; panX: number; panY: number } | null = null;\n private readonly touches = new Map<number, { x: number; y: number }>();\n private pinch: { dist: number; zoom: number } | null = null;\n private readonly quickButtons = new Map<QuickId, HTMLButtonElement>();\n\n constructor(\n private readonly ctx: AccessibilityPlayerContext,\n private readonly options: AccessibilityOptions\n ) {\n this.zoomLevels = options.zoom === false ? [] : normalizeLevels(Array.isArray(options.zoom) ? options.zoom : DEFAULT_ZOOM);\n this.boostLevels = options.audio === false ? [] : normalizeLevels(options.boostLevels ?? DEFAULT_BOOST);\n this.filters = options.filters === false ? [] : Array.isArray(options.filters) ? ['none', ...options.filters.filter((f) => f !== 'none' && f in CSS_FILTERS)] : ALL_FILTERS;\n\n this.restore();\n ctx.registerSubmenu(this.menu());\n ctx.hostEl.addEventListener('keydown', this.onKeyDown, true);\n if (this.zoomLevels.length > 1) {\n // Video alanının tamamı (oynat butonu / altyazı katmanı videonun üstünde) — kontrollerden başlayan sürükleme hariç.\n const area = ctx.videoAreaEl;\n area.addEventListener('pointerdown', this.onPointerDown);\n area.addEventListener('pointermove', this.onPointerMove);\n area.addEventListener('pointerup', this.onPointerUp);\n area.addEventListener('pointercancel', this.onPointerUp);\n window.addEventListener('resize', this.applyZoom);\n }\n ctx.videoEl.addEventListener('play', this.resumeAudio);\n this.applyAll();\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n this.ctx.unregisterSubmenu(SUBMENU_KEY);\n this.ctx.hostEl.removeEventListener('keydown', this.onKeyDown, true);\n const area = this.ctx.videoAreaEl;\n area.removeEventListener('pointerdown', this.onPointerDown);\n area.removeEventListener('pointermove', this.onPointerMove);\n area.removeEventListener('pointerup', this.onPointerUp);\n area.removeEventListener('pointercancel', this.onPointerUp);\n v.removeEventListener('play', this.resumeAudio);\n window.removeEventListener('resize', this.applyZoom);\n this.closeShortcuts();\n for (const btn of this.quickButtons.values()) btn.remove();\n this.quickButtons.clear();\n Object.assign(v.style, { transform: '', transformOrigin: '', filter: '', touchAction: '' });\n this.ctx.hostEl.removeAttribute('data-large-controls');\n this.ctx.hostEl.removeAttribute('data-zoomed');\n // Web Audio grafiği geri alınamaz (createMediaElementSource kalıcı) — nötr değerlere çekilir.\n if (this.graph) {\n this.state.mono = false;\n this.state.boost = 1;\n this.applyAudio();\n }\n }\n\n /** Dil değişince alt menü yeni etiketlerle yeniden kaydedilir. */\n refreshLabels(): void {\n this.ctx.registerSubmenu(this.menu());\n this.syncQuickButtons();\n if (this.shortcutsEl) {\n this.closeShortcuts();\n this.openShortcuts();\n }\n }\n\n // ── Menü ──\n\n private menu(): SettingsSubmenuDef {\n const t = this.ctx.i18n;\n return {\n key: SUBMENU_KEY,\n title: t.a11yMenu,\n getValueLabel: () => '',\n getItems: () => {\n const items: SettingsSubmenuItem[] = [];\n const sub = (label: string, value: string, children: () => SettingsSubmenuDef): SettingsSubmenuItem => ({ label, value, active: false, onSelect: () => {}, children });\n if (this.zoomLevels.length > 1) items.push(sub(t.a11yZoom, pct(this.state.zoom), () => this.zoomDef()));\n if (this.filters.length > 1) items.push(sub(t.a11yFilter, this.filterLabel(this.state.filter), () => this.filterDef()));\n if (this.boostLevels.length) {\n const ok = this.audioAllowed();\n items.push({\n label: t.a11yMono,\n value: ok ? (this.state.mono ? t.a11yOn : t.a11yOff) : t.a11yUnavailable,\n active: this.state.mono,\n keepOpen: true,\n onSelect: () => {\n if (ok) this.set('mono', !this.state.mono);\n },\n });\n if (this.boostLevels.length > 1) items.push(sub(t.a11yBoost, ok ? pct(this.state.boost) : t.a11yUnavailable, () => this.boostDef()));\n }\n if (this.options.largeControls !== false)\n items.push({\n label: t.a11yLargeControls,\n value: this.state.largeControls ? t.a11yOn : t.a11yOff,\n active: this.state.largeControls,\n keepOpen: true,\n onSelect: () => this.set('largeControls', !this.state.largeControls),\n });\n if (this.options.shortcuts !== false)\n items.push({ label: t.a11yShortcuts, value: '?', active: false, onSelect: () => queueMicrotask(() => this.openShortcuts()) });\n return items;\n },\n };\n }\n\n // Özelliklerin kendi alt menüleri — hem Erişilebilirlik menüsünden hem hızlı erişim butonlarından açılır.\n\n private zoomDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-zoom',\n title: this.ctx.i18n.a11yZoom,\n getValueLabel: () => '',\n getItems: () => this.zoomLevels.map((z) => ({ label: pct(z), active: Math.abs(this.state.zoom - z) < 0.001, onSelect: () => this.setZoom(z) })),\n };\n }\n\n private filterDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-filter',\n title: this.ctx.i18n.a11yFilter,\n getValueLabel: () => '',\n getItems: () => this.filters.map((f) => ({ label: this.filterLabel(f), active: this.state.filter === f, onSelect: () => this.set('filter', f) })),\n };\n }\n\n private boostDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-boost',\n title: this.ctx.i18n.a11yBoost,\n getValueLabel: () => '',\n getItems: () => (this.audioAllowed() ? this.boostLevels.map((b) => ({ label: pct(b), active: this.state.boost === b, onSelect: () => this.set('boost', b) })) : []),\n };\n }\n\n /** Aç / kapa özellikleri (mono, büyük kontroller) için hızlı butonun açtığı iki satırlık menü. */\n private toggleDef(key: 'mono' | 'largeControls', title: string): SettingsSubmenuDef {\n const t = this.ctx.i18n;\n return {\n key: `a11y-${key}`,\n title,\n getValueLabel: () => '',\n getItems: () => [\n { label: t.a11yOn, active: this.state[key], onSelect: () => this.set(key, true) },\n { label: t.a11yOff, active: !this.state[key], onSelect: () => this.set(key, false) },\n ],\n };\n }\n\n // ── Hızlı erişim butonları ──\n\n /**\n * Açık olan her özelliğin ayarlar butonunun sağında kendi butonu olur; basınca doğrudan o özelliğin ayarları açılır\n * (yakınlaştırma seviyeleri, filtre listesi…). Özellik kapanınca buton kalkar. \"Geri\" Erişilebilirlik menüsüne döner.\n */\n private syncQuickButtons(): void {\n const t = this.ctx.i18n;\n const s = this.state;\n const specs: { id: QuickId; on: boolean; label: string; def: () => SettingsSubmenuDef }[] = [\n { id: 'zoom', on: s.zoom > 1.001, label: `${t.a11yZoom}: ${pct(s.zoom)}`, def: () => this.zoomDef() },\n { id: 'filter', on: s.filter !== 'none', label: `${t.a11yFilter}: ${this.filterLabel(s.filter)}`, def: () => this.filterDef() },\n { id: 'mono', on: s.mono, label: `${t.a11yMono}: ${t.a11yOn}`, def: () => this.toggleDef('mono', t.a11yMono) },\n { id: 'boost', on: s.boost !== 1, label: `${t.a11yBoost}: ${pct(s.boost)}`, def: () => this.boostDef() },\n { id: 'largeControls', on: s.largeControls, label: `${t.a11yLargeControls}: ${t.a11yOn}`, def: () => this.toggleDef('largeControls', t.a11yLargeControls) },\n ];\n for (const spec of specs) {\n let btn = this.quickButtons.get(spec.id);\n if (!spec.on) {\n btn?.remove();\n this.quickButtons.delete(spec.id);\n continue;\n }\n if (!btn) {\n btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-a11y-quick hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer';\n btn.setAttribute('part', `a11y-quick a11y-quick-${spec.id}`);\n btn.setAttribute('data-a11y', spec.id);\n btn.innerHTML = QUICK_ICONS[spec.id];\n this.ctx.addQuickButton(btn, spec.def, () => [this.menu()]);\n this.quickButtons.set(spec.id, btn);\n }\n // Tooltip ve ekran okuyucu: özelliğin adı + değeri (\"Yakınlaştırma: 200%\").\n btn.setAttribute('aria-label', spec.label);\n }\n }\n private filterLabel(f: AccessibilityFilter): string {\n const t = this.ctx.i18n;\n const labels: Record<AccessibilityFilter, string> = {\n none: t.a11yFilterNone,\n grayscale: t.a11yFilterGrayscale,\n daylight: t.a11yFilterDaylight,\n night: t.a11yFilterNight,\n contrast: t.a11yFilterContrast,\n protanopia: t.a11yFilterProtanopia,\n deuteranopia: t.a11yFilterDeuteranopia,\n tritanopia: t.a11yFilterTritanopia,\n };\n return labels[f];\n }\n\n // ── Durum ──\n\n private set<K extends keyof AccessibilityState>(key: K, value: AccessibilityState[K]): void {\n if (this.state[key] === value) return;\n this.state[key] = value;\n this.applyAll();\n this.save();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:accessibility', { detail: { ...this.state, changed: key } }));\n }\n\n private setZoom(z: number): void {\n if (z <= 1) {\n this.panX = 0;\n this.panY = 0;\n }\n this.set('zoom', z);\n }\n\n private applyAll(): void {\n this.applyZoom();\n this.applyFilter();\n this.applyAudio();\n this.ctx.hostEl.toggleAttribute('data-large-controls', this.state.largeControls);\n this.syncQuickButtons();\n }\n\n private readonly applyZoom = (): void => {\n const v = this.ctx.videoEl;\n const z = this.state.zoom;\n this.ctx.hostEl.toggleAttribute('data-zoomed', z > 1);\n if (this.zoomLevels.length > 1) {\n // Yakınlaştırılmamışken sayfa kaydırması serbest, tarayıcının kendi iki parmak büyütmesi kapalı (bizimki çalışsın);\n // yakınlaştırılmışken sürükleme görüntüyü kaydırır.\n v.style.touchAction = z > 1 ? 'none' : 'pan-x pan-y';\n }\n if (z <= 1) {\n v.style.transform = '';\n return;\n }\n // Kenar dışına kaydırılamaz: en fazla (z-1)/2 genişlik kadar.\n const maxX = ((z - 1) * v.clientWidth) / 2;\n const maxY = ((z - 1) * v.clientHeight) / 2;\n v.style.transformOrigin = 'center center';\n v.style.transform = `translate(${(-this.panX * maxX).toFixed(1)}px, ${(-this.panY * maxY).toFixed(1)}px) scale(${z})`;\n };\n\n private applyFilter(): void {\n const f = this.state.filter;\n this.ctx.videoEl.style.filter = f === 'protanopia' || f === 'deuteranopia' || f === 'tritanopia' ? colorBlindFilterUrl(f) : CSS_FILTERS[f];\n }\n\n // ── Ses (Web Audio) ──\n\n /**\n * Web Audio kaynağı başka alan adındaysa ve CORS'la yüklenmediyse tarayıcı sesi sıfırlar — o zaman kapalı kalır.\n * blob: (hls.js / MSE; hls.js zaten CORS'la indirir) ve aynı origin güvenli.\n */\n private audioAllowed(): boolean {\n if (typeof AudioContext === 'undefined') return false;\n const src = this.ctx.videoEl.currentSrc;\n if (!src || src.startsWith('blob:') || src.startsWith('data:')) return true;\n try {\n if (new URL(src, location.href).origin === location.origin) return true;\n } catch {\n return false;\n }\n return this.ctx.videoEl.crossOrigin !== null;\n }\n\n private applyAudio(): void {\n const needed = this.state.mono || this.state.boost !== 1;\n if (!needed && !this.graph) return;\n if (!this.graph) {\n if (!this.audioAllowed()) return;\n try {\n const ctx = new AudioContext();\n const source = ctx.createMediaElementSource(this.ctx.videoEl);\n const gain = ctx.createGain();\n source.connect(gain).connect(ctx.destination);\n this.graph = { ctx, gain };\n } catch {\n return;\n }\n }\n const { gain, ctx } = this.graph;\n gain.gain.value = this.state.boost;\n // Mono: kanalları 'speakers' kuralıyla tek kanala indir ((L+R)/2); çıkış iki hoparlöre aynı gider.\n gain.channelCountMode = this.state.mono ? 'explicit' : 'max';\n gain.channelCount = this.state.mono ? 1 : 2;\n gain.channelInterpretation = 'speakers';\n if (ctx.state === 'suspended') void ctx.resume().catch(() => {});\n }\n\n private readonly resumeAudio = (): void => {\n if (this.graph?.ctx.state === 'suspended') void this.graph.ctx.resume().catch(() => {});\n };\n\n // ── Kalıcılık ──\n\n private restore(): void {\n if (this.options.remember === false) return;\n try {\n const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? 'null') as Partial<AccessibilityState> | null;\n if (!saved) return;\n if (saved.filter && this.filters.includes(saved.filter)) this.state.filter = saved.filter;\n if (typeof saved.mono === 'boolean' && this.boostLevels.length) this.state.mono = saved.mono;\n if (typeof saved.boost === 'number' && this.boostLevels.includes(saved.boost)) this.state.boost = saved.boost;\n if (typeof saved.largeControls === 'boolean' && this.options.largeControls !== false) this.state.largeControls = saved.largeControls;\n // Yakınlaştırma bilerek hatırlanmaz — bir sonraki videoda kadrajı kaçırmasın.\n } catch {\n /* gizli sekme / bozuk kayıt — varsayılanlar */\n }\n }\n\n private save(): void {\n if (this.options.remember === false) return;\n try {\n const { filter, mono, boost, largeControls } = this.state;\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ filter, mono, boost, largeControls }));\n } catch {\n /* depolama yok — yalnızca bu oturum */\n }\n }\n\n // ── Yakınlaştırma: sürükle, iki parmak ──\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n const target = e.composedPath()[0];\n if (target instanceof Element && target.closest(CONTROL_SELECTOR)) return;\n if (e.pointerType === 'touch') {\n this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (this.touches.size === 2) {\n this.pinch = { dist: this.touchDistance(), zoom: this.state.zoom };\n this.drag = null;\n return;\n }\n }\n if (this.state.zoom <= 1 || (e.pointerType === 'mouse' && e.button !== 0)) return;\n this.drag = { id: e.pointerId, x: e.clientX, y: e.clientY, panX: this.panX, panY: this.panY };\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n if (e.pointerType === 'touch' && this.touches.has(e.pointerId)) this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (this.pinch && this.touches.size === 2) {\n const max = this.zoomLevels[this.zoomLevels.length - 1]!;\n const z = Math.min(max, Math.max(1, (this.pinch.zoom * this.touchDistance()) / this.pinch.dist));\n this.state.zoom = Math.round(z * 100) / 100;\n if (this.state.zoom <= 1) this.panX = this.panY = 0;\n this.applyZoom();\n return;\n }\n if (!this.drag || this.drag.id !== e.pointerId) return;\n const v = this.ctx.videoEl;\n const z = this.state.zoom;\n const maxX = ((z - 1) * v.clientWidth) / 2 || 1;\n const maxY = ((z - 1) * v.clientHeight) / 2 || 1;\n // Görüntü parmağı / imleci takip eder (sağa sürükle → görüntü sağa → sol taraf görünür).\n this.panX = clamp(this.drag.panX - (e.clientX - this.drag.x) / maxX);\n this.panY = clamp(this.drag.panY - (e.clientY - this.drag.y) / maxY);\n this.applyZoom();\n };\n\n private readonly onPointerUp = (e: PointerEvent): void => {\n this.touches.delete(e.pointerId);\n if (this.pinch && this.touches.size < 2) {\n this.pinch = null;\n this.syncQuickButtons();\n // İki parmakla serbest büyütme bitince olay / kayıt bir kez.\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:accessibility', { detail: { ...this.state, changed: 'zoom' } }));\n }\n if (this.drag?.id === e.pointerId) {\n // Gerçekten sürüklendiyse ardından gelen tık oynat / duraklat sayılmasın (oynat butonu bütün alanı kaplayabiliyor).\n if (Math.hypot(e.clientX - this.drag.x, e.clientY - this.drag.y) > DRAG_THRESHOLD_PX) this.swallowNextClick();\n this.drag = null;\n }\n };\n\n private swallowNextClick(): void {\n const area = this.ctx.videoAreaEl;\n const swallow = (ev: Event): void => {\n ev.stopPropagation();\n ev.preventDefault();\n };\n area.addEventListener('click', swallow, { capture: true, once: true });\n // Tık hiç gelmezse (ör. dokunmatik) sonraki gerçek tık yutulmasın.\n setTimeout(() => area.removeEventListener('click', swallow, { capture: true }), 400);\n }\n\n private touchDistance(): number {\n const [a, b] = [...this.touches.values()];\n return a && b ? Math.hypot(a.x - b.x, a.y - b.y) || 1 : 1;\n }\n\n // ── Klavye ──\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented || e.ctrlKey || e.metaKey || e.altKey) return;\n if (this.shortcutsEl && e.key === 'Escape') {\n e.preventDefault();\n this.closeShortcuts();\n return;\n }\n if (e.key === '?' && this.options.shortcuts !== false) {\n e.preventDefault();\n if (this.shortcutsEl) this.closeShortcuts();\n else this.openShortcuts();\n return;\n }\n if (this.zoomLevels.length < 2) return;\n if (e.key === '+' || e.key === '=') {\n e.preventDefault();\n this.setZoom(this.zoomLevels.find((z) => z > this.state.zoom + 0.001) ?? this.state.zoom);\n } else if (e.key === '-' || e.key === '_') {\n e.preventDefault();\n this.setZoom([...this.zoomLevels].reverse().find((z) => z < this.state.zoom - 0.001) ?? 1);\n } else if (e.key === '0' && this.state.zoom > 1) {\n e.preventDefault();\n this.setZoom(1);\n } else if (e.shiftKey && this.state.zoom > 1 && e.key.startsWith('Arrow')) {\n // Shift + ok: yakınlaştırılmış görüntüde gezin (oklar tek başına sarma / ses olarak kalır).\n e.preventDefault();\n if (e.key === 'ArrowLeft') this.panX = clamp(this.panX - PAN_STEP);\n if (e.key === 'ArrowRight') this.panX = clamp(this.panX + PAN_STEP);\n if (e.key === 'ArrowUp') this.panY = clamp(this.panY - PAN_STEP);\n if (e.key === 'ArrowDown') this.panY = clamp(this.panY + PAN_STEP);\n this.applyZoom();\n }\n };\n\n // ── Kısayol paneli ──\n\n private openShortcuts(): void {\n if (this.shortcutsEl) return;\n const t = this.ctx.i18n;\n const el = document.createElement('div');\n el.className = 'hp-shortcuts';\n el.setAttribute('part', 'shortcuts');\n el.setAttribute('role', 'dialog');\n el.setAttribute('aria-modal', 'true');\n el.setAttribute('aria-labelledby', 'hp-shortcuts-title');\n\n const box = document.createElement('div');\n box.className = 'hp-shortcuts-box';\n const head = document.createElement('div');\n head.className = 'hp-shortcuts-head';\n const title = document.createElement('h2');\n title.id = 'hp-shortcuts-title';\n title.textContent = t.a11yShortcuts;\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-shortcuts-close';\n close.setAttribute('aria-label', t.a11yClose);\n close.textContent = '✕';\n close.addEventListener('click', () => this.closeShortcuts());\n head.append(title, close);\n\n const rows: [string[], string][] = [\n [['Space', 'K'], t.a11yKeyPlay],\n [['←', '→', 'J', 'L'], t.a11yKeySeek(this.ctx.seekStep())],\n [['↑', '↓'], t.a11yKeyVolume],\n [['M'], t.a11yKeyMute],\n [['F'], t.a11yKeyFullscreen],\n [[',', '.'], t.a11yKeyFrame],\n ];\n if (this.zoomLevels.length > 1) {\n rows.push([['+', '−', '0'], t.a11yKeyZoom]);\n rows.push([['Shift', '+', '←↑↓→'], t.a11yKeyPan]);\n }\n for (const s of this.ctx.extraShortcuts?.() ?? []) rows.push([s.keys, s.description]);\n rows.push([['?'], t.a11yKeyShortcuts]);\n\n const list = document.createElement('dl');\n list.className = 'hp-shortcuts-list';\n for (const [keys, desc] of rows) {\n const dt = document.createElement('dt');\n for (const k of keys) {\n if (k === '+' && keys[0] === 'Shift') {\n dt.append(' + ');\n continue;\n }\n const kbd = document.createElement('kbd');\n kbd.textContent = k;\n dt.appendChild(kbd);\n }\n const dd = document.createElement('dd');\n dd.textContent = desc;\n list.append(dt, dd);\n }\n box.append(head, list);\n el.appendChild(box);\n // Arka plana tıklama kapatır; panelin içindeki tıklama oynat/duraklat'a geçmez.\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n if (e.target === el) this.closeShortcuts();\n });\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n // Odak paneli terk etmesin (Tab tek butonda kalır).\n el.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n close.focus();\n }\n });\n this.ctx.videoAreaEl.appendChild(el);\n this.shortcutsEl = el;\n close.focus({ preventScroll: true });\n }\n\n private closeShortcuts(): void {\n if (!this.shortcutsEl) return;\n const hadFocus = this.shortcutsEl.contains((this.ctx.hostEl.shadowRoot ?? document).activeElement);\n this.shortcutsEl.remove();\n this.shortcutsEl = null;\n if (hadFocus) this.ctx.hostEl.focus({ preventScroll: true });\n }\n}\n\nfunction normalizeLevels(levels: number[]): number[] {\n const valid = levels.filter((n) => Number.isFinite(n) && n >= 1 && n <= 8);\n return [...new Set([1, ...valid])].sort((a, b) => a - b);\n}\n\nconst clamp = (n: number): number => Math.min(1, Math.max(-1, n));\nconst pct = (n: number): string => `${Math.round(n * 100)}%`;\n","import { Accessibility, type AccessibilityPlayerContext } from './Accessibility';\nimport type { AccessibilityOptions } from '../../types';\n\nexport function installAccessibility(ctx: AccessibilityPlayerContext, options: AccessibilityOptions): Accessibility {\n return new Accessibility(ctx, options);\n}\n\nexport { Accessibility };\nexport type { AccessibilityPlayerContext };\n"],"names":["SIMULATE","SHIFT","I","mul","a","b","r","i","j","daltonizeMatrix","kind","s","err","v","shifted","cache","colorBlindFilterUrl","url","m","n","svg","DEFAULT_ZOOM","DEFAULT_BOOST","ALL_FILTERS","STORAGE_KEY","PAN_STEP","SUBMENU_KEY","DRAG_THRESHOLD_PX","CONTROL_SELECTOR","CSS_FILTERS","body","QUICK_ICONS","Accessibility","ctx","options","__publicField","z","maxX","maxY","_a","e","target","max","clamp","normalizeLevels","f","area","btn","items","sub","label","value","children","pct","ok","key","title","t","specs","spec","src","source","gain","saved","filter","mono","boost","largeControls","swallow","ev","_b","el","box","head","close","rows","list","keys","desc","dt","k","kbd","dd","hadFocus","levels","valid","installAccessibility"],"mappings":";;;AASA,MAAMA,IAA6B;AAAA,EAC/B,YAAY,CAAC,OAAO,OAAO,GAAG,OAAO,OAAO,GAAG,GAAG,OAAO,KAAK;AAAA,EAC9D,cAAc,CAAC,OAAO,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,GAAG;AAAA,EACxD,YAAY,CAAC,MAAM,MAAM,GAAG,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK;AAChE,GAGMC,IAA0B;AAAA,EAC5B,YAAY,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AAAA,EAC1C,cAAc,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AAAA,EAC5C,YAAY,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;AAC9C,GAEMC,IAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAExC,SAASC,EAAIC,GAAOC,GAAW;AAC3B,QAAMC,IAAI,IAAI,MAAc,CAAC;AAC7B,WAASC,IAAI,GAAGA,IAAI,GAAGA,cAAcC,IAAI,GAAGA,IAAI,GAAGA,IAAK,CAAAF,EAAEC,IAAI,IAAIC,CAAC,IAAIJ,EAAEG,IAAI,CAAC,IAAKF,EAAEG,CAAC,IAAKJ,EAAEG,IAAI,IAAI,CAAC,IAAKF,EAAE,IAAIG,CAAC,IAAKJ,EAAEG,IAAI,IAAI,CAAC,IAAKF,EAAE,IAAIG,CAAC;AAC9I,SAAOF;AACX;AAEO,SAASG,EAAgBC,GAAgB;AAC5C,QAAMC,IAAIX,EAASU,CAAI,GACjBE,IAAMV,EAAE,IAAI,CAACW,GAAG,MAAMA,IAAIF,EAAE,CAAC,CAAE,GAC/BG,IAAUX,EAAIF,EAAMS,CAAI,GAAGE,CAAG;AACpC,SAAOV,EAAE,IAAI,CAACW,GAAG,MAAMA,IAAIC,EAAQ,CAAC,CAAE;AAC1C;AAEA,MAAMC,wBAAY,IAAA;AAEX,SAASC,EAAoBN,GAAoB;AACpD,MAAIO,IAAMF,EAAM,IAAIL,CAAI;AACxB,MAAI,CAACO,GAAK;AACN,UAAMC,IAAIT,EAAgBC,CAAI,EAAE,IAAI,CAACS,MAAM,KAAK,MAAMA,IAAI,GAAI,IAAI,GAAI,GAEhEC,IAAM,kIADG,CAACF,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAG,GAAG,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAG,GAAG,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CACqC;AACpJ,IAAAD,IAAM,2BAA2B,mBAAmBG,CAAG,CAAC,QACxDL,EAAM,IAAIL,GAAMO,CAAG;AAAA,EACvB;AACA,SAAOA;AACX;AC7BA,MAAMI,IAAe,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC,GAClCC,IAAgB,CAAC,GAAG,KAAK,GAAG,CAAC,GAC7BC,IAAqC,CAAC,QAAQ,aAAa,YAAY,SAAS,YAAY,cAAc,gBAAgB,YAAY,GACtIC,IAAc,oBAEdC,IAAW,MACXC,IAAc,iBAEdC,IAAoB,GAKpBC,IAAmB,sIAGnBC,IAAmD;AAAA,EACrD,MAAM;AAAA,EACN,WAAW;AAAA;AAAA,EAEX,UAAU;AAAA;AAAA,EAEV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAChB,GAKMT,IAAM,CAACU,MACT,wNAAwNA,CAAI,UAC1NC,IAAuC;AAAA;AAAA,EAEzC,MAAMX,EAAI,wFAAwF;AAAA;AAAA,EAElG,QAAQA,EAAI,4GAA4G;AAAA;AAAA,EAExH,MAAMA,EAAI,wGAAwG;AAAA;AAAA,EAElH,OAAOA,EAAI,2EAA2E;AAAA;AAAA,EAEtF,eAAeA,EAAI,yGAAyG;AAChI;AAUO,MAAMY,EAAc;AAAA,EAevB,YACqBC,GACAC,GACnB;AAjBe,IAAAC,EAAA,eAA4B,EAAE,MAAM,GAAG,QAAQ,QAAQ,MAAM,IAAO,OAAO,GAAG,eAAe,GAAA;AAC7F,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAET;AAAA,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,eAA2B;AAC3B,IAAAA,EAAA,qBAAqC;AACrC,IAAAA,EAAA,cAAgF;AACvE,IAAAA,EAAA,qCAAc,IAAA;AACvB,IAAAA,EAAA,eAA+C;AACtC,IAAAA,EAAA,0CAAmB,IAAA;AAgOnB,IAAAA,EAAA,mBAAY,MAAY;AACrC,YAAMtB,IAAI,KAAK,IAAI,SACbuB,IAAI,KAAK,MAAM;AAOrB,UANA,KAAK,IAAI,OAAO,gBAAgB,eAAeA,IAAI,CAAC,GAChD,KAAK,WAAW,SAAS,MAGzBvB,EAAE,MAAM,cAAcuB,IAAI,IAAI,SAAS,gBAEvCA,KAAK,GAAG;AACR,QAAAvB,EAAE,MAAM,YAAY;AACpB;AAAA,MACJ;AAEA,YAAMwB,KAASD,IAAI,KAAKvB,EAAE,cAAe,GACnCyB,KAASF,IAAI,KAAKvB,EAAE,eAAgB;AAC1C,MAAAA,EAAE,MAAM,kBAAkB,iBAC1BA,EAAE,MAAM,YAAY,cAAc,CAAC,KAAK,OAAOwB,GAAM,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,OAAOC,GAAM,QAAQ,CAAC,CAAC,aAAaF,CAAC;AAAA,IACtH;AAiDiB,IAAAD,EAAA,qBAAc,MAAY;ADlX/C,UAAAI;ACmXQ,QAAIA,IAAA,KAAK,UAAL,gBAAAA,EAAY,IAAI,WAAU,eAAkB,KAAK,MAAM,IAAI,OAAA,EAAS,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1F;AA+BiB;AAAA,IAAAJ,EAAA,uBAAgB,CAACK,MAA0B;AACxD,YAAMC,IAASD,EAAE,aAAA,EAAe,CAAC;AACjC,UAAI,EAAAC,aAAkB,WAAWA,EAAO,QAAQb,CAAgB,IAChE;AAAA,YAAIY,EAAE,gBAAgB,YAClB,KAAK,QAAQ,IAAIA,EAAE,WAAW,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA,CAAS,GACxD,KAAK,QAAQ,SAAS,IAAG;AACzB,eAAK,QAAQ,EAAE,MAAM,KAAK,iBAAiB,MAAM,KAAK,MAAM,KAAA,GAC5D,KAAK,OAAO;AACZ;AAAA,QACJ;AAEJ,QAAI,KAAK,MAAM,QAAQ,KAAMA,EAAE,gBAAgB,WAAWA,EAAE,WAAW,MACvE,KAAK,OAAO,EAAE,IAAIA,EAAE,WAAW,GAAGA,EAAE,SAAS,GAAGA,EAAE,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,KAAA;AAAA;AAAA,IAC3F;AAEiB,IAAAL,EAAA,uBAAgB,CAACK,MAA0B;AAExD,UADIA,EAAE,gBAAgB,WAAW,KAAK,QAAQ,IAAIA,EAAE,SAAS,KAAG,KAAK,QAAQ,IAAIA,EAAE,WAAW,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,SAAS,GACxH,KAAK,SAAS,KAAK,QAAQ,SAAS,GAAG;AACvC,cAAME,IAAM,KAAK,WAAW,KAAK,WAAW,SAAS,CAAC,GAChDN,IAAI,KAAK,IAAIM,GAAK,KAAK,IAAI,GAAI,KAAK,MAAM,OAAO,KAAK,cAAA,IAAmB,KAAK,MAAM,IAAI,CAAC;AAC/F,aAAK,MAAM,OAAO,KAAK,MAAMN,IAAI,GAAG,IAAI,KACpC,KAAK,MAAM,QAAQ,MAAG,KAAK,OAAO,KAAK,OAAO,IAClD,KAAK,UAAA;AACL;AAAA,MACJ;AACA,UAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,OAAOI,EAAE,UAAW;AAChD,YAAM3B,IAAI,KAAK,IAAI,SACbuB,IAAI,KAAK,MAAM,MACfC,KAASD,IAAI,KAAKvB,EAAE,cAAe,KAAK,GACxCyB,KAASF,IAAI,KAAKvB,EAAE,eAAgB,KAAK;AAE/C,WAAK,OAAO8B,EAAM,KAAK,KAAK,QAAQH,EAAE,UAAU,KAAK,KAAK,KAAKH,CAAI,GACnE,KAAK,OAAOM,EAAM,KAAK,KAAK,QAAQH,EAAE,UAAU,KAAK,KAAK,KAAKF,CAAI,GACnE,KAAK,UAAA;AAAA,IACT;AAEiB,IAAAH,EAAA,qBAAc,CAACK,MAA0B;ADvb9D,UAAAD;ACwbQ,WAAK,QAAQ,OAAOC,EAAE,SAAS,GAC3B,KAAK,SAAS,KAAK,QAAQ,OAAO,MAClC,KAAK,QAAQ,MACb,KAAK,iBAAA,GAEL,KAAK,IAAI,OAAO,cAAc,IAAI,YAAY,oBAAoB,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,SAAS,OAAA,EAAO,CAAG,CAAC,MAEjHD,IAAA,KAAK,SAAL,gBAAAA,EAAW,QAAOC,EAAE,cAEhB,KAAK,MAAMA,EAAE,UAAU,KAAK,KAAK,GAAGA,EAAE,UAAU,KAAK,KAAK,CAAC,IAAIb,UAAwB,iBAAA,GAC3F,KAAK,OAAO;AAAA,IAEpB;AAoBiB;AAAA,IAAAQ,EAAA,mBAAY,CAACK,MAA2B;AACrD,UAAI,EAAAA,EAAE,oBAAoBA,EAAE,WAAWA,EAAE,WAAWA,EAAE,SACtD;AAAA,YAAI,KAAK,eAAeA,EAAE,QAAQ,UAAU;AACxC,UAAAA,EAAE,eAAA,GACF,KAAK,eAAA;AACL;AAAA,QACJ;AACA,YAAIA,EAAE,QAAQ,OAAO,KAAK,QAAQ,cAAc,IAAO;AACnD,UAAAA,EAAE,eAAA,GACE,KAAK,cAAa,KAAK,eAAA,SACjB,cAAA;AACV;AAAA,QACJ;AACA,QAAI,KAAK,WAAW,SAAS,MACzBA,EAAE,QAAQ,OAAOA,EAAE,QAAQ,OAC3BA,EAAE,eAAA,GACF,KAAK,QAAQ,KAAK,WAAW,KAAK,CAACJ,MAAMA,IAAI,KAAK,MAAM,OAAO,IAAK,KAAK,KAAK,MAAM,IAAI,KACjFI,EAAE,QAAQ,OAAOA,EAAE,QAAQ,OAClCA,EAAE,eAAA,GACF,KAAK,QAAQ,CAAC,GAAG,KAAK,UAAU,EAAE,UAAU,KAAK,CAACJ,MAAMA,IAAI,KAAK,MAAM,OAAO,IAAK,KAAK,CAAC,KAClFI,EAAE,QAAQ,OAAO,KAAK,MAAM,OAAO,KAC1CA,EAAE,eAAA,GACF,KAAK,QAAQ,CAAC,KACPA,EAAE,YAAY,KAAK,MAAM,OAAO,KAAKA,EAAE,IAAI,WAAW,OAAO,MAEpEA,EAAE,eAAA,GACEA,EAAE,QAAQ,gBAAa,KAAK,OAAOG,EAAM,KAAK,OAAOlB,CAAQ,IAC7De,EAAE,QAAQ,iBAAc,KAAK,OAAOG,EAAM,KAAK,OAAOlB,CAAQ,IAC9De,EAAE,QAAQ,cAAW,KAAK,OAAOG,EAAM,KAAK,OAAOlB,CAAQ,IAC3De,EAAE,QAAQ,gBAAa,KAAK,OAAOG,EAAM,KAAK,OAAOlB,CAAQ,IACjE,KAAK,UAAA;AAAA;AAAA,IAEb;AA5ZI,QAViB,KAAA,MAAAQ,GACA,KAAA,UAAAC,GAEjB,KAAK,aAAaA,EAAQ,SAAS,KAAQ,CAAA,IAAKU,EAAgB,MAAM,QAAQV,EAAQ,IAAI,IAAIA,EAAQ,OAAOb,CAAY,GACzH,KAAK,cAAca,EAAQ,UAAU,KAAQ,CAAA,IAAKU,EAAgBV,EAAQ,eAAeZ,CAAa,GACtG,KAAK,UAAUY,EAAQ,YAAY,KAAQ,KAAK,MAAM,QAAQA,EAAQ,OAAO,IAAI,CAAC,QAAQ,GAAGA,EAAQ,QAAQ,OAAO,CAACW,MAAMA,MAAM,UAAUA,KAAKhB,CAAW,CAAC,IAAIN,GAEhK,KAAK,QAAA,GACLU,EAAI,gBAAgB,KAAK,MAAM,GAC/BA,EAAI,OAAO,iBAAiB,WAAW,KAAK,WAAW,EAAI,GACvD,KAAK,WAAW,SAAS,GAAG;AAE5B,YAAMa,IAAOb,EAAI;AACjB,MAAAa,EAAK,iBAAiB,eAAe,KAAK,aAAa,GACvDA,EAAK,iBAAiB,eAAe,KAAK,aAAa,GACvDA,EAAK,iBAAiB,aAAa,KAAK,WAAW,GACnDA,EAAK,iBAAiB,iBAAiB,KAAK,WAAW,GACvD,OAAO,iBAAiB,UAAU,KAAK,SAAS;AAAA,IACpD;AACA,IAAAb,EAAI,QAAQ,iBAAiB,QAAQ,KAAK,WAAW,GACrD,KAAK,SAAA;AAAA,EACT;AAAA,EAEA,UAAgB;AACZ,UAAMpB,IAAI,KAAK,IAAI;AACnB,SAAK,IAAI,kBAAkBa,CAAW,GACtC,KAAK,IAAI,OAAO,oBAAoB,WAAW,KAAK,WAAW,EAAI;AACnE,UAAMoB,IAAO,KAAK,IAAI;AACtB,IAAAA,EAAK,oBAAoB,eAAe,KAAK,aAAa,GAC1DA,EAAK,oBAAoB,eAAe,KAAK,aAAa,GAC1DA,EAAK,oBAAoB,aAAa,KAAK,WAAW,GACtDA,EAAK,oBAAoB,iBAAiB,KAAK,WAAW,GAC1DjC,EAAE,oBAAoB,QAAQ,KAAK,WAAW,GAC9C,OAAO,oBAAoB,UAAU,KAAK,SAAS,GACnD,KAAK,eAAA;AACL,eAAWkC,KAAO,KAAK,aAAa,OAAA,KAAc,OAAA;AAClD,SAAK,aAAa,MAAA,GAClB,OAAO,OAAOlC,EAAE,OAAO,EAAE,WAAW,IAAI,iBAAiB,IAAI,QAAQ,IAAI,aAAa,GAAA,CAAI,GAC1F,KAAK,IAAI,OAAO,gBAAgB,qBAAqB,GACrD,KAAK,IAAI,OAAO,gBAAgB,aAAa,GAEzC,KAAK,UACL,KAAK,MAAM,OAAO,IAClB,KAAK,MAAM,QAAQ,GACnB,KAAK,WAAA;AAAA,EAEb;AAAA;AAAA,EAGA,gBAAsB;AAClB,SAAK,IAAI,gBAAgB,KAAK,KAAA,CAAM,GACpC,KAAK,iBAAA,GACD,KAAK,gBACL,KAAK,eAAA,GACL,KAAK,cAAA;AAAA,EAEb;AAAA;AAAA,EAIQ,OAA2B;AAC/B,UAAM,IAAI,KAAK,IAAI;AACnB,WAAO;AAAA,MACH,KAAKa;AAAA,MACL,OAAO,EAAE;AAAA,MACT,eAAe,MAAM;AAAA,MACrB,UAAU,MAAM;AACZ,cAAMsB,IAA+B,CAAA,GAC/BC,IAAM,CAACC,GAAeC,GAAeC,OAA6D,EAAE,OAAAF,GAAO,OAAAC,GAAO,QAAQ,IAAO,UAAU,MAAM;AAAA,QAAC,GAAG,UAAAC,EAAA;AAG3J,YAFI,KAAK,WAAW,SAAS,KAAGJ,EAAM,KAAKC,EAAI,EAAE,UAAUI,EAAI,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK,QAAA,CAAS,CAAC,GAClG,KAAK,QAAQ,SAAS,KAAGL,EAAM,KAAKC,EAAI,EAAE,YAAY,KAAK,YAAY,KAAK,MAAM,MAAM,GAAG,MAAM,KAAK,UAAA,CAAW,CAAC,GAClH,KAAK,YAAY,QAAQ;AACzB,gBAAMK,IAAK,KAAK,aAAA;AAChB,UAAAN,EAAM,KAAK;AAAA,YACP,OAAO,EAAE;AAAA,YACT,OAAOM,IAAM,KAAK,MAAM,OAAO,EAAE,SAAS,EAAE,UAAW,EAAE;AAAA,YACzD,QAAQ,KAAK,MAAM;AAAA,YACnB,UAAU;AAAA,YACV,UAAU,MAAM;AACZ,cAAIA,KAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,MAAM,IAAI;AAAA,YAC7C;AAAA,UAAA,CACH,GACG,KAAK,YAAY,SAAS,OAAS,KAAKL,EAAI,EAAE,WAAWK,IAAKD,EAAI,KAAK,MAAM,KAAK,IAAI,EAAE,iBAAiB,MAAM,KAAK,SAAA,CAAU,CAAC;AAAA,QACvI;AACA,eAAI,KAAK,QAAQ,kBAAkB,MAC/BL,EAAM,KAAK;AAAA,UACP,OAAO,EAAE;AAAA,UACT,OAAO,KAAK,MAAM,gBAAgB,EAAE,SAAS,EAAE;AAAA,UAC/C,QAAQ,KAAK,MAAM;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,MAAM,KAAK,IAAI,iBAAiB,CAAC,KAAK,MAAM,aAAa;AAAA,QAAA,CACtE,GACD,KAAK,QAAQ,cAAc,MAC3BA,EAAM,KAAK,EAAE,OAAO,EAAE,eAAe,OAAO,KAAK,QAAQ,IAAO,UAAU,MAAM,eAAe,MAAM,KAAK,cAAA,CAAe,GAAG,GACzHA;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AAAA;AAAA,EAIQ,UAA8B;AAClC,WAAO;AAAA,MACH,KAAK;AAAA,MACL,OAAO,KAAK,IAAI,KAAK;AAAA,MACrB,eAAe,MAAM;AAAA,MACrB,UAAU,MAAM,KAAK,WAAW,IAAI,CAACZ,OAAO,EAAE,OAAOiB,EAAIjB,CAAC,GAAG,QAAQ,KAAK,IAAI,KAAK,MAAM,OAAOA,CAAC,IAAI,MAAO,UAAU,MAAM,KAAK,QAAQA,CAAC,EAAA,EAAI;AAAA,IAAA;AAAA,EAEtJ;AAAA,EAEQ,YAAgC;AACpC,WAAO;AAAA,MACH,KAAK;AAAA,MACL,OAAO,KAAK,IAAI,KAAK;AAAA,MACrB,eAAe,MAAM;AAAA,MACrB,UAAU,MAAM,KAAK,QAAQ,IAAI,CAACS,OAAO,EAAE,OAAO,KAAK,YAAYA,CAAC,GAAG,QAAQ,KAAK,MAAM,WAAWA,GAAG,UAAU,MAAM,KAAK,IAAI,UAAUA,CAAC,IAAI;AAAA,IAAA;AAAA,EAExJ;AAAA,EAEQ,WAA+B;AACnC,WAAO;AAAA,MACH,KAAK;AAAA,MACL,OAAO,KAAK,IAAI,KAAK;AAAA,MACrB,eAAe,MAAM;AAAA,MACrB,UAAU,MAAO,KAAK,aAAA,IAAiB,KAAK,YAAY,IAAI,CAACxC,OAAO,EAAE,OAAOgD,EAAIhD,CAAC,GAAG,QAAQ,KAAK,MAAM,UAAUA,GAAG,UAAU,MAAM,KAAK,IAAI,SAASA,CAAC,EAAA,EAAI,IAAI,CAAA;AAAA,IAAC;AAAA,EAEzK;AAAA;AAAA,EAGQ,UAAUkD,GAA+BC,GAAmC;AAChF,UAAMC,IAAI,KAAK,IAAI;AACnB,WAAO;AAAA,MACH,KAAK,QAAQF,CAAG;AAAA,MAChB,OAAAC;AAAA,MACA,eAAe,MAAM;AAAA,MACrB,UAAU,MAAM;AAAA,QACZ,EAAE,OAAOC,EAAE,QAAQ,QAAQ,KAAK,MAAMF,CAAG,GAAG,UAAU,MAAM,KAAK,IAAIA,GAAK,EAAI,EAAA;AAAA,QAC9E,EAAE,OAAOE,EAAE,SAAS,QAAQ,CAAC,KAAK,MAAMF,CAAG,GAAG,UAAU,MAAM,KAAK,IAAIA,GAAK,EAAK,EAAA;AAAA,MAAE;AAAA,IACvF;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAyB;AAC7B,UAAM,IAAI,KAAK,IAAI,MACb5C,IAAI,KAAK,OACT+C,IAAsF;AAAA,MACxF,EAAE,IAAI,QAAQ,IAAI/C,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE,QAAQ,KAAK0C,EAAI1C,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,KAAK,UAAQ;AAAA,MAClG,EAAE,IAAI,UAAU,IAAIA,EAAE,WAAW,QAAQ,OAAO,GAAG,EAAE,UAAU,KAAK,KAAK,YAAYA,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM,KAAK,YAAU;AAAA,MAC5H,EAAE,IAAI,QAAQ,IAAIA,EAAE,MAAM,OAAO,GAAG,EAAE,QAAQ,KAAK,EAAE,MAAM,IAAI,KAAK,MAAM,KAAK,UAAU,QAAQ,EAAE,QAAQ,EAAA;AAAA,MAC3G,EAAE,IAAI,SAAS,IAAIA,EAAE,UAAU,GAAG,OAAO,GAAG,EAAE,SAAS,KAAK0C,EAAI1C,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,KAAK,WAAS;AAAA,MACrG,EAAE,IAAI,iBAAiB,IAAIA,EAAE,eAAe,OAAO,GAAG,EAAE,iBAAiB,KAAK,EAAE,MAAM,IAAI,KAAK,MAAM,KAAK,UAAU,iBAAiB,EAAE,iBAAiB,EAAA;AAAA,IAAE;AAE9J,eAAWgD,KAAQD,GAAO;AACtB,UAAIX,IAAM,KAAK,aAAa,IAAIY,EAAK,EAAE;AACvC,UAAI,CAACA,EAAK,IAAI;AACV,QAAAZ,KAAA,QAAAA,EAAK,UACL,KAAK,aAAa,OAAOY,EAAK,EAAE;AAChC;AAAA,MACJ;AACA,MAAKZ,MACDA,IAAM,SAAS,cAAc,QAAQ,GACrCA,EAAI,OAAO,UACXA,EAAI,YACA,mJACJA,EAAI,aAAa,QAAQ,yBAAyBY,EAAK,EAAE,EAAE,GAC3DZ,EAAI,aAAa,aAAaY,EAAK,EAAE,GACrCZ,EAAI,YAAYhB,EAAY4B,EAAK,EAAE,GACnC,KAAK,IAAI,eAAeZ,GAAKY,EAAK,KAAK,MAAM,CAAC,KAAK,KAAA,CAAM,CAAC,GAC1D,KAAK,aAAa,IAAIA,EAAK,IAAIZ,CAAG,IAGtCA,EAAI,aAAa,cAAcY,EAAK,KAAK;AAAA,IAC7C;AAAA,EACJ;AAAA,EACQ,YAAYd,GAAgC;AAChD,UAAMY,IAAI,KAAK,IAAI;AAWnB,WAVoD;AAAA,MAChD,MAAMA,EAAE;AAAA,MACR,WAAWA,EAAE;AAAA,MACb,UAAUA,EAAE;AAAA,MACZ,OAAOA,EAAE;AAAA,MACT,UAAUA,EAAE;AAAA,MACZ,YAAYA,EAAE;AAAA,MACd,cAAcA,EAAE;AAAA,MAChB,YAAYA,EAAE;AAAA,IAAA,EAEJZ,CAAC;AAAA,EACnB;AAAA;AAAA,EAIQ,IAAwCU,GAAQJ,GAAoC;AACxF,IAAI,KAAK,MAAMI,CAAG,MAAMJ,MACxB,KAAK,MAAMI,CAAG,IAAIJ,GAClB,KAAK,SAAA,GACL,KAAK,KAAA,GACL,KAAK,IAAI,OAAO,cAAc,IAAI,YAAY,oBAAoB,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,SAASI,EAAA,EAAI,CAAG,CAAC;AAAA,EAClH;AAAA,EAEQ,QAAQnB,GAAiB;AAC7B,IAAIA,KAAK,MACL,KAAK,OAAO,GACZ,KAAK,OAAO,IAEhB,KAAK,IAAI,QAAQA,CAAC;AAAA,EACtB;AAAA,EAEQ,WAAiB;AACrB,SAAK,UAAA,GACL,KAAK,YAAA,GACL,KAAK,WAAA,GACL,KAAK,IAAI,OAAO,gBAAgB,uBAAuB,KAAK,MAAM,aAAa,GAC/E,KAAK,iBAAA;AAAA,EACT;AAAA,EAsBQ,cAAoB;AACxB,UAAMS,IAAI,KAAK,MAAM;AACrB,SAAK,IAAI,QAAQ,MAAM,SAASA,MAAM,gBAAgBA,MAAM,kBAAkBA,MAAM,eAAe7B,EAAoB6B,CAAC,IAAIhB,EAAYgB,CAAC;AAAA,EAC7I;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAwB;AAC5B,QAAI,OAAO,eAAiB,IAAa,QAAO;AAChD,UAAMe,IAAM,KAAK,IAAI,QAAQ;AAC7B,QAAI,CAACA,KAAOA,EAAI,WAAW,OAAO,KAAKA,EAAI,WAAW,OAAO,EAAG,QAAO;AACvE,QAAI;AACA,UAAI,IAAI,IAAIA,GAAK,SAAS,IAAI,EAAE,WAAW,SAAS,OAAQ,QAAO;AAAA,IACvE,QAAQ;AACJ,aAAO;AAAA,IACX;AACA,WAAO,KAAK,IAAI,QAAQ,gBAAgB;AAAA,EAC5C;AAAA,EAEQ,aAAmB;AAEvB,QAAI,EADW,KAAK,MAAM,QAAQ,KAAK,MAAM,UAAU,MACxC,CAAC,KAAK,MAAO;AAC5B,QAAI,CAAC,KAAK,OAAO;AACb,UAAI,CAAC,KAAK,eAAgB;AAC1B,UAAI;AACA,cAAM3B,IAAM,IAAI,aAAA,GACV4B,IAAS5B,EAAI,yBAAyB,KAAK,IAAI,OAAO,GACtD6B,IAAO7B,EAAI,WAAA;AACjB,QAAA4B,EAAO,QAAQC,CAAI,EAAE,QAAQ7B,EAAI,WAAW,GAC5C,KAAK,QAAQ,EAAE,KAAAA,GAAK,MAAA6B,EAAAA;AAAAA,MACxB,QAAQ;AACJ;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,EAAE,MAAAA,GAAM,KAAA7B,EAAA,IAAQ,KAAK;AAC3B,IAAA6B,EAAK,KAAK,QAAQ,KAAK,MAAM,OAE7BA,EAAK,mBAAmB,KAAK,MAAM,OAAO,aAAa,OACvDA,EAAK,eAAe,KAAK,MAAM,OAAO,IAAI,GAC1CA,EAAK,wBAAwB,YACzB7B,EAAI,UAAU,eAAkBA,EAAI,OAAA,EAAS,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnE;AAAA;AAAA,EAQQ,UAAgB;AACpB,QAAI,KAAK,QAAQ,aAAa;AAC9B,UAAI;AACA,cAAM8B,IAAQ,KAAK,MAAM,aAAa,QAAQvC,CAAW,KAAK,MAAM;AACpE,YAAI,CAACuC,EAAO;AACZ,QAAIA,EAAM,UAAU,KAAK,QAAQ,SAASA,EAAM,MAAM,MAAG,KAAK,MAAM,SAASA,EAAM,SAC/E,OAAOA,EAAM,QAAS,aAAa,KAAK,YAAY,WAAQ,KAAK,MAAM,OAAOA,EAAM,OACpF,OAAOA,EAAM,SAAU,YAAY,KAAK,YAAY,SAASA,EAAM,KAAK,MAAG,KAAK,MAAM,QAAQA,EAAM,QACpG,OAAOA,EAAM,iBAAkB,aAAa,KAAK,QAAQ,kBAAkB,OAAO,KAAK,MAAM,gBAAgBA,EAAM;AAAA,MAE3H,QAAQ;AAAA,MAER;AAAA,EACJ;AAAA,EAEQ,OAAa;AACjB,QAAI,KAAK,QAAQ,aAAa;AAC9B,UAAI;AACA,cAAM,EAAE,QAAAC,GAAQ,MAAAC,GAAM,OAAAC,GAAO,eAAAC,EAAA,IAAkB,KAAK;AACpD,qBAAa,QAAQ3C,GAAa,KAAK,UAAU,EAAE,QAAAwC,GAAQ,MAAAC,GAAM,OAAAC,GAAO,eAAAC,EAAA,CAAe,CAAC;AAAA,MAC5F,QAAQ;AAAA,MAER;AAAA,EACJ;AAAA,EAuDQ,mBAAyB;AAC7B,UAAMrB,IAAO,KAAK,IAAI,aAChBsB,IAAU,CAACC,MAAoB;AACjC,MAAAA,EAAG,gBAAA,GACHA,EAAG,eAAA;AAAA,IACP;AACA,IAAAvB,EAAK,iBAAiB,SAASsB,GAAS,EAAE,SAAS,IAAM,MAAM,IAAM,GAErE,WAAW,MAAMtB,EAAK,oBAAoB,SAASsB,GAAS,EAAE,SAAS,IAAM,GAAG,GAAG;AAAA,EACvF;AAAA,EAEQ,gBAAwB;AAC5B,UAAM,CAAChE,GAAGC,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,QAAQ;AACxC,WAAOD,KAAKC,KAAI,KAAK,MAAMD,EAAE,IAAIC,EAAE,GAAGD,EAAE,IAAIC,EAAE,CAAC,KAAK;AAAA,EACxD;AAAA;AAAA,EAwCQ,gBAAsB;AD5flC,QAAAkC,GAAA+B;AC6fQ,QAAI,KAAK,YAAa;AACtB,UAAM,IAAI,KAAK,IAAI,MACbC,IAAK,SAAS,cAAc,KAAK;AACvC,IAAAA,EAAG,YAAY,gBACfA,EAAG,aAAa,QAAQ,WAAW,GACnCA,EAAG,aAAa,QAAQ,QAAQ,GAChCA,EAAG,aAAa,cAAc,MAAM,GACpCA,EAAG,aAAa,mBAAmB,oBAAoB;AAEvD,UAAMC,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY;AAChB,UAAMC,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY;AACjB,UAAMjB,IAAQ,SAAS,cAAc,IAAI;AACzC,IAAAA,EAAM,KAAK,sBACXA,EAAM,cAAc,EAAE;AACtB,UAAMkB,IAAQ,SAAS,cAAc,QAAQ;AAC7C,IAAAA,EAAM,OAAO,UACbA,EAAM,YAAY,sBAClBA,EAAM,aAAa,cAAc,EAAE,SAAS,GAC5CA,EAAM,cAAc,KACpBA,EAAM,iBAAiB,SAAS,MAAM,KAAK,gBAAgB,GAC3DD,EAAK,OAAOjB,GAAOkB,CAAK;AAExB,UAAMC,IAA6B;AAAA,MAC/B,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,WAAW;AAAA,MAC9B,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG,EAAE,YAAY,KAAK,IAAI,SAAA,CAAU,CAAC;AAAA,MACzD,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,aAAa;AAAA,MAC5B,CAAC,CAAC,GAAG,GAAG,EAAE,WAAW;AAAA,MACrB,CAAC,CAAC,GAAG,GAAG,EAAE,iBAAiB;AAAA,MAC3B,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,YAAY;AAAA,IAAA;AAE/B,IAAI,KAAK,WAAW,SAAS,MACzBA,EAAK,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,GAAG,EAAE,WAAW,CAAC,GAC1CA,EAAK,KAAK,CAAC,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,UAAU,CAAC;AAEpD,eAAWhE,OAAK2D,KAAA/B,IAAA,KAAK,KAAI,mBAAT,gBAAA+B,EAAA,KAAA/B,OAA+B,CAAA,EAAI,CAAAoC,EAAK,KAAK,CAAChE,EAAE,MAAMA,EAAE,WAAW,CAAC;AACpF,IAAAgE,EAAK,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,gBAAgB,CAAC;AAErC,UAAMC,IAAO,SAAS,cAAc,IAAI;AACxC,IAAAA,EAAK,YAAY;AACjB,eAAW,CAACC,GAAMC,CAAI,KAAKH,GAAM;AAC7B,YAAMI,IAAK,SAAS,cAAc,IAAI;AACtC,iBAAWC,KAAKH,GAAM;AAClB,YAAIG,MAAM,OAAOH,EAAK,CAAC,MAAM,SAAS;AAClC,UAAAE,EAAG,OAAO,KAAK;AACf;AAAA,QACJ;AACA,cAAME,IAAM,SAAS,cAAc,KAAK;AACxC,QAAAA,EAAI,cAAcD,GAClBD,EAAG,YAAYE,CAAG;AAAA,MACtB;AACA,YAAMC,IAAK,SAAS,cAAc,IAAI;AACtC,MAAAA,EAAG,cAAcJ,GACjBF,EAAK,OAAOG,GAAIG,CAAE;AAAA,IACtB;AACA,IAAAV,EAAI,OAAOC,GAAMG,CAAI,GACrBL,EAAG,YAAYC,CAAG,GAElBD,EAAG,iBAAiB,SAAS,CAAC/B,MAAM;AAChC,MAAAA,EAAE,gBAAA,GACEA,EAAE,WAAW+B,KAAI,KAAK,eAAA;AAAA,IAC9B,CAAC;AACD,eAAWF,KAAM,CAAC,eAAe,aAAa,WAAW,cAAc,YAAY,UAAU,EAAY,CAAAE,EAAG,iBAAiBF,GAAI,CAAC7B,MAAMA,EAAE,iBAAiB;AAE3J,IAAA+B,EAAG,iBAAiB,WAAW,CAAC/B,MAAM;AAClC,MAAIA,EAAE,QAAQ,UACVA,EAAE,eAAA,GACFkC,EAAM,MAAA;AAAA,IAEd,CAAC,GACD,KAAK,IAAI,YAAY,YAAYH,CAAE,GACnC,KAAK,cAAcA,GACnBG,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM;AAAA,EACvC;AAAA,EAEQ,iBAAuB;AAC3B,QAAI,CAAC,KAAK,YAAa;AACvB,UAAMS,IAAW,KAAK,YAAY,UAAU,KAAK,IAAI,OAAO,cAAc,UAAU,aAAa;AACjG,SAAK,YAAY,OAAA,GACjB,KAAK,cAAc,MACfA,UAAe,IAAI,OAAO,MAAM,EAAE,eAAe,IAAM;AAAA,EAC/D;AACJ;AAEA,SAASvC,EAAgBwC,GAA4B;AACjD,QAAMC,IAAQD,EAAO,OAAO,CAACjE,MAAM,OAAO,SAASA,CAAC,KAAKA,KAAK,KAAKA,KAAK,CAAC;AACzE,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,GAAGkE,CAAK,CAAC,CAAC,EAAE,KAAK,CAACjF,GAAGC,MAAMD,IAAIC,CAAC;AAC3D;AAEA,MAAMsC,IAAQ,CAAC,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,GAC1DU,IAAM,CAAC,MAAsB,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC;AC9lBlD,SAASiC,EAAqBrD,GAAiCC,GAA8C;AAChH,SAAO,IAAIF,EAAcC,GAAKC,CAAO;AACzC;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var P = Object.defineProperty;
|
|
2
2
|
var k = (d, e, t) => e in d ? P(d, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[e] = t;
|
|
3
3
|
var r = (d, e, t) => k(d, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import { t as E, g as M, m as L } from "./player-
|
|
4
|
+
import { t as E, g as M, m as L } from "./player-DV4Hf5Cw.js";
|
|
5
5
|
const x = 8e3;
|
|
6
6
|
class C {
|
|
7
7
|
constructor(e) {
|
|
@@ -641,7 +641,7 @@ class _ {
|
|
|
641
641
|
const m = await this.getOrCreatePrebidInstance(e, o);
|
|
642
642
|
m.isAvailable() && (a = await m.runAuction(a));
|
|
643
643
|
}
|
|
644
|
-
if (!this.adsLoader || !this.ima) return;
|
|
644
|
+
if (this.ctx.transformTag && (a = await this.ctx.transformTag(a, e.toLowerCase())), !this.adsLoader || !this.ima) return;
|
|
645
645
|
const l = new this.ima.AdsRequest();
|
|
646
646
|
l.adTagUrl = a, l.linearAdSlotWidth = this.ctx.videoEl.clientWidth || 640, l.linearAdSlotHeight = this.ctx.videoEl.clientHeight || 360, l.nonLinearAdSlotWidth = this.ctx.videoEl.clientWidth || 640, l.nonLinearAdSlotHeight = Math.round((this.ctx.videoEl.clientHeight || 360) / 3), l.vastLoadTimeout = this.options.vastLoadTimeoutMs ?? 1e4;
|
|
647
647
|
try {
|
|
@@ -819,4 +819,4 @@ export {
|
|
|
819
819
|
_ as AdsController,
|
|
820
820
|
G as installAds
|
|
821
821
|
};
|
|
822
|
-
//# sourceMappingURL=ads-
|
|
822
|
+
//# sourceMappingURL=ads-C4tDPsUs.js.map
|