plab-ultra

Userscript for PornoLab.Net

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         plab-ultra
// @namespace    https://github.com/clangmoyai/plab-ultra
// @version      2026.05.28
// @author       clangmoyai
// @description  Userscript for PornoLab.Net
// @license      MIT
// @icon         https://github.com/clangmoyai/plab-ultra/raw/main/src/assets/logo64.png
// @homepage     https://github.com/clangmoyai/plab-ultra
// @supportURL   https://github.com/clangmoyai/plab-ultra/issues
// @match        https://pornolab.net/forum/viewtopic.php*
// @tag          pornolab
// @tag          pornolab.net
// @connect      *
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @run-at       document-start
// ==/UserScript==

(function() {
  'use strict';
	var s = new Set();
	var _css = async (t) => {
		if (s.has(t)) return;
		s.add(t);
		((c) => {
			if (typeof GM_addStyle === "function") GM_addStyle(c);
			else (document.head || document.documentElement).appendChild(document.createElement("style")).append(c);
		})(t);
	};
	_css(" .ultra-logo.svelte-zne36e{vertical-align:top;width:16px;margin:0 .45rem 0 0;display:inline-flex}.ultra-logo.svelte-zne36e:hover{cursor:pointer}#x-header.svelte-zne36e{--header-height:4.5rem;margin-bottom:var(--content-margin);min-height:var(--header-height);grid-template-columns:auto 1fr;column-gap:1rem;display:grid}.floatingDownload.svelte-zne36e{padding-right:5rem}.logo.svelte-zne36e{height:var(--header-height)}.logo.svelte-zne36e img:where(.svelte-zne36e){border-radius:var(--border-radius-large);height:100%}.align-right.svelte-zne36e{justify-content:flex-end;min-width:0;display:flex}.container.svelte-zne36e{flex-direction:column;row-gap:1rem;min-width:0;display:flex}.links.svelte-zne36e{flex-wrap:nowrap;justify-content:end;min-width:0;display:flex}.unread.svelte-zne36e{color:var(--highlighted);filter:brightness(1.25)}.item.svelte-zne36e{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.item.svelte-zne36e+.item:where(.svelte-zne36e):before{content:\"|\";color:var(--post-border-color);margin:0 .8rem;display:inline-block;transform:translateY(-1px)}.search.svelte-zne36e{gap:.5rem;display:flex}.search.svelte-zne36e input:where(.svelte-zne36e){border:1px solid var(--post-border-color);min-width:0;color:var(--search-color);border-radius:var(--border-radius-small);flex:auto;padding:.3rem .5rem .4rem;font-family:inherit;background:var(--input-bg)!important;font-size:.8rem!important}.search.svelte-zne36e button:where(.svelte-zne36e){border-radius:var(--border-radius-small);width:1.75rem;background:var(--input-bg)!important;border:1px solid var(--post-border-color)!important}.incognito.svelte-zne36e{filter:var(--incognito-filter)!important}.themeIcon.svelte-zne36e a,.themeIcon.svelte-zne36e a:hover{text-decoration:none!important}@media (width<=768px){#x-header.svelte-zne36e{grid-template-columns:1fr}.logo.svelte-zne36e{display:none}.container.svelte-zne36e{width:100%}}.container.svelte-1emp0k3{justify-content:space-between;gap:1.15rem;display:flex}.column.svelte-1emp0k3{flex-direction:column;gap:.75rem;display:flex;overflow:hidden}h2.svelte-1emp0k3{white-space:nowrap;text-overflow:ellipsis;margin:0 0 .25rem;font-size:1rem;font-weight:500;overflow:hidden}input[type=checkbox].svelte-1emp0k3{margin:4px}label.svelte-1emp0k3{align-items:center;gap:.5rem;display:flex}.disabled.svelte-1emp0k3{cursor:default;text-decoration:line-through}span.svelte-1emp0k3{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.description.svelte-1emp0k3{opacity:.5}input[type=checkbox].svelte-1emp0k3:disabled{cursor:default}@media (width<=1200px){.container.svelte-1emp0k3{grid-template-rows:repeat(2,auto);grid-template-columns:repeat(3,1fr);justify-content:stretch;gap:1rem;display:grid}.column.svelte-1emp0k3{min-width:0}}@media (width<=768px){.container.svelte-1emp0k3{flex-direction:column;gap:1rem;display:flex}.column.svelte-1emp0k3{width:100%;min-width:0}}button.svelte-1obhcw8{all:unset;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:var(--border-radius-small);color:#fff;transition:background-color opacity 1.8s ease-in-out;justify-content:center;align-items:center;padding:.4rem .5rem;font-family:inherit;font-size:.8rem;font-weight:500;display:flex;background:var(--button-color)!important;border:none!important}button.svelte-1obhcw8:disabled{opacity:.5;cursor:not-allowed;background-color:var(--post-border-color)!important}svg.svelte-1obhcw8{position:absolute}svg.svelte-1obhcw8 path:where(.svelte-1obhcw8){transform-origin:50%;fill:#fff}.container.svelte-1hugea{justify-content:space-between;align-items:center;margin-top:1rem;display:flex}.align-right.svelte-1hugea{gap:.5rem;display:flex}.container.svelte-kvmnko{flex-direction:column;margin-top:1.25rem;display:flex}.item.svelte-kvmnko{grid-template-columns:min-content minmax(0,10rem) 1fr auto;align-items:center;gap:.75rem;min-width:0;margin-bottom:.5rem;display:grid}img.svelte-kvmnko{flex-shrink:0;width:.9rem;height:.9rem}input[type=text].svelte-kvmnko{border:1px solid var(--post-border-color);border-radius:var(--border-radius-small);color:inherit;font:inherit;min-width:0;padding:.3rem .5rem .4rem;background:var(--input-bg)!important;font-size:.8rem!important}button.svelte-kvmnko{border-radius:var(--border-radius-small);-webkit-user-select:none;user-select:none;justify-content:center;align-items:flex-end;width:1.5rem;height:1.5rem;font-size:1.2rem;display:flex;color:#fff!important;background:#a62f2fbf!important;border:none!important}button.svelte-kvmnko:hover{background:#a62f2f!important}div.svelte-1kxfd5y{background:var(--post-bg);border:1px solid var(--post-border-color);border-radius:var(--border-radius-large);margin-bottom:var(--content-margin);flex-flow:column;padding:.9rem 1rem 1rem;font-family:inherit;font-size:.8rem;display:flex;position:relative;overflow:hidden}button.svelte-1kxfd5y{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;flex-shrink:0;font-size:1.5rem;position:absolute;top:.6rem;right:.6rem;background:0 0!important}div.svelte-wvkwp9{z-index:9999;border-radius:var(--border-radius-large);border:1px solid var(--post-border-color);padding:.35rem;position:fixed;top:1.3rem;right:2.5rem;background-color:#009c3c!important}button.svelte-wvkwp9{cursor:pointer;aspect-ratio:1;--size:1.7rem;width:var(--size);width:var(--size);background-color:#fff!important}.ic--sharp-download.svelte-wvkwp9{--svg:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M19 9h-4V3H9v6H5l7 7zM5 18v2h14v-2z'/%3E%3C/svg%3E\");-webkit-mask-image:var(--svg);-webkit-mask-image:var(--svg);mask-image:var(--svg);background-color:currentColor;display:inline-block;-webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.container.svelte-vtocc6{z-index:2;padding-top:.2rem;position:absolute;transform:translate(-50%)}.indicator.svelte-vtocc6{border-left:8px solid #0000;border-right:8px solid #0000;border-bottom:7px solid var(--post-border-color);position:absolute;left:calc(50% - 8px)}.items.svelte-vtocc6{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:var(--border-radius-large);-webkit-user-select:none;user-select:none;border:1px solid var(--post-border-color);background:var(--overlay-bg);white-space:nowrap;margin-top:7px;position:relative;box-shadow:0 25px 50px -12px #00000040}.items.svelte-vtocc6 img:where(.svelte-vtocc6){-webkit-user-drag:none;width:1rem;height:1rem}.items.svelte-vtocc6 a:where(.svelte-vtocc6){-webkit-user-drag:none;align-items:center;gap:.75rem;padding:.5rem 1rem;font-size:.9rem;font-weight:500;text-decoration:none;display:flex}.items.svelte-vtocc6 a:where(.svelte-vtocc6):hover{color:unset}.items.svelte-vtocc6 a:where(.svelte-vtocc6):first-of-type{padding-top:.9rem}.items.svelte-vtocc6 a:where(.svelte-vtocc6):last-of-type{padding-bottom:1rem}#x-title.svelte-1gft3h5{margin-top:0;margin-bottom:var(--content-margin);font-size:1.375rem}.original-title.svelte-1gft3h5{text-decoration:none}.title-item.svelte-1gft3h5{color:unset;text-decoration:none}.title-item.svelte-1gft3h5:hover,.title-item--hover{cursor:pointer;color:var(--link-color)!important;text-decoration:underline!important}button.svelte-1ai34w7{all:unset;cursor:pointer;background:0 0!important}button.svelte-1ai34w7:disabled{cursor:text;-webkit-user-select:text;user-select:text}#thx-btn{all:unset!important}#x-stats.svelte-cjprq{margin-bottom:var(--content-margin);flex-wrap:wrap;gap:.8rem;font-size:.8rem;font-weight:500;display:flex}.item.svelte-cjprq:not(:last-child):after{content:\"|\";color:var(--post-border-color);margin-left:.8rem;display:inline-block;transform:translateY(-1px)}button.svelte-cjprq{all:unset;cursor:pointer;background:0 0!important}button.svelte-cjprq:disabled{cursor:text;-webkit-user-select:text;user-select:text}.seeders.svelte-cjprq{color:var(--seed-color)}.leechers.svelte-cjprq,.error.svelte-cjprq{color:var(--leech-color)}#x-tags.svelte-ttnt4a{margin-bottom:var(--content-margin);flex-wrap:wrap;gap:.35rem;display:flex}.tag-item.svelte-ttnt4a{border-radius:var(--border-radius-small);white-space:nowrap;cursor:pointer;opacity:.75;color:var(--tag-color);background-color:var(--tag-bg);justify-content:center;align-items:center;gap:.35rem;padding:.25rem .6rem .255rem;font-size:.7rem;font-weight:500;text-decoration:none;transition:opacity .15s ease-in-out;display:inline-flex}.tag-item.svelte-ttnt4a:hover,.tag-item--hover{opacity:1!important;text-decoration:none!important}.tag-res.svelte-ttnt4a{opacity:1;background:var(--highlighted)!important;color:#fff!important}.filelist.svelte-1xito9{background:var(--post-bg);border:1px solid var(--post-border-color);border-radius:var(--border-radius-large);margin-bottom:var(--content-margin);padding:.75rem}.filelist.svelte-1xito9 i{color:var(--link-color);font-style:normal;font-weight:500}div.svelte-x5vner{column-fill:balance;column-gap:.75rem}.dragging.svelte-x5vner{cursor:ew-resize}.loader.svelte-bb97q4{pointer-events:none;width:15%;height:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}svg.svelte-bb97q4{will-change:transform;width:100%;height:auto}svg.svelte-bb97q4 path:where(.svelte-bb97q4){fill:#fff}.animate.svelte-bb97q4{transform-origin:50%;animation:1s linear infinite svelte-bb97q4-spin}@keyframes svelte-bb97q4-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.debug.svelte-swtc1e{background:var(--button-color);color:#fff;-webkit-user-select:text;user-select:text;word-wrap:break-word;flex-direction:column;gap:.4rem;width:-webkit-fill-available;padding:1rem;font-family:monospace;display:flex;position:relative}.debug.svelte-swtc1e a:where(.svelte-swtc1e){color:#fff;text-decoration:none;display:contents}.debug.svelte-swtc1e p:where(.svelte-swtc1e){word-break:break-all}.error.svelte-swtc1e{color:red}.copy.svelte-swtc1e{cursor:pointer;border:none;flex-shrink:0;font-size:1.5rem;position:absolute;top:.5rem;right:.5rem;background:0 0!important}svg.svelte-swtc1e path:where(.svelte-swtc1e){transform-origin:50%;fill:#fff;transform:translateY(2px)}.image-columns.svelte-1bzlgy6{z-index:2;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:0 0 0 var(--border-radius-large);border:1px solid var(--post-border-color);grid-template-columns:auto auto 1fr;height:1.25rem;padding:.75rem;transition:box-shadow .2s ease-in-out;display:flex;position:absolute;top:-1px;right:-1px;box-shadow:0 25px 50px -12px #0000;background:0 0!important;background:var(--overlay-bg)!important}.image-columns.svelte-1bzlgy6:hover{box-shadow:0 25px 50px -12px #00000040}svg.svelte-1bzlgy6{--size:1.25rem;width:var(--size);height:var(--size);fill:#fff;opacity:.75;mix-blend-mode:difference}.slider.svelte-1bzlgy6{gap:.55rem;display:flex}input.svelte-1bzlgy6{margin-left:.75rem}.value.svelte-1bzlgy6{--size:1.25rem;width:var(--size);height:var(--size);background:var(--tag-bg);-webkit-user-select:none;user-select:none;border-radius:50%;justify-content:center;align-items:center;font-size:.75rem;font-weight:500;display:flex}.value.svelte-1bzlgy6 .text:where(.svelte-1bzlgy6){color:var(--tag-color);margin-top:-1px}.section.svelte-27jg01{margin-bottom:var(--content-margin);justify-items:center;padding:1rem;display:grid;position:relative}a.svelte-27jg01{display:block;position:relative;overflow:hidden}.container.svelte-27jg01{border-radius:var(--border-radius-small);break-inside:avoid;height:min-content;margin-bottom:.75rem;overflow:hidden}img.svelte-27jg01{-webkit-user-select:none;user-select:none;will-change:width;word-break:break-all;border:none;flex:1 0 100%;width:100%;height:auto;display:block}a.gif.svelte-27jg01{width:fit-content}img.gif.svelte-27jg01{width:auto;max-width:100%}.incognito.svelte-27jg01{filter:var(--incognito-filter)!important}.dragging.svelte-27jg01 a:where(.svelte-27jg01),.dragging.svelte-27jg01 img:where(.svelte-27jg01){pointer-events:none}.forumline.svelte-wfy26x{flex-direction:column;align-items:center;padding:1rem;display:flex;position:relative}.section.svelte-wfy26x{margin-bottom:var(--content-margin)}a.svelte-wfy26x{color:#4da3ff;text-decoration:none}a.svelte-wfy26x:hover{text-decoration:underline}.post.svelte-wfy26x{border-bottom:1px solid var(--post-border-color);gap:1rem;padding:1rem;display:flex}.post.svelte-wfy26x:nth-child(2n){background-color:var(--post-odd-bg)}.post.svelte-wfy26x:last-child{border-bottom:none}.avatar.svelte-wfy26x img:where(.svelte-wfy26x){border-radius:var(--border-radius-small);object-fit:cover;border:1px solid var(--post-border-color);width:48px;height:48px}.no-avatar.svelte-wfy26x{text-align:center;background:var(--main-bg);border:1px solid var(--post-border-color);border-radius:var(--border-radius-small);cursor:pointer;justify-content:center;align-items:center;width:48px;height:48px;font-size:1.3rem;line-height:48px;display:flex;overflow:clip}.no-avatar.svelte-wfy26x svg:where(.svelte-wfy26x){width:55%;height:55%}.no-avatar.svelte-wfy26x:hover{text-decoration:none!important}.content.svelte-wfy26x{flex:1}.header.svelte-wfy26x{color:#bbb;align-items:center;gap:.5rem;margin-block-end:.4rem;font-size:.8rem;display:flex}.nick.svelte-wfy26x{font-weight:600}.date.svelte-wfy26x{all:unset!important;color:var(--post-date-color)!important;opacity:.8!important;cursor:pointer!important;font-weight:400!important}.date.svelte-wfy26x:hover{opacity:1!important}.message.svelte-wfy26x{margin:0;line-height:1.4}#ultra-pagination.svelte-dlb7of{margin-bottom:var(--content-margin);justify-content:space-between;font-size:.75rem;font-weight:600;display:flex}#ultra-pagination a{text-decoration:none!important}\n/*$vite$:1*/ ");
	var is_array = Array.isArray;
	var index_of = Array.prototype.indexOf;
	var includes = Array.prototype.includes;
	var array_from = Array.from;
	var define_property = Object.defineProperty;
	var get_descriptor = Object.getOwnPropertyDescriptor;
	var get_descriptors = Object.getOwnPropertyDescriptors;
	var object_prototype = Object.prototype;
	var array_prototype = Array.prototype;
	var get_prototype_of = Object.getPrototypeOf;
	var is_extensible = Object.isExtensible;
	function is_function(thing) {
		return typeof thing === "function";
	}
	var noop = () => {};
	function is_promise(value) {
		return typeof value?.then === "function";
	}
	function run(fn) {
		return fn();
	}
	function run_all(arr) {
		for (var i = 0; i < arr.length; i++) arr[i]();
	}
	function deferred() {
		var resolve;
		var reject;
		return {
			promise: new Promise((res, rej) => {
				resolve = res;
				reject = rej;
			}),
			resolve,
			reject
		};
	}
	function to_array(value, n) {
		if (Array.isArray(value)) return value;
		if (n === void 0 || !(Symbol.iterator in value)) return Array.from(value);
		const array = [];
		for (const element of value) {
			array.push(element);
			if (array.length === n) break;
		}
		return array;
	}
	var MANAGED_EFFECT = 1 << 24;
	var CLEAN = 1024;
	var DIRTY = 2048;
	var MAYBE_DIRTY = 4096;
	var INERT = 8192;
	var DESTROYED = 16384;
	var REACTION_RAN = 32768;
	var DESTROYING = 1 << 25;
	var EFFECT_TRANSPARENT = 65536;
	var HEAD_EFFECT = 1 << 18;
	var EFFECT_PRESERVED = 1 << 19;
	var USER_EFFECT = 1 << 20;
	var EFFECT_OFFSCREEN = 1 << 25;
	var WAS_MARKED = 65536;
	var REACTION_IS_UPDATING = 1 << 21;
	var ASYNC = 1 << 22;
	var ERROR_VALUE = 1 << 23;
	var STATE_SYMBOL = Symbol("$state");
	var LEGACY_PROPS = Symbol("legacy props");
	var LOADING_ATTR_SYMBOL = Symbol("");
	var ATTRIBUTES_CACHE = Symbol("attributes");
	var CLASS_CACHE = Symbol("class");
	var STYLE_CACHE = Symbol("style");
	var TEXT_CACHE = Symbol("text");
	var FORM_RESET_HANDLER = Symbol("form reset");
	var STALE_REACTION = new class StaleReactionError extends Error {
		name = "StaleReactionError";
		message = "The reaction that called `getAbortSignal()` was re-run or destroyed";
	}();
	var IS_XHTML = !!globalThis.document?.contentType && globalThis.document.contentType.includes("xml");
	function lifecycle_outside_component(name) {
		throw new Error(`https://svelte.dev/e/lifecycle_outside_component`);
	}
	function async_derived_orphan() {
		throw new Error(`https://svelte.dev/e/async_derived_orphan`);
	}
	function each_key_duplicate(a, b, value) {
		throw new Error(`https://svelte.dev/e/each_key_duplicate`);
	}
	function effect_in_teardown(rune) {
		throw new Error(`https://svelte.dev/e/effect_in_teardown`);
	}
	function effect_in_unowned_derived() {
		throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`);
	}
	function effect_orphan(rune) {
		throw new Error(`https://svelte.dev/e/effect_orphan`);
	}
	function effect_update_depth_exceeded() {
		throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`);
	}
	function props_invalid_value(key) {
		throw new Error(`https://svelte.dev/e/props_invalid_value`);
	}
	function state_descriptors_fixed() {
		throw new Error(`https://svelte.dev/e/state_descriptors_fixed`);
	}
	function state_prototype_fixed() {
		throw new Error(`https://svelte.dev/e/state_prototype_fixed`);
	}
	function state_unsafe_mutation() {
		throw new Error(`https://svelte.dev/e/state_unsafe_mutation`);
	}
	function svelte_boundary_reset_onerror() {
		throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`);
	}
	var HYDRATION_ERROR = {};
	var UNINITIALIZED = Symbol("uninitialized");
	var NAMESPACE_HTML = "http://www.w3.org/1999/xhtml";
	var NAMESPACE_SVG = "http://www.w3.org/2000/svg";
	var NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML";
	function derived_inert() {
		console.warn(`https://svelte.dev/e/derived_inert`);
	}
	function hydration_mismatch(location) {
		console.warn(`https://svelte.dev/e/hydration_mismatch`);
	}
	function svelte_boundary_reset_noop() {
		console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`);
	}
	var hydrating = false;
	function set_hydrating(value) {
		hydrating = value;
	}
	var hydrate_node;
	function set_hydrate_node(node) {
		if (node === null) {
			hydration_mismatch();
			throw HYDRATION_ERROR;
		}
		return hydrate_node = node;
	}
	function hydrate_next() {
		return set_hydrate_node(get_next_sibling(hydrate_node));
	}
	function reset(node) {
		if (!hydrating) return;
		if (get_next_sibling(hydrate_node) !== null) {
			hydration_mismatch();
			throw HYDRATION_ERROR;
		}
		hydrate_node = node;
	}
	function next(count = 1) {
		if (hydrating) {
			var i = count;
			var node = hydrate_node;
			while (i--) node = get_next_sibling(node);
			hydrate_node = node;
		}
	}
	function skip_nodes(remove = true) {
		var depth = 0;
		var node = hydrate_node;
		while (true) {
			if (node.nodeType === 8) {
				var data = node.data;
				if (data === "]") {
					if (depth === 0) return node;
					depth -= 1;
				} else if (data === "[" || data === "[!" || data[0] === "[" && !isNaN(Number(data.slice(1)))) depth += 1;
			}
			var next = get_next_sibling(node);
			if (remove) node.remove();
			node = next;
		}
	}
	function read_hydration_instruction(node) {
		if (!node || node.nodeType !== 8) {
			hydration_mismatch();
			throw HYDRATION_ERROR;
		}
		return node.data;
	}
	function equals(value) {
		return value === this.v;
	}
	function safe_not_equal(a, b) {
		return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function";
	}
	function safe_equals(value) {
		return !safe_not_equal(value, this.v);
	}
	var async_mode_flag = false;
	var legacy_mode_flag = false;
	function enable_legacy_mode_flag() {
		legacy_mode_flag = true;
	}
	var component_context = null;
	function set_component_context(context) {
		component_context = context;
	}
	function push(props, runes = false, fn) {
		component_context = {
			p: component_context,
			i: false,
			c: null,
			e: null,
			s: props,
			x: null,
			r: active_effect,
			l: legacy_mode_flag && !runes ? {
				s: null,
				u: null,
				$: []
			} : null
		};
	}
	function pop(component) {
		var context = component_context;
		var effects = context.e;
		if (effects !== null) {
			context.e = null;
			for (var fn of effects) create_user_effect(fn);
		}
		if (component !== void 0) context.x = component;
		context.i = true;
		component_context = context.p;
		return component ?? {};
	}
	function is_runes() {
		return !legacy_mode_flag || component_context !== null && component_context.l === null;
	}
	var micro_tasks = [];
	function run_micro_tasks() {
		var tasks = micro_tasks;
		micro_tasks = [];
		run_all(tasks);
	}
	function queue_micro_task(fn) {
		if (micro_tasks.length === 0 && !is_flushing_sync) {
			var tasks = micro_tasks;
			queueMicrotask(() => {
				if (tasks === micro_tasks) run_micro_tasks();
			});
		}
		micro_tasks.push(fn);
	}
	function flush_tasks() {
		while (micro_tasks.length > 0) run_micro_tasks();
	}
	function handle_error(error) {
		var effect = active_effect;
		if (effect === null) {
			active_reaction.f |= ERROR_VALUE;
			return error;
		}
		if ((effect.f & 32768) === 0 && (effect.f & 4) === 0) throw error;
		invoke_error_boundary(error, effect);
	}
	function invoke_error_boundary(error, effect) {
		while (effect !== null) {
			if ((effect.f & 128) !== 0) {
				if ((effect.f & 32768) === 0) throw error;
				try {
					effect.b.error(error);
					return;
				} catch (e) {
					error = e;
				}
			}
			effect = effect.parent;
		}
		throw error;
	}
	var STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);
	function set_signal_status(signal, status) {
		signal.f = signal.f & STATUS_MASK | status;
	}
	function update_derived_status(derived) {
		if ((derived.f & 512) !== 0 || derived.deps === null) set_signal_status(derived, CLEAN);
		else set_signal_status(derived, MAYBE_DIRTY);
	}
	function clear_marked(deps) {
		if (deps === null) return;
		for (const dep of deps) {
			if ((dep.f & 2) === 0 || (dep.f & 65536) === 0) continue;
			dep.f ^= WAS_MARKED;
			clear_marked(dep.deps);
		}
	}
	function defer_effect(effect, dirty_effects, maybe_dirty_effects) {
		if ((effect.f & 2048) !== 0) dirty_effects.add(effect);
		else if ((effect.f & 4096) !== 0) maybe_dirty_effects.add(effect);
		clear_marked(effect.deps);
		set_signal_status(effect, CLEAN);
	}
	var legacy_is_updating_store = false;
	var is_store_binding = false;
	function capture_store_binding(fn) {
		var previous_is_store_binding = is_store_binding;
		try {
			is_store_binding = false;
			return [fn(), is_store_binding];
		} finally {
			is_store_binding = previous_is_store_binding;
		}
	}
	var first_batch = null;
	var last_batch = null;
	var current_batch = null;
	var previous_batch = null;
	var batch_values = null;
	var last_scheduled_effect = null;
	var is_flushing_sync = false;
	var is_processing = false;
	var collected_effects = null;
	var legacy_updates = null;
	var flush_count = 0;
	var uid = 1;
	var Batch = class Batch {
		id = uid++;
		#started = false;
		linked = true;
		#prev = null;
		#next = null;
		async_deriveds = new Map();
		current = new Map();
		previous = new Map();
		unblocked = new Set();
		#commit_callbacks = new Set();
		#discard_callbacks = new Set();
		#fork_commit_callbacks = new Set();
		#pending = 0;
		#blocking_pending = new Map();
		#deferred = null;
		#roots = [];
		#new_effects = [];
		#dirty_effects = new Set();
		#maybe_dirty_effects = new Set();
		#skipped_branches = new Map();
		#unskipped_branches = new Set();
		is_fork = false;
		#decrement_queued = false;
		#is_deferred() {
			if (this.is_fork) return true;
			for (const effect of this.#blocking_pending.keys()) {
				var e = effect;
				var skipped = false;
				while (e.parent !== null) {
					if (this.#skipped_branches.has(e)) {
						skipped = true;
						break;
					}
					e = e.parent;
				}
				if (!skipped) return true;
			}
			return false;
		}
		skip_effect(effect) {
			if (!this.#skipped_branches.has(effect)) this.#skipped_branches.set(effect, {
				d: [],
				m: []
			});
			this.#unskipped_branches.delete(effect);
		}
		unskip_effect(effect, callback = (e) => this.schedule(e)) {
			var tracked = this.#skipped_branches.get(effect);
			if (tracked) {
				this.#skipped_branches.delete(effect);
				for (var e of tracked.d) {
					set_signal_status(e, DIRTY);
					callback(e);
				}
				for (e of tracked.m) {
					set_signal_status(e, MAYBE_DIRTY);
					callback(e);
				}
			}
			this.#unskipped_branches.add(effect);
		}
		#process() {
			this.#started = true;
			if (flush_count++ > 1e3) {
				this.#unlink();
				infinite_loop_guard();
			}
			if (!this.#is_deferred()) {
				for (const e of this.#dirty_effects) {
					this.#maybe_dirty_effects.delete(e);
					set_signal_status(e, DIRTY);
					this.schedule(e);
				}
				for (const e of this.#maybe_dirty_effects) {
					set_signal_status(e, MAYBE_DIRTY);
					this.schedule(e);
				}
			}
			const roots = this.#roots;
			this.#roots = [];
			this.apply();
			var effects = collected_effects = [];
			var render_effects = [];
			var updates = legacy_updates = [];
			for (const root of roots) try {
				this.#traverse(root, effects, render_effects);
			} catch (e) {
				reset_all(root);
				throw e;
			}
			current_batch = null;
			if (updates.length > 0) {
				var batch = Batch.ensure();
				for (const e of updates) batch.schedule(e);
			}
			collected_effects = null;
			legacy_updates = null;
			if (this.#is_deferred()) {
				this.#defer_effects(render_effects);
				this.#defer_effects(effects);
				for (const [e, t] of this.#skipped_branches) reset_branch(e, t);
				if (updates.length > 0) current_batch.#process();
				return;
			}
			const earlier_batch = this.#find_earlier_batch();
			if (earlier_batch) {
				earlier_batch.#merge(this);
				return;
			}
			this.#dirty_effects.clear();
			this.#maybe_dirty_effects.clear();
			for (const fn of this.#commit_callbacks) fn(this);
			this.#commit_callbacks.clear();
			previous_batch = this;
			flush_queued_effects(render_effects);
			flush_queued_effects(effects);
			previous_batch = null;
			this.#deferred?.resolve();
			var next_batch = current_batch;
			if (this.linked && this.#pending === 0) this.#unlink();
			if (async_mode_flag && !this.linked) {
				this.#commit();
				current_batch = next_batch;
			}
			if (this.#roots.length > 0) {
				if (next_batch === null) {
					next_batch = this;
					this.#link();
				}
				const batch = next_batch;
				batch.#roots.push(...this.#roots.filter((r) => !batch.#roots.includes(r)));
			}
			if (next_batch !== null) next_batch.#process();
		}
		#traverse(root, effects, render_effects) {
			root.f ^= CLEAN;
			var effect = root.first;
			while (effect !== null) {
				var flags = effect.f;
				var is_branch = (flags & 96) !== 0;
				if (!(is_branch && (flags & 1024) !== 0 || (flags & 8192) !== 0 || this.#skipped_branches.has(effect)) && effect.fn !== null) {
					if (is_branch) effect.f ^= CLEAN;
					else if ((flags & 4) !== 0) effects.push(effect);
					else if (async_mode_flag && (flags & 16777224) !== 0) render_effects.push(effect);
					else if (is_dirty(effect)) {
						if ((flags & 16) !== 0) this.#maybe_dirty_effects.add(effect);
						update_effect(effect);
					}
					var child = effect.first;
					if (child !== null) {
						effect = child;
						continue;
					}
				}
				while (effect !== null) {
					var next = effect.next;
					if (next !== null) {
						effect = next;
						break;
					}
					effect = effect.parent;
				}
			}
		}
		#find_earlier_batch() {
			var batch = this.#prev;
			while (batch !== null) {
				if (!batch.is_fork) {
					for (const [value, [, is_derived]] of this.current) if (batch.current.has(value) && !is_derived) return batch;
				}
				batch = batch.#prev;
			}
			return null;
		}
		#merge(batch) {
			for (const [source, value] of batch.current) {
				if (!this.previous.has(source) && batch.previous.has(source)) this.previous.set(source, batch.previous.get(source));
				this.current.set(source, value);
			}
			for (const [effect, deferred] of batch.async_deriveds) {
				const d = this.async_deriveds.get(effect);
				if (d) deferred.promise.then(d.resolve);
			}
			const mark = (value) => {
				var reactions = value.reactions;
				if (reactions === null) return;
				for (const reaction of reactions) {
					var flags = reaction.f;
					if ((flags & 2) !== 0) mark(reaction);
					else {
						var effect = reaction;
						if (flags & 4194320 && !this.async_deriveds.has(effect)) {
							this.#maybe_dirty_effects.delete(effect);
							set_signal_status(effect, DIRTY);
							this.schedule(effect);
						}
					}
				}
			};
			for (const source of this.current.keys()) mark(source);
			this.oncommit(() => batch.discard());
			batch.#unlink();
			current_batch = this;
			this.#process();
		}
		#defer_effects(effects) {
			for (var i = 0; i < effects.length; i += 1) defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects);
		}
		capture(source, value, is_derived = false) {
			if (source.v !== UNINITIALIZED && !this.previous.has(source)) this.previous.set(source, source.v);
			if ((source.f & 8388608) === 0) {
				this.current.set(source, [value, is_derived]);
				batch_values?.set(source, value);
			}
			if (!this.is_fork) source.v = value;
		}
		activate() {
			current_batch = this;
		}
		deactivate() {
			current_batch = null;
			batch_values = null;
		}
		flush() {
			try {
				is_processing = true;
				current_batch = this;
				this.#process();
			} finally {
				flush_count = 0;
				last_scheduled_effect = null;
				collected_effects = null;
				legacy_updates = null;
				is_processing = false;
				current_batch = null;
				batch_values = null;
				old_values.clear();
			}
		}
		discard() {
			for (const fn of this.#discard_callbacks) fn(this);
			this.#discard_callbacks.clear();
			this.#fork_commit_callbacks.clear();
			this.#unlink();
		}
		register_created_effect(effect) {
			this.#new_effects.push(effect);
		}
		#commit() {
			this.#unlink();
			for (let batch = first_batch; batch !== null; batch = batch.#next) {
				var is_earlier = batch.id < this.id;
				var sources = [];
				for (const [source, [value, is_derived]] of this.current) {
					if (batch.current.has(source)) {
						var batch_value = batch.current.get(source)[0];
						if (is_earlier && value !== batch_value) batch.current.set(source, [value, is_derived]);
						else continue;
					}
					sources.push(source);
				}
				if (is_earlier) for (const [effect, deferred] of this.async_deriveds) {
					const d = batch.async_deriveds.get(effect);
					if (d) deferred.promise.then(d.resolve);
				}
				if (!batch.#started) continue;
				var others = [...batch.current.keys()].filter((s) => !this.current.has(s));
				if (others.length === 0) {
					if (is_earlier) batch.discard();
				} else if (sources.length > 0) {
					if (is_earlier) for (const unskipped of this.#unskipped_branches) batch.unskip_effect(unskipped, (e) => {
						if ((e.f & 4194320) !== 0) batch.schedule(e);
						else batch.#defer_effects([e]);
					});
					batch.activate();
					var marked = new Set();
					var checked = new Map();
					for (var source of sources) mark_effects(source, others, marked, checked);
					checked = new Map();
					var current_unequal = [...batch.current.keys()].filter((c) => this.current.has(c) ? this.current.get(c)[0] !== c.v : true);
					if (current_unequal.length > 0) {
						for (const effect of this.#new_effects) if ((effect.f & 155648) === 0 && depends_on(effect, current_unequal, checked)) if ((effect.f & 4194320) !== 0) {
							set_signal_status(effect, DIRTY);
							batch.schedule(effect);
						} else batch.#dirty_effects.add(effect);
					}
					if (batch.#roots.length > 0 && !batch.#decrement_queued) {
						batch.apply();
						for (var root of batch.#roots) batch.#traverse(root, [], []);
						batch.#roots = [];
					}
					batch.deactivate();
				}
			}
		}
		increment(blocking, effect) {
			this.#pending += 1;
			if (blocking) {
				let blocking_pending_count = this.#blocking_pending.get(effect) ?? 0;
				this.#blocking_pending.set(effect, blocking_pending_count + 1);
			}
		}
		decrement(blocking, effect) {
			this.#pending -= 1;
			if (blocking) {
				let blocking_pending_count = this.#blocking_pending.get(effect) ?? 0;
				if (blocking_pending_count === 1) this.#blocking_pending.delete(effect);
				else this.#blocking_pending.set(effect, blocking_pending_count - 1);
			}
			if (this.#decrement_queued) return;
			this.#decrement_queued = true;
			queue_micro_task(() => {
				this.#decrement_queued = false;
				if (this.linked) this.flush();
			});
		}
		transfer_effects(dirty_effects, maybe_dirty_effects) {
			for (const e of dirty_effects) this.#dirty_effects.add(e);
			for (const e of maybe_dirty_effects) this.#maybe_dirty_effects.add(e);
			dirty_effects.clear();
			maybe_dirty_effects.clear();
		}
		oncommit(fn) {
			this.#commit_callbacks.add(fn);
		}
		ondiscard(fn) {
			this.#discard_callbacks.add(fn);
		}
		on_fork_commit(fn) {
			this.#fork_commit_callbacks.add(fn);
		}
		run_fork_commit_callbacks() {
			for (const fn of this.#fork_commit_callbacks) fn(this);
			this.#fork_commit_callbacks.clear();
		}
		settled() {
			return (this.#deferred ??= deferred()).promise;
		}
		static ensure() {
			if (current_batch === null) {
				const batch = current_batch = new Batch();
				batch.#link();
				if (!is_processing && !is_flushing_sync) queue_micro_task(() => {
					if (!batch.#started) batch.flush();
				});
			}
			return current_batch;
		}
		apply() {
			if (!async_mode_flag || !this.is_fork && this.#prev === null && this.#next === null) {
				batch_values = null;
				return;
			}
			batch_values = new Map();
			for (const [source, [value]] of this.current) batch_values.set(source, value);
			for (let batch = first_batch; batch !== null; batch = batch.#next) {
				if (batch === this || batch.is_fork) continue;
				var intersects = false;
				if (batch.id < this.id) for (const [source, [, is_derived]] of batch.current) {
					if (is_derived) continue;
					if (this.current.has(source)) {
						intersects = true;
						break;
					}
				}
				if (!intersects) {
					for (const [source, previous] of batch.previous) if (!batch_values.has(source)) batch_values.set(source, previous);
				}
			}
		}
		schedule(effect) {
			last_scheduled_effect = effect;
			if (effect.b?.is_pending && (effect.f & 16777228) !== 0 && (effect.f & 32768) === 0) {
				effect.b.defer_effect(effect);
				return;
			}
			var e = effect;
			while (e.parent !== null) {
				e = e.parent;
				var flags = e.f;
				if (collected_effects !== null && e === active_effect) {
					if (async_mode_flag) return;
					if ((active_reaction === null || (active_reaction.f & 2) === 0) && !legacy_is_updating_store) return;
				}
				if ((flags & 96) !== 0) {
					if ((flags & 1024) === 0) return;
					e.f ^= CLEAN;
				}
			}
			this.#roots.push(e);
		}
		#link() {
			if (last_batch === null) first_batch = last_batch = this;
			else {
				last_batch.#next = this;
				this.#prev = last_batch;
			}
			last_batch = this;
		}
		#unlink() {
			var prev = this.#prev;
			var next = this.#next;
			if (prev === null) first_batch = next;
			else prev.#next = next;
			if (next === null) last_batch = prev;
			else next.#prev = prev;
			this.linked = false;
		}
	};
	function flushSync(fn) {
		var was_flushing_sync = is_flushing_sync;
		is_flushing_sync = true;
		try {
			var result;
			if (fn) {
				if (current_batch !== null && !current_batch.is_fork) current_batch.flush();
				result = fn();
			}
			while (true) {
				flush_tasks();
				if (current_batch === null) return result;
				current_batch.flush();
			}
		} finally {
			is_flushing_sync = was_flushing_sync;
		}
	}
	function infinite_loop_guard() {
		try {
			effect_update_depth_exceeded();
		} catch (error) {
			invoke_error_boundary(error, last_scheduled_effect);
		}
	}
	var eager_block_effects = null;
	function flush_queued_effects(effects) {
		var length = effects.length;
		if (length === 0) return;
		var i = 0;
		while (i < length) {
			var effect = effects[i++];
			if ((effect.f & 24576) === 0 && is_dirty(effect)) {
				eager_block_effects = new Set();
				update_effect(effect);
				if (effect.deps === null && effect.first === null && effect.nodes === null && effect.teardown === null && effect.ac === null) unlink_effect(effect);
				if (eager_block_effects?.size > 0) {
					old_values.clear();
					for (const e of eager_block_effects) {
						if ((e.f & 24576) !== 0) continue;
						const ordered_effects = [e];
						let ancestor = e.parent;
						while (ancestor !== null) {
							if (eager_block_effects.has(ancestor)) {
								eager_block_effects.delete(ancestor);
								ordered_effects.push(ancestor);
							}
							ancestor = ancestor.parent;
						}
						for (let j = ordered_effects.length - 1; j >= 0; j--) {
							const e = ordered_effects[j];
							if ((e.f & 24576) !== 0) continue;
							update_effect(e);
						}
					}
					eager_block_effects.clear();
				}
			}
		}
		eager_block_effects = null;
	}
	function mark_effects(value, sources, marked, checked) {
		if (marked.has(value)) return;
		marked.add(value);
		if (value.reactions !== null) for (const reaction of value.reactions) {
			const flags = reaction.f;
			if ((flags & 2) !== 0) mark_effects(reaction, sources, marked, checked);
			else if ((flags & 4194320) !== 0 && (flags & 2048) === 0 && depends_on(reaction, sources, checked)) {
				set_signal_status(reaction, DIRTY);
				schedule_effect(reaction);
			}
		}
	}
	function depends_on(reaction, sources, checked) {
		const depends = checked.get(reaction);
		if (depends !== void 0) return depends;
		if (reaction.deps !== null) for (const dep of reaction.deps) {
			if (includes.call(sources, dep)) return true;
			if ((dep.f & 2) !== 0 && depends_on(dep, sources, checked)) {
				checked.set(dep, true);
				return true;
			}
		}
		checked.set(reaction, false);
		return false;
	}
	function schedule_effect(effect) {
		current_batch.schedule(effect);
	}
	function reset_branch(effect, tracked) {
		if ((effect.f & 32) !== 0 && (effect.f & 1024) !== 0) return;
		if ((effect.f & 2048) !== 0) tracked.d.push(effect);
		else if ((effect.f & 4096) !== 0) tracked.m.push(effect);
		set_signal_status(effect, CLEAN);
		var e = effect.first;
		while (e !== null) {
			reset_branch(e, tracked);
			e = e.next;
		}
	}
	function reset_all(effect) {
		set_signal_status(effect, CLEAN);
		var e = effect.first;
		while (e !== null) {
			reset_all(e);
			e = e.next;
		}
	}
	function createSubscriber(start) {
		let subscribers = 0;
		let version = source(0);
		let stop;
		return () => {
			if (effect_tracking()) {
				get(version);
				render_effect(() => {
					if (subscribers === 0) stop = untrack(() => start(() => increment(version)));
					subscribers += 1;
					return () => {
						queue_micro_task(() => {
							subscribers -= 1;
							if (subscribers === 0) {
								stop?.();
								stop = void 0;
								increment(version);
							}
						});
					};
				});
			}
		};
	}
	var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED;
	function boundary(node, props, children, transform_error) {
		new Boundary(node, props, children, transform_error);
	}
	var Boundary = class {
		parent;
		is_pending = false;
		transform_error;
		#anchor;
		#hydrate_open = hydrating ? hydrate_node : null;
		#props;
		#children;
		#effect;
		#main_effect = null;
		#pending_effect = null;
		#failed_effect = null;
		#offscreen_fragment = null;
		#local_pending_count = 0;
		#pending_count = 0;
		#pending_count_update_queued = false;
		#dirty_effects = new Set();
		#maybe_dirty_effects = new Set();
		#effect_pending = null;
		#effect_pending_subscriber = createSubscriber(() => {
			this.#effect_pending = source(this.#local_pending_count);
			return () => {
				this.#effect_pending = null;
			};
		});
		constructor(node, props, children, transform_error) {
			this.#anchor = node;
			this.#props = props;
			this.#children = (anchor) => {
				var effect = active_effect;
				effect.b = this;
				effect.f |= 128;
				children(anchor);
			};
			this.parent = active_effect.b;
			this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e);
			this.#effect = block(() => {
				if (hydrating) {
					const comment = this.#hydrate_open;
					hydrate_next();
					const server_rendered_pending = comment.data === "[!";
					if (comment.data.startsWith("[?")) {
						const serialized_error = JSON.parse(comment.data.slice(2));
						this.#hydrate_failed_content(serialized_error);
					} else if (server_rendered_pending) this.#hydrate_pending_content();
					else this.#hydrate_resolved_content();
				} else this.#render();
			}, flags);
			if (hydrating) this.#anchor = hydrate_node;
		}
		#hydrate_resolved_content() {
			try {
				this.#main_effect = branch(() => this.#children(this.#anchor));
			} catch (error) {
				this.error(error);
			}
		}
		#hydrate_failed_content(error) {
			const failed = this.#props.failed;
			if (!failed) return;
			this.#failed_effect = branch(() => {
				failed(this.#anchor, () => error, () => () => {});
			});
		}
		#hydrate_pending_content() {
			const pending = this.#props.pending;
			if (!pending) return;
			this.is_pending = true;
			this.#pending_effect = branch(() => pending(this.#anchor));
			queue_micro_task(() => {
				var fragment = this.#offscreen_fragment = document.createDocumentFragment();
				var anchor = create_text();
				fragment.append(anchor);
				this.#main_effect = this.#run(() => {
					return branch(() => this.#children(anchor));
				});
				if (this.#pending_count === 0) {
					this.#anchor.before(fragment);
					this.#offscreen_fragment = null;
					pause_effect(this.#pending_effect, () => {
						this.#pending_effect = null;
					});
					this.#resolve(current_batch);
				}
			});
		}
		#render() {
			try {
				this.is_pending = this.has_pending_snippet();
				this.#pending_count = 0;
				this.#local_pending_count = 0;
				this.#main_effect = branch(() => {
					this.#children(this.#anchor);
				});
				if (this.#pending_count > 0) {
					var fragment = this.#offscreen_fragment = document.createDocumentFragment();
					move_effect(this.#main_effect, fragment);
					const pending = this.#props.pending;
					this.#pending_effect = branch(() => pending(this.#anchor));
				} else this.#resolve(current_batch);
			} catch (error) {
				this.error(error);
			}
		}
		#resolve(batch) {
			this.is_pending = false;
			batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects);
		}
		defer_effect(effect) {
			defer_effect(effect, this.#dirty_effects, this.#maybe_dirty_effects);
		}
		is_rendered() {
			return !this.is_pending && (!this.parent || this.parent.is_rendered());
		}
		has_pending_snippet() {
			return !!this.#props.pending;
		}
		#run(fn) {
			var previous_effect = active_effect;
			var previous_reaction = active_reaction;
			var previous_ctx = component_context;
			set_active_effect(this.#effect);
			set_active_reaction(this.#effect);
			set_component_context(this.#effect.ctx);
			try {
				Batch.ensure();
				return fn();
			} catch (e) {
				handle_error(e);
				return null;
			} finally {
				set_active_effect(previous_effect);
				set_active_reaction(previous_reaction);
				set_component_context(previous_ctx);
			}
		}
		#update_pending_count(d, batch) {
			if (!this.has_pending_snippet()) {
				if (this.parent) this.parent.#update_pending_count(d, batch);
				return;
			}
			this.#pending_count += d;
			if (this.#pending_count === 0) {
				this.#resolve(batch);
				if (this.#pending_effect) pause_effect(this.#pending_effect, () => {
					this.#pending_effect = null;
				});
				if (this.#offscreen_fragment) {
					this.#anchor.before(this.#offscreen_fragment);
					this.#offscreen_fragment = null;
				}
			}
		}
		update_pending_count(d, batch) {
			this.#update_pending_count(d, batch);
			this.#local_pending_count += d;
			if (!this.#effect_pending || this.#pending_count_update_queued) return;
			this.#pending_count_update_queued = true;
			queue_micro_task(() => {
				this.#pending_count_update_queued = false;
				if (this.#effect_pending) internal_set(this.#effect_pending, this.#local_pending_count);
			});
		}
		get_effect_pending() {
			this.#effect_pending_subscriber();
			return get(this.#effect_pending);
		}
		error(error) {
			if (!this.#props.onerror && !this.#props.failed) throw error;
			if (current_batch?.is_fork) {
				if (this.#main_effect) current_batch.skip_effect(this.#main_effect);
				if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect);
				if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect);
				current_batch.on_fork_commit(() => {
					this.#handle_error(error);
				});
			} else this.#handle_error(error);
		}
		#handle_error(error) {
			if (this.#main_effect) {
				destroy_effect(this.#main_effect);
				this.#main_effect = null;
			}
			if (this.#pending_effect) {
				destroy_effect(this.#pending_effect);
				this.#pending_effect = null;
			}
			if (this.#failed_effect) {
				destroy_effect(this.#failed_effect);
				this.#failed_effect = null;
			}
			if (hydrating) {
				set_hydrate_node(this.#hydrate_open);
				next();
				set_hydrate_node(skip_nodes());
			}
			var onerror = this.#props.onerror;
			let failed = this.#props.failed;
			var did_reset = false;
			var calling_on_error = false;
			const reset = () => {
				if (did_reset) {
					svelte_boundary_reset_noop();
					return;
				}
				did_reset = true;
				if (calling_on_error) svelte_boundary_reset_onerror();
				if (this.#failed_effect !== null) pause_effect(this.#failed_effect, () => {
					this.#failed_effect = null;
				});
				this.#run(() => {
					this.#render();
				});
			};
			const handle_error_result = (transformed_error) => {
				try {
					calling_on_error = true;
					onerror?.(transformed_error, reset);
					calling_on_error = false;
				} catch (error) {
					invoke_error_boundary(error, this.#effect && this.#effect.parent);
				}
				if (failed) this.#failed_effect = this.#run(() => {
					try {
						return branch(() => {
							var effect = active_effect;
							effect.b = this;
							effect.f |= 128;
							failed(this.#anchor, () => transformed_error, () => reset);
						});
					} catch (error) {
						invoke_error_boundary(error, this.#effect.parent);
						return null;
					}
				});
			};
			queue_micro_task(() => {
				var result;
				try {
					result = this.transform_error(error);
				} catch (e) {
					invoke_error_boundary(e, this.#effect && this.#effect.parent);
					return;
				}
				if (result !== null && typeof result === "object" && typeof result.then === "function") result.then(handle_error_result, (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent));
				else handle_error_result(result);
			});
		}
	};
	function flatten(blockers, sync, async, fn) {
		const d = is_runes() ? derived : derived_safe_equal;
		var pending = blockers.filter((b) => !b.settled);
		if (async.length === 0 && pending.length === 0) {
			fn(sync.map(d));
			return;
		}
		var parent = active_effect;
		var restore = capture();
		var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null;
		function finish(values) {
			if ((parent.f & 16384) !== 0) return;
			restore();
			try {
				fn(values);
			} catch (error) {
				invoke_error_boundary(error, parent);
			}
			unset_context();
		}
		var decrement_pending = increment_pending();
		if (async.length === 0) {
			blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending);
			return;
		}
		function run() {
			Promise.all(async.map((expression) => async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending);
		}
		if (blocker_promise) blocker_promise.then(() => {
			restore();
			run();
			unset_context();
		});
		else run();
	}
	function capture() {
		var previous_effect = active_effect;
		var previous_reaction = active_reaction;
		var previous_component_context = component_context;
		var previous_batch = current_batch;
		return function restore(activate_batch = true) {
			set_active_effect(previous_effect);
			set_active_reaction(previous_reaction);
			set_component_context(previous_component_context);
			if (activate_batch && (previous_effect.f & 16384) === 0) {
				previous_batch?.activate();
				previous_batch?.apply();
			}
		};
	}
	function unset_context(deactivate_batch = true) {
		set_active_effect(null);
		set_active_reaction(null);
		set_component_context(null);
		if (deactivate_batch) current_batch?.deactivate();
	}
	function increment_pending() {
		var effect = active_effect;
		var boundary = effect.b;
		var batch = current_batch;
		var blocking = boundary.is_rendered();
		boundary.update_pending_count(1, batch);
		batch.increment(blocking, effect);
		return () => {
			boundary.update_pending_count(-1, batch);
			batch.decrement(blocking, effect);
		};
	}
	function derived(fn) {
		var flags = 2 | DIRTY;
		if (active_effect !== null) active_effect.f |= EFFECT_PRESERVED;
		return {
			ctx: component_context,
			deps: null,
			effects: null,
			equals,
			f: flags,
			fn,
			reactions: null,
			rv: 0,
			v: UNINITIALIZED,
			wv: 0,
			parent: active_effect,
			ac: null
		};
	}
	var OBSOLETE = Symbol("obsolete");
	function async_derived(fn, label, location) {
		let parent = active_effect;
		if (parent === null) async_derived_orphan();
		var promise = void 0;
		var signal = source(UNINITIALIZED);
		var should_suspend = !active_reaction;
		var deferreds = new Set();
		async_effect(() => {
			var effect = active_effect;
			var d = deferred();
			promise = d.promise;
			try {
				Promise.resolve(fn()).then(d.resolve, (e) => {
					if (e !== STALE_REACTION) d.reject(e);
				}).finally(unset_context);
			} catch (error) {
				d.reject(error);
				unset_context();
			}
			var batch = current_batch;
			if (should_suspend) {
				if ((effect.f & 32768) !== 0) var decrement_pending = increment_pending();
				if (parent.b.is_rendered()) batch.async_deriveds.get(effect)?.reject(OBSOLETE);
				else for (const d of deferreds.values()) d.reject(OBSOLETE);
				deferreds.add(d);
				batch.async_deriveds.set(effect, d);
			}
			const handler = (value, error = void 0) => {
				decrement_pending?.();
				deferreds.delete(d);
				if (error === OBSOLETE) return;
				batch.activate();
				if (error) {
					signal.f |= ERROR_VALUE;
					internal_set(signal, error);
				} else {
					if ((signal.f & 8388608) !== 0) signal.f ^= ERROR_VALUE;
					internal_set(signal, value);
				}
				batch.deactivate();
			};
			d.promise.then(handler, (e) => handler(null, e || "unknown"));
		});
		teardown(() => {
			for (const d of deferreds) d.reject(OBSOLETE);
		});
		return new Promise((fulfil) => {
			function next(p) {
				function go() {
					if (p === promise) fulfil(signal);
					else next(promise);
				}
				p.then(go, go);
			}
			next(promise);
		});
	}
	function user_derived(fn) {
		const d = derived(fn);
		if (!async_mode_flag) push_reaction_value(d);
		return d;
	}
	function derived_safe_equal(fn) {
		const signal = derived(fn);
		signal.equals = safe_equals;
		return signal;
	}
	function destroy_derived_effects(derived) {
		var effects = derived.effects;
		if (effects !== null) {
			derived.effects = null;
			for (var i = 0; i < effects.length; i += 1) destroy_effect(effects[i]);
		}
	}
	function execute_derived(derived) {
		var value;
		var prev_active_effect = active_effect;
		var parent = derived.parent;
		if (!is_destroying_effect && parent !== null && derived.v !== UNINITIALIZED && (parent.f & 24576) !== 0) {
			derived_inert();
			return derived.v;
		}
		set_active_effect(parent);
		try {
			derived.f &= ~WAS_MARKED;
			destroy_derived_effects(derived);
			value = update_reaction(derived);
		} finally {
			set_active_effect(prev_active_effect);
		}
		return value;
	}
	function update_derived(derived) {
		var value = execute_derived(derived);
		if (!derived.equals(value)) {
			derived.wv = increment_write_version();
			if (!current_batch?.is_fork || derived.deps === null) {
				if (current_batch !== null) {
					current_batch.capture(derived, value, true);
					previous_batch?.capture(derived, value, true);
				} else derived.v = value;
				if (derived.deps === null) {
					set_signal_status(derived, CLEAN);
					return;
				}
			}
		}
		if (is_destroying_effect) return;
		if (batch_values !== null) {
			if (effect_tracking() || current_batch?.is_fork) batch_values.set(derived, value);
		} else update_derived_status(derived);
	}
	function freeze_derived_effects(derived) {
		if (derived.effects === null) return;
		for (const e of derived.effects) if (e.teardown || e.ac) {
			e.teardown?.();
			e.ac?.abort(STALE_REACTION);
			if (e.fn !== null) e.teardown = noop;
			e.ac = null;
			remove_reactions(e, 0);
			destroy_effect_children(e);
		}
	}
	function unfreeze_derived_effects(derived) {
		if (derived.effects === null) return;
		for (const e of derived.effects) if (e.teardown && e.fn !== null) update_effect(e);
	}
	var eager_effects = new Set();
	var old_values = new Map();
	var eager_effects_deferred = false;
	function source(v, stack) {
		return {
			f: 0,
			v,
			reactions: null,
			equals,
			rv: 0,
			wv: 0
		};
	}
	function state$1(v, stack) {
		const s = source(v, stack);
		push_reaction_value(s);
		return s;
	}
	function mutable_source(initial_value, immutable = false, trackable = true) {
		const s = source(initial_value);
		if (!immutable) s.equals = safe_equals;
		if (legacy_mode_flag && trackable && component_context !== null && component_context.l !== null) (component_context.l.s ??= []).push(s);
		return s;
	}
	function set(source, value, should_proxy = false) {
		if (active_reaction !== null && (!untracking || (active_reaction.f & 131072) !== 0) && is_runes() && (active_reaction.f & 4325394) !== 0 && (current_sources === null || !includes.call(current_sources, source))) state_unsafe_mutation();
		return internal_set(source, should_proxy ? proxy(value) : value, legacy_updates);
	}
	function internal_set(source, value, updated_during_traversal = null) {
		if (!source.equals(value)) {
			old_values.set(source, is_destroying_effect ? value : source.v);
			var batch = Batch.ensure();
			batch.capture(source, value);
			if ((source.f & 2) !== 0) {
				const derived = source;
				if ((source.f & 2048) !== 0) execute_derived(derived);
				if (batch_values === null) update_derived_status(derived);
			}
			source.wv = increment_write_version();
			mark_reactions(source, DIRTY, updated_during_traversal);
			if (is_runes() && active_effect !== null && (active_effect.f & 1024) !== 0 && (active_effect.f & 96) === 0) if (untracked_writes === null) set_untracked_writes([source]);
			else untracked_writes.push(source);
			if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) flush_eager_effects();
		}
		return value;
	}
	function flush_eager_effects() {
		eager_effects_deferred = false;
		for (const effect of eager_effects) {
			if ((effect.f & 1024) !== 0) set_signal_status(effect, MAYBE_DIRTY);
			let dirty;
			try {
				dirty = is_dirty(effect);
			} catch {
				dirty = true;
			}
			if (dirty) update_effect(effect);
		}
		eager_effects.clear();
	}
	function increment(source) {
		set(source, source.v + 1);
	}
	function mark_reactions(signal, status, updated_during_traversal) {
		var reactions = signal.reactions;
		if (reactions === null) return;
		var runes = is_runes();
		var length = reactions.length;
		for (var i = 0; i < length; i++) {
			var reaction = reactions[i];
			var flags = reaction.f;
			if (!runes && reaction === active_effect) continue;
			var not_dirty = (flags & DIRTY) === 0;
			if (not_dirty) set_signal_status(reaction, status);
			if ((flags & 131072) !== 0) eager_effects.add(reaction);
			else if ((flags & 2) !== 0) {
				var derived = reaction;
				batch_values?.delete(derived);
				if ((flags & 65536) === 0) {
					if (flags & 512 && (active_effect === null || (active_effect.f & 2097152) === 0)) reaction.f |= WAS_MARKED;
					mark_reactions(derived, MAYBE_DIRTY, updated_during_traversal);
				}
			} else if (not_dirty) {
				var effect = reaction;
				if ((flags & 16) !== 0 && eager_block_effects !== null) eager_block_effects.add(effect);
				if (updated_during_traversal !== null) updated_during_traversal.push(effect);
				else schedule_effect(effect);
			}
		}
	}
	function proxy(value) {
		if (typeof value !== "object" || value === null || STATE_SYMBOL in value) return value;
		const prototype = get_prototype_of(value);
		if (prototype !== object_prototype && prototype !== array_prototype) return value;
		var sources = new Map();
		var is_proxied_array = is_array(value);
		var version = state$1(0);
		var stack = null;
		var parent_version = update_version;
		var with_parent = (fn) => {
			if (update_version === parent_version) return fn();
			var reaction = active_reaction;
			var version = update_version;
			set_active_reaction(null);
			set_update_version(parent_version);
			var result = fn();
			set_active_reaction(reaction);
			set_update_version(version);
			return result;
		};
		if (is_proxied_array) sources.set("length", state$1(value.length, stack));
		return new Proxy(value, {
			defineProperty(_, prop, descriptor) {
				if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) state_descriptors_fixed();
				var s = sources.get(prop);
				if (s === void 0) with_parent(() => {
					var s = state$1(descriptor.value, stack);
					sources.set(prop, s);
					return s;
				});
				else set(s, descriptor.value, true);
				return true;
			},
			deleteProperty(target, prop) {
				var s = sources.get(prop);
				if (s === void 0) {
					if (prop in target) {
						const s = with_parent(() => state$1(UNINITIALIZED, stack));
						sources.set(prop, s);
						increment(version);
					}
				} else {
					set(s, UNINITIALIZED);
					increment(version);
				}
				return true;
			},
			get(target, prop, receiver) {
				if (prop === STATE_SYMBOL) return value;
				var s = sources.get(prop);
				var exists = prop in target;
				if (s === void 0 && (!exists || get_descriptor(target, prop)?.writable)) {
					s = with_parent(() => {
						return state$1(proxy(exists ? target[prop] : UNINITIALIZED), stack);
					});
					sources.set(prop, s);
				}
				if (s !== void 0) {
					var v = get(s);
					return v === UNINITIALIZED ? void 0 : v;
				}
				return Reflect.get(target, prop, receiver);
			},
			getOwnPropertyDescriptor(target, prop) {
				var descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
				if (descriptor && "value" in descriptor) {
					var s = sources.get(prop);
					if (s) descriptor.value = get(s);
				} else if (descriptor === void 0) {
					var source = sources.get(prop);
					var value = source?.v;
					if (source !== void 0 && value !== UNINITIALIZED) return {
						enumerable: true,
						configurable: true,
						value,
						writable: true
					};
				}
				return descriptor;
			},
			has(target, prop) {
				if (prop === STATE_SYMBOL) return true;
				var s = sources.get(prop);
				var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop);
				if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop)?.writable)) {
					if (s === void 0) {
						s = with_parent(() => {
							return state$1(has ? proxy(target[prop]) : UNINITIALIZED, stack);
						});
						sources.set(prop, s);
					}
					if (get(s) === UNINITIALIZED) return false;
				}
				return has;
			},
			set(target, prop, value, receiver) {
				var s = sources.get(prop);
				var has = prop in target;
				if (is_proxied_array && prop === "length") for (var i = value; i < s.v; i += 1) {
					var other_s = sources.get(i + "");
					if (other_s !== void 0) set(other_s, UNINITIALIZED);
					else if (i in target) {
						other_s = with_parent(() => state$1(UNINITIALIZED, stack));
						sources.set(i + "", other_s);
					}
				}
				if (s === void 0) {
					if (!has || get_descriptor(target, prop)?.writable) {
						s = with_parent(() => state$1(void 0, stack));
						set(s, proxy(value));
						sources.set(prop, s);
					}
				} else {
					has = s.v !== UNINITIALIZED;
					var p = with_parent(() => proxy(value));
					set(s, p);
				}
				var descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
				if (descriptor?.set) descriptor.set.call(receiver, value);
				if (!has) {
					if (is_proxied_array && typeof prop === "string") {
						var ls = sources.get("length");
						var n = Number(prop);
						if (Number.isInteger(n) && n >= ls.v) set(ls, n + 1);
					}
					increment(version);
				}
				return true;
			},
			ownKeys(target) {
				get(version);
				var own_keys = Reflect.ownKeys(target).filter((key) => {
					var source = sources.get(key);
					return source === void 0 || source.v !== UNINITIALIZED;
				});
				for (var [key, source] of sources) if (source.v !== UNINITIALIZED && !(key in target)) own_keys.push(key);
				return own_keys;
			},
			setPrototypeOf() {
				state_prototype_fixed();
			}
		});
	}
	var $window;
	var $document;
	var is_firefox;
	var first_child_getter;
	var next_sibling_getter;
	function init_operations() {
		if ($window !== void 0) return;
		$window = window;
		$document = document;
		is_firefox = /Firefox/.test(navigator.userAgent);
		var element_prototype = Element.prototype;
		var node_prototype = Node.prototype;
		var text_prototype = Text.prototype;
		first_child_getter = get_descriptor(node_prototype, "firstChild").get;
		next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get;
		if (is_extensible(element_prototype)) {
			element_prototype[CLASS_CACHE] = void 0;
			element_prototype[ATTRIBUTES_CACHE] = null;
			element_prototype[STYLE_CACHE] = void 0;
			element_prototype.__e = void 0;
		}
		if (is_extensible(text_prototype)) text_prototype[TEXT_CACHE] = void 0;
	}
	function create_text(value = "") {
		return document.createTextNode(value);
	}
	function get_first_child(node) {
		return first_child_getter.call(node);
	}
	function get_next_sibling(node) {
		return next_sibling_getter.call(node);
	}
	function child(node, is_text) {
		if (!hydrating) return get_first_child(node);
		var child = get_first_child(hydrate_node);
		if (child === null) child = hydrate_node.appendChild(create_text());
		else if (is_text && child.nodeType !== 3) {
			var text = create_text();
			child?.before(text);
			set_hydrate_node(text);
			return text;
		}
		if (is_text) merge_text_nodes(child);
		set_hydrate_node(child);
		return child;
	}
	function first_child(node, is_text = false) {
		if (!hydrating) {
			var first = get_first_child(node);
			if (first instanceof Comment && first.data === "") return get_next_sibling(first);
			return first;
		}
		if (is_text) {
			if (hydrate_node?.nodeType !== 3) {
				var text = create_text();
				hydrate_node?.before(text);
				set_hydrate_node(text);
				return text;
			}
			merge_text_nodes(hydrate_node);
		}
		return hydrate_node;
	}
	function sibling(node, count = 1, is_text = false) {
		let next_sibling = hydrating ? hydrate_node : node;
		var last_sibling;
		while (count--) {
			last_sibling = next_sibling;
			next_sibling = get_next_sibling(next_sibling);
		}
		if (!hydrating) return next_sibling;
		if (is_text) {
			if (next_sibling?.nodeType !== 3) {
				var text = create_text();
				if (next_sibling === null) last_sibling?.after(text);
				else next_sibling.before(text);
				set_hydrate_node(text);
				return text;
			}
			merge_text_nodes(next_sibling);
		}
		set_hydrate_node(next_sibling);
		return next_sibling;
	}
	function clear_text_content(node) {
		node.textContent = "";
	}
	function should_defer_append() {
		if (!async_mode_flag) return false;
		if (eager_block_effects !== null) return false;
		return (active_effect.f & REACTION_RAN) !== 0;
	}
	function create_element(tag, namespace, is) {
		let options = is ? { is } : void 0;
		return document.createElementNS(namespace ?? "http://www.w3.org/1999/xhtml", tag, options);
	}
	function merge_text_nodes(text) {
		if (text.nodeValue.length < 65536) return;
		let next = text.nextSibling;
		while (next !== null && next.nodeType === 3) {
			next.remove();
			text.nodeValue += next.nodeValue;
			next = text.nextSibling;
		}
	}
	var listening_to_form_reset = false;
	function add_form_reset_listener() {
		if (!listening_to_form_reset) {
			listening_to_form_reset = true;
			document.addEventListener("reset", (evt) => {
				Promise.resolve().then(() => {
					if (!evt.defaultPrevented) for (const e of evt.target.elements) e[FORM_RESET_HANDLER]?.();
				});
			}, { capture: true });
		}
	}
	function without_reactive_context(fn) {
		var previous_reaction = active_reaction;
		var previous_effect = active_effect;
		set_active_reaction(null);
		set_active_effect(null);
		try {
			return fn();
		} finally {
			set_active_reaction(previous_reaction);
			set_active_effect(previous_effect);
		}
	}
	function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) {
		element.addEventListener(event, () => without_reactive_context(handler));
		const prev = element[FORM_RESET_HANDLER];
		if (prev) element[FORM_RESET_HANDLER] = () => {
			prev();
			on_reset(true);
		};
		else element[FORM_RESET_HANDLER] = () => on_reset(true);
		add_form_reset_listener();
	}
	function validate_effect(rune) {
		if (active_effect === null) {
			if (active_reaction === null) effect_orphan(rune);
			effect_in_unowned_derived();
		}
		if (is_destroying_effect) effect_in_teardown(rune);
	}
	function push_effect(effect, parent_effect) {
		var parent_last = parent_effect.last;
		if (parent_last === null) parent_effect.last = parent_effect.first = effect;
		else {
			parent_last.next = effect;
			effect.prev = parent_last;
			parent_effect.last = effect;
		}
	}
	function create_effect(type, fn) {
		var parent = active_effect;
		if (parent !== null && (parent.f & 8192) !== 0) type |= INERT;
		var effect = {
			ctx: component_context,
			deps: null,
			nodes: null,
			f: type | DIRTY | 512,
			first: null,
			fn,
			last: null,
			next: null,
			parent,
			b: parent && parent.b,
			prev: null,
			teardown: null,
			wv: 0,
			ac: null
		};
		current_batch?.register_created_effect(effect);
		var e = effect;
		if ((type & 4) !== 0) if (collected_effects !== null) collected_effects.push(effect);
		else Batch.ensure().schedule(effect);
		else if (fn !== null) {
			try {
				update_effect(effect);
			} catch (e) {
				destroy_effect(effect);
				throw e;
			}
			if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && (e.f & 524288) === 0) {
				e = e.first;
				if ((type & 16) !== 0 && (type & 65536) !== 0 && e !== null) e.f |= EFFECT_TRANSPARENT;
			}
		}
		if (e !== null) {
			e.parent = parent;
			if (parent !== null) push_effect(e, parent);
			if (active_reaction !== null && (active_reaction.f & 2) !== 0 && (type & 64) === 0) {
				var derived = active_reaction;
				(derived.effects ??= []).push(e);
			}
		}
		return effect;
	}
	function effect_tracking() {
		return active_reaction !== null && !untracking;
	}
	function teardown(fn) {
		const effect = create_effect(8, null);
		set_signal_status(effect, CLEAN);
		effect.teardown = fn;
		return effect;
	}
	function user_effect(fn) {
		validate_effect("$effect");
		var flags = active_effect.f;
		if (!active_reaction && (flags & 32) !== 0 && (flags & 32768) === 0) {
			var context = component_context;
			(context.e ??= []).push(fn);
		} else return create_user_effect(fn);
	}
	function create_user_effect(fn) {
		return create_effect(4 | USER_EFFECT, fn);
	}
	function user_pre_effect(fn) {
		validate_effect("$effect.pre");
		return create_effect(8 | USER_EFFECT, fn);
	}
	function component_root(fn) {
		Batch.ensure();
		const effect = create_effect(64 | EFFECT_PRESERVED, fn);
		return (options = {}) => {
			return new Promise((fulfil) => {
				if (options.outro) pause_effect(effect, () => {
					destroy_effect(effect);
					fulfil(void 0);
				});
				else {
					destroy_effect(effect);
					fulfil(void 0);
				}
			});
		};
	}
	function effect(fn) {
		return create_effect(4, fn);
	}
	function async_effect(fn) {
		return create_effect(ASYNC | EFFECT_PRESERVED, fn);
	}
	function render_effect(fn, flags = 0) {
		return create_effect(8 | flags, fn);
	}
	function template_effect(fn, sync = [], async = [], blockers = []) {
		flatten(blockers, sync, async, (values) => {
			create_effect(8, () => fn(...values.map(get)));
		});
	}
	function deferred_template_effect(fn, sync = [], async = [], blockers = []) {
		flatten(blockers, sync, async, (values) => {
			create_effect(4, () => fn(...values.map(get)));
		});
	}
	function block(fn, flags = 0) {
		return create_effect(16 | flags, fn);
	}
	function managed(fn, flags = 0) {
		return create_effect(MANAGED_EFFECT | flags, fn);
	}
	function branch(fn) {
		return create_effect(32 | EFFECT_PRESERVED, fn);
	}
	function execute_effect_teardown(effect) {
		var teardown = effect.teardown;
		if (teardown !== null) {
			const previously_destroying_effect = is_destroying_effect;
			const previous_reaction = active_reaction;
			set_is_destroying_effect(true);
			set_active_reaction(null);
			try {
				teardown.call(null);
			} finally {
				set_is_destroying_effect(previously_destroying_effect);
				set_active_reaction(previous_reaction);
			}
		}
	}
	function destroy_effect_children(signal, remove_dom = false) {
		var effect = signal.first;
		signal.first = signal.last = null;
		while (effect !== null) {
			const controller = effect.ac;
			if (controller !== null) without_reactive_context(() => {
				controller.abort(STALE_REACTION);
			});
			var next = effect.next;
			if ((effect.f & 64) !== 0) effect.parent = null;
			else destroy_effect(effect, remove_dom);
			effect = next;
		}
	}
	function destroy_block_effect_children(signal) {
		var effect = signal.first;
		while (effect !== null) {
			var next = effect.next;
			if ((effect.f & 32) === 0) destroy_effect(effect);
			effect = next;
		}
	}
	function destroy_effect(effect, remove_dom = true) {
		var removed = false;
		if ((remove_dom || (effect.f & 262144) !== 0) && effect.nodes !== null && effect.nodes.end !== null) {
			remove_effect_dom(effect.nodes.start, effect.nodes.end);
			removed = true;
		}
		set_signal_status(effect, DESTROYING);
		destroy_effect_children(effect, remove_dom && !removed);
		remove_reactions(effect, 0);
		var transitions = effect.nodes && effect.nodes.t;
		if (transitions !== null) for (const transition of transitions) transition.stop();
		execute_effect_teardown(effect);
		effect.f ^= DESTROYING;
		effect.f |= DESTROYED;
		var parent = effect.parent;
		if (parent !== null && parent.first !== null) unlink_effect(effect);
		effect.next = effect.prev = effect.teardown = effect.ctx = effect.deps = effect.fn = effect.nodes = effect.ac = effect.b = null;
	}
	function remove_effect_dom(node, end) {
		while (node !== null) {
			var next = node === end ? null : get_next_sibling(node);
			node.remove();
			node = next;
		}
	}
	function unlink_effect(effect) {
		var parent = effect.parent;
		var prev = effect.prev;
		var next = effect.next;
		if (prev !== null) prev.next = next;
		if (next !== null) next.prev = prev;
		if (parent !== null) {
			if (parent.first === effect) parent.first = next;
			if (parent.last === effect) parent.last = prev;
		}
	}
	function pause_effect(effect, callback, destroy = true) {
		var transitions = [];
		pause_children(effect, transitions, true);
		var fn = () => {
			if (destroy) destroy_effect(effect);
			if (callback) callback();
		};
		var remaining = transitions.length;
		if (remaining > 0) {
			var check = () => --remaining || fn();
			for (var transition of transitions) transition.out(check);
		} else fn();
	}
	function pause_children(effect, transitions, local) {
		if ((effect.f & 8192) !== 0) return;
		effect.f ^= INERT;
		var t = effect.nodes && effect.nodes.t;
		if (t !== null) {
			for (const transition of t) if (transition.is_global || local) transitions.push(transition);
		}
		var child = effect.first;
		while (child !== null) {
			var sibling = child.next;
			if ((child.f & 64) === 0) {
				var transparent = (child.f & 65536) !== 0 || (child.f & 32) !== 0 && (effect.f & 16) !== 0;
				pause_children(child, transitions, transparent ? local : false);
			}
			child = sibling;
		}
	}
	function resume_effect(effect) {
		resume_children(effect, true);
	}
	function resume_children(effect, local) {
		if ((effect.f & 8192) === 0) return;
		effect.f ^= INERT;
		if ((effect.f & 1024) === 0) {
			set_signal_status(effect, DIRTY);
			Batch.ensure().schedule(effect);
		}
		var child = effect.first;
		while (child !== null) {
			var sibling = child.next;
			var transparent = (child.f & 65536) !== 0 || (child.f & 32) !== 0;
			resume_children(child, transparent ? local : false);
			child = sibling;
		}
		var t = effect.nodes && effect.nodes.t;
		if (t !== null) {
			for (const transition of t) if (transition.is_global || local) transition.in();
		}
	}
	function move_effect(effect, fragment) {
		if (!effect.nodes) return;
		var node = effect.nodes.start;
		var end = effect.nodes.end;
		while (node !== null) {
			var next = node === end ? null : get_next_sibling(node);
			fragment.append(node);
			node = next;
		}
	}
	var captured_signals = null;
	var is_updating_effect = false;
	var is_destroying_effect = false;
	function set_is_destroying_effect(value) {
		is_destroying_effect = value;
	}
	var active_reaction = null;
	var untracking = false;
	function set_active_reaction(reaction) {
		active_reaction = reaction;
	}
	var active_effect = null;
	function set_active_effect(effect) {
		active_effect = effect;
	}
	var current_sources = null;
	function push_reaction_value(value) {
		if (active_reaction !== null && (!async_mode_flag || (active_reaction.f & 2) !== 0)) if (current_sources === null) current_sources = [value];
		else current_sources.push(value);
	}
	var new_deps = null;
	var skipped_deps = 0;
	var untracked_writes = null;
	function set_untracked_writes(value) {
		untracked_writes = value;
	}
	var write_version = 1;
	var read_version = 0;
	var update_version = read_version;
	function set_update_version(value) {
		update_version = value;
	}
	function increment_write_version() {
		return ++write_version;
	}
	function is_dirty(reaction) {
		var flags = reaction.f;
		if ((flags & 2048) !== 0) return true;
		if (flags & 2) reaction.f &= ~WAS_MARKED;
		if ((flags & 4096) !== 0) {
			var dependencies = reaction.deps;
			var length = dependencies.length;
			for (var i = 0; i < length; i++) {
				var dependency = dependencies[i];
				if (is_dirty(dependency)) update_derived(dependency);
				if (dependency.wv > reaction.wv) return true;
			}
			if ((flags & 512) !== 0 && batch_values === null) set_signal_status(reaction, CLEAN);
		}
		return false;
	}
	function schedule_possible_effect_self_invalidation(signal, effect, root = true) {
		var reactions = signal.reactions;
		if (reactions === null) return;
		if (!async_mode_flag && current_sources !== null && includes.call(current_sources, signal)) return;
		for (var i = 0; i < reactions.length; i++) {
			var reaction = reactions[i];
			if ((reaction.f & 2) !== 0) schedule_possible_effect_self_invalidation(reaction, effect, false);
			else if (effect === reaction) {
				if (root) set_signal_status(reaction, DIRTY);
				else if ((reaction.f & 1024) !== 0) set_signal_status(reaction, MAYBE_DIRTY);
				schedule_effect(reaction);
			}
		}
	}
	function update_reaction(reaction) {
		var previous_deps = new_deps;
		var previous_skipped_deps = skipped_deps;
		var previous_untracked_writes = untracked_writes;
		var previous_reaction = active_reaction;
		var previous_sources = current_sources;
		var previous_component_context = component_context;
		var previous_untracking = untracking;
		var previous_update_version = update_version;
		var flags = reaction.f;
		new_deps = null;
		skipped_deps = 0;
		untracked_writes = null;
		active_reaction = (flags & 96) === 0 ? reaction : null;
		current_sources = null;
		set_component_context(reaction.ctx);
		untracking = false;
		update_version = ++read_version;
		if (reaction.ac !== null) {
			without_reactive_context(() => {
				reaction.ac.abort(STALE_REACTION);
			});
			reaction.ac = null;
		}
		try {
			reaction.f |= REACTION_IS_UPDATING;
			var fn = reaction.fn;
			var result = fn();
			reaction.f |= REACTION_RAN;
			var deps = reaction.deps;
			var is_fork = current_batch?.is_fork;
			if (new_deps !== null) {
				var i;
				if (!is_fork) remove_reactions(reaction, skipped_deps);
				if (deps !== null && skipped_deps > 0) {
					deps.length = skipped_deps + new_deps.length;
					for (i = 0; i < new_deps.length; i++) deps[skipped_deps + i] = new_deps[i];
				} else reaction.deps = deps = new_deps;
				if (effect_tracking() && (reaction.f & 512) !== 0) for (i = skipped_deps; i < deps.length; i++) (deps[i].reactions ??= []).push(reaction);
			} else if (!is_fork && deps !== null && skipped_deps < deps.length) {
				remove_reactions(reaction, skipped_deps);
				deps.length = skipped_deps;
			}
			if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & 6146) === 0) for (i = 0; i < untracked_writes.length; i++) schedule_possible_effect_self_invalidation(untracked_writes[i], reaction);
			if (previous_reaction !== null && previous_reaction !== reaction) {
				read_version++;
				if (previous_reaction.deps !== null) for (let i = 0; i < previous_skipped_deps; i += 1) previous_reaction.deps[i].rv = read_version;
				if (previous_deps !== null) for (const dep of previous_deps) dep.rv = read_version;
				if (untracked_writes !== null) if (previous_untracked_writes === null) previous_untracked_writes = untracked_writes;
				else previous_untracked_writes.push(...untracked_writes);
			}
			if ((reaction.f & 8388608) !== 0) reaction.f ^= ERROR_VALUE;
			return result;
		} catch (error) {
			return handle_error(error);
		} finally {
			reaction.f ^= REACTION_IS_UPDATING;
			new_deps = previous_deps;
			skipped_deps = previous_skipped_deps;
			untracked_writes = previous_untracked_writes;
			active_reaction = previous_reaction;
			current_sources = previous_sources;
			set_component_context(previous_component_context);
			untracking = previous_untracking;
			update_version = previous_update_version;
		}
	}
	function remove_reaction(signal, dependency) {
		let reactions = dependency.reactions;
		if (reactions !== null) {
			var index = index_of.call(reactions, signal);
			if (index !== -1) {
				var new_length = reactions.length - 1;
				if (new_length === 0) reactions = dependency.reactions = null;
				else {
					reactions[index] = reactions[new_length];
					reactions.pop();
				}
			}
		}
		if (reactions === null && (dependency.f & 2) !== 0 && (new_deps === null || !includes.call(new_deps, dependency))) {
			var derived = dependency;
			if ((derived.f & 512) !== 0) {
				derived.f ^= 512;
				derived.f &= ~WAS_MARKED;
			}
			if (derived.v !== UNINITIALIZED) update_derived_status(derived);
			freeze_derived_effects(derived);
			remove_reactions(derived, 0);
		}
	}
	function remove_reactions(signal, start_index) {
		var dependencies = signal.deps;
		if (dependencies === null) return;
		for (var i = start_index; i < dependencies.length; i++) remove_reaction(signal, dependencies[i]);
	}
	function update_effect(effect) {
		var flags = effect.f;
		if ((flags & 16384) !== 0) return;
		set_signal_status(effect, CLEAN);
		var previous_effect = active_effect;
		var was_updating_effect = is_updating_effect;
		active_effect = effect;
		is_updating_effect = true;
		try {
			if ((flags & 16777232) !== 0) destroy_block_effect_children(effect);
			else destroy_effect_children(effect);
			execute_effect_teardown(effect);
			var teardown = update_reaction(effect);
			effect.teardown = typeof teardown === "function" ? teardown : null;
			effect.wv = write_version;
		} finally {
			is_updating_effect = was_updating_effect;
			active_effect = previous_effect;
		}
	}
	async function tick() {
		if (async_mode_flag) return new Promise((f) => {
			requestAnimationFrame(() => f());
			setTimeout(() => f());
		});
		await Promise.resolve();
		flushSync();
	}
	function get(signal) {
		var is_derived = (signal.f & 2) !== 0;
		captured_signals?.add(signal);
		if (active_reaction !== null && !untracking) {
			if (!(active_effect !== null && (active_effect.f & 16384) !== 0) && (current_sources === null || !includes.call(current_sources, signal))) {
				var deps = active_reaction.deps;
				if ((active_reaction.f & 2097152) !== 0) {
					if (signal.rv < read_version) {
						signal.rv = read_version;
						if (new_deps === null && deps !== null && deps[skipped_deps] === signal) skipped_deps++;
						else if (new_deps === null) new_deps = [signal];
						else new_deps.push(signal);
					}
				} else {
					active_reaction.deps ??= [];
					if (!includes.call(active_reaction.deps, signal)) active_reaction.deps.push(signal);
					var reactions = signal.reactions;
					if (reactions === null) signal.reactions = [active_reaction];
					else if (!includes.call(reactions, active_reaction)) reactions.push(active_reaction);
				}
			}
		}
		if (is_destroying_effect && old_values.has(signal)) return old_values.get(signal);
		if (is_derived) {
			var derived = signal;
			if (is_destroying_effect) {
				var value = derived.v;
				if ((derived.f & 1024) === 0 && derived.reactions !== null || depends_on_old_values(derived)) value = execute_derived(derived);
				old_values.set(derived, value);
				return value;
			}
			var should_connect = (derived.f & 512) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & 512) !== 0);
			var is_new = (derived.f & REACTION_RAN) === 0;
			if (is_dirty(derived)) {
				if (should_connect) derived.f |= 512;
				update_derived(derived);
			}
			if (should_connect && !is_new) {
				unfreeze_derived_effects(derived);
				reconnect(derived);
			}
		}
		if (batch_values?.has(signal)) return batch_values.get(signal);
		if ((signal.f & 8388608) !== 0) throw signal.v;
		return signal.v;
	}
	function reconnect(derived) {
		derived.f |= 512;
		if (derived.deps === null) return;
		for (const dep of derived.deps) {
			(dep.reactions ??= []).push(derived);
			if ((dep.f & 2) !== 0 && (dep.f & 512) === 0) {
				unfreeze_derived_effects(dep);
				reconnect(dep);
			}
		}
	}
	function depends_on_old_values(derived) {
		if (derived.v === UNINITIALIZED) return true;
		if (derived.deps === null) return false;
		for (const dep of derived.deps) {
			if (old_values.has(dep)) return true;
			if ((dep.f & 2) !== 0 && depends_on_old_values(dep)) return true;
		}
		return false;
	}
	function untrack(fn) {
		var previous_untracking = untracking;
		try {
			untracking = true;
			return fn();
		} finally {
			untracking = previous_untracking;
		}
	}
	function deep_read_state(value) {
		if (typeof value !== "object" || !value || value instanceof EventTarget) return;
		if (STATE_SYMBOL in value) deep_read(value);
		else if (!Array.isArray(value)) for (let key in value) {
			const prop = value[key];
			if (typeof prop === "object" && prop && STATE_SYMBOL in prop) deep_read(prop);
		}
	}
	function deep_read(value, visited = new Set()) {
		if (typeof value === "object" && value !== null && !(value instanceof EventTarget) && !visited.has(value)) {
			visited.add(value);
			if (value instanceof Date) value.getTime();
			for (let key in value) try {
				deep_read(value[key], visited);
			} catch (e) {}
			const proto = get_prototype_of(value);
			if (proto !== Object.prototype && proto !== Array.prototype && proto !== Map.prototype && proto !== Set.prototype && proto !== Date.prototype) {
				const descriptors = get_descriptors(proto);
				for (let key in descriptors) {
					const get = descriptors[key].get;
					if (get) try {
						get.call(value);
					} catch (e) {}
				}
			}
		}
	}
	var PASSIVE_EVENTS = ["touchstart", "touchmove"];
	function is_passive_event(name) {
		return PASSIVE_EVENTS.includes(name);
	}
	var event_symbol = Symbol("events");
	var all_registered_events = new Set();
	var root_event_handles = new Set();
	function replay_events(dom) {
		if (!hydrating) return;
		dom.removeAttribute("onload");
		dom.removeAttribute("onerror");
		const event = dom.__e;
		if (event !== void 0) {
			dom.__e = void 0;
			queueMicrotask(() => {
				if (dom.isConnected) dom.dispatchEvent(event);
			});
		}
	}
	function create_event(event_name, dom, handler, options = {}) {
		function target_handler(event) {
			if (!options.capture) handle_event_propagation.call(dom, event);
			if (!event.cancelBubble) return without_reactive_context(() => {
				return handler?.call(this, event);
			});
		}
		if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") queue_micro_task(() => {
			dom.addEventListener(event_name, target_handler, options);
		});
		else dom.addEventListener(event_name, target_handler, options);
		return target_handler;
	}
	function on(element, type, handler, options = {}) {
		var target_handler = create_event(type, element, handler, options);
		return () => {
			element.removeEventListener(type, target_handler, options);
		};
	}
	function event(event_name, dom, handler, capture, passive) {
		var options = {
			capture,
			passive
		};
		var target_handler = create_event(event_name, dom, handler, options);
		if (dom === document.body || dom === window || dom === document || dom instanceof HTMLMediaElement) teardown(() => {
			dom.removeEventListener(event_name, target_handler, options);
		});
	}
	function delegated(event_name, element, handler) {
		(element[event_symbol] ??= {})[event_name] = handler;
	}
	function delegate(events) {
		for (var i = 0; i < events.length; i++) all_registered_events.add(events[i]);
		for (var fn of root_event_handles) fn(events);
	}
	var last_propagated_event = null;
	function handle_event_propagation(event) {
		var handler_element = this;
		var owner_document = handler_element.ownerDocument;
		var event_name = event.type;
		var path = event.composedPath?.() || [];
		var current_target = path[0] || event.target;
		last_propagated_event = event;
		var path_idx = 0;
		var handled_at = last_propagated_event === event && event[event_symbol];
		if (handled_at) {
			var at_idx = path.indexOf(handled_at);
			if (at_idx !== -1 && (handler_element === document || handler_element === window)) {
				event[event_symbol] = handler_element;
				return;
			}
			var handler_idx = path.indexOf(handler_element);
			if (handler_idx === -1) return;
			if (at_idx <= handler_idx) path_idx = at_idx;
		}
		current_target = path[path_idx] || event.target;
		if (current_target === handler_element) return;
		define_property(event, "currentTarget", {
			configurable: true,
			get() {
				return current_target || owner_document;
			}
		});
		var previous_reaction = active_reaction;
		var previous_effect = active_effect;
		set_active_reaction(null);
		set_active_effect(null);
		try {
			var throw_error;
			var other_errors = [];
			while (current_target !== null) {
				var parent_element = current_target.assignedSlot || current_target.parentNode || current_target.host || null;
				try {
					var delegated = current_target[event_symbol]?.[event_name];
					if (delegated != null && (!current_target.disabled || event.target === current_target)) delegated.call(current_target, event);
				} catch (error) {
					if (throw_error) other_errors.push(error);
					else throw_error = error;
				}
				if (event.cancelBubble || parent_element === handler_element || parent_element === null) break;
				current_target = parent_element;
			}
			if (throw_error) {
				for (let error of other_errors) queueMicrotask(() => {
					throw error;
				});
				throw throw_error;
			}
		} finally {
			event[event_symbol] = handler_element;
			delete event.currentTarget;
			set_active_reaction(previous_reaction);
			set_active_effect(previous_effect);
		}
	}
	var policy = globalThis?.window?.trustedTypes && globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { createHTML: (html) => {
		return html;
	} });
	function create_trusted_html(html) {
		return policy?.createHTML(html) ?? html;
	}
	function create_fragment_from_html(html) {
		var elem = create_element("template");
		elem.innerHTML = create_trusted_html(html.replaceAll("<!>", "<!---->"));
		return elem.content;
	}
	function assign_nodes(start, end) {
		var effect = active_effect;
		if (effect.nodes === null) effect.nodes = {
			start,
			end,
			a: null,
			t: null
		};
	}
	function from_html(content, flags) {
		var is_fragment = (flags & 1) !== 0;
		var use_import_node = (flags & 2) !== 0;
		var node;
		var has_start = !content.startsWith("<!>");
		return () => {
			if (hydrating) {
				assign_nodes(hydrate_node, null);
				return hydrate_node;
			}
			if (node === void 0) {
				node = create_fragment_from_html(has_start ? content : "<!>" + content);
				if (!is_fragment) node = get_first_child(node);
			}
			var clone = use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true);
			if (is_fragment) {
				var start = get_first_child(clone);
				var end = clone.lastChild;
				assign_nodes(start, end);
			} else assign_nodes(clone, clone);
			return clone;
		};
	}
	function from_namespace(content, flags, ns = "svg") {
		var has_start = !content.startsWith("<!>");
		var is_fragment = (flags & 1) !== 0;
		var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`;
		var node;
		return () => {
			if (hydrating) {
				assign_nodes(hydrate_node, null);
				return hydrate_node;
			}
			if (!node) {
				var root = get_first_child(create_fragment_from_html(wrapped));
				if (is_fragment) {
					node = document.createDocumentFragment();
					while (get_first_child(root)) node.appendChild(get_first_child(root));
				} else node = get_first_child(root);
			}
			var clone = node.cloneNode(true);
			if (is_fragment) {
				var start = get_first_child(clone);
				var end = clone.lastChild;
				assign_nodes(start, end);
			} else assign_nodes(clone, clone);
			return clone;
		};
	}
	function from_svg(content, flags) {
		return from_namespace(content, flags, "svg");
	}
	function text(value = "") {
		if (!hydrating) {
			var t = create_text(value + "");
			assign_nodes(t, t);
			return t;
		}
		var node = hydrate_node;
		if (node.nodeType !== 3) {
			node.before(node = create_text());
			set_hydrate_node(node);
		} else merge_text_nodes(node);
		assign_nodes(node, node);
		return node;
	}
	function comment() {
		if (hydrating) {
			assign_nodes(hydrate_node, null);
			return hydrate_node;
		}
		var frag = document.createDocumentFragment();
		var start = document.createComment("");
		var anchor = create_text();
		frag.append(start, anchor);
		assign_nodes(start, anchor);
		return frag;
	}
	function append(anchor, dom) {
		if (hydrating) {
			var effect = active_effect;
			if ((effect.f & 32768) === 0 || effect.nodes.end === null) effect.nodes.end = hydrate_node;
			hydrate_next();
			return;
		}
		if (anchor === null) return;
		anchor.before(dom);
	}
	var should_intro = true;
	function set_text(text, value) {
		var str = value == null ? "" : typeof value === "object" ? `${value}` : value;
		if (str !== (text[TEXT_CACHE] ??= text.nodeValue)) {
			text[TEXT_CACHE] = str;
			text.nodeValue = `${str}`;
		}
	}
	function mount(component, options) {
		return _mount(component, options);
	}
	var listeners = new Map();
	function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) {
		init_operations();
		var component = void 0;
		var unmount = component_root(() => {
			var anchor_node = anchor ?? target.appendChild(create_text());
			boundary(anchor_node, { pending: () => {} }, (anchor_node) => {
				push({});
				var ctx = component_context;
				if (context) ctx.c = context;
				if (events) props.$$events = events;
				if (hydrating) assign_nodes(anchor_node, null);
				should_intro = intro;
				component = Component(anchor_node, props) || {};
				should_intro = true;
				if (hydrating) {
					active_effect.nodes.end = hydrate_node;
					if (hydrate_node === null || hydrate_node.nodeType !== 8 || hydrate_node.data !== "]") {
						hydration_mismatch();
						throw HYDRATION_ERROR;
					}
				}
				pop();
			}, transformError);
			var registered_events = new Set();
			var event_handle = (events) => {
				for (var i = 0; i < events.length; i++) {
					var event_name = events[i];
					if (registered_events.has(event_name)) continue;
					registered_events.add(event_name);
					var passive = is_passive_event(event_name);
					for (const node of [target, document]) {
						var counts = listeners.get(node);
						if (counts === void 0) {
							counts = new Map();
							listeners.set(node, counts);
						}
						var count = counts.get(event_name);
						if (count === void 0) {
							node.addEventListener(event_name, handle_event_propagation, { passive });
							counts.set(event_name, 1);
						} else counts.set(event_name, count + 1);
					}
				}
			};
			event_handle(array_from(all_registered_events));
			root_event_handles.add(event_handle);
			return () => {
				for (var event_name of registered_events) for (const node of [target, document]) {
					var counts = listeners.get(node);
					var count = counts.get(event_name);
					if (--count == 0) {
						node.removeEventListener(event_name, handle_event_propagation);
						counts.delete(event_name);
						if (counts.size === 0) listeners.delete(node);
					} else counts.set(event_name, count);
				}
				root_event_handles.delete(event_handle);
				if (anchor_node !== anchor) anchor_node.parentNode?.removeChild(anchor_node);
			};
		});
		mounted_components.set(component, unmount);
		return component;
	}
	var mounted_components = new WeakMap();
	var BranchManager = class {
		anchor;
		#batches = new Map();
		#onscreen = new Map();
		#offscreen = new Map();
		#outroing = new Set();
		#transition = true;
		constructor(anchor, transition = true) {
			this.anchor = anchor;
			this.#transition = transition;
		}
		#commit = (batch) => {
			if (!this.#batches.has(batch)) return;
			var key = this.#batches.get(batch);
			var onscreen = this.#onscreen.get(key);
			if (onscreen) {
				resume_effect(onscreen);
				this.#outroing.delete(key);
			} else {
				var offscreen = this.#offscreen.get(key);
				if (offscreen) {
					this.#onscreen.set(key, offscreen.effect);
					this.#offscreen.delete(key);
					offscreen.fragment.lastChild.remove();
					this.anchor.before(offscreen.fragment);
					onscreen = offscreen.effect;
				}
			}
			for (const [b, k] of this.#batches) {
				this.#batches.delete(b);
				if (b === batch) break;
				const offscreen = this.#offscreen.get(k);
				if (offscreen) {
					destroy_effect(offscreen.effect);
					this.#offscreen.delete(k);
				}
			}
			for (const [k, effect] of this.#onscreen) {
				if (k === key || this.#outroing.has(k)) continue;
				const on_destroy = () => {
					if (Array.from(this.#batches.values()).includes(k)) {
						var fragment = document.createDocumentFragment();
						move_effect(effect, fragment);
						fragment.append(create_text());
						this.#offscreen.set(k, {
							effect,
							fragment
						});
					} else destroy_effect(effect);
					this.#outroing.delete(k);
					this.#onscreen.delete(k);
				};
				if (this.#transition || !onscreen) {
					this.#outroing.add(k);
					pause_effect(effect, on_destroy, false);
				} else on_destroy();
			}
		};
		#discard = (batch) => {
			this.#batches.delete(batch);
			const keys = Array.from(this.#batches.values());
			for (const [k, branch] of this.#offscreen) if (!keys.includes(k)) {
				destroy_effect(branch.effect);
				this.#offscreen.delete(k);
			}
		};
		ensure(key, fn) {
			var batch = current_batch;
			var defer = should_defer_append();
			if (fn && !this.#onscreen.has(key) && !this.#offscreen.has(key)) if (defer) {
				var fragment = document.createDocumentFragment();
				var target = create_text();
				fragment.append(target);
				this.#offscreen.set(key, {
					effect: branch(() => fn(target)),
					fragment
				});
			} else this.#onscreen.set(key, branch(() => fn(this.anchor)));
			this.#batches.set(batch, key);
			if (defer) {
				for (const [k, effect] of this.#onscreen) if (k === key) batch.unskip_effect(effect);
				else batch.skip_effect(effect);
				for (const [k, branch] of this.#offscreen) if (k === key) batch.unskip_effect(branch.effect);
				else batch.skip_effect(branch.effect);
				batch.oncommit(this.#commit);
				batch.ondiscard(this.#discard);
			} else {
				if (hydrating) this.anchor = hydrate_node;
				this.#commit(batch);
			}
		}
	};
	var PENDING = 0;
	var THEN = 1;
	var CATCH = 2;
	function await_block(node, get_input, pending_fn, then_fn, catch_fn) {
		if (hydrating) hydrate_next();
		var runes = is_runes();
		var v = UNINITIALIZED;
		var value = runes ? source(v) : mutable_source(v, false, false);
		var error = runes ? source(v) : mutable_source(v, false, false);
		var branches = new BranchManager(node);
		block(() => {
			var batch = current_batch;
			var input = get_input();
			var destroyed = false;
			let mismatch = hydrating && is_promise(input) === (node.data === "[!");
			if (mismatch) {
				set_hydrate_node(skip_nodes());
				set_hydrating(false);
			}
			if (is_promise(input)) {
				var restore = capture();
				var resolved = false;
				const resolve = (fn) => {
					if (destroyed) return;
					resolved = true;
					restore(false);
					if (current_batch === batch) batch.deactivate();
					Batch.ensure();
					try {
						fn();
					} finally {
						unset_context(false);
						if (!is_flushing_sync) flushSync();
					}
				};
				input.then((v) => {
					resolve(() => {
						internal_set(value, v);
						branches.ensure(THEN, then_fn && ((target) => then_fn(target, value)));
					});
				}, (e) => {
					resolve(() => {
						internal_set(error, e);
						branches.ensure(CATCH, catch_fn && ((target) => catch_fn(target, error)));
						if (!catch_fn) throw error.v;
					});
				});
				if (hydrating) branches.ensure(PENDING, pending_fn);
				else queue_micro_task(() => {
					if (!resolved) resolve(() => {
						branches.ensure(PENDING, pending_fn);
					});
				});
			} else {
				internal_set(value, input);
				branches.ensure(THEN, then_fn && ((target) => then_fn(target, value)));
			}
			if (mismatch) set_hydrating(true);
			return () => {
				destroyed = true;
			};
		});
	}
	function if_block(node, fn, elseif = false) {
		var marker;
		if (hydrating) {
			marker = hydrate_node;
			hydrate_next();
		}
		var branches = new BranchManager(node);
		var flags = elseif ? EFFECT_TRANSPARENT : 0;
		function update_branch(key, fn) {
			if (hydrating) {
				var data = read_hydration_instruction(marker);
				if (key !== parseInt(data.substring(1))) {
					var anchor = skip_nodes();
					set_hydrate_node(anchor);
					branches.anchor = anchor;
					set_hydrating(false);
					branches.ensure(key, fn);
					set_hydrating(true);
					return;
				}
			}
			branches.ensure(key, fn);
		}
		block(() => {
			var has_branch = false;
			fn((fn, key = 0) => {
				has_branch = true;
				update_branch(key, fn);
			});
			if (!has_branch) update_branch(-1, null);
		}, flags);
	}
	function index(_, i) {
		return i;
	}
	function pause_effects(state, to_destroy, controlled_anchor) {
		var transitions = [];
		var length = to_destroy.length;
		var group;
		var remaining = to_destroy.length;
		for (var i = 0; i < length; i++) {
			let effect = to_destroy[i];
			pause_effect(effect, () => {
				if (group) {
					group.pending.delete(effect);
					group.done.add(effect);
					if (group.pending.size === 0) {
						var groups = state.outrogroups;
						destroy_effects(state, array_from(group.done));
						groups.delete(group);
						if (groups.size === 0) state.outrogroups = null;
					}
				} else remaining -= 1;
			}, false);
		}
		if (remaining === 0) {
			var fast_path = transitions.length === 0 && controlled_anchor !== null;
			if (fast_path) {
				var anchor = controlled_anchor;
				var parent_node = anchor.parentNode;
				clear_text_content(parent_node);
				parent_node.append(anchor);
				state.items.clear();
			}
			destroy_effects(state, to_destroy, !fast_path);
		} else {
			group = {
				pending: new Set(to_destroy),
				done: new Set()
			};
			(state.outrogroups ??= new Set()).add(group);
		}
	}
	function destroy_effects(state, to_destroy, remove_dom = true) {
		var preserved_effects;
		if (state.pending.size > 0) {
			preserved_effects = new Set();
			for (const keys of state.pending.values()) for (const key of keys) preserved_effects.add(state.items.get(key).e);
		}
		for (var i = 0; i < to_destroy.length; i++) {
			var e = to_destroy[i];
			if (preserved_effects?.has(e)) {
				e.f |= EFFECT_OFFSCREEN;
				move_effect(e, document.createDocumentFragment());
			} else destroy_effect(to_destroy[i], remove_dom);
		}
	}
	var offscreen_anchor;
	function each(node, flags, get_collection, get_key, render_fn, fallback_fn = null) {
		var anchor = node;
		var items = new Map();
		if ((flags & 4) !== 0) {
			var parent_node = node;
			anchor = hydrating ? set_hydrate_node(get_first_child(parent_node)) : parent_node.appendChild(create_text());
		}
		if (hydrating) hydrate_next();
		var fallback = null;
		var each_array = derived_safe_equal(() => {
			var collection = get_collection();
			return is_array(collection) ? collection : collection == null ? [] : array_from(collection);
		});
		var array;
		var pending = new Map();
		var first_run = true;
		function commit(batch) {
			if ((state.effect.f & 16384) !== 0) return;
			state.pending.delete(batch);
			state.fallback = fallback;
			reconcile(state, array, anchor, flags, get_key);
			if (fallback !== null) if (array.length === 0) if ((fallback.f & 33554432) === 0) resume_effect(fallback);
			else {
				fallback.f ^= EFFECT_OFFSCREEN;
				move(fallback, null, anchor);
			}
			else pause_effect(fallback, () => {
				fallback = null;
			});
		}
		function discard(batch) {
			state.pending.delete(batch);
		}
		var state = {
			effect: block(() => {
				array = get(each_array);
				var length = array.length;
				let mismatch = false;
				if (hydrating) {
					if (read_hydration_instruction(anchor) === "[!" !== (length === 0)) {
						anchor = skip_nodes();
						set_hydrate_node(anchor);
						set_hydrating(false);
						mismatch = true;
					}
				}
				var keys = new Set();
				var batch = current_batch;
				var defer = should_defer_append();
				for (var index = 0; index < length; index += 1) {
					if (hydrating && hydrate_node.nodeType === 8 && hydrate_node.data === "]") {
						anchor = hydrate_node;
						mismatch = true;
						set_hydrating(false);
					}
					var value = array[index];
					var key = get_key(value, index);
					var item = first_run ? null : items.get(key);
					if (item) {
						if (item.v) internal_set(item.v, value);
						if (item.i) internal_set(item.i, index);
						if (defer) batch.unskip_effect(item.e);
					} else {
						item = create_item(items, first_run ? anchor : offscreen_anchor ??= create_text(), value, key, index, render_fn, flags, get_collection);
						if (!first_run) item.e.f |= EFFECT_OFFSCREEN;
						items.set(key, item);
					}
					keys.add(key);
				}
				if (length === 0 && fallback_fn && !fallback) if (first_run) fallback = branch(() => fallback_fn(anchor));
				else {
					fallback = branch(() => fallback_fn(offscreen_anchor ??= create_text()));
					fallback.f |= EFFECT_OFFSCREEN;
				}
				if (length > keys.size) each_key_duplicate("", "", "");
				if (hydrating && length > 0) set_hydrate_node(skip_nodes());
				if (!first_run) {
					pending.set(batch, keys);
					if (defer) {
						for (const [key, item] of items) if (!keys.has(key)) batch.skip_effect(item.e);
						batch.oncommit(commit);
						batch.ondiscard(discard);
					} else commit(batch);
				}
				if (mismatch) set_hydrating(true);
				get(each_array);
			}),
			flags,
			items,
			pending,
			outrogroups: null,
			fallback
		};
		first_run = false;
		if (hydrating) anchor = hydrate_node;
	}
	function skip_to_branch(effect) {
		while (effect !== null && (effect.f & 32) === 0) effect = effect.next;
		return effect;
	}
	function reconcile(state, array, anchor, flags, get_key) {
		var is_animated = (flags & 8) !== 0;
		var length = array.length;
		var items = state.items;
		var current = skip_to_branch(state.effect.first);
		var seen;
		var prev = null;
		var to_animate;
		var matched = [];
		var stashed = [];
		var value;
		var key;
		var effect;
		var i;
		if (is_animated) for (i = 0; i < length; i += 1) {
			value = array[i];
			key = get_key(value, i);
			effect = items.get(key).e;
			if ((effect.f & 33554432) === 0) {
				effect.nodes?.a?.measure();
				(to_animate ??= new Set()).add(effect);
			}
		}
		for (i = 0; i < length; i += 1) {
			value = array[i];
			key = get_key(value, i);
			effect = items.get(key).e;
			if (state.outrogroups !== null) for (const group of state.outrogroups) {
				group.pending.delete(effect);
				group.done.delete(effect);
			}
			if ((effect.f & 8192) !== 0) {
				resume_effect(effect);
				if (is_animated) {
					effect.nodes?.a?.unfix();
					(to_animate ??= new Set()).delete(effect);
				}
			}
			if ((effect.f & 33554432) !== 0) {
				effect.f ^= EFFECT_OFFSCREEN;
				if (effect === current) move(effect, null, anchor);
				else {
					var next = prev ? prev.next : current;
					if (effect === state.effect.last) state.effect.last = effect.prev;
					if (effect.prev) effect.prev.next = effect.next;
					if (effect.next) effect.next.prev = effect.prev;
					link(state, prev, effect);
					link(state, effect, next);
					move(effect, next, anchor);
					prev = effect;
					matched = [];
					stashed = [];
					current = skip_to_branch(prev.next);
					continue;
				}
			}
			if (effect !== current) {
				if (seen !== void 0 && seen.has(effect)) {
					if (matched.length < stashed.length) {
						var start = stashed[0];
						var j;
						prev = start.prev;
						var a = matched[0];
						var b = matched[matched.length - 1];
						for (j = 0; j < matched.length; j += 1) move(matched[j], start, anchor);
						for (j = 0; j < stashed.length; j += 1) seen.delete(stashed[j]);
						link(state, a.prev, b.next);
						link(state, prev, a);
						link(state, b, start);
						current = start;
						prev = b;
						i -= 1;
						matched = [];
						stashed = [];
					} else {
						seen.delete(effect);
						move(effect, current, anchor);
						link(state, effect.prev, effect.next);
						link(state, effect, prev === null ? state.effect.first : prev.next);
						link(state, prev, effect);
						prev = effect;
					}
					continue;
				}
				matched = [];
				stashed = [];
				while (current !== null && current !== effect) {
					(seen ??= new Set()).add(current);
					stashed.push(current);
					current = skip_to_branch(current.next);
				}
				if (current === null) continue;
			}
			if ((effect.f & 33554432) === 0) matched.push(effect);
			prev = effect;
			current = skip_to_branch(effect.next);
		}
		if (state.outrogroups !== null) {
			for (const group of state.outrogroups) if (group.pending.size === 0) {
				destroy_effects(state, array_from(group.done));
				state.outrogroups?.delete(group);
			}
			if (state.outrogroups.size === 0) state.outrogroups = null;
		}
		if (current !== null || seen !== void 0) {
			var to_destroy = [];
			if (seen !== void 0) {
				for (effect of seen) if ((effect.f & 8192) === 0) to_destroy.push(effect);
			}
			while (current !== null) {
				if ((current.f & 8192) === 0 && current !== state.fallback) to_destroy.push(current);
				current = skip_to_branch(current.next);
			}
			var destroy_length = to_destroy.length;
			if (destroy_length > 0) {
				var controlled_anchor = (flags & 4) !== 0 && length === 0 ? anchor : null;
				if (is_animated) {
					for (i = 0; i < destroy_length; i += 1) to_destroy[i].nodes?.a?.measure();
					for (i = 0; i < destroy_length; i += 1) to_destroy[i].nodes?.a?.fix();
				}
				pause_effects(state, to_destroy, controlled_anchor);
			}
		}
		if (is_animated) queue_micro_task(() => {
			if (to_animate === void 0) return;
			for (effect of to_animate) effect.nodes?.a?.apply();
		});
	}
	function create_item(items, anchor, value, key, index, render_fn, flags, get_collection) {
		var v = (flags & 1) !== 0 ? (flags & 16) === 0 ? mutable_source(value, false, false) : source(value) : null;
		var i = (flags & 2) !== 0 ? source(index) : null;
		return {
			v,
			i,
			e: branch(() => {
				render_fn(anchor, v ?? value, i ?? index, get_collection);
				return () => {
					items.delete(key);
				};
			})
		};
	}
	function move(effect, next, anchor) {
		if (!effect.nodes) return;
		var node = effect.nodes.start;
		var end = effect.nodes.end;
		var dest = next && (next.f & 33554432) === 0 ? next.nodes.start : anchor;
		while (node !== null) {
			var next_node = get_next_sibling(node);
			dest.before(node);
			if (node === end) return;
			node = next_node;
		}
	}
	function link(state, prev, next) {
		if (prev === null) state.effect.first = next;
		else prev.next = next;
		if (next === null) state.effect.last = prev;
		else next.prev = prev;
	}
	function html(node, get_value, is_controlled = false, svg = false, mathml = false, skip_warning = false) {
		var anchor = node;
		var value = "";
		if (is_controlled) {
			var parent_node = node;
			if (hydrating) anchor = set_hydrate_node(get_first_child(parent_node));
		}
		template_effect(() => {
			var effect = active_effect;
			if (value === (value = get_value() ?? "")) {
				if (hydrating) hydrate_next();
				return;
			}
			if (is_controlled && !hydrating) {
				effect.nodes = null;
				parent_node.innerHTML = value;
				if (value !== "") assign_nodes(get_first_child(parent_node), parent_node.lastChild);
				return;
			}
			if (effect.nodes !== null) {
				remove_effect_dom(effect.nodes.start, effect.nodes.end);
				effect.nodes = null;
			}
			if (value === "") return;
			if (hydrating) {
				hydrate_node.data;
				var next = hydrate_next();
				var last = next;
				while (next !== null && (next.nodeType !== 8 || next.data !== "")) {
					last = next;
					next = get_next_sibling(next);
				}
				if (next === null) {
					hydration_mismatch();
					throw HYDRATION_ERROR;
				}
				assign_nodes(hydrate_node, last);
				anchor = set_hydrate_node(next);
				return;
			}
			var wrapper = create_element(svg ? "svg" : mathml ? "math" : "template", svg ? NAMESPACE_SVG : mathml ? NAMESPACE_MATHML : void 0);
			wrapper.innerHTML = value;
			var node = svg || mathml ? wrapper : wrapper.content;
			assign_nodes(get_first_child(node), node.lastChild);
			if (svg || mathml) while (get_first_child(node)) anchor.before(get_first_child(node));
			else anchor.before(node);
		});
	}
	function snippet(node, get_snippet, ...args) {
		var branches = new BranchManager(node);
		block(() => {
			const snippet = get_snippet() ?? null;
			branches.ensure(snippet, snippet && ((anchor) => snippet(anchor, ...args)));
		}, EFFECT_TRANSPARENT);
	}
	var now = () => performance.now();
	var raf = {
		tick: (_) => requestAnimationFrame(_),
		now: () => now(),
		tasks: new Set()
	};
	function run_tasks() {
		const now = raf.now();
		raf.tasks.forEach((task) => {
			if (!task.c(now)) {
				raf.tasks.delete(task);
				task.f();
			}
		});
		if (raf.tasks.size !== 0) raf.tick(run_tasks);
	}
	function loop(callback) {
		let task;
		if (raf.tasks.size === 0) raf.tick(run_tasks);
		return {
			promise: new Promise((fulfill) => {
				raf.tasks.add(task = {
					c: callback,
					f: fulfill
				});
			}),
			abort() {
				raf.tasks.delete(task);
			}
		};
	}
	function dispatch_event(element, type) {
		without_reactive_context(() => {
			element.dispatchEvent(new CustomEvent(type));
		});
	}
	function css_property_to_camelcase(style) {
		if (style === "float") return "cssFloat";
		if (style === "offset") return "cssOffset";
		if (style.startsWith("--")) return style;
		const parts = style.split("-");
		if (parts.length === 1) return parts[0];
		return parts[0] + parts.slice(1).map((word) => word[0].toUpperCase() + word.slice(1)).join("");
	}
	function css_to_keyframe(css) {
		const keyframe = {};
		const parts = css.split(";");
		for (const part of parts) {
			const [property, value] = part.split(":");
			if (!property || value === void 0) break;
			const formatted_property = css_property_to_camelcase(property.trim());
			keyframe[formatted_property] = value.trim();
		}
		return keyframe;
	}
	var linear$1 = (t) => t;
	function transition(flags, element, get_fn, get_params) {
		var is_intro = (flags & 1) !== 0;
		var is_outro = (flags & 2) !== 0;
		var is_both = is_intro && is_outro;
		var is_global = (flags & 4) !== 0;
		var direction = is_both ? "both" : is_intro ? "in" : "out";
		var current_options;
		var inert = element.inert;
		var overflow = element.style.overflow;
		var intro;
		var outro;
		function get_options() {
			return without_reactive_context(() => {
				return current_options ??= get_fn()(element, get_params?.() ?? {}, { direction });
			});
		}
		var transition = {
			is_global,
			in() {
				element.inert = inert;
				if (!is_intro) {
					outro?.abort();
					outro?.reset?.();
					return;
				}
				if (!is_outro) intro?.abort();
				intro = animate(element, get_options(), outro, 1, () => {
					dispatch_event(element, "introstart");
				}, () => {
					dispatch_event(element, "introend");
					intro?.abort();
					intro = current_options = void 0;
					element.style.overflow = overflow;
				});
			},
			out(fn) {
				if (!is_outro) {
					fn?.();
					current_options = void 0;
					return;
				}
				element.inert = true;
				outro = animate(element, get_options(), intro, 0, () => {
					dispatch_event(element, "outrostart");
				}, () => {
					dispatch_event(element, "outroend");
					fn?.();
				});
			},
			stop: () => {
				intro?.abort();
				outro?.abort();
			}
		};
		var e = active_effect;
		(e.nodes.t ??= []).push(transition);
		if (is_intro && should_intro) {
			var run = is_global;
			if (!run) {
				var block = e.parent;
				while (block && (block.f & 65536) !== 0) while (block = block.parent) if ((block.f & 16) !== 0) break;
				run = !block || (block.f & 32768) !== 0;
			}
			if (run) effect(() => {
				untrack(() => transition.in());
			});
		}
	}
	function animate(element, options, counterpart, t2, on_begin, on_finish) {
		var is_intro = t2 === 1;
		if (is_function(options)) {
			var a;
			var aborted = false;
			queue_micro_task(() => {
				if (aborted) return;
				a = animate(element, options({ direction: is_intro ? "in" : "out" }), counterpart, t2, on_begin, on_finish);
			});
			return {
				abort: () => {
					aborted = true;
					a?.abort();
				},
				deactivate: () => a.deactivate(),
				reset: () => a.reset(),
				t: () => a.t()
			};
		}
		counterpart?.deactivate();
		if (!options?.duration && !options?.delay) {
			on_begin();
			on_finish();
			return {
				abort: noop,
				deactivate: noop,
				reset: noop,
				t: () => t2
			};
		}
		const { delay = 0, css, tick, easing = linear$1 } = options;
		var keyframes = [];
		if (is_intro && counterpart === void 0) {
			if (tick) tick(0, 1);
			if (css) {
				var styles = css_to_keyframe(css(0, 1));
				keyframes.push(styles, styles);
			}
		}
		var get_t = () => 1 - t2;
		var animation = element.animate(keyframes, {
			duration: delay,
			fill: "forwards"
		});
		animation.onfinish = () => {
			animation.cancel();
			on_begin();
			var t1 = counterpart?.t() ?? 1 - t2;
			counterpart?.abort();
			var delta = t2 - t1;
			var duration = options.duration * Math.abs(delta);
			var keyframes = [];
			if (duration > 0) {
				var needs_overflow_hidden = false;
				if (css) {
					var n = Math.ceil(duration / (1e3 / 60));
					for (var i = 0; i <= n; i += 1) {
						var t = t1 + delta * easing(i / n);
						var styles = css_to_keyframe(css(t, 1 - t));
						keyframes.push(styles);
						needs_overflow_hidden ||= styles.overflow === "hidden";
					}
				}
				if (needs_overflow_hidden) element.style.overflow = "hidden";
				get_t = () => {
					var time = animation.currentTime;
					return t1 + delta * easing(time / duration);
				};
				if (tick) loop(() => {
					if (animation.playState !== "running") return false;
					var t = get_t();
					tick(t, 1 - t);
					return true;
				});
			}
			animation = element.animate(keyframes, {
				duration,
				fill: "forwards"
			});
			animation.onfinish = () => {
				get_t = () => t2;
				tick?.(t2, 1 - t2);
				on_finish();
			};
		};
		return {
			abort: () => {
				if (animation) {
					animation.cancel();
					animation.effect = null;
					animation.onfinish = noop;
				}
			},
			deactivate: () => {
				on_finish = noop;
			},
			reset: () => {
				if (t2 === 0) tick?.(1, 0);
			},
			t: () => get_t()
		};
	}
	function head(hash, render_fn) {
		let previous_hydrate_node = null;
		let was_hydrating = hydrating;
		var anchor;
		if (hydrating) {
			previous_hydrate_node = hydrate_node;
			var head_anchor = get_first_child(document.head);
			while (head_anchor !== null && (head_anchor.nodeType !== 8 || head_anchor.data !== hash)) head_anchor = get_next_sibling(head_anchor);
			if (head_anchor === null) set_hydrating(false);
			else {
				var start = get_next_sibling(head_anchor);
				head_anchor.remove();
				set_hydrate_node(start);
			}
		}
		if (!hydrating) anchor = document.head.appendChild(create_text());
		try {
			block(() => {
				var e = branch(() => render_fn(anchor));
				e.f |= HEAD_EFFECT;
			});
		} finally {
			if (was_hydrating) {
				set_hydrating(true);
				set_hydrate_node(previous_hydrate_node);
			}
		}
	}
	function attach(node, get_fn) {
		var fn = void 0;
		var e;
		managed(() => {
			if (fn !== (fn = get_fn())) {
				if (e) {
					destroy_effect(e);
					e = null;
				}
				if (fn) e = branch(() => {
					effect(() => fn(node));
				});
			}
		});
	}
	function r(e) {
		var t, f, n = "";
		if ("string" == typeof e || "number" == typeof e) n += e;
		else if ("object" == typeof e) if (Array.isArray(e)) {
			var o = e.length;
			for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
		} else for (f in e) e[f] && (n && (n += " "), n += f);
		return n;
	}
	function clsx$1() {
		for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
		return n;
	}
	function clsx(value) {
		if (typeof value === "object") return clsx$1(value);
		else return value ?? "";
	}
	var whitespace = [..." 	\n\r\f\xA0\v"];
	function to_class(value, hash, directives) {
		var classname = value == null ? "" : "" + value;
		if (hash) classname = classname ? classname + " " + hash : hash;
		if (directives) {
			for (var key of Object.keys(directives)) if (directives[key]) classname = classname ? classname + " " + key : key;
			else if (classname.length) {
				var len = key.length;
				var a = 0;
				while ((a = classname.indexOf(key, a)) >= 0) {
					var b = a + len;
					if ((a === 0 || whitespace.includes(classname[a - 1])) && (b === classname.length || whitespace.includes(classname[b]))) classname = (a === 0 ? "" : classname.substring(0, a)) + classname.substring(b + 1);
					else a = b;
				}
			}
		}
		return classname === "" ? null : classname;
	}
	function append_styles(styles, important = false) {
		var separator = important ? " !important;" : ";";
		var css = "";
		for (var key of Object.keys(styles)) {
			var value = styles[key];
			if (value != null && value !== "") css += " " + key + ": " + value + separator;
		}
		return css;
	}
	function to_css_name(name) {
		if (name[0] !== "-" || name[1] !== "-") return name.toLowerCase();
		return name;
	}
	function to_style(value, styles) {
		if (styles) {
			var new_style = "";
			var normal_styles;
			var important_styles;
			if (Array.isArray(styles)) {
				normal_styles = styles[0];
				important_styles = styles[1];
			} else normal_styles = styles;
			if (value) {
				value = String(value).replaceAll(/\s*\/\*.*?\*\/\s*/g, "").trim();
				var in_str = false;
				var in_apo = 0;
				var in_comment = false;
				var reserved_names = [];
				if (normal_styles) reserved_names.push(...Object.keys(normal_styles).map(to_css_name));
				if (important_styles) reserved_names.push(...Object.keys(important_styles).map(to_css_name));
				var start_index = 0;
				var name_index = -1;
				const len = value.length;
				for (var i = 0; i < len; i++) {
					var c = value[i];
					if (in_comment) {
						if (c === "/" && value[i - 1] === "*") in_comment = false;
					} else if (in_str) {
						if (in_str === c) in_str = false;
					} else if (c === "/" && value[i + 1] === "*") in_comment = true;
					else if (c === "\"" || c === "'") in_str = c;
					else if (c === "(") in_apo++;
					else if (c === ")") in_apo--;
					if (!in_comment && in_str === false && in_apo === 0) {
						if (c === ":" && name_index === -1) name_index = i;
						else if (c === ";" || i === len - 1) {
							if (name_index !== -1) {
								var name = to_css_name(value.substring(start_index, name_index).trim());
								if (!reserved_names.includes(name)) {
									if (c !== ";") i++;
									var property = value.substring(start_index, i).trim();
									new_style += " " + property + ";";
								}
							}
							start_index = i + 1;
							name_index = -1;
						}
					}
				}
			}
			if (normal_styles) new_style += append_styles(normal_styles);
			if (important_styles) new_style += append_styles(important_styles, true);
			new_style = new_style.trim();
			return new_style === "" ? null : new_style;
		}
		return value == null ? null : String(value);
	}
	function set_class(dom, is_html, value, hash, prev_classes, next_classes) {
		var prev = dom[CLASS_CACHE];
		if (hydrating || prev !== value || prev === void 0) {
			var next_class_name = to_class(value, hash, next_classes);
			if (!hydrating || next_class_name !== dom.getAttribute("class")) if (next_class_name == null) dom.removeAttribute("class");
			else if (is_html) dom.className = next_class_name;
			else dom.setAttribute("class", next_class_name);
			dom[CLASS_CACHE] = value;
		} else if (next_classes && prev_classes !== next_classes) for (var key in next_classes) {
			var is_present = !!next_classes[key];
			if (prev_classes == null || is_present !== !!prev_classes[key]) dom.classList.toggle(key, is_present);
		}
		return next_classes;
	}
	function update_styles(dom, prev = {}, next, priority) {
		for (var key in next) {
			var value = next[key];
			if (prev[key] !== value) if (next[key] == null) dom.style.removeProperty(key);
			else dom.style.setProperty(key, value, priority);
		}
	}
	function set_style(dom, value, prev_styles, next_styles) {
		var prev = dom[STYLE_CACHE];
		if (hydrating || prev !== value) {
			var next_style_attr = to_style(value, next_styles);
			if (!hydrating || next_style_attr !== dom.getAttribute("style")) if (next_style_attr == null) dom.removeAttribute("style");
			else dom.style.cssText = next_style_attr;
			dom[STYLE_CACHE] = value;
		} else if (next_styles) if (Array.isArray(next_styles)) {
			update_styles(dom, prev_styles?.[0], next_styles[0]);
			update_styles(dom, prev_styles?.[1], next_styles[1], "important");
		} else update_styles(dom, prev_styles, next_styles);
		return next_styles;
	}
	var IS_CUSTOM_ELEMENT = Symbol("is custom element");
	var IS_HTML = Symbol("is html");
	var LINK_TAG = IS_XHTML ? "link" : "LINK";
	function remove_input_defaults(input) {
		if (!hydrating) return;
		var already_removed = false;
		var remove_defaults = () => {
			if (already_removed) return;
			already_removed = true;
			if (input.hasAttribute("value")) {
				var value = input.value;
				set_attribute(input, "value", null);
				input.value = value;
			}
			if (input.hasAttribute("checked")) {
				var checked = input.checked;
				set_attribute(input, "checked", null);
				input.checked = checked;
			}
		};
		input[FORM_RESET_HANDLER] = remove_defaults;
		queue_micro_task(remove_defaults);
		add_form_reset_listener();
	}
	function set_attribute(element, attribute, value, skip_warning) {
		var attributes = get_attributes(element);
		if (hydrating) {
			attributes[attribute] = element.getAttribute(attribute);
			if (attribute === "src" || attribute === "srcset" || attribute === "href" && element.nodeName === LINK_TAG) {
				if (!skip_warning);
				return;
			}
		}
		if (attributes[attribute] === (attributes[attribute] = value)) return;
		if (attribute === "loading") element[LOADING_ATTR_SYMBOL] = value;
		if (value == null) element.removeAttribute(attribute);
		else if (typeof value !== "string" && get_setters(element).includes(attribute)) element[attribute] = value;
		else element.setAttribute(attribute, value);
	}
	function get_attributes(element) {
		return element[ATTRIBUTES_CACHE] ??= {
			[IS_CUSTOM_ELEMENT]: element.nodeName.includes("-"),
			[IS_HTML]: element.namespaceURI === NAMESPACE_HTML
		};
	}
	var setters_cache = new Map();
	function get_setters(element) {
		var cache_key = element.getAttribute("is") || element.nodeName;
		var setters = setters_cache.get(cache_key);
		if (setters) return setters;
		setters_cache.set(cache_key, setters = []);
		var descriptors;
		var proto = element;
		var element_proto = Element.prototype;
		while (element_proto !== proto) {
			descriptors = get_descriptors(proto);
			for (var key in descriptors) if (descriptors[key].set && key !== "innerHTML" && key !== "textContent" && key !== "innerText") setters.push(key);
			proto = get_prototype_of(proto);
		}
		return setters;
	}
	function bind_value(input, get, set = get) {
		var batches = new WeakSet();
		listen_to_event_and_reset_event(input, "input", async (is_reset) => {
			var value = is_reset ? input.defaultValue : input.value;
			value = is_numberlike_input(input) ? to_number(value) : value;
			set(value);
			if (current_batch !== null) batches.add(current_batch);
			await tick();
			if (value !== (value = get())) {
				var start = input.selectionStart;
				var end = input.selectionEnd;
				var length = input.value.length;
				input.value = value ?? "";
				if (end !== null) {
					var new_length = input.value.length;
					if (start === end && end === length && new_length > length) {
						input.selectionStart = new_length;
						input.selectionEnd = new_length;
					} else {
						input.selectionStart = start;
						input.selectionEnd = Math.min(end, new_length);
					}
				}
			}
		});
		if (hydrating && input.defaultValue !== input.value || untrack(get) == null && input.value) {
			set(is_numberlike_input(input) ? to_number(input.value) : input.value);
			if (current_batch !== null) batches.add(current_batch);
		}
		render_effect(() => {
			var value = get();
			if (input === document.activeElement) {
				var batch = async_mode_flag ? previous_batch : current_batch;
				if (batches.has(batch)) return;
			}
			if (is_numberlike_input(input) && value === to_number(input.value)) return;
			if (input.type === "date" && !value && !input.value) return;
			if (value !== input.value) input.value = value ?? "";
		});
	}
	function bind_checked(input, get, set = get) {
		listen_to_event_and_reset_event(input, "change", (is_reset) => {
			set(is_reset ? input.defaultChecked : input.checked);
		});
		if (hydrating && input.defaultChecked !== input.checked || untrack(get) == null) set(input.checked);
		render_effect(() => {
			var value = get();
			input.checked = Boolean(value);
		});
	}
	function is_numberlike_input(input) {
		var type = input.type;
		return type === "number" || type === "range";
	}
	function to_number(value) {
		return value === "" ? null : +value;
	}
	var resize_observer_border_box = new class ResizeObserverSingleton {
		#listeners = new WeakMap();
		#observer;
		#options;
		static entries = new WeakMap();
		constructor(options) {
			this.#options = options;
		}
		observe(element, listener) {
			var listeners = this.#listeners.get(element) || new Set();
			listeners.add(listener);
			this.#listeners.set(element, listeners);
			this.#getObserver().observe(element, this.#options);
			return () => {
				var listeners = this.#listeners.get(element);
				listeners.delete(listener);
				if (listeners.size === 0) {
					this.#listeners.delete(element);
					this.#observer.unobserve(element);
				}
			};
		}
		#getObserver() {
			return this.#observer ?? (this.#observer = new ResizeObserver((entries) => {
				for (var entry of entries) {
					ResizeObserverSingleton.entries.set(entry.target, entry);
					for (var listener of this.#listeners.get(entry.target) || []) listener(entry);
				}
			}));
		}
	}({ box: "border-box" });
	function bind_element_size(element, type, set) {
		var unsub = resize_observer_border_box.observe(element, () => set(element[type]));
		effect(() => {
			untrack(() => set(element[type]));
			return unsub;
		});
	}
	function is_bound_this(bound_value, element_or_component) {
		return bound_value === element_or_component || bound_value?.[STATE_SYMBOL] === element_or_component;
	}
	function bind_this(element_or_component = {}, update, get_value, get_parts) {
		var component_effect = component_context.r;
		var parent = active_effect;
		effect(() => {
			var old_parts;
			var parts;
			render_effect(() => {
				old_parts = parts;
				parts = get_parts?.() || [];
				untrack(() => {
					if (!is_bound_this(get_value(...parts), element_or_component)) {
						update(element_or_component, ...parts);
						if (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) update(null, ...old_parts);
					}
				});
			});
			return () => {
				let p = parent;
				while (p !== component_effect && p.parent !== null && p.parent.f & 33554432) p = p.parent;
				const teardown = () => {
					if (parts && is_bound_this(get_value(...parts), element_or_component)) update(null, ...parts);
				};
				const original_teardown = p.teardown;
				p.teardown = () => {
					teardown();
					original_teardown?.();
				};
			};
		});
		return element_or_component;
	}
	function init(immutable = false) {
		const context = component_context;
		const callbacks = context.l.u;
		if (!callbacks) return;
		let props = () => deep_read_state(context.s);
		if (immutable) {
			let version = 0;
			let prev = {};
			const d = derived(() => {
				let changed = false;
				const props = context.s;
				for (const key in props) if (props[key] !== prev[key]) {
					prev[key] = props[key];
					changed = true;
				}
				if (changed) version++;
				return version;
			});
			props = () => get(d);
		}
		if (callbacks.b.length) user_pre_effect(() => {
			observe_all(context, props);
			run_all(callbacks.b);
		});
		user_effect(() => {
			const fns = untrack(() => callbacks.m.map(run));
			return () => {
				for (const fn of fns) if (typeof fn === "function") fn();
			};
		});
		if (callbacks.a.length) user_effect(() => {
			observe_all(context, props);
			run_all(callbacks.a);
		});
	}
	function observe_all(context, props) {
		if (context.l.s) for (const signal of context.l.s) get(signal);
		props();
	}
	function reactive_import(fn) {
		var s = source(0);
		return function() {
			if (arguments.length === 1) {
				set(s, get(s) + 1);
				return arguments[0];
			} else {
				get(s);
				return fn();
			}
		};
	}
	function prop(props, key, flags, fallback) {
		var runes = !legacy_mode_flag || (flags & 2) !== 0;
		var bindable = (flags & 8) !== 0;
		var lazy = (flags & 16) !== 0;
		var fallback_value = fallback;
		var fallback_dirty = true;
		var fallback_signal = void 0;
		var get_fallback = () => {
			if (lazy && runes) {
				fallback_signal ??= derived(fallback);
				return get(fallback_signal);
			}
			if (fallback_dirty) {
				fallback_dirty = false;
				fallback_value = lazy ? untrack(fallback) : fallback;
			}
			return fallback_value;
		};
		let setter;
		if (bindable) {
			var is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props;
			setter = get_descriptor(props, key)?.set ?? (is_entry_props && key in props ? (v) => props[key] = v : void 0);
		}
		var initial_value;
		var is_store_sub = false;
		if (bindable) [initial_value, is_store_sub] = capture_store_binding(() => props[key]);
		else initial_value = props[key];
		if (initial_value === void 0 && fallback !== void 0) {
			initial_value = get_fallback();
			if (setter) {
				if (runes) props_invalid_value(key);
				setter(initial_value);
			}
		}
		var getter;
		if (runes) getter = () => {
			var value = props[key];
			if (value === void 0) return get_fallback();
			fallback_dirty = true;
			return value;
		};
		else getter = () => {
			var value = props[key];
			if (value !== void 0) fallback_value = void 0;
			return value === void 0 ? fallback_value : value;
		};
		if (runes && (flags & 4) === 0) return getter;
		if (setter) {
			var legacy_parent = props.$$legacy;
			return (function(value, mutation) {
				if (arguments.length > 0) {
					if (!runes || !mutation || legacy_parent || is_store_sub) setter(mutation ? getter() : value);
					return value;
				}
				return getter();
			});
		}
		var overridden = false;
		var d = ((flags & 1) !== 0 ? derived : derived_safe_equal)(() => {
			overridden = false;
			return getter();
		});
		if (bindable) get(d);
		var parent_effect = active_effect;
		return (function(value, mutation) {
			if (arguments.length > 0) {
				const new_value = mutation ? get(d) : runes && bindable ? proxy(value) : value;
				set(d, new_value);
				overridden = true;
				if (fallback_value !== void 0) fallback_value = new_value;
				return value;
			}
			if (is_destroying_effect && overridden || (parent_effect.f & 16384) !== 0) return d.v;
			return get(d);
		});
	}
	function onMount(fn) {
		if (component_context === null) lifecycle_outside_component("onMount");
		if (legacy_mode_flag && component_context.l !== null) init_update_callbacks(component_context).m.push(fn);
		else user_effect(() => {
			const cleanup = untrack(fn);
			if (typeof cleanup === "function") return cleanup;
		});
	}
	function onDestroy(fn) {
		if (component_context === null) lifecycle_outside_component("onDestroy");
		onMount(() => () => untrack(fn));
	}
	function init_update_callbacks(context) {
		var l = context.l;
		return l.u ??= {
			a: [],
			b: [],
			m: []
		};
	}
	if (typeof window !== "undefined") ((window.__svelte ??= {}).v ??= new Set()).add("5");
	function cubicOut(t) {
		const f = t - 1;
		return f * f * f + 1;
	}
	function quadInOut(t) {
		t /= .5;
		if (t < 1) return .5 * t * t;
		t--;
		return -.5 * (t * (t - 2) - 1);
	}
	var LINKS_KEY = "performer-links";
	var defaultLinks = [
		{
			label: "Pornolab",
			url: "http://pornolab.net/forum/tracker.php?search_id=&nm={q}"
		},
		{
			label: "Simpcity",
			url: "https://simpcity.su/search/1/?page=99&o=date&q={q}"
		},
		{
			label: "MissAV",
			url: "https://missav.ws/en/search/{q}"
		},
		{
			label: "Bunkr",
			url: "https://bunkr-albums.io/?search={q}"
		}
	];
	function generateId(link) {
		const performerLink = { ...link };
		performerLink.id = crypto.randomUUID();
		return performerLink;
	}
	function stripId(link) {
		const performerLink = { ...link };
		delete performerLink.id;
		return performerLink;
	}
	function savePerformerLinks() {
		const stored = store.performerLinks.map(stripId);
		localStorage.setItem(LINKS_KEY, JSON.stringify(stored));
	}
	function loadPerformerLinks() {
		try {
			const stored = localStorage.getItem(LINKS_KEY);
			if (stored === null) return defaultLinks.map(generateId);
			return JSON.parse(stored).map(generateId);
		} catch {
			return defaultLinks.map(generateId);
		}
	}
	function addPerformerLink() {
		store.performerLinks.push(generateId({
			label: "",
			url: ""
		}));
		savePerformerLinks();
	}
	function removePerformerLink(index) {
		if (index < 0 || index >= store.performerLinks.length) return;
		store.performerLinks.splice(index, 1);
		savePerformerLinks();
	}
	function updatePerformerLink(index, data) {
		if (index < 0 || index >= store.performerLinks.length) return;
		const link = store.performerLinks[index];
		if (link) Object.assign(link, data);
		savePerformerLinks();
	}
	function getLinkUrl(link, query) {
		const linkUrl = link.url;
		if (!query || !linkUrl.includes("{q}")) return linkUrl;
		return linkUrl.replace("{q}", encodeURIComponent(query));
	}
	function getFaviconUrl(url) {
		try {
			return `https://www.google.com/s2/favicons?domain=${new URL(url).host}&sz=64`;
		} catch {
			return "https://www.google.com/s2/favicons?domain=invalid&sz=64";
		}
	}
	function restorePerformerLinks() {
		localStorage.removeItem(LINKS_KEY);
		for (let i = 0; i < defaultLinks.length; i++) {
			const defaultSite = defaultLinks[i];
			if (i < store.performerLinks.length) {
				const existingLink = store.performerLinks[i];
				if (existingLink?.label !== defaultSite?.label || existingLink?.url !== defaultSite?.url) {
					if (existingLink) Object.assign(existingLink, defaultSite);
				}
			} else if (defaultSite) store.performerLinks.push(generateId(defaultSite));
		}
		if (store.performerLinks.length > defaultLinks.length) store.performerLinks.splice(defaultLinks.length);
		savePerformerLinks();
	}
	var store = proxy({
		readyStateComplete: false,
		showSettings: false,
		options: {
			Title: [],
			Images: [],
			Download: [],
			Shortcuts: [],
			Developer: []
		},
		performerLinks: [],
		resizeWidth: 100,
		dropdown: null,
		openDropdown(event, item, classList) {
			if (this.dropdown) this.closeDropdown();
			else this.dropdown = {
				item,
				classList,
				clientX: event.clientX,
				clientY: event.clientY,
				currentTarget: event.currentTarget
			};
		},
		closeDropdown() {
			if (this.dropdown) {
				const currentTarget = this.dropdown.currentTarget;
				const classList = this.dropdown.classList;
				if (currentTarget && classList) currentTarget.classList.remove(...classList);
				this.dropdown = null;
			}
		},
		upgradeImgData: {},
		downloadState: "idle",
		ultraImages: null,
		ultraPost: null,
		imgRefs: [],
		showFileList: false,
		fileListData: null,
		columnCount: 1,
		toggleFileList() {
			this.showFileList = !this.showFileList;
		},
		documentHidden: false,
		get transition() {
			return {
				duration: this.readyStateComplete !== false && !this.documentHidden ? 180 : 0,
				easing: quadInOut
			};
		},
		get favIcons() {
			return Object.fromEntries(this.performerLinks.filter((link) => link.url).map((link) => [link.url, getFaviconUrl(link.url)]));
		}
	});
	function handleUser(element) {
		if (!element) return;
		const name = element?.textContent;
		const link = element.getAttribute("href");
		if (name && link && link?.includes("viewprofile")) return {
			name,
			link
		};
	}
	function handleTheme(element) {
		if (!element) return;
		return {
			element: element.closest("a"),
			darkmode: element.classList.contains("fa-sun")
		};
	}
	function handleTimes(element) {
		if (!element) return;
		const part = element?.textContent?.split(" ")[0];
		if (!part) return;
		const parsed = parseInt(part);
		if (isNaN(parsed)) return;
		return parsed;
	}
	function handleImages(postImgs) {
		const images = [];
		if (!postImgs) return images;
		postImgs.forEach((varElement) => {
			const src = varElement.getAttribute("title");
			if (src) {
				const href = varElement.closest("a")?.href;
				images.push({
					id: crypto.randomUUID(),
					href,
					src
				});
			}
		});
		return images;
	}
	function handlePosts(posts) {
		if (posts) return Array.from(posts).map((msg) => {
			const row = msg?.closest("tbody");
			const nickEl = row?.querySelector(".nick");
			const dateEl = row?.querySelector(".small");
			const avatarImg = row?.querySelector(".avatar img");
			const profileLink = row?.querySelector("a.txtb[href*=\"viewprofile\"]");
			return {
				nick: nickEl?.textContent,
				date: dateEl?.textContent,
				avatar: avatarImg?.getAttribute("src"),
				link: profileLink?.getAttribute("href"),
				message: msg
			};
		});
		return [];
	}
	function handleDate(dateString) {
		if (!dateString) return null;
		const ruMonthMap = {
			Янв: "Jan",
			Фев: "Feb",
			Мар: "Mar",
			Апр: "Apr",
			Май: "May",
			Июн: "Jun",
			Июл: "Jul",
			Авг: "Aug",
			Сен: "Sep",
			Окт: "Oct",
			Ноя: "Nov",
			Дек: "Dec"
		};
		const match = dateString.match(/(\d{2})-([А-Яа-я]{3})-(\d{2}) (\d{2}:\d{2}:\d{2})/);
		if (!match) return null;
		const [, day, ruMonth, shortYear, time] = match;
		if (!ruMonth || !shortYear) return null;
		const isoString = `${day} ${ruMonthMap[ruMonth]} ${2e3 + parseInt(shortYear, 10)} ${time}`;
		return new Date(isoString);
	}
	function handleRelativeDate(dateLike) {
		if (dateLike === null) return "";
		const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
		const divisions = [
			{
				amount: 60,
				name: "seconds"
			},
			{
				amount: 60,
				name: "minutes"
			},
			{
				amount: 24,
				name: "hours"
			},
			{
				amount: 7,
				name: "days"
			},
			{
				amount: 4.34524,
				name: "weeks"
			},
			{
				amount: 12,
				name: "months"
			},
			{
				amount: Infinity,
				name: "years"
			}
		];
		let delta = (new Date(dateLike).getTime() - Date.now()) / 1e3;
		for (const { amount, name } of divisions) {
			if (Math.abs(delta) < amount) return rtf.format(Math.round(delta), name);
			delta /= amount;
		}
		return "";
	}
	function handleThankList(element) {
		if (!element) return new Set();
		const userIds = new Set();
		element.querySelectorAll("u").forEach((uElement) => {
			const uid = uElement.textContent;
			if (uid) userIds.add(uid);
		});
		return userIds;
	}
	function handleTitle(topicEl) {
		const text = topicEl?.textContent?.trim();
		if (!text) return null;
		const tags = extractTags(text);
		const parsed = text.replace(TAG_RE, "").trim();
		return {
			original: text,
			parsed,
			searchTerms: extractSearchTerms(parsed),
			tags
		};
	}
	function extractTags(text) {
		const all = [...text.matchAll(TAG_RE)].flatMap((m) => m[1]?.split(",") ?? []).map((t) => t.trim()).filter(Boolean);
		return [...new Set(all)];
	}
	function extractSearchTerms(text) {
		const terms = [];
		let cursor = 0;
		const splitOnSeparators = (fragment) => fragment.trim() ? fragment.split(SEP_RE).map((s) => s.trim()).filter(Boolean) : [];
		for (const match of text.matchAll(BRACKETS_RE)) {
			terms.push(...splitOnSeparators(text.slice(cursor, match.index)));
			const inner = match[1] ?? match[2] ?? "";
			terms.push(...splitOnSeparators(inner));
			cursor = match.index + match[0].length;
		}
		terms.push(...splitOnSeparators(text.slice(cursor)));
		return terms.filter((t, i) => terms.indexOf(t) === i);
	}
	var TAG_RE = /\[([^\]]+)]/g;
	var BRACKETS_RE = /\(([^)]+)\)|\{([^}]+)\}/g;
	var SEP_RE = new RegExp([
		",",
		"|",
		"/",
		"&",
		"-",
		"—",
		"–",
		"aka"
	].map((str) => {
		const escaped = str.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
		switch (str) {
			case "-":
			case "—":
			case "–":
			case "/":
			case "aka": return `(?<=\\s)${escaped}(?=\\s)`;
			default: return escaped;
		}
	}).join("|"), "g");
	function handleData() {
		const sel = Object.fromEntries(Object.entries({
			title: "a#topic-title",
			images: "#topic_main > tbody:nth-of-type(2) div.sp-wrap var.postImg",
			user: "div.topmenu td a",
			messages: "div.topmenu a.new-pm-link",
			theme: "div.topmenu .fas.fa-sun, div.topmenu .fas.fa-moon",
			seeders: "span.seed > b",
			leechers: "b.leech > b",
			size: "#tor-reged tr:nth-of-type(5) td:last-of-type",
			date: "div.post_head a.small",
			times: "td.borderless.bCenter.pad_8 > b",
			link: "a.dl-stub.dl-link",
			thank: "input#thx-btn",
			list: "div.thx-list",
			pagination: "table#pagination",
			logo: "img.site-logo",
			forumline: "table.forumline.message"
		}).map(([key, value]) => [key, document.querySelectorAll(value)]));
		return {
			title: handleTitle(sel?.["title"]?.[0]),
			posts: [],
			images: handleImages(sel["images"]),
			user: handleUser(sel?.["user"]?.[0]),
			messages: sel["messages"]?.[0],
			theme: handleTheme(sel["theme"]?.[0]),
			torrent: {
				seeders: sel?.["seeders"]?.[0]?.textContent,
				leechers: sel?.["leechers"]?.[0]?.textContent?.trim(),
				size: sel?.["size"]?.[0]?.textContent,
				date: handleDate(sel?.["date"]?.[0]?.textContent),
				times: handleTimes(sel?.["times"]?.[2]),
				link: sel?.["link"]?.[0]?.href
			},
			thank: {
				element: sel?.["thank"]?.[0],
				list: handleThankList(sel?.["list"]?.[0])
			},
			pagination: sel?.["pagination"]?.[0],
			logo: sel?.["logo"]?.[0]?.src,
			forumline: sel?.["forumline"]?.[0]
		};
	}
	var data = proxy({});
	var _GM_xmlhttpRequest = typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0;
	function GM_fetch(method, url, responseType, headers, data) {
		return new Promise((resolve, reject) => {
			_GM_xmlhttpRequest({
				method,
				url,
				responseType,
				headers,
				data,
				timeout: 5e3,
				onload: (response) => resolve(response),
				onerror: () => reject(new Error(`GM_fetch failed: ${url}`)),
				ontimeout: () => reject(new Error(`GM_fetch timed out: ${url}`))
			});
		});
	}
	var KEY$1 = "resolved-urls";
	var cache = JSON.parse(sessionStorage.getItem(KEY$1) || "{}");
	function getCache$1(url) {
		return cache[url];
	}
	function setCache$1(url, src) {
		cache[url] = src;
		sessionStorage.setItem(KEY$1, JSON.stringify(cache));
	}
	function clearCache() {
		Object.keys(cache).forEach((key) => delete cache[key]);
		sessionStorage.removeItem(KEY$1);
	}
	async function getBlob(url) {
		if (getSettings("proxyCache")) return "https://corsproxy.io/?url=" + encodeURIComponent(url);
		const { response } = await GM_fetch("GET", url, "blob");
		return URL.createObjectURL(response);
	}
	var OPTIONS_KEY = "user-settings";
	var defaultOptions = {
		Title: [
			{
				label: "Parse title",
				key: "parseTitle",
				value: true
			},
			{
				label: "Show tags",
				key: "showTags",
				value: true
			},
			{
				label: "Performer links",
				key: "performerLinks",
				value: true
			}
		],
		Images: [
			{
				label: "Upgrade images",
				key: "upgradeImages",
				value: true
			},
			{
				label: "Last image first",
				key: "lastImageFirst",
				value: true
			},
			{
				label: "Drag to resize",
				key: "dragResize",
				value: true
			}
		],
		Download: [
			{
				label: "Floating download button",
				key: "floatingDownload",
				value: false
			},
			{
				label: "Send to <a href=\"https://github.com/valpackett/transmitter\" target=\"_blank\">Transmitter</a>",
				key: "sendToTransmitter",
				value: false
			},
			{
				label: "Auto-expand file list",
				key: "expandFiles",
				value: false
			}
		],
		Shortcuts: [
			{
				label: "Navigate with number keys",
				key: "numKeys",
				value: true,
				description: "[1, 2, 3, 4]"
			},
			{
				label: "Anchor images",
				key: "spaceImageAnchor",
				value: true,
				description: "[Space, Shift + Space]"
			},
			{
				label: "Download torrent",
				key: "dKeyToDownload",
				value: false,
				description: "[d]"
			}
		],
		Network: [
			{
				label: "Cache resolved urls",
				key: "cacheImages",
				value: true
			},
			{
				label: "Limit concurrent upgrades",
				key: "limitConcurrent",
				value: true
			},
			{
				label: "CorsProxy.io",
				key: "proxyCache",
				value: false,
				description: "cache hotlinked"
			}
		],
		Developer: [
			{
				label: "Toggle settings",
				key: "sKeySettings",
				value: false,
				description: "[s]"
			},
			{
				label: "Debug upgrade",
				key: "debugImgs",
				value: false
			},
			{
				label: "Incognito",
				key: "incognito",
				value: false
			}
		]
	};
	function loadOptions() {
		const options = structuredClone(defaultOptions);
		const stored = localStorage.getItem(OPTIONS_KEY);
		if (stored) try {
			const saved = JSON.parse(stored);
			Object.values(options).flat().forEach((opt) => {
				const value = saved[opt.key];
				if (value !== void 0) opt.value = value;
			});
		} catch (error) {
			console.warn(`Failed to load ${OPTIONS_KEY} from localStorage:`, error);
		}
		return options;
	}
	function saveOptions() {
		const options = Object.values(store.options).flat();
		const json = Object.fromEntries(options.map((opt) => [opt.key, opt.value]));
		localStorage.setItem(OPTIONS_KEY, JSON.stringify(json));
	}
	function updateOption(key, value) {
		const option = Object.values(store.options).flat().find((opt) => opt.key === key);
		if (option) option.value = value;
		saveOptions();
	}
	function restoreOptions() {
		Object.entries(defaultOptions).forEach(([groupKey, groupSettings]) => {
			groupSettings.forEach((defaultSetting) => {
				const currentOpt = store.options[groupKey]?.find((opt) => opt.key === defaultSetting.key);
				if (currentOpt) currentOpt.value = defaultSetting.value;
			});
		});
		localStorage.removeItem(OPTIONS_KEY);
		saveOptions();
	}
	var DEFAULT_WIDTH = 100;
	var RESIZE_KEY = "images-resize-width";
	function loadResize() {
		try {
			const stored = localStorage.getItem(RESIZE_KEY);
			if (stored) return parseInt(stored);
		} catch (error) {
			console.warn(`Failed to load ${RESIZE_KEY} from localStorage:`, error);
		}
		return DEFAULT_WIDTH;
	}
	function saveResize(value) {
		try {
			localStorage.setItem(RESIZE_KEY, value.toString());
		} catch (error) {
			console.warn(`Failed to save ${RESIZE_KEY} to localStorage:`, error);
		}
	}
	function restoreResize() {
		localStorage.setItem(RESIZE_KEY, DEFAULT_WIDTH.toString());
		store.resizeWidth = DEFAULT_WIDTH;
	}
	var DEFAULT_COUNT = 1;
	var COLUMN_COUNT_KEY = "grid-size-width";
	function loadColumnCount() {
		try {
			const stored = localStorage.getItem(COLUMN_COUNT_KEY);
			if (stored) return parseInt(stored);
		} catch (error) {
			console.warn(`Failed to load ${COLUMN_COUNT_KEY} from localStorage:`, error);
		}
		return DEFAULT_COUNT;
	}
	function saveColumnCount(value) {
		try {
			localStorage.setItem(COLUMN_COUNT_KEY, value.toString());
		} catch (error) {
			console.warn(`Failed to save ${COLUMN_COUNT_KEY} to localStorage:`, error);
		}
	}
	function restoreColumnCount() {
		localStorage.setItem(COLUMN_COUNT_KEY, DEFAULT_COUNT.toString());
		store.columnCount = DEFAULT_COUNT;
	}
	var parser$4 = new DOMParser();
	var decoder = new TextDecoder("windows-1251");
	var regex = /\b\d+[pk]\b/gi;
	async function getRelated(title) {
		const query = stripResolution(title);
		const cache = getCache();
		if (cache[query]) return cache[query];
		const elements = await handleSearch(query);
		const results = [];
		elements.forEach((element) => {
			if (element instanceof HTMLAnchorElement && element.href && element.textContent) {
				const resolution = getResolution(element.textContent);
				if (resolution) results.push({
					href: element.href,
					textContent: element.textContent,
					resolution
				});
			}
		});
		cache[query] = results;
		setCache(cache);
		return results;
	}
	async function handleSearch(searchQuery) {
		const headers = { "Content-Type": "application/x-www-form-urlencoded" };
		const body = `max=1&to=1&nm=${encodeURIComponent(searchQuery)}`;
		const buffer = await (await fetch("/forum/tracker.php", {
			method: "POST",
			headers,
			body
		})).arrayBuffer();
		const result = decoder.decode(buffer);
		const doc = parser$4.parseFromString(result, "text/html");
		if (doc.querySelector(".info_msg_wrap")) return [];
		const related = doc.querySelectorAll(".med.tLink.bold");
		return Array.from(related);
	}
	function stripResolution(title) {
		return title.replace(regex, "").replace(/ ,/g, "").replace(/\s*,\s*(?=\])/g, "").replace(/\[\]/g, "");
	}
	function getResolution(title) {
		return title.match(regex)?.[0];
	}
	var CACHE_KEY = "related-cache";
	function getCache() {
		const cached = sessionStorage.getItem(CACHE_KEY);
		return cached ? JSON.parse(cached) : {};
	}
	function setCache(cache) {
		sessionStorage.setItem(CACHE_KEY, JSON.stringify(cache));
	}
	function restoreRelated() {
		sessionStorage.removeItem(CACHE_KEY);
	}
	var SETTINGS_KEY = "show-settings";
	function getSettings(key) {
		return Object.values(store.options).flat().find((opt) => opt.key === key)?.value || false;
	}
	function loadShowSettings() {
		const stored = localStorage.getItem(SETTINGS_KEY);
		if (stored === null) return false;
		try {
			return JSON.parse(stored);
		} catch (error) {
			console.warn(`Failed to parse settings from localStorage:`, stored, error);
			return false;
		}
	}
	function saveShowSettings(value) {
		try {
			localStorage.setItem(SETTINGS_KEY, JSON.stringify(value));
		} catch (error) {
			console.warn(`Failed to save ${SETTINGS_KEY} to localStorage:`, error);
		}
	}
	function toggleShowSettings(event) {
		event.preventDefault();
		store.showSettings = !store.showSettings;
		saveShowSettings(store.showSettings);
	}
	function restoreDefaultSettings() {
		if (!confirm("Are you sure you want to restore all settings to default?")) return;
		restoreOptions();
		restorePerformerLinks();
		restoreResize();
		restoreRelated();
		restoreColumnCount();
		clearCache();
	}
	var SYNC_TRIGGER_KEY = "sync-trigger";
	function syncSettings() {
		localStorage.setItem(SYNC_TRIGGER_KEY, Date.now().toString());
	}
	function onstorage(event) {
		if (event.key !== SYNC_TRIGGER_KEY) return;
		const optionsValue = localStorage.getItem(OPTIONS_KEY);
		if (optionsValue) {
			const saved = JSON.parse(optionsValue);
			Object.values(store.options).flat().forEach((setting) => {
				if (setting.key in saved) setting.value = saved[setting.key];
			});
			saveOptions();
		}
		const resizeValue = localStorage.getItem(RESIZE_KEY);
		if (resizeValue) store.resizeWidth = parseInt(resizeValue);
		if (localStorage.getItem("performer-links")) {
			store.performerLinks.length = 0;
			store.performerLinks.push(...loadPerformerLinks());
		}
		store.showSettings = false;
	}
	function exportSettings() {
		const performerLinks = store.performerLinks.map(stripId);
		const options = Object.values(store.options).flat();
		const optionsJson = Object.fromEntries(options.map((opt) => [opt.key, opt.value]));
		const fileContent = `// Paste this into browser console

localStorage.setItem("${OPTIONS_KEY}", JSON.stringify(${JSON.stringify(optionsJson, null, 2)}));

localStorage.setItem("${LINKS_KEY}", JSON.stringify(${JSON.stringify(performerLinks, null, 2)}));

localStorage.setItem("${RESIZE_KEY}", "${store.resizeWidth || "100"}");

localStorage.setItem("${COLUMN_COUNT_KEY}", "${store.columnCount || "1"}");

location.reload();
`;
		const blob = new Blob([fileContent], { type: "text/plain" });
		const url = URL.createObjectURL(blob);
		const a = Object.assign(document.createElement("a"), {
			href: url,
			download: `data-${new Date().toISOString().split("T")[0]}.txt`
		});
		document.body.appendChild(a);
		a.click();
		document.body.removeChild(a);
		URL.revokeObjectURL(url);
	}
	var KEY = "userscript-disabled";
	function userscriptDisabled() {
		const stored = sessionStorage.getItem(KEY);
		return stored === null ? false : stored === "true";
	}
	function setUserscript(value) {
		sessionStorage.setItem(KEY, JSON.stringify(value));
		location.reload();
	}
	function appendUserscriptEnableButton() {
		console.warn("userscript disabled");
		const button = document.createElement("button");
		Object.assign(button, {
			textContent: "Enable Pornolab Ultra",
			onclick: () => setUserscript(false)
		});
		Object.assign(button.style, {
			position: "fixed",
			top: "0.75rem",
			right: "0.75rem",
			zIndex: "9999"
		});
		document.querySelector("#pl-speedbar-a")?.parentElement?.appendChild(button);
	}
	function prependContentSecurityPolicy() {
		const meta = document.createElement("meta");
		meta.httpEquiv = "Content-Security-Policy";
		meta.content = `
    default-src 'self';
    img-src 'self' http: https: data: blob:;
    style-src 'unsafe-inline';
    font-src 'self'
      https://static.pornolab.net/templates/default/webfonts/fa-solid-900.woff2;
    script-src 'unsafe-inline'
      https://static.pornolab.net/js/main.js
      https://static.pornolab.net/js/jquery.pack.js;
  `;
		document.head.prepend(meta);
		return document.head.contains(meta);
	}
	function forumDisabled(app) {
		const p = document.querySelector("body > div > p");
		const disabledText = "Форум временно отключен";
		if (!p?.textContent?.includes(disabledText)) return false;
		const translations = {
			[disabledText]: "Forum is temporarily disabled",
			"Последние новости вы можете узнать в": "You can find out the latest news on",
			твиттере: "Twitter"
		};
		app.remove();
		let html = p.innerHTML;
		for (const [russian, english] of Object.entries(translations)) html = html.replace(russian, english);
		p.innerHTML = html;
		return true;
	}
	enable_legacy_mode_flag();
	function state(state) {
		store.downloadState = state;
	}
	async function handleDownload(event) {
		event.preventDefault();
		if (store.downloadState === "downloading") return;
		if (!data.torrent?.link) return state("error");
		try {
			store.downloadState = "downloading";
			if (!getSettings("sendToTransmitter")) {
				window.location.assign(data.torrent.link);
				return state("success");
			}
			const url = "http://transmitter.web-extension/" + encodeURIComponent(data.torrent.link);
			const page = `
      <!DOCTYPE html>
      <html>
        <head>
          <style>
            body { background-color: ${getComputedStyle(document.documentElement).getPropertyValue("--main-bg")}; }
            img { display: none; }
          </style>
        </head>
        <body>
          <img src="${url}" onload="window.close()" onerror="window.close()">
        </body>
      </html>
    `;
			window.open(URL.createObjectURL(new Blob([page], { type: "text/html" })), "_blank", "noopener");
			state("success");
		} catch (err) {
			console.error("Error downloading torrent:", err);
			state("error");
		}
	}
	var $$_import_store = reactive_import(() => store);
	function Events($$anchor, $$props) {
		push($$props, false);
		function handleReadyStateChange() {
			if (document.readyState === "complete") $$_import_store($$_import_store().readyStateComplete = true);
		}
		onMount(() => {
			handleReadyStateChange();
			if ($$_import_store().readyStateComplete) return;
			return on(document, "readystatechange", handleReadyStateChange);
		});
		function onkeydown(event) {
			const target = event.target;
			if (target.isContentEditable || target instanceof HTMLInputElement && target.type === "text" || event.ctrlKey || event.metaKey || event.altKey) return;
			switch (event.code) {
				case "Space":
					handleSpace(event);
					break;
				case "KeyS":
					handleKeyS(event);
					break;
				case "KeyD":
					handleKeyD(event);
					break;
				case "Escape":
					handleEscape();
					break;
				case "Digit1":
				case "Digit2":
				case "Digit3":
				case "Digit4":
					if (!getSettings("numKeys")) return;
					event.preventDefault();
					digitHandlers[event.code]();
					break;
				default: return;
			}
		}
		const digitHandlers = {
			Digit1: handleDigit1,
			Digit2: handleDigit2,
			Digit3: handleDigit3,
			Digit4: handleDigit4
		};
		function handleSpace(event) {
			if (!getSettings("spaceImageAnchor") || !$$_import_store().imgRefs.length || !$$_import_store().ultraImages || $$_import_store().columnCount !== 1) return;
			const scrollY = window.scrollY;
			const containerTop = $$_import_store().ultraImages.offsetTop;
			const containerBottom = containerTop + $$_import_store().ultraImages.offsetHeight;
			if (containerTop >= scrollY + window.innerHeight || containerBottom <= scrollY) return;
			let filteredImgRefs = [...$$_import_store().imgRefs].filter((el) => el.dataset["broken"] !== "true");
			if (filteredImgRefs.length === 0) return;
			if (scrollY < containerTop) {
				if (!event.shiftKey) {
					event.preventDefault();
					filteredImgRefs[0]?.scrollIntoView({ block: "start" });
				}
				return;
			}
			const backward = event.shiftKey;
			const threshold = scrollY + (backward ? -10 : 10);
			if (backward) {
				for (const img of filteredImgRefs.slice().reverse()) if (scrollY + img.getBoundingClientRect().top < threshold) {
					event.preventDefault();
					img.scrollIntoView({ block: "start" });
					return;
				}
			} else for (const img of filteredImgRefs) if (scrollY + img.getBoundingClientRect().top > threshold) {
				event.preventDefault();
				img.scrollIntoView({ block: "start" });
				return;
			}
		}
		function handleKeyD(event) {
			if (!getSettings("dKeyToDownload")) return;
			event.preventDefault();
			handleDownload(event);
		}
		function handleEscape() {
			if ($$_import_store().dropdown !== null) $$_import_store().closeDropdown();
			else if ($$_import_store().showSettings) {
				$$_import_store($$_import_store().showSettings = false);
				saveShowSettings($$_import_store().showSettings);
			}
		}
		function handleKeyS(event) {
			if (!getSettings("sKeySettings")) return;
			if (!$$_import_store().showSettings) window.scrollTo({ top: 0 });
			toggleShowSettings(event);
		}
		function handleDigit1() {
			window.scrollTo({ top: 0 });
		}
		function handleDigit2() {
			$$_import_store().ultraImages?.scrollIntoView({ block: "start" });
		}
		function handleDigit3() {
			$$_import_store().ultraPost?.scrollIntoView({ block: "start" });
		}
		function handleDigit4() {
			window.scrollTo({ top: document.body.scrollHeight });
		}
		function onvisibilitychange() {
			$$_import_store($$_import_store().documentHidden = document.hidden);
		}
		init();
		event("keydown", $window, onkeydown);
		event("storage", $window, function(...$$args) {
			onstorage?.apply(this, $$args);
		});
		event("visibilitychange", $document, onvisibilitychange);
		pop();
	}
	var Item$2 = ($$anchor, title = noop, content = noop) => {
		var div = root_1$13();
		snippet(child(div), content);
		reset(div);
		template_effect(() => set_attribute(div, "title", title()));
		append($$anchor, div);
	};
	var Messages = ($$anchor) => {
		const href = user_derived(() => "/forum/privmsg.php?folder=inbox");
		var a_2 = root_6$6();
		set_attribute(a_2, "href", get(href));
		var i = child(a_2);
		reset(a_2);
		template_effect(() => set_class(i, 1, clsx([
			"fas",
			"fa-envelope",
			data.messages && "unread"
		]), "svelte-zne36e"));
		append($$anchor, a_2);
	};
	var Settings$1 = ($$anchor) => {
		var fragment_2 = root_10$2();
		var a_4 = first_child(fragment_2);
		var a_5 = sibling(a_4, 2);
		delegated("click", a_4, function(...$$args) {
			toggleShowSettings?.apply(this, $$args);
		});
		delegated("click", a_5, function(...$$args) {
			toggleShowSettings?.apply(this, $$args);
		});
		append($$anchor, fragment_2);
	};
	var root_1$13 = from_html(`<div class="item svelte-zne36e"><!></div>`);
	var root_4$5 = from_html(`<a>Profile</a>`);
	var root_5$6 = from_html(`<a href="/">Login</a>`);
	var root_6$6 = from_html(`<a aria-label="inbox"><i></i></a>`);
	var root_8$1 = from_html(`<span class="themeIcon svelte-zne36e"></span>`);
	var root_9$1 = from_html(`<a href="/" aria-label="placeholder"><i></i></a>`);
	var root_10$2 = from_html(`<a href="#settings"><img src="https://github.com/clangmoyai/plab-ultra/raw/main/src/assets/logo64.png" class="ultra-logo svelte-zne36e" alt="logo"/></a> <a href="#settings">Settings</a>`, 1);
	var root_11$1 = from_html(`<a href="#disable">Disable</a>`);
	var root$6 = from_html(`<div id="x-header"><div class="logo svelte-zne36e"><a href="/forum/index.php"><img alt=""/></a></div> <div class="align-right svelte-zne36e"><div class="container svelte-zne36e"><div class="links svelte-zne36e"><!> <!> <!> <!> <!> <!></div> <div class="search svelte-zne36e"><input type="text" name="search" placeholder="Search…" class="svelte-zne36e"/> <button class="svelte-zne36e">»</button></div></div></div></div>`);
	function Header($$anchor, $$props) {
		push($$props, true);
		const Profile = ($$anchor) => {
			var fragment = comment();
			var node_1 = first_child(fragment);
			var consequent = ($$anchor) => {
				append($$anchor, text("Profile"));
			};
			var consequent_1 = ($$anchor) => {
				var a = root_4$5();
				template_effect(() => {
					set_attribute(a, "href", data.user.link);
					set_attribute(a, "title", data.user?.name);
				});
				append($$anchor, a);
			};
			var alternate = ($$anchor) => {
				append($$anchor, root_5$6());
			};
			if_block(node_1, ($$render) => {
				if (get(incognito)) $$render(consequent);
				else if (data.user?.link) $$render(consequent_1, 1);
				else $$render(alternate, -1);
			});
			append($$anchor, fragment);
		};
		const Theme = ($$anchor) => {
			var fragment_1 = comment();
			var node_2 = first_child(fragment_1);
			var consequent_2 = ($$anchor) => {
				var span = root_8$1();
				attach(span, () => appendThemeButton(data.theme.element));
				append($$anchor, span);
			};
			var alternate_1 = ($$anchor) => {
				const darkMode = user_derived(() => data.theme?.darkmode);
				var a_3 = root_9$1();
				var i_1 = child(a_3);
				reset(a_3);
				template_effect(() => set_class(i_1, 1, clsx([
					"fas",
					get(darkMode) && "fa-sun",
					!get(darkMode) && "fa-moon"
				])));
				append($$anchor, a_3);
			};
			if_block(node_2, ($$render) => {
				if (data.theme?.element) $$render(consequent_2);
				else $$render(alternate_1, -1);
			});
			append($$anchor, fragment_1);
		};
		const Disable = ($$anchor) => {
			var a_6 = root_11$1();
			delegated("click", a_6, disableUserscript);
			append($$anchor, a_6);
		};
		let incognito = user_derived(() => getSettings("incognito"));
		let floatingDownload = user_derived(() => getSettings("floatingDownload"));
		let messagesTitle = user_derived(() => data.messages ? "Unread" : "Messages");
		let searchQuery = state$1("");
		function disableUserscript(event) {
			event.preventDefault();
			setUserscript(true);
		}
		function handleSearch() {
			const url = "/forum/tracker.php?search_id=&nm=";
			window.location.href = `${url}${encodeURIComponent(get(searchQuery))}`;
		}
		function appendThemeButton(themeElement) {
			return (element) => {
				if (!(themeElement instanceof HTMLAnchorElement)) return;
				element.appendChild(themeElement);
				return () => {
					themeElement.remove();
				};
			};
		}
		var div_1 = root$6();
		let classes;
		var div_2 = child(div_1);
		var a_8 = child(div_2);
		var img = child(a_8);
		let classes_1;
		reset(a_8);
		reset(div_2);
		var div_3 = sibling(div_2, 2);
		var div_4 = child(div_3);
		var div_5 = child(div_4);
		var node_3 = child(div_5);
		Item$2(node_3, () => "Profile", () => Profile);
		var node_4 = sibling(node_3, 2);
		Item$2(node_4, () => get(messagesTitle), () => Messages);
		var node_5 = sibling(node_4, 2);
		Item$2(node_5, () => "Theme", () => Theme);
		var node_6 = sibling(node_5, 2);
		Item$2(node_6, () => "Settings", () => Settings$1);
		var node_7 = sibling(node_6, 2);
		if_block(node_7, ($$render) => {});
		Item$2(sibling(node_7, 2), () => "Disable", () => Disable);
		reset(div_5);
		var div_6 = sibling(div_5, 2);
		var input = child(div_6);
		remove_input_defaults(input);
		var button = sibling(input, 2);
		reset(div_6);
		reset(div_4);
		reset(div_3);
		reset(div_1);
		template_effect(() => {
			classes = set_class(div_1, 1, "svelte-zne36e", null, classes, { floatingDownload: get(floatingDownload) });
			set_attribute(img, "src", data.logo);
			classes_1 = set_class(img, 1, "svelte-zne36e", null, classes_1, { incognito: get(incognito) });
		});
		event("keypress", input, (event) => {
			if (event.key === "Enter") handleSearch();
		});
		bind_value(input, () => get(searchQuery), ($$value) => set(searchQuery, $$value));
		delegated("click", button, handleSearch);
		append($$anchor, div_1);
		pop();
	}
	delegate(["click"]);
	var root_3$6 = from_html(`<span class="description svelte-1emp0k3"> </span>`);
	var root_2$6 = from_html(`<label><input type="checkbox" class="svelte-1emp0k3"/> <span class="svelte-1emp0k3"><!> <!></span></label>`);
	var root_1$12 = from_html(`<div class="column svelte-1emp0k3"><h2 class="svelte-1emp0k3"> </h2> <!></div>`);
	var root$5 = from_html(`<div class="container svelte-1emp0k3"></div>`);
	function Options($$anchor, $$props) {
		push($$props, true);
		let parseTitle = user_derived(() => getSettings("parseTitle"));
		function onchange(event) {
			const checkbox = event.target;
			if (!checkbox) return;
			if (checkbox.id === "expandFiles" && store.showFileList !== checkbox.checked) store.toggleFileList();
			if (checkbox.id === "cacheImages" && !checkbox.checked) clearCache();
			saveOptions();
		}
		var div = root$5();
		each(div, 21, () => Object.entries(store.options), ([title, items]) => title, ($$anchor, $$item) => {
			var $$array = user_derived(() => to_array(get($$item), 2));
			let title = () => get($$array)[0];
			let items = () => get($$array)[1];
			var div_1 = root_1$12();
			var h2 = child(div_1);
			var text = child(h2, true);
			reset(h2);
			each(sibling(h2, 2), 17, items, (item) => item.key, ($$anchor, item, $$index) => {
				const disabled = user_derived(() => !get(parseTitle) && (get(item).key === "performerLinks" || get(item).key === "showTags") || get(item).key === "spaceImageAnchor" && store.columnCount !== 1);
				var label = root_2$6();
				let classes;
				var input = child(label);
				remove_input_defaults(input);
				var span = sibling(input, 2);
				var node_1 = child(span);
				html(node_1, () => get(item).label);
				var node_2 = sibling(node_1, 2);
				var consequent = ($$anchor) => {
					var span_1 = root_3$6();
					var text_1 = child(span_1, true);
					reset(span_1);
					template_effect(() => set_text(text_1, get(item).description));
					append($$anchor, span_1);
				};
				if_block(node_2, ($$render) => {
					if (get(item).description) $$render(consequent);
				});
				reset(span);
				reset(label);
				template_effect(() => {
					classes = set_class(label, 1, "svelte-1emp0k3", null, classes, { disabled: get(disabled) });
					set_attribute(input, "id", get(item).key);
					input.disabled = get(disabled);
				});
				delegated("change", input, onchange);
				delegated("click", input, (event) => {
					event.currentTarget?.blur();
				});
				bind_checked(input, () => get(item).value, ($$value) => get(item).value = $$value);
				append($$anchor, label);
			});
			reset(div_1);
			template_effect(() => set_text(text, title()));
			append($$anchor, div_1);
		});
		reset(div);
		append($$anchor, div);
		pop();
	}
	delegate(["change", "click"]);
	var linear = (x) => x;
	function cubic_out(t) {
		const f = t - 1;
		return f * f * f + 1;
	}
	function fade(node, { delay = 0, duration = 400, easing = linear } = {}) {
		const o = +getComputedStyle(node).opacity;
		return {
			delay,
			duration,
			easing,
			css: (t) => `opacity: ${t * o}`
		};
	}
	function slide(node, { delay = 0, duration = 400, easing = cubic_out, axis = "y" } = {}) {
		const style = getComputedStyle(node);
		const opacity = +style.opacity;
		const primary_property = axis === "y" ? "height" : "width";
		const primary_property_value = parseFloat(style[primary_property]);
		const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"];
		const capitalized_secondary_properties = secondary_properties.map((e) => `${e[0].toUpperCase()}${e.slice(1)}`);
		const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]);
		const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]);
		const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]);
		const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]);
		const border_width_start_value = parseFloat(style[`border${capitalized_secondary_properties[0]}Width`]);
		const border_width_end_value = parseFloat(style[`border${capitalized_secondary_properties[1]}Width`]);
		return {
			delay,
			duration,
			easing,
			css: (t) => `overflow: hidden;opacity: ${Math.min(t * 20, 1) * opacity};${primary_property}: ${t * primary_property_value}px;padding-${secondary_properties[0]}: ${t * padding_start_value}px;padding-${secondary_properties[1]}: ${t * padding_end_value}px;margin-${secondary_properties[0]}: ${t * margin_start_value}px;margin-${secondary_properties[1]}: ${t * margin_end_value}px;border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;min-${primary_property}: 0`
		};
	}
	function scale(node, { delay = 0, duration = 400, easing = cubic_out, start = 0, opacity = 0 } = {}) {
		const style = getComputedStyle(node);
		const target_opacity = +style.opacity;
		const transform = style.transform === "none" ? "" : style.transform;
		const sd = 1 - start;
		const od = target_opacity * (1 - opacity);
		return {
			delay,
			duration,
			easing,
			css: (_t, u) => `
			transform: ${transform} scale(${1 - sd * u});
			opacity: ${target_opacity - od * u}
		`
		};
	}
	var root_1$11 = from_html(`<span><!></span>`);
	var root_2$5 = from_svg(`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="svelte-1obhcw8"><path d="M9.86 18a1 1 0 0 1-.73-.32l-4.86-5.17a1 1 0 1 1 1.46-1.37l4.12 4.39l8.41-9.2a1 1 0 1 1 1.48 1.34l-9.14 10a1 1 0 0 1-.73.33Z" class="svelte-1obhcw8"></path></svg>`);
	var root$4 = from_html(`<button class="svelte-1obhcw8"><!></button>`);
	function Checkmark($$anchor, $$props) {
		push($$props, true);
		const DURATION = 1e3;
		let clicked = state$1(false);
		let timeout = null;
		let clientWidth = state$1(0);
		let clientHeight = state$1(0);
		let opts = user_derived(() => ({
			...store.transition,
			start: .6
		}));
		function onclick() {
			$$props.onclick?.();
			handleTransition();
		}
		function handleTransition() {
			set(clicked, true);
			if (timeout) clearTimeout(timeout);
			timeout = setTimeout(() => {
				set(clicked, false);
				timeout = null;
			}, DURATION);
		}
		onDestroy(() => {
			if (timeout) clearTimeout(timeout);
		});
		var button = root$4();
		let styles;
		var node = child(button);
		var consequent = ($$anchor) => {
			var span = root_1$11();
			snippet(child(span), () => $$props.children);
			reset(span);
			transition(3, span, () => scale, () => get(opts));
			bind_element_size(span, "clientWidth", ($$value) => set(clientWidth, $$value));
			bind_element_size(span, "clientHeight", ($$value) => set(clientHeight, $$value));
			append($$anchor, span);
		};
		var alternate = ($$anchor) => {
			var svg = root_2$5();
			var path = child(svg);
			reset(svg);
			transition(3, path, () => scale, () => get(opts));
			append($$anchor, svg);
		};
		if_block(node, ($$render) => {
			if (!get(clicked)) $$render(consequent);
			else $$render(alternate, -1);
		});
		reset(button);
		template_effect(() => {
			set_attribute(button, "title", $$props.title);
			button.disabled = $$props.disabled;
			styles = set_style(button, "", styles, {
				width: `${get(clientWidth) ?? ""}px`,
				height: `${get(clientHeight) ?? ""}px`
			});
		});
		delegated("click", button, onclick);
		append($$anchor, button);
		pop();
	}
	delegate(["click"]);
	var root$3 = from_html(`<div class="container svelte-1hugea"><!> <div class="align-right svelte-1hugea"><!> <!> <!></div></div>`);
	function Actions($$anchor, $$props) {
		push($$props, true);
		let parseTitle = user_derived(() => getSettings("parseTitle"));
		let performerLinks = user_derived(() => getSettings("performerLinks"));
		var div = root$3();
		var node = child(div);
		{
			let $0 = user_derived(() => !get(parseTitle) || !get(performerLinks));
			Checkmark(node, {
				get onclick() {
					return addPerformerLink;
				},
				title: "Add performer link",
				get disabled() {
					return get($0);
				},
				children: ($$anchor, $$slotProps) => {
					next();
					append($$anchor, text("Add link"));
				},
				$$slots: { default: true }
			});
		}
		var div_1 = sibling(node, 2);
		var node_1 = child(div_1);
		Checkmark(node_1, {
			get onclick() {
				return syncSettings;
			},
			title: "Sync settings to other tabs",
			children: ($$anchor, $$slotProps) => {
				next();
				append($$anchor, text("Sync"));
			},
			$$slots: { default: true }
		});
		var node_2 = sibling(node_1, 2);
		Checkmark(node_2, {
			get onclick() {
				return restoreDefaultSettings;
			},
			title: "Restore all settings to default",
			children: ($$anchor, $$slotProps) => {
				next();
				append($$anchor, text("Restore"));
			},
			$$slots: { default: true }
		});
		Checkmark(sibling(node_2, 2), {
			get onclick() {
				return exportSettings;
			},
			title: "Export settings as text file",
			children: ($$anchor, $$slotProps) => {
				next();
				append($$anchor, text("Export"));
			},
			$$slots: { default: true }
		});
		reset(div_1);
		reset(div);
		append($$anchor, div);
		pop();
	}
	function slideFade(node, { delay = 0, duration = 400, easing = cubicOut, axis = "y" } = {}) {
		const style = getComputedStyle(node);
		const opacity = +style.opacity;
		const primary_property = axis === "y" ? "height" : "width";
		const primary_property_value = parseFloat(style[primary_property]);
		const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"];
		const capitalized_secondary_properties = secondary_properties.map((e) => `${e[0].toUpperCase()}${e.slice(1)}`);
		const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]);
		const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]);
		const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]);
		const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]);
		const border_width_start_value = parseFloat(style[`border${capitalized_secondary_properties[0]}Width`]);
		const border_width_end_value = parseFloat(style[`border${capitalized_secondary_properties[1]}Width`]);
		return {
			delay,
			duration,
			easing,
			css: (t) => `overflow: hidden;opacity: ${t * opacity};${primary_property}: ${t * primary_property_value}px;padding-${secondary_properties[0]}: ${t * padding_start_value}px;padding-${secondary_properties[1]}: ${t * padding_end_value}px;margin-${secondary_properties[0]}: ${t * margin_start_value}px;margin-${secondary_properties[1]}: ${t * margin_end_value}px;border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;min-${primary_property}: 0`
		};
	}
	var Favicon = ($$anchor, link = noop) => {
		const src = user_derived(() => getFaviconUrl(link().url));
		var fragment = comment();
		var node = first_child(fragment);
		var consequent = ($$anchor) => {
			var img = root_2$4();
			template_effect(() => {
				set_attribute(img, "src", get(src));
				set_attribute(img, "alt", link().label);
			});
			append($$anchor, img);
		};
		if_block(node, ($$render) => {
			if (get(src)) $$render(consequent);
		});
		append($$anchor, fragment);
	};
	var Remove = ($$anchor, index = noop) => {
		var button = root_4$4();
		delegated("click", button, () => removePerformerLink(index()));
		append($$anchor, button);
	};
	var root_2$4 = from_html(`<img class="svelte-kvmnko"/>`);
	var root_3$5 = from_html(`<input type="text" class="svelte-kvmnko"/>`);
	var root_4$4 = from_html(`<button title="Remove link" class="svelte-kvmnko">×</button>`);
	var root_6$5 = from_html(`<div class="item svelte-kvmnko"><!> <!> <!> <!></div>`);
	var root_5$5 = from_html(`<div class="container svelte-kvmnko"></div>`);
	function Links($$anchor, $$props) {
		push($$props, true);
		const Input = ($$anchor, key = noop, link = noop, index = noop) => {
			var input = root_3$5();
			remove_input_defaults(input);
			template_effect(() => {
				set_attribute(input, "name", placeholders[key()]);
				set_attribute(input, "placeholder", placeholders[key()]);
			});
			delegated("input", input, () => updatePerformerLink(index(), { [key()]: link()[key()] }));
			bind_value(input, () => link()[key()], ($$value) => link()[key()] = $$value);
			append($$anchor, input);
		};
		const placeholders = {
			id: "ID",
			label: "Label",
			url: "URL"
		};
		let parseTitle = user_derived(() => getSettings("parseTitle"));
		let performerLinks = user_derived(() => getSettings("performerLinks"));
		var fragment_1 = comment();
		var node_1 = first_child(fragment_1);
		var consequent_1 = ($$anchor) => {
			var div = root_5$5();
			each(div, 23, () => store.performerLinks, (link) => link.id, ($$anchor, link, index) => {
				var div_1 = root_6$5();
				var node_2 = child(div_1);
				Favicon(node_2, () => get(link));
				var node_3 = sibling(node_2, 2);
				Input(node_3, () => "label", () => get(link), () => get(index));
				var node_4 = sibling(node_3, 2);
				Input(node_4, () => "url", () => get(link), () => get(index));
				Remove(sibling(node_4, 2), () => get(index));
				reset(div_1);
				transition(3, div_1, () => slideFade, () => store.transition);
				append($$anchor, div_1);
			});
			reset(div);
			transition(3, div, () => slideFade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node_1, ($$render) => {
			if (get(parseTitle) && get(performerLinks) && store.performerLinks?.length) $$render(consequent_1);
		});
		append($$anchor, fragment_1);
		pop();
	}
	delegate(["input", "click"]);
	var root_1$10 = from_html(`<div class="svelte-1kxfd5y"><button class="svelte-1kxfd5y">×</button> <!> <!> <!></div>`);
	function Settings($$anchor, $$props) {
		push($$props, false);
		init();
		var fragment = comment();
		var node = first_child(fragment);
		var consequent = ($$anchor) => {
			var div = root_1$10();
			var button = child(div);
			var node_1 = sibling(button, 2);
			Options(node_1, {});
			var node_2 = sibling(node_1, 2);
			Links(node_2, {});
			Actions(sibling(node_2, 2), {});
			reset(div);
			delegated("click", button, function(...$$args) {
				toggleShowSettings?.apply(this, $$args);
			});
			transition(3, div, () => slideFade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node, ($$render) => {
			if (store.showSettings) $$render(consequent);
		});
		append($$anchor, fragment);
		pop();
	}
	delegate(["click"]);
	var root_1$9 = from_html(`<div class="svelte-wvkwp9"><button class="ic--sharp-download svelte-wvkwp9" title="Download" aria-label="Download"></button></div>`);
	function Float($$anchor, $$props) {
		push($$props, true);
		let floatingDownload = user_derived(() => getSettings("floatingDownload"));
		var fragment = comment();
		var node = first_child(fragment);
		var consequent = ($$anchor) => {
			var div = root_1$9();
			var button = child(div);
			reset(div);
			delegated("click", button, function(...$$args) {
				handleDownload?.apply(this, $$args);
			});
			transition(1, div, () => fade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node, ($$render) => {
			if (get(floatingDownload)) $$render(consequent);
		});
		append($$anchor, fragment);
		pop();
	}
	delegate(["click"]);
	var root_3$4 = from_html(`<link rel="prefetch" as="image"/>`);
	var root_6$4 = from_html(`<a class="svelte-vtocc6"><img class="svelte-vtocc6"/> </a>`);
	var root_4$3 = from_html(`<div role="tooltip" class="container svelte-vtocc6"><div class="indicator svelte-vtocc6"></div> <div class="items svelte-vtocc6"></div></div>`);
	function Dropdown$1($$anchor, $$props) {
		push($$props, true);
		let top = state$1(0);
		let left = state$1(0);
		let container = state$1(null);
		let currentTarget = user_derived(() => store.dropdown?.currentTarget);
		user_effect(() => {
			if (!store.dropdown?.clientX || !store.dropdown?.clientY || !get(currentTarget)) return;
			const rect = getClickedRect(store.dropdown.clientX, store.dropdown.clientY);
			if (!rect) return;
			set(top, rect.bottom + window.scrollY);
			set(left, store.dropdown.clientX + window.scrollX);
			if (store.dropdown?.classList) get(currentTarget).classList.add(...store.dropdown.classList);
			return on(get(currentTarget), "pointerleave", onpointerleave);
		});
		function getClickedRect(clientX, clientY) {
			const rects = get(currentTarget).getClientRects();
			if (!rects.length) return null;
			let clickedRect = null;
			for (let i = 0; i < rects.length; i++) {
				const rect = rects[i];
				if (rect && clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom) {
					clickedRect = rect;
					break;
				}
			}
			return clickedRect;
		}
		function onpointerleave(event) {
			const related = event.relatedTarget;
			if (get(currentTarget)?.contains(related) || get(container)?.contains(related)) return;
			store.closeDropdown();
		}
		function onclickcapture() {
			store.closeDropdown();
		}
		var fragment_2 = comment();
		head("vtocc6", ($$anchor) => {
			var fragment = comment();
			each(first_child(fragment), 17, () => store.performerLinks, (link) => link.id, ($$anchor, link) => {
				var fragment_1 = comment();
				var node_1 = first_child(fragment_1);
				var consequent = ($$anchor) => {
					var link_1 = root_3$4();
					template_effect(() => set_attribute(link_1, "href", store.favIcons[get(link).url]));
					append($$anchor, link_1);
				};
				if_block(node_1, ($$render) => {
					if (get(link).url && store.favIcons[get(link).url]) $$render(consequent);
				});
				append($$anchor, fragment_1);
			});
			append($$anchor, fragment);
		});
		var node_2 = first_child(fragment_2);
		var consequent_2 = ($$anchor) => {
			var div = root_4$3();
			let styles;
			var div_1 = sibling(child(div), 2);
			each(div_1, 21, () => store.performerLinks, (link) => link.id, ($$anchor, link) => {
				var fragment_3 = comment();
				var node_3 = first_child(fragment_3);
				var consequent_1 = ($$anchor) => {
					var a = root_6$4();
					var img = child(a);
					var text = sibling(img);
					reset(a);
					template_effect(($0) => {
						set_attribute(a, "href", $0);
						set_attribute(img, "src", store.favIcons[get(link).url]);
						set_attribute(img, "alt", get(link).label);
						set_text(text, ` ${get(link).label ?? ""}`);
					}, [() => getLinkUrl(get(link), store.dropdown.item)]);
					event("click", a, onclickcapture, true);
					append($$anchor, a);
				};
				if_block(node_3, ($$render) => {
					if (get(link).label && get(link).url && store.favIcons[get(link).url] && store.dropdown?.item) $$render(consequent_1);
				});
				append($$anchor, fragment_3);
			});
			reset(div_1);
			reset(div);
			bind_this(div, ($$value) => set(container, $$value), () => get(container));
			template_effect(() => styles = set_style(div, "", styles, {
				top: `${get(top) ?? ""}px`,
				left: `${get(left) ?? ""}px`
			}));
			event("pointerleave", div, onpointerleave);
			transition(2, div, () => fade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node_2, ($$render) => {
			if (store.dropdown) $$render(consequent_2);
		});
		append($$anchor, fragment_2);
		pop();
	}
	var Dropdown = ($$anchor, item = noop) => {
		var span = root_3$3();
		var text = child(span, true);
		reset(span);
		template_effect(() => set_text(text, item()));
		delegated("click", span, (event) => store.openDropdown(event, item(), ["title-item--hover"]));
		append($$anchor, span);
	};
	var Placholder = ($$anchor) => {
		const items = user_derived(() => ["Performer", "Title"]);
		var fragment_1 = comment();
		each(first_child(fragment_1), 17, () => get(items), index, ($$anchor, item, i) => {
			next();
			var fragment_2 = root_5$4();
			var text_1 = first_child(fragment_2);
			text_1.nodeValue = `${i > 0 ? " - " : ""} `;
			Dropdown(sibling(text_1), () => get(item));
			append($$anchor, fragment_2);
		});
		append($$anchor, fragment_1);
	};
	var root_3$3 = from_html(`<span class="title-item svelte-1gft3h5"> </span>`);
	var root_5$4 = from_html(` <!>`, 1);
	var root_9 = from_html(`<a class="title-item svelte-1gft3h5"> </a>`);
	var root_10$1 = from_html(`<a class="title-item svelte-1gft3h5"> </a>`);
	var root_13$1 = from_html(`<h1 id="x-title" class="svelte-1gft3h5"><!></h1>`);
	var root_14$1 = from_html(`<h1 id="x-title" class="svelte-1gft3h5"> </h1>`);
	var root_15 = from_html(`<h1 id="x-title" class="svelte-1gft3h5"><!></h1>`);
	var root_16 = from_html(`<h1 id="x-title" class="svelte-1gft3h5"><a class="original-title svelte-1gft3h5"> </a></h1>`);
	function Title($$anchor, $$props) {
		push($$props, true);
		const ParsedTitle = ($$anchor, searchTerms = noop) => {
			const validLinks = user_derived(() => store.performerLinks.filter((link) => link.url && link.label));
			var fragment_3 = comment();
			each(first_child(fragment_3), 17, () => get(items), index, ($$anchor, item) => {
				var fragment_4 = comment();
				var node_4 = first_child(fragment_4);
				var consequent_4 = ($$anchor) => {
					var fragment_5 = comment();
					var node_5 = first_child(fragment_5);
					var consequent_1 = ($$anchor) => {
						var a_1 = root_9();
						var text_2 = child(a_1, true);
						reset(a_1);
						template_effect(($0) => {
							set_attribute(a_1, "href", `/forum/tracker.php?nm=${$0 ?? ""}`);
							set_text(text_2, get(item));
						}, [() => encodeURIComponent(get(item))]);
						append($$anchor, a_1);
					};
					var consequent_2 = ($$anchor) => {
						var a_2 = root_10$1();
						var text_3 = child(a_2, true);
						reset(a_2);
						template_effect(($0) => {
							set_attribute(a_2, "href", $0);
							set_text(text_3, get(item));
						}, [() => getLinkUrl(store.performerLinks[0], get(item))]);
						append($$anchor, a_2);
					};
					var consequent_3 = ($$anchor) => {
						Dropdown($$anchor, () => get(item));
					};
					if_block(node_5, ($$render) => {
						if (get(validLinks).length === 0 || !get(performerLinks)) $$render(consequent_1);
						else if (get(validLinks).length === 1 && store.performerLinks[0]) $$render(consequent_2, 1);
						else if (get(validLinks).length > 1) $$render(consequent_3, 2);
					});
					append($$anchor, fragment_5);
				};
				var d = user_derived(() => get(item) && searchTerms().includes(get(item)));
				var alternate = ($$anchor) => {
					var text_4 = text();
					template_effect(() => set_text(text_4, get(item)));
					append($$anchor, text_4);
				};
				if_block(node_4, ($$render) => {
					if (get(d)) $$render(consequent_4);
					else $$render(alternate, -1);
				});
				append($$anchor, fragment_4);
			});
			append($$anchor, fragment_3);
		};
		let incognito = user_derived(() => getSettings("incognito"));
		let parseTitle = user_derived(() => getSettings("parseTitle"));
		let performerLinks = user_derived(() => getSettings("performerLinks"));
		let title = user_derived(() => data.title?.parsed);
		let searchTerms = user_derived(() => data.title?.searchTerms);
		let original = user_derived(() => data.title?.original);
		let firstTag = user_derived(() => {
			const tag = data.title?.tags?.[0];
			if (get(searchTerms)?.length === 0 && tag) return tag;
		});
		let items = user_derived(() => {
			if (!get(title) || !get(searchTerms)?.length) return [get(title)];
			const sortedTerms = [...get(searchTerms)].sort((a, b) => b.length - a.length);
			const parts = [];
			let remaining = get(title);
			while (remaining) {
				let foundMatch = null;
				let foundIndex = remaining.length;
				for (const term of sortedTerms) {
					const index = remaining.indexOf(term);
					if (index !== -1 && index < foundIndex) {
						foundMatch = term;
						foundIndex = index;
					}
				}
				if (foundMatch) {
					if (foundIndex > 0) parts.push(remaining.slice(0, foundIndex));
					parts.push(foundMatch);
					remaining = remaining.slice(foundIndex + foundMatch.length);
				} else {
					parts.push(remaining);
					break;
				}
			}
			return parts.filter((part) => part !== "");
		});
		let documentTitle = user_derived(() => {
			if (get(parseTitle)) {
				if (get(firstTag)) return get(firstTag);
				else if (get(title)) return get(title);
			}
			return data.title?.original || document.title;
		});
		var fragment_8 = comment();
		head("1gft3h5", ($$anchor) => {
			var fragment = comment();
			var node = first_child(fragment);
			var consequent = ($$anchor) => {
				deferred_template_effect(() => {
					$document.title = get(documentTitle) ?? "";
				});
			};
			if_block(node, ($$render) => {
				if (get(documentTitle)) $$render(consequent);
			});
			append($$anchor, fragment);
		});
		var node_6 = first_child(fragment_8);
		var consequent_5 = ($$anchor) => {
			var h1 = root_13$1();
			Placholder(child(h1));
			reset(h1);
			append($$anchor, h1);
		};
		var consequent_6 = ($$anchor) => {
			var h1_1 = root_14$1();
			var text_5 = child(h1_1, true);
			reset(h1_1);
			template_effect(() => set_text(text_5, get(firstTag)));
			append($$anchor, h1_1);
		};
		var consequent_7 = ($$anchor) => {
			var h1_2 = root_15();
			ParsedTitle(child(h1_2), () => get(searchTerms));
			reset(h1_2);
			append($$anchor, h1_2);
		};
		var consequent_8 = ($$anchor) => {
			var h1_3 = root_16();
			var a_3 = child(h1_3);
			var text_6 = child(a_3, true);
			reset(a_3);
			reset(h1_3);
			template_effect(($0) => {
				set_attribute(a_3, "href", `/forum/tracker.php?nm=${$0 ?? ""}`);
				set_text(text_6, get(original));
			}, [() => encodeURIComponent(get(original))]);
			append($$anchor, h1_3);
		};
		if_block(node_6, ($$render) => {
			if (get(incognito)) $$render(consequent_5);
			else if (get(firstTag)) $$render(consequent_6, 1);
			else if (get(parseTitle) && get(title) && get(searchTerms)) $$render(consequent_7, 2);
			else if (get(original)) $$render(consequent_8, 3);
		});
		append($$anchor, fragment_8);
		pop();
	}
	delegate(["click"]);
	var root_1$8 = from_html(`<button class="item svelte-1ai34w7" aria-label="thank"></button>`);
	function Thank($$anchor, $$props) {
		push($$props, true);
		let observer;
		let clicked = state$1(false);
		let success = state$1(false);
		let disabled = user_derived(() => {
			if (get(success)) return true;
			if (!data.thank?.list) return false;
			const userLink = data.user?.link;
			if (!userLink) return false;
			const userId = new URL(userLink, location.href).searchParams.get("u");
			if (!userId) return false;
			return data.thank?.list.has(userId);
		});
		let title = user_derived(() => {
			if (get(disabled)) return "Already thanked";
		});
		function handleValue(value) {
			if (data.thank?.element && data.thank?.element instanceof HTMLInputElement) data.thank.element.value = "Thanks: " + value;
		}
		function handleElement(thank) {
			return (element) => {
				if (thank) for (const attr of [
					"title",
					"style",
					"class"
				]) thank.removeAttribute(attr);
				if (get(disabled)) handleValue("Given");
				else if (get(clicked) && !get(disabled)) handleValue("Loading...");
				else handleValue("Give");
				element.appendChild(thank);
				return () => thank.remove();
			};
		}
		function onclick(event) {
			if (get(disabled) || get(clicked)) return;
			set(clicked, true);
			observer?.disconnect();
			const currentTarget = event.currentTarget;
			const callback = (mutationList, observer) => {
				for (const mutation of mutationList) {
					if (mutation.type !== "childList") continue;
					mutation.addedNodes.forEach((node) => {
						if (node instanceof HTMLHeadingElement) {
							node.remove();
							set(success, true);
							observer.disconnect();
						}
					});
				}
			};
			observer = new MutationObserver(callback);
			observer.observe(currentTarget, { childList: true });
		}
		onDestroy(() => observer?.disconnect());
		var fragment = comment();
		var node_1 = first_child(fragment);
		var consequent = ($$anchor) => {
			var button = root_1$8();
			attach(button, () => handleElement(data.thank.element));
			template_effect(() => {
				set_attribute(button, "title", get(title));
				button.disabled = get(disabled);
			});
			delegated("click", button, onclick);
			append($$anchor, button);
		};
		if_block(node_1, ($$render) => {
			if (data.thank?.element) $$render(consequent);
		});
		append($$anchor, fragment);
		pop();
	}
	delegate(["click"]);
	var Item$1 = ($$anchor, title = noop, data = noop) => {
		var fragment = comment();
		var node = first_child(fragment);
		var consequent = ($$anchor) => {
			var div = root_2$3();
			var span = child(div);
			var text = child(span);
			reset(span);
			var span_1 = sibling(span, 2);
			var text_1 = child(span_1, true);
			reset(span_1);
			reset(div);
			template_effect(($0) => {
				set_text(text, `${title() ?? ""}:`);
				set_class(span_1, 1, $0, "svelte-cjprq");
				set_text(text_1, data());
			}, [() => clsx(title().toLowerCase())]);
			append($$anchor, div);
		};
		var alternate = ($$anchor) => {
			Error$1($$anchor, title);
		};
		if_block(node, ($$render) => {
			if (data()) $$render(consequent);
			else $$render(alternate, -1);
		});
		append($$anchor, fragment);
	};
	var Error$1 = ($$anchor, title = noop) => {
		var div_1 = root_4$2();
		var span_2 = child(div_1);
		var text_2 = child(span_2);
		reset(span_2);
		next(2);
		reset(div_1);
		template_effect(() => set_text(text_2, `${title() ?? ""}:`));
		append($$anchor, div_1);
	};
	var root_2$3 = from_html(`<div class="item svelte-cjprq"><span class="title"> </span> <span> </span></div>`);
	var root_4$2 = from_html(`<div class="item svelte-cjprq"><span class="title"> </span> <span class="error svelte-cjprq">N/A</span></div>`);
	var root_6$3 = from_html(`<button class="item svelte-cjprq"><span class="title">Date:</span> <!></button>`);
	var root_13 = from_html(`<span class="item svelte-cjprq"><!></span>`);
	var root_20 = from_html(`<a id="dl-link">.torrent</a>`);
	var root_17 = from_html(`<button class="item svelte-cjprq"><span class="title">Download:</span> <!></button>`);
	var root_25 = from_html(`<span><a> </a> </span>`);
	var root_24 = from_html(`<div class="item svelte-cjprq"><span class="title">Related:</span> <!></div>`);
	var root_5$3 = from_html(`<div id="x-stats" class="svelte-cjprq"><!> <!> <!> <!> <button class="item svelte-cjprq"><span class="title">Files:</span> <!></button> <!> <!> <!> <!></div>`);
	function Stats($$anchor, $$props) {
		push($$props, true);
		let showFullDate = state$1(false);
		let expandFiles = user_derived(() => getSettings("expandFiles"));
		let fileListState = state$1("idle");
		onMount(() => {
			if (get(expandFiles)) store.toggleFileList();
		});
		user_effect(() => {
			if (!store.showFileList) set(fileListState, "idle");
			if (store.fileListData && get(fileListState) === "loading") set(fileListState, "loaded");
		});
		function handleDateClick() {
			set(showFullDate, !get(showFullDate));
		}
		function handleFileListClick() {
			if (store.showFileList) set(fileListState, "idle");
			else set(fileListState, "loading");
			store.toggleFileList();
		}
		var fragment_2 = comment();
		var node_1 = first_child(fragment_2);
		var consequent_12 = ($$anchor) => {
			var div_2 = root_5$3();
			var node_2 = child(div_2);
			Item$1(node_2, () => "Seeders", () => data.torrent?.seeders || "0");
			var node_3 = sibling(node_2, 2);
			Item$1(node_3, () => "Leechers", () => data.torrent?.leechers || "0");
			var node_4 = sibling(node_3, 2);
			Item$1(node_4, () => "Size", () => data.torrent?.size);
			var node_5 = sibling(node_4, 2);
			var consequent_2 = ($$anchor) => {
				var button = root_6$3();
				var node_6 = sibling(child(button), 2);
				var consequent_1 = ($$anchor) => {
					var text_3 = text();
					template_effect(($0) => set_text(text_3, $0), [() => handleRelativeDate(data.torrent.date)]);
					append($$anchor, text_3);
				};
				var alternate_1 = ($$anchor) => {
					var text_4 = text();
					template_effect(($0) => set_text(text_4, $0), [() => data.torrent.date?.toLocaleString()]);
					append($$anchor, text_4);
				};
				if_block(node_6, ($$render) => {
					if (!get(showFullDate)) $$render(consequent_1);
					else $$render(alternate_1, -1);
				});
				reset(button);
				delegated("click", button, handleDateClick);
				append($$anchor, button);
			};
			var alternate_2 = ($$anchor) => {
				Error$1($$anchor, () => "Date");
			};
			if_block(node_5, ($$render) => {
				if (data.torrent?.date) $$render(consequent_2);
				else $$render(alternate_2, -1);
			});
			var button_1 = sibling(node_5, 2);
			var node_7 = sibling(child(button_1), 2);
			var consequent_3 = ($$anchor) => {
				append($$anchor, text("Loading..."));
			};
			var consequent_4 = ($$anchor) => {
				append($$anchor, text("Hide"));
			};
			var alternate_3 = ($$anchor) => {
				append($$anchor, text("Show"));
			};
			if_block(node_7, ($$render) => {
				if (get(fileListState) === "loading") $$render(consequent_3);
				else if (store.showFileList) $$render(consequent_4, 1);
				else $$render(alternate_3, -1);
			});
			reset(button_1);
			var node_8 = sibling(button_1, 2);
			var consequent_5 = ($$anchor) => {
				var span_3 = root_13();
				Thank(child(span_3), {});
				reset(span_3);
				append($$anchor, span_3);
			};
			var alternate_4 = ($$anchor) => {
				Error$1($$anchor, () => "Thanks");
			};
			if_block(node_8, ($$render) => {
				if (data.thank?.element && data.thank?.list) $$render(consequent_5);
				else $$render(alternate_4, -1);
			});
			var node_10 = sibling(node_8, 2);
			var consequent_6 = ($$anchor) => {
				const format = user_derived(() => new Intl.NumberFormat("en-US").format(data.torrent.times));
				Item$1($$anchor, () => "Downloads", () => get(format));
			};
			var alternate_5 = ($$anchor) => {
				Error$1($$anchor, () => "Downloads");
			};
			if_block(node_10, ($$render) => {
				if (data.torrent?.times != null) $$render(consequent_6);
				else $$render(alternate_5, -1);
			});
			var node_11 = sibling(node_10, 2);
			var consequent_9 = ($$anchor) => {
				var button_2 = root_17();
				button_2.disabled = false;
				var node_12 = sibling(child(button_2), 2);
				var alternate_6 = ($$anchor) => {
					var a = root_20();
					template_effect(() => set_attribute(a, "href", data.torrent.link));
					append($$anchor, a);
				};
				if_block(node_12, ($$render) => {
					$$render(alternate_6, -1);
				});
				reset(button_2);
				delegated("click", button_2, function(...$$args) {
					handleDownload?.apply(this, $$args);
				});
				append($$anchor, button_2);
			};
			var alternate_7 = ($$anchor) => {
				Error$1($$anchor, () => "Download");
			};
			if_block(node_11, ($$render) => {
				if (data.torrent?.link) $$render(consequent_9);
				else $$render(alternate_7, -1);
			});
			var node_13 = sibling(node_11, 2);
			var consequent_11 = ($$anchor) => {
				const max = user_derived(() => 5);
				var fragment_10 = comment();
				await_block(first_child(fragment_10), () => getRelated(data.title.original), null, ($$anchor, related) => {
					const results = user_derived(() => get(related).filter((result) => result.textContent !== data.title?.original));
					var fragment_11 = comment();
					var node_15 = first_child(fragment_11);
					var consequent_10 = ($$anchor) => {
						var div_3 = root_24();
						each(sibling(child(div_3), 2), 17, () => get(results), index, ($$anchor, result, i) => {
							var span_4 = root_25();
							var a_1 = child(span_4);
							var text_10 = child(a_1, true);
							reset(a_1);
							var text_11 = sibling(a_1);
							reset(span_4);
							template_effect(() => {
								set_attribute(a_1, "href", get(result).href);
								set_text(text_10, get(result).resolution);
								set_text(text_11, ` ${i < get(results).length - 1 ? ", " : ""}`);
							});
							append($$anchor, span_4);
						});
						reset(div_3);
						append($$anchor, div_3);
					};
					if_block(node_15, ($$render) => {
						if (get(results).length > 0 && get(results).length < get(max)) $$render(consequent_10);
					});
					append($$anchor, fragment_11);
				});
				append($$anchor, fragment_10);
			};
			if_block(node_13, ($$render) => {
				if (data.title?.original) $$render(consequent_11);
			});
			reset(div_2);
			template_effect(() => button_1.disabled = get(fileListState) === "loading");
			delegated("click", button_1, handleFileListClick);
			append($$anchor, div_2);
		};
		if_block(node_1, ($$render) => {
			if (data.user && !data.forumline) $$render(consequent_12);
		});
		append($$anchor, fragment_2);
		pop();
	}
	delegate(["click"]);
	var root_3$2 = from_html(`<a> </a>`);
	var root_5$2 = from_html(`<a> </a>`);
	var root_6$2 = from_html(`<span> </span>`);
	var root_1$7 = from_html(`<div id="x-tags" class="svelte-ttnt4a"></div>`);
	function Tags($$anchor, $$props) {
		push($$props, true);
		let parseTitle = user_derived(() => getSettings("parseTitle"));
		let showTags = user_derived(() => getSettings("showTags"));
		let performerLinks = user_derived(() => getSettings("performerLinks"));
		let derivedTags = user_derived(() => {
			if (getSettings("incognito")) return [
				"tag1",
				"tag2",
				"tag3",
				"tag4",
				"tag5"
			];
			const tags = data?.title?.tags || [];
			return [...new Set(tags)];
		});
		function resTag(tag) {
			return /\b(?:\d{3,}p|\d+k)\b/i.test(tag);
		}
		var fragment = comment();
		var node = first_child(fragment);
		var consequent_3 = ($$anchor) => {
			var div = root_1$7();
			each(div, 21, () => get(derivedTags), index, ($$anchor, item) => {
				const classList = user_derived(() => ["tag-item", resTag(get(item)) && "tag-res"]);
				var fragment_1 = comment();
				var node_1 = first_child(fragment_1);
				var consequent = ($$anchor) => {
					var a = root_3$2();
					var text = child(a, true);
					reset(a);
					template_effect(($0) => {
						set_class(a, 1, clsx(get(classList)), "svelte-ttnt4a");
						set_attribute(a, "href", `/forum/tracker.php?nm=${$0 ?? ""}`);
						set_text(text, get(item));
					}, [() => encodeURIComponent(get(item))]);
					append($$anchor, a);
				};
				var consequent_2 = ($$anchor) => {
					const link = user_derived(() => store.performerLinks[0]);
					var fragment_2 = comment();
					var node_2 = first_child(fragment_2);
					var consequent_1 = ($$anchor) => {
						var a_1 = root_5$2();
						var text_1 = child(a_1, true);
						reset(a_1);
						template_effect(($0) => {
							set_class(a_1, 1, clsx(get(classList)), "svelte-ttnt4a");
							set_attribute(a_1, "href", $0);
							set_text(text_1, get(item));
						}, [() => getLinkUrl(get(link), get(item))]);
						append($$anchor, a_1);
					};
					if_block(node_2, ($$render) => {
						if (get(link)) $$render(consequent_1);
					});
					append($$anchor, fragment_2);
				};
				var alternate = ($$anchor) => {
					var span = root_6$2();
					var text_2 = child(span, true);
					reset(span);
					template_effect(() => {
						set_class(span, 1, clsx(get(classList)), "svelte-ttnt4a");
						set_text(text_2, get(item));
					});
					delegated("click", span, (event) => store.openDropdown(event, get(item), ["tag-item--hover"]));
					append($$anchor, span);
				};
				if_block(node_1, ($$render) => {
					if (!get(performerLinks)) $$render(consequent);
					else if (store.performerLinks.length === 1) $$render(consequent_2, 1);
					else $$render(alternate, -1);
				});
				append($$anchor, fragment_1);
			});
			reset(div);
			transition(3, div, () => slideFade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node, ($$render) => {
			if (get(parseTitle) && get(showTags) && get(derivedTags)?.length) $$render(consequent_3);
		});
		append($$anchor, fragment);
		pop();
	}
	delegate(["click"]);
	var root_1$6 = from_html(`<div class="filelist svelte-1xito9"></div>`);
	function FileList($$anchor, $$props) {
		push($$props, true);
		function humanSize(bytes) {
			if (bytes <= 0) return "0 B";
			const units = [
				"B",
				"KB",
				"MB",
				"GB",
				"TB",
				"PB",
				"EB",
				"ZB",
				"YB"
			];
			const rounders = [
				1,
				1,
				1,
				100,
				1e3,
				1e3,
				1e3,
				1e3,
				1e3
			];
			const idx = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);
			let value = bytes / Math.pow(1024, idx);
			const factor = rounders[idx];
			if (!factor) return null;
			value = Math.round((value + Number.EPSILON) * factor) / factor;
			return `${value} ${units[idx]}`;
		}
		async function getFileList() {
			const t = new URL(location.href).searchParams.get("t");
			if (!t) {
				console.error("Missing \"t\" parameter");
				return;
			}
			try {
				const res = await fetch("viewtorrent.php", {
					method: "POST",
					headers: { "Content-Type": "application/x-www-form-urlencoded" },
					body: new URLSearchParams({ t }).toString()
				});
				if (!res.ok) {
					console.error(`Server error: ${res.status}`);
					return;
				}
				const raw = await res.text();
				const doc = new DOMParser().parseFromString(raw, "text/html");
				doc.querySelectorAll("li.collapsable").forEach((li) => {
					let dirSize = 0;
					li.querySelectorAll("i").forEach((i) => {
						dirSize += parseInt(i.textContent?.trim() || "0", 10);
					});
					const spanB = li.querySelector("span.b");
					if (spanB) {
						const s = doc.createElement("s");
						s.textContent = humanSize(dirSize);
						spanB.append(" · ", s);
					}
				});
				doc.querySelectorAll("i").forEach((i) => {
					i.textContent = humanSize(parseInt(i.textContent?.trim() || "0", 10));
				});
				store.fileListData = doc.body.innerHTML;
			} catch (err) {
				console.error("Failed to fetch/transform torrent filelist:", err);
			}
		}
		user_effect(() => {
			if (!store.fileListData && store.showFileList) getFileList();
		});
		var fragment = comment();
		var node = first_child(fragment);
		var consequent = ($$anchor) => {
			var div = root_1$6();
			html(div, () => store.fileListData, true);
			reset(div);
			transition(3, div, () => slideFade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node, ($$render) => {
			if (store.fileListData && store.showFileList) $$render(consequent);
		});
		append($$anchor, fragment);
		pop();
	}
	var parser$3 = new DOMParser();
	async function generic(href, selector, headers) {
		const { response, responseText, finalUrl } = await GM_fetch("GET", href, "blob", headers);
		if (response.type.startsWith("image/")) return finalUrl;
		const src = parser$3.parseFromString(responseText, "text/html").querySelector(selector)?.getAttribute("src");
		if (!src) throw new Error(`image not found: ${href}`);
		return new URL(src, href).href;
	}
	async function imagebam(href, selector) {
		return generic(href, selector, { Cookie: "nsfw_inter=1" });
	}
	async function imagenimage(href, src) {
		const match = src?.match(/(https:\/\/img\d+\.imagenimage\.com\/)th\/(.+)\.jpg/);
		if (!src || !match) return await getBlob(await generic(href, "#left > a > img"));
		const domain = match[1];
		const path = match[2];
		const linkMatch = href.match(/https:\/\/imagenimage\.com\/(.+)/);
		if (!linkMatch) throw new Error(`Invalid URL: ${href}`);
		return await getBlob(`${domain}i/${path}.jpg/${linkMatch[1]}`);
	}
	async function imagetwist(href, src) {
		let imgSrc;
		if (src && src.includes("/th/")) {
			const extRegex = /\.([\w]{2,4})(\?|$)/;
			const hrefExt = href.match(extRegex)?.[1];
			imgSrc = src.replace("/th/", "/i/");
			if (hrefExt) imgSrc = imgSrc.replace(extRegex, `.${hrefExt}$2`);
			const response = await GM_fetch("HEAD", imgSrc, "text");
			if (!/content-length:\s*8183/i.test(response.responseHeaders)) return await getBlob(imgSrc);
		}
		imgSrc = await generic(href, "img.pic");
		if (!imgSrc) throw new Error(`image not found: ${href}`);
		return await getBlob(imgSrc);
	}
	async function imagevenue(href, selector) {
		try {
			return await generic(href, selector);
		} catch {
			return generic(href, selector);
		}
	}
	async function imgbase(href, src) {
		if (!src) return href;
		return src.replace("-thumb.", ".");
	}
	async function imgbox(href) {
		if (href.includes("thumbs")) return href.replace("thumbs", "images").replace("_t.", "_o.");
		return generic(href, "#img");
	}
	var parser$2 = new DOMParser();
	async function imgbum(href) {
		const { responseText } = await GM_fetch("GET", href, "text");
		const imgSrc = ((parser$2.parseFromString(responseText, "text/html").querySelector("table > tbody > tr > td > img")?.getAttribute("onclick"))?.match(/\/\*mshow\('([^']+)'\);\*\//))?.[1];
		if (!imgSrc) throw new Error(`image not found: ${href}`);
		return new URL(imgSrc, href).href;
	}
	async function imgdrive(href, src) {
		if (!src) return href;
		const imgSrc = src.replace("/small/", "/big/");
		if (src.includes("imgwallet.com")) return imgSrc;
		return await getBlob(imgSrc);
	}
	async function imgfrost(href, src) {
		if (!src) return Promise.resolve(href);
		const parsed = new URL(src);
		parsed.hostname = "prcf.imgsourmaf.sbs";
		parsed.pathname = parsed.pathname.replace("/small/small_", "/big/");
		const { response, finalUrl } = await GM_fetch("GET", parsed.href, "blob", { Referer: "https://imgair.net" });
		if (!response.type.startsWith("image/")) throw new Error(`Expected image but got ${response.type} from ${finalUrl}`);
		return finalUrl;
	}
	async function piccash(href, src) {
		let imgSrc;
		if (src && src.includes("img_thumb")) imgSrc = src;
		else imgSrc = href;
		return imgSrc.replace("http://", "https://").replace("/img_thumb/", "/img_full/").replace("-thumb.", ".");
	}
	var parser$1 = new DOMParser();
	async function picforall(href) {
		const { responseText } = await GM_fetch("GET", href, "text");
		const imgSrc = ((parser$1.parseFromString(responseText, "text/html").querySelector("#pay_thumb_img img")?.getAttribute("onclick"))?.match(/mshow\('([^']+)'\)/))?.[1];
		if (!imgSrc) throw new Error(`image not found: ${href}`);
		return imgSrc;
	}
	async function picshick(href, src) {
		if (!src || !src.includes("/th/") || !href.includes("/")) return await getBlob(await generic(href, "img.pic"));
		const fileName = href.substring(href.lastIndexOf("/") + 1);
		const extension = fileName.substring(fileName.lastIndexOf(".") + 1);
		const parts = src.split("/");
		const albumId = parts[parts.length - 2];
		const thumbFile = parts[parts.length - 1];
		if (!thumbFile) throw Error(`parsing image: ${href}`);
		const imageId = thumbFile.substring(0, thumbFile.lastIndexOf("."));
		return await getBlob(`${src.substring(0, src.indexOf("/th/"))}${`/i/${albumId}/${imageId}.${extension}/${fileName}`}`);
	}
	async function turboimagehost(href) {
		const { response, responseText, finalUrl } = await GM_fetch("GET", href, "blob", { Referer: href });
		if (response.type.startsWith("image/")) return finalUrl;
		const match = responseText.match(/"og:image" content="([^"]+)"/);
		if (match && match[1]) return new URL(match[1], href).href;
		return generic(href, "#imageid");
	}
	var parser = new DOMParser();
	async function imx(href) {
		const body = new URLSearchParams();
		body.append("imgContinue", "Continue to image ... ");
		const response = await GM_fetch("POST", href, "text", { "Content-Type": "application/x-www-form-urlencoded" }, body.toString());
		const imgSrc = parser.parseFromString(response.responseText, "text/html").querySelector("img.centred");
		if (!imgSrc) throw new Error(`image not found: ${href}`);
		return imgSrc.src;
	}
	async function imgxxt(href) {
		return (await generic(href, "#image-viewer-container > img")).replace(".md.", ".");
	}
	var HANDLERS = {
		"fastpic.": (href) => generic(href, "#imglink > img.image.img-fluid"),
		"imagebam.com": (href) => imagebam(href, "img.main-image"),
		"imageban.ru": (href) => generic(href, "#img_main"),
		"imagenimage.com": (href, src) => imagenimage(href, src),
		"imagetwist.com": (href, src) => imagetwist(href, src),
		"picturelol.com": (href, src) => imagetwist(href, src),
		"vipr.im": (href, src) => imagetwist(href, src),
		"imagevenue.com": (href) => imagevenue(href, "#main-image"),
		"imgbase.ru": (href, src) => imgbase(href, src),
		"picclick.ru": (href, src) => imgbase(href, src),
		"adult-images.ru": (href, src) => imgbase(href, src),
		"payforpic.ru": (href, src) => imgbase(href, src),
		"xxxpicture.de": (href, src) => imgbase(href, src),
		"imgbum.de": (href, src) => imgbase(href, src),
		"adultimages.de": (href, src) => imgbase(href, src),
		"picforall.eu": (href, src) => imgbase(href, src),
		"pornoimages.de": (href, src) => imgbase(href, src),
		"imgbox.com": (href) => imgbox(href),
		"imgbum.ru": (href) => imgbum(href),
		"imgdrive.net": (href, src) => imgdrive(href, src),
		"imgadult.com": (href, src) => imgdrive(href, src),
		"imgwallet.com": (href, src) => imgdrive(href, src),
		"imgfrost.net": (href, src) => imgfrost(href, src),
		"imgblaze.net": (href, src) => imgfrost(href, src),
		"imagefly.cc": (href, src) => imgfrost(href, src),
		"piccash.net": (href, src) => piccash(href, src),
		"picforall.ru": (href) => picforall(href),
		"imgclick.ru": (href) => picforall(href),
		"freescreens.ru": (href) => picforall(href),
		"picshick.com": (href, src) => picshick(href, src),
		"turboimagehost.com": (href) => turboimagehost(href),
		"imx.to": (href) => imx(href),
		"imgxxt.in": (href) => imgxxt(href)
	};
	function updateStatus(imageId, data) {
		store.upgradeImgData[imageId] = {
			...store.upgradeImgData[imageId],
			...data
		};
	}
	async function upgradeImg(img) {
		if (!img) return;
		if (!img.id) return console.error("Image is missing id");
		const anchor = img.closest("a");
		if (!anchor || !anchor.getAttribute("href")) return updateStatus(img.id, {
			status: "error",
			error: `Image anchor with id ${img.id} is missing href`
		});
		updateStatus(img.id, { status: "loading" });
		if (getSettings("cacheImages")) {
			const cached = getCache$1(anchor.href);
			if (cached) {
				if (img.complete && img.naturalHeight !== 0) updateStatus(img.id, {
					status: "cached",
					resolved: cached
				});
				else {
					on(img, "load", () => {
						updateStatus(img.id, {
							status: "cached",
							resolved: cached
						});
					}, { once: true });
					on(img, "error", () => {
						updateStatus(img.id, {
							status: "error",
							error: `Failed to load cached image: ${cached}`
						});
					}, { once: true });
				}
				img.src = cached;
				return;
			}
		}
		const entry = Object.entries(HANDLERS).find(([domain]) => anchor.href.includes(domain));
		if (!entry) return updateStatus(img.id, {
			status: "error",
			error: `No handler for ${new URL(anchor.href).hostname}`
		});
		const [, handler] = entry;
		try {
			const src = await handler(anchor.href, img.src);
			if (src.startsWith("blob:")) {
				on(img, "load", () => {
					URL.revokeObjectURL(src);
					updateStatus(img.id, {
						status: "resolved",
						resolved: src
					});
				}, { once: true });
				on(img, "error", () => {
					URL.revokeObjectURL(src);
					updateStatus(img.id, {
						status: "error",
						error: `Failed to load blob`
					});
				}, { once: true });
			} else {
				on(img, "load", () => {
					setCache$1(anchor.href, src);
					updateStatus(img.id, {
						status: "resolved",
						resolved: src
					});
				}, { once: true });
				on(img, "error", () => {
					updateStatus(img.id, {
						status: "error",
						error: `Failed to load image from: ${src}`
					});
				}, { once: true });
			}
			updateStatus(img.id, { resolved: src });
			img.src = src;
		} catch (error) {
			return updateStatus(img.id, {
				error: String(error),
				status: "error"
			});
		}
	}
	function onIntersect(entries, observer) {
		entries.forEach((entry) => {
			if (entry.isIntersecting) {
				observer.unobserve(entry.target);
				upgradeImg(entry.target);
			}
		});
	}
	var observed = new WeakSet();
	var observer = new IntersectionObserver(onIntersect, { rootMargin: `${getSettings("limitConcurrent") ? "200%" : "1000%"} 0%` });
	async function observeImg(imgRefs) {
		const unobserved = imgRefs.filter((img) => {
			return !observed.has(img) && img instanceof HTMLImageElement;
		});
		if (!unobserved.length) return;
		unobserved.forEach((img) => {
			observed.add(img);
			observer.observe(img);
		});
	}
	var root$2 = from_html(`<div role="img"><!></div>`);
	function Resize($$anchor, $$props) {
		push($$props, true);
		let clicked = prop($$props, "clicked", 15), resized = prop($$props, "resized", 15);
		let dragResize = user_derived(() => getSettings("dragResize"));
		let clientX = state$1(0);
		let prevResizeWidth = state$1(0);
		let draggedEl = state$1(null);
		let draggedElCenter = state$1(0);
		let fitColumnCount = state$1(proxy(store.columnCount));
		function getElementCenter(element) {
			const rect = element.getBoundingClientRect();
			return rect.top + rect.height / 2;
		}
		function clamp(value, min = 20, max = 100) {
			return Math.min(max, Math.max(min, value));
		}
		function onpointerdown(event) {
			if (!get(dragResize) || !(event.target instanceof HTMLImageElement)) return;
			if (event.button !== 0) return;
			event.preventDefault();
			set(draggedEl, event.target, true);
			set(draggedElCenter, getElementCenter(get(draggedEl)), true);
			clicked(true);
			set(clientX, event.clientX, true);
			set(prevResizeWidth, store.resizeWidth, true);
		}
		async function onpointermove(event) {
			if (!get(dragResize) || !clicked()) return;
			if (!resized()) resized(event.clientX - get(clientX) !== 0);
			else if (resized() && $$props.containerWidth) {
				const deltaPercent = (event.clientX - get(clientX)) / $$props.containerWidth * 100;
				let newWidth = get(prevResizeWidth) + deltaPercent;
				let clampedWidth = clamp(newWidth);
				if (clampedWidth !== newWidth) {
					set(prevResizeWidth, clampedWidth, true);
					set(clientX, event.clientX, true);
				}
				store.resizeWidth = Math.round(clampedWidth * 10) / 10;
				requestAnimationFrame(() => {
					if (!get(draggedEl)) return;
					const deltaY = getElementCenter(get(draggedEl)) - get(draggedElCenter);
					window.scrollTo(0, window.scrollY + deltaY);
				});
			}
		}
		function onpointerup() {
			if (clicked() && resized()) saveResize(store.resizeWidth);
			clicked(false);
			resized(false);
			set(clientX, 0);
			set(prevResizeWidth, 0);
		}
		function waitForImages(containerEl) {
			const images = containerEl.querySelectorAll("img");
			return Promise.all(Array.from(images).map((img) => img.complete ? Promise.resolve() : new Promise((resolve) => {
				img.onload = img.onerror = resolve;
			})));
		}
		function getpopulatedColumns(containerEl) {
			const marker = document.createElement("span");
			marker.style.cssText = "position: absolute; visibility: hidden; height: 1px;";
			containerEl.appendChild(marker);
			const markerRect = marker.getBoundingClientRect();
			const containerRect = containerEl.getBoundingClientRect();
			const columnWidth = containerRect.width / parseFloat(getComputedStyle(containerEl).columnCount);
			const actualColumns = Math.floor((markerRect.left - containerRect.left) / columnWidth) + 1;
			containerEl.removeChild(marker);
			return actualColumns;
		}
		user_effect(() => {
			set(fitColumnCount, store.columnCount, true);
			if (store.columnCount === 1) return;
			const containerEl = store.ultraImages?.querySelector("[style*=\"column-count\"]");
			if (containerEl) waitForImages(containerEl).then(() => {
				requestAnimationFrame(() => {
					const populatedColumns = getpopulatedColumns(containerEl);
					if (populatedColumns < store.columnCount) set(fitColumnCount, populatedColumns, true);
				});
			});
		});
		var div = root$2();
		event("pointermove", $document, onpointermove);
		event("pointerup", $document, onpointerup);
		let classes;
		let styles;
		snippet(child(div), () => $$props.children);
		reset(div);
		template_effect(() => {
			classes = set_class(div, 1, "svelte-x5vner", null, classes, { dragging: clicked() && resized() });
			styles = set_style(div, "", styles, {
				width: `${(get(dragResize) ? store.resizeWidth : 100) ?? ""}%`,
				"column-count": get(fitColumnCount)
			});
		});
		delegated("pointerdown", div, onpointerdown);
		append($$anchor, div);
		pop();
	}
	delegate(["pointerdown"]);
	var root_1$5 = from_html(`<div class="loader svelte-bb97q4"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="svelte-bb97q4"><path d="M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2Zm0 18a8 8 0 1 1 8-8A8 8 0 0 1 12 20Z" opacity="0.5" class="svelte-bb97q4"></path><path class="animate svelte-bb97q4" d="M20 12h2A10 10 0 0 0 12 2V4A8 8 0 0 1 20 12Z"></path></svg></div>`);
	function Loader($$anchor, $$props) {
		push($$props, true);
		var fragment = comment();
		var node = first_child(fragment);
		var consequent = ($$anchor) => {
			var div = root_1$5();
			transition(3, div, () => fade, () => store.transition);
			append($$anchor, div);
		};
		if_block(node, ($$render) => {
			if ($$props.loading) $$render(consequent);
		});
		append($$anchor, fragment);
		pop();
	}
	var Item = ($$anchor, key = noop, value = noop, error = noop) => {
		var p = root_1$4();
		var strong = child(p);
		var text = child(strong, true);
		reset(strong);
		var node = sibling(strong, 2);
		var consequent = ($$anchor) => {
			var a = root_2$2();
			var text_1 = child(a, true);
			reset(a);
			template_effect(() => {
				set_attribute(a, "href", value());
				set_text(text_1, value());
			});
			append($$anchor, a);
		};
		var d = user_derived(() => value() && value().startsWith("http"));
		var consequent_1 = ($$anchor) => {
			append($$anchor, root_3$1());
		};
		var alternate = ($$anchor) => {
			var fragment = root_4$1();
			var text_2 = first_child(fragment);
			var node_1 = sibling(text_2);
			var consequent_2 = ($$anchor) => {
				var span_1 = root_5$1();
				var text_3 = child(span_1, true);
				reset(span_1);
				template_effect(() => set_text(text_3, error()));
				append($$anchor, span_1);
			};
			if_block(node_1, ($$render) => {
				if (value() === "error" && error()) $$render(consequent_2);
			});
			template_effect(() => set_text(text_2, `${value() ?? ""} `));
			append($$anchor, fragment);
		};
		if_block(node, ($$render) => {
			if (get(d)) $$render(consequent);
			else if (value() === void 0) $$render(consequent_1, 1);
			else $$render(alternate, -1);
		});
		reset(p);
		template_effect(() => {
			set_attribute(p, "data-key", key());
			set_text(text, key());
		});
		append($$anchor, p);
	};
	var root_2$2 = from_html(`<a class="svelte-swtc1e"> </a>`);
	var root_3$1 = from_html(`<span class="error svelte-swtc1e">null</span>`);
	var root_5$1 = from_html(`<span class="error svelte-swtc1e"> </span>`);
	var root_4$1 = from_html(` <!>`, 1);
	var root_1$4 = from_html(`<p class="svelte-swtc1e"><strong> </strong>: <!></p>`);
	var root_6$1 = from_svg(`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="svelte-swtc1e"><path d="M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1a1 1 0 0 1-1 1a1 1 0 0 1-1-1a1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2" class="svelte-swtc1e"></path></svg>`);
	var root$1 = from_html(`<div class="debug svelte-swtc1e"><!> <!> <!> <!> <div class="copy svelte-swtc1e"><!></div></div>`);
	function Debug($$anchor, $$props) {
		push($$props, true);
		let data = user_derived(() => store.upgradeImgData?.[$$props.img.id] || {});
		async function copyToClipboard(data) {
			try {
				const dataWithoutId = Object.fromEntries(Object.entries(data).filter(([key]) => key !== "id"));
				await navigator.clipboard.writeText(JSON.stringify(dataWithoutId, null, 2));
			} catch (err) {
				console.error("Failed to copy debug:", err);
			}
		}
		var div = root$1();
		var node_2 = child(div);
		Item(node_2, () => "status", () => get(data).status, () => get(data).error);
		var node_3 = sibling(node_2, 2);
		Item(node_3, () => "href", () => $$props.img.href);
		var node_4 = sibling(node_3, 2);
		Item(node_4, () => "src", () => $$props.img.src);
		var node_5 = sibling(node_4, 2);
		Item(node_5, () => "resolved", () => get(data).resolved);
		var div_1 = sibling(node_5, 2);
		Checkmark(child(div_1), {
			onclick: () => copyToClipboard({
				id: $$props.img.id,
				href: $$props.img.href,
				src: $$props.img.src,
				status: get(data).status,
				resolved: get(data).resolved,
				error: get(data).error
			}),
			title: "Copy to clipboard",
			children: ($$anchor, $$slotProps) => {
				append($$anchor, root_6$1());
			},
			$$slots: { default: true }
		});
		reset(div_1);
		reset(div);
		transition(3, div, () => slide, () => store.transition);
		append($$anchor, div);
		pop();
	}
	var root_1$3 = from_html(`<div class="slider svelte-1bzlgy6"><input type="range" min="1" max="5" step="1" class="svelte-1bzlgy6"/> <span class="value svelte-1bzlgy6" title="Max columns"><span class="text svelte-1bzlgy6"> </span></span></div>`);
	var root = from_html(`<div role="img" class="image-columns svelte-1bzlgy6"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="svelte-1bzlgy6"><path d="M22 9.999V20a1 1 0 0 1-1 1h-8V9.999zm-11 6V21H3a1 1 0 0 1-1-1v-4.001zM11 3v10.999H2V4a1 1 0 0 1 1-1zm10 0a1 1 0 0 1 1 1v3.999h-9V3z"></path></svg> <!></div>`);
	function Columns($$anchor, $$props) {
		push($$props, true);
		let open = state$1(false);
		function onpointerenter() {
			set(open, true);
		}
		function onpointerleave() {
			set(open, false);
		}
		function onchange() {
			saveColumnCount(store.columnCount);
		}
		var div = root();
		var node = sibling(child(div), 2);
		var consequent = ($$anchor) => {
			const opts = user_derived(() => ({
				...store.transition,
				axis: "x"
			}));
			var div_1 = root_1$3();
			var input = child(div_1);
			remove_input_defaults(input);
			var span = sibling(input, 2);
			var span_1 = child(span);
			var text = child(span_1, true);
			reset(span_1);
			reset(span);
			reset(div_1);
			template_effect(() => set_text(text, store.columnCount));
			delegated("change", input, onchange);
			bind_value(input, () => store.columnCount, ($$value) => store.columnCount = $$value);
			transition(3, div_1, () => slideFade, () => get(opts));
			append($$anchor, div_1);
		};
		if_block(node, ($$render) => {
			if (get(open)) $$render(consequent);
		});
		reset(div);
		event("pointerenter", div, onpointerenter);
		event("pointerleave", div, onpointerleave);
		append($$anchor, div);
		pop();
	}
	delegate(["change"]);
	var root_2$1 = from_html(`<div class="container svelte-27jg01"><!> <a target="_blank"><img/> <!></a></div>`);
	var root_5 = from_html(`<div id="x-images"><!> <!></div>`);
	function Images_1($$anchor, $$props) {
		push($$props, true);
		const Images = ($$anchor, images = noop) => {
			var fragment = comment();
			each(first_child(fragment), 19, images, (img) => img.id, ($$anchor, img, i) => {
				const gif = user_derived(() => get(img)?.src?.toLowerCase()?.includes(".gif"));
				const loading = user_derived(() => get(img)?.href ? "eager" : "lazy");
				var div = root_2$1();
				let styles;
				var node_1 = child(div);
				var consequent = ($$anchor) => {
					Debug($$anchor, { get img() {
						return get(img);
					} });
				};
				if_block(node_1, ($$render) => {
					if (get(debugImgs)) $$render(consequent);
				});
				var a = sibling(node_1, 2);
				let classes;
				var img_1 = child(a);
				let classes_1;
				bind_this(img_1, ($$value, i) => store.imgRefs[i] = $$value, (i) => store?.imgRefs?.[i], () => [get(i)]);
				var node_2 = sibling(img_1, 2);
				var consequent_1 = ($$anchor) => {
					const statusLoading = user_derived(() => store.upgradeImgData?.[get(img).id]?.status === "loading");
					{
						let $0 = user_derived(() => get(upgradeImages) && get(statusLoading));
						Loader($$anchor, { get loading() {
							return get($0);
						} });
					}
				};
				if_block(node_2, ($$render) => {
					if (!get(gif)) $$render(consequent_1);
				});
				reset(a);
				reset(div);
				template_effect(($0) => {
					set_attribute(div, "data-id", get(img).id);
					styles = set_style(div, "", styles, $0);
					set_attribute(a, "href", get(img)?.href);
					classes = set_class(a, 1, "svelte-27jg01", null, classes, { gif: get(gif) });
					set_attribute(img_1, "loading", get(loading));
					set_attribute(img_1, "id", get(img).id);
					set_attribute(img_1, "src", get(img)?.src);
					set_attribute(img_1, "alt", get(img)?.src);
					classes_1 = set_class(img_1, 1, "svelte-27jg01", null, classes_1, {
						incognito: get(incognito),
						gif: get(gif)
					});
				}, [() => ({ order: handleOrder(get(i)) })]);
				event("error", img_1, onerror);
				replay_events(img_1);
				append($$anchor, div);
			});
			append($$anchor, fragment);
		};
		let clicked = state$1(false);
		let resized = state$1(false);
		let containerWidth = state$1(0);
		let upgradeImages = user_derived(() => getSettings("upgradeImages"));
		let incognito = user_derived(() => getSettings("incognito"));
		let lastImageFirst = user_derived(() => getSettings("lastImageFirst"));
		let debugImgs = user_derived(() => getSettings("debugImgs"));
		function onerror(event) {
			const img = event.currentTarget;
			img.dataset["broken"] = "true";
		}
		function handleOrder(index) {
			if (data.images && get(lastImageFirst)) {
				if (index === data.images.length - 1) return -1;
			}
		}
		user_effect(() => {
			if (get(upgradeImages) && store.imgRefs.length) observeImg(store.imgRefs);
			return () => observer.disconnect();
		});
		let images = user_derived(() => {
			const images = data.images || [];
			if (!get(lastImageFirst) || images.length <= 1) return images;
			const reordered = images.slice();
			reordered.unshift(reordered.pop());
			return reordered;
		});
		var fragment_3 = comment();
		var node_3 = first_child(fragment_3);
		var consequent_2 = ($$anchor) => {
			var div_1 = root_5();
			let classes_2;
			var node_4 = child(div_1);
			Columns(node_4, {});
			Resize(sibling(node_4, 2), {
				get containerWidth() {
					return get(containerWidth);
				},
				get clicked() {
					return get(clicked);
				},
				set clicked($$value) {
					set(clicked, $$value, true);
				},
				get resized() {
					return get(resized);
				},
				set resized($$value) {
					set(resized, $$value, true);
				},
				children: ($$anchor, $$slotProps) => {
					Images($$anchor, () => get(images));
				},
				$$slots: { default: true }
			});
			reset(div_1);
			bind_this(div_1, ($$value) => store.ultraImages = $$value, () => store?.ultraImages);
			template_effect(() => classes_2 = set_class(div_1, 1, "section svelte-27jg01", null, classes_2, { dragging: get(clicked) && get(resized) }));
			bind_element_size(div_1, "offsetWidth", ($$value) => set(containerWidth, $$value));
			append($$anchor, div_1);
		};
		if_block(node_3, ($$render) => {
			if (data.images && data.images.length) $$render(consequent_2);
		});
		append($$anchor, fragment_3);
		pop();
	}
	var Incognito = ($$anchor) => {
		var div = root_1$2();
		var a = sibling(child(div));
		set_style(a, "", {}, { cursor: "pointer" });
		reset(div);
		delegated("click", a, (event) => {
			event.preventDefault();
			updateOption("incognito", false);
		});
		append($$anchor, div);
	};
	var Forumline = ($$anchor, forumline = noop) => {
		const infoHeader = user_derived(() => forumline()?.querySelector("th")?.textContent);
		const infoBody = user_derived(() => forumline()?.querySelector("td")?.innerHTML);
		const errorMessages = user_derived(() => ({
			"Тема находится в мусорке": "The topic is in the trash",
			"Тема не найдена": "Topic not found",
			"Раздача ожидает проверки": "Distribution is awaiting moderator approval<br /><br />Viewing is currently unavailable"
		}));
		const currentError = user_derived(() => Object.keys(get(errorMessages)).find((key) => forumline()?.textContent?.includes(key)));
		var div_1 = root_2();
		var node = child(div_1);
		var consequent = ($$anchor) => {
			var fragment = root_3();
			var p = sibling(first_child(fragment), 4);
			set_style(p, "", {}, { "text-align": "center" });
			html(p, () => get(errorMessages)[get(currentError)], true);
			reset(p);
			next(4);
			append($$anchor, fragment);
		};
		var consequent_1 = ($$anchor) => {
			var fragment_1 = root_4();
			var h3 = first_child(fragment_1);
			var text = child(h3, true);
			reset(h3);
			html(sibling(h3, 2), () => get(infoBody));
			template_effect(() => set_text(text, get(infoHeader)));
			append($$anchor, fragment_1);
		};
		var alternate = ($$anchor) => {
			var fragment_2 = comment();
			html(first_child(fragment_2), () => forumline()?.innerHTML);
			append($$anchor, fragment_2);
		};
		if_block(node, ($$render) => {
			if (get(currentError)) $$render(consequent);
			else if (get(infoHeader) && get(infoBody)) $$render(consequent_1, 1);
			else $$render(alternate, -1);
		});
		reset(div_1);
		append($$anchor, div_1);
	};
	var Avatar = ($$anchor, avatar = noop, nick = noop, link = noop) => {
		var a_1 = root_6();
		var node_3 = child(a_1);
		var consequent_2 = ($$anchor) => {
			var img = root_7();
			template_effect(() => {
				set_attribute(img, "src", avatar());
				set_attribute(img, "alt", nick());
			});
			append($$anchor, img);
		};
		var alternate_1 = ($$anchor) => {
			append($$anchor, root_8());
		};
		if_block(node_3, ($$render) => {
			if (avatar()) $$render(consequent_2);
			else $$render(alternate_1, -1);
		});
		reset(a_1);
		template_effect(() => set_attribute(a_1, "href", link()));
		append($$anchor, a_1);
	};
	var Nick = ($$anchor, nick = noop, link = noop) => {
		var fragment_3 = comment();
		var node_4 = first_child(fragment_3);
		var consequent_4 = ($$anchor) => {
			const content = user_derived(() => nick() === "Гость" ? "Guest" : nick());
			var span = root_10();
			var node_5 = child(span);
			var consequent_3 = ($$anchor) => {
				var a_2 = root_11();
				var text_1 = child(a_2, true);
				reset(a_2);
				template_effect(() => {
					set_attribute(a_2, "href", link());
					set_text(text_1, get(content));
				});
				append($$anchor, a_2);
			};
			var alternate_2 = ($$anchor) => {
				var text_2 = text();
				template_effect(() => set_text(text_2, get(content)));
				append($$anchor, text_2);
			};
			if_block(node_5, ($$render) => {
				if (link()) $$render(consequent_3);
				else $$render(alternate_2, -1);
			});
			reset(span);
			append($$anchor, span);
		};
		if_block(node_4, ($$render) => {
			if (nick()) $$render(consequent_4);
		});
		append($$anchor, fragment_3);
	};
	var root_1$2 = from_html(`<div>Post not rendered... <a href="#incognito" class="svelte-wfy26x">turn off incognito</a></div>`);
	var root_3 = from_html(`<h3>Information</h3> <br/> <p></p> <br/> <a href="/forum/index.php" class="svelte-wfy26x">Return to home page</a>`, 1);
	var root_4 = from_html(`<h3> </h3> <!>`, 1);
	var root_2 = from_html(`<div class="forumline svelte-wfy26x"><!></div>`);
	var root_7 = from_html(`<img class="svelte-wfy26x"/>`);
	var root_8 = from_svg(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="svelte-wfy26x"><path fill="currentcolor" fill-rule="evenodd" d="M8 7a4 4 0 1 1 8 0a4 4 0 0 1-8 0m0 6a5 5 0 0 0-5 5a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3a5 5 0 0 0-5-5z" clip-rule="evenodd"></path></svg>`);
	var root_6 = from_html(`<a class="no-avatar svelte-wfy26x"><!></a>`);
	var root_11 = from_html(`<a class="svelte-wfy26x"> </a>`);
	var root_10 = from_html(`<span class="nick svelte-wfy26x"><!></span>`);
	var root_14 = from_html(`<button class="date svelte-wfy26x"><!></button>`);
	var root_21 = from_html(`<div class="post svelte-wfy26x"><div class="avatar svelte-wfy26x"><!></div> <div class="content svelte-wfy26x"><div class="header svelte-wfy26x"><!> <!></div> <div class="message svelte-wfy26x"></div></div></div>`);
	var root_18 = from_html(`<div id="x-post"><!></div>`);
	function Post($$anchor, $$props) {
		push($$props, true);
		const Date = ($$anchor, date = noop, i = noop) => {
			var fragment_5 = comment();
			var node_6 = first_child(fragment_5);
			var consequent_6 = ($$anchor) => {
				const paredDate = user_derived(() => handleDate(date()));
				var button = root_14();
				var node_7 = child(button);
				var consequent_5 = ($$anchor) => {
					var text_3 = text();
					template_effect(($0) => set_text(text_3, $0), [() => get(paredDate)?.toLocaleString()]);
					append($$anchor, text_3);
				};
				var alternate_3 = ($$anchor) => {
					var text_4 = text();
					template_effect(($0) => set_text(text_4, $0), [() => handleRelativeDate(get(paredDate))]);
					append($$anchor, text_4);
				};
				if_block(node_7, ($$render) => {
					if (showFullDate[i()]) $$render(consequent_5);
					else $$render(alternate_3, -1);
				});
				reset(button);
				delegated("click", button, () => toggleFullDate(i()));
				append($$anchor, button);
			};
			if_block(node_6, ($$render) => {
				if (date()) $$render(consequent_6);
			});
			append($$anchor, fragment_5);
		};
		let incognito = user_derived(() => getSettings("incognito"));
		let showFullDate = proxy({});
		function toggleFullDate(index) {
			showFullDate[index] = !showFullDate[index];
		}
		function insertPost(message) {
			return (element) => {
				element.appendChild(message);
				return () => message.remove();
			};
		}
		var fragment_8 = comment();
		var node_8 = first_child(fragment_8);
		var consequent_7 = ($$anchor) => {
			Incognito($$anchor);
		};
		var alternate_4 = ($$anchor) => {
			var div_2 = root_18();
			let classes;
			var node_9 = child(div_2);
			var consequent_8 = ($$anchor) => {
				Forumline($$anchor, () => data.forumline);
			};
			var consequent_9 = ($$anchor) => {
				var fragment_11 = comment();
				each(first_child(fragment_11), 17, () => data.posts, index, ($$anchor, $$item, i) => {
					let nick = () => get($$item).nick;
					let link = () => get($$item).link;
					let avatar = () => get($$item).avatar;
					let date = () => get($$item).date;
					let message = () => get($$item).message;
					var div_3 = root_21();
					var div_4 = child(div_3);
					Avatar(child(div_4), avatar, nick, link);
					reset(div_4);
					var div_5 = sibling(div_4, 2);
					var div_6 = child(div_5);
					var node_12 = child(div_6);
					Nick(node_12, nick, link);
					Date(sibling(node_12, 2), date, () => i);
					reset(div_6);
					attach(sibling(div_6, 2), () => insertPost(message()));
					reset(div_5);
					reset(div_3);
					append($$anchor, div_3);
				});
				append($$anchor, fragment_11);
			};
			if_block(node_9, ($$render) => {
				if (data.forumline) $$render(consequent_8);
				else if (data.posts && data.posts?.length) $$render(consequent_9, 1);
			});
			reset(div_2);
			bind_this(div_2, ($$value) => store.ultraPost = $$value, () => store?.ultraPost);
			template_effect(() => classes = set_class(div_2, 1, "svelte-wfy26x", null, classes, { section: data.forumline || data.posts?.length }));
			append($$anchor, div_2);
		};
		if_block(node_8, ($$render) => {
			if (get(incognito)) $$render(consequent_7);
			else $$render(alternate_4, -1);
		});
		append($$anchor, fragment_8);
		pop();
	}
	delegate(["click"]);
	var root_1$1 = from_html(`<div id="ultra-pagination" class="svelte-dlb7of"><!></div>`);
	function Pagination($$anchor, $$props) {
		push($$props, true);
		const parser = new DOMParser();
		const translations = {
			Страница: "Page",
			Страницы: "Pages",
			из: "of",
			"Пред.": "Prev",
			"След.": "Next"
		};
		const regex = /Страница|Страницы|из|Пред\.|След\./g;
		let content = user_derived(() => {
			if (!data.pagination?.innerHTML) return "";
			const doc = parser.parseFromString(data.pagination.innerHTML, "text/html");
			const pageSelect = doc.querySelector("a.menu-root");
			if (pageSelect) pageSelect.replaceWith(doc.createTextNode("Pages"));
			return doc.body.innerHTML.replace(regex, (match) => translations[match] ?? match).replace(/Pages\s+:/, "Pages:");
		});
		var fragment = comment();
		var node = first_child(fragment);
		var consequent_1 = ($$anchor) => {
			var div = root_1$1();
			var node_1 = child(div);
			var consequent = ($$anchor) => {
				var fragment_1 = comment();
				html(first_child(fragment_1), () => get(content));
				append($$anchor, fragment_1);
			};
			if_block(node_1, ($$render) => {
				if (data.pagination) $$render(consequent);
			});
			reset(div);
			append($$anchor, div);
		};
		if_block(node, ($$render) => {
			if (data?.pagination) $$render(consequent_1);
		});
		append($$anchor, fragment);
		pop();
	}
	var root_1 = from_html(`<!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!>`, 1);
	function App($$anchor, $$props) {
		push($$props, true);
		let app = prop($$props, "app", 7);
		let firstPage = state$1(true);
		if (document.readyState === "loading") on(document, "DOMContentLoaded", parseDOM, { once: true });
		else parseDOM();
		function parseDOM() {
			if (forumDisabled(app())) return;
			if (Object.keys(data).length === 0) {
				Object.assign(data, handleData());
				store.showSettings = loadShowSettings();
				store.options = loadOptions();
				store.performerLinks = loadPerformerLinks();
				store.resizeWidth = loadResize();
				store.columnCount = loadColumnCount();
				const startParam = new URLSearchParams(location.search).get("start");
				set(firstPage, startParam === null || Number(startParam) === 0, true);
				setTimeout(() => {
					data.posts = handlePosts(document.querySelectorAll("#topic_main div.post-user-message"));
					Array.from(document.body.children).forEach((child) => {
						if (child !== app()) child.remove();
					});
					app().style.height = "auto";
				}, 0);
			}
		}
		user_effect(() => {
			const darkMode = Boolean(data.theme?.darkmode);
			document.documentElement.dataset["theme"] = darkMode ? "dark" : "light";
			sessionStorage.setItem("dark-mode", darkMode.toString());
		});
		var fragment = comment();
		var node = first_child(fragment);
		var consequent_1 = ($$anchor) => {
			var fragment_1 = root_1();
			var node_1 = first_child(fragment_1);
			Events(node_1, {});
			var node_2 = sibling(node_1, 2);
			Header(node_2, {});
			var node_3 = sibling(node_2, 2);
			Settings(node_3, {});
			var node_4 = sibling(node_3, 2);
			Float(node_4, {});
			var node_5 = sibling(node_4, 2);
			Dropdown$1(node_5, {});
			var node_6 = sibling(node_5, 2);
			Title(node_6, {});
			var node_7 = sibling(node_6, 2);
			var consequent = ($$anchor) => {
				Stats($$anchor, {});
			};
			var alternate = ($$anchor) => {
				Pagination($$anchor, {});
			};
			if_block(node_7, ($$render) => {
				if (get(firstPage)) $$render(consequent);
				else $$render(alternate, -1);
			});
			var node_8 = sibling(node_7, 2);
			Tags(node_8, {});
			var node_9 = sibling(node_8, 2);
			FileList(node_9, {});
			var node_10 = sibling(node_9, 2);
			Images_1(node_10, {});
			var node_11 = sibling(node_10, 2);
			Post(node_11, {});
			Pagination(sibling(node_11, 2), {});
			append($$anchor, fragment_1);
		};
		var d = user_derived(() => Object.keys(data).length !== 0);
		if_block(node, ($$render) => {
			if (get(d)) $$render(consequent_1);
		});
		append($$anchor, fragment);
		pop();
	}
	_css("html{--border-radius-large:8px;--border-radius-small:4px;--tag-color:#fff;--content-margin:1rem;--highlighted:#b46300}html[data-theme=dark]{--main-bg:#121212;--post-bg:#282828;--post-date-color:#87b3df;--post-border-color:#555;--post-odd-bg:#373737;--link-color:#9cceff;--tag-bg:#323232;--search-color:#fff;--overlay-bg:#202020bf;--input-bg:#1c1b1b;--incognito-filter:brightness(0);--button-color:#284a86;--seed-color:#33b933;--leech-color:#ff5454}html[data-theme=light]{--main-bg:#fff;--post-bg:#efefef;--post-date-color:#345da4;--post-border-color:#cacaca;--post-odd-bg:#e3e3e3;--link-color:#345da4;--tag-bg:var(--link-color);--search-color:#000;--overlay-bg:#ffffffbf;--input-bg:#fafafa;--incognito-filter:brightness(0) invert(1);--button-color:#4677cc;--seed-color:#060;--leech-color:#900}#ultra{background-color:var(--main-bg);flex-direction:column;padding:1.5rem 2.5rem;font-family:system-ui;display:flex}#ultra .section{background-color:var(--post-bg);border-radius:var(--border-radius-large);border:1px solid var(--post-border-color);overflow:hidden}#ultra img{filter:unset}body{min-width:unset!important}");
	if (userscriptDisabled()) if (document.readyState === "loading") on(document, "DOMContentLoaded", appendUserscriptEnableButton, { once: true });
	else appendUserscriptEnableButton();
	else {
		const cachedTheme = sessionStorage.getItem("dark-mode");
		if (cachedTheme !== null) document.documentElement.dataset["theme"] = cachedTheme === "true" ? "dark" : "light";
		let CSP = false;
		if (document.head) CSP = prependContentSecurityPolicy();
		if (document.body) {
			mountApp();
			const body_container = document.getElementById("body_container");
			if (body_container) body_container.style.display = "none";
		} else {
			const targetNode = document.documentElement;
			const config = {
				childList: true,
				subtree: true
			};
			const callback = (mutationList, observer) => {
				for (const mutation of mutationList) if (mutation.type === "childList") for (const node of mutation.addedNodes) {
					if (node.nodeName === "HEAD" && !CSP) CSP = prependContentSecurityPolicy();
					if (node.nodeName === "BODY") mountApp();
					if (node instanceof HTMLElement && node.id === "body_container") {
						node.style.display = "none";
						observer.disconnect();
					}
				}
			};
			new MutationObserver(callback).observe(targetNode, config);
		}
		function mountApp() {
			const app = document.createElement("div");
			app.id = "ultra";
			app.style.height = "100vh";
			document.body.prepend(app);
			mount(App, {
				target: app,
				props: { app }
			});
		}
	}
})();