// ==UserScript== // @name Emby Launchpad - Emby 媒体库助手 // @namespace http://tampermonkey.net/ // @version 1.6.0 // @author leo // @description 在豆瓣(Douban)、GYG、DMHY 等网站上自动检测 Emby 服务端库内是否存在当前影视。提供 Nullbr 快捷资源检索,支持搜索115网盘和磁链内容; 提供 TMDB/IMDb 评分, gyg.si/bt4gprx.com 资源搜索链接。支持 Web Components 现代化 UI。 // @license MIT // @match https://movie.douban.com/* // @match https://m.douban.com/* // @match https://www.gyg.si/* // @match https://dmhy.org/* // @connect api.themoviedb.org // @connect www.gyg.si // @connect www.imdb.com // @connect www.rottentomatoes.com // @connect api.bgm.tv // @connect api.nullbr.eu.org // @grant GM.addStyle // @grant GM.xmlHttpRequest // @grant GM_addStyle // @grant GM_deleteValue // @grant GM_getResourceText // @grant GM_getValue // @grant GM_listValues // @grant GM_registerMenuCommand // @grant GM_setClipboard // @grant GM_setValue // @grant GM_xmlhttpRequest // @downloadURL https://update.greasyfork.icu/scripts/565501/Emby%20Launchpad%20-%20Emby%20%E5%AA%92%E4%BD%93%E5%BA%93%E5%8A%A9%E6%89%8B.user.js // @updateURL https://update.greasyfork.icu/scripts/565501/Emby%20Launchpad%20-%20Emby%20%E5%AA%92%E4%BD%93%E5%BA%93%E5%8A%A9%E6%89%8B.meta.js // ==/UserScript== (function () { 'use strict'; /** * @vue/shared v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ function makeMap(str) { const map = Object.create(null); for (const key of str.split(",")) map[key] = 1; return (val) => val in map; } const EMPTY_OBJ = {}; const EMPTY_ARR = []; const NOOP = () => { }; const NO = () => false; const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && (key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); const isModelListener = (key) => key.startsWith("onUpdate:"); const extend = Object.assign; const remove = (arr, el) => { const i = arr.indexOf(el); if (i > -1) { arr.splice(i, 1); } }; const hasOwnProperty$1 = Object.prototype.hasOwnProperty; const hasOwn = (val, key) => hasOwnProperty$1.call(val, key); const isArray = Array.isArray; const isMap = (val) => toTypeString(val) === "[object Map]"; const isSet = (val) => toTypeString(val) === "[object Set]"; const isDate = (val) => toTypeString(val) === "[object Date]"; const isFunction = (val) => typeof val === "function"; const isString = (val) => typeof val === "string"; const isSymbol = (val) => typeof val === "symbol"; const isObject = (val) => val !== null && typeof val === "object"; const isPromise = (val) => { return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); }; const objectToString = Object.prototype.toString; const toTypeString = (value) => objectToString.call(value); const toRawType = (value) => { return toTypeString(value).slice(8, -1); }; const isPlainObject = (val) => toTypeString(val) === "[object Object]"; const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; const isReservedProp = makeMap( ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" ); const cacheStringFunction = (fn) => { const cache2 = Object.create(null); return ((str) => { const hit = cache2[str]; return hit || (cache2[str] = fn(str)); }); }; const camelizeRE = /-\w/g; const camelize = cacheStringFunction( (str) => { return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); } ); const hyphenateRE = /\B([A-Z])/g; const hyphenate = cacheStringFunction( (str) => str.replace(hyphenateRE, "-$1").toLowerCase() ); const capitalize = cacheStringFunction((str) => { return str.charAt(0).toUpperCase() + str.slice(1); }); const toHandlerKey = cacheStringFunction( (str) => { const s = str ? `on${capitalize(str)}` : ``; return s; } ); const hasChanged = (value, oldValue) => !Object.is(value, oldValue); const invokeArrayFns = (fns, ...arg) => { for (let i = 0; i < fns.length; i++) { fns[i](...arg); } }; const def = (obj, key, value, writable = false) => { Object.defineProperty(obj, key, { configurable: true, enumerable: false, writable, value }); }; const looseToNumber = (val) => { const n = parseFloat(val); return isNaN(n) ? val : n; }; const toNumber = (val) => { const n = isString(val) ? Number(val) : NaN; return isNaN(n) ? val : n; }; let _globalThis; const getGlobalThis = () => { return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); }; function normalizeStyle(value) { if (isArray(value)) { const res = {}; for (let i = 0; i < value.length; i++) { const item = value[i]; const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); if (normalized) { for (const key in normalized) { res[key] = normalized[key]; } } } return res; } else if (isString(value) || isObject(value)) { return value; } } const listDelimiterRE = /;(?![^(]*\))/g; const propertyDelimiterRE = /:([^]+)/; const styleCommentRE = /\/\*[^]*?\*\//g; function parseStringStyle(cssText) { const ret = {}; cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { if (item) { const tmp = item.split(propertyDelimiterRE); tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); } }); return ret; } function normalizeClass(value) { let res = ""; if (isString(value)) { res = value; } else if (isArray(value)) { for (let i = 0; i < value.length; i++) { const normalized = normalizeClass(value[i]); if (normalized) { res += normalized + " "; } } } else if (isObject(value)) { for (const name in value) { if (value[name]) { res += name + " "; } } } return res.trim(); } const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; const isSpecialBooleanAttr = makeMap(specialBooleanAttrs); function includeBooleanAttr(value) { return !!value || value === ""; } function looseCompareArrays(a, b) { if (a.length !== b.length) return false; let equal = true; for (let i = 0; equal && i < a.length; i++) { equal = looseEqual(a[i], b[i]); } return equal; } function looseEqual(a, b) { if (a === b) return true; let aValidType = isDate(a); let bValidType = isDate(b); if (aValidType || bValidType) { return aValidType && bValidType ? a.getTime() === b.getTime() : false; } aValidType = isSymbol(a); bValidType = isSymbol(b); if (aValidType || bValidType) { return a === b; } aValidType = isArray(a); bValidType = isArray(b); if (aValidType || bValidType) { return aValidType && bValidType ? looseCompareArrays(a, b) : false; } aValidType = isObject(a); bValidType = isObject(b); if (aValidType || bValidType) { if (!aValidType || !bValidType) { return false; } const aKeysCount = Object.keys(a).length; const bKeysCount = Object.keys(b).length; if (aKeysCount !== bKeysCount) { return false; } for (const key in a) { const aHasKey = a.hasOwnProperty(key); const bHasKey = b.hasOwnProperty(key); if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { return false; } } } return String(a) === String(b); } function looseIndexOf(arr, val) { return arr.findIndex((item) => looseEqual(item, val)); } const isRef$1 = (val) => { return !!(val && val["__v_isRef"] === true); }; const toDisplayString = (val) => { return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef$1(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); }; const replacer = (_key, val) => { if (isRef$1(val)) { return replacer(_key, val.value); } else if (isMap(val)) { return { [`Map(${val.size})`]: [...val.entries()].reduce( (entries, [key, val2], i) => { entries[stringifySymbol(key, i) + " =>"] = val2; return entries; }, {} ) }; } else if (isSet(val)) { return { [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) }; } else if (isSymbol(val)) { return stringifySymbol(val); } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { return String(val); } return val; }; const stringifySymbol = (v, i = "") => { var _a; return ( isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v ); }; function normalizeCssVarValue(value) { if (value == null) { return "initial"; } if (typeof value === "string") { return value === "" ? " " : value; } return String(value); } /** * @vue/reactivity v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ let activeEffectScope; class EffectScope { constructor(detached = false) { this.detached = detached; this._active = true; this._on = 0; this.effects = []; this.cleanups = []; this._isPaused = false; this.__v_skip = true; this.parent = activeEffectScope; if (!detached && activeEffectScope) { this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( this ) - 1; } } get active() { return this._active; } pause() { if (this._active) { this._isPaused = true; let i, l; if (this.scopes) { for (i = 0, l = this.scopes.length; i < l; i++) { this.scopes[i].pause(); } } for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].pause(); } } } resume() { if (this._active) { if (this._isPaused) { this._isPaused = false; let i, l; if (this.scopes) { for (i = 0, l = this.scopes.length; i < l; i++) { this.scopes[i].resume(); } } for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].resume(); } } } } run(fn) { if (this._active) { const currentEffectScope = activeEffectScope; try { activeEffectScope = this; return fn(); } finally { activeEffectScope = currentEffectScope; } } } on() { if (++this._on === 1) { this.prevScope = activeEffectScope; activeEffectScope = this; } } off() { if (this._on > 0 && --this._on === 0) { activeEffectScope = this.prevScope; this.prevScope = void 0; } } stop(fromParent) { if (this._active) { this._active = false; let i, l; for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].stop(); } this.effects.length = 0; for (i = 0, l = this.cleanups.length; i < l; i++) { this.cleanups[i](); } this.cleanups.length = 0; if (this.scopes) { for (i = 0, l = this.scopes.length; i < l; i++) { this.scopes[i].stop(true); } this.scopes.length = 0; } if (!this.detached && this.parent && !fromParent) { const last = this.parent.scopes.pop(); if (last && last !== this) { this.parent.scopes[this.index] = last; last.index = this.index; } } this.parent = void 0; } } } function getCurrentScope() { return activeEffectScope; } let activeSub; const pausedQueueEffects = new WeakSet(); class ReactiveEffect { constructor(fn) { this.fn = fn; this.deps = void 0; this.depsTail = void 0; this.flags = 1 | 4; this.next = void 0; this.cleanup = void 0; this.scheduler = void 0; if (activeEffectScope && activeEffectScope.active) { activeEffectScope.effects.push(this); } } pause() { this.flags |= 64; } resume() { if (this.flags & 64) { this.flags &= -65; if (pausedQueueEffects.has(this)) { pausedQueueEffects.delete(this); this.trigger(); } } } notify() { if (this.flags & 2 && !(this.flags & 32)) { return; } if (!(this.flags & 8)) { batch(this); } } run() { if (!(this.flags & 1)) { return this.fn(); } this.flags |= 2; cleanupEffect(this); prepareDeps(this); const prevEffect = activeSub; const prevShouldTrack = shouldTrack; activeSub = this; shouldTrack = true; try { return this.fn(); } finally { cleanupDeps(this); activeSub = prevEffect; shouldTrack = prevShouldTrack; this.flags &= -3; } } stop() { if (this.flags & 1) { for (let link = this.deps; link; link = link.nextDep) { removeSub(link); } this.deps = this.depsTail = void 0; cleanupEffect(this); this.onStop && this.onStop(); this.flags &= -2; } } trigger() { if (this.flags & 64) { pausedQueueEffects.add(this); } else if (this.scheduler) { this.scheduler(); } else { this.runIfDirty(); } } runIfDirty() { if (isDirty(this)) { this.run(); } } get dirty() { return isDirty(this); } } let batchDepth = 0; let batchedSub; let batchedComputed; function batch(sub, isComputed = false) { sub.flags |= 8; if (isComputed) { sub.next = batchedComputed; batchedComputed = sub; return; } sub.next = batchedSub; batchedSub = sub; } function startBatch() { batchDepth++; } function endBatch() { if (--batchDepth > 0) { return; } if (batchedComputed) { let e = batchedComputed; batchedComputed = void 0; while (e) { const next = e.next; e.next = void 0; e.flags &= -9; e = next; } } let error; while (batchedSub) { let e = batchedSub; batchedSub = void 0; while (e) { const next = e.next; e.next = void 0; e.flags &= -9; if (e.flags & 1) { try { ; e.trigger(); } catch (err) { if (!error) error = err; } } e = next; } } if (error) throw error; } function prepareDeps(sub) { for (let link = sub.deps; link; link = link.nextDep) { link.version = -1; link.prevActiveLink = link.dep.activeLink; link.dep.activeLink = link; } } function cleanupDeps(sub) { let head; let tail = sub.depsTail; let link = tail; while (link) { const prev = link.prevDep; if (link.version === -1) { if (link === tail) tail = prev; removeSub(link); removeDep(link); } else { head = link; } link.dep.activeLink = link.prevActiveLink; link.prevActiveLink = void 0; link = prev; } sub.deps = head; sub.depsTail = tail; } function isDirty(sub) { for (let link = sub.deps; link; link = link.nextDep) { if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) { return true; } } if (sub._dirty) { return true; } return false; } function refreshComputed(computed2) { if (computed2.flags & 4 && !(computed2.flags & 16)) { return; } computed2.flags &= -17; if (computed2.globalVersion === globalVersion) { return; } computed2.globalVersion = globalVersion; if (!computed2.isSSR && computed2.flags & 128 && (!computed2.deps && !computed2._dirty || !isDirty(computed2))) { return; } computed2.flags |= 2; const dep = computed2.dep; const prevSub = activeSub; const prevShouldTrack = shouldTrack; activeSub = computed2; shouldTrack = true; try { prepareDeps(computed2); const value = computed2.fn(computed2._value); if (dep.version === 0 || hasChanged(value, computed2._value)) { computed2.flags |= 128; computed2._value = value; dep.version++; } } catch (err) { dep.version++; throw err; } finally { activeSub = prevSub; shouldTrack = prevShouldTrack; cleanupDeps(computed2); computed2.flags &= -3; } } function removeSub(link, soft = false) { const { dep, prevSub, nextSub } = link; if (prevSub) { prevSub.nextSub = nextSub; link.prevSub = void 0; } if (nextSub) { nextSub.prevSub = prevSub; link.nextSub = void 0; } if (dep.subs === link) { dep.subs = prevSub; if (!prevSub && dep.computed) { dep.computed.flags &= -5; for (let l = dep.computed.deps; l; l = l.nextDep) { removeSub(l, true); } } } if (!soft && !--dep.sc && dep.map) { dep.map.delete(dep.key); } } function removeDep(link) { const { prevDep, nextDep } = link; if (prevDep) { prevDep.nextDep = nextDep; link.prevDep = void 0; } if (nextDep) { nextDep.prevDep = prevDep; link.nextDep = void 0; } } let shouldTrack = true; const trackStack = []; function pauseTracking() { trackStack.push(shouldTrack); shouldTrack = false; } function resetTracking() { const last = trackStack.pop(); shouldTrack = last === void 0 ? true : last; } function cleanupEffect(e) { const { cleanup } = e; e.cleanup = void 0; if (cleanup) { const prevSub = activeSub; activeSub = void 0; try { cleanup(); } finally { activeSub = prevSub; } } } let globalVersion = 0; class Link { constructor(sub, dep) { this.sub = sub; this.dep = dep; this.version = dep.version; this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } } class Dep { constructor(computed2) { this.computed = computed2; this.version = 0; this.activeLink = void 0; this.subs = void 0; this.map = void 0; this.key = void 0; this.sc = 0; this.__v_skip = true; } track(debugInfo) { if (!activeSub || !shouldTrack || activeSub === this.computed) { return; } let link = this.activeLink; if (link === void 0 || link.sub !== activeSub) { link = this.activeLink = new Link(activeSub, this); if (!activeSub.deps) { activeSub.deps = activeSub.depsTail = link; } else { link.prevDep = activeSub.depsTail; activeSub.depsTail.nextDep = link; activeSub.depsTail = link; } addSub(link); } else if (link.version === -1) { link.version = this.version; if (link.nextDep) { const next = link.nextDep; next.prevDep = link.prevDep; if (link.prevDep) { link.prevDep.nextDep = next; } link.prevDep = activeSub.depsTail; link.nextDep = void 0; activeSub.depsTail.nextDep = link; activeSub.depsTail = link; if (activeSub.deps === link) { activeSub.deps = next; } } } return link; } trigger(debugInfo) { this.version++; globalVersion++; this.notify(debugInfo); } notify(debugInfo) { startBatch(); try { if (false) ; for (let link = this.subs; link; link = link.prevSub) { if (link.sub.notify()) { ; link.sub.dep.notify(); } } } finally { endBatch(); } } } function addSub(link) { link.dep.sc++; if (link.sub.flags & 4) { const computed2 = link.dep.computed; if (computed2 && !link.dep.subs) { computed2.flags |= 4 | 16; for (let l = computed2.deps; l; l = l.nextDep) { addSub(l); } } const currentTail = link.dep.subs; if (currentTail !== link) { link.prevSub = currentTail; if (currentTail) currentTail.nextSub = link; } link.dep.subs = link; } } const targetMap = new WeakMap(); const ITERATE_KEY = Symbol( "" ); const MAP_KEY_ITERATE_KEY = Symbol( "" ); const ARRAY_ITERATE_KEY = Symbol( "" ); function track(target, type, key) { if (shouldTrack && activeSub) { let depsMap = targetMap.get(target); if (!depsMap) { targetMap.set(target, depsMap = new Map()); } let dep = depsMap.get(key); if (!dep) { depsMap.set(key, dep = new Dep()); dep.map = depsMap; dep.key = key; } { dep.track(); } } } function trigger(target, type, key, newValue, oldValue, oldTarget) { const depsMap = targetMap.get(target); if (!depsMap) { globalVersion++; return; } const run = (dep) => { if (dep) { { dep.trigger(); } } }; startBatch(); if (type === "clear") { depsMap.forEach(run); } else { const targetIsArray = isArray(target); const isArrayIndex = targetIsArray && isIntegerKey(key); if (targetIsArray && key === "length") { const newLength = Number(newValue); depsMap.forEach((dep, key2) => { if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) { run(dep); } }); } else { if (key !== void 0 || depsMap.has(void 0)) { run(depsMap.get(key)); } if (isArrayIndex) { run(depsMap.get(ARRAY_ITERATE_KEY)); } switch (type) { case "add": if (!targetIsArray) { run(depsMap.get(ITERATE_KEY)); if (isMap(target)) { run(depsMap.get(MAP_KEY_ITERATE_KEY)); } } else if (isArrayIndex) { run(depsMap.get("length")); } break; case "delete": if (!targetIsArray) { run(depsMap.get(ITERATE_KEY)); if (isMap(target)) { run(depsMap.get(MAP_KEY_ITERATE_KEY)); } } break; case "set": if (isMap(target)) { run(depsMap.get(ITERATE_KEY)); } break; } } } endBatch(); } function reactiveReadArray(array) { const raw = toRaw(array); if (raw === array) return raw; track(raw, "iterate", ARRAY_ITERATE_KEY); return isShallow(array) ? raw : raw.map(toReactive); } function shallowReadArray(arr) { track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY); return arr; } function toWrapped(target, item) { if ( isReadonly(target)) { return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item); } return toReactive(item); } const arrayInstrumentations = { __proto__: null, [Symbol.iterator]() { return iterator(this, Symbol.iterator, (item) => toWrapped(this, item)); }, concat(...args) { return reactiveReadArray(this).concat( ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x) ); }, entries() { return iterator(this, "entries", (value) => { value[1] = toWrapped(this, value[1]); return value; }); }, every(fn, thisArg) { return apply(this, "every", fn, thisArg, void 0, arguments); }, filter(fn, thisArg) { return apply( this, "filter", fn, thisArg, (v) => v.map((item) => toWrapped(this, item)), arguments ); }, find(fn, thisArg) { return apply( this, "find", fn, thisArg, (item) => toWrapped(this, item), arguments ); }, findIndex(fn, thisArg) { return apply(this, "findIndex", fn, thisArg, void 0, arguments); }, findLast(fn, thisArg) { return apply( this, "findLast", fn, thisArg, (item) => toWrapped(this, item), arguments ); }, findLastIndex(fn, thisArg) { return apply(this, "findLastIndex", fn, thisArg, void 0, arguments); }, forEach(fn, thisArg) { return apply(this, "forEach", fn, thisArg, void 0, arguments); }, includes(...args) { return searchProxy(this, "includes", args); }, indexOf(...args) { return searchProxy(this, "indexOf", args); }, join(separator) { return reactiveReadArray(this).join(separator); }, lastIndexOf(...args) { return searchProxy(this, "lastIndexOf", args); }, map(fn, thisArg) { return apply(this, "map", fn, thisArg, void 0, arguments); }, pop() { return noTracking(this, "pop"); }, push(...args) { return noTracking(this, "push", args); }, reduce(fn, ...args) { return reduce(this, "reduce", fn, args); }, reduceRight(fn, ...args) { return reduce(this, "reduceRight", fn, args); }, shift() { return noTracking(this, "shift"); }, some(fn, thisArg) { return apply(this, "some", fn, thisArg, void 0, arguments); }, splice(...args) { return noTracking(this, "splice", args); }, toReversed() { return reactiveReadArray(this).toReversed(); }, toSorted(comparer) { return reactiveReadArray(this).toSorted(comparer); }, toSpliced(...args) { return reactiveReadArray(this).toSpliced(...args); }, unshift(...args) { return noTracking(this, "unshift", args); }, values() { return iterator(this, "values", (item) => toWrapped(this, item)); } }; function iterator(self2, method, wrapValue) { const arr = shallowReadArray(self2); const iter = arr[method](); if (arr !== self2 && ! isShallow(self2)) { iter._next = iter.next; iter.next = () => { const result = iter._next(); if (!result.done) { result.value = wrapValue(result.value); } return result; }; } return iter; } const arrayProto = Array.prototype; function apply(self2, method, fn, thisArg, wrappedRetFn, args) { const arr = shallowReadArray(self2); const needsWrap = arr !== self2 && ! isShallow(self2); const methodFn = arr[method]; if (methodFn !== arrayProto[method]) { const result2 = methodFn.apply(self2, args); return needsWrap ? toReactive(result2) : result2; } let wrappedFn = fn; if (arr !== self2) { if (needsWrap) { wrappedFn = function(item, index) { return fn.call(this, toWrapped(self2, item), index, self2); }; } else if (fn.length > 2) { wrappedFn = function(item, index) { return fn.call(this, item, index, self2); }; } } const result = methodFn.call(arr, wrappedFn, thisArg); return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result; } function reduce(self2, method, fn, args) { const arr = shallowReadArray(self2); let wrappedFn = fn; if (arr !== self2) { if (! isShallow(self2)) { wrappedFn = function(acc, item, index) { return fn.call(this, acc, toWrapped(self2, item), index, self2); }; } else if (fn.length > 3) { wrappedFn = function(acc, item, index) { return fn.call(this, acc, item, index, self2); }; } } return arr[method](wrappedFn, ...args); } function searchProxy(self2, method, args) { const arr = toRaw(self2); track(arr, "iterate", ARRAY_ITERATE_KEY); const res = arr[method](...args); if ((res === -1 || res === false) && isProxy(args[0])) { args[0] = toRaw(args[0]); return arr[method](...args); } return res; } function noTracking(self2, method, args = []) { pauseTracking(); startBatch(); const res = ( toRaw(self2))[method].apply(self2, args); endBatch(); resetTracking(); return res; } const isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`); const builtInSymbols = new Set( Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) ); function hasOwnProperty(key) { if (!isSymbol(key)) key = String(key); const obj = toRaw(this); track(obj, "has", key); return obj.hasOwnProperty(key); } class BaseReactiveHandler { constructor(_isReadonly = false, _isShallow = false) { this._isReadonly = _isReadonly; this._isShallow = _isShallow; } get(target, key, receiver) { if (key === "__v_skip") return target["__v_skip"]; const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; if (key === "__v_isReactive") { return !isReadonly2; } else if (key === "__v_isReadonly") { return isReadonly2; } else if (key === "__v_isShallow") { return isShallow2; } else if (key === "__v_raw") { if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { return target; } return; } const targetIsArray = isArray(target); if (!isReadonly2) { let fn; if (targetIsArray && (fn = arrayInstrumentations[key])) { return fn; } if (key === "hasOwnProperty") { return hasOwnProperty; } } const res = Reflect.get( target, key, isRef(target) ? target : receiver ); if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { return res; } if (!isReadonly2) { track(target, "get", key); } if (isShallow2) { return res; } if ( isRef(res)) { const value = targetIsArray && isIntegerKey(key) ? res : res.value; return isReadonly2 && isObject(value) ? readonly(value) : value; } if (isObject(res)) { return isReadonly2 ? readonly(res) : reactive(res); } return res; } } class MutableReactiveHandler extends BaseReactiveHandler { constructor(isShallow2 = false) { super(false, isShallow2); } set(target, key, value, receiver) { let oldValue = target[key]; const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key); if (!this._isShallow) { const isOldValueReadonly = isReadonly(oldValue); if (! isShallow(value) && ! isReadonly(value)) { oldValue = toRaw(oldValue); value = toRaw(value); } if (!isArrayWithIntegerKey && isRef(oldValue) && ! isRef(value)) { if (isOldValueReadonly) { return true; } else { oldValue.value = value; return true; } } } const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key); const result = Reflect.set( target, key, value, isRef(target) ? target : receiver ); if (target === toRaw(receiver)) { if (!hadKey) { trigger(target, "add", key, value); } else if (hasChanged(value, oldValue)) { trigger(target, "set", key, value); } } return result; } deleteProperty(target, key) { const hadKey = hasOwn(target, key); target[key]; const result = Reflect.deleteProperty(target, key); if (result && hadKey) { trigger(target, "delete", key, void 0); } return result; } has(target, key) { const result = Reflect.has(target, key); if (!isSymbol(key) || !builtInSymbols.has(key)) { track(target, "has", key); } return result; } ownKeys(target) { track( target, "iterate", isArray(target) ? "length" : ITERATE_KEY ); return Reflect.ownKeys(target); } } class ReadonlyReactiveHandler extends BaseReactiveHandler { constructor(isShallow2 = false) { super(true, isShallow2); } set(target, key) { return true; } deleteProperty(target, key) { return true; } } const mutableHandlers = new MutableReactiveHandler(); const readonlyHandlers = new ReadonlyReactiveHandler(); const shallowReactiveHandlers = new MutableReactiveHandler(true); const shallowReadonlyHandlers = new ReadonlyReactiveHandler(true); const toShallow = (value) => value; const getProto = (v) => Reflect.getPrototypeOf(v); function createIterableMethod(method, isReadonly2, isShallow2) { return function(...args) { const target = this["__v_raw"]; const rawTarget = toRaw(target); const targetIsMap = isMap(rawTarget); const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; const isKeyOnly = method === "keys" && targetIsMap; const innerIterator = target[method](...args); const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; !isReadonly2 && track( rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY ); return extend( Object.create(innerIterator), { next() { const { value, done } = innerIterator.next(); return done ? { value, done } : { value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), done }; } } ); }; } function createReadonlyMethod(type) { return function(...args) { return type === "delete" ? false : type === "clear" ? void 0 : this; }; } function createInstrumentations(readonly2, shallow) { const instrumentations = { get(key) { const target = this["__v_raw"]; const rawTarget = toRaw(target); const rawKey = toRaw(key); if (!readonly2) { if (hasChanged(key, rawKey)) { track(rawTarget, "get", key); } track(rawTarget, "get", rawKey); } const { has } = getProto(rawTarget); const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; if (has.call(rawTarget, key)) { return wrap(target.get(key)); } else if (has.call(rawTarget, rawKey)) { return wrap(target.get(rawKey)); } else if (target !== rawTarget) { target.get(key); } }, get size() { const target = this["__v_raw"]; !readonly2 && track( toRaw(target), "iterate", ITERATE_KEY); return target.size; }, has(key) { const target = this["__v_raw"]; const rawTarget = toRaw(target); const rawKey = toRaw(key); if (!readonly2) { if (hasChanged(key, rawKey)) { track(rawTarget, "has", key); } track(rawTarget, "has", rawKey); } return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); }, forEach(callback, thisArg) { const observed = this; const target = observed["__v_raw"]; const rawTarget = toRaw(target); const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; !readonly2 && track(rawTarget, "iterate", ITERATE_KEY); return target.forEach((value, key) => { return callback.call(thisArg, wrap(value), wrap(key), observed); }); } }; extend( instrumentations, readonly2 ? { add: createReadonlyMethod("add"), set: createReadonlyMethod("set"), delete: createReadonlyMethod("delete"), clear: createReadonlyMethod("clear") } : { add(value) { if (!shallow && ! isShallow(value) && ! isReadonly(value)) { value = toRaw(value); } const target = toRaw(this); const proto = getProto(target); const hadKey = proto.has.call(target, value); if (!hadKey) { target.add(value); trigger(target, "add", value, value); } return this; }, set(key, value) { if (!shallow && ! isShallow(value) && ! isReadonly(value)) { value = toRaw(value); } const target = toRaw(this); const { has, get } = getProto(target); let hadKey = has.call(target, key); if (!hadKey) { key = toRaw(key); hadKey = has.call(target, key); } const oldValue = get.call(target, key); target.set(key, value); if (!hadKey) { trigger(target, "add", key, value); } else if (hasChanged(value, oldValue)) { trigger(target, "set", key, value); } return this; }, delete(key) { const target = toRaw(this); const { has, get } = getProto(target); let hadKey = has.call(target, key); if (!hadKey) { key = toRaw(key); hadKey = has.call(target, key); } get ? get.call(target, key) : void 0; const result = target.delete(key); if (hadKey) { trigger(target, "delete", key, void 0); } return result; }, clear() { const target = toRaw(this); const hadItems = target.size !== 0; const result = target.clear(); if (hadItems) { trigger( target, "clear", void 0, void 0 ); } return result; } } ); const iteratorMethods = [ "keys", "values", "entries", Symbol.iterator ]; iteratorMethods.forEach((method) => { instrumentations[method] = createIterableMethod(method, readonly2, shallow); }); return instrumentations; } function createInstrumentationGetter(isReadonly2, shallow) { const instrumentations = createInstrumentations(isReadonly2, shallow); return (target, key, receiver) => { if (key === "__v_isReactive") { return !isReadonly2; } else if (key === "__v_isReadonly") { return isReadonly2; } else if (key === "__v_raw") { return target; } return Reflect.get( hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver ); }; } const mutableCollectionHandlers = { get: createInstrumentationGetter(false, false) }; const shallowCollectionHandlers = { get: createInstrumentationGetter(false, true) }; const readonlyCollectionHandlers = { get: createInstrumentationGetter(true, false) }; const shallowReadonlyCollectionHandlers = { get: createInstrumentationGetter(true, true) }; const reactiveMap = new WeakMap(); const shallowReactiveMap = new WeakMap(); const readonlyMap = new WeakMap(); const shallowReadonlyMap = new WeakMap(); function targetTypeMap(rawType) { switch (rawType) { case "Object": case "Array": return 1; case "Map": case "Set": case "WeakMap": case "WeakSet": return 2; default: return 0; } } function getTargetType(value) { return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); } function reactive(target) { if ( isReadonly(target)) { return target; } return createReactiveObject( target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap ); } function shallowReactive(target) { return createReactiveObject( target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap ); } function readonly(target) { return createReactiveObject( target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap ); } function shallowReadonly(target) { return createReactiveObject( target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap ); } function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { if (!isObject(target)) { return target; } if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { return target; } const targetType = getTargetType(target); if (targetType === 0) { return target; } const existingProxy = proxyMap.get(target); if (existingProxy) { return existingProxy; } const proxy = new Proxy( target, targetType === 2 ? collectionHandlers : baseHandlers ); proxyMap.set(target, proxy); return proxy; } function isReactive(value) { if ( isReadonly(value)) { return isReactive(value["__v_raw"]); } return !!(value && value["__v_isReactive"]); } function isReadonly(value) { return !!(value && value["__v_isReadonly"]); } function isShallow(value) { return !!(value && value["__v_isShallow"]); } function isProxy(value) { return value ? !!value["__v_raw"] : false; } function toRaw(observed) { const raw = observed && observed["__v_raw"]; return raw ? toRaw(raw) : observed; } function markRaw(value) { if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) { def(value, "__v_skip", true); } return value; } const toReactive = (value) => isObject(value) ? reactive(value) : value; const toReadonly = (value) => isObject(value) ? readonly(value) : value; function isRef(r) { return r ? r["__v_isRef"] === true : false; } function ref(value) { return createRef(value, false); } function createRef(rawValue, shallow) { if ( isRef(rawValue)) { return rawValue; } return new RefImpl(rawValue, shallow); } class RefImpl { constructor(value, isShallow2) { this.dep = new Dep(); this["__v_isRef"] = true; this["__v_isShallow"] = false; this._rawValue = isShallow2 ? value : toRaw(value); this._value = isShallow2 ? value : toReactive(value); this["__v_isShallow"] = isShallow2; } get value() { { this.dep.track(); } return this._value; } set value(newValue) { const oldValue = this._rawValue; const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue); newValue = useDirectValue ? newValue : toRaw(newValue); if (hasChanged(newValue, oldValue)) { this._rawValue = newValue; this._value = useDirectValue ? newValue : toReactive(newValue); { this.dep.trigger(); } } } } function unref(ref2) { return isRef(ref2) ? ref2.value : ref2; } const shallowUnwrapHandlers = { get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)), set: (target, key, value, receiver) => { const oldValue = target[key]; if ( isRef(oldValue) && ! isRef(value)) { oldValue.value = value; return true; } else { return Reflect.set(target, key, value, receiver); } } }; function proxyRefs(objectWithRefs) { return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); } class ComputedRefImpl { constructor(fn, setter, isSSR) { this.fn = fn; this.setter = setter; this._value = void 0; this.dep = new Dep(this); this.__v_isRef = true; this.deps = void 0; this.depsTail = void 0; this.flags = 16; this.globalVersion = globalVersion - 1; this.next = void 0; this.effect = this; this["__v_isReadonly"] = !setter; this.isSSR = isSSR; } notify() { this.flags |= 16; if (!(this.flags & 8) && activeSub !== this) { batch(this, true); return true; } } get value() { const link = this.dep.track(); refreshComputed(this); if (link) { link.version = this.dep.version; } return this._value; } set value(newValue) { if (this.setter) { this.setter(newValue); } } } function computed$1(getterOrOptions, debugOptions, isSSR = false) { let getter; let setter; if (isFunction(getterOrOptions)) { getter = getterOrOptions; } else { getter = getterOrOptions.get; setter = getterOrOptions.set; } const cRef = new ComputedRefImpl(getter, setter, isSSR); return cRef; } const INITIAL_WATCHER_VALUE = {}; const cleanupMap = new WeakMap(); let activeWatcher = void 0; function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) { if (owner) { let cleanups = cleanupMap.get(owner); if (!cleanups) cleanupMap.set(owner, cleanups = []); cleanups.push(cleanupFn); } } function watch$1(source, cb, options = EMPTY_OBJ) { const { immediate, deep, once, scheduler, augmentJob, call } = options; const reactiveGetter = (source2) => { if (deep) return source2; if ( isShallow(source2) || deep === false || deep === 0) return traverse(source2, 1); return traverse(source2); }; let effect2; let getter; let cleanup; let boundCleanup; let forceTrigger = false; let isMultiSource = false; if ( isRef(source)) { getter = () => source.value; forceTrigger = isShallow(source); } else if ( isReactive(source)) { getter = () => reactiveGetter(source); forceTrigger = true; } else if (isArray(source)) { isMultiSource = true; forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); getter = () => source.map((s) => { if ( isRef(s)) { return s.value; } else if ( isReactive(s)) { return reactiveGetter(s); } else if (isFunction(s)) { return call ? call(s, 2) : s(); } else ; }); } else if (isFunction(source)) { if (cb) { getter = call ? () => call(source, 2) : source; } else { getter = () => { if (cleanup) { pauseTracking(); try { cleanup(); } finally { resetTracking(); } } const currentEffect = activeWatcher; activeWatcher = effect2; try { return call ? call(source, 3, [boundCleanup]) : source(boundCleanup); } finally { activeWatcher = currentEffect; } }; } } else { getter = NOOP; } if (cb && deep) { const baseGetter = getter; const depth = deep === true ? Infinity : deep; getter = () => traverse(baseGetter(), depth); } const scope = getCurrentScope(); const watchHandle = () => { effect2.stop(); if (scope && scope.active) { remove(scope.effects, effect2); } }; if (once && cb) { const _cb = cb; cb = (...args) => { _cb(...args); watchHandle(); }; } let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; const job = (immediateFirstRun) => { if (!(effect2.flags & 1) || !effect2.dirty && !immediateFirstRun) { return; } if (cb) { const newValue = effect2.run(); if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) { if (cleanup) { cleanup(); } const currentWatcher = activeWatcher; activeWatcher = effect2; try { const args = [ newValue, oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, boundCleanup ]; oldValue = newValue; call ? call(cb, 3, args) : ( cb(...args) ); } finally { activeWatcher = currentWatcher; } } } else { effect2.run(); } }; if (augmentJob) { augmentJob(job); } effect2 = new ReactiveEffect(getter); effect2.scheduler = scheduler ? () => scheduler(job, false) : job; boundCleanup = (fn) => onWatcherCleanup(fn, false, effect2); cleanup = effect2.onStop = () => { const cleanups = cleanupMap.get(effect2); if (cleanups) { if (call) { call(cleanups, 4); } else { for (const cleanup2 of cleanups) cleanup2(); } cleanupMap.delete(effect2); } }; if (cb) { if (immediate) { job(true); } else { oldValue = effect2.run(); } } else if (scheduler) { scheduler(job.bind(null, true), true); } else { effect2.run(); } watchHandle.pause = effect2.pause.bind(effect2); watchHandle.resume = effect2.resume.bind(effect2); watchHandle.stop = watchHandle; return watchHandle; } function traverse(value, depth = Infinity, seen) { if (depth <= 0 || !isObject(value) || value["__v_skip"]) { return value; } seen = seen || new Map(); if ((seen.get(value) || 0) >= depth) { return value; } seen.set(value, depth); depth--; if ( isRef(value)) { traverse(value.value, depth, seen); } else if (isArray(value)) { for (let i = 0; i < value.length; i++) { traverse(value[i], depth, seen); } } else if (isSet(value) || isMap(value)) { value.forEach((v) => { traverse(v, depth, seen); }); } else if (isPlainObject(value)) { for (const key in value) { traverse(value[key], depth, seen); } for (const key of Object.getOwnPropertySymbols(value)) { if (Object.prototype.propertyIsEnumerable.call(value, key)) { traverse(value[key], depth, seen); } } } return value; } /** * @vue/runtime-core v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ const stack = []; let isWarning = false; function warn$1(msg, ...args) { if (isWarning) return; isWarning = true; pauseTracking(); const instance = stack.length ? stack[stack.length - 1].component : null; const appWarnHandler = instance && instance.appContext.config.warnHandler; const trace = getComponentTrace(); if (appWarnHandler) { callWithErrorHandling( appWarnHandler, instance, 11, [ msg + args.map((a) => { var _a, _b; return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); }).join(""), instance && instance.proxy, trace.map( ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` ).join("\n"), trace ] ); } else { const warnArgs = [`[Vue warn]: ${msg}`, ...args]; if (trace.length && true) { warnArgs.push(` `, ...formatTrace(trace)); } console.warn(...warnArgs); } resetTracking(); isWarning = false; } function getComponentTrace() { let currentVNode = stack[stack.length - 1]; if (!currentVNode) { return []; } const normalizedStack = []; while (currentVNode) { const last = normalizedStack[0]; if (last && last.vnode === currentVNode) { last.recurseCount++; } else { normalizedStack.push({ vnode: currentVNode, recurseCount: 0 }); } const parentInstance = currentVNode.component && currentVNode.component.parent; currentVNode = parentInstance && parentInstance.vnode; } return normalizedStack; } function formatTrace(trace) { const logs = []; trace.forEach((entry, i) => { logs.push(...i === 0 ? [] : [` `], ...formatTraceEntry(entry)); }); return logs; } function formatTraceEntry({ vnode, recurseCount }) { const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; const isRoot = vnode.component ? vnode.component.parent == null : false; const open = ` at <${formatComponentName( vnode.component, vnode.type, isRoot )}`; const close = `>` + postfix; return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; } function formatProps(props) { const res = []; const keys = Object.keys(props); keys.slice(0, 3).forEach((key) => { res.push(...formatProp(key, props[key])); }); if (keys.length > 3) { res.push(` ...`); } return res; } function formatProp(key, value, raw) { if (isString(value)) { value = JSON.stringify(value); return raw ? value : [`${key}=${value}`]; } else if (typeof value === "number" || typeof value === "boolean" || value == null) { return raw ? value : [`${key}=${value}`]; } else if ( isRef(value)) { value = formatProp(key, toRaw(value.value), true); return raw ? value : [`${key}=Ref<`, value, `>`]; } else if (isFunction(value)) { return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; } else { value = toRaw(value); return raw ? value : [`${key}=`, value]; } } function callWithErrorHandling(fn, instance, type, args) { try { return args ? fn(...args) : fn(); } catch (err) { handleError(err, instance, type); } } function callWithAsyncErrorHandling(fn, instance, type, args) { if (isFunction(fn)) { const res = callWithErrorHandling(fn, instance, type, args); if (res && isPromise(res)) { res.catch((err) => { handleError(err, instance, type); }); } return res; } if (isArray(fn)) { const values = []; for (let i = 0; i < fn.length; i++) { values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); } return values; } } function handleError(err, instance, type, throwInDev = true) { const contextVNode = instance ? instance.vnode : null; const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ; if (instance) { let cur = instance.parent; const exposedInstance = instance.proxy; const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`; while (cur) { const errorCapturedHooks = cur.ec; if (errorCapturedHooks) { for (let i = 0; i < errorCapturedHooks.length; i++) { if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { return; } } } cur = cur.parent; } if (errorHandler) { pauseTracking(); callWithErrorHandling(errorHandler, null, 10, [ err, exposedInstance, errorInfo ]); resetTracking(); return; } } logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction); } function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) { if (throwInProd) { throw err; } else { console.error(err); } } const queue = []; let flushIndex = -1; const pendingPostFlushCbs = []; let activePostFlushCbs = null; let postFlushIndex = 0; const resolvedPromise = Promise.resolve(); let currentFlushPromise = null; function nextTick(fn) { const p2 = currentFlushPromise || resolvedPromise; return fn ? p2.then(this ? fn.bind(this) : fn) : p2; } function findInsertionIndex(id) { let start = flushIndex + 1; let end = queue.length; while (start < end) { const middle = start + end >>> 1; const middleJob = queue[middle]; const middleJobId = getId(middleJob); if (middleJobId < id || middleJobId === id && middleJob.flags & 2) { start = middle + 1; } else { end = middle; } } return start; } function queueJob(job) { if (!(job.flags & 1)) { const jobId = getId(job); const lastJob = queue[queue.length - 1]; if (!lastJob || !(job.flags & 2) && jobId >= getId(lastJob)) { queue.push(job); } else { queue.splice(findInsertionIndex(jobId), 0, job); } job.flags |= 1; queueFlush(); } } function queueFlush() { if (!currentFlushPromise) { currentFlushPromise = resolvedPromise.then(flushJobs); } } function queuePostFlushCb(cb) { if (!isArray(cb)) { if (activePostFlushCbs && cb.id === -1) { activePostFlushCbs.splice(postFlushIndex + 1, 0, cb); } else if (!(cb.flags & 1)) { pendingPostFlushCbs.push(cb); cb.flags |= 1; } } else { pendingPostFlushCbs.push(...cb); } queueFlush(); } function flushPreFlushCbs(instance, seen, i = flushIndex + 1) { for (; i < queue.length; i++) { const cb = queue[i]; if (cb && cb.flags & 2) { if (instance && cb.id !== instance.uid) { continue; } queue.splice(i, 1); i--; if (cb.flags & 4) { cb.flags &= -2; } cb(); if (!(cb.flags & 4)) { cb.flags &= -2; } } } } function flushPostFlushCbs(seen) { if (pendingPostFlushCbs.length) { const deduped = [...new Set(pendingPostFlushCbs)].sort( (a, b) => getId(a) - getId(b) ); pendingPostFlushCbs.length = 0; if (activePostFlushCbs) { activePostFlushCbs.push(...deduped); return; } activePostFlushCbs = deduped; for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { const cb = activePostFlushCbs[postFlushIndex]; if (cb.flags & 4) { cb.flags &= -2; } if (!(cb.flags & 8)) cb(); cb.flags &= -2; } activePostFlushCbs = null; postFlushIndex = 0; } } const getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id; function flushJobs(seen) { try { for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { const job = queue[flushIndex]; if (job && !(job.flags & 8)) { if (false) ; if (job.flags & 4) { job.flags &= ~1; } callWithErrorHandling( job, job.i, job.i ? 15 : 14 ); if (!(job.flags & 4)) { job.flags &= ~1; } } } } finally { for (; flushIndex < queue.length; flushIndex++) { const job = queue[flushIndex]; if (job) { job.flags &= -2; } } flushIndex = -1; queue.length = 0; flushPostFlushCbs(); currentFlushPromise = null; if (queue.length || pendingPostFlushCbs.length) { flushJobs(); } } } let currentRenderingInstance = null; let currentScopeId = null; function setCurrentRenderingInstance(instance) { const prev = currentRenderingInstance; currentRenderingInstance = instance; currentScopeId = instance && instance.type.__scopeId || null; return prev; } function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { if (!ctx) return fn; if (fn._n) { return fn; } const renderFnWithContext = (...args) => { if (renderFnWithContext._d) { setBlockTracking(-1); } const prevInstance = setCurrentRenderingInstance(ctx); let res; try { res = fn(...args); } finally { setCurrentRenderingInstance(prevInstance); if (renderFnWithContext._d) { setBlockTracking(1); } } return res; }; renderFnWithContext._n = true; renderFnWithContext._c = true; renderFnWithContext._d = true; return renderFnWithContext; } function withDirectives(vnode, directives) { if (currentRenderingInstance === null) { return vnode; } const instance = getComponentPublicInstance(currentRenderingInstance); const bindings = vnode.dirs || (vnode.dirs = []); for (let i = 0; i < directives.length; i++) { let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; if (dir) { if (isFunction(dir)) { dir = { mounted: dir, updated: dir }; } if (dir.deep) { traverse(value); } bindings.push({ dir, instance, value, oldValue: void 0, arg, modifiers }); } } return vnode; } function invokeDirectiveHook(vnode, prevVNode, instance, name) { const bindings = vnode.dirs; const oldBindings = prevVNode && prevVNode.dirs; for (let i = 0; i < bindings.length; i++) { const binding = bindings[i]; if (oldBindings) { binding.oldValue = oldBindings[i].value; } let hook = binding.dir[name]; if (hook) { pauseTracking(); callWithAsyncErrorHandling(hook, instance, 8, [ vnode.el, binding, vnode, prevVNode ]); resetTracking(); } } } function provide(key, value) { if (currentInstance) { let provides = currentInstance.provides; const parentProvides = currentInstance.parent && currentInstance.parent.provides; if (parentProvides === provides) { provides = currentInstance.provides = Object.create(parentProvides); } provides[key] = value; } } function inject(key, defaultValue, treatDefaultAsFactory = false) { const instance = getCurrentInstance(); if (instance || currentApp) { let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0; if (provides && key in provides) { return provides[key]; } else if (arguments.length > 1) { return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; } else ; } } const ssrContextKey = Symbol.for("v-scx"); const useSSRContext = () => { { const ctx = inject(ssrContextKey); return ctx; } }; function watch(source, cb, options) { return doWatch(source, cb, options); } function doWatch(source, cb, options = EMPTY_OBJ) { const { immediate, deep, flush, once } = options; const baseWatchOptions = extend({}, options); const runsImmediately = cb && immediate || !cb && flush !== "post"; let ssrCleanup; if (isInSSRComponentSetup) { if (flush === "sync") { const ctx = useSSRContext(); ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); } else if (!runsImmediately) { const watchStopHandle = () => { }; watchStopHandle.stop = NOOP; watchStopHandle.resume = NOOP; watchStopHandle.pause = NOOP; return watchStopHandle; } } const instance = currentInstance; baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args); let isPre = false; if (flush === "post") { baseWatchOptions.scheduler = (job) => { queuePostRenderEffect(job, instance && instance.suspense); }; } else if (flush !== "sync") { isPre = true; baseWatchOptions.scheduler = (job, isFirstRun) => { if (isFirstRun) { job(); } else { queueJob(job); } }; } baseWatchOptions.augmentJob = (job) => { if (cb) { job.flags |= 4; } if (isPre) { job.flags |= 2; if (instance) { job.id = instance.uid; job.i = instance; } } }; const watchHandle = watch$1(source, cb, baseWatchOptions); if (isInSSRComponentSetup) { if (ssrCleanup) { ssrCleanup.push(watchHandle); } else if (runsImmediately) { watchHandle(); } } return watchHandle; } function instanceWatch(source, value, options) { const publicThis = this.proxy; const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); let cb; if (isFunction(value)) { cb = value; } else { cb = value.handler; options = value; } const reset = setCurrentInstance(this); const res = doWatch(getter, cb.bind(publicThis), options); reset(); return res; } function createPathGetter(ctx, path) { const segments = path.split("."); return () => { let cur = ctx; for (let i = 0; i < segments.length && cur; i++) { cur = cur[segments[i]]; } return cur; }; } const TeleportEndKey = Symbol("_vte"); const isTeleport = (type) => type.__isTeleport; const leaveCbKey = Symbol("_leaveCb"); function setTransitionHooks(vnode, hooks) { if (vnode.shapeFlag & 6 && vnode.component) { vnode.transition = hooks; setTransitionHooks(vnode.component.subTree, hooks); } else if (vnode.shapeFlag & 128) { vnode.ssContent.transition = hooks.clone(vnode.ssContent); vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); } else { vnode.transition = hooks; } } function defineComponent(options, extraOptions) { return isFunction(options) ? ( (() => extend({ name: options.name }, extraOptions, { setup: options }))() ) : options; } function markAsyncBoundary(instance) { instance.ids = [instance.ids[0] + instance.ids[2]++ + "-", 0, 0]; } function isTemplateRefKey(refs, key) { let desc; return !!((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable); } const pendingSetRefMap = new WeakMap(); function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { if (isArray(rawRef)) { rawRef.forEach( (r, i) => setRef( r, oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode, isUnmount ) ); return; } if (isAsyncWrapper(vnode) && !isUnmount) { if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) { setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree); } return; } const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; const value = isUnmount ? null : refValue; const { i: owner, r: ref3 } = rawRef; const oldRef = oldRawRef && oldRawRef.r; const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; const setupState = owner.setupState; const rawSetupState = toRaw(setupState); const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => { if (isTemplateRefKey(refs, key)) { return false; } return hasOwn(rawSetupState, key); }; const canSetRef = (ref22, key) => { if (key && isTemplateRefKey(refs, key)) { return false; } return true; }; if (oldRef != null && oldRef !== ref3) { invalidatePendingSetRef(oldRawRef); if (isString(oldRef)) { refs[oldRef] = null; if (canSetSetupRef(oldRef)) { setupState[oldRef] = null; } } else if ( isRef(oldRef)) { const oldRawRefAtom = oldRawRef; if (canSetRef(oldRef, oldRawRefAtom.k)) { oldRef.value = null; } if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null; } } if (isFunction(ref3)) { callWithErrorHandling(ref3, owner, 12, [value, refs]); } else { const _isString = isString(ref3); const _isRef = isRef(ref3); if (_isString || _isRef) { const doSet = () => { if (rawRef.f) { const existing = _isString ? canSetSetupRef(ref3) ? setupState[ref3] : refs[ref3] : canSetRef() || !rawRef.k ? ref3.value : refs[rawRef.k]; if (isUnmount) { isArray(existing) && remove(existing, refValue); } else { if (!isArray(existing)) { if (_isString) { refs[ref3] = [refValue]; if (canSetSetupRef(ref3)) { setupState[ref3] = refs[ref3]; } } else { const newVal = [refValue]; if (canSetRef(ref3, rawRef.k)) { ref3.value = newVal; } if (rawRef.k) refs[rawRef.k] = newVal; } } else if (!existing.includes(refValue)) { existing.push(refValue); } } } else if (_isString) { refs[ref3] = value; if (canSetSetupRef(ref3)) { setupState[ref3] = value; } } else if (_isRef) { if (canSetRef(ref3, rawRef.k)) { ref3.value = value; } if (rawRef.k) refs[rawRef.k] = value; } else ; }; if (value) { const job = () => { doSet(); pendingSetRefMap.delete(rawRef); }; job.id = -1; pendingSetRefMap.set(rawRef, job); queuePostRenderEffect(job, parentSuspense); } else { invalidatePendingSetRef(rawRef); doSet(); } } } } function invalidatePendingSetRef(rawRef) { const pendingSetRef = pendingSetRefMap.get(rawRef); if (pendingSetRef) { pendingSetRef.flags |= 8; pendingSetRefMap.delete(rawRef); } } getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1)); getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id)); const isAsyncWrapper = (i) => !!i.type.__asyncLoader; const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; function onActivated(hook, target) { registerKeepAliveHook(hook, "a", target); } function onDeactivated(hook, target) { registerKeepAliveHook(hook, "da", target); } function registerKeepAliveHook(hook, type, target = currentInstance) { const wrappedHook = hook.__wdc || (hook.__wdc = () => { let current = target; while (current) { if (current.isDeactivated) { return; } current = current.parent; } return hook(); }); injectHook(type, wrappedHook, target); if (target) { let current = target.parent; while (current && current.parent) { if (isKeepAlive(current.parent.vnode)) { injectToKeepAliveRoot(wrappedHook, type, target, current); } current = current.parent; } } } function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { const injected = injectHook( type, hook, keepAliveRoot, true ); onUnmounted(() => { remove(keepAliveRoot[type], injected); }, target); } function injectHook(type, hook, target = currentInstance, prepend = false) { if (target) { const hooks = target[type] || (target[type] = []); const wrappedHook = hook.__weh || (hook.__weh = (...args) => { pauseTracking(); const reset = setCurrentInstance(target); const res = callWithAsyncErrorHandling(hook, target, type, args); reset(); resetTracking(); return res; }); if (prepend) { hooks.unshift(wrappedHook); } else { hooks.push(wrappedHook); } return wrappedHook; } } const createHook = (lifecycle) => (hook, target = currentInstance) => { if (!isInSSRComponentSetup || lifecycle === "sp") { injectHook(lifecycle, (...args) => hook(...args), target); } }; const onBeforeMount = createHook("bm"); const onMounted = createHook("m"); const onBeforeUpdate = createHook( "bu" ); const onUpdated = createHook("u"); const onBeforeUnmount = createHook( "bum" ); const onUnmounted = createHook("um"); const onServerPrefetch = createHook( "sp" ); const onRenderTriggered = createHook("rtg"); const onRenderTracked = createHook("rtc"); function onErrorCaptured(hook, target = currentInstance) { injectHook("ec", hook, target); } const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); function renderList(source, renderItem, cache2, index) { let ret; const cached = cache2; const sourceIsArray = isArray(source); if (sourceIsArray || isString(source)) { const sourceIsReactiveArray = sourceIsArray && isReactive(source); let needsWrap = false; let isReadonlySource = false; if (sourceIsReactiveArray) { needsWrap = ! isShallow(source); isReadonlySource = isReadonly(source); source = shallowReadArray(source); } ret = new Array(source.length); for (let i = 0, l = source.length; i < l; i++) { ret[i] = renderItem( needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i], i, void 0, cached ); } } else if (typeof source === "number") { ret = new Array(source); for (let i = 0; i < source; i++) { ret[i] = renderItem(i + 1, i, void 0, cached); } } else if (isObject(source)) { if (source[Symbol.iterator]) { ret = Array.from( source, (item, i) => renderItem(item, i, void 0, cached) ); } else { const keys = Object.keys(source); ret = new Array(keys.length); for (let i = 0, l = keys.length; i < l; i++) { const key = keys[i]; ret[i] = renderItem(source[key], key, i, cached); } } } else { ret = []; } return ret; } const getPublicInstance = (i) => { if (!i) return null; if (isStatefulComponent(i)) return getComponentPublicInstance(i); return getPublicInstance(i.parent); }; const publicPropertiesMap = ( extend( Object.create(null), { $: (i) => i, $el: (i) => i.vnode.el, $data: (i) => i.data, $props: (i) => i.props, $attrs: (i) => i.attrs, $slots: (i) => i.slots, $refs: (i) => i.refs, $parent: (i) => getPublicInstance(i.parent), $root: (i) => getPublicInstance(i.root), $host: (i) => i.ce, $emit: (i) => i.emit, $options: (i) => resolveMergedOptions(i), $forceUpdate: (i) => i.f || (i.f = () => { queueJob(i.update); }), $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), $watch: (i) => instanceWatch.bind(i) }) ); const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); const PublicInstanceProxyHandlers = { get({ _: instance }, key) { if (key === "__v_skip") { return true; } const { ctx, setupState, data, props, accessCache, type, appContext } = instance; if (key[0] !== "$") { const n = accessCache[key]; if (n !== void 0) { switch (n) { case 1: return setupState[key]; case 2: return data[key]; case 4: return ctx[key]; case 3: return props[key]; } } else if (hasSetupBinding(setupState, key)) { accessCache[key] = 1; return setupState[key]; } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { accessCache[key] = 2; return data[key]; } else if (hasOwn(props, key)) { accessCache[key] = 3; return props[key]; } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { accessCache[key] = 4; return ctx[key]; } else if (shouldCacheAccess) { accessCache[key] = 0; } } const publicGetter = publicPropertiesMap[key]; let cssModule, globalProperties; if (publicGetter) { if (key === "$attrs") { track(instance.attrs, "get", ""); } return publicGetter(instance); } else if ( (cssModule = type.__cssModules) && (cssModule = cssModule[key]) ) { return cssModule; } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { accessCache[key] = 4; return ctx[key]; } else if ( globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) ) { { return globalProperties[key]; } } else ; }, set({ _: instance }, key, value) { const { data, setupState, ctx } = instance; if (hasSetupBinding(setupState, key)) { setupState[key] = value; return true; } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { data[key] = value; return true; } else if (hasOwn(instance.props, key)) { return false; } if (key[0] === "$" && key.slice(1) in instance) { return false; } else { { ctx[key] = value; } } return true; }, has({ _: { data, setupState, accessCache, ctx, appContext, props, type } }, key) { let cssModules; return !!(accessCache[key] || data !== EMPTY_OBJ && key[0] !== "$" && hasOwn(data, key) || hasSetupBinding(setupState, key) || hasOwn(props, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]); }, defineProperty(target, key, descriptor) { if (descriptor.get != null) { target._.accessCache[key] = 0; } else if (hasOwn(descriptor, "value")) { this.set(target, key, descriptor.value, null); } return Reflect.defineProperty(target, key, descriptor); } }; function normalizePropsOrEmits(props) { return isArray(props) ? props.reduce( (normalized, p2) => (normalized[p2] = null, normalized), {} ) : props; } let shouldCacheAccess = true; function applyOptions(instance) { const options = resolveMergedOptions(instance); const publicThis = instance.proxy; const ctx = instance.ctx; shouldCacheAccess = false; if (options.beforeCreate) { callHook(options.beforeCreate, instance, "bc"); } const { data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions, created, beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render: render2, renderTracked, renderTriggered, errorCaptured, serverPrefetch, expose, inheritAttrs, components, directives, filters } = options; const checkDuplicateProperties = null; if (injectOptions) { resolveInjections(injectOptions, ctx, checkDuplicateProperties); } if (methods) { for (const key in methods) { const methodHandler = methods[key]; if (isFunction(methodHandler)) { { ctx[key] = methodHandler.bind(publicThis); } } } } if (dataOptions) { const data = dataOptions.call(publicThis, publicThis); if (!isObject(data)) ; else { instance.data = reactive(data); } } shouldCacheAccess = true; if (computedOptions) { for (const key in computedOptions) { const opt = computedOptions[key]; const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP; const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : NOOP; const c = computed({ get, set }); Object.defineProperty(ctx, key, { enumerable: true, configurable: true, get: () => c.value, set: (v) => c.value = v }); } } if (watchOptions) { for (const key in watchOptions) { createWatcher(watchOptions[key], ctx, publicThis, key); } } if (provideOptions) { const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions; Reflect.ownKeys(provides).forEach((key) => { provide(key, provides[key]); }); } if (created) { callHook(created, instance, "c"); } function registerLifecycleHook(register, hook) { if (isArray(hook)) { hook.forEach((_hook) => register(_hook.bind(publicThis))); } else if (hook) { register(hook.bind(publicThis)); } } registerLifecycleHook(onBeforeMount, beforeMount); registerLifecycleHook(onMounted, mounted); registerLifecycleHook(onBeforeUpdate, beforeUpdate); registerLifecycleHook(onUpdated, updated); registerLifecycleHook(onActivated, activated); registerLifecycleHook(onDeactivated, deactivated); registerLifecycleHook(onErrorCaptured, errorCaptured); registerLifecycleHook(onRenderTracked, renderTracked); registerLifecycleHook(onRenderTriggered, renderTriggered); registerLifecycleHook(onBeforeUnmount, beforeUnmount); registerLifecycleHook(onUnmounted, unmounted); registerLifecycleHook(onServerPrefetch, serverPrefetch); if (isArray(expose)) { if (expose.length) { const exposed = instance.exposed || (instance.exposed = {}); expose.forEach((key) => { Object.defineProperty(exposed, key, { get: () => publicThis[key], set: (val) => publicThis[key] = val, enumerable: true }); }); } else if (!instance.exposed) { instance.exposed = {}; } } if (render2 && instance.render === NOOP) { instance.render = render2; } if (inheritAttrs != null) { instance.inheritAttrs = inheritAttrs; } if (components) instance.components = components; if (directives) instance.directives = directives; if (serverPrefetch) { markAsyncBoundary(instance); } } function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) { if (isArray(injectOptions)) { injectOptions = normalizeInject(injectOptions); } for (const key in injectOptions) { const opt = injectOptions[key]; let injected; if (isObject(opt)) { if ("default" in opt) { injected = inject( opt.from || key, opt.default, true ); } else { injected = inject(opt.from || key); } } else { injected = inject(opt); } if ( isRef(injected)) { Object.defineProperty(ctx, key, { enumerable: true, configurable: true, get: () => injected.value, set: (v) => injected.value = v }); } else { ctx[key] = injected; } } } function callHook(hook, instance, type) { callWithAsyncErrorHandling( isArray(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy), instance, type ); } function createWatcher(raw, ctx, publicThis, key) { let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; if (isString(raw)) { const handler = ctx[raw]; if (isFunction(handler)) { { watch(getter, handler); } } } else if (isFunction(raw)) { { watch(getter, raw.bind(publicThis)); } } else if (isObject(raw)) { if (isArray(raw)) { raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); } else { const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; if (isFunction(handler)) { watch(getter, handler, raw); } } } else ; } function resolveMergedOptions(instance) { const base = instance.type; const { mixins, extends: extendsOptions } = base; const { mixins: globalMixins, optionsCache: cache2, config: { optionMergeStrategies } } = instance.appContext; const cached = cache2.get(base); let resolved; if (cached) { resolved = cached; } else if (!globalMixins.length && !mixins && !extendsOptions) { { resolved = base; } } else { resolved = {}; if (globalMixins.length) { globalMixins.forEach( (m) => mergeOptions(resolved, m, optionMergeStrategies, true) ); } mergeOptions(resolved, base, optionMergeStrategies); } if (isObject(base)) { cache2.set(base, resolved); } return resolved; } function mergeOptions(to, from, strats, asMixin = false) { const { mixins, extends: extendsOptions } = from; if (extendsOptions) { mergeOptions(to, extendsOptions, strats, true); } if (mixins) { mixins.forEach( (m) => mergeOptions(to, m, strats, true) ); } for (const key in from) { if (asMixin && key === "expose") ; else { const strat = internalOptionMergeStrats[key] || strats && strats[key]; to[key] = strat ? strat(to[key], from[key]) : from[key]; } } return to; } const internalOptionMergeStrats = { data: mergeDataFn, props: mergeEmitsOrPropsOptions, emits: mergeEmitsOrPropsOptions, methods: mergeObjectOptions, computed: mergeObjectOptions, beforeCreate: mergeAsArray, created: mergeAsArray, beforeMount: mergeAsArray, mounted: mergeAsArray, beforeUpdate: mergeAsArray, updated: mergeAsArray, beforeDestroy: mergeAsArray, beforeUnmount: mergeAsArray, destroyed: mergeAsArray, unmounted: mergeAsArray, activated: mergeAsArray, deactivated: mergeAsArray, errorCaptured: mergeAsArray, serverPrefetch: mergeAsArray, components: mergeObjectOptions, directives: mergeObjectOptions, watch: mergeWatchOptions, provide: mergeDataFn, inject: mergeInject }; function mergeDataFn(to, from) { if (!from) { return to; } if (!to) { return from; } return function mergedDataFn() { return extend( isFunction(to) ? to.call(this, this) : to, isFunction(from) ? from.call(this, this) : from ); }; } function mergeInject(to, from) { return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); } function normalizeInject(raw) { if (isArray(raw)) { const res = {}; for (let i = 0; i < raw.length; i++) { res[raw[i]] = raw[i]; } return res; } return raw; } function mergeAsArray(to, from) { return to ? [...new Set([].concat(to, from))] : from; } function mergeObjectOptions(to, from) { return to ? extend( Object.create(null), to, from) : from; } function mergeEmitsOrPropsOptions(to, from) { if (to) { if (isArray(to) && isArray(from)) { return [... new Set([...to, ...from])]; } return extend( Object.create(null), normalizePropsOrEmits(to), normalizePropsOrEmits(from != null ? from : {}) ); } else { return from; } } function mergeWatchOptions(to, from) { if (!to) return from; if (!from) return to; const merged = extend( Object.create(null), to); for (const key in from) { merged[key] = mergeAsArray(to[key], from[key]); } return merged; } function createAppContext() { return { app: null, config: { isNativeTag: NO, performance: false, globalProperties: {}, optionMergeStrategies: {}, errorHandler: void 0, warnHandler: void 0, compilerOptions: {} }, mixins: [], components: {}, directives: {}, provides: Object.create(null), optionsCache: new WeakMap(), propsCache: new WeakMap(), emitsCache: new WeakMap() }; } let uid$1 = 0; function createAppAPI(render2, hydrate) { return function createApp2(rootComponent, rootProps = null) { if (!isFunction(rootComponent)) { rootComponent = extend({}, rootComponent); } if (rootProps != null && !isObject(rootProps)) { rootProps = null; } const context = createAppContext(); const installedPlugins = new WeakSet(); const pluginCleanupFns = []; let isMounted = false; const app = context.app = { _uid: uid$1++, _component: rootComponent, _props: rootProps, _container: null, _context: context, _instance: null, version: version$1, get config() { return context.config; }, set config(v) { }, use(plugin, ...options) { if (installedPlugins.has(plugin)) ; else if (plugin && isFunction(plugin.install)) { installedPlugins.add(plugin); plugin.install(app, ...options); } else if (isFunction(plugin)) { installedPlugins.add(plugin); plugin(app, ...options); } else ; return app; }, mixin(mixin) { { if (!context.mixins.includes(mixin)) { context.mixins.push(mixin); } } return app; }, component(name, component) { if (!component) { return context.components[name]; } context.components[name] = component; return app; }, directive(name, directive) { if (!directive) { return context.directives[name]; } context.directives[name] = directive; return app; }, mount(rootContainer, isHydrate, namespace) { if (!isMounted) { const vnode = app._ceVNode || createVNode(rootComponent, rootProps); vnode.appContext = context; if (namespace === true) { namespace = "svg"; } else if (namespace === false) { namespace = void 0; } { render2(vnode, rootContainer, namespace); } isMounted = true; app._container = rootContainer; rootContainer.__vue_app__ = app; return getComponentPublicInstance(vnode.component); } }, onUnmount(cleanupFn) { pluginCleanupFns.push(cleanupFn); }, unmount() { if (isMounted) { callWithAsyncErrorHandling( pluginCleanupFns, app._instance, 16 ); render2(null, app._container); delete app._container.__vue_app__; } }, provide(key, value) { context.provides[key] = value; return app; }, runWithContext(fn) { const lastApp = currentApp; currentApp = app; try { return fn(); } finally { currentApp = lastApp; } } }; return app; }; } let currentApp = null; const getModelModifiers = (props, modelName) => { return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`]; }; function emit(instance, event, ...rawArgs) { if (instance.isUnmounted) return; const props = instance.vnode.props || EMPTY_OBJ; let args = rawArgs; const isModelListener2 = event.startsWith("update:"); const modifiers = isModelListener2 && getModelModifiers(props, event.slice(7)); if (modifiers) { if (modifiers.trim) { args = rawArgs.map((a) => isString(a) ? a.trim() : a); } if (modifiers.number) { args = rawArgs.map(looseToNumber); } } let handlerName; let handler = props[handlerName = toHandlerKey(event)] || props[handlerName = toHandlerKey(camelize(event))]; if (!handler && isModelListener2) { handler = props[handlerName = toHandlerKey(hyphenate(event))]; } if (handler) { callWithAsyncErrorHandling( handler, instance, 6, args ); } const onceHandler = props[handlerName + `Once`]; if (onceHandler) { if (!instance.emitted) { instance.emitted = {}; } else if (instance.emitted[handlerName]) { return; } instance.emitted[handlerName] = true; callWithAsyncErrorHandling( onceHandler, instance, 6, args ); } } const mixinEmitsCache = new WeakMap(); function normalizeEmitsOptions(comp, appContext, asMixin = false) { const cache2 = asMixin ? mixinEmitsCache : appContext.emitsCache; const cached = cache2.get(comp); if (cached !== void 0) { return cached; } const raw = comp.emits; let normalized = {}; let hasExtends = false; if (!isFunction(comp)) { const extendEmits = (raw2) => { const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); if (normalizedFromExtend) { hasExtends = true; extend(normalized, normalizedFromExtend); } }; if (!asMixin && appContext.mixins.length) { appContext.mixins.forEach(extendEmits); } if (comp.extends) { extendEmits(comp.extends); } if (comp.mixins) { comp.mixins.forEach(extendEmits); } } if (!raw && !hasExtends) { if (isObject(comp)) { cache2.set(comp, null); } return null; } if (isArray(raw)) { raw.forEach((key) => normalized[key] = null); } else { extend(normalized, raw); } if (isObject(comp)) { cache2.set(comp, normalized); } return normalized; } function isEmitListener(options, key) { if (!options || !isOn(key)) { return false; } key = key.slice(2).replace(/Once$/, ""); return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); } function markAttrsAccessed() { } function renderComponentRoot(instance) { const { type: Component, vnode, proxy, withProxy, propsOptions: [propsOptions], slots, attrs, emit: emit2, render: render2, renderCache, props, data, setupState, ctx, inheritAttrs } = instance; const prev = setCurrentRenderingInstance(instance); let result; let fallthroughAttrs; try { if (vnode.shapeFlag & 4) { const proxyToUse = withProxy || proxy; const thisProxy = false ? new Proxy(proxyToUse, { get(target, key, receiver) { warn$1( `Property '${String( key )}' was accessed via 'this'. Avoid using 'this' in templates.` ); return Reflect.get(target, key, receiver); } }) : proxyToUse; result = normalizeVNode( render2.call( thisProxy, proxyToUse, renderCache, false ? shallowReadonly(props) : props, setupState, data, ctx ) ); fallthroughAttrs = attrs; } else { const render22 = Component; if (false) ; result = normalizeVNode( render22.length > 1 ? render22( false ? shallowReadonly(props) : props, false ? { get attrs() { markAttrsAccessed(); return shallowReadonly(attrs); }, slots, emit: emit2 } : { attrs, slots, emit: emit2 } ) : render22( false ? shallowReadonly(props) : props, null ) ); fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); } } catch (err) { blockStack.length = 0; handleError(err, instance, 1); result = createVNode(Comment); } let root = result; if (fallthroughAttrs && inheritAttrs !== false) { const keys = Object.keys(fallthroughAttrs); const { shapeFlag } = root; if (keys.length) { if (shapeFlag & (1 | 6)) { if (propsOptions && keys.some(isModelListener)) { fallthroughAttrs = filterModelListeners( fallthroughAttrs, propsOptions ); } root = cloneVNode(root, fallthroughAttrs, false, true); } } } if (vnode.dirs) { root = cloneVNode(root, null, false, true); root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; } if (vnode.transition) { setTransitionHooks(root, vnode.transition); } { result = root; } setCurrentRenderingInstance(prev); return result; } const getFunctionalFallthrough = (attrs) => { let res; for (const key in attrs) { if (key === "class" || key === "style" || isOn(key)) { (res || (res = {}))[key] = attrs[key]; } } return res; }; const filterModelListeners = (attrs, props) => { const res = {}; for (const key in attrs) { if (!isModelListener(key) || !(key.slice(9) in props)) { res[key] = attrs[key]; } } return res; }; function shouldUpdateComponent(prevVNode, nextVNode, optimized) { const { props: prevProps, children: prevChildren, component } = prevVNode; const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; const emits = component.emitsOptions; if (nextVNode.dirs || nextVNode.transition) { return true; } if (optimized && patchFlag >= 0) { if (patchFlag & 1024) { return true; } if (patchFlag & 16) { if (!prevProps) { return !!nextProps; } return hasPropsChanged(prevProps, nextProps, emits); } else if (patchFlag & 8) { const dynamicProps = nextVNode.dynamicProps; for (let i = 0; i < dynamicProps.length; i++) { const key = dynamicProps[i]; if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emits, key)) { return true; } } } } else { if (prevChildren || nextChildren) { if (!nextChildren || !nextChildren.$stable) { return true; } } if (prevProps === nextProps) { return false; } if (!prevProps) { return !!nextProps; } if (!nextProps) { return true; } return hasPropsChanged(prevProps, nextProps, emits); } return false; } function hasPropsChanged(prevProps, nextProps, emitsOptions) { const nextKeys = Object.keys(nextProps); if (nextKeys.length !== Object.keys(prevProps).length) { return true; } for (let i = 0; i < nextKeys.length; i++) { const key = nextKeys[i]; if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key)) { return true; } } return false; } function hasPropValueChanged(nextProps, prevProps, key) { const nextProp = nextProps[key]; const prevProp = prevProps[key]; if (key === "style" && isObject(nextProp) && isObject(prevProp)) { return !looseEqual(nextProp, prevProp); } return nextProp !== prevProp; } function updateHOCHostEl({ vnode, parent }, el) { while (parent) { const root = parent.subTree; if (root.suspense && root.suspense.activeBranch === vnode) { root.el = vnode.el; } if (root === vnode) { (vnode = parent.vnode).el = el; parent = parent.parent; } else { break; } } } const internalObjectProto = {}; const createInternalObject = () => Object.create(internalObjectProto); const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto; function initProps(instance, rawProps, isStateful, isSSR = false) { const props = {}; const attrs = createInternalObject(); instance.propsDefaults = Object.create(null); setFullProps(instance, rawProps, props, attrs); for (const key in instance.propsOptions[0]) { if (!(key in props)) { props[key] = void 0; } } if (isStateful) { instance.props = isSSR ? props : shallowReactive(props); } else { if (!instance.type.props) { instance.props = attrs; } else { instance.props = props; } } instance.attrs = attrs; } function updateProps(instance, rawProps, rawPrevProps, optimized) { const { props, attrs, vnode: { patchFlag } } = instance; const rawCurrentProps = toRaw(props); const [options] = instance.propsOptions; let hasAttrsChanged = false; if ( (optimized || patchFlag > 0) && !(patchFlag & 16) ) { if (patchFlag & 8) { const propsToUpdate = instance.vnode.dynamicProps; for (let i = 0; i < propsToUpdate.length; i++) { let key = propsToUpdate[i]; if (isEmitListener(instance.emitsOptions, key)) { continue; } const value = rawProps[key]; if (options) { if (hasOwn(attrs, key)) { if (value !== attrs[key]) { attrs[key] = value; hasAttrsChanged = true; } } else { const camelizedKey = camelize(key); props[camelizedKey] = resolvePropValue( options, rawCurrentProps, camelizedKey, value, instance, false ); } } else { if (value !== attrs[key]) { attrs[key] = value; hasAttrsChanged = true; } } } } } else { if (setFullProps(instance, rawProps, props, attrs)) { hasAttrsChanged = true; } let kebabKey; for (const key in rawCurrentProps) { if (!rawProps || !hasOwn(rawProps, key) && ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) { if (options) { if (rawPrevProps && (rawPrevProps[key] !== void 0 || rawPrevProps[kebabKey] !== void 0)) { props[key] = resolvePropValue( options, rawCurrentProps, key, void 0, instance, true ); } } else { delete props[key]; } } } if (attrs !== rawCurrentProps) { for (const key in attrs) { if (!rawProps || !hasOwn(rawProps, key) && true) { delete attrs[key]; hasAttrsChanged = true; } } } } if (hasAttrsChanged) { trigger(instance.attrs, "set", ""); } } function setFullProps(instance, rawProps, props, attrs) { const [options, needCastKeys] = instance.propsOptions; let hasAttrsChanged = false; let rawCastValues; if (rawProps) { for (let key in rawProps) { if (isReservedProp(key)) { continue; } const value = rawProps[key]; let camelKey; if (options && hasOwn(options, camelKey = camelize(key))) { if (!needCastKeys || !needCastKeys.includes(camelKey)) { props[camelKey] = value; } else { (rawCastValues || (rawCastValues = {}))[camelKey] = value; } } else if (!isEmitListener(instance.emitsOptions, key)) { if (!(key in attrs) || value !== attrs[key]) { attrs[key] = value; hasAttrsChanged = true; } } } } if (needCastKeys) { const rawCurrentProps = toRaw(props); const castValues = rawCastValues || EMPTY_OBJ; for (let i = 0; i < needCastKeys.length; i++) { const key = needCastKeys[i]; props[key] = resolvePropValue( options, rawCurrentProps, key, castValues[key], instance, !hasOwn(castValues, key) ); } } return hasAttrsChanged; } function resolvePropValue(options, props, key, value, instance, isAbsent) { const opt = options[key]; if (opt != null) { const hasDefault = hasOwn(opt, "default"); if (hasDefault && value === void 0) { const defaultValue = opt.default; if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) { const { propsDefaults } = instance; if (key in propsDefaults) { value = propsDefaults[key]; } else { const reset = setCurrentInstance(instance); value = propsDefaults[key] = defaultValue.call( null, props ); reset(); } } else { value = defaultValue; } if (instance.ce) { instance.ce._setProp(key, value); } } if (opt[ 0 ]) { if (isAbsent && !hasDefault) { value = false; } else if (opt[ 1 ] && (value === "" || value === hyphenate(key))) { value = true; } } } return value; } const mixinPropsCache = new WeakMap(); function normalizePropsOptions(comp, appContext, asMixin = false) { const cache2 = asMixin ? mixinPropsCache : appContext.propsCache; const cached = cache2.get(comp); if (cached) { return cached; } const raw = comp.props; const normalized = {}; const needCastKeys = []; let hasExtends = false; if (!isFunction(comp)) { const extendProps = (raw2) => { hasExtends = true; const [props, keys] = normalizePropsOptions(raw2, appContext, true); extend(normalized, props); if (keys) needCastKeys.push(...keys); }; if (!asMixin && appContext.mixins.length) { appContext.mixins.forEach(extendProps); } if (comp.extends) { extendProps(comp.extends); } if (comp.mixins) { comp.mixins.forEach(extendProps); } } if (!raw && !hasExtends) { if (isObject(comp)) { cache2.set(comp, EMPTY_ARR); } return EMPTY_ARR; } if (isArray(raw)) { for (let i = 0; i < raw.length; i++) { const normalizedKey = camelize(raw[i]); if (validatePropName(normalizedKey)) { normalized[normalizedKey] = EMPTY_OBJ; } } } else if (raw) { for (const key in raw) { const normalizedKey = camelize(key); if (validatePropName(normalizedKey)) { const opt = raw[key]; const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt); const propType = prop.type; let shouldCast = false; let shouldCastTrue = true; if (isArray(propType)) { for (let index = 0; index < propType.length; ++index) { const type = propType[index]; const typeName = isFunction(type) && type.name; if (typeName === "Boolean") { shouldCast = true; break; } else if (typeName === "String") { shouldCastTrue = false; } } } else { shouldCast = isFunction(propType) && propType.name === "Boolean"; } prop[ 0 ] = shouldCast; prop[ 1 ] = shouldCastTrue; if (shouldCast || hasOwn(prop, "default")) { needCastKeys.push(normalizedKey); } } } } const res = [normalized, needCastKeys]; if (isObject(comp)) { cache2.set(comp, res); } return res; } function validatePropName(key) { if (key[0] !== "$" && !isReservedProp(key)) { return true; } return false; } const isInternalKey = (key) => key === "_" || key === "_ctx" || key === "$stable"; const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; const normalizeSlot = (key, rawSlot, ctx) => { if (rawSlot._n) { return rawSlot; } const normalized = withCtx((...args) => { if (false) ; return normalizeSlotValue(rawSlot(...args)); }, ctx); normalized._c = false; return normalized; }; const normalizeObjectSlots = (rawSlots, slots, instance) => { const ctx = rawSlots._ctx; for (const key in rawSlots) { if (isInternalKey(key)) continue; const value = rawSlots[key]; if (isFunction(value)) { slots[key] = normalizeSlot(key, value, ctx); } else if (value != null) { const normalized = normalizeSlotValue(value); slots[key] = () => normalized; } } }; const normalizeVNodeSlots = (instance, children) => { const normalized = normalizeSlotValue(children); instance.slots.default = () => normalized; }; const assignSlots = (slots, children, optimized) => { for (const key in children) { if (optimized || !isInternalKey(key)) { slots[key] = children[key]; } } }; const initSlots = (instance, children, optimized) => { const slots = instance.slots = createInternalObject(); if (instance.vnode.shapeFlag & 32) { const type = children._; if (type) { assignSlots(slots, children, optimized); if (optimized) { def(slots, "_", type, true); } } else { normalizeObjectSlots(children, slots); } } else if (children) { normalizeVNodeSlots(instance, children); } }; const updateSlots = (instance, children, optimized) => { const { vnode, slots } = instance; let needDeletionCheck = true; let deletionComparisonTarget = EMPTY_OBJ; if (vnode.shapeFlag & 32) { const type = children._; if (type) { if (optimized && type === 1) { needDeletionCheck = false; } else { assignSlots(slots, children, optimized); } } else { needDeletionCheck = !children.$stable; normalizeObjectSlots(children, slots); } deletionComparisonTarget = children; } else if (children) { normalizeVNodeSlots(instance, children); deletionComparisonTarget = { default: 1 }; } if (needDeletionCheck) { for (const key in slots) { if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { delete slots[key]; } } } }; const queuePostRenderEffect = queueEffectWithSuspense; function createRenderer(options) { return baseCreateRenderer(options); } function baseCreateRenderer(options, createHydrationFns) { const target = getGlobalThis(); target.__VUE__ = true; const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, insertStaticContent: hostInsertStaticContent } = options; const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => { if (n1 === n2) { return; } if (n1 && !isSameVNodeType(n1, n2)) { anchor = getNextHostNode(n1); unmount(n1, parentComponent, parentSuspense, true); n1 = null; } if (n2.patchFlag === -2) { optimized = false; n2.dynamicChildren = null; } const { type, ref: ref3, shapeFlag } = n2; switch (type) { case Text: processText(n1, n2, container, anchor); break; case Comment: processCommentNode(n1, n2, container, anchor); break; case Static: if (n1 == null) { mountStaticNode(n2, container, anchor, namespace); } break; case Fragment: processFragment( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); break; default: if (shapeFlag & 1) { processElement( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else if (shapeFlag & 6) { processComponent( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else if (shapeFlag & 64) { type.process( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals ); } else if (shapeFlag & 128) { type.process( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals ); } else ; } if (ref3 != null && parentComponent) { setRef(ref3, n1 && n1.ref, parentSuspense, n2 || n1, !n2); } else if (ref3 == null && n1 && n1.ref != null) { setRef(n1.ref, null, parentSuspense, n1, true); } }; const processText = (n1, n2, container, anchor) => { if (n1 == null) { hostInsert( n2.el = hostCreateText(n2.children), container, anchor ); } else { const el = n2.el = n1.el; if (n2.children !== n1.children) { hostSetText(el, n2.children); } } }; const processCommentNode = (n1, n2, container, anchor) => { if (n1 == null) { hostInsert( n2.el = hostCreateComment(n2.children || ""), container, anchor ); } else { n2.el = n1.el; } }; const mountStaticNode = (n2, container, anchor, namespace) => { [n2.el, n2.anchor] = hostInsertStaticContent( n2.children, container, anchor, namespace, n2.el, n2.anchor ); }; const moveStaticNode = ({ el, anchor }, container, nextSibling) => { let next; while (el && el !== anchor) { next = hostNextSibling(el); hostInsert(el, container, nextSibling); el = next; } hostInsert(anchor, container, nextSibling); }; const removeStaticNode = ({ el, anchor }) => { let next; while (el && el !== anchor) { next = hostNextSibling(el); hostRemove(el); el = next; } hostRemove(anchor); }; const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { if (n2.type === "svg") { namespace = "svg"; } else if (n2.type === "math") { namespace = "mathml"; } if (n1 == null) { mountElement( n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { const customElement = n1.el && n1.el._isVueCE ? n1.el : null; try { if (customElement) { customElement._beginPatch(); } patchElement( n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } finally { if (customElement) { customElement._endPatch(); } } } }; const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { let el; let vnodeHook; const { props, shapeFlag, transition, dirs } = vnode; el = vnode.el = hostCreateElement( vnode.type, namespace, props && props.is, props ); if (shapeFlag & 8) { hostSetElementText(el, vnode.children); } else if (shapeFlag & 16) { mountChildren( vnode.children, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(vnode, namespace), slotScopeIds, optimized ); } if (dirs) { invokeDirectiveHook(vnode, null, parentComponent, "created"); } setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); if (props) { for (const key in props) { if (key !== "value" && !isReservedProp(key)) { hostPatchProp(el, key, null, props[key], namespace, parentComponent); } } if ("value" in props) { hostPatchProp(el, "value", null, props.value, namespace); } if (vnodeHook = props.onVnodeBeforeMount) { invokeVNodeHook(vnodeHook, parentComponent, vnode); } } if (dirs) { invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); } const needCallTransitionHooks = needTransition(parentSuspense, transition); if (needCallTransitionHooks) { transition.beforeEnter(el); } hostInsert(el, container, anchor); if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { queuePostRenderEffect(() => { vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); needCallTransitionHooks && transition.enter(el); dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); }, parentSuspense); } }; const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { if (scopeId) { hostSetScopeId(el, scopeId); } if (slotScopeIds) { for (let i = 0; i < slotScopeIds.length; i++) { hostSetScopeId(el, slotScopeIds[i]); } } if (parentComponent) { let subTree = parentComponent.subTree; if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) { const parentVNode = parentComponent.vnode; setScopeId( el, parentVNode, parentVNode.scopeId, parentVNode.slotScopeIds, parentComponent.parent ); } } }; const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => { for (let i = start; i < children.length; i++) { const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); patch( null, child, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } }; const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { const el = n2.el = n1.el; let { patchFlag, dynamicChildren, dirs } = n2; patchFlag |= n1.patchFlag & 16; const oldProps = n1.props || EMPTY_OBJ; const newProps = n2.props || EMPTY_OBJ; let vnodeHook; parentComponent && toggleRecurse(parentComponent, false); if (vnodeHook = newProps.onVnodeBeforeUpdate) { invokeVNodeHook(vnodeHook, parentComponent, n2, n1); } if (dirs) { invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); } parentComponent && toggleRecurse(parentComponent, true); if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) { hostSetElementText(el, ""); } if (dynamicChildren) { patchBlockChildren( n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds ); } else if (!optimized) { patchChildren( n1, n2, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds, false ); } if (patchFlag > 0) { if (patchFlag & 16) { patchProps(el, oldProps, newProps, parentComponent, namespace); } else { if (patchFlag & 2) { if (oldProps.class !== newProps.class) { hostPatchProp(el, "class", null, newProps.class, namespace); } } if (patchFlag & 4) { hostPatchProp(el, "style", oldProps.style, newProps.style, namespace); } if (patchFlag & 8) { const propsToUpdate = n2.dynamicProps; for (let i = 0; i < propsToUpdate.length; i++) { const key = propsToUpdate[i]; const prev = oldProps[key]; const next = newProps[key]; if (next !== prev || key === "value") { hostPatchProp(el, key, prev, next, namespace, parentComponent); } } } } if (patchFlag & 1) { if (n1.children !== n2.children) { hostSetElementText(el, n2.children); } } } else if (!optimized && dynamicChildren == null) { patchProps(el, oldProps, newProps, parentComponent, namespace); } if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { queuePostRenderEffect(() => { vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); }, parentSuspense); } }; const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => { for (let i = 0; i < newChildren.length; i++) { const oldVNode = oldChildren[i]; const newVNode = newChildren[i]; const container = ( oldVNode.el && (oldVNode.type === Fragment || !isSameVNodeType(oldVNode, newVNode) || oldVNode.shapeFlag & (6 | 64 | 128)) ? hostParentNode(oldVNode.el) : ( fallbackContainer ) ); patch( oldVNode, newVNode, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, true ); } }; const patchProps = (el, oldProps, newProps, parentComponent, namespace) => { if (oldProps !== newProps) { if (oldProps !== EMPTY_OBJ) { for (const key in oldProps) { if (!isReservedProp(key) && !(key in newProps)) { hostPatchProp( el, key, oldProps[key], null, namespace, parentComponent ); } } } for (const key in newProps) { if (isReservedProp(key)) continue; const next = newProps[key]; const prev = oldProps[key]; if (next !== prev && key !== "value") { hostPatchProp(el, key, prev, next, namespace, parentComponent); } } if ("value" in newProps) { hostPatchProp(el, "value", oldProps.value, newProps.value, namespace); } } }; const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; if (fragmentSlotScopeIds) { slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; } if (n1 == null) { hostInsert(fragmentStartAnchor, container, anchor); hostInsert(fragmentEndAnchor, container, anchor); mountChildren( n2.children || [], container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && n1.dynamicChildren && n1.dynamicChildren.length === dynamicChildren.length) { patchBlockChildren( n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, namespace, slotScopeIds ); if ( n2.key != null || parentComponent && n2 === parentComponent.subTree ) { traverseStaticChildren( n1, n2, true ); } } else { patchChildren( n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } } }; const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { n2.slotScopeIds = slotScopeIds; if (n1 == null) { if (n2.shapeFlag & 512) { parentComponent.ctx.activate( n2, container, anchor, namespace, optimized ); } else { mountComponent( n2, container, anchor, parentComponent, parentSuspense, namespace, optimized ); } } else { updateComponent(n1, n2, optimized); } }; const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => { const instance = initialVNode.component = createComponentInstance( initialVNode, parentComponent, parentSuspense ); if (isKeepAlive(initialVNode)) { instance.ctx.renderer = internals; } { setupComponent(instance, false, optimized); } if (instance.asyncDep) { parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized); if (!initialVNode.el) { const placeholder = instance.subTree = createVNode(Comment); processCommentNode(null, placeholder, container, anchor); initialVNode.placeholder = placeholder.el; } } else { setupRenderEffect( instance, initialVNode, container, anchor, parentSuspense, namespace, optimized ); } }; const updateComponent = (n1, n2, optimized) => { const instance = n2.component = n1.component; if (shouldUpdateComponent(n1, n2, optimized)) { if (instance.asyncDep && !instance.asyncResolved) { updateComponentPreRender(instance, n2, optimized); return; } else { instance.next = n2; instance.update(); } } else { n2.el = n1.el; instance.vnode = n2; } }; const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => { const componentUpdateFn = () => { if (!instance.isMounted) { let vnodeHook; const { el, props } = initialVNode; const { bm, m, parent, root, type } = instance; const isAsyncWrapperVNode = isAsyncWrapper(initialVNode); toggleRecurse(instance, false); if (bm) { invokeArrayFns(bm); } if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) { invokeVNodeHook(vnodeHook, parent, initialVNode); } toggleRecurse(instance, true); { if (root.ce && root.ce._hasShadowRoot()) { root.ce._injectChildStyle(type); } const subTree = instance.subTree = renderComponentRoot(instance); patch( null, subTree, container, anchor, instance, parentSuspense, namespace ); initialVNode.el = subTree.el; } if (m) { queuePostRenderEffect(m, parentSuspense); } if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) { const scopedInitialVNode = initialVNode; queuePostRenderEffect( () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), parentSuspense ); } if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) { instance.a && queuePostRenderEffect(instance.a, parentSuspense); } instance.isMounted = true; initialVNode = container = anchor = null; } else { let { next, bu, u, parent, vnode } = instance; { const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance); if (nonHydratedAsyncRoot) { if (next) { next.el = vnode.el; updateComponentPreRender(instance, next, optimized); } nonHydratedAsyncRoot.asyncDep.then(() => { queuePostRenderEffect(() => { if (!instance.isUnmounted) update(); }, parentSuspense); }); return; } } let originNext = next; let vnodeHook; toggleRecurse(instance, false); if (next) { next.el = vnode.el; updateComponentPreRender(instance, next, optimized); } else { next = vnode; } if (bu) { invokeArrayFns(bu); } if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) { invokeVNodeHook(vnodeHook, parent, next, vnode); } toggleRecurse(instance, true); const nextTree = renderComponentRoot(instance); const prevTree = instance.subTree; instance.subTree = nextTree; patch( prevTree, nextTree, hostParentNode(prevTree.el), getNextHostNode(prevTree), instance, parentSuspense, namespace ); next.el = nextTree.el; if (originNext === null) { updateHOCHostEl(instance, nextTree.el); } if (u) { queuePostRenderEffect(u, parentSuspense); } if (vnodeHook = next.props && next.props.onVnodeUpdated) { queuePostRenderEffect( () => invokeVNodeHook(vnodeHook, parent, next, vnode), parentSuspense ); } } }; instance.scope.on(); const effect2 = instance.effect = new ReactiveEffect(componentUpdateFn); instance.scope.off(); const update = instance.update = effect2.run.bind(effect2); const job = instance.job = effect2.runIfDirty.bind(effect2); job.i = instance; job.id = instance.uid; effect2.scheduler = () => queueJob(job); toggleRecurse(instance, true); update(); }; const updateComponentPreRender = (instance, nextVNode, optimized) => { nextVNode.component = instance; const prevProps = instance.vnode.props; instance.vnode = nextVNode; instance.next = null; updateProps(instance, nextVNode.props, prevProps, optimized); updateSlots(instance, nextVNode.children, optimized); pauseTracking(); flushPreFlushCbs(instance); resetTracking(); }; const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => { const c1 = n1 && n1.children; const prevShapeFlag = n1 ? n1.shapeFlag : 0; const c2 = n2.children; const { patchFlag, shapeFlag } = n2; if (patchFlag > 0) { if (patchFlag & 128) { patchKeyedChildren( c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); return; } else if (patchFlag & 256) { patchUnkeyedChildren( c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); return; } } if (shapeFlag & 8) { if (prevShapeFlag & 16) { unmountChildren(c1, parentComponent, parentSuspense); } if (c2 !== c1) { hostSetElementText(container, c2); } } else { if (prevShapeFlag & 16) { if (shapeFlag & 16) { patchKeyedChildren( c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { unmountChildren(c1, parentComponent, parentSuspense, true); } } else { if (prevShapeFlag & 8) { hostSetElementText(container, ""); } if (shapeFlag & 16) { mountChildren( c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } } } }; const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { c1 = c1 || EMPTY_ARR; c2 = c2 || EMPTY_ARR; const oldLength = c1.length; const newLength = c2.length; const commonLength = Math.min(oldLength, newLength); let i; for (i = 0; i < commonLength; i++) { const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); patch( c1[i], nextChild, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } if (oldLength > newLength) { unmountChildren( c1, parentComponent, parentSuspense, true, false, commonLength ); } else { mountChildren( c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, commonLength ); } }; const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { let i = 0; const l2 = c2.length; let e1 = c1.length - 1; let e2 = l2 - 1; while (i <= e1 && i <= e2) { const n1 = c1[i]; const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); if (isSameVNodeType(n1, n2)) { patch( n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { break; } i++; } while (i <= e1 && i <= e2) { const n1 = c1[e1]; const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]); if (isSameVNodeType(n1, n2)) { patch( n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { break; } e1--; e2--; } if (i > e1) { if (i <= e2) { const nextPos = e2 + 1; const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor; while (i <= e2) { patch( null, c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]), container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); i++; } } } else if (i > e2) { while (i <= e1) { unmount(c1[i], parentComponent, parentSuspense, true); i++; } } else { const s1 = i; const s2 = i; const keyToNewIndexMap = new Map(); for (i = s2; i <= e2; i++) { const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); if (nextChild.key != null) { keyToNewIndexMap.set(nextChild.key, i); } } let j; let patched = 0; const toBePatched = e2 - s2 + 1; let moved = false; let maxNewIndexSoFar = 0; const newIndexToOldIndexMap = new Array(toBePatched); for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0; for (i = s1; i <= e1; i++) { const prevChild = c1[i]; if (patched >= toBePatched) { unmount(prevChild, parentComponent, parentSuspense, true); continue; } let newIndex; if (prevChild.key != null) { newIndex = keyToNewIndexMap.get(prevChild.key); } else { for (j = s2; j <= e2; j++) { if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) { newIndex = j; break; } } } if (newIndex === void 0) { unmount(prevChild, parentComponent, parentSuspense, true); } else { newIndexToOldIndexMap[newIndex - s2] = i + 1; if (newIndex >= maxNewIndexSoFar) { maxNewIndexSoFar = newIndex; } else { moved = true; } patch( prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); patched++; } } const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR; j = increasingNewIndexSequence.length - 1; for (i = toBePatched - 1; i >= 0; i--) { const nextIndex = s2 + i; const nextChild = c2[nextIndex]; const anchorVNode = c2[nextIndex + 1]; const anchor = nextIndex + 1 < l2 ? ( anchorVNode.el || resolveAsyncComponentPlaceholder(anchorVNode) ) : parentAnchor; if (newIndexToOldIndexMap[i] === 0) { patch( null, nextChild, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else if (moved) { if (j < 0 || i !== increasingNewIndexSequence[j]) { move(nextChild, container, anchor, 2); } else { j--; } } } } }; const move = (vnode, container, anchor, moveType, parentSuspense = null) => { const { el, type, transition, children, shapeFlag } = vnode; if (shapeFlag & 6) { move(vnode.component.subTree, container, anchor, moveType); return; } if (shapeFlag & 128) { vnode.suspense.move(container, anchor, moveType); return; } if (shapeFlag & 64) { type.move(vnode, container, anchor, internals); return; } if (type === Fragment) { hostInsert(el, container, anchor); for (let i = 0; i < children.length; i++) { move(children[i], container, anchor, moveType); } hostInsert(vnode.anchor, container, anchor); return; } if (type === Static) { moveStaticNode(vnode, container, anchor); return; } const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition; if (needTransition2) { if (moveType === 0) { transition.beforeEnter(el); hostInsert(el, container, anchor); queuePostRenderEffect(() => transition.enter(el), parentSuspense); } else { const { leave, delayLeave, afterLeave } = transition; const remove22 = () => { if (vnode.ctx.isUnmounted) { hostRemove(el); } else { hostInsert(el, container, anchor); } }; const performLeave = () => { if (el._isLeaving) { el[leaveCbKey]( true ); } leave(el, () => { remove22(); afterLeave && afterLeave(); }); }; if (delayLeave) { delayLeave(el, remove22, performLeave); } else { performLeave(); } } } else { hostInsert(el, container, anchor); } }; const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => { const { type, props, ref: ref3, children, dynamicChildren, shapeFlag, patchFlag, dirs, cacheIndex } = vnode; if (patchFlag === -2) { optimized = false; } if (ref3 != null) { pauseTracking(); setRef(ref3, null, parentSuspense, vnode, true); resetTracking(); } if (cacheIndex != null) { parentComponent.renderCache[cacheIndex] = void 0; } if (shapeFlag & 256) { parentComponent.ctx.deactivate(vnode); return; } const shouldInvokeDirs = shapeFlag & 1 && dirs; const shouldInvokeVnodeHook = !isAsyncWrapper(vnode); let vnodeHook; if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) { invokeVNodeHook(vnodeHook, parentComponent, vnode); } if (shapeFlag & 6) { unmountComponent(vnode.component, parentSuspense, doRemove); } else { if (shapeFlag & 128) { vnode.suspense.unmount(parentSuspense, doRemove); return; } if (shouldInvokeDirs) { invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount"); } if (shapeFlag & 64) { vnode.type.remove( vnode, parentComponent, parentSuspense, internals, doRemove ); } else if (dynamicChildren && !dynamicChildren.hasOnce && (type !== Fragment || patchFlag > 0 && patchFlag & 64)) { unmountChildren( dynamicChildren, parentComponent, parentSuspense, false, true ); } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) { unmountChildren(children, parentComponent, parentSuspense); } if (doRemove) { remove2(vnode); } } if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) { queuePostRenderEffect(() => { vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted"); }, parentSuspense); } }; const remove2 = (vnode) => { const { type, el, anchor, transition } = vnode; if (type === Fragment) { { removeFragment(el, anchor); } return; } if (type === Static) { removeStaticNode(vnode); return; } const performRemove = () => { hostRemove(el); if (transition && !transition.persisted && transition.afterLeave) { transition.afterLeave(); } }; if (vnode.shapeFlag & 1 && transition && !transition.persisted) { const { leave, delayLeave } = transition; const performLeave = () => leave(el, performRemove); if (delayLeave) { delayLeave(vnode.el, performRemove, performLeave); } else { performLeave(); } } else { performRemove(); } }; const removeFragment = (cur, end) => { let next; while (cur !== end) { next = hostNextSibling(cur); hostRemove(cur); cur = next; } hostRemove(end); }; const unmountComponent = (instance, parentSuspense, doRemove) => { const { bum, scope, job, subTree, um, m, a } = instance; invalidateMount(m); invalidateMount(a); if (bum) { invokeArrayFns(bum); } scope.stop(); if (job) { job.flags |= 8; unmount(subTree, instance, parentSuspense, doRemove); } if (um) { queuePostRenderEffect(um, parentSuspense); } queuePostRenderEffect(() => { instance.isUnmounted = true; }, parentSuspense); }; const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => { for (let i = start; i < children.length; i++) { unmount(children[i], parentComponent, parentSuspense, doRemove, optimized); } }; const getNextHostNode = (vnode) => { if (vnode.shapeFlag & 6) { return getNextHostNode(vnode.component.subTree); } if (vnode.shapeFlag & 128) { return vnode.suspense.next(); } const el = hostNextSibling(vnode.anchor || vnode.el); const teleportEnd = el && el[TeleportEndKey]; return teleportEnd ? hostNextSibling(teleportEnd) : el; }; let isFlushing = false; const render2 = (vnode, container, namespace) => { let instance; if (vnode == null) { if (container._vnode) { unmount(container._vnode, null, null, true); instance = container._vnode.component; } } else { patch( container._vnode || null, vnode, container, null, null, null, namespace ); } container._vnode = vnode; if (!isFlushing) { isFlushing = true; flushPreFlushCbs(instance); flushPostFlushCbs(); isFlushing = false; } }; const internals = { p: patch, um: unmount, m: move, r: remove2, mt: mountComponent, mc: mountChildren, pc: patchChildren, pbc: patchBlockChildren, n: getNextHostNode, o: options }; let hydrate; return { render: render2, hydrate, createApp: createAppAPI(render2) }; } function resolveChildrenNamespace({ type, props }, currentNamespace) { return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace; } function toggleRecurse({ effect: effect2, job }, allowed) { if (allowed) { effect2.flags |= 32; job.flags |= 4; } else { effect2.flags &= -33; job.flags &= -5; } } function needTransition(parentSuspense, transition) { return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted; } function traverseStaticChildren(n1, n2, shallow = false) { const ch1 = n1.children; const ch2 = n2.children; if (isArray(ch1) && isArray(ch2)) { for (let i = 0; i < ch1.length; i++) { const c1 = ch1[i]; let c2 = ch2[i]; if (c2.shapeFlag & 1 && !c2.dynamicChildren) { if (c2.patchFlag <= 0 || c2.patchFlag === 32) { c2 = ch2[i] = cloneIfMounted(ch2[i]); c2.el = c1.el; } if (!shallow && c2.patchFlag !== -2) traverseStaticChildren(c1, c2); } if (c2.type === Text) { if (c2.patchFlag === -1) { c2 = ch2[i] = cloneIfMounted(c2); } c2.el = c1.el; } if (c2.type === Comment && !c2.el) { c2.el = c1.el; } } } } function getSequence(arr) { const p2 = arr.slice(); const result = [0]; let i, j, u, v, c; const len = arr.length; for (i = 0; i < len; i++) { const arrI = arr[i]; if (arrI !== 0) { j = result[result.length - 1]; if (arr[j] < arrI) { p2[i] = j; result.push(i); continue; } u = 0; v = result.length - 1; while (u < v) { c = u + v >> 1; if (arr[result[c]] < arrI) { u = c + 1; } else { v = c; } } if (arrI < arr[result[u]]) { if (u > 0) { p2[i] = result[u - 1]; } result[u] = i; } } } u = result.length; v = result[u - 1]; while (u-- > 0) { result[u] = v; v = p2[v]; } return result; } function locateNonHydratedAsyncRoot(instance) { const subComponent = instance.subTree.component; if (subComponent) { if (subComponent.asyncDep && !subComponent.asyncResolved) { return subComponent; } else { return locateNonHydratedAsyncRoot(subComponent); } } } function invalidateMount(hooks) { if (hooks) { for (let i = 0; i < hooks.length; i++) hooks[i].flags |= 8; } } function resolveAsyncComponentPlaceholder(anchorVnode) { if (anchorVnode.placeholder) { return anchorVnode.placeholder; } const instance = anchorVnode.component; if (instance) { return resolveAsyncComponentPlaceholder(instance.subTree); } return null; } const isSuspense = (type) => type.__isSuspense; function queueEffectWithSuspense(fn, suspense) { if (suspense && suspense.pendingBranch) { if (isArray(fn)) { suspense.effects.push(...fn); } else { suspense.effects.push(fn); } } else { queuePostFlushCb(fn); } } const Fragment = Symbol.for("v-fgt"); const Text = Symbol.for("v-txt"); const Comment = Symbol.for("v-cmt"); const Static = Symbol.for("v-stc"); const blockStack = []; let currentBlock = null; function openBlock(disableTracking = false) { blockStack.push(currentBlock = disableTracking ? null : []); } function closeBlock() { blockStack.pop(); currentBlock = blockStack[blockStack.length - 1] || null; } let isBlockTreeEnabled = 1; function setBlockTracking(value, inVOnce = false) { isBlockTreeEnabled += value; if (value < 0 && currentBlock && inVOnce) { currentBlock.hasOnce = true; } } function setupBlock(vnode) { vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null; closeBlock(); if (isBlockTreeEnabled > 0 && currentBlock) { currentBlock.push(vnode); } return vnode; } function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) { return setupBlock( createBaseVNode( type, props, children, patchFlag, dynamicProps, shapeFlag, true ) ); } function createBlock(type, props, children, patchFlag, dynamicProps) { return setupBlock( createVNode( type, props, children, patchFlag, dynamicProps, true ) ); } function isVNode(value) { return value ? value.__v_isVNode === true : false; } function isSameVNodeType(n1, n2) { return n1.type === n2.type && n1.key === n2.key; } const normalizeKey = ({ key }) => key != null ? key : null; const normalizeRef = ({ ref: ref3, ref_key, ref_for }) => { if (typeof ref3 === "number") { ref3 = "" + ref3; } return ref3 != null ? isString(ref3) || isRef(ref3) || isFunction(ref3) ? { i: currentRenderingInstance, r: ref3, k: ref_key, f: !!ref_for } : ref3 : null; }; function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) { const vnode = { __v_isVNode: true, __v_skip: true, type, props, key: props && normalizeKey(props), ref: props && normalizeRef(props), scopeId: currentScopeId, slotScopeIds: null, children, component: null, suspense: null, ssContent: null, ssFallback: null, dirs: null, transition: null, el: null, anchor: null, target: null, targetStart: null, targetAnchor: null, staticCount: 0, shapeFlag, patchFlag, dynamicProps, dynamicChildren: null, appContext: null, ctx: currentRenderingInstance }; if (needFullChildrenNormalization) { normalizeChildren(vnode, children); if (shapeFlag & 128) { type.normalize(vnode); } } else if (children) { vnode.shapeFlag |= isString(children) ? 8 : 16; } if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock && (vnode.patchFlag > 0 || shapeFlag & 6) && vnode.patchFlag !== 32) { currentBlock.push(vnode); } return vnode; } const createVNode = _createVNode; function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) { if (!type || type === NULL_DYNAMIC_COMPONENT) { type = Comment; } if (isVNode(type)) { const cloned = cloneVNode( type, props, true ); if (children) { normalizeChildren(cloned, children); } if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) { if (cloned.shapeFlag & 6) { currentBlock[currentBlock.indexOf(type)] = cloned; } else { currentBlock.push(cloned); } } cloned.patchFlag = -2; return cloned; } if (isClassComponent(type)) { type = type.__vccOpts; } if (props) { props = guardReactiveProps(props); let { class: klass, style } = props; if (klass && !isString(klass)) { props.class = normalizeClass(klass); } if (isObject(style)) { if ( isProxy(style) && !isArray(style)) { style = extend({}, style); } props.style = normalizeStyle(style); } } const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0; return createBaseVNode( type, props, children, patchFlag, dynamicProps, shapeFlag, isBlockNode, true ); } function guardReactiveProps(props) { if (!props) return null; return isProxy(props) || isInternalObject(props) ? extend({}, props) : props; } function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) { const { props, ref: ref3, patchFlag, children, transition } = vnode; const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props; const cloned = { __v_isVNode: true, __v_skip: true, type: vnode.type, props: mergedProps, key: mergedProps && normalizeKey(mergedProps), ref: extraProps && extraProps.ref ? ( mergeRef && ref3 ? isArray(ref3) ? ref3.concat(normalizeRef(extraProps)) : [ref3, normalizeRef(extraProps)] : normalizeRef(extraProps) ) : ref3, scopeId: vnode.scopeId, slotScopeIds: vnode.slotScopeIds, children, target: vnode.target, targetStart: vnode.targetStart, targetAnchor: vnode.targetAnchor, staticCount: vnode.staticCount, shapeFlag: vnode.shapeFlag, patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag, dynamicProps: vnode.dynamicProps, dynamicChildren: vnode.dynamicChildren, appContext: vnode.appContext, dirs: vnode.dirs, transition, component: vnode.component, suspense: vnode.suspense, ssContent: vnode.ssContent && cloneVNode(vnode.ssContent), ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback), placeholder: vnode.placeholder, el: vnode.el, anchor: vnode.anchor, ctx: vnode.ctx, ce: vnode.ce }; if (transition && cloneTransition) { setTransitionHooks( cloned, transition.clone(cloned) ); } return cloned; } function createTextVNode(text = " ", flag = 0) { return createVNode(Text, null, text, flag); } function createCommentVNode(text = "", asBlock = false) { return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text); } function normalizeVNode(child) { if (child == null || typeof child === "boolean") { return createVNode(Comment); } else if (isArray(child)) { return createVNode( Fragment, null, child.slice() ); } else if (isVNode(child)) { return cloneIfMounted(child); } else { return createVNode(Text, null, String(child)); } } function cloneIfMounted(child) { return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child); } function normalizeChildren(vnode, children) { let type = 0; const { shapeFlag } = vnode; if (children == null) { children = null; } else if (isArray(children)) { type = 16; } else if (typeof children === "object") { if (shapeFlag & (1 | 64)) { const slot = children.default; if (slot) { slot._c && (slot._d = false); normalizeChildren(vnode, slot()); slot._c && (slot._d = true); } return; } else { type = 32; const slotFlag = children._; if (!slotFlag && !isInternalObject(children)) { children._ctx = currentRenderingInstance; } else if (slotFlag === 3 && currentRenderingInstance) { if (currentRenderingInstance.slots._ === 1) { children._ = 1; } else { children._ = 2; vnode.patchFlag |= 1024; } } } } else if (isFunction(children)) { children = { default: children, _ctx: currentRenderingInstance }; type = 32; } else { children = String(children); if (shapeFlag & 64) { type = 16; children = [createTextVNode(children)]; } else { type = 8; } } vnode.children = children; vnode.shapeFlag |= type; } function mergeProps(...args) { const ret = {}; for (let i = 0; i < args.length; i++) { const toMerge = args[i]; for (const key in toMerge) { if (key === "class") { if (ret.class !== toMerge.class) { ret.class = normalizeClass([ret.class, toMerge.class]); } } else if (key === "style") { ret.style = normalizeStyle([ret.style, toMerge.style]); } else if (isOn(key)) { const existing = ret[key]; const incoming = toMerge[key]; if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) { ret[key] = existing ? [].concat(existing, incoming) : incoming; } } else if (key !== "") { ret[key] = toMerge[key]; } } } return ret; } function invokeVNodeHook(hook, instance, vnode, prevVNode = null) { callWithAsyncErrorHandling(hook, instance, 7, [ vnode, prevVNode ]); } const emptyAppContext = createAppContext(); let uid = 0; function createComponentInstance(vnode, parent, suspense) { const type = vnode.type; const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext; const instance = { uid: uid++, vnode, type, parent, appContext, root: null, next: null, subTree: null, effect: null, update: null, job: null, scope: new EffectScope( true ), render: null, proxy: null, exposed: null, exposeProxy: null, withProxy: null, provides: parent ? parent.provides : Object.create(appContext.provides), ids: parent ? parent.ids : ["", 0, 0], accessCache: null, renderCache: [], components: null, directives: null, propsOptions: normalizePropsOptions(type, appContext), emitsOptions: normalizeEmitsOptions(type, appContext), emit: null, emitted: null, propsDefaults: EMPTY_OBJ, inheritAttrs: type.inheritAttrs, ctx: EMPTY_OBJ, data: EMPTY_OBJ, props: EMPTY_OBJ, attrs: EMPTY_OBJ, slots: EMPTY_OBJ, refs: EMPTY_OBJ, setupState: EMPTY_OBJ, setupContext: null, suspense, suspenseId: suspense ? suspense.pendingId : 0, asyncDep: null, asyncResolved: false, isMounted: false, isUnmounted: false, isDeactivated: false, bc: null, c: null, bm: null, m: null, bu: null, u: null, um: null, bum: null, da: null, a: null, rtg: null, rtc: null, ec: null, sp: null }; { instance.ctx = { _: instance }; } instance.root = parent ? parent.root : instance; instance.emit = emit.bind(null, instance); if (vnode.ce) { vnode.ce(instance); } return instance; } let currentInstance = null; const getCurrentInstance = () => currentInstance || currentRenderingInstance; let internalSetCurrentInstance; let setInSSRSetupState; { const g = getGlobalThis(); const registerGlobalSetter = (key, setter) => { let setters; if (!(setters = g[key])) setters = g[key] = []; setters.push(setter); return (v) => { if (setters.length > 1) setters.forEach((set) => set(v)); else setters[0](v); }; }; internalSetCurrentInstance = registerGlobalSetter( `__VUE_INSTANCE_SETTERS__`, (v) => currentInstance = v ); setInSSRSetupState = registerGlobalSetter( `__VUE_SSR_SETTERS__`, (v) => isInSSRComponentSetup = v ); } const setCurrentInstance = (instance) => { const prev = currentInstance; internalSetCurrentInstance(instance); instance.scope.on(); return () => { instance.scope.off(); internalSetCurrentInstance(prev); }; }; const unsetCurrentInstance = () => { currentInstance && currentInstance.scope.off(); internalSetCurrentInstance(null); }; function isStatefulComponent(instance) { return instance.vnode.shapeFlag & 4; } let isInSSRComponentSetup = false; function setupComponent(instance, isSSR = false, optimized = false) { isSSR && setInSSRSetupState(isSSR); const { props, children } = instance.vnode; const isStateful = isStatefulComponent(instance); initProps(instance, props, isStateful, isSSR); initSlots(instance, children, optimized || isSSR); const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0; isSSR && setInSSRSetupState(false); return setupResult; } function setupStatefulComponent(instance, isSSR) { const Component = instance.type; instance.accessCache = Object.create(null); instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers); const { setup } = Component; if (setup) { pauseTracking(); const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null; const reset = setCurrentInstance(instance); const setupResult = callWithErrorHandling( setup, instance, 0, [ instance.props, setupContext ] ); const isAsyncSetup = isPromise(setupResult); resetTracking(); reset(); if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) { markAsyncBoundary(instance); } if (isAsyncSetup) { setupResult.then(unsetCurrentInstance, unsetCurrentInstance); if (isSSR) { return setupResult.then((resolvedResult) => { handleSetupResult(instance, resolvedResult); }).catch((e) => { handleError(e, instance, 0); }); } else { instance.asyncDep = setupResult; } } else { handleSetupResult(instance, setupResult); } } else { finishComponentSetup(instance); } } function handleSetupResult(instance, setupResult, isSSR) { if (isFunction(setupResult)) { if (instance.type.__ssrInlineRender) { instance.ssrRender = setupResult; } else { instance.render = setupResult; } } else if (isObject(setupResult)) { instance.setupState = proxyRefs(setupResult); } else ; finishComponentSetup(instance); } function finishComponentSetup(instance, isSSR, skipOptions) { const Component = instance.type; if (!instance.render) { instance.render = Component.render || NOOP; } { const reset = setCurrentInstance(instance); pauseTracking(); try { applyOptions(instance); } finally { resetTracking(); reset(); } } } const attrsProxyHandlers = { get(target, key) { track(target, "get", ""); return target[key]; } }; function createSetupContext(instance) { const expose = (exposed) => { instance.exposed = exposed || {}; }; { return { attrs: new Proxy(instance.attrs, attrsProxyHandlers), slots: instance.slots, emit: instance.emit, expose }; } } function getComponentPublicInstance(instance) { if (instance.exposed) { return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), { get(target, key) { if (key in target) { return target[key]; } else if (key in publicPropertiesMap) { return publicPropertiesMap[key](instance); } }, has(target, key) { return key in target || key in publicPropertiesMap; } })); } else { return instance.proxy; } } const classifyRE = /(?:^|[-_])\w/g; const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); function getComponentName(Component, includeInferred = true) { return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; } function formatComponentName(instance, Component, isRoot = false) { let name = getComponentName(Component); if (!name && Component.__file) { const match = Component.__file.match(/([^/\\]+)\.\w+$/); if (match) { name = match[1]; } } if (!name && instance) { const inferFromRegistry = (registry) => { for (const key in registry) { if (registry[key] === Component) { return key; } } }; name = inferFromRegistry(instance.components) || instance.parent && inferFromRegistry( instance.parent.type.components ) || inferFromRegistry(instance.appContext.components); } return name ? classify(name) : isRoot ? `App` : `Anonymous`; } function isClassComponent(value) { return isFunction(value) && "__vccOpts" in value; } const computed = (getterOrOptions, debugOptions) => { const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup); return c; }; const version$1 = "3.5.28"; /** * @vue/runtime-dom v3.5.28 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ let policy = void 0; const tt = typeof window !== "undefined" && window.trustedTypes; if (tt) { try { policy = tt.createPolicy("vue", { createHTML: (val) => val }); } catch (e) { } } const unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val; const svgNS = "http://www.w3.org/2000/svg"; const mathmlNS = "http://www.w3.org/1998/Math/MathML"; const doc = typeof document !== "undefined" ? document : null; const templateContainer = doc && doc.createElement("template"); const nodeOps = { insert: (child, parent, anchor) => { parent.insertBefore(child, anchor || null); }, remove: (child) => { const parent = child.parentNode; if (parent) { parent.removeChild(child); } }, createElement: (tag, namespace, is, props) => { const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag); if (tag === "select" && props && props.multiple != null) { el.setAttribute("multiple", props.multiple); } return el; }, createText: (text) => doc.createTextNode(text), createComment: (text) => doc.createComment(text), setText: (node, text) => { node.nodeValue = text; }, setElementText: (el, text) => { el.textContent = text; }, parentNode: (node) => node.parentNode, nextSibling: (node) => node.nextSibling, querySelector: (selector) => doc.querySelector(selector), setScopeId(el, id) { el.setAttribute(id, ""); }, insertStaticContent(content, parent, anchor, namespace, start, end) { const before = anchor ? anchor.previousSibling : parent.lastChild; if (start && (start === end || start.nextSibling)) { while (true) { parent.insertBefore(start.cloneNode(true), anchor); if (start === end || !(start = start.nextSibling)) break; } } else { templateContainer.innerHTML = unsafeToTrustedHTML( namespace === "svg" ? `${content}` : namespace === "mathml" ? `${content}` : content ); const template = templateContainer.content; if (namespace === "svg" || namespace === "mathml") { const wrapper = template.firstChild; while (wrapper.firstChild) { template.appendChild(wrapper.firstChild); } template.removeChild(wrapper); } parent.insertBefore(template, anchor); } return [ before ? before.nextSibling : parent.firstChild, anchor ? anchor.previousSibling : parent.lastChild ]; } }; const vtcKey = Symbol("_vtc"); function patchClass(el, value, isSVG) { const transitionClasses = el[vtcKey]; if (transitionClasses) { value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" "); } if (value == null) { el.removeAttribute("class"); } else if (isSVG) { el.setAttribute("class", value); } else { el.className = value; } } const vShowOriginalDisplay = Symbol("_vod"); const vShowHidden = Symbol("_vsh"); const CSS_VAR_TEXT = Symbol(""); function useCssVars(getter) { const instance = getCurrentInstance(); if (!instance) { return; } const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => { Array.from( document.querySelectorAll(`[data-v-owner="${instance.uid}"]`) ).forEach((node) => setVarsOnNode(node, vars)); }; const setVars = () => { const vars = getter(instance.proxy); if (instance.ce) { setVarsOnNode(instance.ce, vars); } else { setVarsOnVNode(instance.subTree, vars); } updateTeleports(vars); }; onBeforeUpdate(() => { queuePostFlushCb(setVars); }); onMounted(() => { watch(setVars, NOOP, { flush: "post" }); const ob = new MutationObserver(setVars); ob.observe(instance.subTree.el.parentNode, { childList: true }); onUnmounted(() => ob.disconnect()); }); } function setVarsOnVNode(vnode, vars) { if (vnode.shapeFlag & 128) { const suspense = vnode.suspense; vnode = suspense.activeBranch; if (suspense.pendingBranch && !suspense.isHydrating) { suspense.effects.push(() => { setVarsOnVNode(suspense.activeBranch, vars); }); } } while (vnode.component) { vnode = vnode.component.subTree; } if (vnode.shapeFlag & 1 && vnode.el) { setVarsOnNode(vnode.el, vars); } else if (vnode.type === Fragment) { vnode.children.forEach((c) => setVarsOnVNode(c, vars)); } else if (vnode.type === Static) { let { el, anchor } = vnode; while (el) { setVarsOnNode(el, vars); if (el === anchor) break; el = el.nextSibling; } } } function setVarsOnNode(el, vars) { if (el.nodeType === 1) { const style = el.style; let cssText = ""; for (const key in vars) { const value = normalizeCssVarValue(vars[key]); style.setProperty(`--${key}`, value); cssText += `--${key}: ${value};`; } style[CSS_VAR_TEXT] = cssText; } } const displayRE = /(?:^|;)\s*display\s*:/; function patchStyle(el, prev, next) { const style = el.style; const isCssString = isString(next); let hasControlledDisplay = false; if (next && !isCssString) { if (prev) { if (!isString(prev)) { for (const key in prev) { if (next[key] == null) { setStyle(style, key, ""); } } } else { for (const prevStyle of prev.split(";")) { const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim(); if (next[key] == null) { setStyle(style, key, ""); } } } } for (const key in next) { if (key === "display") { hasControlledDisplay = true; } setStyle(style, key, next[key]); } } else { if (isCssString) { if (prev !== next) { const cssVarText = style[CSS_VAR_TEXT]; if (cssVarText) { next += ";" + cssVarText; } style.cssText = next; hasControlledDisplay = displayRE.test(next); } } else if (prev) { el.removeAttribute("style"); } } if (vShowOriginalDisplay in el) { el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : ""; if (el[vShowHidden]) { style.display = "none"; } } } const importantRE = /\s*!important$/; function setStyle(style, name, val) { if (isArray(val)) { val.forEach((v) => setStyle(style, name, v)); } else { if (val == null) val = ""; if (name.startsWith("--")) { style.setProperty(name, val); } else { const prefixed = autoPrefix(style, name); if (importantRE.test(val)) { style.setProperty( hyphenate(prefixed), val.replace(importantRE, ""), "important" ); } else { style[prefixed] = val; } } } } const prefixes = ["Webkit", "Moz", "ms"]; const prefixCache = {}; function autoPrefix(style, rawName) { const cached = prefixCache[rawName]; if (cached) { return cached; } let name = camelize(rawName); if (name !== "filter" && name in style) { return prefixCache[rawName] = name; } name = capitalize(name); for (let i = 0; i < prefixes.length; i++) { const prefixed = prefixes[i] + name; if (prefixed in style) { return prefixCache[rawName] = prefixed; } } return rawName; } const xlinkNS = "http://www.w3.org/1999/xlink"; function patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) { if (isSVG && key.startsWith("xlink:")) { if (value == null) { el.removeAttributeNS(xlinkNS, key.slice(6, key.length)); } else { el.setAttributeNS(xlinkNS, key, value); } } else { if (value == null || isBoolean && !includeBooleanAttr(value)) { el.removeAttribute(key); } else { el.setAttribute( key, isBoolean ? "" : isSymbol(value) ? String(value) : value ); } } } function patchDOMProp(el, key, value, parentComponent, attrName) { if (key === "innerHTML" || key === "textContent") { if (value != null) { el[key] = key === "innerHTML" ? unsafeToTrustedHTML(value) : value; } return; } const tag = el.tagName; if (key === "value" && tag !== "PROGRESS" && !tag.includes("-")) { const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value; const newValue = value == null ? ( el.type === "checkbox" ? "on" : "" ) : String(value); if (oldValue !== newValue || !("_value" in el)) { el.value = newValue; } if (value == null) { el.removeAttribute(key); } el._value = value; return; } let needRemove = false; if (value === "" || value == null) { const type = typeof el[key]; if (type === "boolean") { value = includeBooleanAttr(value); } else if (value == null && type === "string") { value = ""; needRemove = true; } else if (type === "number") { value = 0; needRemove = true; } } try { el[key] = value; } catch (e) { } needRemove && el.removeAttribute(attrName || key); } function addEventListener(el, event, handler, options) { el.addEventListener(event, handler, options); } function removeEventListener(el, event, handler, options) { el.removeEventListener(event, handler, options); } const veiKey = Symbol("_vei"); function patchEvent(el, rawName, prevValue, nextValue, instance = null) { const invokers = el[veiKey] || (el[veiKey] = {}); const existingInvoker = invokers[rawName]; if (nextValue && existingInvoker) { existingInvoker.value = nextValue; } else { const [name, options] = parseName(rawName); if (nextValue) { const invoker = invokers[rawName] = createInvoker( nextValue, instance ); addEventListener(el, name, invoker, options); } else if (existingInvoker) { removeEventListener(el, name, existingInvoker, options); invokers[rawName] = void 0; } } } const optionsModifierRE = /(?:Once|Passive|Capture)$/; function parseName(name) { let options; if (optionsModifierRE.test(name)) { options = {}; let m; while (m = name.match(optionsModifierRE)) { name = name.slice(0, name.length - m[0].length); options[m[0].toLowerCase()] = true; } } const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2)); return [event, options]; } let cachedNow = 0; const p = Promise.resolve(); const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now()); function createInvoker(initialValue, instance) { const invoker = (e) => { if (!e._vts) { e._vts = Date.now(); } else if (e._vts <= invoker.attached) { return; } callWithAsyncErrorHandling( patchStopImmediatePropagation(e, invoker.value), instance, 5, [e] ); }; invoker.value = initialValue; invoker.attached = getNow(); return invoker; } function patchStopImmediatePropagation(e, value) { if (isArray(value)) { const originalStop = e.stopImmediatePropagation; e.stopImmediatePropagation = () => { originalStop.call(e); e._stopped = true; }; return value.map( (fn) => (e2) => !e2._stopped && fn && fn(e2) ); } else { return value; } } const isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123; const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => { const isSVG = namespace === "svg"; if (key === "class") { patchClass(el, nextValue, isSVG); } else if (key === "style") { patchStyle(el, prevValue, nextValue); } else if (isOn(key)) { if (!isModelListener(key)) { patchEvent(el, key, prevValue, nextValue, parentComponent); } } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) { patchDOMProp(el, key, nextValue); if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) { patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value"); } } else if ( el._isVueCE && (/[A-Z]/.test(key) || !isString(nextValue)) ) { patchDOMProp(el, camelize(key), nextValue, parentComponent, key); } else { if (key === "true-value") { el._trueValue = nextValue; } else if (key === "false-value") { el._falseValue = nextValue; } patchAttr(el, key, nextValue, isSVG); } }; function shouldSetAsProp(el, key, value, isSVG) { if (isSVG) { if (key === "innerHTML" || key === "textContent") { return true; } if (key in el && isNativeOn(key) && isFunction(value)) { return true; } return false; } if (key === "spellcheck" || key === "draggable" || key === "translate" || key === "autocorrect") { return false; } if (key === "sandbox" && el.tagName === "IFRAME") { return false; } if (key === "form") { return false; } if (key === "list" && el.tagName === "INPUT") { return false; } if (key === "type" && el.tagName === "TEXTAREA") { return false; } if (key === "width" || key === "height") { const tag = el.tagName; if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") { return false; } } if (isNativeOn(key) && isString(value)) { return false; } return key in el; } const REMOVAL = {}; function defineCustomElement(options, extraOptions, _createApp) { let Comp = defineComponent(options, extraOptions); if (isPlainObject(Comp)) Comp = extend({}, Comp, extraOptions); class VueCustomElement extends VueElement { constructor(initialProps) { super(Comp, initialProps, _createApp); } } VueCustomElement.def = Comp; return VueCustomElement; } const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class { }; class VueElement extends BaseClass { constructor(_def, _props = {}, _createApp = createApp) { super(); this._def = _def; this._props = _props; this._createApp = _createApp; this._isVueCE = true; this._instance = null; this._app = null; this._nonce = this._def.nonce; this._connected = false; this._resolved = false; this._patching = false; this._dirty = false; this._numberProps = null; this._styleChildren = new WeakSet(); this._ob = null; if (this.shadowRoot && _createApp !== createApp) { this._root = this.shadowRoot; } else { if (_def.shadowRoot !== false) { this.attachShadow( extend({}, _def.shadowRootOptions, { mode: "open" }) ); this._root = this.shadowRoot; } else { this._root = this; } } } connectedCallback() { if (!this.isConnected) return; if (!this.shadowRoot && !this._resolved) { this._parseSlots(); } this._connected = true; let parent = this; while (parent = parent && (parent.parentNode || parent.host)) { if (parent instanceof VueElement) { this._parent = parent; break; } } if (!this._instance) { if (this._resolved) { this._mount(this._def); } else { if (parent && parent._pendingResolve) { this._pendingResolve = parent._pendingResolve.then(() => { this._pendingResolve = void 0; this._resolveDef(); }); } else { this._resolveDef(); } } } } _setParent(parent = this._parent) { if (parent) { this._instance.parent = parent._instance; this._inheritParentContext(parent); } } _inheritParentContext(parent = this._parent) { if (parent && this._app) { Object.setPrototypeOf( this._app._context.provides, parent._instance.provides ); } } disconnectedCallback() { this._connected = false; nextTick(() => { if (!this._connected) { if (this._ob) { this._ob.disconnect(); this._ob = null; } this._app && this._app.unmount(); if (this._instance) this._instance.ce = void 0; this._app = this._instance = null; if (this._teleportTargets) { this._teleportTargets.clear(); this._teleportTargets = void 0; } } }); } _processMutations(mutations) { for (const m of mutations) { this._setAttr(m.attributeName); } } _resolveDef() { if (this._pendingResolve) { return; } for (let i = 0; i < this.attributes.length; i++) { this._setAttr(this.attributes[i].name); } this._ob = new MutationObserver(this._processMutations.bind(this)); this._ob.observe(this, { attributes: true }); const resolve = (def2, isAsync = false) => { this._resolved = true; this._pendingResolve = void 0; const { props, styles } = def2; let numberProps; if (props && !isArray(props)) { for (const key in props) { const opt = props[key]; if (opt === Number || opt && opt.type === Number) { if (key in this._props) { this._props[key] = toNumber(this._props[key]); } (numberProps || (numberProps = Object.create(null)))[camelize(key)] = true; } } } this._numberProps = numberProps; this._resolveProps(def2); if (this.shadowRoot) { this._applyStyles(styles); } this._mount(def2); }; const asyncDef = this._def.__asyncLoader; if (asyncDef) { this._pendingResolve = asyncDef().then((def2) => { def2.configureApp = this._def.configureApp; resolve(this._def = def2, true); }); } else { resolve(this._def); } } _mount(def2) { this._app = this._createApp(def2); this._inheritParentContext(); if (def2.configureApp) { def2.configureApp(this._app); } this._app._ceVNode = this._createVNode(); this._app.mount(this._root); const exposed = this._instance && this._instance.exposed; if (!exposed) return; for (const key in exposed) { if (!hasOwn(this, key)) { Object.defineProperty(this, key, { get: () => unref(exposed[key]) }); } } } _resolveProps(def2) { const { props } = def2; const declaredPropKeys = isArray(props) ? props : Object.keys(props || {}); for (const key of Object.keys(this)) { if (key[0] !== "_" && declaredPropKeys.includes(key)) { this._setProp(key, this[key]); } } for (const key of declaredPropKeys.map(camelize)) { Object.defineProperty(this, key, { get() { return this._getProp(key); }, set(val) { this._setProp(key, val, true, !this._patching); } }); } } _setAttr(key) { if (key.startsWith("data-v-")) return; const has = this.hasAttribute(key); let value = has ? this.getAttribute(key) : REMOVAL; const camelKey = camelize(key); if (has && this._numberProps && this._numberProps[camelKey]) { value = toNumber(value); } this._setProp(camelKey, value, false, true); } _getProp(key) { return this._props[key]; } _setProp(key, val, shouldReflect = true, shouldUpdate = false) { if (val !== this._props[key]) { this._dirty = true; if (val === REMOVAL) { delete this._props[key]; } else { this._props[key] = val; if (key === "key" && this._app) { this._app._ceVNode.key = val; } } if (shouldUpdate && this._instance) { this._update(); } if (shouldReflect) { const ob = this._ob; if (ob) { this._processMutations(ob.takeRecords()); ob.disconnect(); } if (val === true) { this.setAttribute(hyphenate(key), ""); } else if (typeof val === "string" || typeof val === "number") { this.setAttribute(hyphenate(key), val + ""); } else if (!val) { this.removeAttribute(hyphenate(key)); } ob && ob.observe(this, { attributes: true }); } } } _update() { const vnode = this._createVNode(); if (this._app) vnode.appContext = this._app._context; render(vnode, this._root); } _createVNode() { const baseProps = {}; if (!this.shadowRoot) { baseProps.onVnodeMounted = baseProps.onVnodeUpdated = this._renderSlots.bind(this); } const vnode = createVNode(this._def, extend(baseProps, this._props)); if (!this._instance) { vnode.ce = (instance) => { this._instance = instance; instance.ce = this; instance.isCE = true; const dispatch = (event, args) => { this.dispatchEvent( new CustomEvent( event, isPlainObject(args[0]) ? extend({ detail: args }, args[0]) : { detail: args } ) ); }; instance.emit = (event, ...args) => { dispatch(event, args); if (hyphenate(event) !== event) { dispatch(hyphenate(event), args); } }; this._setParent(); }; } return vnode; } _applyStyles(styles, owner) { if (!styles) return; if (owner) { if (owner === this._def || this._styleChildren.has(owner)) { return; } this._styleChildren.add(owner); } const nonce = this._nonce; for (let i = styles.length - 1; i >= 0; i--) { const s = document.createElement("style"); if (nonce) s.setAttribute("nonce", nonce); s.textContent = styles[i]; this.shadowRoot.prepend(s); } } _parseSlots() { const slots = this._slots = {}; let n; while (n = this.firstChild) { const slotName = n.nodeType === 1 && n.getAttribute("slot") || "default"; (slots[slotName] || (slots[slotName] = [])).push(n); this.removeChild(n); } } _renderSlots() { const outlets = this._getSlots(); const scopeId = this._instance.type.__scopeId; for (let i = 0; i < outlets.length; i++) { const o = outlets[i]; const slotName = o.getAttribute("name") || "default"; const content = this._slots[slotName]; const parent = o.parentNode; if (content) { for (const n of content) { if (scopeId && n.nodeType === 1) { const id = scopeId + "-s"; const walker = document.createTreeWalker(n, 1); n.setAttribute(id, ""); let child; while (child = walker.nextNode()) { child.setAttribute(id, ""); } } parent.insertBefore(n, o); } } else { while (o.firstChild) parent.insertBefore(o.firstChild, o); } parent.removeChild(o); } } _getSlots() { const roots = [this]; if (this._teleportTargets) { roots.push(...this._teleportTargets); } const slots = new Set(); for (const root of roots) { const found = root.querySelectorAll("slot"); for (let i = 0; i < found.length; i++) { slots.add(found[i]); } } return Array.from(slots); } _injectChildStyle(comp) { this._applyStyles(comp.styles, comp); } _beginPatch() { this._patching = true; this._dirty = false; } _endPatch() { this._patching = false; if (this._dirty && this._instance) { this._update(); } } _hasShadowRoot() { return this._def.shadowRoot !== false; } _removeChildStyle(comp) { } } const getModelAssigner = (vnode) => { const fn = vnode.props["onUpdate:modelValue"] || false; return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn; }; function onCompositionStart(e) { e.target.composing = true; } function onCompositionEnd(e) { const target = e.target; if (target.composing) { target.composing = false; target.dispatchEvent(new Event("input")); } } const assignKey = Symbol("_assign"); function castValue(value, trim, number) { if (trim) value = value.trim(); if (number) value = looseToNumber(value); return value; } const vModelText = { created(el, { modifiers: { lazy, trim, number } }, vnode) { el[assignKey] = getModelAssigner(vnode); const castToNumber = number || vnode.props && vnode.props.type === "number"; addEventListener(el, lazy ? "change" : "input", (e) => { if (e.target.composing) return; el[assignKey](castValue(el.value, trim, castToNumber)); }); if (trim || castToNumber) { addEventListener(el, "change", () => { el.value = castValue(el.value, trim, castToNumber); }); } if (!lazy) { addEventListener(el, "compositionstart", onCompositionStart); addEventListener(el, "compositionend", onCompositionEnd); addEventListener(el, "change", onCompositionEnd); } }, mounted(el, { value }) { el.value = value == null ? "" : value; }, beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) { el[assignKey] = getModelAssigner(vnode); if (el.composing) return; const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? looseToNumber(el.value) : el.value; const newValue = value == null ? "" : value; if (elValue === newValue) { return; } if (document.activeElement === el && el.type !== "range") { if (lazy && value === oldValue) { return; } if (trim && el.value.trim() === newValue) { return; } } el.value = newValue; } }; const vModelCheckbox = { deep: true, created(el, _, vnode) { el[assignKey] = getModelAssigner(vnode); addEventListener(el, "change", () => { const modelValue = el._modelValue; const elementValue = getValue(el); const checked = el.checked; const assign = el[assignKey]; if (isArray(modelValue)) { const index = looseIndexOf(modelValue, elementValue); const found = index !== -1; if (checked && !found) { assign(modelValue.concat(elementValue)); } else if (!checked && found) { const filtered = [...modelValue]; filtered.splice(index, 1); assign(filtered); } } else if (isSet(modelValue)) { const cloned = new Set(modelValue); if (checked) { cloned.add(elementValue); } else { cloned.delete(elementValue); } assign(cloned); } else { assign(getCheckboxValue(el, checked)); } }); }, mounted: setChecked, beforeUpdate(el, binding, vnode) { el[assignKey] = getModelAssigner(vnode); setChecked(el, binding, vnode); } }; function setChecked(el, { value, oldValue }, vnode) { el._modelValue = value; let checked; if (isArray(value)) { checked = looseIndexOf(value, vnode.props.value) > -1; } else if (isSet(value)) { checked = value.has(vnode.props.value); } else { if (value === oldValue) return; checked = looseEqual(value, getCheckboxValue(el, true)); } if (el.checked !== checked) { el.checked = checked; } } function getValue(el) { return "_value" in el ? el._value : el.value; } function getCheckboxValue(el, checked) { const key = checked ? "_trueValue" : "_falseValue"; return key in el ? el[key] : checked; } const rendererOptions = extend({ patchProp }, nodeOps); let renderer; function ensureRenderer() { return renderer || (renderer = createRenderer(rendererOptions)); } const render = ((...args) => { ensureRenderer().render(...args); }); const createApp = ((...args) => { const app = ensureRenderer().createApp(...args); const { mount } = app; app.mount = (containerOrSelector) => { const container = normalizeContainer(containerOrSelector); if (!container) return; const component = app._component; if (!isFunction(component) && !component.render && !component.template) { component.template = container.innerHTML; } if (container.nodeType === 1) { container.textContent = ""; } const proxy = mount(container, false, resolveRootNamespace(container)); if (container instanceof Element) { container.removeAttribute("v-cloak"); container.setAttribute("data-v-app", ""); } return proxy; }; return app; }); function resolveRootNamespace(container) { if (container instanceof SVGElement) { return "svg"; } if (typeof MathMLElement === "function" && container instanceof MathMLElement) { return "mathml"; } } function normalizeContainer(container) { if (isString(container)) { const res = document.querySelector(container); return res; } return container; } class CacheManager { constructor(prefix = "us_cache_") { this.prefix = prefix; this.stats = { hits: 0, misses: 0, sets: 0 }; } get(key) { const fullKey = this.prefix + key; const data = GM_getValue(fullKey); if (data !== void 0 && data !== null) { try { const parsed = typeof data === "string" ? JSON.parse(data) : data; if (Date.now() < parsed.expire) { this.stats.hits++; return parsed.value; } else { GM_deleteValue(fullKey); this.stats.misses++; } } catch (e) { GM_deleteValue(fullKey); this.stats.misses++; } } else { this.stats.misses++; } return void 0; } set(key, value, ttlMinutes = 1440) { const fullKey = this.prefix + key; const data = { value, expire: Date.now() + ttlMinutes * 60 * 1e3, createdAt: Date.now() }; GM_setValue(fullKey, JSON.stringify(data)); this.stats.sets++; } has(key) { return this.get(key) !== void 0; } delete(key) { GM_deleteValue(this.prefix + key); } clear(filters = []) { const keys = GM_listValues(); let count = 0; keys.forEach((key) => { if (key.startsWith(this.prefix)) { let shouldDelete = false; if (filters.length === 0) { shouldDelete = true; } else { for (const filter of filters) { if (key.indexOf(`_${filter}`) !== -1) { shouldDelete = true; break; } } } if (shouldDelete) { GM_deleteValue(key); count++; } } }); return count; } getStats() { const hitRate = this.stats.hits + this.stats.misses > 0 ? (this.stats.hits / (this.stats.hits + this.stats.misses) * 100).toFixed(2) : "0.00"; return { ...this.stats, hitRate: `${hitRate}%` }; } resetStats() { this.stats = { hits: 0, misses: 0, sets: 0 }; } listKeys() { const keys = GM_listValues(); return keys.filter((key) => key.startsWith(this.prefix)).map((key) => key.replace(this.prefix, "")); } cleanExpired() { const keys = this.listKeys(); let count = 0; keys.forEach((key) => { const fullKey = this.prefix + key; const data = GM_getValue(fullKey); if (data !== void 0 && data !== null) { try { const parsed = typeof data === "string" ? JSON.parse(data) : data; if (Date.now() >= parsed.expire) { GM_deleteValue(fullKey); count++; } } catch (e) { GM_deleteValue(fullKey); count++; } } }); return count; } } const cache = new CacheManager(); class RequestQueue { constructor(maxConcurrent = 6) { this.maxConcurrent = maxConcurrent; this.queue = []; this.running = 0; this.pendingRequests = new Map(); } async enqueue(requestFn, options = {}) { const { key, priority = 0 } = options; if (key && this.pendingRequests.has(key)) { return this.pendingRequests.get(key); } const promise = new Promise((resolve, reject) => { this.queue.push({ requestFn, resolve, reject, priority, key }); }); if (key) { this.pendingRequests.set(key, promise); } this.queue.sort((a, b) => b.priority - a.priority); this.processQueue(); return promise; } getStatus() { return { running: this.running, queued: this.queue.length, pending: this.pendingRequests.size, maxConcurrent: this.maxConcurrent }; } clear() { this.queue = []; this.pendingRequests.clear(); } async processQueue() { while (this.running < this.maxConcurrent && this.queue.length > 0) { const task = this.queue.shift(); if (task) { this.running++; this.executeTask(task); } } } async executeTask(task) { const { requestFn, resolve, reject, key } = task; try { const result = await requestFn(); resolve(result); } catch (error) { reject(error); } finally { this.running--; if (key) { this.pendingRequests.delete(key); } this.processQueue(); } } } const requestQueue = new RequestQueue(6); class ApiClient { constructor(name) { this.name = name; this.cache = cache; this.queue = requestQueue; } async request(options) { const { requestFn, cacheKey, cacheTTL = 1440, useCache = true, useQueue = true, priority = 0 } = options; if (useCache && cacheKey) { const cached = this.cache.get(cacheKey); if (cached !== void 0) { return { data: cached, meta: { cached: true, source: this.name, timestamp: ( new Date()).toISOString() } }; } } try { let result; if (useQueue) { result = await this.queue.enqueue(requestFn, { key: cacheKey, priority }); } else { result = await requestFn(); } const processedData = await this.handleResponse(result); if (useCache && cacheKey) { const ttl = this.determineTTL(processedData, cacheTTL); this.cache.set(cacheKey, processedData, ttl); } return { data: processedData, meta: { cached: false, source: this.name, timestamp: ( new Date()).toISOString() } }; } catch (error) { if (useCache && cacheKey) { this.cache.set(cacheKey, null, 5); } return { data: null, meta: { error: error.message || String(error), source: this.name, timestamp: ( new Date()).toISOString() } }; } } async handleResponse(response) { return response; } determineTTL(data, defaultTTL) { if (data && (Array.isArray(data) ? data.length > 0 : Object.keys(data).length > 0)) { return defaultTTL; } return Math.min(defaultTTL, 60); } buildCacheKey(...parts) { return `${this.name.toLowerCase()}_${parts.filter(Boolean).join("_")}`; } } const version = "1.6.0"; const pkg = { version }; var define_process_env_default = {}; class ConfigManager { constructor() { this.listeners = []; this.config = reactive({ tmdb: { apiKey: GM_getValue("tmdb_api_key", ""), baseUrl: "https://api.themoviedb.org/3", language: "zh-CN", cacheTTL: 1440 }, emby: { server: GM_getValue("emby_server", ""), apiKey: GM_getValue("emby_api_key", ""), cacheTTL: 60 }, bangumi: { apiKey: GM_getValue("bangumi_token", ""), baseUrl: "https://api.bgm.tv", cacheTTL: 1440 }, imdb: { baseUrl: "https://www.imdb.com", cacheTTL: 10080 }, nullbr: { baseUrl: "https://api.nullbr.eu.org", appId: GM_getValue("nullbr_app_id", define_process_env_default.NULLBR_APP_ID || ""), apiKey: GM_getValue("nullbr_api_key", define_process_env_default.NULLBR_API_KEY || ""), cacheTTL: 10080, userAgent: `tampermonkey_emby_enhance/${pkg.version}`, enable115: GM_getValue("nullbr_enable_115", true), enableMagnet: GM_getValue("nullbr_enable_magnet", false) }, state: {} }); } update(service, updates) { const config = this.config[service]; Object.assign(config, updates); if (service === "tmdb" && updates.apiKey !== void 0) { GM_setValue("tmdb_api_key", updates.apiKey); } else if (service === "emby") { if (updates.server !== void 0) GM_setValue("emby_server", updates.server); if (updates.apiKey !== void 0) GM_setValue("emby_api_key", updates.apiKey); } else if (service === "bangumi" && updates.apiKey !== void 0) { GM_setValue("bangumi_token", updates.apiKey); } else if (service === "nullbr") { if (updates.appId !== void 0) GM_setValue("nullbr_app_id", updates.appId); if (updates.apiKey !== void 0) GM_setValue("nullbr_api_key", updates.apiKey); if (updates.enable115 !== void 0) GM_setValue("nullbr_enable_115", updates.enable115); if (updates.enableMagnet !== void 0) GM_setValue("nullbr_enable_magnet", updates.enableMagnet); } this.notifyListeners(service, config); } validate(service) { const config = this.config[service]; switch (service) { case "tmdb": return !!config.apiKey && config.apiKey.length > 0; case "emby": return !!config.server && !!config.apiKey; case "bangumi": return !!config.apiKey && config.apiKey.length > 0; case "imdb": return true; case "nullbr": return !!config.appId && !!config.apiKey; default: return false; } } addListener(listener) { this.listeners.push(listener); } removeListener(listener) { const index = this.listeners.indexOf(listener); if (index > -1) { this.listeners.splice(index, 1); } } getSummary() { return { tmdb: { hasApiKey: !!this.config.tmdb.apiKey, language: this.config.tmdb.language }, emby: { hasServer: !!this.config.emby.server, hasApiKey: !!this.config.emby.apiKey, server: this.config.emby.server || "(未配置)" }, bangumi: { hasToken: !!this.config.bangumi.apiKey }, nullbr: { enable115: !!this.config.nullbr.enable115, enableMagnet: !!this.config.nullbr.enableMagnet } }; } notifyListeners(service, config) { this.listeners.forEach((listener) => { try { listener(service, config); } catch (error) { console.error("Config listener error:", error); } }); } } const configManager = new ConfigManager(); const CONFIG = configManager.config; const configService = configManager; class TmdbService extends ApiClient { constructor() { super("TMDB"); } async searchMovie(query, year = "") { if (!CONFIG.tmdb.apiKey) { return { data: [], meta: { error: "API Key not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const cacheKey = this.buildCacheKey("search", "movie", query, year); const config = CONFIG.tmdb; return this.request({ requestFn: async () => { const params = new URLSearchParams({ api_key: config.apiKey, query, language: config.language || "zh-CN", include_adult: "false" }); if (year) { params.append("primary_release_year", year); } const url = `${config.baseUrl}/search/movie?${params.toString()}`; const response = await GM.xmlHttpRequest({ url, responseType: "json" }); const data = response.response; let results = []; if (data.results && data.results.length > 0) { results = data.results; } return results; }, cacheKey, cacheTTL: 1440, useCache: true, useQueue: true, priority: 5 }); } async searchTv(query, year = "") { if (!CONFIG.tmdb.apiKey) { return { data: [], meta: { error: "API Key not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const cacheKey = this.buildCacheKey("search", "tv", query, year); const config = CONFIG.tmdb; return this.request({ requestFn: async () => { const params = new URLSearchParams({ api_key: config.apiKey, query, language: config.language || "zh-CN", include_adult: "false" }); if (year) { params.append("first_air_date_year", year); } const url = `${config.baseUrl}/search/tv?${params.toString()}`; const response = await GM.xmlHttpRequest({ url, responseType: "json" }); const data = response.response; return data.results || []; }, cacheKey, cacheTTL: 1440, useCache: true, useQueue: true, priority: 5 }); } async getMovieDetails(id) { return this.getDetailsBase(id, "movie"); } async getTvDetails(id) { return this.getDetailsBase(id, "tv"); } determineTTL(data, defaultTTL) { if (Array.isArray(data)) { return data.length > 0 ? defaultTTL : 60; } return defaultTTL; } async getDetailsBase(id, type) { if (!CONFIG.tmdb.apiKey) { return { data: null, meta: { error: "API Key not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const cacheKey = this.buildCacheKey("details", type, id); const config = CONFIG.tmdb; return this.request({ requestFn: async () => { const params = new URLSearchParams({ api_key: config.apiKey, language: config.language || "zh-CN" }); const url = `${config.baseUrl}/${type}/${id}?${params.toString()}`; const response = await GM.xmlHttpRequest({ url, responseType: "json" }); return response.response; }, cacheKey, cacheTTL: 2880, useCache: true, useQueue: true }); } } const tmdbService = new TmdbService(); class EmbyService extends ApiClient { constructor() { super("Emby"); } async checkExistence(tmdbId) { const { server, apiKey } = CONFIG.emby; if (!server || !apiKey) { return { data: void 0, meta: { error: "Emby not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const queryId = `tmdb.${tmdbId}`; const params = new URLSearchParams({ Recursive: "true", AnyProviderIdEquals: queryId, Fields: "ProviderIds,MediaSources,MediaStreams,ProductionYear,ChildCount,RecursiveItemCount,Path,IndexNumber", api_key: apiKey }); const url = `${server}/emby/Items?${params.toString()}`; const cacheKey = this.buildCacheKey("check", tmdbId); const result = await this.request({ requestFn: async () => { const data = (await GM.xmlHttpRequest({ url, responseType: "json" })).response; if (data.Items && data.Items.length > 0) { const item = data.Items[0]; await this.enrichSeriesInfo(item, server, apiKey); return item; } return void 0; }, cacheKey, cacheTTL: 1440, useCache: true, useQueue: true, priority: 3 }); if (result.meta) { result.meta.url = url; } return result; } async searchByName(name) { const { server, apiKey } = CONFIG.emby; if (!server || !apiKey) { return { data: [], meta: { error: "Emby not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const params = new URLSearchParams({ Recursive: "true", SearchTerm: name, IncludeItemTypes: "Movie,Series", Fields: "ProviderIds,MediaSources,MediaStreams,ProductionYear,ChildCount,RecursiveItemCount,Path,IndexNumber", api_key: apiKey }); const url = `${server}/emby/Items?${params.toString()}`; const cacheKey = this.buildCacheKey("search", name); return this.request({ requestFn: async () => { const data = (await GM.xmlHttpRequest({ url, responseType: "json" })).response; return data.Items || []; }, cacheKey, cacheTTL: 60, useCache: true, useQueue: true, priority: 3 }); } async getByDoubanId(doubanId) { const { server, apiKey } = CONFIG.emby; if (!server || !apiKey) { return { data: void 0, meta: { error: "Emby not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const queryId = `douban.${doubanId}`; const params = new URLSearchParams({ Recursive: "true", AnyProviderIdEquals: queryId, Fields: "ProviderIds,MediaSources,MediaStreams,ProductionYear,ChildCount,RecursiveItemCount,Path,IndexNumber", api_key: apiKey }); const url = `${server}/emby/Items?${params.toString()}`; const cacheKey = this.buildCacheKey("douban", doubanId); return this.request({ requestFn: async () => { const data = (await GM.xmlHttpRequest({ url, responseType: "json" })).response; if (data.Items && data.Items.length > 0) { const item = data.Items[0]; await this.enrichSeriesInfo(item, server, apiKey); return item; } return void 0; }, cacheKey, cacheTTL: 1440, useCache: true, useQueue: true, priority: 3 }); } async enrichSeriesInfo(item, server, apiKey) { if (item.Type !== "Series") return; try { const seasonParams = new URLSearchParams({ ParentId: item.Id, IncludeItemTypes: "Season", Fields: "ChildCount,RecursiveItemCount,Path,IndexNumber", api_key: apiKey }); const seasonUrl = `${server}/emby/Items?${seasonParams.toString()}`; const seasonData = (await GM.xmlHttpRequest({ url: seasonUrl, responseType: "json" })).response; if (seasonData.Items && seasonData.Items.length > 0) { item.Seasons = seasonData.Items; const totalEpisodes = item.Seasons.reduce((acc, s) => acc + (s.RecursiveItemCount || 0), 0); if (totalEpisodes === 0) { const episodeParams = new URLSearchParams({ ParentId: item.Id, IncludeItemTypes: "Episode", Recursive: "true", Fields: "ParentIndexNumber", api_key: apiKey }); const allEpUrl = `${server}/emby/Items?${episodeParams.toString()}`; const allEpData = (await GM.xmlHttpRequest({ url: allEpUrl, responseType: "json" })).response; if (allEpData.Items && allEpData.Items.length > 0) { const seasonMap = {}; allEpData.Items.forEach((ep) => { const sNum = ep.ParentIndexNumber || 1; seasonMap[sNum] = (seasonMap[sNum] || 0) + 1; }); if (item.Seasons) { item.Seasons.forEach((s) => { let ids = s.IndexNumber; if (ids === void 0) { const m = s.Name.match(/(\d+)/); if (m) ids = parseInt(m[1], 10); } if (ids !== void 0 && seasonMap[ids]) { s.RecursiveItemCount = seasonMap[ids]; s.ChildCount = seasonMap[ids]; } }); } } } } } catch (e) { console.log(`[Emby] Failed to fetch seasons/episodes: ${e}`); } } getWebUrl(item) { if (!item) return ""; const { server } = CONFIG.emby; return `${server}/web/index.html#!/item?id=${item.Id}&serverId=${item.ServerId || ""}`; } determineTTL(data, defaultTTL) { return data ? defaultTTL : 60; } } const embyService = new EmbyService(); class MediaService { async checkMedia(title, year, mediaType, searchQueries = [title], doubanId = "") { try { if (doubanId) { const doubanResult = await embyService.getByDoubanId(doubanId); if (doubanResult.data) { const item = doubanResult.data; return { tmdbId: null, embyItem: item, status: "found", statusMessage: `Found: ${item.Name}`, title, mediaType, searchQueries }; } } const embySearch = await embyService.searchByName(title); const embyItems = embySearch.data || []; if (embyItems.length === 1) { const item = embyItems[0]; const { server, apiKey } = this.getEmbyConfig(); if (server && apiKey) { await embyService.enrichSeriesInfo(item, server, apiKey); } return { tmdbId: null, embyItem: item, status: "found", statusMessage: `Found: ${item.Name}`, title, mediaType, searchQueries }; } if (embyItems.length > 1) { const { server, apiKey } = this.getEmbyConfig(); if (server && apiKey) { await Promise.all(embyItems.map((item) => embyService.enrichSeriesInfo(item, server, apiKey))); } return { tmdbId: null, embyItem: embyItems[0], embyItems, status: "found", statusMessage: `Found: ${embyItems[0].Name} (+${embyItems.length - 1} more)`, title, mediaType, searchQueries }; } const tmdbResults = await this.searchTmdbForDisplay(title, year, mediaType); const tmdbId = tmdbResults.length > 0 ? tmdbResults[0].id : null; const tmdbInfo = tmdbId ? { id: tmdbId, mediaType } : void 0; return { tmdbId, embyItem: null, status: "not-found", statusMessage: "Not in Emby", title, mediaType, searchQueries, tmdbInfo, tmdbResults }; } catch (error) { return { tmdbId: null, embyItem: null, status: "error", statusMessage: `Error: ${error.message || error}`, title, mediaType, searchQueries }; } } async getTmdbId(title, year, mediaType) { var _a, _b, _c, _d; if (mediaType === "tv") { const result = await tmdbService.searchTv(title, year); if ((_a = result.data) == null ? void 0 : _a.length) return result.data[0].id; const retry = await tmdbService.searchTv(title); if ((_b = retry.data) == null ? void 0 : _b.length) return retry.data[0].id; } else { const result = await tmdbService.searchMovie(title, year); if ((_c = result.data) == null ? void 0 : _c.length) return result.data[0].id; const retry = await tmdbService.searchMovie(title); if ((_d = retry.data) == null ? void 0 : _d.length) return retry.data[0].id; } return null; } async searchTmdbForDisplay(title, year, mediaType) { var _a, _b, _c, _d; const normalize = (items, type) => { return items.map((item) => ({ id: item.id, title: type === "tv" ? item.name || item.original_name : item.title || item.original_title, year: type === "tv" ? (item.first_air_date || "").substring(0, 4) : (item.release_date || "").substring(0, 4), overview: item.overview || "", posterPath: item.poster_path || "", mediaType: type })); }; if (mediaType === "tv") { const result = await tmdbService.searchTv(title, year); if ((_a = result.data) == null ? void 0 : _a.length) return normalize(result.data, "tv"); const retry = await tmdbService.searchTv(title); if ((_b = retry.data) == null ? void 0 : _b.length) return normalize(retry.data, "tv"); } else { const result = await tmdbService.searchMovie(title, year); if ((_c = result.data) == null ? void 0 : _c.length) return normalize(result.data, "movie"); const retry = await tmdbService.searchMovie(title); if ((_d = retry.data) == null ? void 0 : _d.length) return normalize(retry.data, "movie"); } return []; } getEmbyConfig() { return { server: CONFIG.emby.server || "", apiKey: CONFIG.emby.apiKey || "" }; } } const mediaService = new MediaService(); class UIController { mountDot(cover, size = "medium", inline) { const dot = document.createElement("us-status-dot"); dot.setAttribute("status", "loading"); dot.setAttribute("size", size); const dotWrapper = document.createElement("div"); if (inline) { dotWrapper.style.display = "inline-block"; } else { dotWrapper.style.position = "absolute"; dotWrapper.style.zIndex = "99"; dotWrapper.style.left = "0"; dotWrapper.style.top = "0"; } const sizeMap = { mini: "12px", small: "20px", medium: "28px", large: "36px" }; dotWrapper.style.width = sizeMap[size]; dotWrapper.style.height = sizeMap[size]; dotWrapper.appendChild(dot); cover.style.position = "relative"; cover.appendChild(dotWrapper); return dot; } updateDot(dotEl, result) { dotEl.setAttribute("status", result.status); dotEl.setAttribute("title", result.statusMessage); } bindInfoCard(dotEl, result) { const handler = (event) => { event.preventDefault(); event.stopPropagation(); this.showInfoCard(result); }; dotEl.addEventListener("dotClick", handler); dotEl.addEventListener("click", handler); } showInfoCard(result) { const existing = document.querySelector("us-info-card"); if (existing) existing.remove(); const card = document.createElement("us-info-card"); card.setAttribute("title", result.title); card.setAttribute("visible", "true"); const cardEl = card; cardEl.embyItem = result.embyItem; cardEl.embyItems = result.embyItems; cardEl.searchQueries = result.searchQueries; cardEl.tmdbInfo = result.tmdbInfo; cardEl.tmdbResults = result.tmdbResults; card.addEventListener("close", () => { card.remove(); }); document.body.appendChild(card); } } const uiController = new UIController(); function isCustomPageConfig(config) { return "handler" in config; } class AdapterEngine { constructor() { this.processedElements = new WeakSet(); } run(config) { if (config.globalStyles) { GM.addStyle(config.globalStyles); } const url = location.href; for (const page of config.pages) { if (!page.match(url)) continue; if (isCustomPageConfig(page)) { page.handler(); return; } this.processPage(page); return; } } processPage(page) { const scan = () => this.scanItems(page); scan(); if (page.observe) { const observer = new MutationObserver(() => scan()); observer.observe(document.body, { childList: true, subtree: true }); } } scanItems(page) { const items = page.getItems(); items.forEach((item) => { if (this.processedElements.has(item)) return; this.processedElements.add(item); this.processItem(item, page); }); } async processItem(item, page) { const { itemConfig, dotSize } = page; let title = itemConfig.getTitle(item); let mediaType = itemConfig.getType(item); let year = itemConfig.getYear(item); if (hasSeasonInfo(title)) { mediaType = "tv"; year = ""; title = removeSeasonInfo(title); } const cover = itemConfig.getCover(item); if (!cover) return; if (page.beforeMount) { page.beforeMount(cover); } const dot = uiController.mountDot(cover, dotSize || "medium"); const doubanId = itemConfig.getDoubanId ? itemConfig.getDoubanId(item) : ""; const searchQueries = [title]; const fullTitle = itemConfig.getTitle(item); if (fullTitle !== title) searchQueries.unshift(fullTitle); const result = await mediaService.checkMedia(title, year, mediaType, searchQueries, doubanId); uiController.updateDot(dot, result); uiController.bindInfoCard(dot, result); } } const SEASON_REGEX = /(?:[\s::((\[【]|^)(?:第[0-9一二三四五六七八九十]+季|Season\s*\d+|S\d+).*/i; function removeSeasonInfo(title) { return title.replace(SEASON_REGEX, "").trim(); } function hasSeasonInfo(title) { return SEASON_REGEX.test(title); } const adapterEngine = new AdapterEngine(); const doubanConfig = { name: "Douban", match: (url) => url.includes("movie.douban.com") || url.includes("m.douban.com"), pages: [ { name: "subject", match: () => location.pathname.startsWith("/subject/"), getItems: () => { const container = document.querySelector("#mainpic"); return container ? [container] : []; }, itemConfig: { getTitle: () => { var _a; const titleEl = document.querySelector("#content h1 span"); return ((_a = titleEl == null ? void 0 : titleEl.textContent) == null ? void 0 : _a.trim()) || ""; }, getYear: () => { var _a; const yearEl = document.querySelector("#content h1 .year"); return ((_a = yearEl == null ? void 0 : yearEl.textContent) == null ? void 0 : _a.replace(/[()]/g, "").trim()) || ""; }, getType: () => { var _a; const titleEl = document.querySelector("#content h1 span"); const title = ((_a = titleEl == null ? void 0 : titleEl.textContent) == null ? void 0 : _a.trim()) || ""; const infoEl = document.querySelector("#info"); const infoText = (infoEl == null ? void 0 : infoEl.textContent) || ""; if (infoText.includes("集数")) return "tv"; if (/(?:[\s::((\[【]|^)(?:第[0-9一二三四五六七八九十]+季|Season\s*\d+|S\d+)/i.test(title)) return "tv"; return "movie"; }, getCover: (el) => el, getDoubanId: () => location.pathname.split("/").filter(Boolean)[1] || "" }, dotSize: "medium", observe: false, beforeMount: (cover) => { cover.style.marginLeft = "0"; } }, { name: "explore", match: () => location.pathname.startsWith("/explore"), getItems: () => document.querySelectorAll(".subject-list-list li"), itemConfig: { getTitle: (el) => { var _a; return ((_a = el == null ? void 0 : el.querySelector(".drc-subject-info-title-text")) == null ? void 0 : _a.textContent) || ""; }, getYear: (el) => { var _a, _b, _c; return ((_c = (_b = (_a = el == null ? void 0 : el.querySelector(".drc-subject-info-subtitle")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.match(/\b(19|20)\d{2}\b/)) == null ? void 0 : _c[0]) || ""; }, getType: (card) => { var _a; return ((_a = card.querySelector(".drc-subject-card")) == null ? void 0 : _a.classList.contains("tv")) ? "tv" : "movie"; }, getCover: (card) => card.querySelector(".drc-cover-container"), getDoubanId: (card) => { var _a, _b; return ((_b = new URL(((_a = card.querySelector("a")) == null ? void 0 : _a.href) || "").searchParams.get("uri")) == null ? void 0 : _b.split("/").slice(-1)[0]) || ""; } }, dotSize: "small", observe: true }, { name: "chart", match: () => location.pathname.startsWith("/chart"), getItems: () => document.querySelectorAll(".indent tr.item"), itemConfig: { getTitle: (el) => { var _a; return ((_a = el == null ? void 0 : el.querySelector("a.nbg")) == null ? void 0 : _a.getAttribute("title")) || ""; }, getYear: (el) => { var _a, _b, _c; return ((_c = (_b = (_a = el == null ? void 0 : el.querySelector("td p")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.match(/\b(19|20)\d{2}\b/)) == null ? void 0 : _c[0]) || ""; }, getType: () => "movie", getCover: (card) => card.querySelector("a.nbg"), getDoubanId: (el) => { var _a; return new URL(((_a = el == null ? void 0 : el.querySelector("a.nbg")) == null ? void 0 : _a.href) || "").pathname.split("/").filter(Boolean)[1] || ""; } }, dotSize: "small", observe: true }, { name: "subject_collection", match: () => location.pathname.startsWith("/subject_collection"), getItems: () => document.querySelectorAll(".frc-subject-card-l"), itemConfig: { getTitle: (el) => { var _a; return ((_a = el == null ? void 0 : el.querySelector("h3.frc-subject-info-title")) == null ? void 0 : _a.textContent) || ""; }, getYear: (el) => { var _a, _b, _c; return ((_c = (_b = (_a = el == null ? void 0 : el.querySelector(".frc-subject-info-content")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.match(/\b(19|20)\d{2}\b/)) == null ? void 0 : _c[0]) || ""; }, getType: (card) => { var _a, _b; return ((_b = (_a = card.parentElement) == null ? void 0 : _a.parentElement) == null ? void 0 : _b.classList.contains("tv")) ? "tv" : "movie"; }, getCover: (card) => card.querySelector(".frc-size-cover"), getDoubanId: (el) => { var _a; return new URL(((_a = el.querySelector(".frc-subject-item-tag-vendor")) == null ? void 0 : _a.href) || "").pathname.split("/").filter(Boolean)[1] || ""; } }, dotSize: "medium", observe: true } ] }; const gygConfig = { name: "GYG", match: (url) => url.includes("gyg.si"), pages: [ { name: "list", match: () => ["/mv", "/tv", "/ac", "/"].includes(location.pathname), getItems: () => document.querySelectorAll(".content-list li"), itemConfig: { getTitle: (item) => { var _a; return ((_a = item.querySelector("a")) == null ? void 0 : _a.getAttribute("title")) || ""; }, getYear: (item) => { var _a, _b, _c; return ((_c = (_b = (_a = item.querySelector(".li-bottom .tag")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.match(/\b(19|20)\d{2}\b/)) == null ? void 0 : _c[0]) || ""; }, getType: (item) => { var _a, _b; return ((_b = (_a = item.querySelector(".cover a")) == null ? void 0 : _a.getAttribute("href")) == null ? void 0 : _b.startsWith("/mv")) ? "movie" : "tv"; }, getCover: (item) => item.querySelector(".cover"), getDoubanId: () => "" }, dotSize: "medium", observe: false }, { name: "hits", match: (url) => new URL(url).pathname.startsWith("/hits"), getItems: () => document.querySelectorAll(".content-list li"), itemConfig: { getTitle: (item) => { var _a; return ((_a = item.querySelector("a")) == null ? void 0 : _a.getAttribute("title")) || ""; }, getYear: (item) => { var _a, _b, _c; return ((_c = (_b = (_a = item.querySelector(".li-bottom .tag")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.match(/\b(19|20)\d{2}\b/)) == null ? void 0 : _c[0]) || ""; }, getType: () => location.pathname.startsWith("/hits/mv") ? "movie" : "tv", getCover: (item) => item.querySelector(".cover"), getDoubanId: () => "" }, dotSize: "medium", observe: false }, { name: "detail", match: () => true, getItems: () => { const el = document.querySelector(".main-meta picture img"); if (!el) return []; const ratingSection = document.querySelector(".ratings-section"); return ratingSection ? [ratingSection] : []; }, itemConfig: { getTitle: () => { var _a; return ((_a = document.querySelector(".main-meta picture img")) == null ? void 0 : _a.getAttribute("alt")) || ""; }, getYear: () => { var _a, _b; return ((_b = (_a = document.querySelector(".main-ui-meta .year")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.trim().replace(/[()]/g, "")) || ""; }, getType: () => location.pathname.startsWith("/mv") ? "movie" : "tv", getCover: () => document.querySelector(".main-meta .img"), getDoubanId: () => { var _a, _b; return new URL(((_b = (_a = document.querySelector(".ratings-section")) == null ? void 0 : _a.querySelector("a")) == null ? void 0 : _b.href) || "").pathname.split("/").filter(Boolean)[1]; } }, dotSize: "medium", observe: false } ] }; const RESOLUTION_RE = /(?:3840x2160|1920x1080|1280x720|2160[pP]|1080[pP]|720[pP]|4[kK])/i; const CODEC_KEYWORDS = [ "HEVC-10bit", "HEVC 10bit", "AVC 8bit", "AVC-8bit", "HEVC", "AVC", "H\\.?265", "H\\.?264", "x265", "x264", "AV1", "10bit", "10-bit", "8bit", "8-bit" ]; const CODEC_RE = new RegExp(`(?:${CODEC_KEYWORDS.join("|")})`, "gi"); const AUDIO_KEYWORDS = ["AACx3", "AACx2", "AAC", "FLAC", "OPUS", "DTS", "AC3", "TrueHD", "Atmos"]; const AUDIO_RE = new RegExp(`(?:${AUDIO_KEYWORDS.join("|")})`, "gi"); const SOURCE_KEYWORDS = [ "WEB-DL", "WebRip", "Web-Rip", "BDRip", "BD-Rip", "BDRIP", "Baha", "B-Global", "IQIYI", "Bilibili", "TVRip", "Remux", "BD", "DVD" ]; const SOURCE_RE = new RegExp(`(?:${SOURCE_KEYWORDS.join("|")})`, "gi"); const FORMAT_KEYWORDS = ["MKV", "MP4", "AVI"]; const FORMAT_RE = new RegExp(`\\b(?:${FORMAT_KEYWORDS.join("|")})\\b`, "gi"); const SUBTITLE_KEYWORDS_BLOCK = [ "简繁日内封字幕", "简繁内封字幕", "简繁日内封", "繁簡日內封", "简繁内封", "繁简日内封", "繁简内封", "简体内嵌", "繁体内嵌", "简体内封", "繁体内封", "简日内嵌", "繁日内嵌", "简日双语", "繁日雙語", "简日内封", "繁日内封", "粵日雙語", "粵日國三語", "内封繁体中文字幕", "内封繁體中文字幕", "外挂繁體中文", "外挂简中字幕", "外掛繁體中文", "简中字幕", "繁中字幕", "CHS", "CHT", "BIG5", "GB" ]; const SUBTITLE_BLOCK_RE = new RegExp(`(?:${SUBTITLE_KEYWORDS_BLOCK.map(escapeRegex).join("|")})`, "gi"); const SEASON_RE = /(?:第([0-9一二三四五六七八九十百]+)[季期部]|[Ss](?:eason\s*)?(\d+))/; const EPISODE_RE = /(?:\s-\s*(\d{2,3})-(\d{2,3})(?:\s*(?:Fin|END|完))?\b|\s-\s*(\d+(?:v\d)?)\b|\b(\d{2,3})-(\d{2,3})(?:\s*(?:Fin|END|完))?\b)/i; const KNOWN_GROUP_PREFIXES = [ "LoliHouse", "ANi", "VCB-Studio", "SweetSub", "GMTeam", "GM-Team", "桜都字幕组", "樱都字幕组", "幻樱字幕组", "幻櫻字幕組", "百冬练习组", "百冬練習組", "绿茶字幕组", "綠茶字幕組", "萝莉社活动室", "六四位元字幕組", "沸班亚马制作组", "jibaketa", "整理搬运" ]; function escapeRegex(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function parseDmhyTitle(raw) { const result = { title: "", group: "", resolution: "", codec: "", audio: "", source: "", subtitle: "", format: "", episode: "", season: "" }; let text = raw.trim(); text = text.replace(/[\u200B\u200C\u200D\uFEFF]/g, ""); text = extractGroup(text, result); if (text.includes("★")) { return parseStarFormat(text, result); } if (result.group === "整理搬运") { return parseCollectionFormat(text, result); } text = text.replace(/[((]检索用[::].*?[))]/g, ""); const { naked, tags } = extractBracketedBlocks(text); for (const tag of tags) { classifyTagBlock(tag, result); } extractInlineTech(naked, result); let title = cleanTitle(naked, result); if (!title && tags.length > 0) { title = findTitleFromTags(tags); } result.title = title; return result; } function extractGroup(text, result) { const groupMatch = text.match(/^(?:\[|【)([^\]】]+)(?:\]|】)/); if (groupMatch) { const candidate = groupMatch[1].trim(); if (isGroupName(candidate)) { result.group = candidate; text = text.slice(groupMatch[0].length).trim(); } } return text; } function isGroupName(str) { if (KNOWN_GROUP_PREFIXES.some((g) => str.includes(g))) return true; if (str.includes("&")) return true; if (/^[\w\-\.]+$/.test(str) && str.length <= 30) return true; if (/(?:字幕|制作|压制|壓制|合成|練習|练习|搬运|搬運|活动室)/.test(str)) return true; if (/[\u4e00-\u9fa5]/.test(str) && /[a-zA-Z]/.test(str) && str.length <= 20) return true; return false; } function parseStarFormat(text, result) { const parts = text.split("★").map((p2) => p2.trim()).filter(Boolean); if (parts.length >= 2) { let titleIdx = 0; if (!result.group && isGroupName(parts[0])) { result.group = parts[0]; titleIdx = 1; } if (titleIdx < parts.length) { result.title = extractChineseTitle(parts[titleIdx]); } for (let i = titleIdx + 1; i < parts.length; i++) { classifyTagBlock(parts[i], result); } } if (!result.title && parts.length > 0) { result.title = parts[0]; } return result; } function parseCollectionFormat(text, result) { const colonIdx = text.indexOf(":"); let titlePart = colonIdx > 0 ? text.substring(0, colonIdx) : text; const parenIdx = titlePart.search(/[((]/); if (parenIdx > 0) { titlePart = titlePart.substring(0, parenIdx); } titlePart = titlePart.replace(/[/\/]/g, "/"); if (titlePart.includes("/")) { const parts = titlePart.split("/").map((p2) => p2.trim()); const cnPart = parts.find((p2) => /[\u4e00-\u9fa5]/.test(p2) && p2.length > 1); titlePart = cnPart || parts[0]; } result.title = titlePart.trim(); if (colonIdx > 0) { const desc = text.substring(colonIdx + 1); if (/华日|日语|粤语/.test(desc)) { const audioMatch = desc.match(/(华日|日语|粤语|华日英)[音轨,;,;\s]/); if (audioMatch) result.audio = audioMatch[1]; } if (/字幕/.test(desc)) { const subMatch = desc.match(/(外挂简中字幕|外挂简中|外掛繁體中文|内封简中字幕|外挂简中,\s*英文字幕)/); if (subMatch) result.subtitle = subMatch[1]; } } return result; } function findTitleFromTags(tags, result) { const isTechOrMeta = (tag) => { var _a; if (RESOLUTION_RE.test(tag) && ((_a = tag.match(RESOLUTION_RE)) == null ? void 0 : _a[0]) === tag) return true; if (/^(?:MP4|MKV|AVI)$/i.test(tag)) return true; if (/^\d{1,3}(?:v\d)?$/.test(tag)) return true; if (/^\d{2,3}-\d{2,3}/.test(tag)) return true; if (/^[Ss]\d{1,2}$/.test(tag)) return true; if (/^(?:19|20)\d{2}$/.test(tag)) return true; const upperTag = tag.toUpperCase(); if ([ "HEVC", "AVC", "X264", "X265", "AV1", "AAC", "FLAC", "OPUS", "WEBRIP", "BDRIP", "WEB-DL", "BD", "GB", "BIG5" ].includes(upperTag)) return true; if (/^[\w\s\-.]+$/i.test(tag) && RESOLUTION_RE.test(tag)) return true; if (/^\d+月新番$/.test(tag)) return true; if (SUBTITLE_BLOCK_RE.test(tag)) { SUBTITLE_BLOCK_RE.lastIndex = 0; return true; } if (/^(?:国漫|動畫|动画|日漫)$/.test(tag)) return true; if (/检索用/.test(tag)) return true; return false; }; const scoreTag = (tag) => { let score = 0; const cnChars = (tag.match(/[\u4e00-\u9fa5]/g) || []).length; if (cnChars > 0) score += cnChars * 3; if (tag.length >= 2 && tag.length <= 40) score += tag.length; if (tag.includes("/") || tag.includes("_")) score += 5; if (/^[\w\s\-.']+$/.test(tag) && !/[\u4e00-\u9fa5]/.test(tag)) score -= 10; if (isTechOrMeta(tag)) score -= 100; return score; }; let bestTag = ""; let bestScore = -Infinity; for (const tag of tags) { const score = scoreTag(tag); if (score > bestScore) { bestScore = score; bestTag = tag; } } if (bestTag) { return extractChineseTitle(bestTag); } return ""; } function extractBracketedBlocks(text) { const tags = []; const blockRegex = /(?:\[([^\]]+)\]|【([^】]+)】|(([^)]+)))/g; let match; while ((match = blockRegex.exec(text)) !== null) { const content = (match[1] || match[2] || match[3]).trim(); if (content) tags.push(content); } const naked = text.replace(/(?:\[[^\]]+\]|【[^】]+】|([^)]+))/g, " ").trim(); return { naked, tags }; } function classifyTagBlock(tag, result) { tag.toUpperCase(); if (!result.resolution && RESOLUTION_RE.test(tag)) { const m = tag.match(RESOLUTION_RE); if (m) result.resolution = m[0]; } if (SUBTITLE_BLOCK_RE.test(tag)) { const matches = tag.match(SUBTITLE_BLOCK_RE); if (matches) { result.subtitle = result.subtitle ? result.subtitle + " " + matches.join(" ") : matches.join(" "); } return; } if (/^(?:MP4|MKV|AVI)$/i.test(tag)) { result.format = tag.toUpperCase(); return; } const epRangeMatch = tag.match(/^(\d{2,3}-\d{2,3})/); if (epRangeMatch && !result.episode) { result.episode = epRangeMatch[1]; return; } if (/^\d{1,3}(?:v\d)?$/.test(tag) && !result.episode) { result.episode = tag; return; } if (/^[Ss]\d{1,2}$/.test(tag)) { result.season = tag; return; } if (SOURCE_RE.test(tag)) { const m = tag.match(SOURCE_RE); if (m && !result.source) result.source = m[0]; SOURCE_RE.lastIndex = 0; } if (CODEC_RE.test(tag)) { const m = tag.match(CODEC_RE); if (m) { const codecs = [...new Set(m.map((c) => normalizeCodec(c)))]; result.codec = result.codec ? result.codec + " " + codecs.join(" ") : codecs.join(" "); } CODEC_RE.lastIndex = 0; } if (AUDIO_RE.test(tag)) { const m = tag.match(AUDIO_RE); if (m && !result.audio) result.audio = m.join(" "); AUDIO_RE.lastIndex = 0; } if (FORMAT_RE.test(tag)) { const m = tag.match(FORMAT_RE); if (m && !result.format) result.format = m[0].toUpperCase(); FORMAT_RE.lastIndex = 0; } } function extractInlineTech(text, result) { if (!result.resolution) { const m = text.match(RESOLUTION_RE); if (m) result.resolution = m[0]; } if (!result.source) { const m = text.match(SOURCE_RE); if (m) result.source = m[0]; SOURCE_RE.lastIndex = 0; } if (!result.codec) { const m = text.match(CODEC_RE); if (m) { result.codec = [...new Set(m.map((c) => normalizeCodec(c)))].join(" "); } CODEC_RE.lastIndex = 0; } if (!result.audio) { const m = text.match(AUDIO_RE); if (m) result.audio = m.join(" "); AUDIO_RE.lastIndex = 0; } if (!result.format) { const m = text.match(FORMAT_RE); if (m) result.format = m[0].toUpperCase(); FORMAT_RE.lastIndex = 0; } if (!result.season) { const m = text.match(SEASON_RE); if (m) { result.season = m[0].trim(); } } if (!result.episode) { const m = text.match(EPISODE_RE); if (m) { if (m[1] && m[2]) result.episode = `${m[1]}-${m[2]}`; else if (m[3]) result.episode = m[3]; else if (m[4] && m[5]) result.episode = `${m[4]}-${m[5]}`; } } } function normalizeCodec(codec) { const c = codec.replace(/[\s-]/g, "").toUpperCase(); if (c === "H265" || c === "H.265") return "HEVC"; if (c === "H264" || c === "H.264") return "AVC"; if (c === "HEVC10BIT") return "HEVC 10bit"; if (c === "AVC8BIT") return "AVC 8bit"; return codec; } function cleanTitle(naked, result) { let title = naked; title = title.replace(RESOLUTION_RE, " "); title = title.replace(SOURCE_RE, " "); SOURCE_RE.lastIndex = 0; title = title.replace(CODEC_RE, " "); CODEC_RE.lastIndex = 0; title = title.replace(AUDIO_RE, " "); AUDIO_RE.lastIndex = 0; title = title.replace(FORMAT_RE, " "); FORMAT_RE.lastIndex = 0; title = title.replace(SUBTITLE_BLOCK_RE, " "); SUBTITLE_BLOCK_RE.lastIndex = 0; title = title.replace(/\s+-\s+\d+(?:v\d)?(?:\s|$)/g, " "); title = title.replace(/\s+-\s+\d{2,3}-\d{2,3}(?:\s+(?:Fin|END|完))?\s*/gi, " "); if (result.season) { title = title.replace(SEASON_RE, " "); } title = title.replace(/\b(?:Fin|END|完)\b/gi, " "); title = title.replace(/\b(19|20)\d{2}\b/g, " "); title = title.replace(/\b\d{2,3}-\d{2,3}\b/g, " "); title = title.replace(/\bv\d\b/gi, " "); title = title.replace(/\d+月新番/, " "); title = title.replace(/[((]检索用[::].*?[))]/g, " "); title = extractChineseTitle(title); return title; } function extractChineseTitle(text) { let title = text.trim(); title = title.replace(/[/_]/g, "/"); if (title.includes("/")) { const parts = title.split("/").map((p2) => p2.trim()).filter((p2) => p2.length > 0); const cnPart = parts.find((p2) => /[\u4e00-\u9fa5]/.test(p2) && p2.length > 1); if (cnPart) { title = cnPart; } else { title = parts[0] || title; } } title = title.replace(/[【】\[\]()()★]/g, " "); title = title.replace(/^[\s\-–—::.·,,]+/, ""); title = title.replace(/[\s\-–—::.·,,]+$/, ""); title = title.replace(/\s+/g, " ").trim(); return title; } class BangumiService extends ApiClient { constructor() { super("Bangumi"); } async search(query) { const apiKey = CONFIG.bangumi.apiKey; if (!apiKey) { return { data: null, meta: { error: "Token not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const cacheKey = this.buildCacheKey("search", query); const config = CONFIG.bangumi; return this.request({ requestFn: async () => { const url = `${config.baseUrl}/v0/search/subjects`; const response = await GM.xmlHttpRequest({ method: "POST", url, responseType: "json", headers: { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json" }, data: JSON.stringify({ keyword: query, filter: { type: [2] } }) }); if (response.status === 200) { const data = typeof response.response === "string" ? JSON.parse(response.response) : response.response; if (data && data.data && data.data.length > 0) { return data.data[0]; } } else { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } return null; }, cacheKey, cacheTTL: 1440, useCache: true, useQueue: true }); } determineTTL(data, defaultTTL) { return data ? defaultTTL : 60; } } const bangumiService = new BangumiService(); const dmhyConfig = { name: "DMHY", match: (url) => { try { const u = new URL(url); return u.hostname.includes("dmhy.org") && (u.pathname === "/" || u.pathname.startsWith("/topics")); } catch { return false; } }, globalStyles: ` /* Hide original tag spans */ table#topic_list tr td span.tag { display: none !important; } /* Tag badges */ .us-dmhy-tag { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 11px; font-weight: 500; margin-left: 4px; white-space: nowrap; vertical-align: middle; line-height: 1.6; } .us-dmhy-tag-group { background: #fff8e1; color: #f57f17; } .us-dmhy-tag-res { background: #e3f2fd; color: #1565c0; } .us-dmhy-tag-codec { background: #f3e5f5; color: #6a1b9a; } .us-dmhy-tag-audio { background: #fce4ec; color: #c62828; } .us-dmhy-tag-source { background: #e8f5e9; color: #2e7d32; } .us-dmhy-tag-subtitle { background: #e0f7fa; color: #00695c; } .us-dmhy-tag-format { background: #e0e0e0; color: #424242; } .us-dmhy-tag-bangumi { background: #e8f5e9; color: #2e7d32; cursor: pointer; text-decoration: none; } .us-dmhy-tag-bangumi:hover { opacity: 0.8; } .us-dmhy-tag-episode { background: #ede7f6; color: #4527a0; } .us-dmhy-tag-season { background: #fce4ec; color: #880e4f; } /* Inline DOT for DMHY (no cover images) */ .us-dmhy-dot-wrapper { display: inline-block; width: 14px; height: 14px; margin-right: 4px; vertical-align: middle; position: relative; } `, pages: [ { name: "topic_list", match: () => true, handler: () => processTopicList() } ] }; const TAG_DEFS = [ { key: "season", cssClass: "us-dmhy-tag-season" }, { key: "episode", cssClass: "us-dmhy-tag-episode" }, { key: "group", cssClass: "us-dmhy-tag-group" }, { key: "resolution", cssClass: "us-dmhy-tag-res" }, { key: "codec", cssClass: "us-dmhy-tag-codec" }, { key: "audio", cssClass: "us-dmhy-tag-audio" }, { key: "source", cssClass: "us-dmhy-tag-source" }, { key: "subtitle", cssClass: "us-dmhy-tag-subtitle" }, { key: "format", cssClass: "us-dmhy-tag-format" } ]; function processTopicList() { const links = document.querySelectorAll("#topic_list td.title a"); links.forEach((link) => { var _a, _b, _c; const anchor = link; const href = anchor.getAttribute("href") || ""; if (!href.includes("/topics/view/")) return; const rawTitle = ((_a = anchor.textContent) == null ? void 0 : _a.trim()) || ""; if (!rawTitle) return; const parsed = parseDmhyTitle(rawTitle); if (!parsed.title) return; anchor.textContent = parsed.title; anchor.title = rawTitle; const tagContainer = document.createElement("span"); tagContainer.style.whiteSpace = "nowrap"; for (const def2 of TAG_DEFS) { const value = parsed[def2.key]; if (value) { tagContainer.appendChild(createTagBadge(value, def2.cssClass)); } } (_b = anchor.parentNode) == null ? void 0 : _b.insertBefore(tagContainer, anchor.nextSibling); const dotWrapper = document.createElement("div"); dotWrapper.className = "us-dmhy-dot-wrapper"; (_c = anchor.parentNode) == null ? void 0 : _c.insertBefore(dotWrapper, anchor); const dot = uiController.mountDot(dotWrapper, "mini"); processAnimeItem(parsed.title, dot, tagContainer); }); } async function processAnimeItem(title, dot, tagContainer) { try { if (configService.validate("emby")) { const embyResult = await embyService.searchByName(title); const items = embyResult.data || []; const matchedItems = items.filter((item) => isNameMatch(title, item.Name)); if (matchedItems.length > 0) { const item = matchedItems[0]; dot.setAttribute("status", "found"); dot.setAttribute("title", `Emby: ${item.Name}`); uiController.bindInfoCard(dot, { tmdbId: null, embyItem: item, embyItems: matchedItems.length > 1 ? matchedItems : void 0, status: "found", statusMessage: `Found: ${item.Name}`, title, mediaType: "tv", searchQueries: [title] }); return; } } if (configService.validate("bangumi")) { const bangumiResult = await bangumiService.search(title); const subject = bangumiResult.data; if (subject) { dot.setAttribute("status", "not-found"); dot.setAttribute("title", `BGM: ${subject.name_cn || subject.name}`); const bangumiLink = document.createElement("a"); bangumiLink.className = "us-dmhy-tag us-dmhy-tag-bangumi"; bangumiLink.textContent = `BGM:${subject.id}`; bangumiLink.href = `https://bgm.tv/subject/${subject.id}`; bangumiLink.target = "_blank"; bangumiLink.rel = "noopener noreferrer"; bangumiLink.title = subject.name_cn || subject.name; bangumiLink.addEventListener("click", (e) => e.stopPropagation()); tagContainer.appendChild(bangumiLink); return; } } dot.setAttribute("status", "not-found"); dot.setAttribute("title", "Not found"); } catch (error) { dot.setAttribute("status", "error"); dot.setAttribute("title", `Error: ${error}`); } } function isNameMatch(searchTitle, embyName) { const normalize = (s) => s.toLowerCase().replace(/[\s\-–—::·・、,,.。!!??]/g, "").replace(/[(())\[\]【】]/g, ""); const a = normalize(searchTitle); const b = normalize(embyName); if (a === b) return true; if (a.includes(b) || b.includes(a)) return true; const shorter = a.length <= b.length ? a : b; const longer = a.length > b.length ? a : b; if (shorter.length >= 2 && longer.includes(shorter)) return true; if (/[\u4e00-\u9fa5]/.test(a) && /[\u4e00-\u9fa5]/.test(b)) { const charsA = new Set(a); let overlap = 0; for (const c of b) { if (charsA.has(c)) overlap++; } const ratio = overlap / Math.max(a.length, b.length); if (ratio >= 0.6) return true; } return false; } function createTagBadge(text, cssClass) { const span = document.createElement("span"); span.className = `us-dmhy-tag ${cssClass}`; span.textContent = text; return span; } const _hoisted_1$5 = ["title"]; const _sfc_main$5 = defineComponent({ __name: "StatusDot.ce", props: { status: { type: String }, title: { type: String }, size: { type: String } }, emits: ["dotClick"], setup(__props, { emit: __emit }) { useCssVars((_ctx) => ({ "c80a992e": padding.value })); const props = __props; const emit2 = __emit; const statusClass = computed(() => { switch (props.status) { case "loading": return "dot-loading"; case "found": return "found"; case "not-found": return "not-found"; case "error": return "error"; default: return "dot-loading"; } }); const dotTitle = computed(() => { if (props.title) return props.title; switch (props.status) { case "loading": return "Checking..."; case "found": return "Found in Emby"; case "not-found": return "Not found"; case "error": return "Error"; default: return ""; } }); const padding = computed(() => { if (props.size === "small") return "4px"; if (props.size === "large") return "8px"; if (props.size === "mini") return "0"; return "6px"; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass([statusClass.value, "us-dot"]), title: dotTitle.value, onClick: _cache[0] || (_cache[0] = ($event) => emit2("dotClick")) }, null, 10, _hoisted_1$5); }; } }); const _style_0$5 = ":host{width:100%;height:100%;display:block;padding:var(--c80a992e);box-sizing:border-box}.us-dot{border-radius:50%;cursor:pointer;box-shadow:0 0 8px #00000080;border:2px solid white;transition:transform .2s ease,opacity .2s ease;display:flex;align-items:center;justify-content:center;font-size:0;width:100%;height:100%;box-sizing:border-box}.us-dot:hover{transform:scale(1.15)}.us-dot.dot-loading{background-color:#01b4e4;animation:us-pulse 1.5s infinite;opacity:.8;border-color:#fffc}.us-dot.found{background-color:#52b54b;box-shadow:0 0 10px #52b54bcc}.us-dot.not-found,.us-dot.error{background-color:#9e9e9e;opacity:.7}@keyframes us-pulse{0%{transform:scale(.95);opacity:.7}50%{transform:scale(1.05);opacity:1}to{transform:scale(.95);opacity:.7}}"; const _export_sfc = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) { target[key] = val; } return target; }; const StatusDotCE = _export_sfc(_sfc_main$5, [["styles", [_style_0$5]]]); const _hoisted_1$4 = { class: "us-emby-section" }; const _hoisted_2$4 = { key: 0, class: "us-emby-switcher" }; const _hoisted_3$4 = ["value"]; const _hoisted_4$4 = ["value"]; const _hoisted_5$4 = { class: "us-emby-detail-row" }; const _hoisted_6$3 = { class: "us-emby-poster" }; const _hoisted_7$3 = ["src"]; const _hoisted_8$3 = { class: "us-emby-info" }; const _hoisted_9$3 = { class: "us-emby-name" }; const _hoisted_10$3 = { class: "us-emby-year" }; const _hoisted_11$3 = { class: "us-emby-tags" }; const _hoisted_12$3 = { class: "us-emby-type-badge" }; const _hoisted_13$3 = { key: 0, class: "us-emby-rating" }; const _hoisted_14$3 = { key: 0, class: "us-season-badges" }; const _hoisted_15$3 = { key: 1, class: "us-series-count" }; const _hoisted_16$2 = { class: "us-emby-path" }; const _hoisted_17$2 = { class: "us-path-value" }; const _hoisted_18$2 = { key: 2, class: "us-tech-info" }; const _hoisted_19$2 = { key: 3, class: "us-stream-info" }; const _hoisted_20$2 = { key: 4, class: "us-stream-info" }; const _hoisted_21$1 = { class: "us-emby-action" }; const _hoisted_22$1 = ["href"]; const _sfc_main$4 = defineComponent({ __name: "EmbyCard.ce", props: { item: { type: Object }, items: { type: Array } }, setup(__props) { const props = __props; const selectedIndex = ref(0); const current = computed(() => { var _a; if ((_a = props.items) == null ? void 0 : _a.length) { return props.items[selectedIndex.value] || props.items[0]; } return props.item; }); const year = computed(() => { var _a; return ((_a = current.value) == null ? void 0 : _a.ProductionYear) || ""; }); const rating = computed(() => { if (!current.value) return ""; return current.value.CommunityRating ? current.value.CommunityRating.toFixed(1) : current.value.OfficialRating || ""; }); const path = computed(() => { var _a, _b; if (!current.value) return ""; return current.value.Path || ((_b = (_a = current.value.MediaSources) == null ? void 0 : _a[0]) == null ? void 0 : _b.Path) || "Path Unknown"; }); const imgUrl = computed(() => { if (!current.value) return ""; return `${CONFIG.emby.server}/emby/Items/${current.value.Id}/Images/Primary?maxHeight=300&maxWidth=200&quality=90`; }); const webUrl = computed(() => { if (!current.value) return ""; return `${CONFIG.emby.server}/web/index.html#!/item?id=${current.value.Id}&serverId=${current.value.ServerId || ""}`; }); const techInfo = computed(() => { var _a, _b; if (!((_b = (_a = current.value) == null ? void 0 : _a.MediaSources) == null ? void 0 : _b.length)) return []; const source = current.value.MediaSources[0]; const items = []; const sizeBytes = source.Size || 0; items.push((sizeBytes / (1024 * 1024 * 1024)).toFixed(2) + " GB"); if (source.Container) items.push(source.Container.toUpperCase()); if (source.MediaStreams) { const video = source.MediaStreams.find((s) => s.Type === "Video"); if (video) { if (video.Width && video.Height) items.push(`${video.Width}x${video.Height}`); if (video.Codec) items.push(video.Codec.toUpperCase()); if (video.BitRate) items.push((video.BitRate / 1e6).toFixed(1) + " Mbps"); if (video.BitDepth) items.push(`${video.BitDepth}bit`); } } return items; }); const audioInfo = computed(() => { var _a, _b, _c; if (!((_c = (_b = (_a = current.value) == null ? void 0 : _a.MediaSources) == null ? void 0 : _b[0]) == null ? void 0 : _c.MediaStreams)) return ""; const audios = current.value.MediaSources[0].MediaStreams.filter((s) => s.Type === "Audio"); if (!audios.length) return ""; return "🔊 " + audios.map((a) => { const lang = (a.Language || "und").toUpperCase(); const codec = (a.Codec || "").toUpperCase(); const channels = a.Channels ? a.Channels === 6 ? "5.1" : a.Channels === 8 ? "7.1" : "2.0" : ""; return `${lang} ${codec} ${channels}`.trim(); }).join(" / "); }); const subtitleInfo = computed(() => { var _a, _b, _c; if (!((_c = (_b = (_a = current.value) == null ? void 0 : _a.MediaSources) == null ? void 0 : _b[0]) == null ? void 0 : _c.MediaStreams)) return ""; const subs = current.value.MediaSources[0].MediaStreams.filter((s) => s.Type === "Subtitle"); if (!subs.length) return ""; return "💬 " + subs.map((s) => { const lang = (s.Language || "und").toUpperCase(); const codec = (s.Codec || "").toUpperCase(); const forced = s.IsForced ? "[Forced]" : ""; return `${lang} ${codec}${forced}`.trim(); }).join(" / "); }); return (_ctx, _cache) => { var _a; return openBlock(), createElementBlock("div", _hoisted_1$4, [ __props.items && __props.items.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_2$4, [ createBaseVNode("select", { class: "us-emby-select", value: selectedIndex.value, onChange: _cache[0] || (_cache[0] = ($event) => selectedIndex.value = Number($event.target.value)) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (it, idx) => { return openBlock(), createElementBlock("option", { key: it.Id, value: idx }, toDisplayString(it.Name) + " (" + toDisplayString(it.ProductionYear || "") + ") - " + toDisplayString(it.Type), 9, _hoisted_4$4); }), 128)) ], 40, _hoisted_3$4) ])) : createCommentVNode("", true), createBaseVNode("div", _hoisted_5$4, [ createBaseVNode("div", _hoisted_6$3, [ createBaseVNode("img", { src: imgUrl.value, onError: _cache[1] || (_cache[1] = ($event) => $event.target.style.display = "none") }, null, 40, _hoisted_7$3) ]), createBaseVNode("div", _hoisted_8$3, [ createBaseVNode("div", _hoisted_9$3, [ createTextVNode(toDisplayString(current.value.Name) + " ", 1), createBaseVNode("span", _hoisted_10$3, "(" + toDisplayString(year.value) + ")", 1) ]), createBaseVNode("div", _hoisted_11$3, [ createBaseVNode("span", _hoisted_12$3, toDisplayString(current.value.Type), 1), rating.value ? (openBlock(), createElementBlock("span", _hoisted_13$3, "★ " + toDisplayString(rating.value), 1)) : createCommentVNode("", true) ]), current.value.Type === "Series" && ((_a = current.value.Seasons) == null ? void 0 : _a.length) ? (openBlock(), createElementBlock("div", _hoisted_14$3, [ (openBlock(true), createElementBlock(Fragment, null, renderList(current.value.Seasons, (s) => { return openBlock(), createElementBlock("span", { key: s.Id, class: "us-season-badge" }, toDisplayString(s.Name.replace("Season", "S").replace("Specials", "SP")) + ": " + toDisplayString(s.ChildCount || s.RecursiveItemCount || 0) + "集 ", 1); }), 128)) ])) : current.value.Type === "Series" ? (openBlock(), createElementBlock("div", _hoisted_15$3, toDisplayString(current.value.ChildCount || 0) + " Seasons / " + toDisplayString(current.value.RecursiveItemCount || 0) + " Episodes ", 1)) : createCommentVNode("", true), createBaseVNode("div", _hoisted_16$2, [ _cache[2] || (_cache[2] = createBaseVNode("strong", null, "Path:", -1)), _cache[3] || (_cache[3] = createTextVNode()), createBaseVNode("span", _hoisted_17$2, toDisplayString(path.value), 1) ]), techInfo.value.length ? (openBlock(), createElementBlock("div", _hoisted_18$2, toDisplayString(techInfo.value.join(" • ")), 1)) : createCommentVNode("", true), audioInfo.value ? (openBlock(), createElementBlock("div", _hoisted_19$2, toDisplayString(audioInfo.value), 1)) : createCommentVNode("", true), subtitleInfo.value ? (openBlock(), createElementBlock("div", _hoisted_20$2, toDisplayString(subtitleInfo.value), 1)) : createCommentVNode("", true), createBaseVNode("div", _hoisted_21$1, [ createBaseVNode("a", { href: webUrl.value, target: "_blank", class: "us-btn us-btn-primary" }, "▶ Play on Emby", 8, _hoisted_22$1) ]) ]) ]) ]); }; } }); const _style_0$4 = ".us-emby-section{padding:20px;border-bottom:1px solid #eee;background:#fdfdfd}.us-emby-switcher{margin-bottom:12px}.us-emby-select{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;font-size:13px;color:#333;background:#fff;cursor:pointer}.us-emby-detail-row{display:flex}.us-emby-poster{flex-shrink:0;width:100px;margin-right:20px}.us-emby-poster img{width:100%;border-radius:6px;box-shadow:0 2px 8px #0000001a}.us-emby-info{flex:1}.us-emby-name{font-size:18px;font-weight:700;color:#333;margin-bottom:4px}.us-emby-year{font-weight:400;color:#999;font-size:14px}.us-emby-tags{font-size:13px;color:#666;margin-bottom:8px}.us-emby-type-badge{background:#eee;padding:2px 6px;border-radius:4px;margin-right:6px}.us-emby-rating{color:#f5c518;font-weight:700}.us-season-badges{margin-top:6px;display:flex;flex-wrap:wrap;gap:4px}.us-season-badge{background:#e8f5e9;color:#2e7d32;padding:2px 6px;border-radius:4px;font-size:11px;border:1px solid #c8e6c9}.us-series-count{margin-top:5px;color:#52b54b;font-weight:700}.us-emby-path{font-size:12px;color:#555;margin-top:8px;line-height:1.4}.us-path-value{font-family:monospace;background:#f1f1f1;padding:2px 4px;border-radius:3px;word-break:break-all}.us-tech-info{font-size:12px;color:#999;margin-top:6px}.us-stream-info{font-size:11px;color:#777;margin-top:6px;line-height:1.4}.us-emby-action{margin-top:12px}.us-btn{display:inline-block;padding:4px 8px;border-radius:6px;text-decoration:none;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:background .2s}.us-btn-primary{background:#52b54b;color:#fff}.us-btn-primary:hover{background:#43943d}"; const EmbyCard = _export_sfc(_sfc_main$4, [["styles", [_style_0$4]]]); const _hoisted_1$3 = { class: "us-tmdb-section" }; const _hoisted_2$3 = { key: 0, class: "us-tmdb-switcher" }; const _hoisted_3$3 = ["value"]; const _hoisted_4$3 = ["value"]; const _hoisted_5$3 = { class: "us-tmdb-detail" }; const _hoisted_6$2 = { class: "us-tmdb-poster" }; const _hoisted_7$2 = ["src"]; const _hoisted_8$2 = { key: 1, class: "us-tmdb-no-poster" }; const _hoisted_9$2 = { class: "us-tmdb-info" }; const _hoisted_10$2 = { class: "us-tmdb-title" }; const _hoisted_11$2 = { class: "us-tmdb-meta" }; const _hoisted_12$2 = { class: "us-tmdb-year-badge" }; const _hoisted_13$2 = { class: "us-tmdb-type-badge" }; const _hoisted_14$2 = { class: "us-tmdb-id-badge" }; const _hoisted_15$2 = { class: "us-tmdb-overview" }; const _hoisted_16$1 = { class: "us-tmdb-links" }; const _hoisted_17$1 = ["href"]; const _hoisted_18$1 = { key: 1, class: "us-tmdb-pagination" }; const _hoisted_19$1 = { key: 1, class: "us-tmdb-empty" }; const _hoisted_20$1 = { class: "us-tmdb-empty-title" }; const _sfc_main$3 = defineComponent({ __name: "TmdbCard.ce", props: { results: { type: Array }, title: { type: String } }, setup(__props) { const props = __props; const selectedIndex = ref(0); const current = computed(() => { var _a; if (!((_a = props.results) == null ? void 0 : _a.length)) return null; return props.results[selectedIndex.value] || props.results[0]; }); const posterUrl = computed(() => { var _a; if (!((_a = current.value) == null ? void 0 : _a.posterPath)) return ""; return `https://image.tmdb.org/t/p/w300${current.value.posterPath}`; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", _hoisted_1$3, [ _cache[3] || (_cache[3] = createBaseVNode("div", { class: "us-tmdb-header" }, [ createBaseVNode("span", null, "🎬 影片信息"), createBaseVNode("span", { class: "us-tmdb-not-found-badge" }, "Not in Emby") ], -1)), current.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [ __props.results.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_2$3, [ createBaseVNode("select", { class: "us-tmdb-select", value: selectedIndex.value, onChange: _cache[0] || (_cache[0] = ($event) => selectedIndex.value = Number($event.target.value)) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.results, (item, idx) => { return openBlock(), createElementBlock("option", { key: item.id, value: idx }, toDisplayString(item.title) + " (" + toDisplayString(item.year) + ") ", 9, _hoisted_4$3); }), 128)) ], 40, _hoisted_3$3) ])) : createCommentVNode("", true), createBaseVNode("div", _hoisted_5$3, [ createBaseVNode("div", _hoisted_6$2, [ posterUrl.value ? (openBlock(), createElementBlock("img", { key: 0, src: posterUrl.value, onError: _cache[1] || (_cache[1] = ($event) => $event.target.style.display = "none") }, null, 40, _hoisted_7$2)) : (openBlock(), createElementBlock("div", _hoisted_8$2, "No Poster")) ]), createBaseVNode("div", _hoisted_9$2, [ createBaseVNode("div", _hoisted_10$2, toDisplayString(current.value.title), 1), createBaseVNode("div", _hoisted_11$2, [ createBaseVNode("span", _hoisted_12$2, toDisplayString(current.value.year), 1), createBaseVNode("span", _hoisted_13$2, toDisplayString(current.value.mediaType === "tv" ? "TV" : "Movie"), 1), createBaseVNode("span", _hoisted_14$2, "TMDB: " + toDisplayString(current.value.id), 1) ]), createBaseVNode("div", _hoisted_15$2, toDisplayString(current.value.overview || "暂无简介"), 1), createBaseVNode("div", _hoisted_16$1, [ createBaseVNode("a", { href: `https://www.themoviedb.org/${current.value.mediaType}/${current.value.id}`, target: "_blank", class: "us-btn us-btn-tmdb" }, " Open on TMDB ↗ ", 8, _hoisted_17$1) ]) ]) ]), __props.results.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_18$1, toDisplayString(selectedIndex.value + 1) + " / " + toDisplayString(__props.results.length) + " 个匹配结果 ", 1)) : createCommentVNode("", true) ], 64)) : (openBlock(), createElementBlock("div", _hoisted_19$1, [ createBaseVNode("div", _hoisted_20$1, toDisplayString(__props.title || "Unknown"), 1), _cache[2] || (_cache[2] = createBaseVNode("div", { class: "us-tmdb-empty-text" }, "TMDB 未找到匹配影片", -1)) ])) ]); }; } }); const _style_0$3 = ".us-tmdb-section{padding:20px;border-bottom:1px solid #eee;background:linear-gradient(135deg,#01b4e40a,#00d2ff0a)}.us-tmdb-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:15px;font-weight:700;color:#333}.us-tmdb-not-found-badge{background:#fff3e0;color:#e65100;padding:2px 10px;border-radius:10px;font-size:11px;font-weight:600}.us-tmdb-switcher{margin-bottom:12px}.us-tmdb-select{width:100%;padding:4px 8px;border:1px solid #ccc;border-radius:6px;font-size:12px;color:#333;background:#fff;cursor:pointer}.us-tmdb-detail{display:flex;gap:15px}.us-tmdb-poster{flex-shrink:0;width:110px}.us-tmdb-poster img{width:100%;border-radius:8px;box-shadow:0 3px 10px #00000026}.us-tmdb-no-poster{width:100%;height:160px;background:#f0f0f0;border-radius:8px;display:flex;align-items:center;justify-content:center;color:#999;font-size:12px}.us-tmdb-info{flex:1;min-width:0}.us-tmdb-title{font-size:17px;font-weight:700;color:#333;margin-bottom:6px}.us-tmdb-meta{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}.us-tmdb-year-badge{background:#e3f2fd;color:#1565c0;padding:2px 8px;border-radius:4px;font-size:11px}.us-tmdb-type-badge{background:#fce4ec;color:#c62828;padding:2px 8px;border-radius:4px;font-size:11px}.us-tmdb-id-badge{background:#e8f5e9;color:#2e7d32;padding:2px 8px;border-radius:4px;font-size:11px;font-family:monospace}.us-tmdb-overview{font-size:13px;color:#555;line-height:1.5;max-height:100px;overflow-y:auto;margin-bottom:10px}.us-tmdb-links{margin-top:8px}.us-tmdb-pagination{text-align:center;font-size:11px;color:#999;margin-top:12px;padding-top:8px;border-top:1px dashed #eee}.us-tmdb-empty{text-align:center;padding:20px 0}.us-tmdb-empty-title{font-size:18px;font-weight:700;color:#333;margin-bottom:8px}.us-tmdb-empty-text{font-size:13px;color:#999}.us-btn{display:inline-block;padding:4px 8px;border-radius:6px;text-decoration:none;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:background .2s}.us-btn-tmdb{background:linear-gradient(135deg,#01b4e4,#00d2ff);color:#fff;padding:6px 14px;font-size:12px}.us-btn-tmdb:hover{opacity:.9}"; const TmdbCard = _export_sfc(_sfc_main$3, [["styles", [_style_0$3]]]); class NullbrService extends ApiClient { constructor() { super("Nullbr"); } isConfigured() { return !!(CONFIG.nullbr.appId && CONFIG.nullbr.apiKey); } async get115Resources(tmdbId, mediaType) { if (!this.isConfigured()) { return { data: [], meta: { error: "Nullbr API not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } const cacheKey = this.buildCacheKey("115", mediaType, tmdbId); const url = `${CONFIG.nullbr.baseUrl}/${mediaType}/${tmdbId}/115`; return this.request({ requestFn: async () => { const response = await GM.xmlHttpRequest({ method: "GET", url, responseType: "json", headers: this.getHeaders() }); if (response.status === 200) { const data = JSON.parse(response.responseText); return data["115"] || []; } else if (response.status === 404) { return []; } else { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } }, cacheKey, cacheTTL: CONFIG.nullbr.cacheTTL, useCache: true, useQueue: true }); } async getMagnetResources(tmdbId, mediaType, seasonNumber) { if (!this.isConfigured()) { return { data: [], meta: { error: "Nullbr API not configured", source: this.name, timestamp: ( new Date()).toISOString() } }; } let url; let cacheKey; if (mediaType === "movie") { url = `${CONFIG.nullbr.baseUrl}/movie/${tmdbId}/magnet`; cacheKey = this.buildCacheKey("magnet", "movie", tmdbId); } else { const season = seasonNumber || 1; url = `${CONFIG.nullbr.baseUrl}/tv/${tmdbId}/season/${season}/magnet`; cacheKey = this.buildCacheKey("magnet", "tv", tmdbId, season); } return this.request({ requestFn: async () => { const response = await GM.xmlHttpRequest({ url, headers: this.getHeaders() }); if (response.status === 200) { const data = JSON.parse(response.responseText); return data.magnet || []; } else if (response.status === 404) { return []; } else { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } }, cacheKey, cacheTTL: CONFIG.nullbr.cacheTTL, useCache: true, useQueue: true }); } async getAllResources(tmdbId, mediaType) { const enable115 = CONFIG.nullbr.enable115 !== false; const enableMagnet = CONFIG.nullbr.enableMagnet === true; if (!enable115 && !enableMagnet) { return { items115: [], magnets: [], hasData: false }; } const promises = [ enable115 ? this.get115Resources(tmdbId, mediaType) : Promise.resolve({ data: [], meta: { source: this.name, timestamp: ( new Date()).toISOString() } }), enableMagnet ? this.getMagnetResources(tmdbId, mediaType) : Promise.resolve({ data: [], meta: { source: this.name, timestamp: ( new Date()).toISOString() } }) ]; const [res115, resMagnet] = await Promise.all(promises); const items115 = res115.data || []; const magnets = resMagnet.data || []; return { items115, magnets, hasData: items115.length > 0 || magnets.length > 0 }; } determineTTL(data, defaultTTL) { if (data && (Array.isArray(data) ? data.length > 0 : Object.keys(data).length > 0)) { return defaultTTL; } return 1440; } getHeaders() { return { "X-APP-ID": CONFIG.nullbr.appId || "", "X-API-KEY": CONFIG.nullbr.apiKey || "", "User-Agent": CONFIG.nullbr.userAgent || "" }; } } const nullbrService = new NullbrService(); const _hoisted_1$2 = { key: 0, class: "us-nullbr-section" }; const _hoisted_2$2 = { key: 0, class: "us-nullbr-loading" }; const _hoisted_3$2 = { key: 1, class: "us-nullbr-empty" }; const _hoisted_4$2 = { key: 2, class: "us-nullbr-empty" }; const _hoisted_5$2 = { key: 3 }; const _hoisted_6$1 = { key: 0, style: { "margin-bottom": "12px" } }; const _hoisted_7$1 = { class: "us-section-label" }; const _hoisted_8$1 = { class: "us-resource-list" }; const _hoisted_9$1 = { class: "us-resource-info" }; const _hoisted_10$1 = ["title"]; const _hoisted_11$1 = { class: "us-resource-meta" }; const _hoisted_12$1 = { key: 0, class: "us-resource-tag" }; const _hoisted_13$1 = { key: 1, class: "us-resource-tag" }; const _hoisted_14$1 = { key: 2, class: "us-resource-tag" }; const _hoisted_15$1 = { class: "us-resource-actions" }; const _hoisted_16 = ["href"]; const _hoisted_17 = { key: 1 }; const _hoisted_18 = { class: "us-section-label" }; const _hoisted_19 = { class: "us-resource-list" }; const _hoisted_20 = { class: "us-resource-info" }; const _hoisted_21 = ["title"]; const _hoisted_22 = { class: "us-resource-meta" }; const _hoisted_23 = { key: 0, class: "us-resource-tag" }; const _hoisted_24 = { key: 1, class: "us-resource-tag" }; const _hoisted_25 = { key: 2, class: "us-resource-tag zh-sub" }; const _hoisted_26 = { class: "us-resource-actions" }; const _hoisted_27 = ["href"]; const _hoisted_28 = ["onClick"]; const _hoisted_29 = { key: 1, class: "us-actions" }; const _hoisted_30 = { key: 0, class: "us-status-text" }; const _hoisted_31 = { class: "us-actions-links" }; const _hoisted_32 = ["href"]; const _hoisted_33 = ["href"]; const _hoisted_34 = ["href"]; const _sfc_main$2 = defineComponent({ __name: "ResourceCard.ce", props: { tmdbInfo: { type: [Object, null] }, searchQueries: { type: Array } }, setup(__props) { const props = __props; const nullbrLoading = ref(true); const nullbrItems115 = ref([]); const nullbrMagnets = ref([]); const nullbrError = ref(false); const uniqueQueries = computed(() => { if (!props.searchQueries) return []; return [...new Set(props.searchQueries.filter((q) => q == null ? void 0 : q.trim()))]; }); async function copyMagnet(magnet, event) { const btn = event.target; try { await navigator.clipboard.writeText(magnet); btn.textContent = "已复制"; setTimeout(() => { btn.textContent = "复制"; }, 1500); } catch { GM_setClipboard(magnet); btn.textContent = "已复制"; setTimeout(() => { btn.textContent = "复制"; }, 1500); } } async function loadNullbrResources() { if (!props.tmdbInfo) { nullbrLoading.value = false; return; } try { const resources = await nullbrService.getAllResources(props.tmdbInfo.id, props.tmdbInfo.mediaType); nullbrItems115.value = resources.items115; nullbrMagnets.value = resources.magnets; } catch { nullbrError.value = true; } finally { nullbrLoading.value = false; } } loadNullbrResources(); return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [ __props.tmdbInfo ? (openBlock(), createElementBlock("div", _hoisted_1$2, [ _cache[0] || (_cache[0] = createBaseVNode("div", { class: "us-nullbr-header" }, [ createBaseVNode("span", null, "🔗 网盘 & 磁力资源"), createBaseVNode("span", { class: "us-nullbr-badge" }, "Nullbr") ], -1)), nullbrLoading.value ? (openBlock(), createElementBlock("div", _hoisted_2$2, "正在搜索资源...")) : nullbrError.value ? (openBlock(), createElementBlock("div", _hoisted_3$2, "加载资源失败")) : !nullbrItems115.value.length && !nullbrMagnets.value.length ? (openBlock(), createElementBlock("div", _hoisted_4$2, " 暂无可用资源 ")) : (openBlock(), createElementBlock("div", _hoisted_5$2, [ nullbrItems115.value.length ? (openBlock(), createElementBlock("div", _hoisted_6$1, [ createBaseVNode("div", _hoisted_7$1, "📁 115 网盘分享 (" + toDisplayString(nullbrItems115.value.length) + ")", 1), createBaseVNode("div", _hoisted_8$1, [ (openBlock(true), createElementBlock(Fragment, null, renderList(nullbrItems115.value.slice(0, 5), (item) => { return openBlock(), createElementBlock("div", { key: item.share_link, class: "us-resource-item" }, [ createBaseVNode("div", _hoisted_9$1, [ createBaseVNode("div", { class: "us-resource-title", title: item.title }, toDisplayString(item.title), 9, _hoisted_10$1), createBaseVNode("div", _hoisted_11$1, [ createBaseVNode("span", null, toDisplayString(item.size), 1), item.resolution ? (openBlock(), createElementBlock("span", _hoisted_12$1, toDisplayString(item.resolution), 1)) : createCommentVNode("", true), item.quality ? (openBlock(), createElementBlock("span", _hoisted_13$1, toDisplayString(item.quality), 1)) : createCommentVNode("", true), item.season_list ? (openBlock(), createElementBlock("span", _hoisted_14$1, toDisplayString(item.season_list.join(", ")), 1)) : createCommentVNode("", true) ]) ]), createBaseVNode("div", _hoisted_15$1, [ createBaseVNode("a", { href: item.share_link, target: "_blank", class: "us-resource-btn primary" }, "打开链接", 8, _hoisted_16) ]) ]); }), 128)) ]) ])) : createCommentVNode("", true), nullbrMagnets.value.length ? (openBlock(), createElementBlock("div", _hoisted_17, [ createBaseVNode("div", _hoisted_18, "🧲 磁力链接 (" + toDisplayString(nullbrMagnets.value.length) + ")", 1), createBaseVNode("div", _hoisted_19, [ (openBlock(true), createElementBlock(Fragment, null, renderList(nullbrMagnets.value.slice(0, 5), (item) => { return openBlock(), createElementBlock("div", { key: item.magnet, class: "us-resource-item" }, [ createBaseVNode("div", _hoisted_20, [ createBaseVNode("div", { class: "us-resource-title", title: item.name }, toDisplayString(item.name), 9, _hoisted_21), createBaseVNode("div", _hoisted_22, [ createBaseVNode("span", null, toDisplayString(item.size), 1), item.resolution ? (openBlock(), createElementBlock("span", _hoisted_23, toDisplayString(item.resolution), 1)) : createCommentVNode("", true), item.source ? (openBlock(), createElementBlock("span", _hoisted_24, toDisplayString(item.source), 1)) : createCommentVNode("", true), item.zh_sub ? (openBlock(), createElementBlock("span", _hoisted_25, "中字")) : createCommentVNode("", true) ]) ]), createBaseVNode("div", _hoisted_26, [ createBaseVNode("a", { href: item.magnet, class: "us-resource-btn primary", style: { "text-decoration": "none" } }, "打开", 8, _hoisted_27), createBaseVNode("button", { class: "us-resource-btn secondary", onClick: ($event) => copyMagnet(item.magnet, $event) }, "复制", 8, _hoisted_28) ]) ]); }), 128)) ]) ])) : createCommentVNode("", true) ])) ])) : createCommentVNode("", true), uniqueQueries.value.length ? (openBlock(), createElementBlock("div", _hoisted_29, [ !__props.tmdbInfo ? (openBlock(), createElementBlock("div", _hoisted_30, "Not Found in Library")) : createCommentVNode("", true), createBaseVNode("div", _hoisted_31, [ uniqueQueries.value[0] ? (openBlock(), createElementBlock("a", { key: 0, href: `https://www.gyg.si/s/1---1/${encodeURIComponent(uniqueQueries.value[0])}`, target: "_blank", class: "us-btn us-btn-search" }, "Search GYG", 8, _hoisted_32)) : createCommentVNode("", true), uniqueQueries.value[0] ? (openBlock(), createElementBlock("a", { key: 1, href: `https://bt4gprx.com/search?orderby=size&p=1&q=${encodeURIComponent(uniqueQueries.value[0])}`, target: "_blank", class: "us-btn us-btn-search" }, "Search BT4G", 8, _hoisted_33)) : createCommentVNode("", true), uniqueQueries.value[0] ? (openBlock(), createElementBlock("a", { key: 2, href: `https://dmhy.org/topics/list?keyword=${encodeURIComponent(uniqueQueries.value[0])}&sort_id=2&team_id=0&order=date-desc`, target: "_blank", class: "us-btn us-btn-search" }, "DMHY 搜全集", 8, _hoisted_34)) : createCommentVNode("", true) ]) ])) : createCommentVNode("", true) ], 64); }; } }); const _style_0$2 = ".us-nullbr-section{padding:15px 20px;border-bottom:1px solid #eee;background:linear-gradient(135deg,#667eea0a,#764ba20a)}.us-nullbr-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-weight:700;color:#333}.us-nullbr-badge{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:2px 8px;border-radius:10px;font-size:11px}.us-nullbr-loading{text-align:center;color:#999;padding:20px}.us-nullbr-empty{text-align:center;color:#999;padding:15px;font-size:13px}.us-section-label{font-size:12px;font-weight:700;color:#666;margin-bottom:8px}.us-resource-list{display:flex;flex-direction:column;gap:8px;max-height:200px;overflow-y:auto}.us-resource-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#fff;border-radius:6px;border:1px solid #e0e0e0;font-size:12px;transition:all .2s}.us-resource-item:hover{border-color:#667eea;box-shadow:0 2px 6px #667eea26}.us-resource-info{flex:1;min-width:0}.us-resource-title{font-weight:500;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}.us-resource-meta{display:flex;gap:8px;margin-top:3px;color:#888;font-size:11px}.us-resource-tag{background:#f0f0f0;padding:1px 5px;border-radius:3px}.us-resource-tag.zh-sub{background:#e8f5e9;color:#388e3c}.us-resource-actions{display:flex;gap:6px}.us-resource-btn{padding:4px 10px;border-radius:4px;border:none;cursor:pointer;font-size:11px;transition:all .2s;text-decoration:none}.us-resource-btn.primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.us-resource-btn.primary:hover{opacity:.9}.us-resource-btn.secondary{background:#f5f5f5;color:#666}.us-resource-btn.secondary:hover{background:#e0e0e0}.us-actions{padding:20px;border-bottom:1px solid #eee;text-align:center}.us-status-text{font-size:16px;font-weight:700;margin-bottom:15px;color:#9e9e9e}.us-actions-links{display:flex;gap:10px;flex-wrap:wrap}.us-btn{display:inline-block;padding:4px 8px;border-radius:6px;text-decoration:none;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:background .2s}.us-btn-search{background:#eef9fd;color:#01b4e4;border:1px solid #b3e5fc}.us-btn-search:hover{background:#e1f5fe;color:#008dba}"; const ResourceCard = _export_sfc(_sfc_main$2, [["styles", [_style_0$2]]]); const _hoisted_1$1 = { class: "us-modal" }; const _hoisted_2$1 = { class: "us-modal-header" }; const _hoisted_3$1 = { class: "us-modal-title" }; const _hoisted_4$1 = { class: "us-modal-body" }; const _hoisted_5$1 = { class: "us-modal-footer" }; const _sfc_main$1 = defineComponent({ __name: "InfoCard.ce", props: { title: { type: String }, embyItem: { type: [Object, null] }, embyItems: { type: Array }, searchQueries: { type: Array }, tmdbInfo: { type: Object }, tmdbResults: { type: Array }, visible: { type: Boolean } }, emits: ["close"], setup(__props, { emit: __emit }) { const props = __props; const emit2 = __emit; const hasEmby = computed(() => { var _a; return !!(((_a = props.embyItems) == null ? void 0 : _a.length) || props.embyItem); }); const firstEmbyItem = computed(() => { var _a; return ((_a = props.embyItems) == null ? void 0 : _a[0]) || props.embyItem || null; }); const effectiveTmdbInfo = computed(() => { var _a; if (props.tmdbInfo) return props.tmdbInfo; if ((_a = props.tmdbResults) == null ? void 0 : _a.length) { const first = props.tmdbResults[0]; return { id: first.id, mediaType: first.mediaType }; } const emby = firstEmbyItem.value; if (emby) { const providerIds = emby.ProviderIds; const tmdbId = (providerIds == null ? void 0 : providerIds.Tmdb) || (providerIds == null ? void 0 : providerIds.tmdb); if (tmdbId) { const mediaType = emby.Type === "Series" ? "tv" : "movie"; return { id: Number(tmdbId), mediaType }; } } return null; }); function onOverlayClick(e) { if (e.target.classList.contains("us-modal-overlay")) { emit2("close"); } } return (_ctx, _cache) => { return __props.visible ? (openBlock(), createElementBlock("div", { key: 0, class: "us-modal-overlay", onClick: onOverlayClick }, [ createBaseVNode("div", _hoisted_1$1, [ createBaseVNode("div", _hoisted_2$1, [ createBaseVNode("div", _hoisted_3$1, toDisplayString(__props.title), 1), createBaseVNode("div", { class: "us-modal-close", onClick: _cache[0] || (_cache[0] = ($event) => emit2("close")) }, "×") ]), createBaseVNode("div", _hoisted_4$1, [ firstEmbyItem.value ? (openBlock(), createBlock(EmbyCard, { key: 0, item: firstEmbyItem.value, items: __props.embyItems }, null, 8, ["item", "items"])) : createCommentVNode("", true), !hasEmby.value ? (openBlock(), createBlock(TmdbCard, { key: 1, results: __props.tmdbResults || [], title: __props.title }, null, 8, ["results", "title"])) : createCommentVNode("", true), createVNode(ResourceCard, { "tmdb-info": effectiveTmdbInfo.value, "search-queries": __props.searchQueries }, null, 8, ["tmdb-info", "search-queries"]) ]), createBaseVNode("div", _hoisted_5$1, [ createBaseVNode("button", { class: "us-btn us-btn-outline", onClick: _cache[1] || (_cache[1] = ($event) => emit2("close")) }, "Close") ]) ]) ])) : createCommentVNode("", true); }; } }); const _style_0$1 = ":host{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;pointer-events:none}:host([visible]){pointer-events:auto}*{box-sizing:border-box}.us-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#0009;z-index:10000;display:flex;justify-content:center;align-items:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);pointer-events:auto}.us-modal{background:#fff;width:500px;max-width:90%;max-height:85vh;border-radius:12px;display:flex;flex-direction:column;box-shadow:0 10px 25px #0000004d;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden}.us-modal-header{padding:15px 20px;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center;background:#f8f9fa}.us-modal-title{font-weight:700;font-size:16px;color:#333}.us-modal-close{cursor:pointer;font-size:20px;color:#999;line-height:1}.us-modal-close:hover{color:#333}.us-modal-body{flex:1;overflow-y:auto;padding:0}.us-modal-footer{padding:15px;background:#f8f9fa;text-align:right;border-top:1px solid #eee}.us-btn{display:inline-block;padding:4px 8px;border-radius:6px;text-decoration:none;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:background .2s}.us-btn-outline{background:#fff;color:#333;border:1px solid #ddd}.us-btn-outline:hover{background:#f5f5f5}"; const InfoCardCE = _export_sfc(_sfc_main$1, [["styles", [_style_0$1]]]); const _hoisted_1 = { class: "us-settings-modal" }; const _hoisted_2 = { class: "us-settings-row" }; const _hoisted_3 = { class: "us-settings-row" }; const _hoisted_4 = { class: "us-settings-row" }; const _hoisted_5 = { class: "us-settings-row" }; const _hoisted_6 = { class: "us-settings-row" }; const _hoisted_7 = { class: "us-checkbox-group" }; const _hoisted_8 = { class: "us-checkbox-label" }; const _hoisted_9 = { class: "us-checkbox-label" }; const _hoisted_10 = { class: "us-settings-actions" }; const _hoisted_11 = { class: "us-cache-info" }; const _hoisted_12 = { key: 0, class: "us-cache-stats" }; const _hoisted_13 = { class: "us-cache-key" }; const _hoisted_14 = { key: 0, class: "us-cache-more" }; const _hoisted_15 = { class: "us-settings-actions" }; const _sfc_main = defineComponent({ __name: "Settings.ce", props: { visible: { type: Boolean }, mode: { type: String } }, emits: ["close"], setup(__props, { emit: __emit }) { const emit2 = __emit; const tmdbApiKey = ref(""); const embyServer = ref(""); const embyApiKey = ref(""); const bangumiToken = ref(""); const nullbrEnable115 = ref(true); const nullbrEnableMagnet = ref(false); const saved = ref(false); const cacheKeys = ref([]); const cacheCount = computed(() => cacheKeys.value.length); onMounted(() => { tmdbApiKey.value = CONFIG.tmdb.apiKey || ""; embyServer.value = CONFIG.emby.server || ""; embyApiKey.value = CONFIG.emby.apiKey || ""; bangumiToken.value = CONFIG.bangumi.apiKey || ""; nullbrEnable115.value = CONFIG.nullbr.enable115 !== false; nullbrEnableMagnet.value = CONFIG.nullbr.enableMagnet === true; refreshCacheKeys(); }); function refreshCacheKeys() { cacheKeys.value = cache.listKeys(); } function saveSettings() { configService.update("tmdb", { apiKey: tmdbApiKey.value }); configService.update("emby", { server: embyServer.value, apiKey: embyApiKey.value }); configService.update("bangumi", { apiKey: bangumiToken.value }); configService.update("nullbr", { enable115: nullbrEnable115.value, enableMagnet: nullbrEnableMagnet.value }); saved.value = true; setTimeout(() => { saved.value = false; }, 2e3); } function clearCache(filter) { if (filter) { cache.clear([filter]); } else { cache.clear(); } refreshCacheKeys(); } function onOverlayClick(e) { if (e.target.classList.contains("us-settings-overlay")) { emit2("close"); } } return (_ctx, _cache) => { return __props.visible ? (openBlock(), createElementBlock("div", { key: 0, class: "us-settings-overlay", onClick: onOverlayClick }, [ createBaseVNode("div", _hoisted_1, [ __props.mode === "settings" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [ _cache[18] || (_cache[18] = createBaseVNode("h3", { class: "us-settings-title" }, "脚本设置 / Settings", -1)), createBaseVNode("div", _hoisted_2, [ _cache[11] || (_cache[11] = createBaseVNode("label", { class: "us-settings-label" }, "TMDB API Key", -1)), withDirectives(createBaseVNode("input", { "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => tmdbApiKey.value = $event), class: "us-settings-input", type: "text", placeholder: "Enter TMDB API Key" }, null, 512), [ [vModelText, tmdbApiKey.value] ]) ]), createBaseVNode("div", _hoisted_3, [ _cache[12] || (_cache[12] = createBaseVNode("label", { class: "us-settings-label" }, "Emby Server URL", -1)), withDirectives(createBaseVNode("input", { "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => embyServer.value = $event), class: "us-settings-input", type: "text", placeholder: "http://your-emby-server:8096" }, null, 512), [ [vModelText, embyServer.value] ]) ]), createBaseVNode("div", _hoisted_4, [ _cache[13] || (_cache[13] = createBaseVNode("label", { class: "us-settings-label" }, "Emby API Key", -1)), withDirectives(createBaseVNode("input", { "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => embyApiKey.value = $event), class: "us-settings-input", type: "text", placeholder: "Enter Emby API Key" }, null, 512), [ [vModelText, embyApiKey.value] ]) ]), createBaseVNode("div", _hoisted_5, [ _cache[14] || (_cache[14] = createBaseVNode("label", { class: "us-settings-label" }, "Bangumi Token", -1)), withDirectives(createBaseVNode("input", { "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => bangumiToken.value = $event), class: "us-settings-input", type: "text", placeholder: "Enter Bangumi Token" }, null, 512), [ [vModelText, bangumiToken.value] ]) ]), createBaseVNode("div", _hoisted_6, [ _cache[17] || (_cache[17] = createBaseVNode("label", { class: "us-settings-label" }, "Nullbr 资源搜索 / Resource Search", -1)), createBaseVNode("div", _hoisted_7, [ createBaseVNode("label", _hoisted_8, [ withDirectives(createBaseVNode("input", { "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => nullbrEnable115.value = $event), type: "checkbox", class: "us-checkbox" }, null, 512), [ [vModelCheckbox, nullbrEnable115.value] ]), _cache[15] || (_cache[15] = createBaseVNode("span", null, "115 网盘资源搜索", -1)) ]), createBaseVNode("label", _hoisted_9, [ withDirectives(createBaseVNode("input", { "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => nullbrEnableMagnet.value = $event), type: "checkbox", class: "us-checkbox" }, null, 512), [ [vModelCheckbox, nullbrEnableMagnet.value] ]), _cache[16] || (_cache[16] = createBaseVNode("span", null, "磁链资源搜索", -1)) ]) ]) ]), createBaseVNode("div", _hoisted_10, [ createBaseVNode("button", { class: "us-button us-button-secondary", onClick: _cache[6] || (_cache[6] = ($event) => emit2("close")) }, "取消 / Cancel"), createBaseVNode("button", { class: "us-button us-button-primary", onClick: saveSettings }, toDisplayString(saved.value ? "✓ 已保存" : "保存 / Save"), 1) ]) ], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [ _cache[19] || (_cache[19] = createBaseVNode("h3", { class: "us-settings-title" }, "缓存管理 / Cache", -1)), createBaseVNode("div", _hoisted_11, [ createBaseVNode("span", null, "当前缓存数量: " + toDisplayString(cacheCount.value), 1) ]), cacheCount.value > 0 ? (openBlock(), createElementBlock("div", _hoisted_12, [ (openBlock(true), createElementBlock(Fragment, null, renderList(cacheKeys.value.slice(0, 20), (key) => { return openBlock(), createElementBlock("div", { class: "us-cache-stat-row", key }, [ createBaseVNode("span", _hoisted_13, toDisplayString(key), 1) ]); }), 128)), cacheKeys.value.length > 20 ? (openBlock(), createElementBlock("div", _hoisted_14, " ... and " + toDisplayString(cacheKeys.value.length - 20) + " more ", 1)) : createCommentVNode("", true) ])) : createCommentVNode("", true), createBaseVNode("div", _hoisted_15, [ createBaseVNode("button", { class: "us-button us-button-secondary", onClick: _cache[7] || (_cache[7] = ($event) => emit2("close")) }, "关闭 / Close"), createBaseVNode("button", { class: "us-button us-button-danger", onClick: _cache[8] || (_cache[8] = ($event) => clearCache("tmdb")) }, "清除 TMDB"), createBaseVNode("button", { class: "us-button us-button-danger", onClick: _cache[9] || (_cache[9] = ($event) => clearCache("emby")) }, "清除 Emby"), createBaseVNode("button", { class: "us-button us-button-danger", onClick: _cache[10] || (_cache[10] = ($event) => clearCache()) }, "清除全部") ]) ], 64)) ]) ])) : createCommentVNode("", true); }; } }); const _style_0 = ":host{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;pointer-events:none}:host([visible]){pointer-events:auto}*{box-sizing:border-box}.us-settings-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;z-index:9999;display:flex;justify-content:center;align-items:center;pointer-events:auto}.us-settings-modal{background:#fff;padding:20px;border-radius:8px;width:400px;max-width:90%;box-shadow:0 4px 12px #00000026;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.us-settings-title{margin-top:0;margin-bottom:20px;font-size:18px;color:#333}.us-settings-row{margin-bottom:15px}.us-settings-label{display:block;font-weight:700;margin-bottom:5px;color:#333;font-size:13px}.us-settings-input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box;font-size:13px;font-family:inherit}.us-settings-input:focus{outline:none;border-color:#01b4e4;box-shadow:0 0 0 2px #01b4e433}.us-settings-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.us-button{padding:8px 16px;border-radius:4px;cursor:pointer;border:none;font-weight:700;font-size:13px;transition:opacity .2s}.us-button:hover{opacity:.85}.us-button-primary{background:#01b4e4;color:#fff}.us-button-secondary{background:#eee;color:#333}.us-button-danger{background:#dc3545;color:#fff}.us-cache-info{font-size:14px;color:#666;margin-bottom:12px;padding:10px;background:#f8f9fa;border-radius:4px}.us-cache-stats{max-height:200px;overflow-y:auto;border:1px solid #eee;border-radius:4px;margin-bottom:12px}.us-cache-stat-row{padding:6px 10px;border-bottom:1px solid #f0f0f0;font-size:12px}.us-cache-stat-row:last-child{border-bottom:none}.us-cache-key{font-family:monospace;color:#555;word-break:break-all}.us-cache-more{padding:8px 10px;color:#999;font-size:12px;text-align:center}.us-checkbox-group{display:flex;flex-direction:column;gap:8px}.us-checkbox-label{display:flex;align-items:center;gap:8px;font-size:13px;color:#333;cursor:pointer;-webkit-user-select:none;user-select:none}.us-checkbox{width:16px;height:16px;cursor:pointer;accent-color:#01b4e4}"; const SettingsCE = _export_sfc(_sfc_main, [["styles", [_style_0]]]); const StatusDotElement = defineCustomElement(StatusDotCE); const InfoCardElement = defineCustomElement(InfoCardCE); const SettingsElement = defineCustomElement(SettingsCE); customElements.define("us-status-dot", StatusDotElement); customElements.define("us-info-card", InfoCardElement); customElements.define("us-settings", SettingsElement); GM.addStyle(` .tmdb-wrapper { animation: fadeIn 0.5s ease; display: flex; flex-direction: column; gap: 10px; } .gyg-card { display: flex; flex-direction: column; padding: 10px; background: white; border-radius: 8px; border: 1px solid #eee; box-shadow: 0 1px 4px rgba(0,0,0,0.05); transition: all 0.2s; } .tmdb-header-row { display: flex; justify-content: space-between; align-items: center; cursor: pointer; } .tmdb-source { font-size: 12px; color: #888; font-weight: bold; } .tmdb-score { font-size: 20px; font-weight: bold; color: #01b4e4; } .tmdb-copy-area { margin-top: 8px; padding-top: 8px; border-top: 1px dashed #ddd; font-size: 13px; color: #555; cursor: copy; position: relative; transition: color 0.2s; display: flex; align-items: center; justify-content: space-between; } .tmdb-copy-area:hover { color: #01b4e4; } .emby-card { display: flex; flex-direction: row; justify-content: space-between; align-items: center; cursor: pointer; } .emby-card:hover { background: rgba(0,0,0,0.02); } .emby-label { font-size: 13px; font-weight: bold; color: #333; } .emby-badge { padding: 2px 8px; border-radius: 4px; color: white; font-weight: bold; font-size: 11px; } .emby-yes { background-color: #52B54B; } .emby-no { background-color: #999; } .emby-loading { background-color: #ddd; color: #666; } .douban-aside-box { margin-bottom: 30px; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } `); const configs = [ doubanConfig, gygConfig, dmhyConfig ]; (function() { GM_registerMenuCommand("设置 / Settings", () => { showSettings("settings"); }); GM_registerMenuCommand("清除缓存 / Clear Cache", () => { showSettings("cache"); }); const url = location.href; for (const config of configs) { if (config.match(url)) { adapterEngine.run(config); break; } } })(); function showSettings(mode) { const existing = document.querySelector("us-settings"); if (existing) existing.remove(); const settings = document.createElement("us-settings"); settings.setAttribute("visible", "true"); settings.setAttribute("mode", mode); settings.addEventListener("close", () => { settings.remove(); }); document.body.appendChild(settings); } })();