@mmstack/primitives 19.2.3 → 20.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"mmstack-primitives.mjs","sources":["../../../../packages/primitives/src/lib/to-writable.ts","../../../../packages/primitives/src/lib/debounced.ts","../../../../packages/primitives/src/lib/derived.ts","../../../../packages/primitives/src/lib/element-visibility.ts","../../../../packages/primitives/src/lib/map-array.ts","../../../../packages/primitives/src/lib/mutable.ts","../../../../packages/primitives/src/lib/sensors/media-query.ts","../../../../packages/primitives/src/lib/throttled.ts","../../../../packages/primitives/src/lib/sensors/mouse-position.ts","../../../../packages/primitives/src/lib/sensors/network-status.ts","../../../../packages/primitives/src/lib/sensors/page-visibility.ts","../../../../packages/primitives/src/lib/sensors/scroll-position.ts","../../../../packages/primitives/src/lib/sensors/window-size.ts","../../../../packages/primitives/src/lib/sensors/sensor.ts","../../../../packages/primitives/src/lib/stored.ts","../../../../packages/primitives/src/lib/until.ts","../../../../packages/primitives/src/lib/get-signal-equality.ts","../../../../packages/primitives/src/lib/with-history.ts","../../../../packages/primitives/src/mmstack-primitives.ts"],"sourcesContent":["import { Signal, untracked, WritableSignal } from '@angular/core';\r\n\r\n/**\r\n * Converts a read-only `Signal` into a `WritableSignal` by providing custom `set` and, optionally, `update` functions.\r\n * This can be useful for creating controlled write access to a signal that is otherwise read-only.\r\n *\r\n * @typeParam T - The type of value held by the signal.\r\n *\r\n * @param signal - The read-only `Signal` to be made writable.\r\n * @param set - A function that will be used to set the signal's value. This function *must* handle\r\n * the actual update mechanism (e.g., updating a backing store, emitting an event, etc.).\r\n * @param update - (Optional) A function that will be used to update the signal's value based on its\r\n * previous value. If not provided, a default `update` implementation is used that\r\n * calls the provided `set` function with the result of the updater function. The\r\n * default implementation uses `untracked` to avoid creating unnecessary dependencies\r\n * within the updater function.\r\n *\r\n * @returns A `WritableSignal` that uses the provided `set` and `update` functions. The `asReadonly`\r\n * method of the returned signal will still return the original read-only signal.\r\n *\r\n * @example\r\n * // Basic usage: Making a read-only signal writable with a custom set function.\r\n * const originalValue = signal({a: 0});\r\n * const readOnlySignal = computed(() => originalValue().a);\r\n * const writableSignal = toWritable(readOnlySignal, (newValue) => {\r\n * originalValue.update((prev) => { ...prev, a: newValue });\r\n * });\r\n *\r\n * writableSignal.set(5); // sets value of originalValue.a to 5 & triggers all signals\r\n */\r\nexport function toWritable<T>(\r\n signal: Signal<T>,\r\n set: (value: T) => void,\r\n update?: (updater: (value: T) => T) => void,\r\n): WritableSignal<T> {\r\n const internal = signal as WritableSignal<T>;\r\n internal.asReadonly = () => signal;\r\n internal.set = set;\r\n internal.update = update ?? ((updater) => set(updater(untracked(internal))));\r\n\r\n return internal;\r\n}\r\n","import {\r\n computed,\r\n type CreateSignalOptions,\r\n DestroyRef,\r\n inject,\r\n type Signal,\r\n signal,\r\n untracked,\r\n type WritableSignal,\r\n} from '@angular/core';\r\nimport { toWritable } from './to-writable';\r\n\r\n/**\r\n * Options for creating a debounced writable signal.\r\n * Extends Angular's `CreateSignalOptions` with a debounce time setting.\r\n *\r\n * @template T The type of value held by the signal.\r\n */\r\nexport type CreateDebouncedOptions<T> = CreateSignalOptions<T> & {\r\n /**\r\n * The debounce delay in milliseconds. Specifies how long to wait after the\r\n * last `set` or `update` call before the debounced signal reflects the new value.\r\n */\r\n ms?: number;\r\n /**\r\n * Optional `DestroyRef` to clean up the debounce timer when the signal is destroyed.\r\n * If provided, the timer will be cleared when the signal is destroyed.\r\n * If the signal is called within a reactive context a DestroyRef is injected automatically.\r\n * If it is not provided or injected, the timer will not be cleared automatically...which is usually fine :)\r\n */\r\n destroyRef?: DestroyRef;\r\n};\r\n\r\n/**\r\n * A specialized `WritableSignal` whose publicly readable value updates are debounced.\r\n *\r\n * It provides access to the underlying, non-debounced signal via the `original` property.\r\n *\r\n * @template T The type of value held by the signal.\r\n */\r\nexport type DebouncedSignal<T> = WritableSignal<T> & {\r\n /**\r\n * A reference to the original, inner `WritableSignal`.\r\n * This signal's value is updated *immediately* upon calls to `set` or `update`\r\n * on the parent `DebouncedSignal`. Useful for accessing the latest value\r\n * without the debounce delay.\r\n */\r\n original: Signal<T>;\r\n};\r\n\r\n/**\r\n * A convenience function that creates and debounces a new `WritableSignal` in one step.\r\n *\r\n * @see {debounce} for the core implementation details.\r\n *\r\n * @template T The type of value the signal holds.\r\n * @param initial The initial value of the signal.\r\n * @param opt Options for signal creation, including debounce time `ms`.\r\n * @returns A `DebouncedSignal<T>` instance.\r\n *\r\n * @example\r\n * // The existing example remains perfect here.\r\n * const query = debounced('', { ms: 500 });\r\n * effect(() => console.log('Debounced Query:', query()));\r\n * query.set('abc');\r\n * // ...500ms later...\r\n * // Output: Debounced Query: abc\r\n */\r\nexport function debounced<T>(\r\n initial: T,\r\n opt?: CreateDebouncedOptions<T>,\r\n): DebouncedSignal<T> {\r\n return debounce(signal(initial, opt), opt);\r\n}\r\n\r\n/**\r\n * Wraps an existing `WritableSignal` to create a new one whose readable value is debounced.\r\n *\r\n * This implementation avoids using `effect` by pairing a trigger signal with an `untracked`\r\n * read of the source signal to control when the debounced value is re-evaluated.\r\n *\r\n * @template T The type of value the signal holds.\r\n * @param source The source `WritableSignal` to wrap. Writes are applied to this signal immediately.\r\n * @param opt Options for debouncing, including debounce time `ms` and an optional `DestroyRef`.\r\n * @returns A new `DebouncedSignal<T>` whose read value is debounced. The `.original` property\r\n * of the returned signal is a reference back to the provided `source` signal.\r\n *\r\n * @example\r\n * ```ts\r\n * import { signal, effect } from '@angular/core';\r\n *\r\n * // 1. Create a standard source signal.\r\n * const sourceQuery = signal('');\r\n *\r\n * // 2. Create a debounced version of it.\r\n * const debouncedQuery = debounce(sourceQuery, { ms: 500 });\r\n *\r\n * // This effect tracks the original signal and runs immediately.\r\n * effect(() => {\r\n * console.log('Original Query:', debouncedQuery.original());\r\n * });\r\n *\r\n * // This effect tracks the debounced signal and runs after the delay.\r\n * effect(() => {\r\n * console.log('Debounced Query:', debouncedQuery());\r\n * });\r\n *\r\n * console.log('Setting query to \"a\"');\r\n * debouncedQuery.set('a');\r\n * // Output: Original Query: a\r\n *\r\n * // ...500ms later...\r\n * // Output: Debounced Query: a\r\n * ```\r\n */\r\nexport function debounce<T>(\r\n source: WritableSignal<T>,\r\n opt?: CreateDebouncedOptions<T>,\r\n): DebouncedSignal<T> {\r\n const ms = opt?.ms ?? 0;\r\n\r\n const trigger = signal(false);\r\n\r\n let timeout: ReturnType<typeof setTimeout> | undefined;\r\n\r\n try {\r\n const destroyRef =\r\n opt?.destroyRef ?? inject(DestroyRef, { optional: true });\r\n\r\n destroyRef?.onDestroy(() => {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = undefined;\r\n });\r\n } catch {\r\n // not in injection context & no destroyRef provided opting out of cleanup\r\n }\r\n\r\n const triggerFn = (afterClean: () => void) => {\r\n if (timeout) clearTimeout(timeout);\r\n afterClean();\r\n timeout = setTimeout(() => {\r\n trigger.update((c) => !c);\r\n }, ms);\r\n };\r\n\r\n const set = (value: T) => {\r\n triggerFn(() => source.set(value));\r\n };\r\n\r\n const update = (fn: (prev: T) => T) => {\r\n triggerFn(() => source.update(fn));\r\n };\r\n\r\n const writable = toWritable(\r\n computed(() => {\r\n trigger();\r\n return untracked(source);\r\n }, opt),\r\n set,\r\n update,\r\n ) as DebouncedSignal<T>;\r\n writable.original = source;\r\n\r\n return writable;\r\n}\r\n","import {\r\n computed,\r\n CreateSignalOptions,\r\n signal,\r\n untracked,\r\n type WritableSignal,\r\n} from '@angular/core';\r\nimport type { UnknownObject } from '@mmstack/object';\r\nimport { toWritable } from './to-writable';\r\n\r\n/**\r\n * Options for creating a derived signal using the full `derived` function signature.\r\n * @typeParam T - The type of the source signal's value (parent).\r\n * @typeParam U - The type of the derived signal's value (child).\r\n */\r\ntype CreateDerivedOptions<T, U> = CreateSignalOptions<U> & {\r\n /**\r\n * A function that extracts the derived value (`U`) from the source signal's value (`T`).\r\n */\r\n from: (v: T) => U;\r\n /**\r\n * A function that updates the source signal's value (`T`) when the derived signal's value (`U`) changes.\r\n * This establishes the two-way binding.\r\n */\r\n onChange: (newValue: U) => void;\r\n};\r\n\r\n/**\r\n * A `WritableSignal` that derives its value from another `WritableSignal` (the \"source\" signal).\r\n * It provides two-way binding: changes to the source signal update the derived signal, and\r\n * changes to the derived signal update the source signal.\r\n *\r\n * @typeParam T - The type of the source signal's value (parent).\r\n * @typeParam U - The type of the derived signal's value (child).\r\n */\r\nexport type DerivedSignal<T, U> = WritableSignal<U> & {\r\n /**\r\n * The function used to derive the derived signal's value from the source signal's value.\r\n * This is primarily for internal use and introspection.\r\n */\r\n from: (v: T) => U;\r\n};\r\n\r\n/**\r\n * Creates a `DerivedSignal` that derives its value from another `WritableSignal`.\r\n * This overload provides the most flexibility, allowing you to specify custom `from` and `onChange` functions.\r\n *\r\n * @typeParam T The type of the source signal's value.\r\n * @typeParam U The type of the derived signal's value.\r\n * @param source The source `WritableSignal`.\r\n * @param options An object containing the `from` and `onChange` functions, and optional signal options.\r\n * @returns A `DerivedSignal` instance.\r\n *\r\n * @example\r\n * ```ts\r\n * const user = signal({ name: 'John', age: 30 });\r\n * const name = derived(user, {\r\n * from: (u) => u.name,\r\n * onChange: (newName) => user.update((u) => ({ ...u, name: newName })),\r\n * });\r\n *\r\n * name.set('Jane'); // Updates the original signal\r\n * console.log(user().name); // Outputs: Jane\r\n * ```\r\n */\r\nexport function derived<T, U>(\r\n source: WritableSignal<T>,\r\n opt: CreateDerivedOptions<T, U>,\r\n): DerivedSignal<T, U>;\r\n\r\n/**\r\n * Creates a `DerivedSignal` that derives a property from an object held by the source signal.\r\n * This overload is a convenient shorthand for accessing object properties.\r\n *\r\n * @typeParam T The type of the source signal's value (must be an object).\r\n * @typeParam TKey The key of the property to derive.\r\n * @param source The source `WritableSignal` (holding an object).\r\n * @param key The key of the property to derive.\r\n * @param options Optional signal options for the derived signal.\r\n * @returns A `DerivedSignal` instance.\r\n *\r\n * @example\r\n * ```ts\r\n * const user = signal({ name: 'John', age: 30 });\r\n * const name = derived(user, 'name');\r\n *\r\n * console.log(name()); // Outputs: John\r\n *\r\n * // Update the derived signal, which also updates the source\r\n * name.set('Jane');\r\n *\r\n * console.log(user().name); // Outputs: Jane\r\n * ```\r\n */\r\nexport function derived<T extends UnknownObject, TKey extends keyof T>(\r\n source: WritableSignal<T>,\r\n key: TKey,\r\n opt?: CreateSignalOptions<T[TKey]>,\r\n): DerivedSignal<T, T[TKey]>;\r\n\r\n/**\r\n * Creates a `DerivedSignal` from an array, deriving an element by its index.\r\n * This overload is a convenient shorthand for accessing array elements.\r\n *\r\n * @typeParam T The type of the source signal's value (must be an array).\r\n * @param source The source `WritableSignal` (holding an array).\r\n * @param index The index of the element to derive.\r\n * @param options Optional signal options for the derived signal.\r\n * @returns A `DerivedSignal` instance.\r\n *\r\n * @example\r\n * ```ts\r\n * const numbers = signal([1, 2, 3]);\r\n * const secondNumber = derived(numbers, 1);\r\n *\r\n * console.log(secondNumber()); // Outputs: 2\r\n *\r\n * // Update the derived signal, which also updates the source\r\n * secondNumber.set(5);\r\n *\r\n * console.log(numbers()); // Outputs: [1, 5, 3]\r\n * ```\r\n */\r\nexport function derived<T extends any[]>(\r\n source: WritableSignal<T>,\r\n index: number,\r\n opt?: CreateSignalOptions<T[number]>,\r\n): DerivedSignal<T, T[number]>;\r\n\r\nexport function derived<T, U>(\r\n source: WritableSignal<T>,\r\n optOrKey: CreateDerivedOptions<T, U> | keyof T,\r\n opt?: CreateSignalOptions<U>,\r\n): DerivedSignal<T, U> {\r\n const isArray =\r\n Array.isArray(untracked(source)) && typeof optOrKey === 'number';\r\n\r\n const from =\r\n typeof optOrKey === 'object' ? optOrKey.from : (v: T) => v[optOrKey] as U;\r\n const onChange =\r\n typeof optOrKey === 'object'\r\n ? optOrKey.onChange\r\n : isArray\r\n ? (next: U) => {\r\n source.update((cur) => {\r\n const newArray = [...(cur as unknown as any[])];\r\n newArray[optOrKey] = next;\r\n return newArray as T;\r\n });\r\n }\r\n : (next: U) => {\r\n source.update((cur) => ({ ...cur, [optOrKey]: next }));\r\n };\r\n\r\n const rest = typeof optOrKey === 'object' ? optOrKey : opt;\r\n\r\n const sig = toWritable<U>(\r\n computed(() => from(source()), rest),\r\n (newVal) => onChange(newVal),\r\n ) as DerivedSignal<T, U>;\r\n\r\n sig.from = from;\r\n\r\n return sig;\r\n}\r\n\r\n/**\r\n * Creates a \"fake\" `DerivedSignal` from a simple value. This is useful for creating\r\n * `FormControlSignal` instances that are not directly derived from another signal.\r\n * The returned signal's `from` function will always return the initial value.\r\n *\r\n * @typeParam T - This type parameter is not used in the implementation but is kept for type compatibility with `DerivedSignal`.\r\n * @typeParam U - The type of the signal's value.\r\n * @param initial - The initial value of the signal.\r\n * @returns A `DerivedSignal` instance.\r\n * @internal\r\n */\r\nexport function toFakeDerivation<T, U>(initial: U): DerivedSignal<T, U> {\r\n const sig = signal(initial) as DerivedSignal<T, U>;\r\n sig.from = () => initial;\r\n\r\n return sig;\r\n}\r\n\r\n/**\r\n * Creates a \"fake\" `DerivedSignal` from an existing `WritableSignal`. This is useful\r\n * for treating a regular `WritableSignal` as a `DerivedSignal` without changing its behavior.\r\n * The returned signal's `from` function returns the current value of signal, using `untracked`.\r\n *\r\n * @typeParam T - This type parameter is not used in the implementation but is kept for type compatibility with `DerivedSignal`.\r\n * @typeParam U - The type of the signal's value.\r\n * @param initial - The existing `WritableSignal`.\r\n * @returns A `DerivedSignal` instance.\r\n * @internal\r\n */\r\nexport function toFakeSignalDerivation<T, U>(\r\n initial: WritableSignal<U>,\r\n): DerivedSignal<T, U> {\r\n const sig = initial as DerivedSignal<T, U>;\r\n sig.from = () => untracked(initial);\r\n return sig;\r\n}\r\n\r\n/**\r\n * Type guard function to check if a given `WritableSignal` is a `DerivedSignal`.\r\n *\r\n * @typeParam T - The type of the source signal's value (optional, defaults to `any`).\r\n * @typeParam U - The type of the derived signal's value (optional, defaults to `any`).\r\n * @param sig - The `WritableSignal` to check.\r\n * @returns `true` if the signal is a `DerivedSignal`, `false` otherwise.\r\n */\r\nexport function isDerivation<T, U>(\r\n sig: WritableSignal<U>,\r\n): sig is DerivedSignal<T, U> {\r\n return 'from' in sig;\r\n}\r\n","import { isPlatformServer } from '@angular/common';\nimport {\n computed,\n effect,\n ElementRef,\n inject,\n isSignal,\n PLATFORM_ID,\n signal,\n Signal,\n} from '@angular/core';\n\n/**\n * Options for configuring the `elementVisibility` sensor, extending\n * standard `IntersectionObserverInit` options.\n */\nexport type ElementVisibilityOptions = IntersectionObserverInit & {\n /** Optional debug name for the internal signal. */\n debugName?: string;\n};\n\nfunction observerSupported() {\n return typeof IntersectionObserver !== 'undefined';\n}\n\ntype InternalElementVisibilitySignal = Signal<\n IntersectionObserverEntry | undefined\n> & {\n visible: Signal<boolean>;\n};\n\nexport type ElementVisibilitySignal = Signal<\n IntersectionObserverEntry | undefined\n> & {\n readonly visible: Signal<boolean>;\n};\n\n/**\n * Creates a read-only signal that tracks the intersection status of a target DOM element\n * with the viewport or a specified root element, using the `IntersectionObserver` API.\n *\n * It can observe a static `ElementRef`/`Element` or a `Signal` that resolves to one,\n * allowing for dynamic targets.\n *\n * @param target The DOM element (or `ElementRef`, or a `Signal` resolving to one) to observe.\n * If the signal resolves to `null`, observation stops.\n * @param options Optional `IntersectionObserverInit` options (e.g., `root`, `rootMargin`, `threshold`)\n * and an optional `debugName`.\n * @returns A `Signal<IntersectionObserverEntry | undefined>`. It emits `undefined` initially,\n * on the server, or if the target is `null`. Otherwise, it emits the latest\n * `IntersectionObserverEntry`. Consumers can derive a boolean `isVisible` from\n * this entry's `isIntersecting` property.\n *\n * @example\n * ```ts\n * import { Component, effect, ElementRef, viewChild } from '@angular/core';\n * import { elementVisibility } from '@mmstack/primitives';\n * import { computed } from '@angular/core'; // For derived boolean\n *\n * @Component({\n * selector: 'app-lazy-image',\n * template: `\n * <div #imageContainer style=\"height: 200px; border: 1px dashed grey;\">\n * @if (isVisible()) {\n * <img src=\"your-image-url.jpg\" alt=\"Lazy loaded image\" />\n * <p>Image is VISIBLE!</p>\n * } @else {\n * <p>Scroll down to see the image...</p>\n * }\n * </div>\n * `\n * })\n * export class LazyImageComponent {\n * readonly imageContainer = viewChild.required<ElementRef<HTMLDivElement>>('imageContainer');\n *\n * // Observe the element, get the full IntersectionObserverEntry\n * readonly intersectionEntry = elementVisibility(this.imageContainer);\n *\n * // Derive a simple boolean for visibility\n * readonly isVisible = computed(() => this.intersectionEntry()?.isIntersecting ?? false);\n *\n * constructor() {\n * effect(() => {\n * console.log('Intersection Entry:', this.intersectionEntry());\n * console.log('Is Visible:', this.isVisible());\n * });\n * }\n * }\n * ```\n */\nexport function elementVisibility(\n target:\n | ElementRef<Element>\n | Element\n | Signal<ElementRef<Element> | Element | null> = inject(ElementRef),\n opt?: ElementVisibilityOptions,\n): ElementVisibilitySignal {\n if (isPlatformServer(inject(PLATFORM_ID)) || !observerSupported()) {\n const base = computed(() => undefined, {\n debugName: opt?.debugName,\n }) as InternalElementVisibilitySignal;\n base.visible = computed(() => false);\n return base;\n }\n\n const state = signal<IntersectionObserverEntry | undefined>(undefined, {\n debugName: opt?.debugName,\n equal: (a, b) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.target === b.target &&\n a.isIntersecting === b.isIntersecting &&\n a.intersectionRatio === b.intersectionRatio &&\n a.boundingClientRect.top === b.boundingClientRect.top &&\n a.boundingClientRect.left === b.boundingClientRect.left &&\n a.boundingClientRect.width === b.boundingClientRect.width &&\n a.boundingClientRect.height === b.boundingClientRect.height\n );\n },\n });\n\n const targetSignal = isSignal(target) ? target : computed(() => target);\n\n effect((cleanup) => {\n const el = targetSignal();\n\n if (!el) return state.set(undefined);\n\n let observer: IntersectionObserver | null = null;\n observer = new IntersectionObserver(([entry]) => state.set(entry), opt);\n observer.observe(el instanceof ElementRef ? el.nativeElement : el);\n\n cleanup(() => {\n observer?.disconnect();\n });\n });\n\n const base = state.asReadonly() as InternalElementVisibilitySignal;\n base.visible = computed(() => {\n const s = state();\n if (!s) return false;\n return s.isIntersecting;\n });\n return base;\n}\n","import {\r\n computed,\r\n type CreateSignalOptions,\r\n isSignal,\r\n linkedSignal,\r\n type Signal,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Reactively maps items from a source array (or signal of an array) using a provided mapping function.\r\n *\r\n * This function serves a similar purpose to SolidJS's `mapArray` by providing stability\r\n * for mapped items. It receives a source function returning an array (or a Signal<T[]>)\r\n * and a mapping function.\r\n *\r\n * For each item in the source array, it creates a stable `computed` signal representing\r\n * that item's value at its current index. This stable signal (`Signal<T>`) is passed\r\n * to the mapping function. This ensures that downstream computations or components\r\n * depending on the mapped result only re-render or re-calculate for the specific items\r\n * that have changed, or when items are added/removed, rather than re-evaluating everything\r\n * when the source array reference changes but items remain the same.\r\n *\r\n * It efficiently handles changes in the source array's length by reusing existing mapped\r\n * results when possible, slicing when the array shrinks, and appending new mapped items\r\n * when it grows.\r\n *\r\n * @template T The type of items in the source array.\r\n * @template U The type of items in the resulting mapped array.\r\n *\r\n * @param source A function returning the source array `T[]`, or a `Signal<T[]>` itself.\r\n * The `mapArray` function will reactively update based on changes to this source.\r\n * @param map The mapping function. It is called for each item in the source array.\r\n * It receives:\r\n * - `value`: A stable `Signal<T>` representing the item at the current index.\r\n * Use this signal within your mapping logic if you need reactivity\r\n * tied to the specific item's value changes.\r\n * - `index`: The number index of the item in the array.\r\n * It should return the mapped value `U`.\r\n * @param [opt] Optional `CreateSignalOptions<T>`. These options are passed directly\r\n * to the `computed` signal created for each individual item (`Signal<T>`).\r\n * This allows specifying options like a custom `equal` function for item comparison.\r\n *\r\n * @returns A `Signal<U[]>` containing the mapped array. This signal updates whenever\r\n * the source array changes (either length or the values of its items).\r\n *\r\n * @example\r\n * ```ts\r\n * const sourceItems = signal([\r\n * { id: 1, name: 'Apple' },\r\n * { id: 2, name: 'Banana' }\r\n * ]);\r\n *\r\n * const mappedItems = mapArray(\r\n * sourceItems,\r\n * (itemSignal, index) => {\r\n * // itemSignal is stable for a given item based on its index.\r\n * // We create a computed here to react to changes in the item's name.\r\n * return computed(() => `${index}: ${itemSignal().name.toUpperCase()}`);\r\n * },\r\n * // Example optional options (e.g., custom equality for item signals)\r\n * { equal: (a, b) => a.id === b.id && a.name === b.name }\r\n * );\r\n * ```\r\n * @remarks\r\n * This function achieves its high performance by leveraging the new `linkedSignal`\r\n * API from Angular, which allows for efficient memoization and reuse of array items.\r\n */\r\nexport function mapArray<T, U>(\r\n source: () => T[],\r\n map: (value: Signal<T>, index: number) => U,\r\n opt?: CreateSignalOptions<T>,\r\n): Signal<U[]> {\r\n const data = isSignal(source) ? source : computed(source);\r\n const len = computed(() => data().length);\r\n\r\n return linkedSignal<number, U[]>({\r\n source: () => len(),\r\n computation: (len, prev) => {\r\n if (!prev)\r\n return Array.from({ length: len }, (_, i) =>\r\n map(\r\n computed(() => source()[i], opt),\r\n i,\r\n ),\r\n );\r\n\r\n if (len === prev.value.length) return prev.value;\r\n\r\n if (len < prev.value.length) {\r\n return prev.value.slice(0, len);\r\n } else {\r\n const next = [...prev.value];\r\n for (let i = prev.value.length; i < len; i++) {\r\n next[i] = map(\r\n computed(() => source()[i], opt),\r\n i,\r\n );\r\n }\r\n return next;\r\n }\r\n },\r\n equal: (a, b) => a.length === b.length,\r\n });\r\n}\r\n","import {\r\n signal,\r\n type CreateSignalOptions,\r\n type ValueEqualityFn,\r\n type WritableSignal,\r\n} from '@angular/core';\r\n\r\nconst { is } = Object;\r\n\r\n/**\r\n * A `MutableSignal` is a special type of `WritableSignal` that allows for in-place mutation of its value.\r\n * In addition to the standard `set` and `update` methods, it provides a `mutate` method. This is useful\r\n * for performance optimization when dealing with complex objects or arrays, as it avoids unnecessary\r\n * object copying.\r\n *\r\n * @typeParam T - The type of value held by the signal.\r\n */\r\nexport type MutableSignal<T> = WritableSignal<T> & {\r\n /**\r\n * Mutates the signal's value in-place. This is similar to `update`, but it's optimized for\r\n * scenarios where you want to modify the existing object directly rather than creating a new one.\r\n *\r\n * @param updater - A function that takes the current value as input and modifies it directly.\r\n *\r\n * @example\r\n * const myArray = mutable([1, 2, 3]);\r\n * myArray.mutate((arr) => {\r\n * arr.push(4);\r\n * return arr;\r\n * }); // myArray() now returns [1, 2, 3, 4]\r\n */\r\n mutate: WritableSignal<T>['update'];\r\n\r\n /**\r\n * Mutates the signal's value in-place, similar to `mutate`, but with a void-returning value in updater\r\n * function. This further emphasizes that the mutation is happening inline, improving readability\r\n * in some cases.\r\n * @param updater - Function to change to the current value\r\n * @example\r\n * const myObject = mutable({ a: 1, b: 2 });\r\n * myObject.inline((obj) => (obj.a = 3)); // myObject() now returns { a: 3, b: 2 }\r\n */\r\n inline: (updater: (value: T) => void) => void;\r\n};\r\n\r\n/**\r\n * Creates a `MutableSignal`. This function overloads the standard `signal` function to provide\r\n * the additional `mutate` and `inline` methods.\r\n *\r\n * @typeParam T The type of value held by the signal.\r\n * @param initial The initial value of the signal.\r\n * @param options Optional signal options, including a custom `equal` function.\r\n * @returns A `MutableSignal` instance.\r\n *\r\n * ### Important Note on `computed` Signals\r\n *\r\n * When creating a `computed` signal that derives a non-primitive value (e.g., an object or array)\r\n * from a `mutable` signal, you **must** provide the `{ equal: false }` option to the `computed`\r\n * function.\r\n *\r\n * This is because a `.mutate()` call notifies its dependents that it has changed, but if the\r\n * reference to a derived object hasn't changed, the `computed` signal will not trigger its\r\n * own dependents by default.\r\n *\r\n * @example\r\n * ```ts\r\n * const state = mutable({ user: { name: 'John' }, lastUpdated: new Date() });\r\n *\r\n * // ✅ CORRECT: Deriving a primitive value works as expected.\r\n * const name = computed(() => state().user.name);\r\n *\r\n * // ❌ INCORRECT: This will not update reliably after the first change.\r\n * const userObject = computed(() => state().user);\r\n *\r\n * // ✅ CORRECT: For object derivations, `equal: false` is required.\r\n * const userObjectFixed = computed(() => state().user, { equal: false });\r\n *\r\n * // This mutation will now correctly trigger effects depending on `userObjectFixed`.\r\n * state.mutate(s => s.lastUpdated = new Date());\r\n * ```\r\n */\r\nexport function mutable<T>(): MutableSignal<T | undefined>;\r\nexport function mutable<T>(initial: T): MutableSignal<T>;\r\nexport function mutable<T>(\r\n initial: T,\r\n opt?: CreateSignalOptions<T>,\r\n): MutableSignal<T>;\r\n\r\nexport function mutable<T>(\r\n initial?: T,\r\n opt?: CreateSignalOptions<T>,\r\n): MutableSignal<T> {\r\n const baseEqual = opt?.equal ?? is;\r\n let trigger = false;\r\n\r\n const equal: ValueEqualityFn<T | undefined> = (a, b) => {\r\n if (trigger) return false;\r\n return baseEqual(a, b);\r\n };\r\n\r\n const sig = signal<T | undefined>(initial, {\r\n ...opt,\r\n equal,\r\n }) as MutableSignal<T>;\r\n\r\n const internalUpdate = sig.update;\r\n\r\n sig.mutate = (updater) => {\r\n trigger = true;\r\n internalUpdate(updater);\r\n trigger = false;\r\n };\r\n\r\n sig.inline = (updater) => {\r\n sig.mutate((prev) => {\r\n updater(prev);\r\n return prev;\r\n });\r\n };\r\n\r\n return sig;\r\n}\r\n\r\n/**\r\n * Type guard function to check if a given `WritableSignal` is a `MutableSignal`. This is useful\r\n * for situations where you need to conditionally use the `mutate` or `inline` methods.\r\n *\r\n * @typeParam T - The type of the signal's value (optional, defaults to `any`).\r\n * @param value - The `WritableSignal` to check.\r\n * @returns `true` if the signal is a `MutableSignal`, `false` otherwise.\r\n *\r\n * @example\r\n * const mySignal = signal(0);\r\n * const myMutableSignal = mutable(0);\r\n *\r\n * if (isMutable(mySignal)) {\r\n * mySignal.mutate(x => x + 1); // This would cause a type error, as mySignal is not a MutableSignal.\r\n * }\r\n *\r\n * if (isMutable(myMutableSignal)) {\r\n * myMutableSignal.mutate(x => x + 1); // This is safe.\r\n * }\r\n */\r\nexport function isMutable<T = any>(\r\n value: WritableSignal<T>,\r\n): value is MutableSignal<T> {\r\n return 'mutate' in value && typeof value.mutate === 'function';\r\n}\r\n","import { isPlatformServer } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n inject,\n PLATFORM_ID,\n signal,\n Signal,\n} from '@angular/core';\n\n/**\n * Creates a read-only signal that reactively tracks whether a CSS media query\n * string currently matches.\n *\n * It uses `window.matchMedia` to evaluate the query and listen for changes.\n * The primitive is SSR-safe (defaults to `false` on the server) and automatically\n * cleans up its event listeners when the creating context is destroyed.\n *\n * @param query The CSS media query string to evaluate (e.g., `'(min-width: 768px)'`, `'(prefers-color-scheme: dark)'`).\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<boolean>` which is `true` if the media query\n * currently matches, and `false` otherwise.\n *\n * @remarks\n * - On the server, this signal will always return `false` by default.\n * - It automatically updates if the match status of the media query changes in the browser.\n * - Event listeners are cleaned up automatically via `DestroyRef` if created in an injection context.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { mediaQuery } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-responsive-layout',\n * template: `\n * @if (isDesktop()) {\n * <p>Showing desktop layout.</p>\n * } @else {\n * <p>Showing mobile layout.</p>\n * }\n * `\n * })\n * export class ResponsiveLayoutComponent {\n * readonly isDesktop = mediaQuery('(min-width: 1024px)');\n *\n * constructor() {\n * effect(() => {\n * console.log('Is desktop view:', this.isDesktop());\n * });\n * }\n * }\n * ```\n */\nexport function mediaQuery(query: string, debugName?: string): Signal<boolean> {\n if (isPlatformServer(inject(PLATFORM_ID)))\n return computed(() => false, { debugName });\n\n const mediaQueryList = window.matchMedia(query);\n\n const state = signal(mediaQueryList.matches, { debugName });\n\n const handleChange = (event: MediaQueryListEvent) => {\n state.set(event.matches);\n };\n\n mediaQueryList.addEventListener('change', handleChange);\n\n inject(DestroyRef).onDestroy(() => {\n mediaQueryList.removeEventListener('change', handleChange);\n });\n\n return state.asReadonly();\n}\n\n/**\n * Creates a read-only signal that tracks the user's OS/browser preference\n * for a dark color scheme using the `(prefers-color-scheme: dark)` media query.\n *\n * This is a convenience wrapper around the generic `mediaQuery` primitive.\n * It's SSR-safe (defaults to `false` on the server) and automatically\n * cleans up its event listeners.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<boolean>` which is `true` if a dark theme\n * is preferred, and `false` otherwise.\n * @see {mediaQuery} for the underlying implementation.\n *\n * @example\n * ```ts\n * const isDarkMode = prefersDarkMode();\n * effect(() => {\n * document.body.classList.toggle('dark-theme', isDarkMode());\n * });\n * ```\n */\nexport function prefersDarkMode(debugName?: string): Signal<boolean> {\n return mediaQuery('(prefers-color-scheme: dark)', debugName);\n}\n\n/**\n * Creates a read-only signal that tracks the user's OS/browser preference\n * for reduced motion using the `(prefers-reduced-motion: reduce)` media query.\n *\n * This is a convenience wrapper around the generic `mediaQuery` primitive.\n * It's SSR-safe (defaults to `false` on the server) and automatically\n * cleans up its event listeners.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<boolean>` which is `true` if reduced motion\n * is preferred, and `false` otherwise.\n * @see {mediaQuery} for the underlying implementation.\n *\n * @example\n * ```ts\n * const reduceMotion = prefersReducedMotion();\n * effect(() => {\n * if (reduceMotion()) {\n * // Apply simplified animations or disable them\n * } else {\n * // Apply full animations\n * }\n * });\n * ```\n */\nexport function prefersReducedMotion(debugName?: string): Signal<boolean> {\n return mediaQuery('(prefers-reduced-motion: reduce)', debugName);\n}\n","import {\n computed,\n type CreateSignalOptions,\n DestroyRef,\n inject,\n signal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport { DebouncedSignal } from './debounced';\nimport { toWritable } from './to-writable';\n\n/**\n * Options for creating a throttled writable signal.\n * Extends Angular's `CreateSignalOptions` with a throttle time setting.\n *\n * @template T The type of value held by the signal.\n */\nexport type CreateThrottledOptions<T> = CreateSignalOptions<T> & {\n /**\n * The throttle delay in milliseconds. The minimum time\n * in milliseconds that must pass between updates to the throttled signal's value.\n */\n ms?: number;\n /**\n * Optional `DestroyRef` to clean up the throttle timer when the signal is destroyed.\n * If provided, the timer will be cleared when the signal is destroyed.\n * If the signal is called within a reactive context a DestroyRef is injected automatically.\n * If it is not provided or injected, the timer will not be cleared automatically...which is usually fine :)\n */\n destroyRef?: DestroyRef;\n};\n\n/**\n * A specialized `WritableSignal` whose publicly readable value updates are throttled.\n *\n * It provides access to the underlying, non-throttled signal via the `original` property.\n *\n * @template T The type of value held by the signal.\n * @see {DebouncedSignal} as the output type has the same structure.\n */\nexport type ThrottledSignal<T> = DebouncedSignal<T>;\n\n/**\n * A convenience function that creates and throttles a new `WritableSignal` in one step.\n *\n * @see {throttle} for the core implementation details.\n *\n * @template T The type of value the signal holds.\n * @param initial The initial value of the signal.\n * @param opt Options for signal creation, including throttle time `ms`.\n * @returns A `ThrottledSignal<T>` instance.\n *\n * @example\n * const query = throttled('', { ms: 500 });\n * effect(() => console.log('Throttled Query:', query()));\n *\n * query.set('a');\n * query.set('b');\n * query.set('c');\n * // With a trailing-edge throttle, the final value 'c' would be set\n * // after the 500ms cooldown.\n */\nexport function throttled<T>(\n initial: T,\n opt?: CreateThrottledOptions<T>,\n): DebouncedSignal<T> {\n return throttle(signal(initial, opt), opt);\n}\n\n/**\n * Wraps an existing `WritableSignal` to create a new one whose readable value is throttled.\n *\n * This implementation avoids using `effect` by pairing a trigger signal with an `untracked`\n * read of the source signal to control when the throttled value is re-evaluated.\n *\n * @template T The type of value the signal holds.\n * @param source The source `WritableSignal` to wrap. Writes are applied to this signal immediately.\n * @param opt Options for throttling, including throttle time `ms` and an optional `DestroyRef`.\n * @returns A new `ThrottledSignal<T>` whose read value is throttled. The `.original` property\n * of the returned signal is a reference back to the provided `source` signal.\n *\n * @example\n * const query = throttled('', { ms: 500 });\n * effect(() => console.log('Throttled Query:', query()));\n *\n * query.set('a');\n * query.set('b');\n * query.set('c');\n * // With a trailing-edge throttle, the final value 'c' would be set\n * // after the 500ms cooldown.\n */\nexport function throttle<T>(\n source: WritableSignal<T>,\n opt?: CreateThrottledOptions<T>,\n): ThrottledSignal<T> {\n const ms = opt?.ms ?? 0;\n\n const trigger = signal(false);\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n try {\n const destroyRef =\n opt?.destroyRef ?? inject(DestroyRef, { optional: true });\n\n destroyRef?.onDestroy(() => {\n if (timeout) clearTimeout(timeout);\n timeout = undefined;\n });\n } catch {\n // not in injection context & no destroyRef provided opting out of cleanup\n }\n\n const triggerFn = (updateSourceAction: () => void) => {\n updateSourceAction();\n if (timeout) return;\n\n timeout = setTimeout(() => {\n trigger.update((c) => !c);\n timeout = undefined;\n }, ms);\n };\n\n const set = (value: T) => {\n triggerFn(() => source.set(value));\n };\n\n const update = (fn: (prev: T) => T) => {\n triggerFn(() => source.update(fn));\n };\n\n const writable = toWritable(\n computed(() => {\n trigger();\n return untracked(source);\n }, opt),\n set,\n update,\n ) as ThrottledSignal<T>;\n writable.original = source;\n\n return writable;\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n ElementRef,\n inject,\n isDevMode,\n PLATFORM_ID,\n Signal,\n} from '@angular/core';\nimport { throttled } from '../throttled';\n\ntype MousePosition = {\n x: number;\n y: number;\n};\n\n/**\n * Options for configuring the `mousePosition` sensor.\n */\nexport type MousePositionOptions = {\n /**\n * The target element to listen for mouse movements on.\n * Can be `window`, `document`, an `HTMLElement`, or an `ElementRef<HTMLElement>`.\n * @default window\n */\n target?: Window | Document | HTMLElement | ElementRef<HTMLElement>;\n /**\n * Defines the coordinate system for the reported position.\n * - `'client'`: Coordinates relative to the viewport (`clientX`, `clientY`).\n * - `'page'`: Coordinates relative to the entire document (`pageX`, `pageY`).\n * @default 'client'\n */\n coordinateSpace?: 'client' | 'page';\n /**\n * If `true`, the sensor will also listen to `touchmove` events and report\n * the coordinates of the first touch point.\n * @default false\n */\n touch?: boolean;\n /**\n * Optional debug name for the internal signal.\n */\n debugName?: string;\n /**\n * Optional delay in milliseconds to throttle the updates.\n * @default 100\n */\n throttle?: number;\n};\n\n/**\n * @internal used for setting the since signal\n */\ntype InternalMousePositionSignal = Signal<MousePosition> & {\n unthrottled: Signal<MousePosition>;\n};\n\n/**\n * A specialized Signal that tracks mouse position within an element.\n * It's a throttled signal of the mouse coordinates with an attached `unthrottled` signal.\n */\nexport type MousePositionSignal = Signal<MousePosition> & {\n /** A signal providing the raw, unthrottled mouse position. */\n readonly unthrottled: Signal<MousePosition>;\n};\n\n/**\n * Creates a read-only signal that tracks the mouse cursor's position.\n *\n * It can track mouse movements on a specific target (window, document, or element)\n * and optionally include touch movements. The coordinate space ('client' or 'page')\n * can also be configured.\n * The primitive is SSR-safe and automatically cleans up its event listeners.\n *\n * @param options Optional configuration for the sensor.\n * @returns A read-only `Signal<MousePosition>`. On the server, it returns a static\n * signal with `{ x: 0, y: 0 }`.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { mousePosition } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-mouse-tracker',\n * template: `<p>Mouse Position: X: {{ pos().x }}, Y: {{ pos().y }}</p>`\n * })\n * export class MouseTrackerComponent {\n * readonly pos = mousePosition({ coordinateSpace: 'page' });\n *\n * constructor() {\n * effect(() => {\n * console.log('Mouse moved to:', this.pos());\n * });\n * }\n * }\n * ```\n */\nexport function mousePosition(opt?: MousePositionOptions): MousePositionSignal {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const base = computed(\n () => ({\n x: 0,\n y: 0,\n }),\n {\n debugName: opt?.debugName,\n },\n ) as InternalMousePositionSignal;\n base.unthrottled = base;\n return base;\n }\n\n const {\n target = window,\n coordinateSpace = 'client',\n touch = false,\n debugName,\n throttle = 100,\n } = opt ?? {};\n\n const eventTarget =\n target instanceof ElementRef ? target.nativeElement : target;\n\n if (!eventTarget) {\n if (isDevMode()) console.warn('mousePosition: Target element not found.');\n\n const base = computed(\n () => ({\n x: 0,\n y: 0,\n }),\n {\n debugName,\n },\n ) as InternalMousePositionSignal;\n base.unthrottled = base;\n return base;\n }\n\n const pos = throttled(\n { x: 0, y: 0 },\n {\n ms: throttle,\n equal: (a, b) => a.x === b.x && a.y === b.y,\n debugName,\n },\n );\n\n const updatePosition = (event: MouseEvent | TouchEvent) => {\n let x: number, y: number;\n\n if (event instanceof MouseEvent) {\n x = coordinateSpace === 'page' ? event.pageX : event.clientX;\n y = coordinateSpace === 'page' ? event.pageY : event.clientY;\n } else if (event.touches.length > 0) {\n const firstTouch = event.touches[0];\n x = coordinateSpace === 'page' ? firstTouch.pageX : firstTouch.clientX;\n y = coordinateSpace === 'page' ? firstTouch.pageY : firstTouch.clientY;\n } else {\n return;\n }\n pos.set({ x, y });\n };\n\n eventTarget.addEventListener('mousemove', updatePosition as EventListener);\n if (touch) {\n eventTarget.addEventListener('touchmove', updatePosition as EventListener);\n }\n\n inject(DestroyRef).onDestroy(() => {\n eventTarget.removeEventListener(\n 'mousemove',\n updatePosition as EventListener,\n );\n if (touch) {\n eventTarget.removeEventListener(\n 'touchmove',\n updatePosition as EventListener,\n );\n }\n });\n\n const base = pos.asReadonly() as InternalMousePositionSignal;\n base.unthrottled = pos.original;\n return base;\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n inject,\n PLATFORM_ID,\n Signal,\n signal,\n} from '@angular/core';\n\n/**\n * @internal used for setting the since signal\n */\ntype InternalNetworkStatusSignal = Signal<boolean> & {\n since: Signal<Date>;\n};\n\n/**\n * A specialized Signal that tracks network status.\n * It's a boolean signal with an attached `since` signal.\n */\nexport type NetworkStatusSignal = Signal<boolean> & {\n /** A signal tracking the timestamp of the last status change. */\n readonly since: Signal<Date>;\n};\n\nconst serverDate = new Date();\n\n/**\n * Creates a read-only signal that tracks the browser's online status.\n *\n * The main signal returns a boolean (`true` for online, `false` for offline).\n * An additional `since` signal is attached, tracking when the status last changed.\n * It's SSR-safe and automatically cleans up its event listeners.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A `NetworkStatusSignal` instance.\n */\nexport function networkStatus(debugName?: string): NetworkStatusSignal {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const sig = computed(() => true, {\n debugName,\n }) as InternalNetworkStatusSignal;\n sig.since = computed(() => serverDate);\n return sig;\n }\n\n const state = signal(navigator.onLine, {\n debugName,\n });\n const since = signal(new Date());\n\n const goOnline = () => {\n state.set(true);\n since.set(new Date());\n };\n const goOffline = () => {\n state.set(false);\n since.set(new Date());\n };\n\n window.addEventListener('online', goOnline);\n window.addEventListener('offline', goOffline);\n\n inject(DestroyRef).onDestroy(() => {\n window.removeEventListener('online', goOnline);\n window.removeEventListener('offline', goOffline);\n });\n\n const sig = state.asReadonly() as InternalNetworkStatusSignal;\n sig.since = since.asReadonly();\n\n return sig;\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n inject,\n PLATFORM_ID,\n Signal,\n signal,\n} from '@angular/core';\n\n/**\n * Creates a read-only signal that tracks the page's visibility state.\n *\n * It uses the browser's Page Visibility API to reactively report if the\n * current document is `'visible'`, `'hidden'`, or in another state.\n * The primitive is SSR-safe and automatically cleans up its event listeners\n * when the creating context is destroyed.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<DocumentVisibilityState>`. On the server,\n * it returns a static signal with a value of `'visible'`.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { pageVisibility } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-visibility-tracker',\n * template: `<p>Page is currently: {{ visibilityState() }}</p>`\n * })\n * export class VisibilityTrackerComponent {\n * readonly visibilityState = pageVisibility();\n *\n * constructor() {\n * effect(() => {\n * if (this.visibilityState() === 'hidden') {\n * console.log('Page is hidden, pausing expensive animations...');\n * } else {\n * console.log('Page is visible, resuming activity.');\n * }\n * });\n * }\n * }\n * ```\n */\nexport function pageVisibility(\n debugName?: string,\n): Signal<DocumentVisibilityState> {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n return computed(() => 'visible', { debugName });\n }\n\n const visibility = signal(document.visibilityState, { debugName });\n\n const onVisibilityChange = () => visibility.set(document.visibilityState);\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n inject(DestroyRef).onDestroy(() =>\n document.removeEventListener('visibilitychange', onVisibilityChange),\n );\n\n return visibility.asReadonly();\n}\n","import { isPlatformServer } from '@angular/common'; // Corrected import\nimport {\n computed,\n DestroyRef,\n ElementRef,\n inject,\n PLATFORM_ID, // Used for SSR fallback\n type Signal,\n} from '@angular/core';\nimport { throttled } from '../throttled';\n\n/**\n * Represents the scroll position.\n */\nexport type ScrollPosition = {\n /** The horizontal scroll position (pixels from the left). */\n readonly x: number;\n /** The vertical scroll position (pixels from the top). */\n readonly y: number;\n};\n\n/**\n * Options for configuring the `scrollPosition` sensor.\n */\nexport type ScrollPositionOptions = {\n /**\n * The target to listen for scroll events on.\n * Can be `window` (for page scroll) or an `HTMLElement`/`ElementRef<HTMLElement>`.\n * @default window\n */\n target?: Window | HTMLElement | ElementRef<HTMLElement>;\n /**\n * Optional delay in milliseconds to throttle the updates.\n * Scroll events can fire very rapidly.\n * @default 100 // A common default for scroll throttling\n */\n throttle?: number;\n /** Optional debug name for the internal signal. */\n debugName?: string;\n};\n\n/**\n * @internal used for setting the unthrottled signal\n */\ntype InternalScrollPositionSignal = Signal<ScrollPosition> & {\n unthrottled: Signal<ScrollPosition>;\n};\n\n/**\n * A specialized Signal that tracks scroll position.\n * It's a throttled signal of the scroll coordinates with an attached `unthrottled` signal.\n */\nexport type ScrollPositionSignal = Signal<ScrollPosition> & {\n /** A signal providing the raw, unthrottled scroll position. */\n readonly unthrottled: Signal<ScrollPosition>;\n};\n\n/**\n * Creates a read-only signal that tracks the scroll position (x, y) of the window\n * or a specified HTML element.\n *\n * Updates are throttled by default to optimize performance. An `unthrottled`\n * property is available on the returned signal for direct access to raw updates.\n * The primitive is SSR-safe and automatically cleans up its event listeners.\n *\n * @param options Optional configuration for the scroll sensor.\n * @returns A `ScrollPositionSignal`. On the server, it returns a static\n * signal with `{ x: 0, y: 0 }`.\n *\n * @example\n * ```ts\n * import { Component, effect, ElementRef, viewChild } from '@angular/core';\n * import { scrollPosition } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-scroll-tracker',\n * template: `\n * <p>Window Scroll: X: {{ windowScroll().x }}, Y: {{ windowScroll().y }}</p>\n * <div #scrollableDiv style=\"height: 200px; width: 200px; overflow: auto; border: 1px solid black;\">\n * <div style=\"height: 400px; width: 400px;\">Scroll me!</div>\n * </div>\n * @if (divScroll()) {\n * <p>Div Scroll: X: {{ divScroll().x }}, Y: {{ divScroll().y }}</p>\n * }\n * `\n * })\n * export class ScrollTrackerComponent {\n * readonly windowScroll = scrollPosition(); // Defaults to window\n * readonly scrollableDiv = viewChild<ElementRef<HTMLDivElement>>('scrollableDiv');\n * readonly divScroll = scrollPosition({ target: this.scrollableDiv() }); // Example with element target\n *\n * constructor() {\n * effect(() => {\n * console.log('Window scrolled to:', this.windowScroll());\n * if (this.divScroll()) {\n * console.log('Div scrolled to:', this.divScroll());\n * }\n * });\n * }\n * }\n * ```\n */\nexport function scrollPosition(\n opt?: ScrollPositionOptions,\n): ScrollPositionSignal {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const base = computed(\n () => ({\n x: 0,\n y: 0,\n }),\n {\n debugName: opt?.debugName,\n },\n ) as InternalScrollPositionSignal;\n base.unthrottled = base;\n return base;\n }\n\n const { target = window, throttle = 100, debugName } = opt || {};\n\n let element: Window | HTMLElement;\n\n let getScrollPosition: () => ScrollPosition;\n\n if (target instanceof Window) {\n element = target;\n\n getScrollPosition = () => {\n return { x: target.scrollX, y: target.scrollY };\n };\n } else if (target instanceof ElementRef) {\n element = target.nativeElement;\n getScrollPosition = () => {\n return {\n x: target.nativeElement.scrollLeft,\n y: target.nativeElement.scrollTop,\n };\n };\n } else {\n element = target;\n getScrollPosition = () => {\n return {\n x: target.scrollLeft,\n y: target.scrollTop,\n };\n };\n }\n\n const state = throttled<ScrollPosition>(getScrollPosition(), {\n debugName,\n equal: (a, b) => a.x === b.x && a.y === b.y,\n ms: throttle,\n });\n\n const onScroll = () => state.set(getScrollPosition());\n element.addEventListener('scroll', onScroll, { passive: true });\n\n inject(DestroyRef).onDestroy(() =>\n element.removeEventListener('scroll', onScroll),\n );\n\n const base = state.asReadonly() as InternalScrollPositionSignal;\n base.unthrottled = state.original;\n return base;\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n inject,\n PLATFORM_ID,\n Signal,\n} from '@angular/core';\nimport { throttled } from '../throttled';\n\n/**\n * Represents the dimensions of the window.\n */\nexport type WindowSize = {\n /** The current inner width of the window in pixels. */\n readonly width: number;\n /** The current inner height of the window in pixels. */\n readonly height: number;\n};\n\n/**\n * Options for configuring the `mousePosition` sensor.\n */\nexport type WindowSizeOptions = {\n /**\n * Optional debug name for the internal signal.\n */\n debugName?: string;\n /**\n * Optional delay in milliseconds to throttle the updates.\n * @default 100\n */\n throttle?: number;\n};\n\n/**\n * @internal used for setting the since signal\n */\ntype InternalWindowSizeSignal = Signal<WindowSize> & {\n unthrottled: Signal<WindowSize>;\n};\n\n/**\n * A specialized Signal that tracks window size.\n * It's a throttled signal of the window.innerHeight/innerWidth properties\n * with an attached `unthrottled` signal.\n */\nexport type WindowSizeSignal = Signal<WindowSize> & {\n /** A signal providing the raw, unthrottled window size. */\n readonly unthrottled: Signal<WindowSize>;\n};\n\n/**\n * Creates a read-only signal that tracks the browser window's inner dimensions (width and height).\n *\n * Updates are throttled by default (100ms) to optimize performance during resize events.\n * An `unthrottled` property is available on the returned signal for direct access to raw updates.\n * The primitive is SSR-safe (returns a default size on the server) and automatically\n * cleans up its event listeners.\n *\n * @param opt Optional configuration, including `throttle` (ms) and `debugName`.\n * @returns A `WindowSizeSignal` (a `Signal<WindowSize>` with an `unthrottled` property).\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { windowSize } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-responsive-header',\n * template: `\n * <header>\n * Current Window Size: {{ size().width }}px x {{ size().height }}px\n * @if (isMobile()) {\n * <p>Mobile Menu</p>\n * } @else {\n * <p>Desktop Menu</p>\n * }\n * </header>\n * `\n * })\n * export class ResponsiveHeaderComponent {\n * readonly size = windowSize();\n * readonly isMobile = computed(() => this.size().width < 768);\n *\n * constructor() {\n * effect(() => {\n * console.log('Window resized to:', this.size());\n * });\n * }\n * }\n * ```\n */\nexport function windowSize(opt?: WindowSizeOptions): WindowSizeSignal {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const base = computed(\n () => ({\n width: 1024,\n height: 768,\n }),\n { debugName: opt?.debugName },\n ) as InternalWindowSizeSignal;\n\n base.unthrottled = base;\n return base;\n }\n\n const sizeSignal = throttled<WindowSize>(\n { width: window.innerWidth, height: window.innerHeight },\n {\n debugName: opt?.debugName,\n equal: (a, b) => a.width === b.width && a.height === b.height,\n ms: opt?.throttle ?? 100,\n },\n );\n\n const onResize = () => {\n sizeSignal.set({ width: window.innerWidth, height: window.innerHeight });\n };\n\n window.addEventListener('resize', onResize);\n\n inject(DestroyRef).onDestroy(() => {\n window.removeEventListener('resize', onResize);\n });\n\n const base = sizeSignal.asReadonly() as InternalWindowSizeSignal;\n base.unthrottled = sizeSignal.original;\n return base;\n}\n","import { Signal } from '@angular/core';\nimport { prefersDarkMode, prefersReducedMotion } from './media-query';\nimport {\n MousePositionOptions,\n MousePositionSignal,\n mousePosition,\n} from './mouse-position';\nimport { NetworkStatusSignal, networkStatus } from './network-status';\nimport { pageVisibility } from './page-visibility';\nimport {\n ScrollPositionOptions,\n ScrollPositionSignal,\n scrollPosition,\n} from './scroll-position';\nimport { WindowSizeOptions, WindowSizeSignal, windowSize } from './window-size';\n\n/**\n * Creates a sensor signal that tracks the mouse cursor's position.\n * @param type Must be `'mousePosition'`.\n * @param options Optional configuration for the mouse position sensor.\n * @returns A `MousePositionSignal` that tracks mouse coordinates and provides an unthrottled version.\n * @see {mousePosition} for detailed documentation and examples.\n * @example const pos = sensor('mousePosition', { coordinateSpace: 'page', throttle: 50 });\n */\nexport function sensor(\n type: 'mousePosition',\n options?: MousePositionOptions,\n): MousePositionSignal;\n\n/**\n * Creates a sensor signal that tracks the browser's online/offline status.\n * @param type Must be `'networkStatus'`.\n * @param options Optional configuration, currently only `debugName`.\n * @returns A `NetworkStatusSignal` which is a boolean indicating online status, with an attached `since` signal.\n * @see {networkStatus} for detailed documentation and examples.\n * @example const onlineStatus = sensor('networkStatus');\n */\nexport function sensor(\n type: 'networkStatus',\n options?: { debugName?: string },\n): NetworkStatusSignal;\n\n/**\n * Creates a sensor signal that tracks the page's visibility state (e.g., 'visible', 'hidden').\n * @param type Must be `'pageVisibility'`.\n * @param options Optional configuration, currently only `debugName`.\n * @returns A `Signal<DocumentVisibilityState>` indicating the page's current visibility.\n * @see {pageVisibility} for detailed documentation and examples.\n * @example const visibility = sensor('pageVisibility');\n */\nexport function sensor(\n type: 'pageVisibility',\n options?: { debugName?: string },\n): Signal<DocumentVisibilityState>;\n\n/**\n * Creates a sensor signal that tracks the user's OS/browser preference for a dark color scheme.\n * @param type Must be `'dark-mode'`.\n * @param options Optional configuration, currently only `debugName`.\n * @returns A `Signal<boolean>` which is `true` if a dark theme is preferred.\n * @see {prefersDarkMode} for detailed documentation and examples.\n * @example const isDarkMode = sensor('dark-mode');\n */\nexport function sensor(\n type: 'dark-mode',\n options?: { debugName?: string },\n): Signal<boolean>;\n\n/**\n * Creates a sensor signal that tracks the user's OS/browser preference for reduced motion.\n * @param type Must be `'reduced-motion'`.\n * @param options Optional configuration, currently only `debugName`.\n * @returns A `Signal<boolean>` which is `true` if reduced motion is preferred.\n * @see {prefersReducedMotion} for detailed documentation and examples.\n * @example const wantsReducedMotion = sensor('reduced-motion');\n */\nexport function sensor(\n type: 'reduced-motion',\n options?: { debugName?: string },\n): Signal<boolean>;\n\n/**\n * Creates a sensor signal that tracks the browser window's inner dimensions (width and height).\n * @param type Must be `'windowSize'`.\n * @param options Optional configuration for the window size sensor, including `throttle` and `debugName`.\n * @returns A `WindowSizeSignal` that tracks window dimensions and provides an unthrottled version.\n * @see {windowSize} for detailed documentation and examples.\n * @example const size = sensor('windowSize', { throttle: 200 });\n */\nexport function sensor(\n type: 'windowSize',\n options?: WindowSizeOptions,\n): WindowSizeSignal;\n\n/**\n * Creates a sensor signal that tracks the scroll position (x, y) of the window or a specified element.\n * @param type Must be `'scrollPosition'`.\n * @param options Optional configuration for the scroll position sensor, including `target`, `throttle`, and `debugName`.\n * @returns A `ScrollPositionSignal` that tracks scroll coordinates and provides an unthrottled version.\n * @see {scrollPosition} for detailed documentation and examples.\n * @example const pageScroll = sensor('scrollPosition', { throttle: 150 });\n */\nexport function sensor(\n type: 'scrollPosition',\n options?: ScrollPositionOptions,\n): ScrollPositionSignal;\n\n/**\n * Implementation for sensor overloads.\n * Users should refer to the specific overloads for detailed documentation.\n * @internal\n */\nexport function sensor(\n type:\n | 'mousePosition'\n | 'networkStatus'\n | 'pageVisibility'\n | 'dark-mode'\n | 'reduced-motion'\n | 'windowSize'\n | 'scrollPosition',\n options?:\n | {\n debugName?: string;\n }\n | MousePositionOptions\n | WindowSizeOptions\n | ScrollPositionOptions,\n):\n | MousePositionSignal\n | NetworkStatusSignal\n | Signal<DocumentVisibilityState>\n | Signal<boolean>\n | WindowSizeSignal\n | ScrollPositionSignal\n | Signal<IntersectionObserverEntry | undefined> {\n switch (type) {\n case 'mousePosition':\n return mousePosition(options);\n case 'networkStatus':\n return networkStatus(options?.debugName);\n case 'pageVisibility':\n return pageVisibility(options?.debugName);\n case 'dark-mode':\n return prefersDarkMode(options?.debugName);\n case 'reduced-motion':\n return prefersReducedMotion(options?.debugName);\n case 'windowSize':\n return windowSize(options);\n case 'scrollPosition':\n return scrollPosition(options as ScrollPositionOptions);\n default:\n throw new Error(`Unknown sensor type: ${type}`);\n }\n}\n","import { isPlatformServer } from '@angular/common';\r\nimport {\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n isDevMode,\r\n isSignal,\r\n PLATFORM_ID,\r\n Signal,\r\n signal,\r\n untracked,\r\n type CreateSignalOptions,\r\n type WritableSignal,\r\n} from '@angular/core';\r\nimport { toWritable } from './to-writable';\r\n\r\n/**\r\n * Interface for storage mechanisms compatible with the `stored` signal.\r\n * Matches the essential parts of the `Storage` interface (`localStorage`, `sessionStorage`).\r\n */\r\ntype Store = {\r\n /** Retrieves an item from storage for a given key. */\r\n getItem: (key: string) => string | null;\r\n /** Sets an item in storage for a given key. */\r\n setItem: (key: string, value: string) => void;\r\n /** Removes an item from storage for a given key. */\r\n removeItem: (key: string) => void;\r\n};\r\n\r\n// Internal dummy store for server-side rendering\r\nconst noopStore: Store = {\r\n getItem: () => null,\r\n setItem: () => {\r\n /* noop */\r\n },\r\n removeItem: () => {\r\n /* noop */\r\n },\r\n};\r\n\r\n/**\r\n * Options for creating a signal synchronized with persistent storage using `stored()`.\r\n * Extends Angular's `CreateSignalOptions`.\r\n *\r\n * @template T The type of value held by the signal.\r\n */\r\nexport type CreateStoredOptions<T> = CreateSignalOptions<T> & {\r\n /**\r\n * The key used to identify the item in storage.\r\n * Can be a static string or a function/signal returning a string for dynamic keys\r\n * (e.g., based on user ID or other application state).\r\n */\r\n key: string | (() => string);\r\n /**\r\n * Optional custom storage implementation (e.g., `sessionStorage` or a custom adapter).\r\n * Must conform to the `Store` interface (`getItem`, `setItem`, `removeItem`).\r\n * Defaults to `localStorage` in browser environments and a no-op store on the server.\r\n */\r\n store?: Store;\r\n /**\r\n * Optional function to serialize the value (type `T`) into a string before storing.\r\n * Defaults to `JSON.stringify`.\r\n * @param {T} value The value to serialize.\r\n * @returns {string} The serialized string representation.\r\n */\r\n serialize?: (value: T) => string;\r\n /**\r\n * Optional function to deserialize the string retrieved from storage back into the value (type `T`).\r\n * Defaults to `JSON.parse`.\r\n * @param {string} value The string retrieved from storage.\r\n * @returns {T} The deserialized value.\r\n */\r\n deserialize?: (value: string) => T;\r\n /**\r\n * If `true`, the signal will attempt to synchronize its state across multiple browser tabs\r\n * using the `storage` event. Changes made in one tab (set, update, clear) will be\r\n * reflected in other tabs using the same storage key.\r\n * Requires a browser environment. Defaults to `false`.\r\n */\r\n syncTabs?: boolean;\r\n /**\r\n * Optional parameter to specify how key changes should be handled, load is the default.\r\n * - `load`: The signal will load the value from storage when the key changes & replace the signal's value.\r\n * - `store`: The signal will store the current value to the new key when the key changes.\r\n */\r\n onKeyChange?: 'load' | 'store';\r\n /**\r\n * If 'true', the signal will remove the old key from storage when the key changes, defaults to `false`.\r\n */\r\n cleanupOldKey?: boolean;\r\n};\r\n\r\n/**\r\n * A specialized `WritableSignal` returned by the `stored()` function.\r\n * It synchronizes its value with persistent storage and provides additional methods.\r\n *\r\n * @template T The type of value held by the signal (matches the fallback type).\r\n */\r\nexport type StoredSignal<T> = WritableSignal<T> & {\r\n /**\r\n * Removes the item associated with the signal's key from the configured storage.\r\n * After clearing, reading the signal will return the fallback value until it's set again.\r\n */\r\n clear: () => void;\r\n /**\r\n * A `Signal<string>` containing the current storage key being used by this stored signal.\r\n * This is particularly useful if the key was configured dynamically. You can read or react\r\n * to this signal to know the active key.\r\n */\r\n key: Signal<string>;\r\n};\r\n\r\n/**\r\n * Creates a `WritableSignal` whose state is automatically synchronized with persistent storage\r\n * (like `localStorage` or `sessionStorage`).\r\n *\r\n * It handles Server-Side Rendering (SSR) gracefully, allows dynamic storage keys,\r\n * custom serialization/deserialization, custom storage providers, and optional\r\n * synchronization across browser tabs.\r\n *\r\n * @template T The type of value held by the signal and stored (after serialization).\r\n * @param fallback The default value of type `T` to use when no value is found in storage\r\n * or when deserialization fails. The signal's value will never be `null` or `undefined`\r\n * publicly, it will always revert to this fallback.\r\n * @param options Configuration options (`CreateStoredOptions<T>`). Requires at least the `key`.\r\n * @returns A `StoredSignal<T>` instance. This signal behaves like a standard `WritableSignal<T>`,\r\n * but its value is persisted. It includes a `.clear()` method to remove the item from storage\r\n * and a `.key` signal providing the current storage key.\r\n *\r\n * @remarks\r\n * - **Persistence:** The signal automatically saves its value to storage whenever the signal's\r\n * value or its configured `key` changes. This is managed internally using `effect`.\r\n * - **SSR Safety:** Detects server environments and uses a no-op storage, preventing errors.\r\n * - **Error Handling:** Catches and logs errors during serialization/deserialization in dev mode.\r\n * - **Tab Sync:** If `syncTabs` is true, listens to `storage` events to keep the signal value\r\n * consistent across browser tabs using the same key. Cleanup is handled automatically\r\n * using `DestroyRef`.\r\n * - **Removal:** Use the `.clear()` method on the returned signal to remove the item from storage.\r\n * Setting the signal to the fallback value will store the fallback value, not remove the item.\r\n *\r\n * @example\r\n * ```ts\r\n * import { Component, effect, signal } from '@angular/core';\r\n * import { stored } from '@mmstack/primitives'; // Adjust import path\r\n *\r\n * @Component({\r\n * selector: 'app-settings',\r\n * standalone: true,\r\n * template: `\r\n * Theme:\r\n * <select [ngModel]=\"theme()\" (ngModelChange)=\"theme.set($event)\">\r\n * <option value=\"light\">Light</option>\r\n * <option value=\"dark\">Dark</option>\r\n * </select>\r\n * <button (click)=\"theme.clear()\">Clear Theme Setting</button>\r\n * <p>Storage Key Used: {{ theme.key() }}</p>\r\n * ` // Requires FormsModule for ngModel\r\n * })\r\n * export class SettingsComponent {\r\n * theme = stored<'light' | 'dark'>('light', { key: 'app-theme', syncTabs: true });\r\n * }\r\n * ```\r\n */\r\nexport function stored<T>(\r\n fallback: T,\r\n {\r\n key,\r\n store: providedStore,\r\n serialize = JSON.stringify,\r\n deserialize = JSON.parse,\r\n syncTabs = false,\r\n equal = Object.is,\r\n onKeyChange = 'load',\r\n cleanupOldKey = false,\r\n ...rest\r\n }: CreateStoredOptions<T>,\r\n): StoredSignal<T> {\r\n const isServer = isPlatformServer(inject(PLATFORM_ID));\r\n\r\n const fallbackStore = isServer ? noopStore : localStorage;\r\n const store = providedStore ?? fallbackStore;\r\n\r\n const keySig =\r\n typeof key === 'string'\r\n ? computed(() => key)\r\n : isSignal(key)\r\n ? key\r\n : computed(key);\r\n\r\n const getValue = (key: string): T | null => {\r\n const found = store.getItem(key);\r\n if (found === null) return null;\r\n try {\r\n return deserialize(found);\r\n } catch (err) {\r\n if (isDevMode())\r\n console.error(`Failed to parse stored value for key \"${key}\":`, err);\r\n return null;\r\n }\r\n };\r\n\r\n const storeValue = (key: string, value: T | null) => {\r\n try {\r\n if (value === null) return store.removeItem(key);\r\n const serialized = serialize(value);\r\n store.setItem(key, serialized);\r\n } catch (err) {\r\n if (isDevMode())\r\n console.error(`Failed to store value for key \"${key}\":`, err);\r\n }\r\n };\r\n\r\n const opt = {\r\n ...rest,\r\n equal,\r\n };\r\n\r\n const initialKey = untracked(keySig);\r\n const internal = signal(getValue(initialKey), {\r\n ...opt,\r\n equal: (a, b) => {\r\n if (a === null && b === null) return true;\r\n if (a === null || b === null) return false;\r\n return equal(a, b);\r\n },\r\n });\r\n\r\n let prevKey = initialKey;\r\n\r\n if (onKeyChange === 'store') {\r\n effect(() => {\r\n const k = keySig();\r\n storeValue(k, internal());\r\n if (prevKey !== k) {\r\n if (cleanupOldKey) store.removeItem(prevKey);\r\n prevKey = k;\r\n }\r\n });\r\n } else {\r\n effect(() => {\r\n const k = keySig();\r\n const internalValue = internal();\r\n if (k === prevKey) {\r\n return storeValue(k, internalValue); // normal operation\r\n } else {\r\n if (cleanupOldKey) store.removeItem(prevKey);\r\n const value = getValue(k);\r\n\r\n prevKey = k;\r\n internal.set(value); // load new value\r\n }\r\n });\r\n }\r\n\r\n if (syncTabs && !isServer) {\r\n const destroyRef = inject(DestroyRef);\r\n const sync = (e: StorageEvent) => {\r\n if (e.key !== untracked(keySig)) return;\r\n\r\n if (e.newValue === null) internal.set(null);\r\n else internal.set(getValue(e.key));\r\n };\r\n\r\n window.addEventListener('storage', sync);\r\n\r\n destroyRef.onDestroy(() => window.removeEventListener('storage', sync));\r\n }\r\n\r\n const writable = toWritable<T>(\r\n computed(() => internal() ?? fallback, opt),\r\n internal.set,\r\n ) as StoredSignal<T>;\r\n\r\n writable.clear = () => {\r\n internal.set(null);\r\n };\r\n writable.key = keySig;\r\n return writable;\r\n}\r\n","import {\n DestroyRef,\n effect,\n EffectRef,\n inject,\n Injector,\n runInInjectionContext,\n Signal,\n untracked,\n} from '@angular/core';\n\nexport type UntilOptions = {\n /**\n * Optional timeout in milliseconds. If the condition is not met\n * within this period, the promise will reject.\n */\n timeout?: number;\n /**\n * Optional DestroyRef. If provided and the component/context is destroyed\n * before the condition is met or timeout occurs, the promise will reject.\n * If not provided, it will attempt to inject one if called in an injection context.\n */\n destroyRef?: DestroyRef;\n injector?: Injector;\n};\n\n/**\n * Creates a Promise that resolves when a signal's value satisfies a given predicate.\n *\n * This is useful for imperatively waiting for a reactive state to change,\n * for example, in tests or to orchestrate complex asynchronous operations.\n *\n * @template T The type of the signal's value.\n * @param sourceSignal The signal to observe.\n * @param predicate A function that takes the signal's value and returns `true` if the condition is met.\n * @param options Optional configuration for timeout and explicit destruction.\n * @returns A Promise that resolves with the signal's value when the predicate is true,\n * or rejects on timeout or context destruction.\n *\n * @example\n * ```ts\n * const count = signal(0);\n *\n * async function waitForCount() {\n * console.log('Waiting for count to be >= 3...');\n * try {\n * const finalCount = await until(count, c => c >= 3, { timeout: 5000 });\n * console.log(`Count reached: ${finalCount}`);\n * } catch (e: any) { // Ensure 'e' is typed if you access properties like e.message\n * console.error(e.message); // e.g., \"until: Timeout after 5000ms.\"\n * }\n * }\n *\n * // Simulate updates\n * setTimeout(() => count.set(1), 500);\n * setTimeout(() => count.set(2), 1000);\n * setTimeout(() => count.set(3), 1500);\n *\n * waitForCount();\n * ```\n */\nexport function until<T>(\n sourceSignal: Signal<T>,\n predicate: (value: T) => boolean,\n options: UntilOptions = {},\n): Promise<T> {\n const injector = options.injector ?? inject(Injector);\n return new Promise<T>((resolve, reject) => {\n let effectRef: EffectRef | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n\n const cleanupAndReject = (reason: string) => {\n if (!settled) {\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n effectRef?.destroy();\n reject(new Error(reason));\n }\n };\n\n const cleanupAndResolve = (value: T) => {\n if (!settled) {\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n effectRef?.destroy();\n resolve(value);\n }\n };\n\n try {\n const destroyRef =\n options.destroyRef ?? inject(DestroyRef, { optional: true });\n\n destroyRef?.onDestroy(() => {\n cleanupAndReject(\n 'until: Operation cancelled due to context destruction.',\n );\n });\n } catch {\n // noop\n }\n\n const initialValue = untracked(sourceSignal);\n if (predicate(initialValue)) {\n cleanupAndResolve(initialValue);\n return;\n }\n\n if (options?.timeout !== undefined) {\n timeoutId = setTimeout(\n () => cleanupAndReject(`until: Timeout after ${options.timeout}ms.`),\n options.timeout,\n );\n }\n\n runInInjectionContext(injector, () => {\n effectRef = effect(() => {\n if (settled) {\n return effectRef?.destroy();\n }\n\n const currentValue = sourceSignal();\n if (predicate(currentValue)) {\n cleanupAndResolve(currentValue);\n }\n });\n });\n });\n}\n","import { Signal, ValueEqualityFn } from '@angular/core';\nimport { SIGNAL } from '@angular/core/primitives/signals';\n\n/**\n * @interal\n */\nexport function getSignalEquality<T>(sig: Signal<T>): ValueEqualityFn<T> {\n const internal = sig[SIGNAL] as {\n equal?: ValueEqualityFn<T>;\n };\n if (internal && typeof internal.equal === 'function') {\n return internal.equal;\n }\n return Object.is; // Default equality check\n}\n","import {\r\n computed,\r\n type CreateSignalOptions,\r\n type Signal,\r\n untracked,\r\n type ValueEqualityFn,\r\n type WritableSignal,\r\n} from '@angular/core';\r\nimport { getSignalEquality } from './get-signal-equality';\r\nimport { mutable } from './mutable';\r\nimport { toWritable } from './to-writable';\r\n\r\n/**\r\n * A WritableSignal enhanced with undo/redo capabilities and history tracking.\r\n *\r\n * @template T The type of value held by the signal.\r\n */\r\nexport type SignalWithHistory<T> = WritableSignal<T> & {\r\n /** A read-only signal of the undo history stack. The oldest changes are at the start of the array. */\r\n history: Signal<T[]>;\r\n /** Reverts the signal to its most recent previous state in the history. */\r\n undo: () => void;\r\n /** Re-applies the last state that was undone. */\r\n redo: () => void;\r\n /** A signal that is `true` if there are states in the redo stack. */\r\n canRedo: Signal<boolean>;\r\n /** A signal that is `true` if there are states in the undo history. */\r\n canUndo: Signal<boolean>;\r\n /** Clears both the undo and redo history stacks. */\r\n clear: () => void;\r\n /** A signal that is `true` if there is any history that can be cleared. */\r\n canClear: Signal<boolean>;\r\n};\r\n\r\n/**\r\n * Options for creating a signal with history tracking.\r\n *\r\n * @template T The type of value held by the signal.\r\n */\r\nexport type CreateHistoryOptions<T> = Omit<\r\n CreateSignalOptions<T[]>,\r\n 'equal'\r\n> & {\r\n /**\r\n * Optional custom equality function to determine if a value has changed before\r\n * adding it to history. Defaults to the source signal's equality function or `Object.is`.\r\n */\r\n equal?: ValueEqualityFn<T>;\r\n /**\r\n * The maximum number of undo states to keep in the history.\r\n * @default Infinity\r\n */\r\n maxSize?: number;\r\n /**\r\n * The strategy for trimming the history when `maxSize` is reached.\r\n * - `shift`: Removes the single oldest entry from the history.\r\n * - `halve`: Removes the oldest half of the history stack.\r\n * @default 'halve'\r\n */\r\n cleanupStrategy?: 'shift' | 'halve';\r\n};\r\n\r\n/**\r\n * Enhances an existing `WritableSignal` by adding a complete undo/redo history\r\n * stack and an API to control it.\r\n *\r\n * @template T The type of value held by the signal.\r\n * @param source The source `WritableSignal` to add history tracking to.\r\n * @param options Optional configuration for the history behavior.\r\n * @returns A `SignalWithHistory<T>` instance, augmenting the source signal with history APIs.\r\n *\r\n * @remarks\r\n * - Any new `.set()` or `.update()` call on the signal will clear the entire redo stack.\r\n * - The primitive attempts to automatically use the source signal's own `equal` function,\r\n * but this relies on an internal Angular API. For maximum stability across Angular\r\n * versions, it is recommended to provide an explicit `equal` function in the options.\r\n *\r\n * @example\r\n * ```ts\r\n * import { signal } from '@angular/core';\r\n * import { withHistory } from '@mmstack/primitives';\r\n *\r\n * const name = withHistory(signal('John'), { maxSize: 5 });\r\n *\r\n * console.log('Initial value:', name()); // \"John\"\r\n *\r\n * name.set('John Doe');\r\n * name.set('Jane Doe');\r\n *\r\n * console.log('Current value:', name()); // \"Jane Doe\"\r\n * console.log('History:', name.history()); // [\"John\", \"John Doe\"]\r\n * console.log('Can undo:', name.canUndo()); // true\r\n * console.log('Can redo:', name.canRedo()); // false\r\n *\r\n * name.undo();\r\n * console.log('After undo:', name()); // \"John Doe\"\r\n * console.log('Can redo:', name.canRedo()); // true\r\n *\r\n * name.redo();\r\n * console.log('After redo:', name()); // \"Jane Doe\"\r\n *\r\n * // A new change will clear the redo history\r\n * name.set('Janine Doe');\r\n * console.log('Can redo:', name.canRedo()); // false\r\n *\r\n * name.clear();\r\n * console.log('Can undo:', name.canUndo()); // false\r\n * ```\r\n */\r\nexport function withHistory<T>(\r\n source: WritableSignal<T>,\r\n opt?: CreateHistoryOptions<T>,\r\n): SignalWithHistory<T> {\r\n const equal = opt?.equal ?? getSignalEquality(source);\r\n const maxSize = opt?.maxSize ?? Infinity;\r\n\r\n const history = mutable<T[]>([], {\r\n ...opt,\r\n equal: undefined,\r\n });\r\n\r\n const redoArray = mutable<T[]>([]);\r\n\r\n const originalSet = source.set;\r\n\r\n const set = (value: T) => {\r\n const current = untracked(source);\r\n if (equal(value, current)) return;\r\n\r\n source.set(value);\r\n\r\n history.mutate((c) => {\r\n if (c.length >= maxSize) {\r\n if (opt?.cleanupStrategy === 'shift') {\r\n c.shift();\r\n } else {\r\n c = c.slice(Math.floor(maxSize / 2));\r\n }\r\n }\r\n c.push(current);\r\n return c;\r\n });\r\n redoArray.set([]);\r\n };\r\n\r\n const update = (updater: (prev: T) => T) => {\r\n set(updater(untracked(source)));\r\n };\r\n\r\n const internal = toWritable(\r\n computed(() => source(), {\r\n equal,\r\n debugName: opt?.debugName,\r\n }),\r\n set,\r\n update,\r\n ) as SignalWithHistory<T>;\r\n internal.history = history;\r\n\r\n internal.undo = () => {\r\n const historyStack = untracked(history);\r\n if (historyStack.length === 0) return;\r\n\r\n const valueForRedo = untracked(source);\r\n const valueToRestore = historyStack.at(-1)!;\r\n\r\n originalSet.call(source, valueToRestore);\r\n\r\n history.inline((h) => h.pop());\r\n redoArray.inline((r) => r.push(valueForRedo));\r\n };\r\n\r\n internal.redo = () => {\r\n const redoStack = untracked(redoArray);\r\n if (redoStack.length === 0) return;\r\n\r\n const valueForUndo = untracked(source);\r\n const valueToRestore = redoStack.at(-1)!;\r\n\r\n originalSet.call(source, valueToRestore);\r\n\r\n redoArray.inline((r) => r.pop());\r\n history.mutate((h) => {\r\n if (h.length >= maxSize) {\r\n if (opt?.cleanupStrategy === 'shift') {\r\n h.shift();\r\n } else {\r\n h = h.slice(Math.floor(maxSize / 2));\r\n }\r\n }\r\n h.push(valueForUndo);\r\n return h;\r\n });\r\n };\r\n\r\n internal.clear = () => {\r\n history.set([]);\r\n redoArray.set([]);\r\n };\r\n\r\n internal.canUndo = computed(() => history().length > 0);\r\n internal.canRedo = computed(() => redoArray().length > 0);\r\n internal.canClear = computed(() => internal.canUndo() || internal.canRedo());\r\n\r\n return internal;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mmstack-primitives.mjs","sources":["../tmp-esm2022/lib/to-writable.js","../tmp-esm2022/lib/debounced.js","../tmp-esm2022/lib/mutable.js","../tmp-esm2022/lib/derived.js","../tmp-esm2022/lib/element-visibility.js","../tmp-esm2022/lib/map-array.js","../tmp-esm2022/lib/sensors/media-query.js","../tmp-esm2022/lib/throttled.js","../tmp-esm2022/lib/sensors/mouse-position.js","../tmp-esm2022/lib/sensors/network-status.js","../tmp-esm2022/lib/sensors/page-visibility.js","../tmp-esm2022/lib/sensors/scroll-position.js","../tmp-esm2022/lib/sensors/window-size.js","../tmp-esm2022/lib/sensors/sensor.js","../tmp-esm2022/lib/stored.js","../tmp-esm2022/lib/until.js","../tmp-esm2022/lib/get-signal-equality.js","../tmp-esm2022/lib/with-history.js","../tmp-esm2022/mmstack-primitives.js"],"sourcesContent":["import { untracked } from '@angular/core';\n/**\n * Converts a read-only `Signal` into a `WritableSignal` by providing custom `set` and, optionally, `update` functions.\n * This can be useful for creating controlled write access to a signal that is otherwise read-only.\n *\n * @typeParam T - The type of value held by the signal.\n *\n * @param signal - The read-only `Signal` to be made writable.\n * @param set - A function that will be used to set the signal's value. This function *must* handle\n * the actual update mechanism (e.g., updating a backing store, emitting an event, etc.).\n * @param update - (Optional) A function that will be used to update the signal's value based on its\n * previous value. If not provided, a default `update` implementation is used that\n * calls the provided `set` function with the result of the updater function. The\n * default implementation uses `untracked` to avoid creating unnecessary dependencies\n * within the updater function.\n *\n * @returns A `WritableSignal` that uses the provided `set` and `update` functions. The `asReadonly`\n * method of the returned signal will still return the original read-only signal.\n *\n * @example\n * // Basic usage: Making a read-only signal writable with a custom set function.\n * const originalValue = signal({a: 0});\n * const readOnlySignal = computed(() => originalValue().a);\n * const writableSignal = toWritable(readOnlySignal, (newValue) => {\n * originalValue.update((prev) => { ...prev, a: newValue });\n * });\n *\n * writableSignal.set(5); // sets value of originalValue.a to 5 & triggers all signals\n */\nexport function toWritable(signal, set, update) {\n const internal = signal;\n internal.asReadonly = () => signal;\n internal.set = set;\n internal.update = update ?? ((updater) => set(updater(untracked(internal))));\n return internal;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8td3JpdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3NyYy9saWIvdG8td3JpdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFbEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLE1BQWlCLEVBQ2pCLEdBQXVCLEVBQ3ZCLE1BQTJDO0lBRTNDLE1BQU0sUUFBUSxHQUFHLE1BQTJCLENBQUM7SUFDN0MsUUFBUSxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbkMsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFN0UsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpZ25hbCwgdW50cmFja2VkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgcmVhZC1vbmx5IGBTaWduYWxgIGludG8gYSBgV3JpdGFibGVTaWduYWxgIGJ5IHByb3ZpZGluZyBjdXN0b20gYHNldGAgYW5kLCBvcHRpb25hbGx5LCBgdXBkYXRlYCBmdW5jdGlvbnMuXHJcbiAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgY29udHJvbGxlZCB3cml0ZSBhY2Nlc3MgdG8gYSBzaWduYWwgdGhhdCBpcyBvdGhlcndpc2UgcmVhZC1vbmx5LlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBzaWduYWwuXHJcbiAqXHJcbiAqIEBwYXJhbSBzaWduYWwgLSBUaGUgcmVhZC1vbmx5IGBTaWduYWxgIHRvIGJlIG1hZGUgd3JpdGFibGUuXHJcbiAqIEBwYXJhbSBzZXQgLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgc2lnbmFsJ3MgdmFsdWUuICBUaGlzIGZ1bmN0aW9uICptdXN0KiBoYW5kbGVcclxuICogICAgICAgICAgICAgIHRoZSBhY3R1YWwgdXBkYXRlIG1lY2hhbmlzbSAoZS5nLiwgdXBkYXRpbmcgYSBiYWNraW5nIHN0b3JlLCBlbWl0dGluZyBhbiBldmVudCwgZXRjLikuXHJcbiAqIEBwYXJhbSB1cGRhdGUgLSAoT3B0aW9uYWwpIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBzaWduYWwncyB2YWx1ZSBiYXNlZCBvbiBpdHNcclxuICogICAgICAgICAgICAgICAgIHByZXZpb3VzIHZhbHVlLiAgSWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQgYHVwZGF0ZWAgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0aGF0XHJcbiAqICAgICAgICAgICAgICAgICBjYWxscyB0aGUgcHJvdmlkZWQgYHNldGAgZnVuY3Rpb24gd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSB1cGRhdGVyIGZ1bmN0aW9uLiBUaGVcclxuICogICAgICAgICAgICAgICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdXNlcyBgdW50cmFja2VkYCB0byBhdm9pZCBjcmVhdGluZyB1bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXNcclxuICogICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgdXBkYXRlciBmdW5jdGlvbi5cclxuICpcclxuICogQHJldHVybnMgQSBgV3JpdGFibGVTaWduYWxgIHRoYXQgdXNlcyB0aGUgcHJvdmlkZWQgYHNldGAgYW5kIGB1cGRhdGVgIGZ1bmN0aW9ucy4gIFRoZSBgYXNSZWFkb25seWBcclxuICogICAgICAgICAgbWV0aG9kIG9mIHRoZSByZXR1cm5lZCBzaWduYWwgd2lsbCBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlYWQtb25seSBzaWduYWwuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIEJhc2ljIHVzYWdlOiBNYWtpbmcgYSByZWFkLW9ubHkgc2lnbmFsIHdyaXRhYmxlIHdpdGggYSBjdXN0b20gc2V0IGZ1bmN0aW9uLlxyXG4gKiBjb25zdCBvcmlnaW5hbFZhbHVlID0gc2lnbmFsKHthOiAwfSk7XHJcbiAqIGNvbnN0IHJlYWRPbmx5U2lnbmFsID0gY29tcHV0ZWQoKCkgPT4gb3JpZ2luYWxWYWx1ZSgpLmEpO1xyXG4gKiBjb25zdCB3cml0YWJsZVNpZ25hbCA9IHRvV3JpdGFibGUocmVhZE9ubHlTaWduYWwsIChuZXdWYWx1ZSkgPT4ge1xyXG4gKiAgb3JpZ2luYWxWYWx1ZS51cGRhdGUoKHByZXYpID0+IHsgLi4ucHJldiwgYTogbmV3VmFsdWUgfSk7XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiB3cml0YWJsZVNpZ25hbC5zZXQoNSk7IC8vIHNldHMgdmFsdWUgb2Ygb3JpZ2luYWxWYWx1ZS5hIHRvIDUgJiB0cmlnZ2VycyBhbGwgc2lnbmFsc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvV3JpdGFibGU8VD4oXHJcbiAgc2lnbmFsOiBTaWduYWw8VD4sXHJcbiAgc2V0OiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgdXBkYXRlPzogKHVwZGF0ZXI6ICh2YWx1ZTogVCkgPT4gVCkgPT4gdm9pZCxcclxuKTogV3JpdGFibGVTaWduYWw8VD4ge1xyXG4gIGNvbnN0IGludGVybmFsID0gc2lnbmFsIGFzIFdyaXRhYmxlU2lnbmFsPFQ+O1xyXG4gIGludGVybmFsLmFzUmVhZG9ubHkgPSAoKSA9PiBzaWduYWw7XHJcbiAgaW50ZXJuYWwuc2V0ID0gc2V0O1xyXG4gIGludGVybmFsLnVwZGF0ZSA9IHVwZGF0ZSA/PyAoKHVwZGF0ZXIpID0+IHNldCh1cGRhdGVyKHVudHJhY2tlZChpbnRlcm5hbCkpKSk7XHJcblxyXG4gIHJldHVybiBpbnRlcm5hbDtcclxufVxyXG4iXX0=","import { computed, DestroyRef, inject, signal, untracked, } from '@angular/core';\nimport { toWritable } from './to-writable';\n/**\n * A convenience function that creates and debounces a new `WritableSignal` in one step.\n *\n * @see {debounce} for the core implementation details.\n *\n * @template T The type of value the signal holds.\n * @param initial The initial value of the signal.\n * @param opt Options for signal creation, including debounce time `ms`.\n * @returns A `DebouncedSignal<T>` instance.\n *\n * @example\n * // The existing example remains perfect here.\n * const query = debounced('', { ms: 500 });\n * effect(() => console.log('Debounced Query:', query()));\n * query.set('abc');\n * // ...500ms later...\n * // Output: Debounced Query: abc\n */\nexport function debounced(initial, opt) {\n return debounce(signal(initial, opt), opt);\n}\n/**\n * Wraps an existing `WritableSignal` to create a new one whose readable value is debounced.\n *\n * This implementation avoids using `effect` by pairing a trigger signal with an `untracked`\n * read of the source signal to control when the debounced value is re-evaluated.\n *\n * @template T The type of value the signal holds.\n * @param source The source `WritableSignal` to wrap. Writes are applied to this signal immediately.\n * @param opt Options for debouncing, including debounce time `ms` and an optional `DestroyRef`.\n * @returns A new `DebouncedSignal<T>` whose read value is debounced. The `.original` property\n * of the returned signal is a reference back to the provided `source` signal.\n *\n * @example\n * ```ts\n * import { signal, effect } from '@angular/core';\n *\n * // 1. Create a standard source signal.\n * const sourceQuery = signal('');\n *\n * // 2. Create a debounced version of it.\n * const debouncedQuery = debounce(sourceQuery, { ms: 500 });\n *\n * // This effect tracks the original signal and runs immediately.\n * effect(() => {\n * console.log('Original Query:', debouncedQuery.original());\n * });\n *\n * // This effect tracks the debounced signal and runs after the delay.\n * effect(() => {\n * console.log('Debounced Query:', debouncedQuery());\n * });\n *\n * console.log('Setting query to \"a\"');\n * debouncedQuery.set('a');\n * // Output: Original Query: a\n *\n * // ...500ms later...\n * // Output: Debounced Query: a\n * ```\n */\nexport function debounce(source, opt) {\n const ms = opt?.ms ?? 0;\n const trigger = signal(false);\n let timeout;\n try {\n const destroyRef = opt?.destroyRef ?? inject(DestroyRef, { optional: true });\n destroyRef?.onDestroy(() => {\n if (timeout)\n clearTimeout(timeout);\n timeout = undefined;\n });\n }\n catch {\n // not in injection context & no destroyRef provided opting out of cleanup\n }\n const triggerFn = (afterClean) => {\n if (timeout)\n clearTimeout(timeout);\n afterClean();\n timeout = setTimeout(() => {\n trigger.update((c) => !c);\n }, ms);\n };\n const set = (value) => {\n triggerFn(() => source.set(value));\n };\n const update = (fn) => {\n triggerFn(() => source.update(fn));\n };\n const writable = toWritable(computed(() => {\n trigger();\n return untracked(source);\n }, opt), set, update);\n writable.original = source;\n return writable;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL2RlYm91bmNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBd0MzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixPQUFVLEVBQ1YsR0FBK0I7SUFFL0IsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLE1BQXlCLEVBQ3pCLEdBQStCO0lBRS9CLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXhCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5QixJQUFJLE9BQWtELENBQUM7SUFFdkQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQ2QsR0FBRyxFQUFFLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUQsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDekIsSUFBSSxPQUFPO2dCQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDBFQUEwRTtJQUM1RSxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFzQixFQUFFLEVBQUU7UUFDM0MsSUFBSSxPQUFPO1lBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLFVBQVUsRUFBRSxDQUFDO1FBQ2IsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUM7SUFFRixNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO1FBQ3ZCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFrQixFQUFFLEVBQUU7UUFDcEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQ3pCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDWixPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFDUCxHQUFHLEVBQ0gsTUFBTSxDQUNlLENBQUM7SUFDeEIsUUFBUSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFFM0IsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgY29tcHV0ZWQsXHJcbiAgdHlwZSBDcmVhdGVTaWduYWxPcHRpb25zLFxyXG4gIERlc3Ryb3lSZWYsXHJcbiAgaW5qZWN0LFxyXG4gIHR5cGUgU2lnbmFsLFxyXG4gIHNpZ25hbCxcclxuICB1bnRyYWNrZWQsXHJcbiAgdHlwZSBXcml0YWJsZVNpZ25hbCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdG9Xcml0YWJsZSB9IGZyb20gJy4vdG8td3JpdGFibGUnO1xyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgZGVib3VuY2VkIHdyaXRhYmxlIHNpZ25hbC5cclxuICogRXh0ZW5kcyBBbmd1bGFyJ3MgYENyZWF0ZVNpZ25hbE9wdGlvbnNgIHdpdGggYSBkZWJvdW5jZSB0aW1lIHNldHRpbmcuXHJcbiAqXHJcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIHNpZ25hbC5cclxuICovXHJcbmV4cG9ydCB0eXBlIENyZWF0ZURlYm91bmNlZE9wdGlvbnM8VD4gPSBDcmVhdGVTaWduYWxPcHRpb25zPFQ+ICYge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBkZWJvdW5jZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuIFNwZWNpZmllcyBob3cgbG9uZyB0byB3YWl0IGFmdGVyIHRoZVxyXG4gICAqIGxhc3QgYHNldGAgb3IgYHVwZGF0ZWAgY2FsbCBiZWZvcmUgdGhlIGRlYm91bmNlZCBzaWduYWwgcmVmbGVjdHMgdGhlIG5ldyB2YWx1ZS5cclxuICAgKi9cclxuICBtcz86IG51bWJlcjtcclxuICAvKipcclxuICAgKiBPcHRpb25hbCBgRGVzdHJveVJlZmAgdG8gY2xlYW4gdXAgdGhlIGRlYm91bmNlIHRpbWVyIHdoZW4gdGhlIHNpZ25hbCBpcyBkZXN0cm95ZWQuXHJcbiAgICogSWYgcHJvdmlkZWQsIHRoZSB0aW1lciB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgc2lnbmFsIGlzIGRlc3Ryb3llZC5cclxuICAgKiBJZiB0aGUgc2lnbmFsIGlzIGNhbGxlZCB3aXRoaW4gYSByZWFjdGl2ZSBjb250ZXh0IGEgRGVzdHJveVJlZiBpcyBpbmplY3RlZCBhdXRvbWF0aWNhbGx5LlxyXG4gICAqIElmIGl0IGlzIG5vdCBwcm92aWRlZCBvciBpbmplY3RlZCwgdGhlIHRpbWVyIHdpbGwgbm90IGJlIGNsZWFyZWQgYXV0b21hdGljYWxseS4uLndoaWNoIGlzIHVzdWFsbHkgZmluZSA6KVxyXG4gICAqL1xyXG4gIGRlc3Ryb3lSZWY/OiBEZXN0cm95UmVmO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbGl6ZWQgYFdyaXRhYmxlU2lnbmFsYCB3aG9zZSBwdWJsaWNseSByZWFkYWJsZSB2YWx1ZSB1cGRhdGVzIGFyZSBkZWJvdW5jZWQuXHJcbiAqXHJcbiAqIEl0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZywgbm9uLWRlYm91bmNlZCBzaWduYWwgdmlhIHRoZSBgb3JpZ2luYWxgIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBzaWduYWwuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBEZWJvdW5jZWRTaWduYWw8VD4gPSBXcml0YWJsZVNpZ25hbDxUPiAmIHtcclxuICAvKipcclxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwsIGlubmVyIGBXcml0YWJsZVNpZ25hbGAuXHJcbiAgICogVGhpcyBzaWduYWwncyB2YWx1ZSBpcyB1cGRhdGVkICppbW1lZGlhdGVseSogdXBvbiBjYWxscyB0byBgc2V0YCBvciBgdXBkYXRlYFxyXG4gICAqIG9uIHRoZSBwYXJlbnQgYERlYm91bmNlZFNpZ25hbGAuIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHRoZSBsYXRlc3QgdmFsdWVcclxuICAgKiB3aXRob3V0IHRoZSBkZWJvdW5jZSBkZWxheS5cclxuICAgKi9cclxuICBvcmlnaW5hbDogU2lnbmFsPFQ+O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuZCBkZWJvdW5jZXMgYSBuZXcgYFdyaXRhYmxlU2lnbmFsYCBpbiBvbmUgc3RlcC5cclxuICpcclxuICogQHNlZSB7ZGVib3VuY2V9IGZvciB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB2YWx1ZSB0aGUgc2lnbmFsIGhvbGRzLlxyXG4gKiBAcGFyYW0gaW5pdGlhbCBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2lnbmFsLlxyXG4gKiBAcGFyYW0gb3B0IE9wdGlvbnMgZm9yIHNpZ25hbCBjcmVhdGlvbiwgaW5jbHVkaW5nIGRlYm91bmNlIHRpbWUgYG1zYC5cclxuICogQHJldHVybnMgQSBgRGVib3VuY2VkU2lnbmFsPFQ+YCBpbnN0YW5jZS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogLy8gVGhlIGV4aXN0aW5nIGV4YW1wbGUgcmVtYWlucyBwZXJmZWN0IGhlcmUuXHJcbiAqIGNvbnN0IHF1ZXJ5ID0gZGVib3VuY2VkKCcnLCB7IG1zOiA1MDAgfSk7XHJcbiAqIGVmZmVjdCgoKSA9PiBjb25zb2xlLmxvZygnRGVib3VuY2VkIFF1ZXJ5OicsIHF1ZXJ5KCkpKTtcclxuICogcXVlcnkuc2V0KCdhYmMnKTtcclxuICogLy8gLi4uNTAwbXMgbGF0ZXIuLi5cclxuICogLy8gT3V0cHV0OiBEZWJvdW5jZWQgUXVlcnk6IGFiY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlZDxUPihcclxuICBpbml0aWFsOiBULFxyXG4gIG9wdD86IENyZWF0ZURlYm91bmNlZE9wdGlvbnM8VD4sXHJcbik6IERlYm91bmNlZFNpZ25hbDxUPiB7XHJcbiAgcmV0dXJuIGRlYm91bmNlKHNpZ25hbChpbml0aWFsLCBvcHQpLCBvcHQpO1xyXG59XHJcblxyXG4vKipcclxuICogV3JhcHMgYW4gZXhpc3RpbmcgYFdyaXRhYmxlU2lnbmFsYCB0byBjcmVhdGUgYSBuZXcgb25lIHdob3NlIHJlYWRhYmxlIHZhbHVlIGlzIGRlYm91bmNlZC5cclxuICpcclxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhdm9pZHMgdXNpbmcgYGVmZmVjdGAgYnkgcGFpcmluZyBhIHRyaWdnZXIgc2lnbmFsIHdpdGggYW4gYHVudHJhY2tlZGBcclxuICogcmVhZCBvZiB0aGUgc291cmNlIHNpZ25hbCB0byBjb250cm9sIHdoZW4gdGhlIGRlYm91bmNlZCB2YWx1ZSBpcyByZS1ldmFsdWF0ZWQuXHJcbiAqXHJcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIHRoZSBzaWduYWwgaG9sZHMuXHJcbiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBgV3JpdGFibGVTaWduYWxgIHRvIHdyYXAuIFdyaXRlcyBhcmUgYXBwbGllZCB0byB0aGlzIHNpZ25hbCBpbW1lZGlhdGVseS5cclxuICogQHBhcmFtIG9wdCBPcHRpb25zIGZvciBkZWJvdW5jaW5nLCBpbmNsdWRpbmcgZGVib3VuY2UgdGltZSBgbXNgIGFuZCBhbiBvcHRpb25hbCBgRGVzdHJveVJlZmAuXHJcbiAqIEByZXR1cm5zIEEgbmV3IGBEZWJvdW5jZWRTaWduYWw8VD5gIHdob3NlIHJlYWQgdmFsdWUgaXMgZGVib3VuY2VkLiBUaGUgYC5vcmlnaW5hbGAgcHJvcGVydHlcclxuICogb2YgdGhlIHJldHVybmVkIHNpZ25hbCBpcyBhIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBwcm92aWRlZCBgc291cmNlYCBzaWduYWwuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGltcG9ydCB7IHNpZ25hbCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAqXHJcbiAqIC8vIDEuIENyZWF0ZSBhIHN0YW5kYXJkIHNvdXJjZSBzaWduYWwuXHJcbiAqIGNvbnN0IHNvdXJjZVF1ZXJ5ID0gc2lnbmFsKCcnKTtcclxuICpcclxuICogLy8gMi4gQ3JlYXRlIGEgZGVib3VuY2VkIHZlcnNpb24gb2YgaXQuXHJcbiAqIGNvbnN0IGRlYm91bmNlZFF1ZXJ5ID0gZGVib3VuY2Uoc291cmNlUXVlcnksIHsgbXM6IDUwMCB9KTtcclxuICpcclxuICogLy8gVGhpcyBlZmZlY3QgdHJhY2tzIHRoZSBvcmlnaW5hbCBzaWduYWwgYW5kIHJ1bnMgaW1tZWRpYXRlbHkuXHJcbiAqIGVmZmVjdCgoKSA9PiB7XHJcbiAqIGNvbnNvbGUubG9nKCdPcmlnaW5hbCBRdWVyeTonLCBkZWJvdW5jZWRRdWVyeS5vcmlnaW5hbCgpKTtcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIFRoaXMgZWZmZWN0IHRyYWNrcyB0aGUgZGVib3VuY2VkIHNpZ25hbCBhbmQgcnVucyBhZnRlciB0aGUgZGVsYXkuXHJcbiAqIGVmZmVjdCgoKSA9PiB7XHJcbiAqIGNvbnNvbGUubG9nKCdEZWJvdW5jZWQgUXVlcnk6JywgZGVib3VuY2VkUXVlcnkoKSk7XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBjb25zb2xlLmxvZygnU2V0dGluZyBxdWVyeSB0byBcImFcIicpO1xyXG4gKiBkZWJvdW5jZWRRdWVyeS5zZXQoJ2EnKTtcclxuICogLy8gT3V0cHV0OiBPcmlnaW5hbCBRdWVyeTogYVxyXG4gKlxyXG4gKiAvLyAuLi41MDBtcyBsYXRlci4uLlxyXG4gKiAvLyBPdXRwdXQ6IERlYm91bmNlZCBRdWVyeTogYVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZTxUPihcclxuICBzb3VyY2U6IFdyaXRhYmxlU2lnbmFsPFQ+LFxyXG4gIG9wdD86IENyZWF0ZURlYm91bmNlZE9wdGlvbnM8VD4sXHJcbik6IERlYm91bmNlZFNpZ25hbDxUPiB7XHJcbiAgY29uc3QgbXMgPSBvcHQ/Lm1zID8/IDA7XHJcblxyXG4gIGNvbnN0IHRyaWdnZXIgPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBkZXN0cm95UmVmID1cclxuICAgICAgb3B0Py5kZXN0cm95UmVmID8/IGluamVjdChEZXN0cm95UmVmLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG5cclxuICAgIGRlc3Ryb3lSZWY/Lm9uRGVzdHJveSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9IGNhdGNoIHtcclxuICAgIC8vIG5vdCBpbiBpbmplY3Rpb24gY29udGV4dCAmIG5vIGRlc3Ryb3lSZWYgcHJvdmlkZWQgb3B0aW5nIG91dCBvZiBjbGVhbnVwXHJcbiAgfVxyXG5cclxuICBjb25zdCB0cmlnZ2VyRm4gPSAoYWZ0ZXJDbGVhbjogKCkgPT4gdm9pZCkgPT4ge1xyXG4gICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICAgIGFmdGVyQ2xlYW4oKTtcclxuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdHJpZ2dlci51cGRhdGUoKGMpID0+ICFjKTtcclxuICAgIH0sIG1zKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBzZXQgPSAodmFsdWU6IFQpID0+IHtcclxuICAgIHRyaWdnZXJGbigoKSA9PiBzb3VyY2Uuc2V0KHZhbHVlKSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXBkYXRlID0gKGZuOiAocHJldjogVCkgPT4gVCkgPT4ge1xyXG4gICAgdHJpZ2dlckZuKCgpID0+IHNvdXJjZS51cGRhdGUoZm4pKTtcclxuICB9O1xyXG5cclxuICBjb25zdCB3cml0YWJsZSA9IHRvV3JpdGFibGUoXHJcbiAgICBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIHRyaWdnZXIoKTtcclxuICAgICAgcmV0dXJuIHVudHJhY2tlZChzb3VyY2UpO1xyXG4gICAgfSwgb3B0KSxcclxuICAgIHNldCxcclxuICAgIHVwZGF0ZSxcclxuICApIGFzIERlYm91bmNlZFNpZ25hbDxUPjtcclxuICB3cml0YWJsZS5vcmlnaW5hbCA9IHNvdXJjZTtcclxuXHJcbiAgcmV0dXJuIHdyaXRhYmxlO1xyXG59XHJcbiJdfQ==","import { signal, } from '@angular/core';\nconst { is } = Object;\nexport function mutable(initial, opt) {\n const baseEqual = opt?.equal ?? is;\n let trigger = false;\n const equal = (a, b) => {\n if (trigger)\n return false;\n return baseEqual(a, b);\n };\n const sig = signal(initial, {\n ...opt,\n equal,\n });\n const internalUpdate = sig.update;\n sig.mutate = (updater) => {\n trigger = true;\n internalUpdate(updater);\n trigger = false;\n };\n sig.inline = (updater) => {\n sig.mutate((prev) => {\n updater(prev);\n return prev;\n });\n };\n return sig;\n}\n/**\n * Type guard function to check if a given `WritableSignal` is a `MutableSignal`. This is useful\n * for situations where you need to conditionally use the `mutate` or `inline` methods.\n *\n * @typeParam T - The type of the signal's value (optional, defaults to `any`).\n * @param value - The `WritableSignal` to check.\n * @returns `true` if the signal is a `MutableSignal`, `false` otherwise.\n *\n * @example\n * const mySignal = signal(0);\n * const myMutableSignal = mutable(0);\n *\n * if (isMutable(mySignal)) {\n * mySignal.mutate(x => x + 1); // This would cause a type error, as mySignal is not a MutableSignal.\n * }\n *\n * if (isMutable(myMutableSignal)) {\n * myMutableSignal.mutate(x => x + 1); // This is safe.\n * }\n */\nexport function isMutable(value) {\n return 'mutate' in value && typeof value.mutate === 'function';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ByaW1pdGl2ZXMvc3JjL2xpYi9tdXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEdBSVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQWlGdEIsTUFBTSxVQUFVLE9BQU8sQ0FDckIsT0FBVyxFQUNYLEdBQTRCO0lBRTVCLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ25DLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVwQixNQUFNLEtBQUssR0FBbUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckQsSUFBSSxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUIsT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBZ0IsT0FBTyxFQUFFO1FBQ3pDLEdBQUcsR0FBRztRQUNOLEtBQUs7S0FDTixDQUFxQixDQUFDO0lBRXZCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFFbEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDZixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDdkIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLEtBQXdCO0lBRXhCLE9BQU8sUUFBUSxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIHNpZ25hbCxcclxuICB0eXBlIENyZWF0ZVNpZ25hbE9wdGlvbnMsXHJcbiAgdHlwZSBWYWx1ZUVxdWFsaXR5Rm4sXHJcbiAgdHlwZSBXcml0YWJsZVNpZ25hbCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmNvbnN0IHsgaXMgfSA9IE9iamVjdDtcclxuXHJcbi8qKlxyXG4gKiBBIGBNdXRhYmxlU2lnbmFsYCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBgV3JpdGFibGVTaWduYWxgIHRoYXQgYWxsb3dzIGZvciBpbi1wbGFjZSBtdXRhdGlvbiBvZiBpdHMgdmFsdWUuXHJcbiAqIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBgc2V0YCBhbmQgYHVwZGF0ZWAgbWV0aG9kcywgaXQgcHJvdmlkZXMgYSBgbXV0YXRlYCBtZXRob2QuICBUaGlzIGlzIHVzZWZ1bFxyXG4gKiBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdoZW4gZGVhbGluZyB3aXRoIGNvbXBsZXggb2JqZWN0cyBvciBhcnJheXMsIGFzIGl0IGF2b2lkcyB1bm5lY2Vzc2FyeVxyXG4gKiBvYmplY3QgY29weWluZy5cclxuICpcclxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdmFsdWUgaGVsZCBieSB0aGUgc2lnbmFsLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgTXV0YWJsZVNpZ25hbDxUPiA9IFdyaXRhYmxlU2lnbmFsPFQ+ICYge1xyXG4gIC8qKlxyXG4gICAqIE11dGF0ZXMgdGhlIHNpZ25hbCdzIHZhbHVlIGluLXBsYWNlLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGB1cGRhdGVgLCBidXQgaXQncyBvcHRpbWl6ZWQgZm9yXHJcbiAgICogc2NlbmFyaW9zIHdoZXJlIHlvdSB3YW50IHRvIG1vZGlmeSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRpcmVjdGx5IHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB1cGRhdGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBjdXJyZW50IHZhbHVlIGFzIGlucHV0IGFuZCBtb2RpZmllcyBpdCBkaXJlY3RseS5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY29uc3QgbXlBcnJheSA9IG11dGFibGUoWzEsIDIsIDNdKTtcclxuICAgKiBteUFycmF5Lm11dGF0ZSgoYXJyKSA9PiB7XHJcbiAgICogIGFyci5wdXNoKDQpO1xyXG4gICAqICByZXR1cm4gYXJyO1xyXG4gICAqIH0pOyAvLyBteUFycmF5KCkgbm93IHJldHVybnMgWzEsIDIsIDMsIDRdXHJcbiAgICovXHJcbiAgbXV0YXRlOiBXcml0YWJsZVNpZ25hbDxUPlsndXBkYXRlJ107XHJcblxyXG4gIC8qKlxyXG4gICAqIE11dGF0ZXMgdGhlIHNpZ25hbCdzIHZhbHVlIGluLXBsYWNlLCBzaW1pbGFyIHRvIGBtdXRhdGVgLCBidXQgd2l0aCBhIHZvaWQtcmV0dXJuaW5nIHZhbHVlIGluIHVwZGF0ZXJcclxuICAgKiBmdW5jdGlvbi4gVGhpcyBmdXJ0aGVyIGVtcGhhc2l6ZXMgdGhhdCB0aGUgbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlubGluZSwgaW1wcm92aW5nIHJlYWRhYmlsaXR5XHJcbiAgICogaW4gc29tZSBjYXNlcy5cclxuICAgKiBAcGFyYW0gdXBkYXRlciAtIEZ1bmN0aW9uIHRvIGNoYW5nZSB0byB0aGUgY3VycmVudCB2YWx1ZVxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY29uc3QgbXlPYmplY3QgPSBtdXRhYmxlKHsgYTogMSwgYjogMiB9KTtcclxuICAgKiBteU9iamVjdC5pbmxpbmUoKG9iaikgPT4gKG9iai5hID0gMykpOyAvLyBteU9iamVjdCgpIG5vdyByZXR1cm5zIHsgYTogMywgYjogMiB9XHJcbiAgICovXHJcbiAgaW5saW5lOiAodXBkYXRlcjogKHZhbHVlOiBUKSA9PiB2b2lkKSA9PiB2b2lkO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBgTXV0YWJsZVNpZ25hbGAuIFRoaXMgZnVuY3Rpb24gb3ZlcmxvYWRzIHRoZSBzdGFuZGFyZCBgc2lnbmFsYCBmdW5jdGlvbiB0byBwcm92aWRlXHJcbiAqIHRoZSBhZGRpdGlvbmFsIGBtdXRhdGVgIGFuZCBgaW5saW5lYCBtZXRob2RzLlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIFQgVGhlIHR5cGUgb2YgdmFsdWUgaGVsZCBieSB0aGUgc2lnbmFsLlxyXG4gKiBAcGFyYW0gaW5pdGlhbCBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2lnbmFsLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBzaWduYWwgb3B0aW9ucywgaW5jbHVkaW5nIGEgY3VzdG9tIGBlcXVhbGAgZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIEEgYE11dGFibGVTaWduYWxgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiAjIyMgSW1wb3J0YW50IE5vdGUgb24gYGNvbXB1dGVkYCBTaWduYWxzXHJcbiAqXHJcbiAqIFdoZW4gY3JlYXRpbmcgYSBgY29tcHV0ZWRgIHNpZ25hbCB0aGF0IGRlcml2ZXMgYSBub24tcHJpbWl0aXZlIHZhbHVlIChlLmcuLCBhbiBvYmplY3Qgb3IgYXJyYXkpXHJcbiAqIGZyb20gYSBgbXV0YWJsZWAgc2lnbmFsLCB5b3UgKiptdXN0KiogcHJvdmlkZSB0aGUgYHsgZXF1YWw6IGZhbHNlIH1gIG9wdGlvbiB0byB0aGUgYGNvbXB1dGVkYFxyXG4gKiBmdW5jdGlvbi5cclxuICpcclxuICogVGhpcyBpcyBiZWNhdXNlIGEgYC5tdXRhdGUoKWAgY2FsbCBub3RpZmllcyBpdHMgZGVwZW5kZW50cyB0aGF0IGl0IGhhcyBjaGFuZ2VkLCBidXQgaWYgdGhlXHJcbiAqIHJlZmVyZW5jZSB0byBhIGRlcml2ZWQgb2JqZWN0IGhhc24ndCBjaGFuZ2VkLCB0aGUgYGNvbXB1dGVkYCBzaWduYWwgd2lsbCBub3QgdHJpZ2dlciBpdHNcclxuICogb3duIGRlcGVuZGVudHMgYnkgZGVmYXVsdC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3Qgc3RhdGUgPSBtdXRhYmxlKHsgdXNlcjogeyBuYW1lOiAnSm9obicgfSwgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkgfSk7XHJcbiAqXHJcbiAqIC8vIOKchSBDT1JSRUNUOiBEZXJpdmluZyBhIHByaW1pdGl2ZSB2YWx1ZSB3b3JrcyBhcyBleHBlY3RlZC5cclxuICogY29uc3QgbmFtZSA9IGNvbXB1dGVkKCgpID0+IHN0YXRlKCkudXNlci5uYW1lKTtcclxuICpcclxuICogLy8g4p2MIElOQ09SUkVDVDogVGhpcyB3aWxsIG5vdCB1cGRhdGUgcmVsaWFibHkgYWZ0ZXIgdGhlIGZpcnN0IGNoYW5nZS5cclxuICogY29uc3QgdXNlck9iamVjdCA9IGNvbXB1dGVkKCgpID0+IHN0YXRlKCkudXNlcik7XHJcbiAqXHJcbiAqIC8vIOKchSBDT1JSRUNUOiBGb3Igb2JqZWN0IGRlcml2YXRpb25zLCBgZXF1YWw6IGZhbHNlYCBpcyByZXF1aXJlZC5cclxuICogY29uc3QgdXNlck9iamVjdEZpeGVkID0gY29tcHV0ZWQoKCkgPT4gc3RhdGUoKS51c2VyLCB7IGVxdWFsOiBmYWxzZSB9KTtcclxuICpcclxuICogLy8gVGhpcyBtdXRhdGlvbiB3aWxsIG5vdyBjb3JyZWN0bHkgdHJpZ2dlciBlZmZlY3RzIGRlcGVuZGluZyBvbiBgdXNlck9iamVjdEZpeGVkYC5cclxuICogc3RhdGUubXV0YXRlKHMgPT4gcy5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkpO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtdXRhYmxlPFQ+KCk6IE11dGFibGVTaWduYWw8VCB8IHVuZGVmaW5lZD47XHJcbmV4cG9ydCBmdW5jdGlvbiBtdXRhYmxlPFQ+KGluaXRpYWw6IFQpOiBNdXRhYmxlU2lnbmFsPFQ+O1xyXG5leHBvcnQgZnVuY3Rpb24gbXV0YWJsZTxUPihcclxuICBpbml0aWFsOiBULFxyXG4gIG9wdD86IENyZWF0ZVNpZ25hbE9wdGlvbnM8VD4sXHJcbik6IE11dGFibGVTaWduYWw8VD47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbXV0YWJsZTxUPihcclxuICBpbml0aWFsPzogVCxcclxuICBvcHQ/OiBDcmVhdGVTaWduYWxPcHRpb25zPFQ+LFxyXG4pOiBNdXRhYmxlU2lnbmFsPFQ+IHtcclxuICBjb25zdCBiYXNlRXF1YWwgPSBvcHQ/LmVxdWFsID8/IGlzO1xyXG4gIGxldCB0cmlnZ2VyID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0IGVxdWFsOiBWYWx1ZUVxdWFsaXR5Rm48VCB8IHVuZGVmaW5lZD4gPSAoYSwgYikgPT4ge1xyXG4gICAgaWYgKHRyaWdnZXIpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiBiYXNlRXF1YWwoYSwgYik7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc2lnID0gc2lnbmFsPFQgfCB1bmRlZmluZWQ+KGluaXRpYWwsIHtcclxuICAgIC4uLm9wdCxcclxuICAgIGVxdWFsLFxyXG4gIH0pIGFzIE11dGFibGVTaWduYWw8VD47XHJcblxyXG4gIGNvbnN0IGludGVybmFsVXBkYXRlID0gc2lnLnVwZGF0ZTtcclxuXHJcbiAgc2lnLm11dGF0ZSA9ICh1cGRhdGVyKSA9PiB7XHJcbiAgICB0cmlnZ2VyID0gdHJ1ZTtcclxuICAgIGludGVybmFsVXBkYXRlKHVwZGF0ZXIpO1xyXG4gICAgdHJpZ2dlciA9IGZhbHNlO1xyXG4gIH07XHJcblxyXG4gIHNpZy5pbmxpbmUgPSAodXBkYXRlcikgPT4ge1xyXG4gICAgc2lnLm11dGF0ZSgocHJldikgPT4ge1xyXG4gICAgICB1cGRhdGVyKHByZXYpO1xyXG4gICAgICByZXR1cm4gcHJldjtcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiBzaWc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUeXBlIGd1YXJkIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgZ2l2ZW4gYFdyaXRhYmxlU2lnbmFsYCBpcyBhIGBNdXRhYmxlU2lnbmFsYC4gIFRoaXMgaXMgdXNlZnVsXHJcbiAqIGZvciBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIHRvIGNvbmRpdGlvbmFsbHkgdXNlIHRoZSBgbXV0YXRlYCBvciBgaW5saW5lYCBtZXRob2RzLlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgc2lnbmFsJ3MgdmFsdWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBgYW55YCkuXHJcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBgV3JpdGFibGVTaWduYWxgIHRvIGNoZWNrLlxyXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNpZ25hbCBpcyBhIGBNdXRhYmxlU2lnbmFsYCwgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGNvbnN0IG15U2lnbmFsID0gc2lnbmFsKDApO1xyXG4gKiBjb25zdCBteU11dGFibGVTaWduYWwgPSBtdXRhYmxlKDApO1xyXG4gKlxyXG4gKiBpZiAoaXNNdXRhYmxlKG15U2lnbmFsKSkge1xyXG4gKiAgIG15U2lnbmFsLm11dGF0ZSh4ID0+IHggKyAxKTsgLy8gVGhpcyB3b3VsZCBjYXVzZSBhIHR5cGUgZXJyb3IsIGFzIG15U2lnbmFsIGlzIG5vdCBhIE11dGFibGVTaWduYWwuXHJcbiAqIH1cclxuICpcclxuICogaWYgKGlzTXV0YWJsZShteU11dGFibGVTaWduYWwpKSB7XHJcbiAqICAgbXlNdXRhYmxlU2lnbmFsLm11dGF0ZSh4ID0+IHggKyAxKTsgLy8gVGhpcyBpcyBzYWZlLlxyXG4gKiB9XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNNdXRhYmxlPFQgPSBhbnk+KFxyXG4gIHZhbHVlOiBXcml0YWJsZVNpZ25hbDxUPixcclxuKTogdmFsdWUgaXMgTXV0YWJsZVNpZ25hbDxUPiB7XHJcbiAgcmV0dXJuICdtdXRhdGUnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tdXRhdGUgPT09ICdmdW5jdGlvbic7XHJcbn1cclxuIl19","import { computed, signal, untracked, } from '@angular/core';\nimport { isMutable } from './mutable';\nimport { toWritable } from './to-writable';\nexport function derived(source, optOrKey, opt) {\n const isArray = Array.isArray(untracked(source)) && typeof optOrKey === 'number';\n const from = typeof optOrKey === 'object' ? optOrKey.from : (v) => v[optOrKey];\n const onChange = typeof optOrKey === 'object'\n ? optOrKey.onChange\n : isArray\n ? isMutable(source)\n ? (next) => {\n source.mutate((cur) => {\n cur[optOrKey] = next;\n return cur;\n });\n }\n : (next) => {\n source.update((cur) => {\n const newArray = [...cur];\n newArray[optOrKey] = next;\n return newArray;\n });\n }\n : isMutable(source)\n ? (next) => {\n source.mutate((cur) => {\n cur[optOrKey] = next;\n return cur;\n });\n }\n : (next) => {\n source.update((cur) => ({ ...cur, [optOrKey]: next }));\n };\n const rest = typeof optOrKey === 'object' ? optOrKey : opt;\n let baseEqual = rest?.equal ?? Object.is;\n let trigger = false;\n const equal = isMutable(source)\n ? (a, b) => {\n if (trigger)\n return false;\n return baseEqual(a, b);\n }\n : baseEqual;\n const sig = toWritable(computed(() => from(source()), { ...rest, equal }), (newVal) => onChange(newVal));\n sig.from = from;\n if (isMutable(source)) {\n sig.mutate = (updater) => {\n trigger = true;\n sig.update(updater);\n trigger = false;\n };\n sig.inline = (updater) => {\n sig.mutate((prev) => {\n updater(prev);\n return prev;\n });\n };\n }\n return sig;\n}\n/**\n * Creates a \"fake\" `DerivedSignal` from a simple value. This is useful for creating\n * `FormControlSignal` instances that are not directly derived from another signal.\n * The returned signal's `from` function will always return the initial value.\n *\n * @typeParam T - This type parameter is not used in the implementation but is kept for type compatibility with `DerivedSignal`.\n * @typeParam U - The type of the signal's value.\n * @param initial - The initial value of the signal.\n * @returns A `DerivedSignal` instance.\n * @internal\n */\nexport function toFakeDerivation(initial) {\n const sig = signal(initial);\n sig.from = () => initial;\n return sig;\n}\n/**\n * Creates a \"fake\" `DerivedSignal` from an existing `WritableSignal`. This is useful\n * for treating a regular `WritableSignal` as a `DerivedSignal` without changing its behavior.\n * The returned signal's `from` function returns the current value of signal, using `untracked`.\n *\n * @typeParam T - This type parameter is not used in the implementation but is kept for type compatibility with `DerivedSignal`.\n * @typeParam U - The type of the signal's value.\n * @param initial - The existing `WritableSignal`.\n * @returns A `DerivedSignal` instance.\n * @internal\n */\nexport function toFakeSignalDerivation(initial) {\n const sig = initial;\n sig.from = () => untracked(initial);\n return sig;\n}\n/**\n * Type guard function to check if a given `WritableSignal` is a `DerivedSignal`.\n *\n * @typeParam T - The type of the source signal's value (optional, defaults to `any`).\n * @typeParam U - The type of the derived signal's value (optional, defaults to `any`).\n * @param sig - The `WritableSignal` to check.\n * @returns `true` if the signal is a `DerivedSignal`, `false` otherwise.\n */\nexport function isDerivation(sig) {\n return 'from' in sig;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ByaW1pdGl2ZXMvc3JjL2xpYi9kZXJpdmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBRVIsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsU0FBUyxFQUFpQixNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBcUozQyxNQUFNLFVBQVUsT0FBTyxDQUNyQixNQUE0QyxFQUM1QyxRQUE4QyxFQUM5QyxHQUE0QjtJQUU1QixNQUFNLE9BQU8sR0FDWCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQztJQUVuRSxNQUFNLElBQUksR0FDUixPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFNLENBQUM7SUFFNUUsTUFBTSxRQUFRLEdBQ1osT0FBTyxRQUFRLEtBQUssUUFBUTtRQUMxQixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDbkIsQ0FBQyxDQUFDLE9BQU87WUFDUCxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDakIsQ0FBQyxDQUFDLENBQUMsSUFBTyxFQUFFLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNuQixHQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUNoQyxPQUFPLEdBQVEsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FB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Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLE9BQTBCO0lBRTFCLE1BQU0sR0FBRyxHQUFHLE9BQThCLENBQUM7SUFDM0MsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQXNCO0lBRXRCLE9BQU8sTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBjb21wdXRlZCxcclxuICBDcmVhdGVTaWduYWxPcHRpb25zLFxyXG4gIHNpZ25hbCxcclxuICB1bnRyYWNrZWQsXHJcbiAgVmFsdWVFcXVhbGl0eUZuLFxyXG4gIHR5cGUgV3JpdGFibGVTaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB0eXBlIHsgVW5rbm93bk9iamVjdCB9IGZyb20gJ0BtbXN0YWNrL29iamVjdCc7XHJcbmltcG9ydCB7IGlzTXV0YWJsZSwgTXV0YWJsZVNpZ25hbCB9IGZyb20gJy4vbXV0YWJsZSc7XHJcbmltcG9ydCB7IHRvV3JpdGFibGUgfSBmcm9tICcuL3RvLXdyaXRhYmxlJztcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIGRlcml2ZWQgc2lnbmFsIHVzaW5nIHRoZSBmdWxsIGBkZXJpdmVkYCBmdW5jdGlvbiBzaWduYXR1cmUuXHJcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBzb3VyY2Ugc2lnbmFsJ3MgdmFsdWUgKHBhcmVudCkuXHJcbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIHRoZSBkZXJpdmVkIHNpZ25hbCdzIHZhbHVlIChjaGlsZCkuXHJcbiAqL1xyXG50eXBlIENyZWF0ZURlcml2ZWRPcHRpb25zPFQsIFU+ID0gQ3JlYXRlU2lnbmFsT3B0aW9uczxVPiAmIHtcclxuICAvKipcclxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgZXh0cmFjdHMgdGhlIGRlcml2ZWQgdmFsdWUgKGBVYCkgZnJvbSB0aGUgc291cmNlIHNpZ25hbCdzIHZhbHVlIChgVGApLlxyXG4gICAqL1xyXG4gIGZyb206ICh2OiBUKSA9PiBVO1xyXG4gIC8qKlxyXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIHRoZSBzb3VyY2Ugc2lnbmFsJ3MgdmFsdWUgKGBUYCkgd2hlbiB0aGUgZGVyaXZlZCBzaWduYWwncyB2YWx1ZSAoYFVgKSBjaGFuZ2VzLlxyXG4gICAqIFRoaXMgZXN0YWJsaXNoZXMgdGhlIHR3by13YXkgYmluZGluZy5cclxuICAgKi9cclxuICBvbkNoYW5nZTogKG5ld1ZhbHVlOiBVKSA9PiB2b2lkO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgYFdyaXRhYmxlU2lnbmFsYCB0aGF0IGRlcml2ZXMgaXRzIHZhbHVlIGZyb20gYW5vdGhlciBgV3JpdGFibGVTaWduYWxgICh0aGUgXCJzb3VyY2VcIiBzaWduYWwpLlxyXG4gKiBJdCBwcm92aWRlcyB0d28td2F5IGJpbmRpbmc6IGNoYW5nZXMgdG8gdGhlIHNvdXJjZSBzaWduYWwgdXBkYXRlIHRoZSBkZXJpdmVkIHNpZ25hbCwgYW5kXHJcbiAqIGNoYW5nZXMgdG8gdGhlIGRlcml2ZWQgc2lnbmFsIHVwZGF0ZSB0aGUgc291cmNlIHNpZ25hbC5cclxuICpcclxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHNvdXJjZSBzaWduYWwncyB2YWx1ZSAocGFyZW50KS5cclxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgdGhlIGRlcml2ZWQgc2lnbmFsJ3MgdmFsdWUgKGNoaWxkKS5cclxuICovXHJcbmV4cG9ydCB0eXBlIERlcml2ZWRTaWduYWw8VCwgVT4gPSBXcml0YWJsZVNpZ25hbDxVPiAmIHtcclxuICAvKipcclxuICAgKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZXJpdmUgdGhlIGRlcml2ZWQgc2lnbmFsJ3MgdmFsdWUgZnJvbSB0aGUgc291cmNlIHNpZ25hbCdzIHZhbHVlLlxyXG4gICAqIFRoaXMgaXMgcHJpbWFyaWx5IGZvciBpbnRlcm5hbCB1c2UgYW5kIGludHJvc3BlY3Rpb24uXHJcbiAgICovXHJcbiAgZnJvbTogKHY6IFQpID0+IFU7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGBEZXJpdmVkU2lnbmFsYCB0aGF0IGRlcml2ZXMgaXRzIHZhbHVlIGZyb20gYW5vdGhlciBgV3JpdGFibGVTaWduYWxgLlxyXG4gKiBUaGlzIG92ZXJsb2FkIHByb3ZpZGVzIHRoZSBtb3N0IGZsZXhpYmlsaXR5LCBhbGxvd2luZyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYGZyb21gIGFuZCBgb25DaGFuZ2VgIGZ1bmN0aW9ucy5cclxuICpcclxuICogQHR5cGVQYXJhbSBUIFRoZSB0eXBlIG9mIHRoZSBzb3VyY2Ugc2lnbmFsJ3MgdmFsdWUuXHJcbiAqIEB0eXBlUGFyYW0gVSBUaGUgdHlwZSBvZiB0aGUgZGVyaXZlZCBzaWduYWwncyB2YWx1ZS5cclxuICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGBXcml0YWJsZVNpZ25hbGAuXHJcbiAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgZnJvbWAgYW5kIGBvbkNoYW5nZWAgZnVuY3Rpb25zLCBhbmQgb3B0aW9uYWwgc2lnbmFsIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIEEgYERlcml2ZWRTaWduYWxgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCB1c2VyID0gc2lnbmFsKHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0pO1xyXG4gKiBjb25zdCBuYW1lID0gZGVyaXZlZCh1c2VyLCB7XHJcbiAqIGZyb206ICh1KSA9PiB1Lm5hbWUsXHJcbiAqIG9uQ2hhbmdlOiAobmV3TmFtZSkgPT4gdXNlci51cGRhdGUoKHUpID0+ICh7IC4uLnUsIG5hbWU6IG5ld05hbWUgfSkpLFxyXG4gKiB9KTtcclxuICpcclxuICogbmFtZS5zZXQoJ0phbmUnKTsgLy8gVXBkYXRlcyB0aGUgb3JpZ2luYWwgc2lnbmFsXHJcbiAqIGNvbnNvbGUubG9nKHVzZXIoKS5uYW1lKTsgLy8gT3V0cHV0czogSmFuZVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVkPFQsIFU+KFxyXG4gIHNvdXJjZTogV3JpdGFibGVTaWduYWw8VD4sXHJcbiAgb3B0OiBDcmVhdGVEZXJpdmVkT3B0aW9uczxULCBVPixcclxuKTogRGVyaXZlZFNpZ25hbDxULCBVPjtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgYERlcml2ZWRTaWduYWxgIHRoYXQgZGVyaXZlcyBhIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0IGhlbGQgYnkgdGhlIHNvdXJjZSBzaWduYWwuXHJcbiAqIFRoaXMgb3ZlcmxvYWQgaXMgYSBjb252ZW5pZW50IHNob3J0aGFuZCBmb3IgYWNjZXNzaW5nIG9iamVjdCBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIFQgVGhlIHR5cGUgb2YgdGhlIHNvdXJjZSBzaWduYWwncyB2YWx1ZSAobXVzdCBiZSBhbiBvYmplY3QpLlxyXG4gKiBAdHlwZVBhcmFtIFRLZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZGVyaXZlLlxyXG4gKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgYFdyaXRhYmxlU2lnbmFsYCAoaG9sZGluZyBhbiBvYmplY3QpLlxyXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGRlcml2ZS5cclxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgc2lnbmFsIG9wdGlvbnMgZm9yIHRoZSBkZXJpdmVkIHNpZ25hbC5cclxuICogQHJldHVybnMgQSBgRGVyaXZlZFNpZ25hbGAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IHVzZXIgPSBzaWduYWwoeyBuYW1lOiAnSm9obicsIGFnZTogMzAgfSk7XHJcbiAqIGNvbnN0IG5hbWUgPSBkZXJpdmVkKHVzZXIsICduYW1lJyk7XHJcbiAqXHJcbiAqIGNvbnNvbGUubG9nKG5hbWUoKSk7IC8vIE91dHB1dHM6IEpvaG5cclxuICpcclxuICogLy8gVXBkYXRlIHRoZSBkZXJpdmVkIHNpZ25hbCwgd2hpY2ggYWxzbyB1cGRhdGVzIHRoZSBzb3VyY2VcclxuICogbmFtZS5zZXQoJ0phbmUnKTtcclxuICpcclxuICogY29uc29sZS5sb2codXNlcigpLm5hbWUpOyAvLyBPdXRwdXRzOiBKYW5lXHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZWQ8VCBleHRlbmRzIFVua25vd25PYmplY3QsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPihcclxuICBzb3VyY2U6IFdyaXRhYmxlU2lnbmFsPFQ+LFxyXG4gIGtleTogVEtleSxcclxuICBvcHQ/OiBDcmVhdGVTaWduYWxPcHRpb25zPFRbVEtleV0+LFxyXG4pOiBEZXJpdmVkU2lnbmFsPFQsIFRbVEtleV0+O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBgRGVyaXZlZFNpZ25hbGAgZnJvbSBhbiBhcnJheSwgZGVyaXZpbmcgYW4gZWxlbWVudCBieSBpdHMgaW5kZXguXHJcbiAqIFRoaXMgb3ZlcmxvYWQgaXMgYSBjb252ZW5pZW50IHNob3J0aGFuZCBmb3IgYWNjZXNzaW5nIGFycmF5IGVsZW1lbnRzLlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIFQgVGhlIHR5cGUgb2YgdGhlIHNvdXJjZSBzaWduYWwncyB2YWx1ZSAobXVzdCBiZSBhbiBhcnJheSkuXHJcbiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBgV3JpdGFibGVTaWduYWxgIChob2xkaW5nIGFuIGFycmF5KS5cclxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBkZXJpdmUuXHJcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIHNpZ25hbCBvcHRpb25zIGZvciB0aGUgZGVyaXZlZCBzaWduYWwuXHJcbiAqIEByZXR1cm5zIEEgYERlcml2ZWRTaWduYWxgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBudW1iZXJzID0gc2lnbmFsKFsxLCAyLCAzXSk7XHJcbiAqIGNvbnN0IHNlY29uZE51bWJlciA9IGRlcml2ZWQobnVtYmVycywgMSk7XHJcbiAqXHJcbiAqIGNvbnNvbGUubG9nKHNlY29uZE51bWJlcigpKTsgLy8gT3V0cHV0czogMlxyXG4gKlxyXG4gKiAvLyBVcGRhdGUgdGhlIGRlcml2ZWQgc2lnbmFsLCB3aGljaCBhbHNvIHVwZGF0ZXMgdGhlIHNvdXJjZVxyXG4gKiBzZWNvbmROdW1iZXIuc2V0KDUpO1xyXG4gKlxyXG4gKiBjb25zb2xlLmxvZyhudW1iZXJzKCkpOyAvLyBPdXRwdXRzOiBbMSwgNSwgM11cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlZDxUIGV4dGVuZHMgYW55W10+KFxyXG4gIHNvdXJjZTogV3JpdGFibGVTaWduYWw8VD4sXHJcbiAgaW5kZXg6IG51bWJlcixcclxuICBvcHQ/OiBDcmVhdGVTaWduYWxPcHRpb25zPFRbbnVtYmVyXT4sXHJcbik6IERlcml2ZWRTaWduYWw8VCwgVFtudW1iZXJdPjtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgYERlcml2ZWRTaWduYWxgIHRoYXQgZGVyaXZlcyBpdHMgdmFsdWUgZnJvbSBhbm90aGVyIGBNdXRhYmxlU2lnbmFsYC5cclxuICogVXNlIG11dHVhYmxlIHNpZ25hbHMgd2l0aCBjYXV0aW9uLCBidXQgdmVyeSB1c2VmdWwgZm9yIGRlZXBseSBuZXN0ZWQgc3RydWN0dXJlcy5cclxuICpcclxuICogQHR5cGVQYXJhbSBUIFRoZSB0eXBlIG9mIHRoZSBzb3VyY2Ugc2lnbmFsJ3MgdmFsdWUuXHJcbiAqIEB0eXBlUGFyYW0gVSBUaGUgdHlwZSBvZiB0aGUgZGVyaXZlZCBzaWduYWwncyB2YWx1ZS5cclxuICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGBXcml0YWJsZVNpZ25hbGAuXHJcbiAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgZnJvbWAgYW5kIGBvbkNoYW5nZWAgZnVuY3Rpb25zLCBhbmQgb3B0aW9uYWwgc2lnbmFsIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIEEgYERlcml2ZWRTaWduYWwgJiBNdXRhYmxlU2lnbmFsYCBpbnN0YW5jZS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3QgdXNlciA9IHNpZ25hbCh7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9KTtcclxuICogY29uc3QgbmFtZSA9IGRlcml2ZWQodXNlciwge1xyXG4gKiBmcm9tOiAodSkgPT4gdS5uYW1lLFxyXG4gKiBvbkNoYW5nZTogKG5ld05hbWUpID0+IHVzZXIudXBkYXRlKCh1KSA9PiAoeyAuLi51LCBuYW1lOiBuZXdOYW1lIH0pKSxcclxuICogfSk7XHJcbiAqXHJcbiAqIG5hbWUuc2V0KCdKYW5lJyk7IC8vIFVwZGF0ZXMgdGhlIG9yaWdpbmFsIHNpZ25hbFxyXG4gKiBjb25zb2xlLmxvZyh1c2VyKCkubmFtZSk7IC8vIE91dHB1dHM6IEphbmVcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlZDxULCBVPihcclxuICBzb3VyY2U6IE11dGFibGVTaWduYWw8VD4sXHJcbiAgb3B0T3JLZXk6IENyZWF0ZURlcml2ZWRPcHRpb25zPFQsIFU+IHwga2V5b2YgVCxcclxuICBvcHQ/OiBDcmVhdGVTaWduYWxPcHRpb25zPFU+LFxyXG4pOiBEZXJpdmVkU2lnbmFsPFQsIFU+ICYgTXV0YWJsZVNpZ25hbDxVPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVkPFQsIFU+KFxyXG4gIHNvdXJjZTogV3JpdGFibGVTaWduYWw8VD4gfCBNdXRhYmxlU2lnbmFsPFQ+LFxyXG4gIG9wdE9yS2V5OiBDcmVhdGVEZXJpdmVkT3B0aW9uczxULCBVPiB8IGtleW9mIFQsXHJcbiAgb3B0PzogQ3JlYXRlU2lnbmFsT3B0aW9uczxVPixcclxuKTogRGVyaXZlZFNpZ25hbDxULCBVPiB8IChEZXJpdmVkU2lnbmFsPFQsIFU+ICYgTXV0YWJsZVNpZ25hbDxVPikge1xyXG4gIGNvbnN0IGlzQXJyYXkgPVxyXG4gICAgQXJyYXkuaXNBcnJheSh1bnRyYWNrZWQoc291cmNlKSkgJiYgdHlwZW9mIG9wdE9yS2V5ID09PSAnbnVtYmVyJztcclxuXHJcbiAgY29uc3QgZnJvbSA9XHJcbiAgICB0eXBlb2Ygb3B0T3JLZXkgPT09ICdvYmplY3QnID8gb3B0T3JLZXkuZnJvbSA6ICh2OiBUKSA9PiB2W29wdE9yS2V5XSBhcyBVO1xyXG5cclxuICBjb25zdCBvbkNoYW5nZSA9XHJcbiAgICB0eXBlb2Ygb3B0T3JLZXkgPT09ICdvYmplY3QnXHJcbiAgICAgID8gb3B0T3JLZXkub25DaGFuZ2VcclxuICAgICAgOiBpc0FycmF5XHJcbiAgICAgICAgPyBpc011dGFibGUoc291cmNlKVxyXG4gICAgICAgICAgPyAobmV4dDogVSkgPT4ge1xyXG4gICAgICAgICAgICAgIHNvdXJjZS5tdXRhdGUoKGN1cikgPT4ge1xyXG4gICAgICAgICAgICAgICAgKGN1ciBhcyBhbnlbXSlbb3B0T3JLZXldID0gbmV4dDtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXIgYXMgVDtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiAobmV4dDogVSkgPT4ge1xyXG4gICAgICAgICAgICAgIHNvdXJjZS51cGRhdGUoKGN1cikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbLi4uKGN1ciBhcyB1bmtub3duIGFzIGFueVtdKV07XHJcbiAgICAgICAgICAgICAgICBuZXdBcnJheVtvcHRPcktleV0gPSBuZXh0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0FycmF5IGFzIFQ7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA6IGlzTXV0YWJsZShzb3VyY2UpXHJcbiAgICAgICAgICA/IChuZXh0OiBVKSA9PiB7XHJcbiAgICAgICAgICAgICAgc291cmNlLm11dGF0ZSgoY3VyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAoY3VyIGFzIFVua25vd25PYmplY3QpW29wdE9yS2V5XSA9IG5leHQgYXMgVFtrZXlvZiBUXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDogKG5leHQ6IFUpID0+IHtcclxuICAgICAgICAgICAgICBzb3VyY2UudXBkYXRlKChjdXIpID0+ICh7IC4uLmN1ciwgW29wdE9yS2V5XTogbmV4dCB9KSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gIGNvbnN0IHJlc3QgPSB0eXBlb2Ygb3B0T3JLZXkgPT09ICdvYmplY3QnID8gb3B0T3JLZXkgOiBvcHQ7XHJcblxyXG4gIGxldCBiYXNlRXF1YWwgPSByZXN0Py5lcXVhbCA/PyBPYmplY3QuaXM7XHJcbiAgbGV0IHRyaWdnZXIgPSBmYWxzZTtcclxuXHJcbiAgY29uc3QgZXF1YWw6IFZhbHVlRXF1YWxpdHlGbjxVPiA9IGlzTXV0YWJsZShzb3VyY2UpXHJcbiAgICA/IChhOiBVLCBiOiBVKSA9PiB7XHJcbiAgICAgICAgaWYgKHRyaWdnZXIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gYmFzZUVxdWFsKGEsIGIpO1xyXG4gICAgICB9XHJcbiAgICA6IGJhc2VFcXVhbDtcclxuXHJcbiAgY29uc3Qgc2lnID0gdG9Xcml0YWJsZTxVPihcclxuICAgIGNvbXB1dGVkKCgpID0+IGZyb20oc291cmNlKCkpLCB7IC4uLnJlc3QsIGVxdWFsIH0pLFxyXG4gICAgKG5ld1ZhbCkgPT4gb25DaGFuZ2UobmV3VmFsKSxcclxuICApIGFzIERlcml2ZWRTaWduYWw8VCwgVT4gJiBNdXRhYmxlU2lnbmFsPFU+O1xyXG5cclxuICBzaWcuZnJvbSA9IGZyb207XHJcblxyXG4gIGlmIChpc011dGFibGUoc291cmNlKSkge1xyXG4gICAgc2lnLm11dGF0ZSA9ICh1cGRhdGVyKSA9PiB7XHJcbiAgICAgIHRyaWdnZXIgPSB0cnVlO1xyXG4gICAgICBzaWcudXBkYXRlKHVwZGF0ZXIpO1xyXG4gICAgICB0cmlnZ2VyID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIHNpZy5pbmxpbmUgPSAodXBkYXRlcikgPT4ge1xyXG4gICAgICBzaWcubXV0YXRlKChwcmV2KSA9PiB7XHJcbiAgICAgICAgdXBkYXRlcihwcmV2KTtcclxuICAgICAgICByZXR1cm4gcHJldjtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHNpZztcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBcImZha2VcIiBgRGVyaXZlZFNpZ25hbGAgZnJvbSBhIHNpbXBsZSB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nXHJcbiAqIGBGb3JtQ29udHJvbFNpZ25hbGAgaW5zdGFuY2VzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSBkZXJpdmVkIGZyb20gYW5vdGhlciBzaWduYWwuXHJcbiAqIFRoZSByZXR1cm5lZCBzaWduYWwncyBgZnJvbWAgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBpbml0aWFsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIFQgLSAgVGhpcyB0eXBlIHBhcmFtZXRlciBpcyBub3QgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gYnV0IGlzIGtlcHQgZm9yIHR5cGUgY29tcGF0aWJpbGl0eSB3aXRoIGBEZXJpdmVkU2lnbmFsYC5cclxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgdGhlIHNpZ25hbCdzIHZhbHVlLlxyXG4gKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBzaWduYWwuXHJcbiAqIEByZXR1cm5zIEEgYERlcml2ZWRTaWduYWxgIGluc3RhbmNlLlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0b0Zha2VEZXJpdmF0aW9uPFQsIFU+KGluaXRpYWw6IFUpOiBEZXJpdmVkU2lnbmFsPFQsIFU+IHtcclxuICBjb25zdCBzaWcgPSBzaWduYWwoaW5pdGlhbCkgYXMgRGVyaXZlZFNpZ25hbDxULCBVPjtcclxuICBzaWcuZnJvbSA9ICgpID0+IGluaXRpYWw7XHJcblxyXG4gIHJldHVybiBzaWc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgXCJmYWtlXCIgYERlcml2ZWRTaWduYWxgIGZyb20gYW4gZXhpc3RpbmcgYFdyaXRhYmxlU2lnbmFsYC4gVGhpcyBpcyB1c2VmdWxcclxuICogZm9yIHRyZWF0aW5nIGEgcmVndWxhciBgV3JpdGFibGVTaWduYWxgIGFzIGEgYERlcml2ZWRTaWduYWxgIHdpdGhvdXQgY2hhbmdpbmcgaXRzIGJlaGF2aW9yLlxyXG4gKiAgVGhlIHJldHVybmVkIHNpZ25hbCdzIGBmcm9tYCBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNpZ25hbCwgdXNpbmcgYHVudHJhY2tlZGAuXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gVCAtIFRoaXMgdHlwZSBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGJ1dCBpcyBrZXB0IGZvciB0eXBlIGNvbXBhdGliaWxpdHkgd2l0aCBgRGVyaXZlZFNpZ25hbGAuXHJcbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIHRoZSBzaWduYWwncyB2YWx1ZS5cclxuICogQHBhcmFtIGluaXRpYWwgLSBUaGUgZXhpc3RpbmcgYFdyaXRhYmxlU2lnbmFsYC5cclxuICogQHJldHVybnMgQSBgRGVyaXZlZFNpZ25hbGAgaW5zdGFuY2UuXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvRmFrZVNpZ25hbERlcml2YXRpb248VCwgVT4oXHJcbiAgaW5pdGlhbDogV3JpdGFibGVTaWduYWw8VT4sXHJcbik6IERlcml2ZWRTaWduYWw8VCwgVT4ge1xyXG4gIGNvbnN0IHNpZyA9IGluaXRpYWwgYXMgRGVyaXZlZFNpZ25hbDxULCBVPjtcclxuICBzaWcuZnJvbSA9ICgpID0+IHVudHJhY2tlZChpbml0aWFsKTtcclxuICByZXR1cm4gc2lnO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBndWFyZCBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGdpdmVuIGBXcml0YWJsZVNpZ25hbGAgaXMgYSBgRGVyaXZlZFNpZ25hbGAuXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBzb3VyY2Ugc2lnbmFsJ3MgdmFsdWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBgYW55YCkuXHJcbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIHRoZSBkZXJpdmVkIHNpZ25hbCdzIHZhbHVlIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gYGFueWApLlxyXG4gKiBAcGFyYW0gc2lnIC0gVGhlIGBXcml0YWJsZVNpZ25hbGAgdG8gY2hlY2suXHJcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2lnbmFsIGlzIGEgYERlcml2ZWRTaWduYWxgLCBgZmFsc2VgIG90aGVyd2lzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0Rlcml2YXRpb248VCwgVT4oXHJcbiAgc2lnOiBXcml0YWJsZVNpZ25hbDxVPixcclxuKTogc2lnIGlzIERlcml2ZWRTaWduYWw8VCwgVT4ge1xyXG4gIHJldHVybiAnZnJvbScgaW4gc2lnO1xyXG59XHJcbiJdfQ==","import { isPlatformServer } from '@angular/common';\nimport { computed, effect, ElementRef, inject, isSignal, PLATFORM_ID, signal, } from '@angular/core';\nfunction observerSupported() {\n return typeof IntersectionObserver !== 'undefined';\n}\n/**\n * Creates a read-only signal that tracks the intersection status of a target DOM element\n * with the viewport or a specified root element, using the `IntersectionObserver` API.\n *\n * It can observe a static `ElementRef`/`Element` or a `Signal` that resolves to one,\n * allowing for dynamic targets.\n *\n * @param target The DOM element (or `ElementRef`, or a `Signal` resolving to one) to observe.\n * If the signal resolves to `null`, observation stops.\n * @param options Optional `IntersectionObserverInit` options (e.g., `root`, `rootMargin`, `threshold`)\n * and an optional `debugName`.\n * @returns A `Signal<IntersectionObserverEntry | undefined>`. It emits `undefined` initially,\n * on the server, or if the target is `null`. Otherwise, it emits the latest\n * `IntersectionObserverEntry`. Consumers can derive a boolean `isVisible` from\n * this entry's `isIntersecting` property.\n *\n * @example\n * ```ts\n * import { Component, effect, ElementRef, viewChild } from '@angular/core';\n * import { elementVisibility } from '@mmstack/primitives';\n * import { computed } from '@angular/core'; // For derived boolean\n *\n * @Component({\n * selector: 'app-lazy-image',\n * template: `\n * <div #imageContainer style=\"height: 200px; border: 1px dashed grey;\">\n * @if (isVisible()) {\n * <img src=\"your-image-url.jpg\" alt=\"Lazy loaded image\" />\n * <p>Image is VISIBLE!</p>\n * } @else {\n * <p>Scroll down to see the image...</p>\n * }\n * </div>\n * `\n * })\n * export class LazyImageComponent {\n * readonly imageContainer = viewChild.required<ElementRef<HTMLDivElement>>('imageContainer');\n *\n * // Observe the element, get the full IntersectionObserverEntry\n * readonly intersectionEntry = elementVisibility(this.imageContainer);\n *\n * // Derive a simple boolean for visibility\n * readonly isVisible = computed(() => this.intersectionEntry()?.isIntersecting ?? false);\n *\n * constructor() {\n * effect(() => {\n * console.log('Intersection Entry:', this.intersectionEntry());\n * console.log('Is Visible:', this.isVisible());\n * });\n * }\n * }\n * ```\n */\nexport function elementVisibility(target = inject(ElementRef), opt) {\n if (isPlatformServer(inject(PLATFORM_ID)) || !observerSupported()) {\n const base = computed(() => undefined, {\n debugName: opt?.debugName,\n });\n base.visible = computed(() => false);\n return base;\n }\n const state = signal(undefined, {\n debugName: opt?.debugName,\n equal: (a, b) => {\n if (!a && !b)\n return true;\n if (!a || !b)\n return false;\n return (a.target === b.target &&\n a.isIntersecting === b.isIntersecting &&\n a.intersectionRatio === b.intersectionRatio &&\n a.boundingClientRect.top === b.boundingClientRect.top &&\n a.boundingClientRect.left === b.boundingClientRect.left &&\n a.boundingClientRect.width === b.boundingClientRect.width &&\n a.boundingClientRect.height === b.boundingClientRect.height);\n },\n });\n const targetSignal = isSignal(target) ? target : computed(() => target);\n effect((cleanup) => {\n const el = targetSignal();\n if (!el)\n return state.set(undefined);\n let observer = null;\n observer = new IntersectionObserver(([entry]) => state.set(entry), opt);\n observer.observe(el instanceof ElementRef ? el.nativeElement : el);\n cleanup(() => {\n observer?.disconnect();\n });\n });\n const base = state.asReadonly();\n base.visible = computed(() => {\n const s = state();\n if (!s)\n return false;\n return s.isIntersecting;\n });\n return base;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC12aXNpYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL2VsZW1lbnQtdmlzaWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBV3ZCLFNBQVMsaUJBQWlCO0lBQ3hCLE9BQU8sT0FBTyxvQkFBb0IsS0FBSyxXQUFXLENBQUM7QUFDckQsQ0FBQztBQWNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0RHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUdtRCxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQ3JFLEdBQThCO0lBRTlCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVM7U0FDMUIsQ0FBb0MsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQXdDLFNBQVMsRUFBRTtRQUNyRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDM0IsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07Z0JBQ3JCLENBQUMsQ0FBQyxjQUFjLEtBQUssQ0FBQyxDQUFDLGNBQWM7Z0JBQ3JDLENBQUMsQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLENBQUMsaUJBQWlCO2dCQUMzQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHO2dCQUNyRCxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO2dCQUN2RCxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO2dCQUN6RCxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQzVELENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV4RSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNqQixNQUFNLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyQyxJQUFJLFFBQVEsR0FBZ0MsSUFBSSxDQUFDO1FBQ2pELFFBQVEsR0FBRyxJQUFJLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5FLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDWCxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQXFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckIsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlzU2lnbmFsLFxuICBQTEFURk9STV9JRCxcbiAgc2lnbmFsLFxuICBTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBgZWxlbWVudFZpc2liaWxpdHlgIHNlbnNvciwgZXh0ZW5kaW5nXG4gKiBzdGFuZGFyZCBgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJJbml0YCBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSBFbGVtZW50VmlzaWJpbGl0eU9wdGlvbnMgPSBJbnRlcnNlY3Rpb25PYnNlcnZlckluaXQgJiB7XG4gIC8qKiBPcHRpb25hbCBkZWJ1ZyBuYW1lIGZvciB0aGUgaW50ZXJuYWwgc2lnbmFsLiAqL1xuICBkZWJ1Z05hbWU/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBvYnNlcnZlclN1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbnR5cGUgSW50ZXJuYWxFbGVtZW50VmlzaWJpbGl0eVNpZ25hbCA9IFNpZ25hbDxcbiAgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSB8IHVuZGVmaW5lZFxuPiAmIHtcbiAgdmlzaWJsZTogU2lnbmFsPGJvb2xlYW4+O1xufTtcblxuZXhwb3J0IHR5cGUgRWxlbWVudFZpc2liaWxpdHlTaWduYWwgPSBTaWduYWw8XG4gIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgfCB1bmRlZmluZWRcbj4gJiB7XG4gIHJlYWRvbmx5IHZpc2libGU6IFNpZ25hbDxib29sZWFuPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWQtb25seSBzaWduYWwgdGhhdCB0cmFja3MgdGhlIGludGVyc2VjdGlvbiBzdGF0dXMgb2YgYSB0YXJnZXQgRE9NIGVsZW1lbnRcbiAqIHdpdGggdGhlIHZpZXdwb3J0IG9yIGEgc3BlY2lmaWVkIHJvb3QgZWxlbWVudCwgdXNpbmcgdGhlIGBJbnRlcnNlY3Rpb25PYnNlcnZlcmAgQVBJLlxuICpcbiAqIEl0IGNhbiBvYnNlcnZlIGEgc3RhdGljIGBFbGVtZW50UmVmYC9gRWxlbWVudGAgb3IgYSBgU2lnbmFsYCB0aGF0IHJlc29sdmVzIHRvIG9uZSxcbiAqIGFsbG93aW5nIGZvciBkeW5hbWljIHRhcmdldHMuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgRE9NIGVsZW1lbnQgKG9yIGBFbGVtZW50UmVmYCwgb3IgYSBgU2lnbmFsYCByZXNvbHZpbmcgdG8gb25lKSB0byBvYnNlcnZlLlxuICogSWYgdGhlIHNpZ25hbCByZXNvbHZlcyB0byBgbnVsbGAsIG9ic2VydmF0aW9uIHN0b3BzLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYEludGVyc2VjdGlvbk9ic2VydmVySW5pdGAgb3B0aW9ucyAoZS5nLiwgYHJvb3RgLCBgcm9vdE1hcmdpbmAsIGB0aHJlc2hvbGRgKVxuICogYW5kIGFuIG9wdGlvbmFsIGBkZWJ1Z05hbWVgLlxuICogQHJldHVybnMgQSBgU2lnbmFsPEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgfCB1bmRlZmluZWQ+YC4gSXQgZW1pdHMgYHVuZGVmaW5lZGAgaW5pdGlhbGx5LFxuICogb24gdGhlIHNlcnZlciwgb3IgaWYgdGhlIHRhcmdldCBpcyBgbnVsbGAuIE90aGVyd2lzZSwgaXQgZW1pdHMgdGhlIGxhdGVzdFxuICogYEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlgLiBDb25zdW1lcnMgY2FuIGRlcml2ZSBhIGJvb2xlYW4gYGlzVmlzaWJsZWAgZnJvbVxuICogdGhpcyBlbnRyeSdzIGBpc0ludGVyc2VjdGluZ2AgcHJvcGVydHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQgeyBlbGVtZW50VmlzaWJpbGl0eSB9IGZyb20gJ0BtbXN0YWNrL3ByaW1pdGl2ZXMnO1xuICogaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJzsgLy8gRm9yIGRlcml2ZWQgYm9vbGVhblxuICpcbiAqIEBDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdhcHAtbGF6eS1pbWFnZScsXG4gKiB0ZW1wbGF0ZTogYFxuICogPGRpdiAjaW1hZ2VDb250YWluZXIgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4OyBib3JkZXI6IDFweCBkYXNoZWQgZ3JleTtcIj5cbiAqIEBpZiAoaXNWaXNpYmxlKCkpIHtcbiAqIDxpbWcgc3JjPVwieW91ci1pbWFnZS11cmwuanBnXCIgYWx0PVwiTGF6eSBsb2FkZWQgaW1hZ2VcIiAvPlxuICogPHA+SW1hZ2UgaXMgVklTSUJMRSE8L3A+XG4gKiB9IEBlbHNlIHtcbiAqIDxwPlNjcm9sbCBkb3duIHRvIHNlZSB0aGUgaW1hZ2UuLi48L3A+XG4gKiB9XG4gKiA8L2Rpdj5cbiAqIGBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgTGF6eUltYWdlQ29tcG9uZW50IHtcbiAqIHJlYWRvbmx5IGltYWdlQ29udGFpbmVyID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignaW1hZ2VDb250YWluZXInKTtcbiAqXG4gKiAvLyBPYnNlcnZlIHRoZSBlbGVtZW50LCBnZXQgdGhlIGZ1bGwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVxuICogcmVhZG9ubHkgaW50ZXJzZWN0aW9uRW50cnkgPSBlbGVtZW50VmlzaWJpbGl0eSh0aGlzLmltYWdlQ29udGFpbmVyKTtcbiAqXG4gKiAvLyBEZXJpdmUgYSBzaW1wbGUgYm9vbGVhbiBmb3IgdmlzaWJpbGl0eVxuICogcmVhZG9ubHkgaXNWaXNpYmxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pbnRlcnNlY3Rpb25FbnRyeSgpPy5pc0ludGVyc2VjdGluZyA/PyBmYWxzZSk7XG4gKlxuICogY29uc3RydWN0b3IoKSB7XG4gKiBlZmZlY3QoKCkgPT4ge1xuICogY29uc29sZS5sb2coJ0ludGVyc2VjdGlvbiBFbnRyeTonLCB0aGlzLmludGVyc2VjdGlvbkVudHJ5KCkpO1xuICogY29uc29sZS5sb2coJ0lzIFZpc2libGU6JywgdGhpcy5pc1Zpc2libGUoKSk7XG4gKiB9KTtcbiAqIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudFZpc2liaWxpdHkoXG4gIHRhcmdldDpcbiAgICB8IEVsZW1lbnRSZWY8RWxlbWVudD5cbiAgICB8IEVsZW1lbnRcbiAgICB8IFNpZ25hbDxFbGVtZW50UmVmPEVsZW1lbnQ+IHwgRWxlbWVudCB8IG51bGw+ID0gaW5qZWN0KEVsZW1lbnRSZWYpLFxuICBvcHQ/OiBFbGVtZW50VmlzaWJpbGl0eU9wdGlvbnMsXG4pOiBFbGVtZW50VmlzaWJpbGl0eVNpZ25hbCB7XG4gIGlmIChpc1BsYXRmb3JtU2VydmVyKGluamVjdChQTEFURk9STV9JRCkpIHx8ICFvYnNlcnZlclN1cHBvcnRlZCgpKSB7XG4gICAgY29uc3QgYmFzZSA9IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCwge1xuICAgICAgZGVidWdOYW1lOiBvcHQ/LmRlYnVnTmFtZSxcbiAgICB9KSBhcyBJbnRlcm5hbEVsZW1lbnRWaXNpYmlsaXR5U2lnbmFsO1xuICAgIGJhc2UudmlzaWJsZSA9IGNvbXB1dGVkKCgpID0+IGZhbHNlKTtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0gc2lnbmFsPEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwge1xuICAgIGRlYnVnTmFtZTogb3B0Py5kZWJ1Z05hbWUsXG4gICAgZXF1YWw6IChhLCBiKSA9PiB7XG4gICAgICBpZiAoIWEgJiYgIWIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKCFhIHx8ICFiKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhLnRhcmdldCA9PT0gYi50YXJnZXQgJiZcbiAgICAgICAgYS5pc0ludGVyc2VjdGluZyA9PT0gYi5pc0ludGVyc2VjdGluZyAmJlxuICAgICAgICBhLmludGVyc2VjdGlvblJhdGlvID09PSBiLmludGVyc2VjdGlvblJhdGlvICYmXG4gICAgICAgIGEuYm91bmRpbmdDbGllbnRSZWN0LnRvcCA9PT0gYi5ib3VuZGluZ0NsaWVudFJlY3QudG9wICYmXG4gICAgICAgIGEuYm91bmRpbmdDbGllbnRSZWN0LmxlZnQgPT09IGIuYm91bmRpbmdDbGllbnRSZWN0LmxlZnQgJiZcbiAgICAgICAgYS5ib3VuZGluZ0NsaWVudFJlY3Qud2lkdGggPT09IGIuYm91bmRpbmdDbGllbnRSZWN0LndpZHRoICYmXG4gICAgICAgIGEuYm91bmRpbmdDbGllbnRSZWN0LmhlaWdodCA9PT0gYi5ib3VuZGluZ0NsaWVudFJlY3QuaGVpZ2h0XG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHRhcmdldFNpZ25hbCA9IGlzU2lnbmFsKHRhcmdldCkgPyB0YXJnZXQgOiBjb21wdXRlZCgoKSA9PiB0YXJnZXQpO1xuXG4gIGVmZmVjdCgoY2xlYW51cCkgPT4ge1xuICAgIGNvbnN0IGVsID0gdGFyZ2V0U2lnbmFsKCk7XG5cbiAgICBpZiAoIWVsKSByZXR1cm4gc3RhdGUuc2V0KHVuZGVmaW5lZCk7XG5cbiAgICBsZXQgb2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKFtlbnRyeV0pID0+IHN0YXRlLnNldChlbnRyeSksIG9wdCk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbC5uYXRpdmVFbGVtZW50IDogZWwpO1xuXG4gICAgY2xlYW51cCgoKSA9PiB7XG4gICAgICBvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBiYXNlID0gc3RhdGUuYXNSZWFkb25seSgpIGFzIEludGVybmFsRWxlbWVudFZpc2liaWxpdHlTaWduYWw7XG4gIGJhc2UudmlzaWJsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzID0gc3RhdGUoKTtcbiAgICBpZiAoIXMpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcy5pc0ludGVyc2VjdGluZztcbiAgfSk7XG4gIHJldHVybiBiYXNlO1xufVxuIl19","import { computed, isSignal, linkedSignal, } from '@angular/core';\n/**\n * Reactively maps items from a source array (or signal of an array) using a provided mapping function.\n *\n * This function serves a similar purpose to SolidJS's `mapArray` by providing stability\n * for mapped items. It receives a source function returning an array (or a Signal<T[]>)\n * and a mapping function.\n *\n * For each item in the source array, it creates a stable `computed` signal representing\n * that item's value at its current index. This stable signal (`Signal<T>`) is passed\n * to the mapping function. This ensures that downstream computations or components\n * depending on the mapped result only re-render or re-calculate for the specific items\n * that have changed, or when items are added/removed, rather than re-evaluating everything\n * when the source array reference changes but items remain the same.\n *\n * It efficiently handles changes in the source array's length by reusing existing mapped\n * results when possible, slicing when the array shrinks, and appending new mapped items\n * when it grows.\n *\n * @template T The type of items in the source array.\n * @template U The type of items in the resulting mapped array.\n *\n * @param source A function returning the source array `T[]`, or a `Signal<T[]>` itself.\n * The `mapArray` function will reactively update based on changes to this source.\n * @param map The mapping function. It is called for each item in the source array.\n * It receives:\n * - `value`: A stable `Signal<T>` representing the item at the current index.\n * Use this signal within your mapping logic if you need reactivity\n * tied to the specific item's value changes.\n * - `index`: The number index of the item in the array.\n * It should return the mapped value `U`.\n * @param [opt] Optional `CreateSignalOptions<T>`. These options are passed directly\n * to the `computed` signal created for each individual item (`Signal<T>`).\n * This allows specifying options like a custom `equal` function for item comparison.\n *\n * @returns A `Signal<U[]>` containing the mapped array. This signal updates whenever\n * the source array changes (either length or the values of its items).\n *\n * @example\n * ```ts\n * const sourceItems = signal([\n * { id: 1, name: 'Apple' },\n * { id: 2, name: 'Banana' }\n * ]);\n *\n * const mappedItems = mapArray(\n * sourceItems,\n * (itemSignal, index) => {\n * // itemSignal is stable for a given item based on its index.\n * // We create a computed here to react to changes in the item's name.\n * return computed(() => `${index}: ${itemSignal().name.toUpperCase()}`);\n * },\n * // Example optional options (e.g., custom equality for item signals)\n * { equal: (a, b) => a.id === b.id && a.name === b.name }\n * );\n * ```\n * @remarks\n * This function achieves its high performance by leveraging the new `linkedSignal`\n * API from Angular, which allows for efficient memoization and reuse of array items.\n */\nexport function mapArray(source, map, opt) {\n const data = isSignal(source) ? source : computed(source);\n const len = computed(() => data().length);\n return linkedSignal({\n source: () => len(),\n computation: (len, prev) => {\n if (!prev)\n return Array.from({ length: len }, (_, i) => map(computed(() => source()[i], opt), i));\n if (len === prev.value.length)\n return prev.value;\n if (len < prev.value.length) {\n return prev.value.slice(0, len);\n }\n else {\n const next = [...prev.value];\n for (let i = prev.value.length; i < len; i++) {\n next[i] = map(computed(() => source()[i], opt), i);\n }\n return next;\n }\n },\n equal: (a, b) => a.length === b.length,\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL21hcC1hcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFFBQVEsRUFDUixZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFFdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwREc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixNQUFpQixFQUNqQixHQUEyQyxFQUMzQyxHQUE0QjtJQUU1QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUxQyxPQUFPLFlBQVksQ0FBYztRQUMvQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFO1FBQ25CLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSTtnQkFDUCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDMUMsR0FBRyxDQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFDaEMsQ0FBQyxDQUNGLENBQ0YsQ0FBQztZQUVKLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFFakQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUNYLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFDaEMsQ0FBQyxDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBjb21wdXRlZCxcclxuICB0eXBlIENyZWF0ZVNpZ25hbE9wdGlvbnMsXHJcbiAgaXNTaWduYWwsXHJcbiAgbGlua2VkU2lnbmFsLFxyXG4gIHR5cGUgU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIFJlYWN0aXZlbHkgbWFwcyBpdGVtcyBmcm9tIGEgc291cmNlIGFycmF5IChvciBzaWduYWwgb2YgYW4gYXJyYXkpIHVzaW5nIGEgcHJvdmlkZWQgbWFwcGluZyBmdW5jdGlvbi5cclxuICpcclxuICogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYSBzaW1pbGFyIHB1cnBvc2UgdG8gU29saWRKUydzIGBtYXBBcnJheWAgYnkgcHJvdmlkaW5nIHN0YWJpbGl0eVxyXG4gKiBmb3IgbWFwcGVkIGl0ZW1zLiBJdCByZWNlaXZlcyBhIHNvdXJjZSBmdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgKG9yIGEgU2lnbmFsPFRbXT4pXHJcbiAqIGFuZCBhIG1hcHBpbmcgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEZvciBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBhcnJheSwgaXQgY3JlYXRlcyBhIHN0YWJsZSBgY29tcHV0ZWRgIHNpZ25hbCByZXByZXNlbnRpbmdcclxuICogdGhhdCBpdGVtJ3MgdmFsdWUgYXQgaXRzIGN1cnJlbnQgaW5kZXguIFRoaXMgc3RhYmxlIHNpZ25hbCAoYFNpZ25hbDxUPmApIGlzIHBhc3NlZFxyXG4gKiB0byB0aGUgbWFwcGluZyBmdW5jdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgZG93bnN0cmVhbSBjb21wdXRhdGlvbnMgb3IgY29tcG9uZW50c1xyXG4gKiBkZXBlbmRpbmcgb24gdGhlIG1hcHBlZCByZXN1bHQgb25seSByZS1yZW5kZXIgb3IgcmUtY2FsY3VsYXRlIGZvciB0aGUgc3BlY2lmaWMgaXRlbXNcclxuICogdGhhdCBoYXZlIGNoYW5nZWQsIG9yIHdoZW4gaXRlbXMgYXJlIGFkZGVkL3JlbW92ZWQsIHJhdGhlciB0aGFuIHJlLWV2YWx1YXRpbmcgZXZlcnl0aGluZ1xyXG4gKiB3aGVuIHRoZSBzb3VyY2UgYXJyYXkgcmVmZXJlbmNlIGNoYW5nZXMgYnV0IGl0ZW1zIHJlbWFpbiB0aGUgc2FtZS5cclxuICpcclxuICogSXQgZWZmaWNpZW50bHkgaGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBzb3VyY2UgYXJyYXkncyBsZW5ndGggYnkgcmV1c2luZyBleGlzdGluZyBtYXBwZWRcclxuICogcmVzdWx0cyB3aGVuIHBvc3NpYmxlLCBzbGljaW5nIHdoZW4gdGhlIGFycmF5IHNocmlua3MsIGFuZCBhcHBlbmRpbmcgbmV3IG1hcHBlZCBpdGVtc1xyXG4gKiB3aGVuIGl0IGdyb3dzLlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiBpdGVtcyBpbiB0aGUgc291cmNlIGFycmF5LlxyXG4gKiBAdGVtcGxhdGUgVSBUaGUgdHlwZSBvZiBpdGVtcyBpbiB0aGUgcmVzdWx0aW5nIG1hcHBlZCBhcnJheS5cclxuICpcclxuICogQHBhcmFtIHNvdXJjZSBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc291cmNlIGFycmF5IGBUW11gLCBvciBhIGBTaWduYWw8VFtdPmAgaXRzZWxmLlxyXG4gKiBUaGUgYG1hcEFycmF5YCBmdW5jdGlvbiB3aWxsIHJlYWN0aXZlbHkgdXBkYXRlIGJhc2VkIG9uIGNoYW5nZXMgdG8gdGhpcyBzb3VyY2UuXHJcbiAqIEBwYXJhbSBtYXAgVGhlIG1hcHBpbmcgZnVuY3Rpb24uIEl0IGlzIGNhbGxlZCBmb3IgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2UgYXJyYXkuXHJcbiAqIEl0IHJlY2VpdmVzOlxyXG4gKiAtIGB2YWx1ZWA6IEEgc3RhYmxlIGBTaWduYWw8VD5gIHJlcHJlc2VudGluZyB0aGUgaXRlbSBhdCB0aGUgY3VycmVudCBpbmRleC5cclxuICogVXNlIHRoaXMgc2lnbmFsIHdpdGhpbiB5b3VyIG1hcHBpbmcgbG9naWMgaWYgeW91IG5lZWQgcmVhY3Rpdml0eVxyXG4gKiB0aWVkIHRvIHRoZSBzcGVjaWZpYyBpdGVtJ3MgdmFsdWUgY2hhbmdlcy5cclxuICogLSBgaW5kZXhgOiBUaGUgbnVtYmVyIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBhcnJheS5cclxuICogSXQgc2hvdWxkIHJldHVybiB0aGUgbWFwcGVkIHZhbHVlIGBVYC5cclxuICogQHBhcmFtIFtvcHRdIE9wdGlvbmFsIGBDcmVhdGVTaWduYWxPcHRpb25zPFQ+YC4gVGhlc2Ugb3B0aW9ucyBhcmUgcGFzc2VkIGRpcmVjdGx5XHJcbiAqIHRvIHRoZSBgY29tcHV0ZWRgIHNpZ25hbCBjcmVhdGVkIGZvciBlYWNoIGluZGl2aWR1YWwgaXRlbSAoYFNpZ25hbDxUPmApLlxyXG4gKiBUaGlzIGFsbG93cyBzcGVjaWZ5aW5nIG9wdGlvbnMgbGlrZSBhIGN1c3RvbSBgZXF1YWxgIGZ1bmN0aW9uIGZvciBpdGVtIGNvbXBhcmlzb24uXHJcbiAqXHJcbiAqIEByZXR1cm5zIEEgYFNpZ25hbDxVW10+YCBjb250YWluaW5nIHRoZSBtYXBwZWQgYXJyYXkuIFRoaXMgc2lnbmFsIHVwZGF0ZXMgd2hlbmV2ZXJcclxuICogdGhlIHNvdXJjZSBhcnJheSBjaGFuZ2VzIChlaXRoZXIgbGVuZ3RoIG9yIHRoZSB2YWx1ZXMgb2YgaXRzIGl0ZW1zKS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3Qgc291cmNlSXRlbXMgPSBzaWduYWwoW1xyXG4gKiB7IGlkOiAxLCBuYW1lOiAnQXBwbGUnIH0sXHJcbiAqIHsgaWQ6IDIsIG5hbWU6ICdCYW5hbmEnIH1cclxuICogXSk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hcHBlZEl0ZW1zID0gbWFwQXJyYXkoXHJcbiAqIHNvdXJjZUl0ZW1zLFxyXG4gKiAoaXRlbVNpZ25hbCwgaW5kZXgpID0+IHtcclxuICogLy8gaXRlbVNpZ25hbCBpcyBzdGFibGUgZm9yIGEgZ2l2ZW4gaXRlbSBiYXNlZCBvbiBpdHMgaW5kZXguXHJcbiAqIC8vIFdlIGNyZWF0ZSBhIGNvbXB1dGVkIGhlcmUgdG8gcmVhY3QgdG8gY2hhbmdlcyBpbiB0aGUgaXRlbSdzIG5hbWUuXHJcbiAqICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gYCR7aW5kZXh9OiAke2l0ZW1TaWduYWwoKS5uYW1lLnRvVXBwZXJDYXNlKCl9YCk7XHJcbiAqIH0sXHJcbiAqIC8vIEV4YW1wbGUgb3B0aW9uYWwgb3B0aW9ucyAoZS5nLiwgY3VzdG9tIGVxdWFsaXR5IGZvciBpdGVtIHNpZ25hbHMpXHJcbiAqIHsgZXF1YWw6IChhLCBiKSA9PiBhLmlkID09PSBiLmlkICYmIGEubmFtZSA9PT0gYi5uYW1lIH1cclxuICogKTtcclxuICogYGBgXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoaXMgZnVuY3Rpb24gYWNoaWV2ZXMgaXRzIGhpZ2ggcGVyZm9ybWFuY2UgYnkgbGV2ZXJhZ2luZyB0aGUgbmV3IGBsaW5rZWRTaWduYWxgXHJcbiAqIEFQSSBmcm9tIEFuZ3VsYXIsIHdoaWNoIGFsbG93cyBmb3IgZWZmaWNpZW50IG1lbW9pemF0aW9uIGFuZCByZXVzZSBvZiBhcnJheSBpdGVtcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXBBcnJheTxULCBVPihcclxuICBzb3VyY2U6ICgpID0+IFRbXSxcclxuICBtYXA6ICh2YWx1ZTogU2lnbmFsPFQ+LCBpbmRleDogbnVtYmVyKSA9PiBVLFxyXG4gIG9wdD86IENyZWF0ZVNpZ25hbE9wdGlvbnM8VD4sXHJcbik6IFNpZ25hbDxVW10+IHtcclxuICBjb25zdCBkYXRhID0gaXNTaWduYWwoc291cmNlKSA/IHNvdXJjZSA6IGNvbXB1dGVkKHNvdXJjZSk7XHJcbiAgY29uc3QgbGVuID0gY29tcHV0ZWQoKCkgPT4gZGF0YSgpLmxlbmd0aCk7XHJcblxyXG4gIHJldHVybiBsaW5rZWRTaWduYWw8bnVtYmVyLCBVW10+KHtcclxuICAgIHNvdXJjZTogKCkgPT4gbGVuKCksXHJcbiAgICBjb21wdXRhdGlvbjogKGxlbiwgcHJldikgPT4ge1xyXG4gICAgICBpZiAoIXByZXYpXHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGxlbiB9LCAoXywgaSkgPT5cclxuICAgICAgICAgIG1hcChcclxuICAgICAgICAgICAgY29tcHV0ZWQoKCkgPT4gc291cmNlKClbaV0sIG9wdCksXHJcbiAgICAgICAgICAgIGksXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBpZiAobGVuID09PSBwcmV2LnZhbHVlLmxlbmd0aCkgcmV0dXJuIHByZXYudmFsdWU7XHJcblxyXG4gICAgICBpZiAobGVuIDwgcHJldi52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gcHJldi52YWx1ZS5zbGljZSgwLCBsZW4pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBbLi4ucHJldi52YWx1ZV07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHByZXYudmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgIG5leHRbaV0gPSBtYXAoXHJcbiAgICAgICAgICAgIGNvbXB1dGVkKCgpID0+IHNvdXJjZSgpW2ldLCBvcHQpLFxyXG4gICAgICAgICAgICBpLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBlcXVhbDogKGEsIGIpID0+IGEubGVuZ3RoID09PSBiLmxlbmd0aCxcclxuICB9KTtcclxufVxyXG4iXX0=","import { isPlatformServer } from '@angular/common';\nimport { computed, DestroyRef, inject, PLATFORM_ID, signal, } from '@angular/core';\n/**\n * Creates a read-only signal that reactively tracks whether a CSS media query\n * string currently matches.\n *\n * It uses `window.matchMedia` to evaluate the query and listen for changes.\n * The primitive is SSR-safe (defaults to `false` on the server) and automatically\n * cleans up its event listeners when the creating context is destroyed.\n *\n * @param query The CSS media query string to evaluate (e.g., `'(min-width: 768px)'`, `'(prefers-color-scheme: dark)'`).\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<boolean>` which is `true` if the media query\n * currently matches, and `false` otherwise.\n *\n * @remarks\n * - On the server, this signal will always return `false` by default.\n * - It automatically updates if the match status of the media query changes in the browser.\n * - Event listeners are cleaned up automatically via `DestroyRef` if created in an injection context.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { mediaQuery } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-responsive-layout',\n * template: `\n * @if (isDesktop()) {\n * <p>Showing desktop layout.</p>\n * } @else {\n * <p>Showing mobile layout.</p>\n * }\n * `\n * })\n * export class ResponsiveLayoutComponent {\n * readonly isDesktop = mediaQuery('(min-width: 1024px)');\n *\n * constructor() {\n * effect(() => {\n * console.log('Is desktop view:', this.isDesktop());\n * });\n * }\n * }\n * ```\n */\nexport function mediaQuery(query, debugName) {\n if (isPlatformServer(inject(PLATFORM_ID)))\n return computed(() => false, { debugName });\n const mediaQueryList = window.matchMedia(query);\n const state = signal(mediaQueryList.matches, { debugName });\n const handleChange = (event) => {\n state.set(event.matches);\n };\n mediaQueryList.addEventListener('change', handleChange);\n inject(DestroyRef).onDestroy(() => {\n mediaQueryList.removeEventListener('change', handleChange);\n });\n return state.asReadonly();\n}\n/**\n * Creates a read-only signal that tracks the user's OS/browser preference\n * for a dark color scheme using the `(prefers-color-scheme: dark)` media query.\n *\n * This is a convenience wrapper around the generic `mediaQuery` primitive.\n * It's SSR-safe (defaults to `false` on the server) and automatically\n * cleans up its event listeners.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<boolean>` which is `true` if a dark theme\n * is preferred, and `false` otherwise.\n * @see {mediaQuery} for the underlying implementation.\n *\n * @example\n * ```ts\n * const isDarkMode = prefersDarkMode();\n * effect(() => {\n * document.body.classList.toggle('dark-theme', isDarkMode());\n * });\n * ```\n */\nexport function prefersDarkMode(debugName) {\n return mediaQuery('(prefers-color-scheme: dark)', debugName);\n}\n/**\n * Creates a read-only signal that tracks the user's OS/browser preference\n * for reduced motion using the `(prefers-reduced-motion: reduce)` media query.\n *\n * This is a convenience wrapper around the generic `mediaQuery` primitive.\n * It's SSR-safe (defaults to `false` on the server) and automatically\n * cleans up its event listeners.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<boolean>` which is `true` if reduced motion\n * is preferred, and `false` otherwise.\n * @see {mediaQuery} for the underlying implementation.\n *\n * @example\n * ```ts\n * const reduceMotion = prefersReducedMotion();\n * effect(() => {\n * if (reduceMotion()) {\n * // Apply simplified animations or disable them\n * } else {\n * // Apply full animations\n * }\n * });\n * ```\n */\nexport function prefersReducedMotion(debugName) {\n return mediaQuery('(prefers-reduced-motion: reduce)', debugName);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEtcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3NyYy9saWIvc2Vuc29ycy9tZWRpYS1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUNYLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYSxFQUFFLFNBQWtCO0lBQzFELElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFOUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFNUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUEwQixFQUFFLEVBQUU7UUFDbEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDO0lBRUYsY0FBYyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV4RCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsU0FBa0I7SUFDaEQsT0FBTyxVQUFVLENBQUMsOEJBQThCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsU0FBa0I7SUFDckQsT0FBTyxVQUFVLENBQUMsa0NBQWtDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIGluamVjdCxcbiAgUExBVEZPUk1fSUQsXG4gIHNpZ25hbCxcbiAgU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNpZ25hbCB0aGF0IHJlYWN0aXZlbHkgdHJhY2tzIHdoZXRoZXIgYSBDU1MgbWVkaWEgcXVlcnlcbiAqIHN0cmluZyBjdXJyZW50bHkgbWF0Y2hlcy5cbiAqXG4gKiBJdCB1c2VzIGB3aW5kb3cubWF0Y2hNZWRpYWAgdG8gZXZhbHVhdGUgdGhlIHF1ZXJ5IGFuZCBsaXN0ZW4gZm9yIGNoYW5nZXMuXG4gKiBUaGUgcHJpbWl0aXZlIGlzIFNTUi1zYWZlIChkZWZhdWx0cyB0byBgZmFsc2VgIG9uIHRoZSBzZXJ2ZXIpIGFuZCBhdXRvbWF0aWNhbGx5XG4gKiBjbGVhbnMgdXAgaXRzIGV2ZW50IGxpc3RlbmVycyB3aGVuIHRoZSBjcmVhdGluZyBjb250ZXh0IGlzIGRlc3Ryb3llZC5cbiAqXG4gKiBAcGFyYW0gcXVlcnkgVGhlIENTUyBtZWRpYSBxdWVyeSBzdHJpbmcgdG8gZXZhbHVhdGUgKGUuZy4sIGAnKG1pbi13aWR0aDogNzY4cHgpJ2AsIGAnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSdgKS5cbiAqIEBwYXJhbSBkZWJ1Z05hbWUgT3B0aW9uYWwgZGVidWcgbmFtZSBmb3IgdGhlIHNpZ25hbC5cbiAqIEByZXR1cm5zIEEgcmVhZC1vbmx5IGBTaWduYWw8Ym9vbGVhbj5gIHdoaWNoIGlzIGB0cnVlYCBpZiB0aGUgbWVkaWEgcXVlcnlcbiAqIGN1cnJlbnRseSBtYXRjaGVzLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQHJlbWFya3NcbiAqIC0gT24gdGhlIHNlcnZlciwgdGhpcyBzaWduYWwgd2lsbCBhbHdheXMgcmV0dXJuIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAqIC0gSXQgYXV0b21hdGljYWxseSB1cGRhdGVzIGlmIHRoZSBtYXRjaCBzdGF0dXMgb2YgdGhlIG1lZGlhIHF1ZXJ5IGNoYW5nZXMgaW4gdGhlIGJyb3dzZXIuXG4gKiAtIEV2ZW50IGxpc3RlbmVycyBhcmUgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHZpYSBgRGVzdHJveVJlZmAgaWYgY3JlYXRlZCBpbiBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IENvbXBvbmVudCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQgeyBtZWRpYVF1ZXJ5IH0gZnJvbSAnQG1tc3RhY2svcHJpbWl0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ2FwcC1yZXNwb25zaXZlLWxheW91dCcsXG4gKiB0ZW1wbGF0ZTogYFxuICogQGlmIChpc0Rlc2t0b3AoKSkge1xuICogPHA+U2hvd2luZyBkZXNrdG9wIGxheW91dC48L3A+XG4gKiB9IEBlbHNlIHtcbiAqIDxwPlNob3dpbmcgbW9iaWxlIGxheW91dC48L3A+XG4gKiB9XG4gKiBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIFJlc3BvbnNpdmVMYXlvdXRDb21wb25lbnQge1xuICogcmVhZG9ubHkgaXNEZXNrdG9wID0gbWVkaWFRdWVyeSgnKG1pbi13aWR0aDogMTAyNHB4KScpO1xuICpcbiAqIGNvbnN0cnVjdG9yKCkge1xuICogZWZmZWN0KCgpID0+IHtcbiAqIGNvbnNvbGUubG9nKCdJcyBkZXNrdG9wIHZpZXc6JywgdGhpcy5pc0Rlc2t0b3AoKSk7XG4gKiB9KTtcbiAqIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVkaWFRdWVyeShxdWVyeTogc3RyaW5nLCBkZWJ1Z05hbWU/OiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICBpZiAoaXNQbGF0Zm9ybVNlcnZlcihpbmplY3QoUExBVEZPUk1fSUQpKSlcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZmFsc2UsIHsgZGVidWdOYW1lIH0pO1xuXG4gIGNvbnN0IG1lZGlhUXVlcnlMaXN0ID0gd2luZG93Lm1hdGNoTWVkaWEocXVlcnkpO1xuXG4gIGNvbnN0IHN0YXRlID0gc2lnbmFsKG1lZGlhUXVlcnlMaXN0Lm1hdGNoZXMsIHsgZGVidWdOYW1lIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChldmVudDogTWVkaWFRdWVyeUxpc3RFdmVudCkgPT4ge1xuICAgIHN0YXRlLnNldChldmVudC5tYXRjaGVzKTtcbiAgfTtcblxuICBtZWRpYVF1ZXJ5TGlzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVDaGFuZ2UpO1xuXG4gIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgIG1lZGlhUXVlcnlMaXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZUNoYW5nZSk7XG4gIH0pO1xuXG4gIHJldHVybiBzdGF0ZS5hc1JlYWRvbmx5KCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWQtb25seSBzaWduYWwgdGhhdCB0cmFja3MgdGhlIHVzZXIncyBPUy9icm93c2VyIHByZWZlcmVuY2VcbiAqIGZvciBhIGRhcmsgY29sb3Igc2NoZW1lIHVzaW5nIHRoZSBgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKWAgbWVkaWEgcXVlcnkuXG4gKlxuICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBnZW5lcmljIGBtZWRpYVF1ZXJ5YCBwcmltaXRpdmUuXG4gKiBJdCdzIFNTUi1zYWZlIChkZWZhdWx0cyB0byBgZmFsc2VgIG9uIHRoZSBzZXJ2ZXIpIGFuZCBhdXRvbWF0aWNhbGx5XG4gKiBjbGVhbnMgdXAgaXRzIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAcGFyYW0gZGVidWdOYW1lIE9wdGlvbmFsIGRlYnVnIG5hbWUgZm9yIHRoZSBzaWduYWwuXG4gKiBAcmV0dXJucyBBIHJlYWQtb25seSBgU2lnbmFsPGJvb2xlYW4+YCB3aGljaCBpcyBgdHJ1ZWAgaWYgYSBkYXJrIHRoZW1lXG4gKiBpcyBwcmVmZXJyZWQsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBzZWUge21lZGlhUXVlcnl9IGZvciB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGlzRGFya01vZGUgPSBwcmVmZXJzRGFya01vZGUoKTtcbiAqIGVmZmVjdCgoKSA9PiB7XG4gKiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2RhcmstdGhlbWUnLCBpc0RhcmtNb2RlKCkpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZlcnNEYXJrTW9kZShkZWJ1Z05hbWU/OiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICByZXR1cm4gbWVkaWFRdWVyeSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScsIGRlYnVnTmFtZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWQtb25seSBzaWduYWwgdGhhdCB0cmFja3MgdGhlIHVzZXIncyBPUy9icm93c2VyIHByZWZlcmVuY2VcbiAqIGZvciByZWR1Y2VkIG1vdGlvbiB1c2luZyB0aGUgYChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpYCBtZWRpYSBxdWVyeS5cbiAqXG4gKiBUaGlzIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIGdlbmVyaWMgYG1lZGlhUXVlcnlgIHByaW1pdGl2ZS5cbiAqIEl0J3MgU1NSLXNhZmUgKGRlZmF1bHRzIHRvIGBmYWxzZWAgb24gdGhlIHNlcnZlcikgYW5kIGF1dG9tYXRpY2FsbHlcbiAqIGNsZWFucyB1cCBpdHMgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSBkZWJ1Z05hbWUgT3B0aW9uYWwgZGVidWcgbmFtZSBmb3IgdGhlIHNpZ25hbC5cbiAqIEByZXR1cm5zIEEgcmVhZC1vbmx5IGBTaWduYWw8Ym9vbGVhbj5gIHdoaWNoIGlzIGB0cnVlYCBpZiByZWR1Y2VkIG1vdGlvblxuICogaXMgcHJlZmVycmVkLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAc2VlIHttZWRpYVF1ZXJ5fSBmb3IgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCByZWR1Y2VNb3Rpb24gPSBwcmVmZXJzUmVkdWNlZE1vdGlvbigpO1xuICogZWZmZWN0KCgpID0+IHtcbiAqIGlmIChyZWR1Y2VNb3Rpb24oKSkge1xuICogLy8gQXBwbHkgc2ltcGxpZmllZCBhbmltYXRpb25zIG9yIGRpc2FibGUgdGhlbVxuICogfSBlbHNlIHtcbiAqIC8vIEFwcGx5IGZ1bGwgYW5pbWF0aW9uc1xuICogfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKGRlYnVnTmFtZT86IHN0cmluZyk6IFNpZ25hbDxib29sZWFuPiB7XG4gIHJldHVybiBtZWRpYVF1ZXJ5KCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScsIGRlYnVnTmFtZSk7XG59XG4iXX0=","import { computed, DestroyRef, inject, signal, untracked, } from '@angular/core';\nimport { toWritable } from './to-writable';\n/**\n * A convenience function that creates and throttles a new `WritableSignal` in one step.\n *\n * @see {throttle} for the core implementation details.\n *\n * @template T The type of value the signal holds.\n * @param initial The initial value of the signal.\n * @param opt Options for signal creation, including throttle time `ms`.\n * @returns A `ThrottledSignal<T>` instance.\n *\n * @example\n * const query = throttled('', { ms: 500 });\n * effect(() => console.log('Throttled Query:', query()));\n *\n * query.set('a');\n * query.set('b');\n * query.set('c');\n * // With a trailing-edge throttle, the final value 'c' would be set\n * // after the 500ms cooldown.\n */\nexport function throttled(initial, opt) {\n return throttle(signal(initial, opt), opt);\n}\n/**\n * Wraps an existing `WritableSignal` to create a new one whose readable value is throttled.\n *\n * This implementation avoids using `effect` by pairing a trigger signal with an `untracked`\n * read of the source signal to control when the throttled value is re-evaluated.\n *\n * @template T The type of value the signal holds.\n * @param source The source `WritableSignal` to wrap. Writes are applied to this signal immediately.\n * @param opt Options for throttling, including throttle time `ms` and an optional `DestroyRef`.\n * @returns A new `ThrottledSignal<T>` whose read value is throttled. The `.original` property\n * of the returned signal is a reference back to the provided `source` signal.\n *\n * @example\n * const query = throttled('', { ms: 500 });\n * effect(() => console.log('Throttled Query:', query()));\n *\n * query.set('a');\n * query.set('b');\n * query.set('c');\n * // With a trailing-edge throttle, the final value 'c' would be set\n * // after the 500ms cooldown.\n */\nexport function throttle(source, opt) {\n const ms = opt?.ms ?? 0;\n const trigger = signal(false);\n let timeout;\n try {\n const destroyRef = opt?.destroyRef ?? inject(DestroyRef, { optional: true });\n destroyRef?.onDestroy(() => {\n if (timeout)\n clearTimeout(timeout);\n timeout = undefined;\n });\n }\n catch {\n // not in injection context & no destroyRef provided opting out of cleanup\n }\n const triggerFn = (updateSourceAction) => {\n updateSourceAction();\n if (timeout)\n return;\n timeout = setTimeout(() => {\n trigger.update((c) => !c);\n timeout = undefined;\n }, ms);\n };\n const set = (value) => {\n triggerFn(() => source.set(value));\n };\n const update = (fn) => {\n triggerFn(() => source.update(fn));\n };\n const writable = toWritable(computed(() => {\n trigger();\n return untracked(source);\n }, opt), set, update);\n writable.original = source;\n return writable;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL3Rocm90dGxlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBaUMzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLE9BQVUsRUFDVixHQUErQjtJQUUvQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsTUFBeUIsRUFDekIsR0FBK0I7SUFFL0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFeEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlCLElBQUksT0FBa0QsQ0FBQztJQUV2RCxJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FDZCxHQUFHLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1RCxVQUFVLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6QixJQUFJLE9BQU87Z0JBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsMEVBQTBFO0lBQzVFLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLGtCQUE4QixFQUFFLEVBQUU7UUFDbkQsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU87WUFBRSxPQUFPO1FBRXBCLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUN0QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUM7SUFFRixNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO1FBQ3ZCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFrQixFQUFFLEVBQUU7UUFDcEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQ3pCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDWixPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFDUCxHQUFHLEVBQ0gsTUFBTSxDQUNlLENBQUM7SUFDeEIsUUFBUSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFFM0IsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICB0eXBlIENyZWF0ZVNpZ25hbE9wdGlvbnMsXG4gIERlc3Ryb3lSZWYsXG4gIGluamVjdCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHR5cGUgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGVib3VuY2VkU2lnbmFsIH0gZnJvbSAnLi9kZWJvdW5jZWQnO1xuaW1wb3J0IHsgdG9Xcml0YWJsZSB9IGZyb20gJy4vdG8td3JpdGFibGUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgdGhyb3R0bGVkIHdyaXRhYmxlIHNpZ25hbC5cbiAqIEV4dGVuZHMgQW5ndWxhcidzIGBDcmVhdGVTaWduYWxPcHRpb25zYCB3aXRoIGEgdGhyb3R0bGUgdGltZSBzZXR0aW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIHNpZ25hbC5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlVGhyb3R0bGVkT3B0aW9uczxUPiA9IENyZWF0ZVNpZ25hbE9wdGlvbnM8VD4gJiB7XG4gIC8qKlxuICAgKiBUaGUgdGhyb3R0bGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBUaGUgbWluaW11bSB0aW1lXG4gICAqIGluIG1pbGxpc2Vjb25kcyB0aGF0IG11c3QgcGFzcyBiZXR3ZWVuIHVwZGF0ZXMgdG8gdGhlIHRocm90dGxlZCBzaWduYWwncyB2YWx1ZS5cbiAgICovXG4gIG1zPzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgYERlc3Ryb3lSZWZgIHRvIGNsZWFuIHVwIHRoZSB0aHJvdHRsZSB0aW1lciB3aGVuIHRoZSBzaWduYWwgaXMgZGVzdHJveWVkLlxuICAgKiBJZiBwcm92aWRlZCwgdGhlIHRpbWVyIHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBzaWduYWwgaXMgZGVzdHJveWVkLlxuICAgKiBJZiB0aGUgc2lnbmFsIGlzIGNhbGxlZCB3aXRoaW4gYSByZWFjdGl2ZSBjb250ZXh0IGEgRGVzdHJveVJlZiBpcyBpbmplY3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgb3IgaW5qZWN0ZWQsIHRoZSB0aW1lciB3aWxsIG5vdCBiZSBjbGVhcmVkIGF1dG9tYXRpY2FsbHkuLi53aGljaCBpcyB1c3VhbGx5IGZpbmUgOilcbiAgICovXG4gIGRlc3Ryb3lSZWY/OiBEZXN0cm95UmVmO1xufTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIGBXcml0YWJsZVNpZ25hbGAgd2hvc2UgcHVibGljbHkgcmVhZGFibGUgdmFsdWUgdXBkYXRlcyBhcmUgdGhyb3R0bGVkLlxuICpcbiAqIEl0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZywgbm9uLXRocm90dGxlZCBzaWduYWwgdmlhIHRoZSBgb3JpZ2luYWxgIHByb3BlcnR5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIHNpZ25hbC5cbiAqIEBzZWUge0RlYm91bmNlZFNpZ25hbH0gYXMgdGhlIG91dHB1dCB0eXBlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFRocm90dGxlZFNpZ25hbDxUPiA9IERlYm91bmNlZFNpZ25hbDxUPjtcblxuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbmQgdGhyb3R0bGVzIGEgbmV3IGBXcml0YWJsZVNpZ25hbGAgaW4gb25lIHN0ZXAuXG4gKlxuICogQHNlZSB7dGhyb3R0bGV9IGZvciB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIHRoZSBzaWduYWwgaG9sZHMuXG4gKiBAcGFyYW0gaW5pdGlhbCBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2lnbmFsLlxuICogQHBhcmFtIG9wdCBPcHRpb25zIGZvciBzaWduYWwgY3JlYXRpb24sIGluY2x1ZGluZyB0aHJvdHRsZSB0aW1lIGBtc2AuXG4gKiBAcmV0dXJucyBBIGBUaHJvdHRsZWRTaWduYWw8VD5gIGluc3RhbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdWVyeSA9IHRocm90dGxlZCgnJywgeyBtczogNTAwIH0pO1xuICogZWZmZWN0KCgpID0+IGNvbnNvbGUubG9nKCdUaHJvdHRsZWQgUXVlcnk6JywgcXVlcnkoKSkpO1xuICpcbiAqIHF1ZXJ5LnNldCgnYScpO1xuICogcXVlcnkuc2V0KCdiJyk7XG4gKiBxdWVyeS5zZXQoJ2MnKTtcbiAqIC8vIFdpdGggYSB0cmFpbGluZy1lZGdlIHRocm90dGxlLCB0aGUgZmluYWwgdmFsdWUgJ2MnIHdvdWxkIGJlIHNldFxuICogLy8gYWZ0ZXIgdGhlIDUwMG1zIGNvb2xkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGVkPFQ+KFxuICBpbml0aWFsOiBULFxuICBvcHQ/OiBDcmVhdGVUaHJvdHRsZWRPcHRpb25zPFQ+LFxuKTogRGVib3VuY2VkU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIHRocm90dGxlKHNpZ25hbChpbml0aWFsLCBvcHQpLCBvcHQpO1xufVxuXG4vKipcbiAqIFdyYXBzIGFuIGV4aXN0aW5nIGBXcml0YWJsZVNpZ25hbGAgdG8gY3JlYXRlIGEgbmV3IG9uZSB3aG9zZSByZWFkYWJsZSB2YWx1ZSBpcyB0aHJvdHRsZWQuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhdm9pZHMgdXNpbmcgYGVmZmVjdGAgYnkgcGFpcmluZyBhIHRyaWdnZXIgc2lnbmFsIHdpdGggYW4gYHVudHJhY2tlZGBcbiAqIHJlYWQgb2YgdGhlIHNvdXJjZSBzaWduYWwgdG8gY29udHJvbCB3aGVuIHRoZSB0aHJvdHRsZWQgdmFsdWUgaXMgcmUtZXZhbHVhdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIHRoZSBzaWduYWwgaG9sZHMuXG4gKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgYFdyaXRhYmxlU2lnbmFsYCB0byB3cmFwLiBXcml0ZXMgYXJlIGFwcGxpZWQgdG8gdGhpcyBzaWduYWwgaW1tZWRpYXRlbHkuXG4gKiBAcGFyYW0gb3B0IE9wdGlvbnMgZm9yIHRocm90dGxpbmcsIGluY2x1ZGluZyB0aHJvdHRsZSB0aW1lIGBtc2AgYW5kIGFuIG9wdGlvbmFsIGBEZXN0cm95UmVmYC5cbiAqIEByZXR1cm5zIEEgbmV3IGBUaHJvdHRsZWRTaWduYWw8VD5gIHdob3NlIHJlYWQgdmFsdWUgaXMgdGhyb3R0bGVkLiBUaGUgYC5vcmlnaW5hbGAgcHJvcGVydHlcbiAqIG9mIHRoZSByZXR1cm5lZCBzaWduYWwgaXMgYSByZWZlcmVuY2UgYmFjayB0byB0aGUgcHJvdmlkZWQgYHNvdXJjZWAgc2lnbmFsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdWVyeSA9IHRocm90dGxlZCgnJywgeyBtczogNTAwIH0pO1xuICogZWZmZWN0KCgpID0+IGNvbnNvbGUubG9nKCdUaHJvdHRsZWQgUXVlcnk6JywgcXVlcnkoKSkpO1xuICpcbiAqIHF1ZXJ5LnNldCgnYScpO1xuICogcXVlcnkuc2V0KCdiJyk7XG4gKiBxdWVyeS5zZXQoJ2MnKTtcbiAqIC8vIFdpdGggYSB0cmFpbGluZy1lZGdlIHRocm90dGxlLCB0aGUgZmluYWwgdmFsdWUgJ2MnIHdvdWxkIGJlIHNldFxuICogLy8gYWZ0ZXIgdGhlIDUwMG1zIGNvb2xkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGU8VD4oXG4gIHNvdXJjZTogV3JpdGFibGVTaWduYWw8VD4sXG4gIG9wdD86IENyZWF0ZVRocm90dGxlZE9wdGlvbnM8VD4sXG4pOiBUaHJvdHRsZWRTaWduYWw8VD4ge1xuICBjb25zdCBtcyA9IG9wdD8ubXMgPz8gMDtcblxuICBjb25zdCB0cmlnZ2VyID0gc2lnbmFsKGZhbHNlKTtcblxuICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZXN0cm95UmVmID1cbiAgICAgIG9wdD8uZGVzdHJveVJlZiA/PyBpbmplY3QoRGVzdHJveVJlZiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIGRlc3Ryb3lSZWY/Lm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICBpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm90IGluIGluamVjdGlvbiBjb250ZXh0ICYgbm8gZGVzdHJveVJlZiBwcm92aWRlZCBvcHRpbmcgb3V0IG9mIGNsZWFudXBcbiAgfVxuXG4gIGNvbnN0IHRyaWdnZXJGbiA9ICh1cGRhdGVTb3VyY2VBY3Rpb246ICgpID0+IHZvaWQpID0+IHtcbiAgICB1cGRhdGVTb3VyY2VBY3Rpb24oKTtcbiAgICBpZiAodGltZW91dCkgcmV0dXJuO1xuXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJpZ2dlci51cGRhdGUoKGMpID0+ICFjKTtcbiAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfSwgbXMpO1xuICB9O1xuXG4gIGNvbnN0IHNldCA9ICh2YWx1ZTogVCkgPT4ge1xuICAgIHRyaWdnZXJGbigoKSA9PiBzb3VyY2Uuc2V0KHZhbHVlKSk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlID0gKGZuOiAocHJldjogVCkgPT4gVCkgPT4ge1xuICAgIHRyaWdnZXJGbigoKSA9PiBzb3VyY2UudXBkYXRlKGZuKSk7XG4gIH07XG5cbiAgY29uc3Qgd3JpdGFibGUgPSB0b1dyaXRhYmxlKFxuICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICAgIHJldHVybiB1bnRyYWNrZWQoc291cmNlKTtcbiAgICB9LCBvcHQpLFxuICAgIHNldCxcbiAgICB1cGRhdGUsXG4gICkgYXMgVGhyb3R0bGVkU2lnbmFsPFQ+O1xuICB3cml0YWJsZS5vcmlnaW5hbCA9IHNvdXJjZTtcblxuICByZXR1cm4gd3JpdGFibGU7XG59XG4iXX0=","import { isPlatformServer } from '@angular/common';\nimport { computed, DestroyRef, ElementRef, inject, isDevMode, PLATFORM_ID, } from '@angular/core';\nimport { throttled } from '../throttled';\n/**\n * Creates a read-only signal that tracks the mouse cursor's position.\n *\n * It can track mouse movements on a specific target (window, document, or element)\n * and optionally include touch movements. The coordinate space ('client' or 'page')\n * can also be configured.\n * The primitive is SSR-safe and automatically cleans up its event listeners.\n *\n * @param options Optional configuration for the sensor.\n * @returns A read-only `Signal<MousePosition>`. On the server, it returns a static\n * signal with `{ x: 0, y: 0 }`.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { mousePosition } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-mouse-tracker',\n * template: `<p>Mouse Position: X: {{ pos().x }}, Y: {{ pos().y }}</p>`\n * })\n * export class MouseTrackerComponent {\n * readonly pos = mousePosition({ coordinateSpace: 'page' });\n *\n * constructor() {\n * effect(() => {\n * console.log('Mouse moved to:', this.pos());\n * });\n * }\n * }\n * ```\n */\nexport function mousePosition(opt) {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const base = computed(() => ({\n x: 0,\n y: 0,\n }), {\n debugName: opt?.debugName,\n });\n base.unthrottled = base;\n return base;\n }\n const { target = window, coordinateSpace = 'client', touch = false, debugName, throttle = 100, } = opt ?? {};\n const eventTarget = target instanceof ElementRef ? target.nativeElement : target;\n if (!eventTarget) {\n if (isDevMode())\n console.warn('mousePosition: Target element not found.');\n const base = computed(() => ({\n x: 0,\n y: 0,\n }), {\n debugName,\n });\n base.unthrottled = base;\n return base;\n }\n const pos = throttled({ x: 0, y: 0 }, {\n ms: throttle,\n equal: (a, b) => a.x === b.x && a.y === b.y,\n debugName,\n });\n const updatePosition = (event) => {\n let x, y;\n if (event instanceof MouseEvent) {\n x = coordinateSpace === 'page' ? event.pageX : event.clientX;\n y = coordinateSpace === 'page' ? event.pageY : event.clientY;\n }\n else if (event.touches.length > 0) {\n const firstTouch = event.touches[0];\n x = coordinateSpace === 'page' ? firstTouch.pageX : firstTouch.clientX;\n y = coordinateSpace === 'page' ? firstTouch.pageY : firstTouch.clientY;\n }\n else {\n return;\n }\n pos.set({ x, y });\n };\n eventTarget.addEventListener('mousemove', updatePosition);\n if (touch) {\n eventTarget.addEventListener('touchmove', updatePosition);\n }\n inject(DestroyRef).onDestroy(() => {\n eventTarget.removeEventListener('mousemove', updatePosition);\n if (touch) {\n eventTarget.removeEventListener('touchmove', updatePosition);\n }\n });\n const base = pos.asReadonly();\n base.unthrottled = pos.original;\n return base;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW91c2UtcG9zaXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3NyYy9saWIvc2Vuc29ycy9tb3VzZS1wb3NpdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXlEekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQTBCO0lBQ3RELElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQ25CLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDTCxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1NBQ0wsQ0FBQyxFQUNGO1lBQ0UsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTO1NBQzFCLENBQzZCLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxFQUNKLE1BQU0sR0FBRyxNQUFNLEVBQ2YsZUFBZSxHQUFHLFFBQVEsRUFDMUIsS0FBSyxHQUFHLEtBQUssRUFDYixTQUFTLEVBQ1QsUUFBUSxHQUFHLEdBQUcsR0FDZixHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFFZCxNQUFNLFdBQVcsR0FDZixNQUFNLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMs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IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGhyb3R0bGVkIH0gZnJvbSAnLi4vdGhyb3R0bGVkJztcblxudHlwZSBNb3VzZVBvc2l0aW9uID0ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIGBtb3VzZVBvc2l0aW9uYCBzZW5zb3IuXG4gKi9cbmV4cG9ydCB0eXBlIE1vdXNlUG9zaXRpb25PcHRpb25zID0ge1xuICAvKipcbiAgICogVGhlIHRhcmdldCBlbGVtZW50IHRvIGxpc3RlbiBmb3IgbW91c2UgbW92ZW1lbnRzIG9uLlxuICAgKiBDYW4gYmUgYHdpbmRvd2AsIGBkb2N1bWVudGAsIGFuIGBIVE1MRWxlbWVudGAsIG9yIGFuIGBFbGVtZW50UmVmPEhUTUxFbGVtZW50PmAuXG4gICAqIEBkZWZhdWx0IHdpbmRvd1xuICAgKi9cbiAgdGFyZ2V0PzogV2luZG93IHwgRG9jdW1lbnQgfCBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAvKipcbiAgICogRGVmaW5lcyB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHRoZSByZXBvcnRlZCBwb3NpdGlvbi5cbiAgICogLSBgJ2NsaWVudCdgOiBDb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKGBjbGllbnRYYCwgYGNsaWVudFlgKS5cbiAgICogLSBgJ3BhZ2UnYDogQ29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIGVudGlyZSBkb2N1bWVudCAoYHBhZ2VYYCwgYHBhZ2VZYCkuXG4gICAqIEBkZWZhdWx0ICdjbGllbnQnXG4gICAqL1xuICBjb29yZGluYXRlU3BhY2U/OiAnY2xpZW50JyB8ICdwYWdlJztcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIHNlbnNvciB3aWxsIGFsc28gbGlzdGVuIHRvIGB0b3VjaG1vdmVgIGV2ZW50cyBhbmQgcmVwb3J0XG4gICAqIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0b3VjaD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZWJ1ZyBuYW1lIGZvciB0aGUgaW50ZXJuYWwgc2lnbmFsLlxuICAgKi9cbiAgZGVidWdOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIHRoZSB1cGRhdGVzLlxuICAgKiBAZGVmYXVsdCAxMDBcbiAgICovXG4gIHRocm90dGxlPzogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBAaW50ZXJuYWwgdXNlZCBmb3Igc2V0dGluZyB0aGUgc2luY2Ugc2lnbmFsXG4gKi9cbnR5cGUgSW50ZXJuYWxNb3VzZVBvc2l0aW9uU2lnbmFsID0gU2lnbmFsPE1vdXNlUG9zaXRpb24+ICYge1xuICB1bnRocm90dGxlZDogU2lnbmFsPE1vdXNlUG9zaXRpb24+O1xufTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIFNpZ25hbCB0aGF0IHRyYWNrcyBtb3VzZSBwb3NpdGlvbiB3aXRoaW4gYW4gZWxlbWVudC5cbiAqIEl0J3MgYSB0aHJvdHRsZWQgc2lnbmFsIG9mIHRoZSBtb3VzZSBjb29yZGluYXRlcyB3aXRoIGFuIGF0dGFjaGVkIGB1bnRocm90dGxlZGAgc2lnbmFsLlxuICovXG5leHBvcnQgdHlwZSBNb3VzZVBvc2l0aW9uU2lnbmFsID0gU2lnbmFsPE1vdXNlUG9zaXRpb24+ICYge1xuICAvKiogQSBzaWduYWwgcHJvdmlkaW5nIHRoZSByYXcsIHVudGhyb3R0bGVkIG1vdXNlIHBvc2l0aW9uLiAqL1xuICByZWFkb25seSB1bnRocm90dGxlZDogU2lnbmFsPE1vdXNlUG9zaXRpb24+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgbW91c2UgY3Vyc29yJ3MgcG9zaXRpb24uXG4gKlxuICogSXQgY2FuIHRyYWNrIG1vdXNlIG1vdmVtZW50cyBvbiBhIHNwZWNpZmljIHRhcmdldCAod2luZG93LCBkb2N1bWVudCwgb3IgZWxlbWVudClcbiAqIGFuZCBvcHRpb25hbGx5IGluY2x1ZGUgdG91Y2ggbW92ZW1lbnRzLiBUaGUgY29vcmRpbmF0ZSBzcGFjZSAoJ2NsaWVudCcgb3IgJ3BhZ2UnKVxuICogY2FuIGFsc28gYmUgY29uZmlndXJlZC5cbiAqIFRoZSBwcmltaXRpdmUgaXMgU1NSLXNhZmUgYW5kIGF1dG9tYXRpY2FsbHkgY2xlYW5zIHVwIGl0cyBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbnNvci5cbiAqIEByZXR1cm5zIEEgcmVhZC1vbmx5IGBTaWduYWw8TW91c2VQb3NpdGlvbj5gLiBPbiB0aGUgc2VydmVyLCBpdCByZXR1cm5zIGEgc3RhdGljXG4gKiBzaWduYWwgd2l0aCBgeyB4OiAwLCB5OiAwIH1gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQ29tcG9uZW50LCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqIGltcG9ydCB7IG1vdXNlUG9zaXRpb24gfSBmcm9tICdAbW1zdGFjay9wcmltaXRpdmVzJztcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqIHNlbGVjdG9yOiAnYXBwLW1vdXNlLXRyYWNrZXInLFxuICogdGVtcGxhdGU6IGA8cD5Nb3VzZSBQb3NpdGlvbjogWDoge3sgcG9zKCkueCB9fSwgWToge3sgcG9zKCkueSB9fTwvcD5gXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE1vdXNlVHJhY2tlckNvbXBvbmVudCB7XG4gKiByZWFkb25seSBwb3MgPSBtb3VzZVBvc2l0aW9uKHsgY29vcmRpbmF0ZVNwYWNlOiAncGFnZScgfSk7XG4gKlxuICogY29uc3RydWN0b3IoKSB7XG4gKiBlZmZlY3QoKCkgPT4ge1xuICogY29uc29sZS5sb2coJ01vdXNlIG1vdmVkIHRvOicsIHRoaXMucG9zKCkpO1xuICogfSk7XG4gKiB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdXNlUG9zaXRpb24ob3B0PzogTW91c2VQb3NpdGlvbk9wdGlvbnMpOiBNb3VzZVBvc2l0aW9uU2lnbmFsIHtcbiAgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIoaW5qZWN0KFBMQVRGT1JNX0lEKSkpIHtcbiAgICBjb25zdCBiYXNlID0gY29tcHV0ZWQoXG4gICAgICAoKSA9PiAoe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIGRlYnVnTmFtZTogb3B0Py5kZWJ1Z05hbWUsXG4gICAgICB9LFxuICAgICkgYXMgSW50ZXJuYWxNb3VzZVBvc2l0aW9uU2lnbmFsO1xuICAgIGJhc2UudW50aHJvdHRsZWQgPSBiYXNlO1xuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHRhcmdldCA9IHdpbmRvdyxcbiAgICBjb29yZGluYXRlU3BhY2UgPSAnY2xpZW50JyxcbiAgICB0b3VjaCA9IGZhbHNlLFxuICAgIGRlYnVnTmFtZSxcbiAgICB0aHJvdHRsZSA9IDEwMCxcbiAgfSA9IG9wdCA/PyB7fTtcblxuICBjb25zdCBldmVudFRhcmdldCA9XG4gICAgdGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudFJlZiA/IHRhcmdldC5uYXRpdmVFbGVtZW50IDogdGFyZ2V0O1xuXG4gIGlmICghZXZlbnRUYXJnZXQpIHtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignbW91c2VQb3NpdGlvbjogVGFyZ2V0IGVsZW1lbnQgbm90IGZvdW5kLicpO1xuXG4gICAgY29uc3QgYmFzZSA9IGNvbXB1dGVkKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBkZWJ1Z05hbWUsXG4gICAgICB9LFxuICAgICkgYXMgSW50ZXJuYWxNb3VzZVBvc2l0aW9uU2lnbmFsO1xuICAgIGJhc2UudW50aHJvdHRsZWQgPSBiYXNlO1xuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgY29uc3QgcG9zID0gdGhyb3R0bGVkKFxuICAgIHsgeDogMCwgeTogMCB9LFxuICAgIHtcbiAgICAgIG1zOiB0aHJvdHRsZSxcbiAgICAgIGVxdWFsOiAoYSwgYikgPT4gYS54ID09PSBiLnggJiYgYS55ID09PSBiLnksXG4gICAgICBkZWJ1Z05hbWUsXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCB1cGRhdGVQb3NpdGlvbiA9IChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICBsZXQgeDogbnVtYmVyLCB5OiBudW1iZXI7XG5cbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICB4ID0gY29vcmRpbmF0ZVNwYWNlID09PSAncGFnZScgPyBldmVudC5wYWdlWCA6IGV2ZW50LmNsaWVudFg7XG4gICAgICB5ID0gY29vcmRpbmF0ZVNwYWNlID09PSAncGFnZScgPyBldmVudC5wYWdlWSA6IGV2ZW50LmNsaWVudFk7XG4gICAgfSBlbHNlIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0VG91Y2ggPSBldmVudC50b3VjaGVzWzBdO1xuICAgICAgeCA9IGNvb3JkaW5hdGVTcGFjZSA9PT0gJ3BhZ2UnID8gZmlyc3RUb3VjaC5wYWdlWCA6IGZpcnN0VG91Y2guY2xpZW50WDtcbiAgICAgIHkgPSBjb29yZGluYXRlU3BhY2UgPT09ICdwYWdlJyA/IGZpcnN0VG91Y2gucGFnZVkgOiBmaXJzdFRvdWNoLmNsaWVudFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9zLnNldCh7IHgsIHkgfSk7XG4gIH07XG5cbiAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdXBkYXRlUG9zaXRpb24gYXMgRXZlbnRMaXN0ZW5lcik7XG4gIGlmICh0b3VjaCkge1xuICAgIGV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHVwZGF0ZVBvc2l0aW9uIGFzIEV2ZW50TGlzdGVuZXIpO1xuICB9XG5cbiAgaW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgdXBkYXRlUG9zaXRpb24gYXMgRXZlbnRMaXN0ZW5lcixcbiAgICApO1xuICAgIGlmICh0b3VjaCkge1xuICAgICAgZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgYmFzZSA9IHBvcy5hc1JlYWRvbmx5KCkgYXMgSW50ZXJuYWxNb3VzZVBvc2l0aW9uU2lnbmFsO1xuICBiYXNlLnVudGhyb3R0bGVkID0gcG9zLm9yaWdpbmFsO1xuICByZXR1cm4gYmFzZTtcbn1cbiJdfQ==","import { isPlatformServer } from '@angular/common';\nimport { computed, DestroyRef, inject, PLATFORM_ID, signal, } from '@angular/core';\nconst serverDate = new Date();\n/**\n * Creates a read-only signal that tracks the browser's online status.\n *\n * The main signal returns a boolean (`true` for online, `false` for offline).\n * An additional `since` signal is attached, tracking when the status last changed.\n * It's SSR-safe and automatically cleans up its event listeners.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A `NetworkStatusSignal` instance.\n */\nexport function networkStatus(debugName) {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const sig = computed(() => true, {\n debugName,\n });\n sig.since = computed(() => serverDate);\n return sig;\n }\n const state = signal(navigator.onLine, {\n debugName,\n });\n const since = signal(new Date());\n const goOnline = () => {\n state.set(true);\n since.set(new Date());\n };\n const goOffline = () => {\n state.set(false);\n since.set(new Date());\n };\n window.addEventListener('online', goOnline);\n window.addEventListener('offline', goOffline);\n inject(DestroyRef).onDestroy(() => {\n window.removeEventListener('online', goOnline);\n window.removeEventListener('offline', goOffline);\n });\n const sig = state.asReadonly();\n sig.since = since.asReadonly();\n return sig;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1zdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3NyYy9saWIvc2Vuc29ycy9uZXR3b3JrLXN0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUVYLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQWtCdkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUU5Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWtCO0lBQzlDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFO1lBQy9CLFNBQVM7U0FDVixDQUFnQyxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1FBQ3JDLFNBQVM7S0FDVixDQUFDLENBQUM7SUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtRQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFpQyxDQUFDO0lBQzlELEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRS9CLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIGluamVjdCxcbiAgUExBVEZPUk1fSUQsXG4gIFNpZ25hbCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaW50ZXJuYWwgdXNlZCBmb3Igc2V0dGluZyB0aGUgc2luY2Ugc2lnbmFsXG4gKi9cbnR5cGUgSW50ZXJuYWxOZXR3b3JrU3RhdHVzU2lnbmFsID0gU2lnbmFsPGJvb2xlYW4+ICYge1xuICBzaW5jZTogU2lnbmFsPERhdGU+O1xufTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIFNpZ25hbCB0aGF0IHRyYWNrcyBuZXR3b3JrIHN0YXR1cy5cbiAqIEl0J3MgYSBib29sZWFuIHNpZ25hbCB3aXRoIGFuIGF0dGFjaGVkIGBzaW5jZWAgc2lnbmFsLlxuICovXG5leHBvcnQgdHlwZSBOZXR3b3JrU3RhdHVzU2lnbmFsID0gU2lnbmFsPGJvb2xlYW4+ICYge1xuICAvKiogQSBzaWduYWwgdHJhY2tpbmcgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdGF0dXMgY2hhbmdlLiAqL1xuICByZWFkb25seSBzaW5jZTogU2lnbmFsPERhdGU+O1xufTtcblxuY29uc3Qgc2VydmVyRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWQtb25seSBzaWduYWwgdGhhdCB0cmFja3MgdGhlIGJyb3dzZXIncyBvbmxpbmUgc3RhdHVzLlxuICpcbiAqIFRoZSBtYWluIHNpZ25hbCByZXR1cm5zIGEgYm9vbGVhbiAoYHRydWVgIGZvciBvbmxpbmUsIGBmYWxzZWAgZm9yIG9mZmxpbmUpLlxuICogQW4gYWRkaXRpb25hbCBgc2luY2VgIHNpZ25hbCBpcyBhdHRhY2hlZCwgdHJhY2tpbmcgd2hlbiB0aGUgc3RhdHVzIGxhc3QgY2hhbmdlZC5cbiAqIEl0J3MgU1NSLXNhZmUgYW5kIGF1dG9tYXRpY2FsbHkgY2xlYW5zIHVwIGl0cyBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIGRlYnVnTmFtZSBPcHRpb25hbCBkZWJ1ZyBuYW1lIGZvciB0aGUgc2lnbmFsLlxuICogQHJldHVybnMgQSBgTmV0d29ya1N0YXR1c1NpZ25hbGAgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXR3b3JrU3RhdHVzKGRlYnVnTmFtZT86IHN0cmluZyk6IE5ldHdvcmtTdGF0dXNTaWduYWwge1xuICBpZiAoaXNQbGF0Zm9ybVNlcnZlcihpbmplY3QoUExBVEZPUk1fSUQpKSkge1xuICAgIGNvbnN0IHNpZyA9IGNvbXB1dGVkKCgpID0+IHRydWUsIHtcbiAgICAgIGRlYnVnTmFtZSxcbiAgICB9KSBhcyBJbnRlcm5hbE5ldHdvcmtTdGF0dXNTaWduYWw7XG4gICAgc2lnLnNpbmNlID0gY29tcHV0ZWQoKCkgPT4gc2VydmVyRGF0ZSk7XG4gICAgcmV0dXJuIHNpZztcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0gc2lnbmFsKG5hdmlnYXRvci5vbkxpbmUsIHtcbiAgICBkZWJ1Z05hbWUsXG4gIH0pO1xuICBjb25zdCBzaW5jZSA9IHNpZ25hbChuZXcgRGF0ZSgpKTtcblxuICBjb25zdCBnb09ubGluZSA9ICgpID0+IHtcbiAgICBzdGF0ZS5zZXQodHJ1ZSk7XG4gICAgc2luY2Uuc2V0KG5ldyBEYXRlKCkpO1xuICB9O1xuICBjb25zdCBnb09mZmxpbmUgPSAoKSA9PiB7XG4gICAgc3RhdGUuc2V0KGZhbHNlKTtcbiAgICBzaW5jZS5zZXQobmV3IERhdGUoKSk7XG4gIH07XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGdvT25saW5lKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBnb09mZmxpbmUpO1xuXG4gIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbmxpbmUnLCBnb09ubGluZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBnb09mZmxpbmUpO1xuICB9KTtcblxuICBjb25zdCBzaWcgPSBzdGF0ZS5hc1JlYWRvbmx5KCkgYXMgSW50ZXJuYWxOZXR3b3JrU3RhdHVzU2lnbmFsO1xuICBzaWcuc2luY2UgPSBzaW5jZS5hc1JlYWRvbmx5KCk7XG5cbiAgcmV0dXJuIHNpZztcbn1cbiJdfQ==","import { isPlatformServer } from '@angular/common';\nimport { computed, DestroyRef, inject, PLATFORM_ID, signal, } from '@angular/core';\n/**\n * Creates a read-only signal that tracks the page's visibility state.\n *\n * It uses the browser's Page Visibility API to reactively report if the\n * current document is `'visible'`, `'hidden'`, or in another state.\n * The primitive is SSR-safe and automatically cleans up its event listeners\n * when the creating context is destroyed.\n *\n * @param debugName Optional debug name for the signal.\n * @returns A read-only `Signal<DocumentVisibilityState>`. On the server,\n * it returns a static signal with a value of `'visible'`.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { pageVisibility } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-visibility-tracker',\n * template: `<p>Page is currently: {{ visibilityState() }}</p>`\n * })\n * export class VisibilityTrackerComponent {\n * readonly visibilityState = pageVisibility();\n *\n * constructor() {\n * effect(() => {\n * if (this.visibilityState() === 'hidden') {\n * console.log('Page is hidden, pausing expensive animations...');\n * } else {\n * console.log('Page is visible, resuming activity.');\n * }\n * });\n * }\n * }\n * ```\n */\nexport function pageVisibility(debugName) {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n return computed(() => 'visible', { debugName });\n }\n const visibility = signal(document.visibilityState, { debugName });\n const onVisibilityChange = () => visibility.set(document.visibilityState);\n document.addEventListener('visibilitychange', onVisibilityChange);\n inject(DestroyRef).onDestroy(() => document.removeEventListener('visibilitychange', onVisibilityChange));\n return visibility.asReadonly();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS12aXNpYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL3NlbnNvcnMvcGFnZS12aXNpYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFDTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE1BQU0sRUFDTixXQUFXLEVBRVgsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLFNBQWtCO0lBRWxCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFbkUsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUUxRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUVsRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNoQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FDckUsQ0FBQztJQUVGLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWQtb25seSBzaWduYWwgdGhhdCB0cmFja3MgdGhlIHBhZ2UncyB2aXNpYmlsaXR5IHN0YXRlLlxuICpcbiAqIEl0IHVzZXMgdGhlIGJyb3dzZXIncyBQYWdlIFZpc2liaWxpdHkgQVBJIHRvIHJlYWN0aXZlbHkgcmVwb3J0IGlmIHRoZVxuICogY3VycmVudCBkb2N1bWVudCBpcyBgJ3Zpc2libGUnYCwgYCdoaWRkZW4nYCwgb3IgaW4gYW5vdGhlciBzdGF0ZS5cbiAqIFRoZSBwcmltaXRpdmUgaXMgU1NSLXNhZmUgYW5kIGF1dG9tYXRpY2FsbHkgY2xlYW5zIHVwIGl0cyBldmVudCBsaXN0ZW5lcnNcbiAqIHdoZW4gdGhlIGNyZWF0aW5nIGNvbnRleHQgaXMgZGVzdHJveWVkLlxuICpcbiAqIEBwYXJhbSBkZWJ1Z05hbWUgT3B0aW9uYWwgZGVidWcgbmFtZSBmb3IgdGhlIHNpZ25hbC5cbiAqIEByZXR1cm5zIEEgcmVhZC1vbmx5IGBTaWduYWw8RG9jdW1lbnRWaXNpYmlsaXR5U3RhdGU+YC4gT24gdGhlIHNlcnZlcixcbiAqIGl0IHJldHVybnMgYSBzdGF0aWMgc2lnbmFsIHdpdGggYSB2YWx1ZSBvZiBgJ3Zpc2libGUnYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IENvbXBvbmVudCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQgeyBwYWdlVmlzaWJpbGl0eSB9IGZyb20gJ0BtbXN0YWNrL3ByaW1pdGl2ZXMnO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdhcHAtdmlzaWJpbGl0eS10cmFja2VyJyxcbiAqIHRlbXBsYXRlOiBgPHA+UGFnZSBpcyBjdXJyZW50bHk6IHt7IHZpc2liaWxpdHlTdGF0ZSgpIH19PC9wPmBcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgVmlzaWJpbGl0eVRyYWNrZXJDb21wb25lbnQge1xuICogcmVhZG9ubHkgdmlzaWJpbGl0eVN0YXRlID0gcGFnZVZpc2liaWxpdHkoKTtcbiAqXG4gKiBjb25zdHJ1Y3RvcigpIHtcbiAqIGVmZmVjdCgoKSA9PiB7XG4gKiBpZiAodGhpcy52aXNpYmlsaXR5U3RhdGUoKSA9PT0gJ2hpZGRlbicpIHtcbiAqIGNvbnNvbGUubG9nKCdQYWdlIGlzIGhpZGRlbiwgcGF1c2luZyBleHBlbnNpdmUgYW5pbWF0aW9ucy4uLicpO1xuICogfSBlbHNlIHtcbiAqIGNvbnNvbGUubG9nKCdQYWdlIGlzIHZpc2libGUsIHJlc3VtaW5nIGFjdGl2aXR5LicpO1xuICogfVxuICogfSk7XG4gKiB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VWaXNpYmlsaXR5KFxuICBkZWJ1Z05hbWU/OiBzdHJpbmcsXG4pOiBTaWduYWw8RG9jdW1lbnRWaXNpYmlsaXR5U3RhdGU+IHtcbiAgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIoaW5qZWN0KFBMQVRGT1JNX0lEKSkpIHtcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gJ3Zpc2libGUnLCB7IGRlYnVnTmFtZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHZpc2liaWxpdHkgPSBzaWduYWwoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlLCB7IGRlYnVnTmFtZSB9KTtcblxuICBjb25zdCBvblZpc2liaWxpdHlDaGFuZ2UgPSAoKSA9PiB2aXNpYmlsaXR5LnNldChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUpO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2liaWxpdHlDaGFuZ2UpO1xuXG4gIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25WaXNpYmlsaXR5Q2hhbmdlKSxcbiAgKTtcblxuICByZXR1cm4gdmlzaWJpbGl0eS5hc1JlYWRvbmx5KCk7XG59XG4iXX0=","import { isPlatformServer } from '@angular/common'; // Corrected import\nimport { computed, DestroyRef, ElementRef, inject, PLATFORM_ID, // Used for SSR fallback\n } from '@angular/core';\nimport { throttled } from '../throttled';\n/**\n * Creates a read-only signal that tracks the scroll position (x, y) of the window\n * or a specified HTML element.\n *\n * Updates are throttled by default to optimize performance. An `unthrottled`\n * property is available on the returned signal for direct access to raw updates.\n * The primitive is SSR-safe and automatically cleans up its event listeners.\n *\n * @param options Optional configuration for the scroll sensor.\n * @returns A `ScrollPositionSignal`. On the server, it returns a static\n * signal with `{ x: 0, y: 0 }`.\n *\n * @example\n * ```ts\n * import { Component, effect, ElementRef, viewChild } from '@angular/core';\n * import { scrollPosition } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-scroll-tracker',\n * template: `\n * <p>Window Scroll: X: {{ windowScroll().x }}, Y: {{ windowScroll().y }}</p>\n * <div #scrollableDiv style=\"height: 200px; width: 200px; overflow: auto; border: 1px solid black;\">\n * <div style=\"height: 400px; width: 400px;\">Scroll me!</div>\n * </div>\n * @if (divScroll()) {\n * <p>Div Scroll: X: {{ divScroll().x }}, Y: {{ divScroll().y }}</p>\n * }\n * `\n * })\n * export class ScrollTrackerComponent {\n * readonly windowScroll = scrollPosition(); // Defaults to window\n * readonly scrollableDiv = viewChild<ElementRef<HTMLDivElement>>('scrollableDiv');\n * readonly divScroll = scrollPosition({ target: this.scrollableDiv() }); // Example with element target\n *\n * constructor() {\n * effect(() => {\n * console.log('Window scrolled to:', this.windowScroll());\n * if (this.divScroll()) {\n * console.log('Div scrolled to:', this.divScroll());\n * }\n * });\n * }\n * }\n * ```\n */\nexport function scrollPosition(opt) {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const base = computed(() => ({\n x: 0,\n y: 0,\n }), {\n debugName: opt?.debugName,\n });\n base.unthrottled = base;\n return base;\n }\n const { target = window, throttle = 100, debugName } = opt || {};\n let element;\n let getScrollPosition;\n if (target instanceof Window) {\n element = target;\n getScrollPosition = () => {\n return { x: target.scrollX, y: target.scrollY };\n };\n }\n else if (target instanceof ElementRef) {\n element = target.nativeElement;\n getScrollPosition = () => {\n return {\n x: target.nativeElement.scrollLeft,\n y: target.nativeElement.scrollTop,\n };\n };\n }\n else {\n element = target;\n getScrollPosition = () => {\n return {\n x: target.scrollLeft,\n y: target.scrollTop,\n };\n };\n }\n const state = throttled(getScrollPosition(), {\n debugName,\n equal: (a, b) => a.x === b.x && a.y === b.y,\n ms: throttle,\n });\n const onScroll = () => state.set(getScrollPosition());\n element.addEventListener('scroll', onScroll, { passive: true });\n inject(DestroyRef).onDestroy(() => element.removeEventListener('scroll', onScroll));\n const base = state.asReadonly();\n base.unthrottled = state.original;\n return base;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXBvc2l0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL3NlbnNvcnMvc2Nyb2xsLXBvc2l0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDLENBQUMsbUJBQW1CO0FBQ3ZFLE9BQU8sRUFDTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUFFLHdCQUF3QjtFQUV0QyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBZ0R6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUEyQjtJQUUzQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUNuQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztTQUNMLENBQUMsRUFDRjtZQUNFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUztTQUMxQixDQUM4QixDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUVqRSxJQUFJLE9BQTZCLENBQUM7SUFFbEMsSUFBSSxpQkFBdUMsQ0FBQztJQUU1QyxJQUFJLE1BQU0sWUFBWSxNQUFNLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRWpCLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxNQUFNLFlBQVksVUFBVSxFQUFFLENBQUM7UUFDeEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDL0IsaUJBQWlCLEdBQUcsR0FBRyxFQUFFO1lBQ3ZCLE9BQU87Z0JBQ0wsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVTtnQkFDbEMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUzthQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtZQUN2QixPQUFPO2dCQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDcEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2FBQ3BCLENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFpQixpQkFBaUIsRUFBRSxFQUFFO1FBQzNELFNBQVM7UUFDVCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQyxFQUFFLEVBQUUsUUFBUTtLQUNiLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFaEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDaEMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FDaEQsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQWtDLENBQUM7SUFDaEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ2xDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nOyAvLyBDb3JyZWN0ZWQgaW1wb3J0XG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBQTEFURk9STV9JRCwgLy8gVXNlZCBmb3IgU1NSIGZhbGxiYWNrXG4gIHR5cGUgU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRocm90dGxlZCB9IGZyb20gJy4uL3Rocm90dGxlZCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgc2Nyb2xsIHBvc2l0aW9uLlxuICovXG5leHBvcnQgdHlwZSBTY3JvbGxQb3NpdGlvbiA9IHtcbiAgLyoqIFRoZSBob3Jpem9udGFsIHNjcm9sbCBwb3NpdGlvbiAocGl4ZWxzIGZyb20gdGhlIGxlZnQpLiAqL1xuICByZWFkb25seSB4OiBudW1iZXI7XG4gIC8qKiBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIChwaXhlbHMgZnJvbSB0aGUgdG9wKS4gKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgYHNjcm9sbFBvc2l0aW9uYCBzZW5zb3IuXG4gKi9cbmV4cG9ydCB0eXBlIFNjcm9sbFBvc2l0aW9uT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgdG8gbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uLlxuICAgKiBDYW4gYmUgYHdpbmRvd2AgKGZvciBwYWdlIHNjcm9sbCkgb3IgYW4gYEhUTUxFbGVtZW50YC9gRWxlbWVudFJlZjxIVE1MRWxlbWVudD5gLlxuICAgKiBAZGVmYXVsdCB3aW5kb3dcbiAgICovXG4gIHRhcmdldD86IFdpbmRvdyB8IEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgdGhlIHVwZGF0ZXMuXG4gICAqIFNjcm9sbCBldmVudHMgY2FuIGZpcmUgdmVyeSByYXBpZGx5LlxuICAgKiBAZGVmYXVsdCAxMDAgLy8gQSBjb21tb24gZGVmYXVsdCBmb3Igc2Nyb2xsIHRocm90dGxpbmdcbiAgICovXG4gIHRocm90dGxlPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgZGVidWcgbmFtZSBmb3IgdGhlIGludGVybmFsIHNpZ25hbC4gKi9cbiAgZGVidWdOYW1lPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBAaW50ZXJuYWwgdXNlZCBmb3Igc2V0dGluZyB0aGUgdW50aHJvdHRsZWQgc2lnbmFsXG4gKi9cbnR5cGUgSW50ZXJuYWxTY3JvbGxQb3NpdGlvblNpZ25hbCA9IFNpZ25hbDxTY3JvbGxQb3NpdGlvbj4gJiB7XG4gIHVudGhyb3R0bGVkOiBTaWduYWw8U2Nyb2xsUG9zaXRpb24+O1xufTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIFNpZ25hbCB0aGF0IHRyYWNrcyBzY3JvbGwgcG9zaXRpb24uXG4gKiBJdCdzIGEgdGhyb3R0bGVkIHNpZ25hbCBvZiB0aGUgc2Nyb2xsIGNvb3JkaW5hdGVzIHdpdGggYW4gYXR0YWNoZWQgYHVudGhyb3R0bGVkYCBzaWduYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFNjcm9sbFBvc2l0aW9uU2lnbmFsID0gU2lnbmFsPFNjcm9sbFBvc2l0aW9uPiAmIHtcbiAgLyoqIEEgc2lnbmFsIHByb3ZpZGluZyB0aGUgcmF3LCB1bnRocm90dGxlZCBzY3JvbGwgcG9zaXRpb24uICovXG4gIHJlYWRvbmx5IHVudGhyb3R0bGVkOiBTaWduYWw8U2Nyb2xsUG9zaXRpb24+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgc2Nyb2xsIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgd2luZG93XG4gKiBvciBhIHNwZWNpZmllZCBIVE1MIGVsZW1lbnQuXG4gKlxuICogVXBkYXRlcyBhcmUgdGhyb3R0bGVkIGJ5IGRlZmF1bHQgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuIEFuIGB1bnRocm90dGxlZGBcbiAqIHByb3BlcnR5IGlzIGF2YWlsYWJsZSBvbiB0aGUgcmV0dXJuZWQgc2lnbmFsIGZvciBkaXJlY3QgYWNjZXNzIHRvIHJhdyB1cGRhdGVzLlxuICogVGhlIHByaW1pdGl2ZSBpcyBTU1Itc2FmZSBhbmQgYXV0b21hdGljYWxseSBjbGVhbnMgdXAgaXRzIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgc2Nyb2xsIHNlbnNvci5cbiAqIEByZXR1cm5zIEEgYFNjcm9sbFBvc2l0aW9uU2lnbmFsYC4gT24gdGhlIHNlcnZlciwgaXQgcmV0dXJucyBhIHN0YXRpY1xuICogc2lnbmFsIHdpdGggYHsgeDogMCwgeTogMCB9YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IENvbXBvbmVudCwgZWZmZWN0LCBFbGVtZW50UmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqIGltcG9ydCB7IHNjcm9sbFBvc2l0aW9uIH0gZnJvbSAnQG1tc3RhY2svcHJpbWl0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiBzZWxlY3RvcjogJ2FwcC1zY3JvbGwtdHJhY2tlcicsXG4gKiB0ZW1wbGF0ZTogYFxuICogPHA+V2luZG93IFNjcm9sbDogWDoge3sgd2luZG93U2Nyb2xsKCkueCB9fSwgWToge3sgd2luZG93U2Nyb2xsKCkueSB9fTwvcD5cbiAqIDxkaXYgI3Njcm9sbGFibGVEaXYgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4OyB3aWR0aDogMjAwcHg7IG92ZXJmbG93OiBhdXRvOyBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj5cbiAqIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDQwMHB4OyB3aWR0aDogNDAwcHg7XCI+U2Nyb2xsIG1lITwvZGl2PlxuICogPC9kaXY+XG4gKiBAaWYgKGRpdlNjcm9sbCgpKSB7XG4gKiA8cD5EaXYgU2Nyb2xsOiBYOiB7eyBkaXZTY3JvbGwoKS54IH19LCBZOiB7eyBkaXZTY3JvbGwoKS55IH19PC9wPlxuICogfVxuICogYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBTY3JvbGxUcmFja2VyQ29tcG9uZW50IHtcbiAqIHJlYWRvbmx5IHdpbmRvd1Njcm9sbCA9IHNjcm9sbFBvc2l0aW9uKCk7IC8vIERlZmF1bHRzIHRvIHdpbmRvd1xuICogcmVhZG9ubHkgc2Nyb2xsYWJsZURpdiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ3Njcm9sbGFibGVEaXYnKTtcbiAqIHJlYWRvbmx5IGRpdlNjcm9sbCA9IHNjcm9sbFBvc2l0aW9uKHsgdGFyZ2V0OiB0aGlzLnNjcm9sbGFibGVEaXYoKSB9KTsgLy8gRXhhbXBsZSB3aXRoIGVsZW1lbnQgdGFyZ2V0XG4gKlxuICogY29uc3RydWN0b3IoKSB7XG4gKiBlZmZlY3QoKCkgPT4ge1xuICogY29uc29sZS5sb2coJ1dpbmRvdyBzY3JvbGxlZCB0bzonLCB0aGlzLndpbmRvd1Njcm9sbCgpKTtcbiAqIGlmICh0aGlzLmRpdlNjcm9sbCgpKSB7XG4gKiBjb25zb2xlLmxvZygnRGl2IHNjcm9sbGVkIHRvOicsIHRoaXMuZGl2U2Nyb2xsKCkpO1xuICogfVxuICogfSk7XG4gKiB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFBvc2l0aW9uKFxuICBvcHQ/OiBTY3JvbGxQb3NpdGlvbk9wdGlvbnMsXG4pOiBTY3JvbGxQb3NpdGlvblNpZ25hbCB7XG4gIGlmIChpc1BsYXRmb3JtU2VydmVyKGluamVjdChQTEFURk9STV9JRCkpKSB7XG4gICAgY29uc3QgYmFzZSA9IGNvbXB1dGVkKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBkZWJ1Z05hbWU6IG9wdD8uZGVidWdOYW1lLFxuICAgICAgfSxcbiAgICApIGFzIEludGVybmFsU2Nyb2xsUG9zaXRpb25TaWduYWw7XG4gICAgYmFzZS51bnRocm90dGxlZCA9IGJhc2U7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBjb25zdCB7IHRhcmdldCA9IHdpbmRvdywgdGhyb3R0bGUgPSAxMDAsIGRlYnVnTmFtZSB9ID0gb3B0IHx8IHt9O1xuXG4gIGxldCBlbGVtZW50OiBXaW5kb3cgfCBIVE1MRWxlbWVudDtcblxuICBsZXQgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IFNjcm9sbFBvc2l0aW9uO1xuXG4gIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBXaW5kb3cpIHtcbiAgICBlbGVtZW50ID0gdGFyZ2V0O1xuXG4gICAgZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4geyB4OiB0YXJnZXQuc2Nyb2xsWCwgeTogdGFyZ2V0LnNjcm9sbFkgfTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICBlbGVtZW50ID0gdGFyZ2V0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB0YXJnZXQubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgICAgICB5OiB0YXJnZXQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AsXG4gICAgICB9O1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudCA9IHRhcmdldDtcbiAgICBnZXRTY3JvbGxQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRhcmdldC5zY3JvbGxMZWZ0LFxuICAgICAgICB5OiB0YXJnZXQuc2Nyb2xsVG9wLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSB0aHJvdHRsZWQ8U2Nyb2xsUG9zaXRpb24+KGdldFNjcm9sbFBvc2l0aW9uKCksIHtcbiAgICBkZWJ1Z05hbWUsXG4gICAgZXF1YWw6IChhLCBiKSA9PiBhLnggPT09IGIueCAmJiBhLnkgPT09IGIueSxcbiAgICBtczogdGhyb3R0bGUsXG4gIH0pO1xuXG4gIGNvbnN0IG9uU2Nyb2xsID0gKCkgPT4gc3RhdGUuc2V0KGdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgaW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PlxuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwpLFxuICApO1xuXG4gIGNvbnN0IGJhc2UgPSBzdGF0ZS5hc1JlYWRvbmx5KCkgYXMgSW50ZXJuYWxTY3JvbGxQb3NpdGlvblNpZ25hbDtcbiAgYmFzZS51bnRocm90dGxlZCA9IHN0YXRlLm9yaWdpbmFsO1xuICByZXR1cm4gYmFzZTtcbn1cbiJdfQ==","import { isPlatformServer } from '@angular/common';\nimport { computed, DestroyRef, inject, PLATFORM_ID, } from '@angular/core';\nimport { throttled } from '../throttled';\n/**\n * Creates a read-only signal that tracks the browser window's inner dimensions (width and height).\n *\n * Updates are throttled by default (100ms) to optimize performance during resize events.\n * An `unthrottled` property is available on the returned signal for direct access to raw updates.\n * The primitive is SSR-safe (returns a default size on the server) and automatically\n * cleans up its event listeners.\n *\n * @param opt Optional configuration, including `throttle` (ms) and `debugName`.\n * @returns A `WindowSizeSignal` (a `Signal<WindowSize>` with an `unthrottled` property).\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { windowSize } from '@mmstack/primitives';\n *\n * @Component({\n * selector: 'app-responsive-header',\n * template: `\n * <header>\n * Current Window Size: {{ size().width }}px x {{ size().height }}px\n * @if (isMobile()) {\n * <p>Mobile Menu</p>\n * } @else {\n * <p>Desktop Menu</p>\n * }\n * </header>\n * `\n * })\n * export class ResponsiveHeaderComponent {\n * readonly size = windowSize();\n * readonly isMobile = computed(() => this.size().width < 768);\n *\n * constructor() {\n * effect(() => {\n * console.log('Window resized to:', this.size());\n * });\n * }\n * }\n * ```\n */\nexport function windowSize(opt) {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n const base = computed(() => ({\n width: 1024,\n height: 768,\n }), { debugName: opt?.debugName });\n base.unthrottled = base;\n return base;\n }\n const sizeSignal = throttled({ width: window.innerWidth, height: window.innerHeight }, {\n debugName: opt?.debugName,\n equal: (a, b) => a.width === b.width && a.height === b.height,\n ms: opt?.throttle ?? 100,\n });\n const onResize = () => {\n sizeSignal.set({ width: window.innerWidth, height: window.innerHeight });\n };\n window.addEventListener('resize', onResize);\n inject(DestroyRef).onDestroy(() => {\n window.removeEventListener('resize', onResize);\n });\n const base = sizeSignal.asReadonly();\n base.unthrottled = sizeSignal.original;\n return base;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3NyYy9saWIvc2Vuc29ycy93aW5kb3ctc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxHQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUE0Q3pDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUF1QjtJQUNoRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUNuQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ0wsS0FBSyxFQUFFLElBQUk7WUFDWCxNQUFNLEVBQUUsR0FBRztTQUNaLENBQUMsRUFDRixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQ0YsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQzFCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFDeEQ7UUFDRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVM7UUFDekIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07UUFDN0QsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRztLQUN6QixDQUNGLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7UUFDcEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUM7SUFFRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTVDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2hDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsVUFBVSxFQUE4QixDQUFDO0lBQ2pFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGhyb3R0bGVkIH0gZnJvbSAnLi4vdGhyb3R0bGVkJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCB0eXBlIFdpbmRvd1NpemUgPSB7XG4gIC8qKiBUaGUgY3VycmVudCBpbm5lciB3aWR0aCBvZiB0aGUgd2luZG93IGluIHBpeGVscy4gKi9cbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcbiAgLyoqIFRoZSBjdXJyZW50IGlubmVyIGhlaWdodCBvZiB0aGUgd2luZG93IGluIHBpeGVscy4gKi9cbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBgbW91c2VQb3NpdGlvbmAgc2Vuc29yLlxuICovXG5leHBvcnQgdHlwZSBXaW5kb3dTaXplT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlYnVnIG5hbWUgZm9yIHRoZSBpbnRlcm5hbCBzaWduYWwuXG4gICAqL1xuICBkZWJ1Z05hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgdGhlIHVwZGF0ZXMuXG4gICAqIEBkZWZhdWx0IDEwMFxuICAgKi9cbiAgdGhyb3R0bGU/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEBpbnRlcm5hbCB1c2VkIGZvciBzZXR0aW5nIHRoZSBzaW5jZSBzaWduYWxcbiAqL1xudHlwZSBJbnRlcm5hbFdpbmRvd1NpemVTaWduYWwgPSBTaWduYWw8V2luZG93U2l6ZT4gJiB7XG4gIHVudGhyb3R0bGVkOiBTaWduYWw8V2luZG93U2l6ZT47XG59O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgU2lnbmFsIHRoYXQgdHJhY2tzIHdpbmRvdyBzaXplLlxuICogSXQncyBhIHRocm90dGxlZCBzaWduYWwgb2YgdGhlIHdpbmRvdy5pbm5lckhlaWdodC9pbm5lcldpZHRoIHByb3BlcnRpZXNcbiAqIHdpdGggYW4gYXR0YWNoZWQgYHVudGhyb3R0bGVkYCBzaWduYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFdpbmRvd1NpemVTaWduYWwgPSBTaWduYWw8V2luZG93U2l6ZT4gJiB7XG4gIC8qKiBBIHNpZ25hbCBwcm92aWRpbmcgdGhlIHJhdywgdW50aHJvdHRsZWQgd2luZG93IHNpemUuICovXG4gIHJlYWRvbmx5IHVudGhyb3R0bGVkOiBTaWduYWw8V2luZG93U2l6ZT47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFkLW9ubHkgc2lnbmFsIHRoYXQgdHJhY2tzIHRoZSBicm93c2VyIHdpbmRvdydzIGlubmVyIGRpbWVuc2lvbnMgKHdpZHRoIGFuZCBoZWlnaHQpLlxuICpcbiAqIFVwZGF0ZXMgYXJlIHRocm90dGxlZCBieSBkZWZhdWx0ICgxMDBtcykgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UgZHVyaW5nIHJlc2l6ZSBldmVudHMuXG4gKiBBbiBgdW50aHJvdHRsZWRgIHByb3BlcnR5IGlzIGF2YWlsYWJsZSBvbiB0aGUgcmV0dXJuZWQgc2lnbmFsIGZvciBkaXJlY3QgYWNjZXNzIHRvIHJhdyB1cGRhdGVzLlxuICogVGhlIHByaW1pdGl2ZSBpcyBTU1Itc2FmZSAocmV0dXJucyBhIGRlZmF1bHQgc2l6ZSBvbiB0aGUgc2VydmVyKSBhbmQgYXV0b21hdGljYWxseVxuICogY2xlYW5zIHVwIGl0cyBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIG9wdCBPcHRpb25hbCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgYHRocm90dGxlYCAobXMpIGFuZCBgZGVidWdOYW1lYC5cbiAqIEByZXR1cm5zIEEgYFdpbmRvd1NpemVTaWduYWxgIChhIGBTaWduYWw8V2luZG93U2l6ZT5gIHdpdGggYW4gYHVudGhyb3R0bGVkYCBwcm9wZXJ0eSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb25lbnQsIGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICogaW1wb3J0IHsgd2luZG93U2l6ZSB9IGZyb20gJ0BtbXN0YWNrL3ByaW1pdGl2ZXMnO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogc2VsZWN0b3I6ICdhcHAtcmVzcG9uc2l2ZS1oZWFkZXInLFxuICogdGVtcGxhdGU6IGBcbiAqIDxoZWFkZXI+XG4gKiBDdXJyZW50IFdpbmRvdyBTaXplOiB7eyBzaXplKCkud2lkdGggfX1weCB4IHt7IHNpemUoKS5oZWlnaHQgfX1weFxuICogQGlmIChpc01vYmlsZSgpKSB7XG4gKiA8cD5Nb2JpbGUgTWVudTwvcD5cbiAqIH0gQGVsc2Uge1xuICogPHA+RGVza3RvcCBNZW51PC9wPlxuICogfVxuICogPC9oZWFkZXI+XG4gKiBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIFJlc3BvbnNpdmVIZWFkZXJDb21wb25lbnQge1xuICogcmVhZG9ubHkgc2l6ZSA9IHdpbmRvd1NpemUoKTtcbiAqIHJlYWRvbmx5IGlzTW9iaWxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zaXplKCkud2lkdGggPCA3NjgpO1xuICpcbiAqIGNvbnN0cnVjdG9yKCkge1xuICogZWZmZWN0KCgpID0+IHtcbiAqIGNvbnNvbGUubG9nKCdXaW5kb3cgcmVzaXplZCB0bzonLCB0aGlzLnNpemUoKSk7XG4gKiB9KTtcbiAqIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2luZG93U2l6ZShvcHQ/OiBXaW5kb3dTaXplT3B0aW9ucyk6IFdpbmRvd1NpemVTaWduYWwge1xuICBpZiAoaXNQbGF0Zm9ybVNlcnZlcihpbmplY3QoUExBVEZPUk1fSUQpKSkge1xuICAgIGNvbnN0IGJhc2UgPSBjb21wdXRlZChcbiAgICAgICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgIH0pLFxuICAgICAgeyBkZWJ1Z05hbWU6IG9wdD8uZGVidWdOYW1lIH0sXG4gICAgKSBhcyBJbnRlcm5hbFdpbmRvd1NpemVTaWduYWw7XG5cbiAgICBiYXNlLnVudGhyb3R0bGVkID0gYmFzZTtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGNvbnN0IHNpemVTaWduYWwgPSB0aHJvdHRsZWQ8V2luZG93U2l6ZT4oXG4gICAgeyB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IH0sXG4gICAge1xuICAgICAgZGVidWdOYW1lOiBvcHQ/LmRlYnVnTmFtZSxcbiAgICAgIGVxdWFsOiAoYSwgYikgPT4gYS53aWR0aCA9PT0gYi53aWR0aCAmJiBhLmhlaWdodCA9PT0gYi5oZWlnaHQsXG4gICAgICBtczogb3B0Py50aHJvdHRsZSA/PyAxMDAsXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBvblJlc2l6ZSA9ICgpID0+IHtcbiAgICBzaXplU2lnbmFsLnNldCh7IHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgfSk7XG4gIH07XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTtcblxuICBpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25SZXNpemUpO1xuICB9KTtcblxuICBjb25zdCBiYXNlID0gc2l6ZVNpZ25hbC5hc1JlYWRvbmx5KCkgYXMgSW50ZXJuYWxXaW5kb3dTaXplU2lnbmFsO1xuICBiYXNlLnVudGhyb3R0bGVkID0gc2l6ZVNpZ25hbC5vcmlnaW5hbDtcbiAgcmV0dXJuIGJhc2U7XG59XG4iXX0=","import { prefersDarkMode, prefersReducedMotion } from './media-query';\nimport { mousePosition, } from './mouse-position';\nimport { networkStatus } from './network-status';\nimport { pageVisibility } from './page-visibility';\nimport { scrollPosition, } from './scroll-position';\nimport { windowSize } from './window-size';\n/**\n * Implementation for sensor overloads.\n * Users should refer to the specific overloads for detailed documentation.\n * @internal\n */\nexport function sensor(type, options) {\n switch (type) {\n case 'mousePosition':\n return mousePosition(options);\n case 'networkStatus':\n return networkStatus(options?.debugName);\n case 'pageVisibility':\n return pageVisibility(options?.debugName);\n case 'dark-mode':\n return prefersDarkMode(options?.debugName);\n case 'reduced-motion':\n return prefersReducedMotion(options?.debugName);\n case 'windowSize':\n return windowSize(options);\n case 'scrollPosition':\n return scrollPosition(options);\n default:\n throw new Error(`Unknown sensor type: ${type}`);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vuc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL3NlbnNvcnMvc2Vuc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUdMLGFBQWEsR0FDZCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBdUIsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFHTCxjQUFjLEdBQ2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQXVDLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTZGaEY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQ3BCLElBT29CLEVBQ3BCLE9BTXlCO0lBU3pCLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLGVBQWU7WUFDbEIsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsS0FBSyxlQUFlO1lBQ2xCLE9BQU8sYUFBYSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzQyxLQUFLLGdCQUFnQjtZQUNuQixPQUFPLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUMsS0FBSyxXQUFXO1lBQ2QsT0FBTyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLEtBQUssZ0JBQWdCO1lBQ25CLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELEtBQUssWUFBWTtZQUNmLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLEtBQUssZ0JBQWdCO1lBQ25CLE9BQU8sY0FBYyxDQUFDLE9BQWdDLENBQUMsQ0FBQztRQUMxRDtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByZWZlcnNEYXJrTW9kZSwgcHJlZmVyc1JlZHVjZWRNb3Rpb24gfSBmcm9tICcuL21lZGlhLXF1ZXJ5JztcbmltcG9ydCB7XG4gIE1vdXNlUG9zaXRpb25PcHRpb25zLFxuICBNb3VzZVBvc2l0aW9uU2lnbmFsLFxuICBtb3VzZVBvc2l0aW9uLFxufSBmcm9tICcuL21vdXNlLXBvc2l0aW9uJztcbmltcG9ydCB7IE5ldHdvcmtTdGF0dXNTaWduYWwsIG5ldHdvcmtTdGF0dXMgfSBmcm9tICcuL25ldHdvcmstc3RhdHVzJztcbmltcG9ydCB7IHBhZ2VWaXNpYmlsaXR5IH0gZnJvbSAnLi9wYWdlLXZpc2liaWxpdHknO1xuaW1wb3J0IHtcbiAgU2Nyb2xsUG9zaXRpb25PcHRpb25zLFxuICBTY3JvbGxQb3NpdGlvblNpZ25hbCxcbiAgc2Nyb2xsUG9zaXRpb24sXG59IGZyb20gJy4vc2Nyb2xsLXBvc2l0aW9uJztcbmltcG9ydCB7IFdpbmRvd1NpemVPcHRpb25zLCBXaW5kb3dTaXplU2lnbmFsLCB3aW5kb3dTaXplIH0gZnJvbSAnLi93aW5kb3ctc2l6ZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNlbnNvciBzaWduYWwgdGhhdCB0cmFja3MgdGhlIG1vdXNlIGN1cnNvcidzIHBvc2l0aW9uLlxuICogQHBhcmFtIHR5cGUgTXVzdCBiZSBgJ21vdXNlUG9zaXRpb24nYC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtb3VzZSBwb3NpdGlvbiBzZW5zb3IuXG4gKiBAcmV0dXJucyBBIGBNb3VzZVBvc2l0aW9uU2lnbmFsYCB0aGF0IHRyYWNrcyBtb3VzZSBjb29yZGluYXRlcyBhbmQgcHJvdmlkZXMgYW4gdW50aHJvdHRsZWQgdmVyc2lvbi5cbiAqIEBzZWUge21vdXNlUG9zaXRpb259IGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy5cbiAqIEBleGFtcGxlIGNvbnN0IHBvcyA9IHNlbnNvcignbW91c2VQb3NpdGlvbicsIHsgY29vcmRpbmF0ZVNwYWNlOiAncGFnZScsIHRocm90dGxlOiA1MCB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbnNvcihcbiAgdHlwZTogJ21vdXNlUG9zaXRpb24nLFxuICBvcHRpb25zPzogTW91c2VQb3NpdGlvbk9wdGlvbnMsXG4pOiBNb3VzZVBvc2l0aW9uU2lnbmFsO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZW5zb3Igc2lnbmFsIHRoYXQgdHJhY2tzIHRoZSBicm93c2VyJ3Mgb25saW5lL29mZmxpbmUgc3RhdHVzLlxuICogQHBhcmFtIHR5cGUgTXVzdCBiZSBgJ25ldHdvcmtTdGF0dXMnYC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24sIGN1cnJlbnRseSBvbmx5IGBkZWJ1Z05hbWVgLlxuICogQHJldHVybnMgQSBgTmV0d29ya1N0YXR1c1NpZ25hbGAgd2hpY2ggaXMgYSBib29sZWFuIGluZGljYXRpbmcgb25saW5lIHN0YXR1cywgd2l0aCBhbiBhdHRhY2hlZCBgc2luY2VgIHNpZ25hbC5cbiAqIEBzZWUge25ldHdvcmtTdGF0dXN9IGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy5cbiAqIEBleGFtcGxlIGNvbnN0IG9ubGluZVN0YXR1cyA9IHNlbnNvcignbmV0d29ya1N0YXR1cycpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2Vuc29yKFxuICB0eXBlOiAnbmV0d29ya1N0YXR1cycsXG4gIG9wdGlvbnM/OiB7IGRlYnVnTmFtZT86IHN0cmluZyB9LFxuKTogTmV0d29ya1N0YXR1c1NpZ25hbDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2Vuc29yIHNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgcGFnZSdzIHZpc2liaWxpdHkgc3RhdGUgKGUuZy4sICd2aXNpYmxlJywgJ2hpZGRlbicpLlxuICogQHBhcmFtIHR5cGUgTXVzdCBiZSBgJ3BhZ2VWaXNpYmlsaXR5J2AuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uLCBjdXJyZW50bHkgb25seSBgZGVidWdOYW1lYC5cbiAqIEByZXR1cm5zIEEgYFNpZ25hbDxEb2N1bWVudFZpc2liaWxpdHlTdGF0ZT5gIGluZGljYXRpbmcgdGhlIHBhZ2UncyBjdXJyZW50IHZpc2liaWxpdHkuXG4gKiBAc2VlIHtwYWdlVmlzaWJpbGl0eX0gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLlxuICogQGV4YW1wbGUgY29uc3QgdmlzaWJpbGl0eSA9IHNlbnNvcigncGFnZVZpc2liaWxpdHknKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbnNvcihcbiAgdHlwZTogJ3BhZ2VWaXNpYmlsaXR5JyxcbiAgb3B0aW9ucz86IHsgZGVidWdOYW1lPzogc3RyaW5nIH0sXG4pOiBTaWduYWw8RG9jdW1lbnRWaXNpYmlsaXR5U3RhdGU+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZW5zb3Igc2lnbmFsIHRoYXQgdHJhY2tzIHRoZSB1c2VyJ3MgT1MvYnJvd3NlciBwcmVmZXJlbmNlIGZvciBhIGRhcmsgY29sb3Igc2NoZW1lLlxuICogQHBhcmFtIHR5cGUgTXVzdCBiZSBgJ2RhcmstbW9kZSdgLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiwgY3VycmVudGx5IG9ubHkgYGRlYnVnTmFtZWAuXG4gKiBAcmV0dXJucyBBIGBTaWduYWw8Ym9vbGVhbj5gIHdoaWNoIGlzIGB0cnVlYCBpZiBhIGRhcmsgdGhlbWUgaXMgcHJlZmVycmVkLlxuICogQHNlZSB7cHJlZmVyc0RhcmtNb2RlfSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuXG4gKiBAZXhhbXBsZSBjb25zdCBpc0RhcmtNb2RlID0gc2Vuc29yKCdkYXJrLW1vZGUnKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbnNvcihcbiAgdHlwZTogJ2RhcmstbW9kZScsXG4gIG9wdGlvbnM/OiB7IGRlYnVnTmFtZT86IHN0cmluZyB9LFxuKTogU2lnbmFsPGJvb2xlYW4+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZW5zb3Igc2lnbmFsIHRoYXQgdHJhY2tzIHRoZSB1c2VyJ3MgT1MvYnJvd3NlciBwcmVmZXJlbmNlIGZvciByZWR1Y2VkIG1vdGlvbi5cbiAqIEBwYXJhbSB0eXBlIE11c3QgYmUgYCdyZWR1Y2VkLW1vdGlvbidgLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiwgY3VycmVudGx5IG9ubHkgYGRlYnVnTmFtZWAuXG4gKiBAcmV0dXJucyBBIGBTaWduYWw8Ym9vbGVhbj5gIHdoaWNoIGlzIGB0cnVlYCBpZiByZWR1Y2VkIG1vdGlvbiBpcyBwcmVmZXJyZWQuXG4gKiBAc2VlIHtwcmVmZXJzUmVkdWNlZE1vdGlvbn0gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLlxuICogQGV4YW1wbGUgY29uc3Qgd2FudHNSZWR1Y2VkTW90aW9uID0gc2Vuc29yKCdyZWR1Y2VkLW1vdGlvbicpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2Vuc29yKFxuICB0eXBlOiAncmVkdWNlZC1tb3Rpb24nLFxuICBvcHRpb25zPzogeyBkZWJ1Z05hbWU/OiBzdHJpbmcgfSxcbik6IFNpZ25hbDxib29sZWFuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2Vuc29yIHNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgYnJvd3NlciB3aW5kb3cncyBpbm5lciBkaW1lbnNpb25zICh3aWR0aCBhbmQgaGVpZ2h0KS5cbiAqIEBwYXJhbSB0eXBlIE11c3QgYmUgYCd3aW5kb3dTaXplJ2AuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgd2luZG93IHNpemUgc2Vuc29yLCBpbmNsdWRpbmcgYHRocm90dGxlYCBhbmQgYGRlYnVnTmFtZWAuXG4gKiBAcmV0dXJucyBBIGBXaW5kb3dTaXplU2lnbmFsYCB0aGF0IHRyYWNrcyB3aW5kb3cgZGltZW5zaW9ucyBhbmQgcHJvdmlkZXMgYW4gdW50aHJvdHRsZWQgdmVyc2lvbi5cbiAqIEBzZWUge3dpbmRvd1NpemV9IGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy5cbiAqIEBleGFtcGxlIGNvbnN0IHNpemUgPSBzZW5zb3IoJ3dpbmRvd1NpemUnLCB7IHRocm90dGxlOiAyMDAgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5zb3IoXG4gIHR5cGU6ICd3aW5kb3dTaXplJyxcbiAgb3B0aW9ucz86IFdpbmRvd1NpemVPcHRpb25zLFxuKTogV2luZG93U2l6ZVNpZ25hbDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2Vuc29yIHNpZ25hbCB0aGF0IHRyYWNrcyB0aGUgc2Nyb2xsIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgd2luZG93IG9yIGEgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKiBAcGFyYW0gdHlwZSBNdXN0IGJlIGAnc2Nyb2xsUG9zaXRpb24nYC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzY3JvbGwgcG9zaXRpb24gc2Vuc29yLCBpbmNsdWRpbmcgYHRhcmdldGAsIGB0aHJvdHRsZWAsIGFuZCBgZGVidWdOYW1lYC5cbiAqIEByZXR1cm5zIEEgYFNjcm9sbFBvc2l0aW9uU2lnbmFsYCB0aGF0IHRyYWNrcyBzY3JvbGwgY29vcmRpbmF0ZXMgYW5kIHByb3ZpZGVzIGFuIHVudGhyb3R0bGVkIHZlcnNpb24uXG4gKiBAc2VlIHtzY3JvbGxQb3NpdGlvbn0gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLlxuICogQGV4YW1wbGUgY29uc3QgcGFnZVNjcm9sbCA9IHNlbnNvcignc2Nyb2xsUG9zaXRpb24nLCB7IHRocm90dGxlOiAxNTAgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5zb3IoXG4gIHR5cGU6ICdzY3JvbGxQb3NpdGlvbicsXG4gIG9wdGlvbnM/OiBTY3JvbGxQb3NpdGlvbk9wdGlvbnMsXG4pOiBTY3JvbGxQb3NpdGlvblNpZ25hbDtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBmb3Igc2Vuc29yIG92ZXJsb2Fkcy5cbiAqIFVzZXJzIHNob3VsZCByZWZlciB0byB0aGUgc3BlY2lmaWMgb3ZlcmxvYWRzIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5zb3IoXG4gIHR5cGU6XG4gICAgfCAnbW91c2VQb3NpdGlvbidcbiAgICB8ICduZXR3b3JrU3RhdHVzJ1xuICAgIHwgJ3BhZ2VWaXNpYmlsaXR5J1xuICAgIHwgJ2RhcmstbW9kZSdcbiAgICB8ICdyZWR1Y2VkLW1vdGlvbidcbiAgICB8ICd3aW5kb3dTaXplJ1xuICAgIHwgJ3Njcm9sbFBvc2l0aW9uJyxcbiAgb3B0aW9ucz86XG4gICAgfCB7XG4gICAgICAgIGRlYnVnTmFtZT86IHN0cmluZztcbiAgICAgIH1cbiAgICB8IE1vdXNlUG9zaXRpb25PcHRpb25zXG4gICAgfCBXaW5kb3dTaXplT3B0aW9uc1xuICAgIHwgU2Nyb2xsUG9zaXRpb25PcHRpb25zLFxuKTpcbiAgfCBNb3VzZVBvc2l0aW9uU2lnbmFsXG4gIHwgTmV0d29ya1N0YXR1c1NpZ25hbFxuICB8IFNpZ25hbDxEb2N1bWVudFZpc2liaWxpdHlTdGF0ZT5cbiAgfCBTaWduYWw8Ym9vbGVhbj5cbiAgfCBXaW5kb3dTaXplU2lnbmFsXG4gIHwgU2Nyb2xsUG9zaXRpb25TaWduYWxcbiAgfCBTaWduYWw8SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdtb3VzZVBvc2l0aW9uJzpcbiAgICAgIHJldHVybiBtb3VzZVBvc2l0aW9uKG9wdGlvbnMpO1xuICAgIGNhc2UgJ25ldHdvcmtTdGF0dXMnOlxuICAgICAgcmV0dXJuIG5ldHdvcmtTdGF0dXMob3B0aW9ucz8uZGVidWdOYW1lKTtcbiAgICBjYXNlICdwYWdlVmlzaWJpbGl0eSc6XG4gICAgICByZXR1cm4gcGFnZVZpc2liaWxpdHkob3B0aW9ucz8uZGVidWdOYW1lKTtcbiAgICBjYXNlICdkYXJrLW1vZGUnOlxuICAgICAgcmV0dXJuIHByZWZlcnNEYXJrTW9kZShvcHRpb25zPy5kZWJ1Z05hbWUpO1xuICAgIGNhc2UgJ3JlZHVjZWQtbW90aW9uJzpcbiAgICAgIHJldHVybiBwcmVmZXJzUmVkdWNlZE1vdGlvbihvcHRpb25zPy5kZWJ1Z05hbWUpO1xuICAgIGNhc2UgJ3dpbmRvd1NpemUnOlxuICAgICAgcmV0dXJuIHdpbmRvd1NpemUob3B0aW9ucyk7XG4gICAgY2FzZSAnc2Nyb2xsUG9zaXRpb24nOlxuICAgICAgcmV0dXJuIHNjcm9sbFBvc2l0aW9uKG9wdGlvbnMgYXMgU2Nyb2xsUG9zaXRpb25PcHRpb25zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNlbnNvciB0eXBlOiAke3R5cGV9YCk7XG4gIH1cbn1cbiJdfQ==","import { isPlatformServer } from '@angular/common';\nimport { computed, DestroyRef, effect, inject, isDevMode, isSignal, PLATFORM_ID, signal, untracked, } from '@angular/core';\nimport { toWritable } from './to-writable';\n// Internal dummy store for server-side rendering\nconst noopStore = {\n getItem: () => null,\n setItem: () => {\n /* noop */\n },\n removeItem: () => {\n /* noop */\n },\n};\n/**\n * Creates a `WritableSignal` whose state is automatically synchronized with persistent storage\n * (like `localStorage` or `sessionStorage`).\n *\n * It handles Server-Side Rendering (SSR) gracefully, allows dynamic storage keys,\n * custom serialization/deserialization, custom storage providers, and optional\n * synchronization across browser tabs.\n *\n * @template T The type of value held by the signal and stored (after serialization).\n * @param fallback The default value of type `T` to use when no value is found in storage\n * or when deserialization fails. The signal's value will never be `null` or `undefined`\n * publicly, it will always revert to this fallback.\n * @param options Configuration options (`CreateStoredOptions<T>`). Requires at least the `key`.\n * @returns A `StoredSignal<T>` instance. This signal behaves like a standard `WritableSignal<T>`,\n * but its value is persisted. It includes a `.clear()` method to remove the item from storage\n * and a `.key` signal providing the current storage key.\n *\n * @remarks\n * - **Persistence:** The signal automatically saves its value to storage whenever the signal's\n * value or its configured `key` changes. This is managed internally using `effect`.\n * - **SSR Safety:** Detects server environments and uses a no-op storage, preventing errors.\n * - **Error Handling:** Catches and logs errors during serialization/deserialization in dev mode.\n * - **Tab Sync:** If `syncTabs` is true, listens to `storage` events to keep the signal value\n * consistent across browser tabs using the same key. Cleanup is handled automatically\n * using `DestroyRef`.\n * - **Removal:** Use the `.clear()` method on the returned signal to remove the item from storage.\n * Setting the signal to the fallback value will store the fallback value, not remove the item.\n *\n * @example\n * ```ts\n * import { Component, effect, signal } from '@angular/core';\n * import { stored } from '@mmstack/primitives'; // Adjust import path\n *\n * @Component({\n * selector: 'app-settings',\n * standalone: true,\n * template: `\n * Theme:\n * <select [ngModel]=\"theme()\" (ngModelChange)=\"theme.set($event)\">\n * <option value=\"light\">Light</option>\n * <option value=\"dark\">Dark</option>\n * </select>\n * <button (click)=\"theme.clear()\">Clear Theme Setting</button>\n * <p>Storage Key Used: {{ theme.key() }}</p>\n * ` // Requires FormsModule for ngModel\n * })\n * export class SettingsComponent {\n * theme = stored<'light' | 'dark'>('light', { key: 'app-theme', syncTabs: true });\n * }\n * ```\n */\nexport function stored(fallback, { key, store: providedStore, serialize = JSON.stringify, deserialize = JSON.parse, syncTabs = false, equal = Object.is, onKeyChange = 'load', cleanupOldKey = false, ...rest }) {\n const isServer = isPlatformServer(inject(PLATFORM_ID));\n const fallbackStore = isServer ? noopStore : localStorage;\n const store = providedStore ?? fallbackStore;\n const keySig = typeof key === 'string'\n ? computed(() => key)\n : isSignal(key)\n ? key\n : computed(key);\n const getValue = (key) => {\n const found = store.getItem(key);\n if (found === null)\n return null;\n try {\n return deserialize(found);\n }\n catch (err) {\n if (isDevMode())\n console.error(`Failed to parse stored value for key \"${key}\":`, err);\n return null;\n }\n };\n const storeValue = (key, value) => {\n try {\n if (value === null)\n return store.removeItem(key);\n const serialized = serialize(value);\n store.setItem(key, serialized);\n }\n catch (err) {\n if (isDevMode())\n console.error(`Failed to store value for key \"${key}\":`, err);\n }\n };\n const opt = {\n ...rest,\n equal,\n };\n const initialKey = untracked(keySig);\n const internal = signal(getValue(initialKey), {\n ...opt,\n equal: (a, b) => {\n if (a === null && b === null)\n return true;\n if (a === null || b === null)\n return false;\n return equal(a, b);\n },\n });\n let prevKey = initialKey;\n if (onKeyChange === 'store') {\n effect(() => {\n const k = keySig();\n storeValue(k, internal());\n if (prevKey !== k) {\n if (cleanupOldKey)\n store.removeItem(prevKey);\n prevKey = k;\n }\n });\n }\n else {\n effect(() => {\n const k = keySig();\n const internalValue = internal();\n if (k === prevKey) {\n return storeValue(k, internalValue); // normal operation\n }\n else {\n if (cleanupOldKey)\n store.removeItem(prevKey);\n const value = getValue(k);\n prevKey = k;\n internal.set(value); // load new value\n }\n });\n }\n if (syncTabs && !isServer) {\n const destroyRef = inject(DestroyRef);\n const sync = (e) => {\n if (e.key !== untracked(keySig))\n return;\n if (e.newValue === null)\n internal.set(null);\n else\n internal.set(getValue(e.key));\n };\n window.addEventListener('storage', sync);\n destroyRef.onDestroy(() => window.removeEventListener('storage', sync));\n }\n const writable = toWritable(computed(() => internal() ?? fallback, opt), internal.set);\n writable.clear = () => {\n internal.set(null);\n };\n writable.key = keySig;\n return writable;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL3N0b3JlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxRQUFRLEVBQ1IsV0FBVyxFQUVYLE1BQU0sRUFDTixTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWUzQyxpREFBaUQ7QUFDakQsTUFBTSxTQUFTLEdBQVU7SUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7SUFDbkIsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNaLFVBQVU7SUFDWixDQUFDO0lBQ0QsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNmLFVBQVU7SUFDWixDQUFDO0NBQ0YsQ0FBQztBQTBFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUNwQixRQUFXLEVBQ1gsRUFDRSxHQUFHLEVBQ0gsS0FBSyxFQUFFLGFBQWEsRUFDcEIsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQzFCLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUN4QixRQUFRLEdBQUcsS0FBSyxFQUNoQixLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFDakIsV0FBVyxHQUFHLE1BQU0sRUFDcEIsYUFBYSxHQUFHLEtBQUssRUFDckIsR0FBRyxJQUFJLEVBQ2dCO0lBRXpCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBRXZELE1BQU0sYUFBYSxH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SUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUN6QixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUMzQyxRQUFRLENBQUMsR0FBRyxDQUNNLENBQUM7SUFFckIsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDcEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUM7SUFDRixRQUFRLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztJQUN0QixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgY29tcHV0ZWQsXHJcbiAgRGVzdHJveVJlZixcclxuICBlZmZlY3QsXHJcbiAgaW5qZWN0LFxyXG4gIGlzRGV2TW9kZSxcclxuICBpc1NpZ25hbCxcclxuICBQTEFURk9STV9JRCxcclxuICBTaWduYWwsXHJcbiAgc2lnbmFsLFxyXG4gIHVudHJhY2tlZCxcclxuICB0eXBlIENyZWF0ZVNpZ25hbE9wdGlvbnMsXHJcbiAgdHlwZSBXcml0YWJsZVNpZ25hbCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdG9Xcml0YWJsZSB9IGZyb20gJy4vdG8td3JpdGFibGUnO1xyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSBmb3Igc3RvcmFnZSBtZWNoYW5pc21zIGNvbXBhdGlibGUgd2l0aCB0aGUgYHN0b3JlZGAgc2lnbmFsLlxyXG4gKiBNYXRjaGVzIHRoZSBlc3NlbnRpYWwgcGFydHMgb2YgdGhlIGBTdG9yYWdlYCBpbnRlcmZhY2UgKGBsb2NhbFN0b3JhZ2VgLCBgc2Vzc2lvblN0b3JhZ2VgKS5cclxuICovXHJcbnR5cGUgU3RvcmUgPSB7XHJcbiAgLyoqIFJldHJpZXZlcyBhbiBpdGVtIGZyb20gc3RvcmFnZSBmb3IgYSBnaXZlbiBrZXkuICovXHJcbiAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiBzdHJpbmcgfCBudWxsO1xyXG4gIC8qKiBTZXRzIGFuIGl0ZW0gaW4gc3RvcmFnZSBmb3IgYSBnaXZlbiBrZXkuICovXHJcbiAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIC8qKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBzdG9yYWdlIGZvciBhIGdpdmVuIGtleS4gKi9cclxuICByZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XHJcbn07XHJcblxyXG4vLyBJbnRlcm5hbCBkdW1teSBzdG9yZSBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXHJcbmNvbnN0IG5vb3BTdG9yZTogU3RvcmUgPSB7XHJcbiAgZ2V0SXRlbTogKCkgPT4gbnVsbCxcclxuICBzZXRJdGVtOiAoKSA9PiB7XHJcbiAgICAvKiBub29wICovXHJcbiAgfSxcclxuICByZW1vdmVJdGVtOiAoKSA9PiB7XHJcbiAgICAvKiBub29wICovXHJcbiAgfSxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIHNpZ25hbCBzeW5jaHJvbml6ZWQgd2l0aCBwZXJzaXN0ZW50IHN0b3JhZ2UgdXNpbmcgYHN0b3JlZCgpYC5cclxuICogRXh0ZW5kcyBBbmd1bGFyJ3MgYENyZWF0ZVNpZ25hbE9wdGlvbnNgLlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBzaWduYWwuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDcmVhdGVTdG9yZWRPcHRpb25zPFQ+ID0gQ3JlYXRlU2lnbmFsT3B0aW9uczxUPiAmIHtcclxuICAvKipcclxuICAgKiBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGl0ZW0gaW4gc3RvcmFnZS5cclxuICAgKiBDYW4gYmUgYSBzdGF0aWMgc3RyaW5nIG9yIGEgZnVuY3Rpb24vc2lnbmFsIHJldHVybmluZyBhIHN0cmluZyBmb3IgZHluYW1pYyBrZXlzXHJcbiAgICogKGUuZy4sIGJhc2VkIG9uIHVzZXIgSUQgb3Igb3RoZXIgYXBwbGljYXRpb24gc3RhdGUpLlxyXG4gICAqL1xyXG4gIGtleTogc3RyaW5nIHwgKCgpID0+IHN0cmluZyk7XHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgY3VzdG9tIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gKGUuZy4sIGBzZXNzaW9uU3RvcmFnZWAgb3IgYSBjdXN0b20gYWRhcHRlcikuXHJcbiAgICogTXVzdCBjb25mb3JtIHRvIHRoZSBgU3RvcmVgIGludGVyZmFjZSAoYGdldEl0ZW1gLCBgc2V0SXRlbWAsIGByZW1vdmVJdGVtYCkuXHJcbiAgICogRGVmYXVsdHMgdG8gYGxvY2FsU3RvcmFnZWAgaW4gYnJvd3NlciBlbnZpcm9ubWVudHMgYW5kIGEgbm8tb3Agc3RvcmUgb24gdGhlIHNlcnZlci5cclxuICAgKi9cclxuICBzdG9yZT86IFN0b3JlO1xyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUgKHR5cGUgYFRgKSBpbnRvIGEgc3RyaW5nIGJlZm9yZSBzdG9yaW5nLlxyXG4gICAqIERlZmF1bHRzIHRvIGBKU09OLnN0cmluZ2lmeWAuXHJcbiAgICogQHBhcmFtIHtUfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplLlxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbi5cclxuICAgKi9cclxuICBzZXJpYWxpemU/OiAodmFsdWU6IFQpID0+IHN0cmluZztcclxuICAvKipcclxuICAgKiBPcHRpb25hbCBmdW5jdGlvbiB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHJldHJpZXZlZCBmcm9tIHN0b3JhZ2UgYmFjayBpbnRvIHRoZSB2YWx1ZSAodHlwZSBgVGApLlxyXG4gICAqIERlZmF1bHRzIHRvIGBKU09OLnBhcnNlYC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHN0cmluZyByZXRyaWV2ZWQgZnJvbSBzdG9yYWdlLlxyXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgZGVzZXJpYWxpemVkIHZhbHVlLlxyXG4gICAqL1xyXG4gIGRlc2VyaWFsaXplPzogKHZhbHVlOiBzdHJpbmcpID0+IFQ7XHJcbiAgLyoqXHJcbiAgICogSWYgYHRydWVgLCB0aGUgc2lnbmFsIHdpbGwgYXR0ZW1wdCB0byBzeW5jaHJvbml6ZSBpdHMgc3RhdGUgYWNyb3NzIG11bHRpcGxlIGJyb3dzZXIgdGFic1xyXG4gICAqIHVzaW5nIHRoZSBgc3RvcmFnZWAgZXZlbnQuIENoYW5nZXMgbWFkZSBpbiBvbmUgdGFiIChzZXQsIHVwZGF0ZSwgY2xlYXIpIHdpbGwgYmVcclxuICAgKiByZWZsZWN0ZWQgaW4gb3RoZXIgdGFicyB1c2luZyB0aGUgc2FtZSBzdG9yYWdlIGtleS5cclxuICAgKiBSZXF1aXJlcyBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAgICovXHJcbiAgc3luY1RhYnM/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIHBhcmFtZXRlciB0byBzcGVjaWZ5IGhvdyBrZXkgY2hhbmdlcyBzaG91bGQgYmUgaGFuZGxlZCwgbG9hZCBpcyB0aGUgZGVmYXVsdC5cclxuICAgKiAtIGBsb2FkYDogVGhlIHNpZ25hbCB3aWxsIGxvYWQgdGhlIHZhbHVlIGZyb20gc3RvcmFnZSB3aGVuIHRoZSBrZXkgY2hhbmdlcyAmIHJlcGxhY2UgdGhlIHNpZ25hbCdzIHZhbHVlLlxyXG4gICAqIC0gYHN0b3JlYDogVGhlIHNpZ25hbCB3aWxsIHN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIHRvIHRoZSBuZXcga2V5IHdoZW4gdGhlIGtleSBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIG9uS2V5Q2hhbmdlPzogJ2xvYWQnIHwgJ3N0b3JlJztcclxuICAvKipcclxuICAgKiBJZiAndHJ1ZScsIHRoZSBzaWduYWwgd2lsbCByZW1vdmUgdGhlIG9sZCBrZXkgZnJvbSBzdG9yYWdlIHdoZW4gdGhlIGtleSBjaGFuZ2VzLCBkZWZhdWx0cyB0byBgZmFsc2VgLlxyXG4gICAqL1xyXG4gIGNsZWFudXBPbGRLZXk/OiBib29sZWFuO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbGl6ZWQgYFdyaXRhYmxlU2lnbmFsYCByZXR1cm5lZCBieSB0aGUgYHN0b3JlZCgpYCBmdW5jdGlvbi5cclxuICogSXQgc3luY2hyb25pemVzIGl0cyB2YWx1ZSB3aXRoIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQgcHJvdmlkZXMgYWRkaXRpb25hbCBtZXRob2RzLlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBzaWduYWwgKG1hdGNoZXMgdGhlIGZhbGxiYWNrIHR5cGUpLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgU3RvcmVkU2lnbmFsPFQ+ID0gV3JpdGFibGVTaWduYWw8VD4gJiB7XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB0aGUgaXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHNpZ25hbCdzIGtleSBmcm9tIHRoZSBjb25maWd1cmVkIHN0b3JhZ2UuXHJcbiAgICogQWZ0ZXIgY2xlYXJpbmcsIHJlYWRpbmcgdGhlIHNpZ25hbCB3aWxsIHJldHVybiB0aGUgZmFsbGJhY2sgdmFsdWUgdW50aWwgaXQncyBzZXQgYWdhaW4uXHJcbiAgICovXHJcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XHJcbiAgLyoqXHJcbiAgICogQSBgU2lnbmFsPHN0cmluZz5gIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RvcmFnZSBrZXkgYmVpbmcgdXNlZCBieSB0aGlzIHN0b3JlZCBzaWduYWwuXHJcbiAgICogVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHRoZSBrZXkgd2FzIGNvbmZpZ3VyZWQgZHluYW1pY2FsbHkuIFlvdSBjYW4gcmVhZCBvciByZWFjdFxyXG4gICAqIHRvIHRoaXMgc2lnbmFsIHRvIGtub3cgdGhlIGFjdGl2ZSBrZXkuXHJcbiAgICovXHJcbiAga2V5OiBTaWduYWw8c3RyaW5nPjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgYFdyaXRhYmxlU2lnbmFsYCB3aG9zZSBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplZCB3aXRoIHBlcnNpc3RlbnQgc3RvcmFnZVxyXG4gKiAobGlrZSBgbG9jYWxTdG9yYWdlYCBvciBgc2Vzc2lvblN0b3JhZ2VgKS5cclxuICpcclxuICogSXQgaGFuZGxlcyBTZXJ2ZXItU2lkZSBSZW5kZXJpbmcgKFNTUikgZ3JhY2VmdWxseSwgYWxsb3dzIGR5bmFtaWMgc3RvcmFnZSBrZXlzLFxyXG4gKiBjdXN0b20gc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24sIGN1c3RvbSBzdG9yYWdlIHByb3ZpZGVycywgYW5kIG9wdGlvbmFsXHJcbiAqIHN5bmNocm9uaXphdGlvbiBhY3Jvc3MgYnJvd3NlciB0YWJzLlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBzaWduYWwgYW5kIHN0b3JlZCAoYWZ0ZXIgc2VyaWFsaXphdGlvbikuXHJcbiAqIEBwYXJhbSBmYWxsYmFjayBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0eXBlIGBUYCB0byB1c2Ugd2hlbiBubyB2YWx1ZSBpcyBmb3VuZCBpbiBzdG9yYWdlXHJcbiAqIG9yIHdoZW4gZGVzZXJpYWxpemF0aW9uIGZhaWxzLiBUaGUgc2lnbmFsJ3MgdmFsdWUgd2lsbCBuZXZlciBiZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGBcclxuICogcHVibGljbHksIGl0IHdpbGwgYWx3YXlzIHJldmVydCB0byB0aGlzIGZhbGxiYWNrLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgKGBDcmVhdGVTdG9yZWRPcHRpb25zPFQ+YCkuIFJlcXVpcmVzIGF0IGxlYXN0IHRoZSBga2V5YC5cclxuICogQHJldHVybnMgQSBgU3RvcmVkU2lnbmFsPFQ+YCBpbnN0YW5jZS4gVGhpcyBzaWduYWwgYmVoYXZlcyBsaWtlIGEgc3RhbmRhcmQgYFdyaXRhYmxlU2lnbmFsPFQ+YCxcclxuICogYnV0IGl0cyB2YWx1ZSBpcyBwZXJzaXN0ZWQuIEl0IGluY2x1ZGVzIGEgYC5jbGVhcigpYCBtZXRob2QgdG8gcmVtb3ZlIHRoZSBpdGVtIGZyb20gc3RvcmFnZVxyXG4gKiBhbmQgYSBgLmtleWAgc2lnbmFsIHByb3ZpZGluZyB0aGUgY3VycmVudCBzdG9yYWdlIGtleS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogLSAqKlBlcnNpc3RlbmNlOioqIFRoZSBzaWduYWwgYXV0b21hdGljYWxseSBzYXZlcyBpdHMgdmFsdWUgdG8gc3RvcmFnZSB3aGVuZXZlciB0aGUgc2lnbmFsJ3NcclxuICogdmFsdWUgb3IgaXRzIGNvbmZpZ3VyZWQgYGtleWAgY2hhbmdlcy4gVGhpcyBpcyBtYW5hZ2VkIGludGVybmFsbHkgdXNpbmcgYGVmZmVjdGAuXHJcbiAqIC0gKipTU1IgU2FmZXR5OioqIERldGVjdHMgc2VydmVyIGVudmlyb25tZW50cyBhbmQgdXNlcyBhIG5vLW9wIHN0b3JhZ2UsIHByZXZlbnRpbmcgZXJyb3JzLlxyXG4gKiAtICoqRXJyb3IgSGFuZGxpbmc6KiogQ2F0Y2hlcyBhbmQgbG9ncyBlcnJvcnMgZHVyaW5nIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGluIGRldiBtb2RlLlxyXG4gKiAtICoqVGFiIFN5bmM6KiogSWYgYHN5bmNUYWJzYCBpcyB0cnVlLCBsaXN0ZW5zIHRvIGBzdG9yYWdlYCBldmVudHMgdG8ga2VlcCB0aGUgc2lnbmFsIHZhbHVlXHJcbiAqIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXIgdGFicyB1c2luZyB0aGUgc2FtZSBrZXkuIENsZWFudXAgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5XHJcbiAqIHVzaW5nIGBEZXN0cm95UmVmYC5cclxuICogLSAqKlJlbW92YWw6KiogVXNlIHRoZSBgLmNsZWFyKClgIG1ldGhvZCBvbiB0aGUgcmV0dXJuZWQgc2lnbmFsIHRvIHJlbW92ZSB0aGUgaXRlbSBmcm9tIHN0b3JhZ2UuXHJcbiAqIFNldHRpbmcgdGhlIHNpZ25hbCB0byB0aGUgZmFsbGJhY2sgdmFsdWUgd2lsbCBzdG9yZSB0aGUgZmFsbGJhY2sgdmFsdWUsIG5vdCByZW1vdmUgdGhlIGl0ZW0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGltcG9ydCB7IENvbXBvbmVudCwgZWZmZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuICogaW1wb3J0IHsgc3RvcmVkIH0gZnJvbSAnQG1tc3RhY2svcHJpbWl0aXZlcyc7IC8vIEFkanVzdCBpbXBvcnQgcGF0aFxyXG4gKlxyXG4gKiBAQ29tcG9uZW50KHtcclxuICogc2VsZWN0b3I6ICdhcHAtc2V0dGluZ3MnLFxyXG4gKiBzdGFuZGFsb25lOiB0cnVlLFxyXG4gKiB0ZW1wbGF0ZTogYFxyXG4gKiBUaGVtZTpcclxuICogPHNlbGVjdCBbbmdNb2RlbF09XCJ0aGVtZSgpXCIgKG5nTW9kZWxDaGFuZ2UpPVwidGhlbWUuc2V0KCRldmVudClcIj5cclxuICogPG9wdGlvbiB2YWx1ZT1cImxpZ2h0XCI+TGlnaHQ8L29wdGlvbj5cclxuICogPG9wdGlvbiB2YWx1ZT1cImRhcmtcIj5EYXJrPC9vcHRpb24+XHJcbiAqIDwvc2VsZWN0PlxyXG4gKiA8YnV0dG9uIChjbGljayk9XCJ0aGVtZS5jbGVhcigpXCI+Q2xlYXIgVGhlbWUgU2V0dGluZzwvYnV0dG9uPlxyXG4gKiA8cD5TdG9yYWdlIEtleSBVc2VkOiB7eyB0aGVtZS5rZXkoKSB9fTwvcD5cclxuICogYCAvLyBSZXF1aXJlcyBGb3Jtc01vZHVsZSBmb3IgbmdNb2RlbFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgU2V0dGluZ3NDb21wb25lbnQge1xyXG4gKiAgdGhlbWUgPSBzdG9yZWQ8J2xpZ2h0JyB8ICdkYXJrJz4oJ2xpZ2h0JywgeyBrZXk6ICdhcHAtdGhlbWUnLCBzeW5jVGFiczogdHJ1ZSB9KTtcclxuICogfVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdG9yZWQ8VD4oXHJcbiAgZmFsbGJhY2s6IFQsXHJcbiAge1xyXG4gICAga2V5LFxyXG4gICAgc3RvcmU6IHByb3ZpZGVkU3RvcmUsXHJcbiAgICBzZXJpYWxpemUgPSBKU09OLnN0cmluZ2lmeSxcclxuICAgIGRlc2VyaWFsaXplID0gSlNPTi5wYXJzZSxcclxuICAgIHN5bmNUYWJzID0gZmFsc2UsXHJcbiAgICBlcXVhbCA9IE9iamVjdC5pcyxcclxuICAgIG9uS2V5Q2hhbmdlID0gJ2xvYWQnLFxyXG4gICAgY2xlYW51cE9sZEtleSA9IGZhbHNlLFxyXG4gICAgLi4ucmVzdFxyXG4gIH06IENyZWF0ZVN0b3JlZE9wdGlvbnM8VD4sXHJcbik6IFN0b3JlZFNpZ25hbDxUPiB7XHJcbiAgY29uc3QgaXNTZXJ2ZXIgPSBpc1BsYXRmb3JtU2VydmVyKGluamVjdChQTEFURk9STV9JRCkpO1xyXG5cclxuICBjb25zdCBmYWxsYmFja1N0b3JlID0gaXNTZXJ2ZXIgPyBub29wU3RvcmUgOiBsb2NhbFN0b3JhZ2U7XHJcbiAgY29uc3Qgc3RvcmUgPSBwcm92aWRlZFN0b3JlID8/IGZhbGxiYWNrU3RvcmU7XHJcblxyXG4gIGNvbnN0IGtleVNpZyA9XHJcbiAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJ1xyXG4gICAgICA/IGNvbXB1dGVkKCgpID0+IGtleSlcclxuICAgICAgOiBpc1NpZ25hbChrZXkpXHJcbiAgICAgICAgPyBrZXlcclxuICAgICAgICA6IGNvbXB1dGVkKGtleSk7XHJcblxyXG4gIGNvbnN0IGdldFZhbHVlID0gKGtleTogc3RyaW5nKTogVCB8IG51bGwgPT4ge1xyXG4gICAgY29uc3QgZm91bmQgPSBzdG9yZS5nZXRJdGVtKGtleSk7XHJcbiAgICBpZiAoZm91bmQgPT09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplKGZvdW5kKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpXHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHN0b3JlZCB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCI6YCwgZXJyKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc3RvcmVWYWx1ZSA9IChrZXk6IHN0cmluZywgdmFsdWU6IFQgfCBudWxsKSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBzdG9yZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemUodmFsdWUpO1xyXG4gICAgICBzdG9yZS5zZXRJdGVtKGtleSwgc2VyaWFsaXplZCk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBzdG9yZSB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCI6YCwgZXJyKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBvcHQgPSB7XHJcbiAgICAuLi5yZXN0LFxyXG4gICAgZXF1YWwsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaW5pdGlhbEtleSA9IHVudHJhY2tlZChrZXlTaWcpO1xyXG4gIGNvbnN0IGludGVybmFsID0gc2lnbmFsKGdldFZhbHVlKGluaXRpYWxLZXkpLCB7XHJcbiAgICAuLi5vcHQsXHJcbiAgICBlcXVhbDogKGEsIGIpID0+IHtcclxuICAgICAgaWYgKGEgPT09IG51bGwgJiYgYiA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmIChhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIGVxdWFsKGEsIGIpO1xyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbGV0IHByZXZLZXkgPSBpbml0aWFsS2V5O1xyXG5cclxuICBpZiAob25LZXlDaGFuZ2UgPT09ICdzdG9yZScpIHtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGsgPSBrZXlTaWcoKTtcclxuICAgICAgc3RvcmVWYWx1ZShrLCBpbnRlcm5hbCgpKTtcclxuICAgICAgaWYgKHByZXZLZXkgIT09IGspIHtcclxuICAgICAgICBpZiAoY2xlYW51cE9sZEtleSkgc3RvcmUucmVtb3ZlSXRlbShwcmV2S2V5KTtcclxuICAgICAgICBwcmV2S2V5ID0gaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGsgPSBrZXlTaWcoKTtcclxuICAgICAgY29uc3QgaW50ZXJuYWxWYWx1ZSA9IGludGVybmFsKCk7XHJcbiAgICAgIGlmIChrID09PSBwcmV2S2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHN0b3JlVmFsdWUoaywgaW50ZXJuYWxWYWx1ZSk7IC8vIG5vcm1hbCBvcGVyYXRpb25cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoY2xlYW51cE9sZEtleSkgc3RvcmUucmVtb3ZlSXRlbShwcmV2S2V5KTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKGspO1xyXG5cclxuICAgICAgICBwcmV2S2V5ID0gaztcclxuICAgICAgICBpbnRlcm5hbC5zZXQodmFsdWUpOyAvLyBsb2FkIG5ldyB2YWx1ZVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChzeW5jVGFicyAmJiAhaXNTZXJ2ZXIpIHtcclxuICAgIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgICBjb25zdCBzeW5jID0gKGU6IFN0b3JhZ2VFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZS5rZXkgIT09IHVudHJhY2tlZChrZXlTaWcpKSByZXR1cm47XHJcblxyXG4gICAgICBpZiAoZS5uZXdWYWx1ZSA9PT0gbnVsbCkgaW50ZXJuYWwuc2V0KG51bGwpO1xyXG4gICAgICBlbHNlIGludGVybmFsLnNldChnZXRWYWx1ZShlLmtleSkpO1xyXG4gICAgfTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHN5bmMpO1xyXG5cclxuICAgIGRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgc3luYykpO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgd3JpdGFibGUgPSB0b1dyaXRhYmxlPFQ+KFxyXG4gICAgY29tcHV0ZWQoKCkgPT4gaW50ZXJuYWwoKSA/PyBmYWxsYmFjaywgb3B0KSxcclxuICAgIGludGVybmFsLnNldCxcclxuICApIGFzIFN0b3JlZFNpZ25hbDxUPjtcclxuXHJcbiAgd3JpdGFibGUuY2xlYXIgPSAoKSA9PiB7XHJcbiAgICBpbnRlcm5hbC5zZXQobnVsbCk7XHJcbiAgfTtcclxuICB3cml0YWJsZS5rZXkgPSBrZXlTaWc7XHJcbiAgcmV0dXJuIHdyaXRhYmxlO1xyXG59XHJcbiJdfQ==","import { DestroyRef, effect, inject, Injector, runInInjectionContext, untracked, } from '@angular/core';\n/**\n * Creates a Promise that resolves when a signal's value satisfies a given predicate.\n *\n * This is useful for imperatively waiting for a reactive state to change,\n * for example, in tests or to orchestrate complex asynchronous operations.\n *\n * @template T The type of the signal's value.\n * @param sourceSignal The signal to observe.\n * @param predicate A function that takes the signal's value and returns `true` if the condition is met.\n * @param options Optional configuration for timeout and explicit destruction.\n * @returns A Promise that resolves with the signal's value when the predicate is true,\n * or rejects on timeout or context destruction.\n *\n * @example\n * ```ts\n * const count = signal(0);\n *\n * async function waitForCount() {\n * console.log('Waiting for count to be >= 3...');\n * try {\n * const finalCount = await until(count, c => c >= 3, { timeout: 5000 });\n * console.log(`Count reached: ${finalCount}`);\n * } catch (e: any) { // Ensure 'e' is typed if you access properties like e.message\n * console.error(e.message); // e.g., \"until: Timeout after 5000ms.\"\n * }\n * }\n *\n * // Simulate updates\n * setTimeout(() => count.set(1), 500);\n * setTimeout(() => count.set(2), 1000);\n * setTimeout(() => count.set(3), 1500);\n *\n * waitForCount();\n * ```\n */\nexport function until(sourceSignal, predicate, options = {}) {\n const injector = options.injector ?? inject(Injector);\n return new Promise((resolve, reject) => {\n let effectRef;\n let timeoutId;\n let settled = false;\n const cleanupAndReject = (reason) => {\n if (!settled) {\n settled = true;\n if (timeoutId)\n clearTimeout(timeoutId);\n effectRef?.destroy();\n reject(new Error(reason));\n }\n };\n const cleanupAndResolve = (value) => {\n if (!settled) {\n settled = true;\n if (timeoutId)\n clearTimeout(timeoutId);\n effectRef?.destroy();\n resolve(value);\n }\n };\n try {\n const destroyRef = options.destroyRef ?? inject(DestroyRef, { optional: true });\n destroyRef?.onDestroy(() => {\n cleanupAndReject('until: Operation cancelled due to context destruction.');\n });\n }\n catch {\n // noop\n }\n const initialValue = untracked(sourceSignal);\n if (predicate(initialValue)) {\n cleanupAndResolve(initialValue);\n return;\n }\n if (options?.timeout !== undefined) {\n timeoutId = setTimeout(() => cleanupAndReject(`until: Timeout after ${options.timeout}ms.`), options.timeout);\n }\n runInInjectionContext(injector, () => {\n effectRef = effect(() => {\n if (settled) {\n return effectRef?.destroy();\n }\n const currentValue = sourceSignal();\n if (predicate(currentValue)) {\n cleanupAndResolve(currentValue);\n }\n });\n });\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW50aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3NyYy9saWIvdW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBRU4sTUFBTSxFQUNOLFFBQVEsRUFDUixxQkFBcUIsRUFFckIsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBaUJ2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQ25CLFlBQXVCLEVBQ3ZCLFNBQWdDLEVBQ2hDLFVBQXdCLEVBQUU7SUFFMUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN4QyxJQUFJLFNBQWdDLENBQUM7UUFDckMsSUFBSSxTQUFvRCxDQUFDO1FBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVwQixNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxTQUFTO29CQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLElBQUksU0FBUztvQkFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZDLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUUvRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDekIsZ0JBQWdCLENBQ2Qsd0RBQXdELENBQ3pELENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzVCLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFNBQVMsR0FBRyxVQUFVLENBQ3BCLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixPQUFPLENBQUMsT0FBTyxLQUFLLENBQUMsRUFDcEUsT0FBTyxDQUFDLE9BQU8sQ0FDaEIsQ0FBQztRQUNKLENBQUM7UUFFRCxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ25DLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUN0QixJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLE9BQU8sU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixDQUFDO2dCQUVELE1BQU0sWUFBWSxHQUFHLFlBQVksRUFBRSxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUM1QixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIEVmZmVjdFJlZixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxuICBTaWduYWwsXG4gIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIFVudGlsT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBJZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXRcbiAgICogd2l0aGluIHRoaXMgcGVyaW9kLCB0aGUgcHJvbWlzZSB3aWxsIHJlamVjdC5cbiAgICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBEZXN0cm95UmVmLiBJZiBwcm92aWRlZCBhbmQgdGhlIGNvbXBvbmVudC9jb250ZXh0IGlzIGRlc3Ryb3llZFxuICAgKiBiZWZvcmUgdGhlIGNvbmRpdGlvbiBpcyBtZXQgb3IgdGltZW91dCBvY2N1cnMsIHRoZSBwcm9taXNlIHdpbGwgcmVqZWN0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYXR0ZW1wdCB0byBpbmplY3Qgb25lIGlmIGNhbGxlZCBpbiBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAgICovXG4gIGRlc3Ryb3lSZWY/OiBEZXN0cm95UmVmO1xuICBpbmplY3Rvcj86IEluamVjdG9yO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYSBzaWduYWwncyB2YWx1ZSBzYXRpc2ZpZXMgYSBnaXZlbiBwcmVkaWNhdGUuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGltcGVyYXRpdmVseSB3YWl0aW5nIGZvciBhIHJlYWN0aXZlIHN0YXRlIHRvIGNoYW5nZSxcbiAqIGZvciBleGFtcGxlLCBpbiB0ZXN0cyBvciB0byBvcmNoZXN0cmF0ZSBjb21wbGV4IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBzaWduYWwncyB2YWx1ZS5cbiAqIEBwYXJhbSBzb3VyY2VTaWduYWwgVGhlIHNpZ25hbCB0byBvYnNlcnZlLlxuICogQHBhcmFtIHByZWRpY2F0ZSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIHNpZ25hbCdzIHZhbHVlIGFuZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29uZGl0aW9uIGlzIG1ldC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRpbWVvdXQgYW5kIGV4cGxpY2l0IGRlc3RydWN0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2lnbmFsJ3MgdmFsdWUgd2hlbiB0aGUgcHJlZGljYXRlIGlzIHRydWUsXG4gKiBvciByZWplY3RzIG9uIHRpbWVvdXQgb3IgY29udGV4dCBkZXN0cnVjdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNvdW50ID0gc2lnbmFsKDApO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb3VudCgpIHtcbiAqIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBjb3VudCB0byBiZSA+PSAzLi4uJyk7XG4gKiB0cnkge1xuICogY29uc3QgZmluYWxDb3VudCA9IGF3YWl0IHVudGlsKGNvdW50LCBjID0+IGMgPj0gMywgeyB0aW1lb3V0OiA1MDAwIH0pO1xuICogY29uc29sZS5sb2coYENvdW50IHJlYWNoZWQ6ICR7ZmluYWxDb3VudH1gKTtcbiAqIH0gY2F0Y2ggKGU6IGFueSkgeyAvLyBFbnN1cmUgJ2UnIGlzIHR5cGVkIGlmIHlvdSBhY2Nlc3MgcHJvcGVydGllcyBsaWtlIGUubWVzc2FnZVxuICogY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpOyAvLyBlLmcuLCBcInVudGlsOiBUaW1lb3V0IGFmdGVyIDUwMDBtcy5cIlxuICogfVxuICogfVxuICpcbiAqIC8vIFNpbXVsYXRlIHVwZGF0ZXNcbiAqIHNldFRpbWVvdXQoKCkgPT4gY291bnQuc2V0KDEpLCA1MDApO1xuICogc2V0VGltZW91dCgoKSA9PiBjb3VudC5zZXQoMiksIDEwMDApO1xuICogc2V0VGltZW91dCgoKSA9PiBjb3VudC5zZXQoMyksIDE1MDApO1xuICpcbiAqIHdhaXRGb3JDb3VudCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnRpbDxUPihcbiAgc291cmNlU2lnbmFsOiBTaWduYWw8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuLFxuICBvcHRpb25zOiBVbnRpbE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBpbmplY3RvciA9IG9wdGlvbnMuaW5qZWN0b3IgPz8gaW5qZWN0KEluamVjdG9yKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgZWZmZWN0UmVmOiBFZmZlY3RSZWYgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNsZWFudXBBbmRSZWplY3QgPSAocmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGVmZmVjdFJlZj8uZGVzdHJveSgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKHJlYXNvbikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhbnVwQW5kUmVzb2x2ZSA9ICh2YWx1ZTogVCkgPT4ge1xuICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgZWZmZWN0UmVmPy5kZXN0cm95KCk7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVJlZiA9XG4gICAgICAgIG9wdGlvbnMuZGVzdHJveVJlZiA/PyBpbmplY3QoRGVzdHJveVJlZiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgICAgZGVzdHJveVJlZj8ub25EZXN0cm95KCgpID0+IHtcbiAgICAgICAgY2xlYW51cEFuZFJlamVjdChcbiAgICAgICAgICAndW50aWw6IE9wZXJhdGlvbiBjYW5jZWxsZWQgZHVlIHRvIGNvbnRleHQgZGVzdHJ1Y3Rpb24uJyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm9vcFxuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHVudHJhY2tlZChzb3VyY2VTaWduYWwpO1xuICAgIGlmIChwcmVkaWNhdGUoaW5pdGlhbFZhbHVlKSkge1xuICAgICAgY2xlYW51cEFuZFJlc29sdmUoaW5pdGlhbFZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8udGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjbGVhbnVwQW5kUmVqZWN0KGB1bnRpbDogVGltZW91dCBhZnRlciAke29wdGlvbnMudGltZW91dH1tcy5gKSxcbiAgICAgICAgb3B0aW9ucy50aW1lb3V0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcbiAgICAgIGVmZmVjdFJlZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgcmV0dXJuIGVmZmVjdFJlZj8uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gc291cmNlU2lnbmFsKCk7XG4gICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgIGNsZWFudXBBbmRSZXNvbHZlKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==","import { SIGNAL } from '@angular/core/primitives/signals';\n/**\n * @interal\n */\nexport function getSignalEquality(sig) {\n const internal = sig[SIGNAL];\n if (internal && typeof internal.equal === 'function') {\n return internal.equal;\n }\n return Object.is; // Default equality check\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXNpZ25hbC1lcXVhbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ByaW1pdGl2ZXMvc3JjL2xpYi9nZXQtc2lnbmFsLWVxdWFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBSSxHQUFjO0lBQ2pELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBRTFCLENBQUM7SUFDRixJQUFJLFFBQVEsSUFBSSxPQUFPLFFBQVEsQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDckQsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpZ25hbCwgVmFsdWVFcXVhbGl0eUZuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTSUdOQUwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3ByaW1pdGl2ZXMvc2lnbmFscyc7XG5cbi8qKlxuICogQGludGVyYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25hbEVxdWFsaXR5PFQ+KHNpZzogU2lnbmFsPFQ+KTogVmFsdWVFcXVhbGl0eUZuPFQ+IHtcbiAgY29uc3QgaW50ZXJuYWwgPSBzaWdbU0lHTkFMXSBhcyB7XG4gICAgZXF1YWw/OiBWYWx1ZUVxdWFsaXR5Rm48VD47XG4gIH07XG4gIGlmIChpbnRlcm5hbCAmJiB0eXBlb2YgaW50ZXJuYWwuZXF1YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaW50ZXJuYWwuZXF1YWw7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5pczsgLy8gRGVmYXVsdCBlcXVhbGl0eSBjaGVja1xufVxuIl19","import { computed, untracked, } from '@angular/core';\nimport { getSignalEquality } from './get-signal-equality';\nimport { mutable } from './mutable';\nimport { toWritable } from './to-writable';\n/**\n * Enhances an existing `WritableSignal` by adding a complete undo/redo history\n * stack and an API to control it.\n *\n * @template T The type of value held by the signal.\n * @param source The source `WritableSignal` to add history tracking to.\n * @param options Optional configuration for the history behavior.\n * @returns A `SignalWithHistory<T>` instance, augmenting the source signal with history APIs.\n *\n * @remarks\n * - Any new `.set()` or `.update()` call on the signal will clear the entire redo stack.\n * - The primitive attempts to automatically use the source signal's own `equal` function,\n * but this relies on an internal Angular API. For maximum stability across Angular\n * versions, it is recommended to provide an explicit `equal` function in the options.\n *\n * @example\n * ```ts\n * import { signal } from '@angular/core';\n * import { withHistory } from '@mmstack/primitives';\n *\n * const name = withHistory(signal('John'), { maxSize: 5 });\n *\n * console.log('Initial value:', name()); // \"John\"\n *\n * name.set('John Doe');\n * name.set('Jane Doe');\n *\n * console.log('Current value:', name()); // \"Jane Doe\"\n * console.log('History:', name.history()); // [\"John\", \"John Doe\"]\n * console.log('Can undo:', name.canUndo()); // true\n * console.log('Can redo:', name.canRedo()); // false\n *\n * name.undo();\n * console.log('After undo:', name()); // \"John Doe\"\n * console.log('Can redo:', name.canRedo()); // true\n *\n * name.redo();\n * console.log('After redo:', name()); // \"Jane Doe\"\n *\n * // A new change will clear the redo history\n * name.set('Janine Doe');\n * console.log('Can redo:', name.canRedo()); // false\n *\n * name.clear();\n * console.log('Can undo:', name.canUndo()); // false\n * ```\n */\nexport function withHistory(source, opt) {\n const equal = opt?.equal ?? getSignalEquality(source);\n const maxSize = opt?.maxSize ?? Infinity;\n const history = mutable([], {\n ...opt,\n equal: undefined,\n });\n const redoArray = mutable([]);\n const originalSet = source.set;\n const set = (value) => {\n const current = untracked(source);\n if (equal(value, current))\n return;\n source.set(value);\n history.mutate((c) => {\n if (c.length >= maxSize) {\n if (opt?.cleanupStrategy === 'shift') {\n c.shift();\n }\n else {\n c = c.slice(Math.floor(maxSize / 2));\n }\n }\n c.push(current);\n return c;\n });\n redoArray.set([]);\n };\n const update = (updater) => {\n set(updater(untracked(source)));\n };\n const internal = toWritable(computed(() => source(), {\n equal,\n debugName: opt?.debugName,\n }), set, update);\n internal.history = history;\n internal.undo = () => {\n const historyStack = untracked(history);\n if (historyStack.length === 0)\n return;\n const valueForRedo = untracked(source);\n const valueToRestore = historyStack.at(-1);\n originalSet.call(source, valueToRestore);\n history.inline((h) => h.pop());\n redoArray.inline((r) => r.push(valueForRedo));\n };\n internal.redo = () => {\n const redoStack = untracked(redoArray);\n if (redoStack.length === 0)\n return;\n const valueForUndo = untracked(source);\n const valueToRestore = redoStack.at(-1);\n originalSet.call(source, valueToRestore);\n redoArray.inline((r) => r.pop());\n history.mutate((h) => {\n if (h.length >= maxSize) {\n if (opt?.cleanupStrategy === 'shift') {\n h.shift();\n }\n else {\n h = h.slice(Math.floor(maxSize / 2));\n }\n }\n h.push(valueForUndo);\n return h;\n });\n };\n internal.clear = () => {\n history.set([]);\n redoArray.set([]);\n };\n internal.canUndo = computed(() => history().length > 0);\n internal.canRedo = computed(() => redoArray().length > 0);\n internal.canClear = computed(() => internal.canUndo() || internal.canRedo());\n return internal;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1oaXN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbGliL3dpdGgtaGlzdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUdSLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFvRDNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsTUFBeUIsRUFDekIsR0FBNkI7SUFFN0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQztJQUV6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQU0sRUFBRSxFQUFFO1FBQy9CLEdBQUcsR0FBRztRQUNOLEtBQUssRUFBRSxTQUFTO0tBQ2pCLENBQUMsQ0FBQztJQUVILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBTSxFQUFFLENBQUMsQ0FBQztJQUVuQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBRS9CLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7UUFDdkIsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFBRSxPQUFPO1FBRWxDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFD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LENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7WUFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0lBRUYsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFN0UsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgY29tcHV0ZWQsXHJcbiAgdHlwZSBDcmVhdGVTaWduYWxPcHRpb25zLFxyXG4gIHR5cGUgU2lnbmFsLFxyXG4gIHVudHJhY2tlZCxcclxuICB0eXBlIFZhbHVlRXF1YWxpdHlGbixcclxuICB0eXBlIFdyaXRhYmxlU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBnZXRTaWduYWxFcXVhbGl0eSB9IGZyb20gJy4vZ2V0LXNpZ25hbC1lcXVhbGl0eSc7XHJcbmltcG9ydCB7IG11dGFibGUgfSBmcm9tICcuL211dGFibGUnO1xyXG5pbXBvcnQgeyB0b1dyaXRhYmxlIH0gZnJvbSAnLi90by13cml0YWJsZSc7XHJcblxyXG4vKipcclxuICogQSBXcml0YWJsZVNpZ25hbCBlbmhhbmNlZCB3aXRoIHVuZG8vcmVkbyBjYXBhYmlsaXRpZXMgYW5kIGhpc3RvcnkgdHJhY2tpbmcuXHJcbiAqXHJcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIHNpZ25hbC5cclxuICovXHJcbmV4cG9ydCB0eXBlIFNpZ25hbFdpdGhIaXN0b3J5PFQ+ID0gV3JpdGFibGVTaWduYWw8VD4gJiB7XHJcbiAgLyoqIEEgcmVhZC1vbmx5IHNpZ25hbCBvZiB0aGUgdW5kbyBoaXN0b3J5IHN0YWNrLiBUaGUgb2xkZXN0IGNoYW5nZXMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgYXJyYXkuICovXHJcbiAgaGlzdG9yeTogU2lnbmFsPFRbXT47XHJcbiAgLyoqIFJldmVydHMgdGhlIHNpZ25hbCB0byBpdHMgbW9zdCByZWNlbnQgcHJldmlvdXMgc3RhdGUgaW4gdGhlIGhpc3RvcnkuICovXHJcbiAgdW5kbzogKCkgPT4gdm9pZDtcclxuICAvKiogUmUtYXBwbGllcyB0aGUgbGFzdCBzdGF0ZSB0aGF0IHdhcyB1bmRvbmUuICovXHJcbiAgcmVkbzogKCkgPT4gdm9pZDtcclxuICAvKiogQSBzaWduYWwgdGhhdCBpcyBgdHJ1ZWAgaWYgdGhlcmUgYXJlIHN0YXRlcyBpbiB0aGUgcmVkbyBzdGFjay4gKi9cclxuICBjYW5SZWRvOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgLyoqIEEgc2lnbmFsIHRoYXQgaXMgYHRydWVgIGlmIHRoZXJlIGFyZSBzdGF0ZXMgaW4gdGhlIHVuZG8gaGlzdG9yeS4gKi9cclxuICBjYW5VbmRvOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgLyoqIENsZWFycyBib3RoIHRoZSB1bmRvIGFuZCByZWRvIGhpc3Rvcnkgc3RhY2tzLiAqL1xyXG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xyXG4gIC8qKiBBIHNpZ25hbCB0aGF0IGlzIGB0cnVlYCBpZiB0aGVyZSBpcyBhbnkgaGlzdG9yeSB0aGF0IGNhbiBiZSBjbGVhcmVkLiAqL1xyXG4gIGNhbkNsZWFyOiBTaWduYWw8Ym9vbGVhbj47XHJcbn07XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBzaWduYWwgd2l0aCBoaXN0b3J5IHRyYWNraW5nLlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBzaWduYWwuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDcmVhdGVIaXN0b3J5T3B0aW9uczxUPiA9IE9taXQ8XHJcbiAgQ3JlYXRlU2lnbmFsT3B0aW9uczxUW10+LFxyXG4gICdlcXVhbCdcclxuPiAmIHtcclxuICAvKipcclxuICAgKiBPcHRpb25hbCBjdXN0b20gZXF1YWxpdHkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgdmFsdWUgaGFzIGNoYW5nZWQgYmVmb3JlXHJcbiAgICogYWRkaW5nIGl0IHRvIGhpc3RvcnkuIERlZmF1bHRzIHRvIHRoZSBzb3VyY2Ugc2lnbmFsJ3MgZXF1YWxpdHkgZnVuY3Rpb24gb3IgYE9iamVjdC5pc2AuXHJcbiAgICovXHJcbiAgZXF1YWw/OiBWYWx1ZUVxdWFsaXR5Rm48VD47XHJcbiAgLyoqXHJcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuZG8gc3RhdGVzIHRvIGtlZXAgaW4gdGhlIGhpc3RvcnkuXHJcbiAgICogQGRlZmF1bHQgSW5maW5pdHlcclxuICAgKi9cclxuICBtYXhTaXplPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBzdHJhdGVneSBmb3IgdHJpbW1pbmcgdGhlIGhpc3Rvcnkgd2hlbiBgbWF4U2l6ZWAgaXMgcmVhY2hlZC5cclxuICAgKiAtIGBzaGlmdGA6IFJlbW92ZXMgdGhlIHNpbmdsZSBvbGRlc3QgZW50cnkgZnJvbSB0aGUgaGlzdG9yeS5cclxuICAgKiAtIGBoYWx2ZWA6IFJlbW92ZXMgdGhlIG9sZGVzdCBoYWxmIG9mIHRoZSBoaXN0b3J5IHN0YWNrLlxyXG4gICAqIEBkZWZhdWx0ICdoYWx2ZSdcclxuICAgKi9cclxuICBjbGVhbnVwU3RyYXRlZ3k/OiAnc2hpZnQnIHwgJ2hhbHZlJztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBFbmhhbmNlcyBhbiBleGlzdGluZyBgV3JpdGFibGVTaWduYWxgIGJ5IGFkZGluZyBhIGNvbXBsZXRlIHVuZG8vcmVkbyBoaXN0b3J5XHJcbiAqIHN0YWNrIGFuZCBhbiBBUEkgdG8gY29udHJvbCBpdC5cclxuICpcclxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdmFsdWUgaGVsZCBieSB0aGUgc2lnbmFsLlxyXG4gKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgYFdyaXRhYmxlU2lnbmFsYCB0byBhZGQgaGlzdG9yeSB0cmFja2luZyB0by5cclxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGhpc3RvcnkgYmVoYXZpb3IuXHJcbiAqIEByZXR1cm5zIEEgYFNpZ25hbFdpdGhIaXN0b3J5PFQ+YCBpbnN0YW5jZSwgYXVnbWVudGluZyB0aGUgc291cmNlIHNpZ25hbCB3aXRoIGhpc3RvcnkgQVBJcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogLSBBbnkgbmV3IGAuc2V0KClgIG9yIGAudXBkYXRlKClgIGNhbGwgb24gdGhlIHNpZ25hbCB3aWxsIGNsZWFyIHRoZSBlbnRpcmUgcmVkbyBzdGFjay5cclxuICogLSBUaGUgcHJpbWl0aXZlIGF0dGVtcHRzIHRvIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBzb3VyY2Ugc2lnbmFsJ3Mgb3duIGBlcXVhbGAgZnVuY3Rpb24sXHJcbiAqIGJ1dCB0aGlzIHJlbGllcyBvbiBhbiBpbnRlcm5hbCBBbmd1bGFyIEFQSS4gRm9yIG1heGltdW0gc3RhYmlsaXR5IGFjcm9zcyBBbmd1bGFyXHJcbiAqIHZlcnNpb25zLCBpdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGFuIGV4cGxpY2l0IGBlcXVhbGAgZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnMuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGltcG9ydCB7IHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4gKiBpbXBvcnQgeyB3aXRoSGlzdG9yeSB9IGZyb20gJ0BtbXN0YWNrL3ByaW1pdGl2ZXMnO1xyXG4gKlxyXG4gKiBjb25zdCBuYW1lID0gd2l0aEhpc3Rvcnkoc2lnbmFsKCdKb2huJyksIHsgbWF4U2l6ZTogNSB9KTtcclxuICpcclxuICogY29uc29sZS5sb2coJ0luaXRpYWwgdmFsdWU6JywgbmFtZSgpKTsgLy8gXCJKb2huXCJcclxuICpcclxuICogbmFtZS5zZXQoJ0pvaG4gRG9lJyk7XHJcbiAqIG5hbWUuc2V0KCdKYW5lIERvZScpO1xyXG4gKlxyXG4gKiBjb25zb2xlLmxvZygnQ3VycmVudCB2YWx1ZTonLCBuYW1lKCkpOyAvLyBcIkphbmUgRG9lXCJcclxuICogY29uc29sZS5sb2coJ0hpc3Rvcnk6JywgbmFtZS5oaXN0b3J5KCkpOyAvLyBbXCJKb2huXCIsIFwiSm9obiBEb2VcIl1cclxuICogY29uc29sZS5sb2coJ0NhbiB1bmRvOicsIG5hbWUuY2FuVW5kbygpKTsgLy8gdHJ1ZVxyXG4gKiBjb25zb2xlLmxvZygnQ2FuIHJlZG86JywgbmFtZS5jYW5SZWRvKCkpOyAvLyBmYWxzZVxyXG4gKlxyXG4gKiBuYW1lLnVuZG8oKTtcclxuICogY29uc29sZS5sb2coJ0FmdGVyIHVuZG86JywgbmFtZSgpKTsgLy8gXCJKb2huIERvZVwiXHJcbiAqIGNvbnNvbGUubG9nKCdDYW4gcmVkbzonLCBuYW1lLmNhblJlZG8oKSk7IC8vIHRydWVcclxuICpcclxuICogbmFtZS5yZWRvKCk7XHJcbiAqIGNvbnNvbGUubG9nKCdBZnRlciByZWRvOicsIG5hbWUoKSk7IC8vIFwiSmFuZSBEb2VcIlxyXG4gKlxyXG4gKiAvLyBBIG5ldyBjaGFuZ2Ugd2lsbCBjbGVhciB0aGUgcmVkbyBoaXN0b3J5XHJcbiAqIG5hbWUuc2V0KCdKYW5pbmUgRG9lJyk7XHJcbiAqIGNvbnNvbGUubG9nKCdDYW4gcmVkbzonLCBuYW1lLmNhblJlZG8oKSk7IC8vIGZhbHNlXHJcbiAqXHJcbiAqIG5hbWUuY2xlYXIoKTtcclxuICogY29uc29sZS5sb2coJ0NhbiB1bmRvOicsIG5hbWUuY2FuVW5kbygpKTsgLy8gZmFsc2VcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gd2l0aEhpc3Rvcnk8VD4oXHJcbiAgc291cmNlOiBXcml0YWJsZVNpZ25hbDxUPixcclxuICBvcHQ/OiBDcmVhdGVIaXN0b3J5T3B0aW9uczxUPixcclxuKTogU2lnbmFsV2l0aEhpc3Rvcnk8VD4ge1xyXG4gIGNvbnN0IGVxdWFsID0gb3B0Py5lcXVhbCA/PyBnZXRTaWduYWxFcXVhbGl0eShzb3VyY2UpO1xyXG4gIGNvbnN0IG1heFNpemUgPSBvcHQ/Lm1heFNpemUgPz8gSW5maW5pdHk7XHJcblxyXG4gIGNvbnN0IGhpc3RvcnkgPSBtdXRhYmxlPFRbXT4oW10sIHtcclxuICAgIC4uLm9wdCxcclxuICAgIGVxdWFsOiB1bmRlZmluZWQsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlZG9BcnJheSA9IG11dGFibGU8VFtdPihbXSk7XHJcblxyXG4gIGNvbnN0IG9yaWdpbmFsU2V0ID0gc291cmNlLnNldDtcclxuXHJcbiAgY29uc3Qgc2V0ID0gKHZhbHVlOiBUKSA9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdW50cmFja2VkKHNvdXJjZSk7XHJcbiAgICBpZiAoZXF1YWwodmFsdWUsIGN1cnJlbnQpKSByZXR1cm47XHJcblxyXG4gICAgc291cmNlLnNldCh2YWx1ZSk7XHJcblxyXG4gICAgaGlzdG9yeS5tdXRhdGUoKGMpID0+IHtcclxuICAgICAgaWYgKGMubGVuZ3RoID49IG1heFNpemUpIHtcclxuICAgICAgICBpZiAob3B0Py5jbGVhbnVwU3RyYXRlZ3kgPT09ICdzaGlmdCcpIHtcclxuICAgICAgICAgIGMuc2hpZnQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYyA9IGMuc2xpY2UoTWF0aC5mbG9vcihtYXhTaXplIC8gMikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjLnB1c2goY3VycmVudCk7XHJcbiAgICAgIHJldHVybiBjO1xyXG4gICAgfSk7XHJcbiAgICByZWRvQXJyYXkuc2V0KFtdKTtcclxuICB9O1xyXG5cclxuICBjb25zdCB1cGRhdGUgPSAodXBkYXRlcjogKHByZXY6IFQpID0+IFQpID0+IHtcclxuICAgIHNldCh1cGRhdGVyKHVudHJhY2tlZChzb3VyY2UpKSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaW50ZXJuYWwgPSB0b1dyaXRhYmxlKFxyXG4gICAgY29tcHV0ZWQoKCkgPT4gc291cmNlKCksIHtcclxuICAgICAgZXF1YWwsXHJcbiAgICAgIGRlYnVnTmFtZTogb3B0Py5kZWJ1Z05hbWUsXHJcbiAgICB9KSxcclxuICAgIHNldCxcclxuICAgIHVwZGF0ZSxcclxuICApIGFzIFNpZ25hbFdpdGhIaXN0b3J5PFQ+O1xyXG4gIGludGVybmFsLmhpc3RvcnkgPSBoaXN0b3J5O1xyXG5cclxuICBpbnRlcm5hbC51bmRvID0gKCkgPT4ge1xyXG4gICAgY29uc3QgaGlzdG9yeVN0YWNrID0gdW50cmFja2VkKGhpc3RvcnkpO1xyXG4gICAgaWYgKGhpc3RvcnlTdGFjay5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2YWx1ZUZvclJlZG8gPSB1bnRyYWNrZWQoc291cmNlKTtcclxuICAgIGNvbnN0IHZhbHVlVG9SZXN0b3JlID0gaGlzdG9yeVN0YWNrLmF0KC0xKSE7XHJcblxyXG4gICAgb3JpZ2luYWxTZXQuY2FsbChzb3VyY2UsIHZhbHVlVG9SZXN0b3JlKTtcclxuXHJcbiAgICBoaXN0b3J5LmlubGluZSgoaCkgPT4gaC5wb3AoKSk7XHJcbiAgICByZWRvQXJyYXkuaW5saW5lKChyKSA9PiByLnB1c2godmFsdWVGb3JSZWRvKSk7XHJcbiAgfTtcclxuXHJcbiAgaW50ZXJuYWwucmVkbyA9ICgpID0+IHtcclxuICAgIGNvbnN0IHJlZG9TdGFjayA9IHVudHJhY2tlZChyZWRvQXJyYXkpO1xyXG4gICAgaWYgKHJlZG9TdGFjay5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2YWx1ZUZvclVuZG8gPSB1bnRyYWNrZWQoc291cmNlKTtcclxuICAgIGNvbnN0IHZhbHVlVG9SZXN0b3JlID0gcmVkb1N0YWNrLmF0KC0xKSE7XHJcblxyXG4gICAgb3JpZ2luYWxTZXQuY2FsbChzb3VyY2UsIHZhbHVlVG9SZXN0b3JlKTtcclxuXHJcbiAgICByZWRvQXJyYXkuaW5saW5lKChyKSA9PiByLnBvcCgpKTtcclxuICAgIGhpc3RvcnkubXV0YXRlKChoKSA9PiB7XHJcbiAgICAgIGlmIChoLmxlbmd0aCA+PSBtYXhTaXplKSB7XHJcbiAgICAgICAgaWYgKG9wdD8uY2xlYW51cFN0cmF0ZWd5ID09PSAnc2hpZnQnKSB7XHJcbiAgICAgICAgICBoLnNoaWZ0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGggPSBoLnNsaWNlKE1hdGguZmxvb3IobWF4U2l6ZSAvIDIpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaC5wdXNoKHZhbHVlRm9yVW5kbyk7XHJcbiAgICAgIHJldHVybiBoO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgaW50ZXJuYWwuY2xlYXIgPSAoKSA9PiB7XHJcbiAgICBoaXN0b3J5LnNldChbXSk7XHJcbiAgICByZWRvQXJyYXkuc2V0KFtdKTtcclxuICB9O1xyXG5cclxuICBpbnRlcm5hbC5jYW5VbmRvID0gY29tcHV0ZWQoKCkgPT4gaGlzdG9yeSgpLmxlbmd0aCA+IDApO1xyXG4gIGludGVybmFsLmNhblJlZG8gPSBjb21wdXRlZCgoKSA9PiByZWRvQXJyYXkoKS5sZW5ndGggPiAwKTtcclxuICBpbnRlcm5hbC5jYW5DbGVhciA9IGNvbXB1dGVkKCgpID0+IGludGVybmFsLmNhblVuZG8oKSB8fCBpbnRlcm5hbC5jYW5SZWRvKCkpO1xyXG5cclxuICByZXR1cm4gaW50ZXJuYWw7XHJcbn1cclxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW1zdGFjay1wcmltaXRpdmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvcHJpbWl0aXZlcy9zcmMvbW1zdGFjay1wcmltaXRpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}