@signaltree/core 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +887 -4
- package/fesm2022/signaltree-core.mjs +120 -2
- package/fesm2022/signaltree-core.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -226,6 +226,18 @@ function shallowEqual(a, b) {
|
|
|
226
226
|
|
|
227
227
|
/**
|
|
228
228
|
* Creates an equality function based on configuration.
|
|
229
|
+
*
|
|
230
|
+
* @param useShallowComparison - If true, uses Object.is for comparison; otherwise uses deep equality
|
|
231
|
+
* @returns A function that compares two values for equality
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```typescript
|
|
235
|
+
* const shallowEqual = createEqualityFn(true);
|
|
236
|
+
* const deepEqual = createEqualityFn(false);
|
|
237
|
+
*
|
|
238
|
+
* shallowEqual({ a: 1 }, { a: 1 }); // false (different objects)
|
|
239
|
+
* deepEqual({ a: 1 }, { a: 1 }); // true (same structure and values)
|
|
240
|
+
* ```
|
|
229
241
|
*/
|
|
230
242
|
function createEqualityFn(useShallowComparison) {
|
|
231
243
|
return useShallowComparison ? Object.is : equal;
|
|
@@ -233,6 +245,26 @@ function createEqualityFn(useShallowComparison) {
|
|
|
233
245
|
/**
|
|
234
246
|
* Core function to create a basic SignalTree.
|
|
235
247
|
* This provides the minimal functionality without advanced features.
|
|
248
|
+
*
|
|
249
|
+
* @template T - The state object type
|
|
250
|
+
* @param obj - The initial state object
|
|
251
|
+
* @param config - Configuration options for the tree
|
|
252
|
+
* @returns A basic SignalTree with core functionality
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* const tree = create({
|
|
257
|
+
* count: 0,
|
|
258
|
+
* user: { name: 'John', age: 30 }
|
|
259
|
+
* }, {
|
|
260
|
+
* useLazySignals: true,
|
|
261
|
+
* useShallowComparison: false
|
|
262
|
+
* });
|
|
263
|
+
*
|
|
264
|
+
* // Access nested signals
|
|
265
|
+
* console.log(tree.$.count()); // 0
|
|
266
|
+
* tree.$.user.name.set('Jane');
|
|
267
|
+
* ```
|
|
236
268
|
*/
|
|
237
269
|
function create(obj, config = {}) {
|
|
238
270
|
const equalityFn = createEqualityFn(config.useShallowComparison ?? false);
|
|
@@ -245,11 +277,29 @@ function create(obj, config = {}) {
|
|
|
245
277
|
state: signalState,
|
|
246
278
|
$: signalState, // $ points to the same state object
|
|
247
279
|
};
|
|
248
|
-
|
|
280
|
+
enhanceTree(resultTree);
|
|
249
281
|
return resultTree;
|
|
250
282
|
}
|
|
251
283
|
/**
|
|
252
284
|
* Creates eager signals from an object (non-lazy approach).
|
|
285
|
+
* All signals are created immediately during initialization.
|
|
286
|
+
*
|
|
287
|
+
* @template O - The object type to convert to signals
|
|
288
|
+
* @param obj - The object to convert to signals
|
|
289
|
+
* @param equalityFn - Function to compare values for equality
|
|
290
|
+
* @returns A deeply signalified version of the object
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* ```typescript
|
|
294
|
+
* const eagerSignals = createEagerSignalsFromObject({
|
|
295
|
+
* user: { name: 'John', age: 30 },
|
|
296
|
+
* settings: { theme: 'dark' }
|
|
297
|
+
* }, Object.is);
|
|
298
|
+
*
|
|
299
|
+
* // All signals are created immediately
|
|
300
|
+
* eagerSignals.user.name.set('Jane');
|
|
301
|
+
* console.log(eagerSignals.settings.theme()); // 'dark'
|
|
302
|
+
* ```
|
|
253
303
|
*/
|
|
254
304
|
function createEagerSignalsFromObject(obj, equalityFn) {
|
|
255
305
|
const result = {};
|
|
@@ -272,8 +322,44 @@ function createEagerSignalsFromObject(obj, equalityFn) {
|
|
|
272
322
|
}
|
|
273
323
|
/**
|
|
274
324
|
* Enhances a tree with basic functionality (unwrap, update, pipe).
|
|
325
|
+
* Adds core methods that every SignalTree needs for basic operation.
|
|
326
|
+
*
|
|
327
|
+
* @template T - The state object type
|
|
328
|
+
* @param tree - The tree to enhance with basic functionality
|
|
329
|
+
* @returns The enhanced tree with unwrap, update, and pipe methods
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```typescript
|
|
333
|
+
* const basicTree = { state: signalState, $: signalState };
|
|
334
|
+
* enhanceTree(basicTree);
|
|
335
|
+
*
|
|
336
|
+
* // Now has basic methods:
|
|
337
|
+
* const currentState = basicTree.unwrap();
|
|
338
|
+
* basicTree.update(state => ({ ...state, count: state.count + 1 }));
|
|
339
|
+
* const enhancedTree = basicTree.pipe(withSomeFeature());
|
|
340
|
+
* ```
|
|
275
341
|
*/
|
|
276
|
-
function
|
|
342
|
+
function enhanceTree(tree) {
|
|
343
|
+
/**
|
|
344
|
+
* Unwraps the current state by reading all signal values.
|
|
345
|
+
* Recursively converts the signal tree back to plain JavaScript values.
|
|
346
|
+
*
|
|
347
|
+
* @returns The current state as a plain object
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```typescript
|
|
351
|
+
* const tree = signalTree({
|
|
352
|
+
* user: { name: 'John', age: 30 },
|
|
353
|
+
* count: 0
|
|
354
|
+
* });
|
|
355
|
+
*
|
|
356
|
+
* tree.$.user.name.set('Jane');
|
|
357
|
+
* tree.$.count.set(5);
|
|
358
|
+
*
|
|
359
|
+
* const currentState = tree.unwrap();
|
|
360
|
+
* // { user: { name: 'Jane', age: 30 }, count: 5 }
|
|
361
|
+
* ```
|
|
362
|
+
*/
|
|
277
363
|
tree.unwrap = () => {
|
|
278
364
|
// Recursively unwrap with proper typing
|
|
279
365
|
const unwrapObject = (obj) => {
|
|
@@ -297,6 +383,38 @@ function enhanceTreeBasic(tree) {
|
|
|
297
383
|
};
|
|
298
384
|
return unwrapObject(tree.state);
|
|
299
385
|
};
|
|
386
|
+
/**
|
|
387
|
+
* Updates the state using an updater function.
|
|
388
|
+
* The updater receives the current state and returns a partial update.
|
|
389
|
+
* Automatically handles nested signal updates.
|
|
390
|
+
*
|
|
391
|
+
* @param updater - Function that receives current state and returns partial updates
|
|
392
|
+
*
|
|
393
|
+
* @example
|
|
394
|
+
* ```typescript
|
|
395
|
+
* const tree = signalTree({
|
|
396
|
+
* user: { name: 'John', age: 30 },
|
|
397
|
+
* count: 0,
|
|
398
|
+
* todos: []
|
|
399
|
+
* });
|
|
400
|
+
*
|
|
401
|
+
* // Simple update
|
|
402
|
+
* tree.update(state => ({ count: state.count + 1 }));
|
|
403
|
+
*
|
|
404
|
+
* // Nested update
|
|
405
|
+
* tree.update(state => ({
|
|
406
|
+
* user: { ...state.user, age: state.user.age + 1 },
|
|
407
|
+
* todos: [...state.todos, { id: 1, text: 'New todo' }]
|
|
408
|
+
* }));
|
|
409
|
+
*
|
|
410
|
+
* // Conditional update
|
|
411
|
+
* tree.update(state =>
|
|
412
|
+
* state.count < 10
|
|
413
|
+
* ? { count: state.count + 1 }
|
|
414
|
+
* : { count: 0, user: { ...state.user, name: 'Reset' } }
|
|
415
|
+
* );
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
300
418
|
tree.update = (updater) => {
|
|
301
419
|
const currentValue = tree.unwrap();
|
|
302
420
|
const partialObj = updater(currentValue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js","../tmp-esm2022/signaltree-core.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\n// Path parsing cache for performance optimization\nconst pathCache = new Map();\n/**\n * Enhanced equality function inspired by the monolithic implementation.\n * Uses deep equality for arrays and objects, === for primitives.\n * More efficient than lodash while maintaining compatibility.\n */\nexport function equal(a, b) {\n // Fast path for reference equality\n if (a === b)\n return true;\n // Handle null/undefined cases\n if (a == null || b == null)\n return a === b;\n // Handle arrays with deep comparison\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n // Handle objects with deep comparison\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => keysB.includes(key) &&\n equal(a[key], b[key]));\n }\n // Fallback to strict equality\n return a === b;\n}\n/**\n * Creates a terminal signal with the enhanced equality function.\n * This should be used instead of Angular's signal() when you want\n * the same deep equality behavior as signalTree.\n *\n * Inspired by the monolithic implementation's terminal signal creation.\n */\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\n/**\n * Parses a dot-notation path into an array of keys with memoization.\n * Critical for performance when accessing nested properties frequently.\n *\n * @example\n * ```typescript\n * const keys1 = parsePath('user.name'); // Splits and caches\n * const keys2 = parsePath('user.name'); // Returns cached result\n * ```\n */\nexport function parsePath(path) {\n if (!pathCache.has(path)) {\n pathCache.set(path, path.split('.'));\n }\n const cached = pathCache.get(path);\n return cached ?? path.split('.');\n}\n/**\n * Creates a lazy signal tree using Proxy for on-demand signal creation.\n * Only creates signals when properties are first accessed, providing\n * massive memory savings for large state objects.\n *\n * @param obj - Source object to lazily signalify\n * @param equalityFn - Equality function for signal comparison\n * @param basePath - Base path for nested objects (internal use)\n * @returns Proxied object that creates signals on first access\n */\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n return new Proxy(obj, {\n get(target, prop) {\n // Handle symbol properties (like Symbol.iterator) normally\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n const value = target[key];\n // If it's already a signal, return it\n if (isSignal(value)) {\n return value;\n }\n // Check if we already have a signal for this path\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n // Check if we have a nested proxy cached\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n // Handle nested objects - create lazy proxy\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value)) {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n return nestedProxy;\n }\n // Create signal for primitive values and arrays\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n // Update the original object\n target[key] = value;\n // If we have a cached signal, update it\n const cachedSignal = signalCache.get(path);\n if (cachedSignal) {\n cachedSignal.set(value);\n }\n // Clear nested proxy cache if the value type changed\n if (nestedProxies.has(path)) {\n nestedProxies.delete(path);\n }\n return true;\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n}\n/**\n * Native deep equality check for arrays and objects.\n * Handles all common cases that lodash.isEqual handles for our use cases.\n */\nexport function deepEqual(a, b) {\n // Same reference or primitives\n if (a === b)\n return true;\n // Handle null/undefined\n if (a == null || b == null)\n return false;\n // Different types\n if (typeof a !== typeof b)\n return false;\n // Handle dates\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n // Handle objects (but not arrays, dates, or other special objects)\n if (typeof a === 'object' &&\n typeof b === 'object' &&\n !Array.isArray(a) &&\n !Array.isArray(b) &&\n !(a instanceof Date) &&\n !(b instanceof Date)) {\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (!(key in objB))\n return false;\n if (!deepEqual(objA[key], objB[key]))\n return false;\n }\n return true;\n }\n // For all other cases (primitives that aren't equal)\n return false;\n}\n/**\n * Shallow equality check for objects and arrays.\n */\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pFLGtEQUFrRDtBQUNsRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNqQyxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDhCQUE4QjtJQUM5QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFD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QUFDLEdBQUcsQ0FBQztnQkFFbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbmNvbnN0IHBhdGhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblxuLyoqXG4gKiBFbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbiBpbnNwaXJlZCBieSB0aGUgbW9ub2xpdGhpYyBpbXBsZW1lbnRhdGlvbi5cbiAqIFVzZXMgZGVlcCBlcXVhbGl0eSBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLCA9PT0gZm9yIHByaW1pdGl2ZXMuXG4gKiBNb3JlIGVmZmljaWVudCB0aGFuIGxvZGFzaCB3aGlsZSBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggZGVlcCBjb21wYXJpc29uXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBkZWVwIGNvbXBhcmlzb25cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBrZXlzQS5ldmVyeShcbiAgICAgIChrZXkpID0+XG4gICAgICAgIGtleXNCLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgZXF1YWwoXG4gICAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBzdHJpY3QgZXF1YWxpdHlcbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlcm1pbmFsIHNpZ25hbCB3aXRoIHRoZSBlbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbi5cbiAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBBbmd1bGFyJ3Mgc2lnbmFsKCkgd2hlbiB5b3Ugd2FudFxuICogdGhlIHNhbWUgZGVlcCBlcXVhbGl0eSBiZWhhdmlvciBhcyBzaWduYWxUcmVlLlxuICpcbiAqIEluc3BpcmVkIGJ5IHRoZSBtb25vbGl0aGljIGltcGxlbWVudGF0aW9uJ3MgdGVybWluYWwgc2lnbmFsIGNyZWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVybWluYWxTaWduYWw8VD4oXG4gIHZhbHVlOiBULFxuICBjdXN0b21FcXVhbD86IChhOiBULCBiOiBUKSA9PiBib29sZWFuXG4pOiBXcml0YWJsZVNpZ25hbDxUPiB7XG4gIHJldHVybiBzaWduYWwodmFsdWUsIHtcbiAgICBlcXVhbDogY3VzdG9tRXF1YWwgfHwgZXF1YWwsXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGRvdC1ub3RhdGlvbiBwYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyB3aXRoIG1lbW9pemF0aW9uLlxuICogQ3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHdoZW4gYWNjZXNzaW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGZyZXF1ZW50bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGtleXMxID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gU3BsaXRzIGFuZCBjYWNoZXNcbiAqIGNvbnN0IGtleXMyID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gUmV0dXJucyBjYWNoZWQgcmVzdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghcGF0aENhY2hlLmhhcyhwYXRoKSkge1xuICAgIHBhdGhDYWNoZS5zZXQocGF0aCwgcGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICByZXR1cm4gY2FjaGVkID8/IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSBzaWduYWwgdHJlZSB1c2luZyBQcm94eSBmb3Igb24tZGVtYW5kIHNpZ25hbCBjcmVhdGlvbi5cbiAqIE9ubHkgY3JlYXRlcyBzaWduYWxzIHdoZW4gcHJvcGVydGllcyBhcmUgZmlyc3QgYWNjZXNzZWQsIHByb3ZpZGluZ1xuICogbWFzc2l2ZSBtZW1vcnkgc2F2aW5ncyBmb3IgbGFyZ2Ugc3RhdGUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFQsXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuLFxuICBiYXNlUGF0aCA9ICcnXG4pOiBEZWVwU2lnbmFsaWZ5PFQ+IHtcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIC8vIEhhbmRsZSBzeW1ib2wgcHJvcGVydGllcyAobGlrZSBTeW1ib2wuaXRlcmF0b3IpIG5vcm1hbGx5XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWRQcm94eSA9IGNyZWF0ZUxhenlTaWduYWxUcmVlKFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgcGF0aFxuICAgICAgICApO1xuICAgICAgICBuZXN0ZWRQcm94aWVzLnNldChwYXRoLCBuZXN0ZWRQcm94eSk7XG4gICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hbCBmb3IgcHJpbWl0aXZlIHZhbHVlcyBhbmQgYXJyYXlzXG4gICAgICBjb25zdCBuZXdTaWduYWwgPSBzaWduYWwodmFsdWUsIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSk7XG4gICAgICBzaWduYWxDYWNoZS5zZXQocGF0aCwgbmV3U2lnbmFsKTtcbiAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgfSxcblxuICAgIHNldChcbiAgICAgIHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICB2YWx1ZTogdW5rbm93blxuICAgICkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgIGNvbnN0IGNhY2hlZFNpZ25hbCA9IHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIGlmIChjYWNoZWRTaWduYWwpIHtcbiAgICAgICAgY2FjaGVkU2lnbmFsLnNldCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIG5lc3RlZCBwcm94eSBjYWNoZSBpZiB0aGUgdmFsdWUgdHlwZSBjaGFuZ2VkXG4gICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgbmVzdGVkUHJveGllcy5kZWxldGUocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG59XG5cbi8qKlxuICogTmF0aXZlIGRlZXAgZXF1YWxpdHkgY2hlY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbiAqIEhhbmRsZXMgYWxsIGNvbW1vbiBjYXNlcyB0aGF0IGxvZGFzaC5pc0VxdWFsIGhhbmRsZXMgZm9yIG91ciB1c2UgY2FzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBTYW1lIHJlZmVyZW5jZSBvciBwcmltaXRpdmVzXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBEaWZmZXJlbnQgdHlwZXNcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEhhbmRsZSBkYXRlc1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgb2JqZWN0cyAoYnV0IG5vdCBhcnJheXMsIGRhdGVzLCBvciBvdGhlciBzcGVjaWFsIG9iamVjdHMpXG4gIGlmIChcbiAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShhKSAmJlxuICAgICFBcnJheS5pc0FycmF5KGIpICYmXG4gICAgIShhIGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKGIgaW5zdGFuY2VvZiBEYXRlKVxuICApIHtcbiAgICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvYmpCID0gYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqQikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEZvciBhbGwgb3RoZXIgY2FzZXMgKHByaW1pdGl2ZXMgdGhhdCBhcmVuJ3QgZXF1YWwpXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93RXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldICE9PVxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\n/**\n * Creates an equality function based on configuration.\n */\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\n/**\n * Core function to create a basic SignalTree.\n * This provides the minimal functionality without advanced features.\n */\nfunction create(obj, config = {}) {\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = config.useLazySignals ?? true; // Default to lazy loading\n // Choose between lazy and eager signal creation\n const signalState = useLazy\n ? createLazySignalTree(obj, equalityFn)\n : createEagerSignalsFromObject(obj, equalityFn);\n const resultTree = {\n state: signalState,\n $: signalState, // $ points to the same state object\n };\n enhanceTreeBasic(resultTree);\n return resultTree;\n}\n/**\n * Creates eager signals from an object (non-lazy approach).\n */\nfunction createEagerSignalsFromObject(obj, equalityFn) {\n const result = {};\n for (const [key, value] of Object.entries(obj)) {\n const isObj = (v) => typeof v === 'object' && v !== null;\n if (isObj(value) && !Array.isArray(value) && !isSignal(value)) {\n // For nested objects, create nested signal structure directly\n result[key] = createEagerSignalsFromObject(value, equalityFn);\n }\n else if (isSignal(value)) {\n result[key] = value;\n }\n else {\n result[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n return result;\n}\n/**\n * Enhances a tree with basic functionality (unwrap, update, pipe).\n */\nfunction enhanceTreeBasic(tree) {\n tree.unwrap = () => {\n // Recursively unwrap with proper typing\n const unwrapObject = (obj) => {\n const result = {};\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n // Nested signal state\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n tree.update = (updater) => {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n // Recursively update with better typing\n const updateObject = (target, updates) => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentSignalOrState = target[key];\n if (isSignal(currentSignalOrState)) {\n // Direct signal update\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null) {\n // Nested object - recurse\n updateObject(currentSignalOrState, updateValue);\n }\n }\n };\n updateObject(tree.state, partialObj);\n };\n // Pipe implementation for function composition with improved type safety\n tree.pipe = ((...fns // eslint-disable-line @typescript-eslint/no-explicit-any\n ) => {\n // eslint-disable-line @typescript-eslint/no-explicit-any\n if (fns.length === 0) {\n return tree;\n }\n // Type-safe reduce - the return type is determined by the overload signature\n return fns.reduce((acc, fn) => fn(acc), tree);\n });\n // Stub implementations for advanced features (will log warnings)\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', '\\nTo enable batch updates, install @signaltree/batching');\n // Fallback: Just call update directly\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', '\\nTo enable memoized computations, install @signaltree/memoization');\n // Fallback: Use simple Angular computed without memoization\n void cacheKey; // Mark as intentionally unused\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n // Fallback for test environments without injection context\n console.warn('Effect requires Angular injection context', error);\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n // Fallback for test environment - call once immediately\n console.warn('Subscribe requires Angular injection context', error);\n fn(tree.unwrap());\n return () => {\n // No-op unsubscribe\n };\n }\n };\n // Stub implementations for performance features\n tree.optimize = () => {\n console.warn('⚠️ optimize() called but tree optimization is not available.', '\\nTo enable optimization, install @signaltree/memoization');\n };\n tree.clearCache = () => {\n console.warn('⚠️ clearCache() called but caching is not available.', '\\nTo enable caching, install @signaltree/memoization');\n };\n tree.invalidatePattern = () => {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.', '\\nTo enable pattern invalidation, install @signaltree/memoization');\n return 0;\n };\n tree.destroy = () => {\n // Basic cleanup for non-enhanced trees\n console.log('[MEMORY-CLEANUP] Basic tree destroyed');\n };\n tree.getMetrics = () => {\n console.warn('⚠️ getMetrics() called but performance tracking is not enabled.', '\\nTo enable performance tracking, install @signaltree/middleware');\n // Return minimal metrics when tracking not enabled\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n // Stub implementations for middleware\n tree.addTap = (middleware) => {\n console.warn('⚠️ addTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void middleware; // Mark as intentionally unused\n };\n tree.removeTap = (id) => {\n console.warn('⚠️ removeTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void id; // Mark as intentionally unused\n };\n // Stub implementations for entity helpers\n tree.asCrud = () => {\n console.warn('⚠️ asCrud() called but entity helpers are not available.', '\\nTo enable entity helpers, install @signaltree/entities');\n return {};\n };\n // Stub implementations for async actions\n tree.asyncAction = (operation, config = {}) => {\n console.warn('⚠️ asyncAction() called but async actions are not available.', '\\nTo enable async actions, install @signaltree/async');\n void operation;\n void config;\n return {};\n };\n // Stub implementations for time travel\n tree.undo = () => {\n console.warn('⚠️ undo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.redo = () => {\n console.warn('⚠️ redo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.getHistory = () => {\n console.warn('⚠️ getHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n return [];\n };\n tree.resetHistory = () => {\n console.warn('⚠️ resetHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n return tree;\n}\n/**\n * Implementation of the signalTree factory function.\n */\nexport function signalTree(obj, configOrPreset) {\n // Handle preset strings\n if (typeof configOrPreset === 'string') {\n console.warn('⚠️ Preset configurations are not available in @signaltree/core.', '\\nTo use presets, install @signaltree/presets');\n // Fallback to basic configuration\n return create(obj, {});\n }\n // Handle configuration objects or default (smart enhancement)\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBY3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLG9CQUE2QjtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsTUFBTSxDQUNiLEdBQU0sRUFDTixTQUFxQixFQUFFO0lBRXZCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUV6RSxnREFBZ0Q7SUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTztRQUN6QixDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN2QyxDQUFDLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLENBQUMsRUFBRSxXQUFXLEVBQUUsb0NBQW9DO0tBQ3BDLENBQUM7SUFFbkIsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FB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ZixPQUFPLENBQUMsSUFBSSxDQUNWLG9EQUFvRCxFQUNwRCwwREFBMEQsQ0FDM0QsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FDVixvREFBb0QsRUFDcEQsMERBQTBELENBQzNELENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQXlCLEVBQUU7UUFDM0MsT0FBTyxDQUFDLElBQUksQ0FDViwwREFBMEQsRUFDMUQsMERBQTBELENBQzNELENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNERBQTRELEVBQzVELDBEQUEwRCxDQUMzRCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBMEZEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsR0FBTSxFQUNOLGNBQXdDO0lBRXhDLHdCQUF3QjtJQUN4QixJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsaUVBQWlFLEVBQ2pFLCtDQUErQyxDQUNoRCxDQUFDO1FBQ0Ysa0NBQWtDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsOERBQThEO0lBQzlELE1BQU0sTUFBTSxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxuICBTdGF0ZU9iamVjdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Rm4odXNlU2hhbGxvd0NvbXBhcmlzb246IGJvb2xlYW4pIHtcbiAgcmV0dXJuIHVzZVNoYWxsb3dDb21wYXJpc29uID8gT2JqZWN0LmlzIDogZXF1YWw7XG59XG5cbi8qKlxuICogQ29yZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyBTaWduYWxUcmVlLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgY29uc3QgZXF1YWxpdHlGbiA9IGNyZWF0ZUVxdWFsaXR5Rm4oY29uZmlnLnVzZVNoYWxsb3dDb21wYXJpc29uID8/IGZhbHNlKTtcbiAgY29uc3QgdXNlTGF6eSA9IGNvbmZpZy51c2VMYXp5U2lnbmFscyA/PyB0cnVlOyAvLyBEZWZhdWx0IHRvIGxhenkgbG9hZGluZ1xuXG4gIC8vIENob29zZSBiZXR3ZWVuIGxhenkgYW5kIGVhZ2VyIHNpZ25hbCBjcmVhdGlvblxuICBjb25zdCBzaWduYWxTdGF0ZSA9IHVzZUxhenlcbiAgICA/IGNyZWF0ZUxhenlTaWduYWxUcmVlKG9iaiwgZXF1YWxpdHlGbilcbiAgICA6IGNyZWF0ZUVhZ2VyU2lnbmFsc0Zyb21PYmplY3Qob2JqLCBlcXVhbGl0eUZuKTtcblxuICBjb25zdCByZXN1bHRUcmVlID0ge1xuICAgIHN0YXRlOiBzaWduYWxTdGF0ZSxcbiAgICAkOiBzaWduYWxTdGF0ZSwgLy8gJCBwb2ludHMgdG8gdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gIH0gYXMgU2lnbmFsVHJlZTxUPjtcblxuICBlbmhhbmNlVHJlZUJhc2ljKHJlc3VsdFRyZWUpO1xuICByZXR1cm4gcmVzdWx0VHJlZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGVhZ2VyIHNpZ25hbHMgZnJvbSBhbiBvYmplY3QgKG5vbi1sYXp5IGFwcHJvYWNoKS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdDxPIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IE8sXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBEZWVwU2lnbmFsaWZ5PE8+IHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgRGVlcFNpZ25hbGlmeTxPPjtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3QgaXNPYmogPSAodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuXG4gICAgaWYgKGlzT2JqKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgLy8gRm9yIG5lc3RlZCBvYmplY3RzLCBjcmVhdGUgbmVzdGVkIHNpZ25hbCBzdHJ1Y3R1cmUgZGlyZWN0bHlcbiAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBjcmVhdGVFYWdlclNpZ25hbHNGcm9tT2JqZWN0KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIHRyZWUgd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5ICh1bndyYXAsIHVwZGF0ZSwgcGlwZSkuXG4gKi9cbmZ1bmN0aW9uIGVuaGFuY2VUcmVlQmFzaWM8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgdHJlZTogU2lnbmFsVHJlZTxUPlxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIHRyZWUudW53cmFwID0gKCk6IFQgPT4ge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IHVud3JhcCB3aXRoIHByb3BlciB0eXBpbmdcbiAgICBjb25zdCB1bndyYXBPYmplY3QgPSA8TyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIG9iajogRGVlcFNpZ25hbGlmeTxPPlxuICAgICk6IE8gPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE5lc3RlZCBzaWduYWwgc3RhdGVcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcE9iamVjdChcbiAgICAgICAgICAgIHZhbHVlIGFzIERlZXBTaWduYWxpZnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQgYXMgTztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVud3JhcE9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4pO1xuICB9O1xuXG4gIHRyZWUudXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdHJlZS51bndyYXAoKTtcbiAgICBjb25zdCBwYXJ0aWFsT2JqID0gdXBkYXRlcihjdXJyZW50VmFsdWUpO1xuXG4gICAgLy8gUmVjdXJzaXZlbHkgdXBkYXRlIHdpdGggYmV0dGVyIHR5cGluZ1xuICAgIGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxPIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgdGFyZ2V0OiBEZWVwU2lnbmFsaWZ5PE8+LFxuICAgICAgdXBkYXRlczogUGFydGlhbDxPPlxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1cGRhdGVzLCBrZXkpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IHVwZGF0ZXNba2V5XTtcbiAgICAgICAgY29uc3QgY3VycmVudFNpZ25hbE9yU3RhdGUgPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbChjdXJyZW50U2lnbmFsT3JTdGF0ZSkpIHtcbiAgICAgICAgICAvLyBEaXJlY3Qgc2lnbmFsIHVwZGF0ZVxuICAgICAgICAgIChjdXJyZW50U2lnbmFsT3JTdGF0ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KHVwZGF0ZVZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgdXBkYXRlVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgdXBkYXRlVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheSh1cGRhdGVWYWx1ZSkgJiZcbiAgICAgICAgICB0eXBlb2YgY3VycmVudFNpZ25hbE9yU3RhdGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTmVzdGVkIG9iamVjdCAtIHJlY3Vyc2VcbiAgICAgICAgICB1cGRhdGVPYmplY3QoXG4gICAgICAgICAgICBjdXJyZW50U2lnbmFsT3JTdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICAgICAgICAgIHVwZGF0ZVZhbHVlIGFzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB1cGRhdGVPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXJ0aWFsT2JqKTtcbiAgfTtcblxuICAvLyBQaXBlIGltcGxlbWVudGF0aW9uIGZvciBmdW5jdGlvbiBjb21wb3NpdGlvbiB3aXRoIGltcHJvdmVkIHR5cGUgc2FmZXR5XG4gIHRyZWUucGlwZSA9ICgoXG4gICAgLi4uZm5zOiBBcnJheTwoaW5wdXQ6IGFueSkgPT4gYW55PiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfVxuXG4gICAgLy8gVHlwZS1zYWZlIHJlZHVjZSAtIHRoZSByZXR1cm4gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvdmVybG9hZCBzaWduYXR1cmVcbiAgICByZXR1cm4gZm5zLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgdHJlZSk7XG4gIH0pIGFzIFNpZ25hbFRyZWU8VD5bJ3BpcGUnXTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKHdpbGwgbG9nIHdhcm5pbmdzKVxuICB0cmVlLmJhdGNoVXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBiYXRjaFVwZGF0ZSgpIGNhbGxlZCBidXQgYmF0Y2hpbmcgaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgYmF0Y2ggdXBkYXRlcywgaW5zdGFsbCBAc2lnbmFsdHJlZS9iYXRjaGluZydcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBKdXN0IGNhbGwgdXBkYXRlIGRpcmVjdGx5XG4gICAgdHJlZS51cGRhdGUodXBkYXRlcik7XG4gIH07XG5cbiAgdHJlZS5tZW1vaXplID0gPFI+KGZuOiAodHJlZTogVCkgPT4gUiwgY2FjaGVLZXk/OiBzdHJpbmcpOiBTaWduYWw8Uj4gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gbWVtb2l6ZSgpIGNhbGxlZCBidXQgbWVtb2l6YXRpb24gaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgbWVtb2l6ZWQgY29tcHV0YXRpb25zLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgLy8gRmFsbGJhY2s6IFVzZSBzaW1wbGUgQW5ndWxhciBjb21wdXRlZCB3aXRob3V0IG1lbW9pemF0aW9uXG4gICAgdm9pZCBjYWNoZUtleTsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBmbih0cmVlLnVud3JhcCgpKSk7XG4gIH07XG5cbiAgdHJlZS5lZmZlY3QgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGVmZmVjdCgoKSA9PiBmbih0cmVlLnVud3JhcCgpKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50cyB3aXRob3V0IGluamVjdGlvbiBjb250ZXh0XG4gICAgICBjb25zb2xlLndhcm4oJ0VmZmVjdCByZXF1aXJlcyBBbmd1bGFyIGluamVjdGlvbiBjb250ZXh0JywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICB0cmVlLnN1YnNjcmliZSA9IChmbjogKHRyZWU6IFQpID0+IHZvaWQpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgICAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGVmZmVjdFJlZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICBmbih0cmVlLnVud3JhcCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIGVmZmVjdFJlZi5kZXN0cm95KCk7XG4gICAgICB9O1xuXG4gICAgICBkZXN0cm95UmVmLm9uRGVzdHJveSh1bnN1YnNjcmliZSk7XG4gICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50IC0gY2FsbCBvbmNlIGltbWVkaWF0ZWx5XG4gICAgICBjb25zb2xlLndhcm4oJ1N1YnNjcmliZSByZXF1aXJlcyBBbmd1bGFyIGluamVjdGlvbiBjb250ZXh0JywgZXJyb3IpO1xuICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBOby1vcCB1bnN1YnNjcmliZVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIHBlcmZvcm1hbmNlIGZlYXR1cmVzXG4gIHRyZWUub3B0aW1pemUgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBvcHRpbWl6ZSgpIGNhbGxlZCBidXQgdHJlZSBvcHRpbWl6YXRpb24gaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBvcHRpbWl6YXRpb24sIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBjbGVhckNhY2hlKCkgY2FsbGVkIGJ1dCBjYWNoaW5nIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgY2FjaGluZywgaW5zdGFsbCBAc2lnbmFsdHJlZS9tZW1vaXphdGlvbidcbiAgICApO1xuICB9O1xuXG4gIHRyZWUuaW52YWxpZGF0ZVBhdHRlcm4gPSAoKTogbnVtYmVyID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGludmFsaWRhdGVQYXR0ZXJuKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgcGF0dGVybiBpbnZhbGlkYXRpb24sIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICB0cmVlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgLy8gQmFzaWMgY2xlYW51cCBmb3Igbm9uLWVuaGFuY2VkIHRyZWVzXG4gICAgY29uc29sZS5sb2coJ1tNRU1PUlktQ0xFQU5VUF0gQmFzaWMgdHJlZSBkZXN0cm95ZWQnKTtcbiAgfTtcblxuICB0cmVlLmdldE1ldHJpY3MgPSAoKTogUGVyZm9ybWFuY2VNZXRyaWNzID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGdldE1ldHJpY3MoKSBjYWxsZWQgYnV0IHBlcmZvcm1hbmNlIHRyYWNraW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBlcmZvcm1hbmNlIHRyYWNraW5nLCBpbnN0YWxsIEBzaWduYWx0cmVlL21pZGRsZXdhcmUnXG4gICAgKTtcbiAgICAvLyBSZXR1cm4gbWluaW1hbCBtZXRyaWNzIHdoZW4gdHJhY2tpbmcgbm90IGVuYWJsZWRcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlczogMCxcbiAgICAgIGNvbXB1dGF0aW9uczogMCxcbiAgICAgIGNhY2hlSGl0czogMCxcbiAgICAgIGNhY2hlTWlzc2VzOiAwLFxuICAgICAgYXZlcmFnZVVwZGF0ZVRpbWU6IDAsXG4gICAgfTtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgbWlkZGxld2FyZVxuICB0cmVlLmFkZFRhcCA9IChtaWRkbGV3YXJlOiBNaWRkbGV3YXJlPFQ+KSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBhZGRUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1pZGRsZXdhcmUsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWlkZGxld2FyZSdcbiAgICApO1xuICAgIHZvaWQgbWlkZGxld2FyZTsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICB9O1xuXG4gIHRyZWUucmVtb3ZlVGFwID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlbW92ZVRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgbWlkZGxld2FyZSwgaW5zdGFsbCBAc2lnbmFsdHJlZS9taWRkbGV3YXJlJ1xuICAgICk7XG4gICAgdm9pZCBpZDsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBlbnRpdHkgaGVscGVyc1xuICB0cmVlLmFzQ3J1ZCA9IDxFIGV4dGVuZHMgeyBpZDogc3RyaW5nIHwgbnVtYmVyIH0+KCk6IEVudGl0eUhlbHBlcnM8RT4gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYXNDcnVkKCkgY2FsbGVkIGJ1dCBlbnRpdHkgaGVscGVycyBhcmUgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBlbnRpdHkgaGVscGVycywgaW5zdGFsbCBAc2lnbmFsdHJlZS9lbnRpdGllcydcbiAgICApO1xuICAgIHJldHVybiB7fSBhcyBFbnRpdHlIZWxwZXJzPEU+O1xuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhc3luYyBhY3Rpb25zXG4gIHRyZWUuYXN5bmNBY3Rpb24gPSA8VElucHV0LCBUUmVzdWx0PihcbiAgICBvcGVyYXRpb246IChpbnB1dDogVElucHV0KSA9PiBQcm9taXNlPFRSZXN1bHQ+LFxuICAgIGNvbmZpZzogQXN5bmNBY3Rpb25Db25maWc8VCwgVFJlc3VsdD4gPSB7fVxuICApOiBBc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGFzeW5jQWN0aW9uKCkgY2FsbGVkIGJ1dCBhc3luYyBhY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGFzeW5jIGFjdGlvbnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYXN5bmMnXG4gICAgKTtcbiAgICB2b2lkIG9wZXJhdGlvbjtcbiAgICB2b2lkIGNvbmZpZztcbiAgICByZXR1cm4ge30gYXMgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PjtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgdGltZSB0cmF2ZWxcbiAgdHJlZS51bmRvID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gdW5kbygpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICB9O1xuXG4gIHRyZWUucmVkbyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmdldEhpc3RvcnkgPSAoKTogVGltZVRyYXZlbEVudHJ5PFQ+W10gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gZ2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICB0cmVlLnJlc2V0SGlzdG9yeSA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlc2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB0cmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBzbWFydCBwcm9ncmVzc2l2ZSBlbmhhbmNlbWVudC5cbiAqXG4gKiBGZWF0dXJlcyBhdXRvLWVuYWJsZSBvbiBmaXJzdCB1c2UuIFVzZXMgaW50ZWxsaWdlbnQgZGVmYXVsdHMgYmFzZWQgb25cbiAqIGVudmlyb25tZW50IChkZXZlbG9wbWVudCB2cyBwcm9kdWN0aW9uKS4gTm8gY29uZnVzaW5nIHdhcm5pbmdzIG9yXG4gKiBmYWtlIGltcGxlbWVudGF0aW9ucyAtIGV2ZXJ5dGhpbmcganVzdCB3b3JrcyFcbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZSwgbXVzdCBleHRlbmQgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIHdpdGggYXV0by1lbmFibGluZyBmZWF0dXJlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0cmVlID0gc2lnbmFsVHJlZSh7IGNvdW50OiAwLCB1c2VyczogW10gfSk7XG4gKlxuICogLy8gQ29yZSBmdW5jdGlvbmFsaXR5IGFsd2F5cyB3b3Jrc1xuICogdHJlZS5zdGF0ZS5jb3VudC5zZXQoNSk7XG4gKiB0cmVlLnVwZGF0ZShzdGF0ZSA9PiAoeyBjb3VudDogc3RhdGUuY291bnQgKyAxIH0pKTtcbiAqXG4gKiAvLyBDb21wb3NpdGlvbiB3aXRoIHBpcGVcbiAqIHRyZWUucGlwZShcbiAqICAgd2l0aEJhdGNoaW5nKCksXG4gKiAgIHdpdGhNZW1vaXphdGlvbigpLFxuICogICB3aXRoVGltZVRyYXZlbCgpXG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQgZXh0ZW5kcyBTdGF0ZU9iamVjdD4ob2JqOiBUKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBwcmVzZXQgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBVc2VzIHByZWRlZmluZWQgY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBzY2VuYXJpb3Mgd2hpbGUgc3RpbGxcbiAqIGFsbG93aW5nIGZlYXR1cmVzIHRvIGF1dG8tZW5hYmxlIGFzIG5lZWRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZSwgbXVzdCBleHRlbmQgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIHByZXNldCAtIFByZXNldCBjb25maWd1cmF0aW9uICgnYmFzaWMnLCAncGVyZm9ybWFuY2UnLCAnZGV2ZWxvcG1lbnQnLCAncHJvZHVjdGlvbicpXG4gKiBAcmV0dXJucyBBIFNpZ25hbFRyZWUgY29uZmlndXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIE9wdGltaXplZCBmb3IgcHJvZHVjdGlvblxuICogY29uc3QgcHJvZFRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCAncHJvZHVjdGlvbicpO1xuICpcbiAqIC8vIEZ1bGwgZGVidWdnaW5nIGNhcGFiaWxpdGllc1xuICogY29uc3QgZGV2VHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsICdkZXZlbG9wbWVudCcpO1xuICpcbiAqIC8vIE1heGltdW0gcGVyZm9ybWFuY2VcbiAqIGNvbnN0IHBlcmZUcmVlID0gc2lnbmFsVHJlZShzdGF0ZSwgJ3BlcmZvcm1hbmNlJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBwcmVzZXQ6IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogUHJvdmlkZXMgZnVsbCBjb250cm9sIG92ZXIgZmVhdHVyZSBlbmFibGVtZW50IHdoaWxlIG1haW50YWluaW5nXG4gKiBhdXRvLWVuYWJsaW5nIGJlaGF2aW9yIGZvciB1bnNwZWNpZmllZCBmZWF0dXJlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZSwgbXVzdCBleHRlbmQgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIGNvbmZpZyAtIEN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCBjdXN0b20gb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDdXN0b20gY29uZmlndXJhdGlvblxuICogY29uc3QgY3VzdG9tVHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsIHtcbiAqICAgYmF0Y2hVcGRhdGVzOiB0cnVlLFxuICogICB1c2VNZW1vaXphdGlvbjogdHJ1ZSxcbiAqICAgbWF4Q2FjaGVTaXplOiA1MDAsXG4gKiAgIHRyZWVOYW1lOiAnTXlBcHAnXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZ1xuKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2lnbmFsVHJlZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZ09yUHJlc2V0PzogVHJlZUNvbmZpZyB8IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD4ge1xuICAvLyBIYW5kbGUgcHJlc2V0IHN0cmluZ3NcbiAgaWYgKHR5cGVvZiBjb25maWdPclByZXNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIFByZXNldCBjb25maWd1cmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiBAc2lnbmFsdHJlZS9jb3JlLicsXG4gICAgICAnXFxuVG8gdXNlIHByZXNldHMsIGluc3RhbGwgQHNpZ25hbHRyZWUvcHJlc2V0cydcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrIHRvIGJhc2ljIGNvbmZpZ3VyYXRpb25cbiAgICByZXR1cm4gY3JlYXRlKG9iaiwge30pO1xuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBvciBkZWZhdWx0IChzbWFydCBlbmhhbmNlbWVudClcbiAgY29uc3QgY29uZmlnID0gY29uZmlnT3JQcmVzZXQgfHwge307XG4gIHJldHVybiBjcmVhdGUob2JqLCBjb25maWcpO1xufVxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFsdHJlZS1jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js","../tmp-esm2022/signaltree-core.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\n// Path parsing cache for performance optimization\nconst pathCache = new Map();\n/**\n * Enhanced equality function inspired by the monolithic implementation.\n * Uses deep equality for arrays and objects, === for primitives.\n * More efficient than lodash while maintaining compatibility.\n */\nexport function equal(a, b) {\n // Fast path for reference equality\n if (a === b)\n return true;\n // Handle null/undefined cases\n if (a == null || b == null)\n return a === b;\n // Handle arrays with deep comparison\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n // Handle objects with deep comparison\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => keysB.includes(key) &&\n equal(a[key], b[key]));\n }\n // Fallback to strict equality\n return a === b;\n}\n/**\n * Creates a terminal signal with the enhanced equality function.\n * This should be used instead of Angular's signal() when you want\n * the same deep equality behavior as signalTree.\n *\n * Inspired by the monolithic implementation's terminal signal creation.\n */\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\n/**\n * Parses a dot-notation path into an array of keys with memoization.\n * Critical for performance when accessing nested properties frequently.\n *\n * @example\n * ```typescript\n * const keys1 = parsePath('user.name'); // Splits and caches\n * const keys2 = parsePath('user.name'); // Returns cached result\n * ```\n */\nexport function parsePath(path) {\n if (!pathCache.has(path)) {\n pathCache.set(path, path.split('.'));\n }\n const cached = pathCache.get(path);\n return cached ?? path.split('.');\n}\n/**\n * Creates a lazy signal tree using Proxy for on-demand signal creation.\n * Only creates signals when properties are first accessed, providing\n * massive memory savings for large state objects.\n *\n * @param obj - Source object to lazily signalify\n * @param equalityFn - Equality function for signal comparison\n * @param basePath - Base path for nested objects (internal use)\n * @returns Proxied object that creates signals on first access\n */\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n return new Proxy(obj, {\n get(target, prop) {\n // Handle symbol properties (like Symbol.iterator) normally\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n const value = target[key];\n // If it's already a signal, return it\n if (isSignal(value)) {\n return value;\n }\n // Check if we already have a signal for this path\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n // Check if we have a nested proxy cached\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n // Handle nested objects - create lazy proxy\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value)) {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n return nestedProxy;\n }\n // Create signal for primitive values and arrays\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n // Update the original object\n target[key] = value;\n // If we have a cached signal, update it\n const cachedSignal = signalCache.get(path);\n if (cachedSignal) {\n cachedSignal.set(value);\n }\n // Clear nested proxy cache if the value type changed\n if (nestedProxies.has(path)) {\n nestedProxies.delete(path);\n }\n return true;\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n}\n/**\n * Native deep equality check for arrays and objects.\n * Handles all common cases that lodash.isEqual handles for our use cases.\n */\nexport function deepEqual(a, b) {\n // Same reference or primitives\n if (a === b)\n return true;\n // Handle null/undefined\n if (a == null || b == null)\n return false;\n // Different types\n if (typeof a !== typeof b)\n return false;\n // Handle dates\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n // Handle objects (but not arrays, dates, or other special objects)\n if (typeof a === 'object' &&\n typeof b === 'object' &&\n !Array.isArray(a) &&\n !Array.isArray(b) &&\n !(a instanceof Date) &&\n !(b instanceof Date)) {\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (!(key in objB))\n return false;\n if (!deepEqual(objA[key], objB[key]))\n return false;\n }\n return true;\n }\n // For all other cases (primitives that aren't equal)\n return false;\n}\n/**\n * Shallow equality check for objects and arrays.\n */\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pFLGtEQUFrRDtBQUNsRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNqQyxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDhCQUE4QjtJQUM5QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFD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QUFDLEdBQUcsQ0FBQztnQkFFbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbmNvbnN0IHBhdGhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblxuLyoqXG4gKiBFbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbiBpbnNwaXJlZCBieSB0aGUgbW9ub2xpdGhpYyBpbXBsZW1lbnRhdGlvbi5cbiAqIFVzZXMgZGVlcCBlcXVhbGl0eSBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLCA9PT0gZm9yIHByaW1pdGl2ZXMuXG4gKiBNb3JlIGVmZmljaWVudCB0aGFuIGxvZGFzaCB3aGlsZSBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggZGVlcCBjb21wYXJpc29uXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBkZWVwIGNvbXBhcmlzb25cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBrZXlzQS5ldmVyeShcbiAgICAgIChrZXkpID0+XG4gICAgICAgIGtleXNCLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgZXF1YWwoXG4gICAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBzdHJpY3QgZXF1YWxpdHlcbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlcm1pbmFsIHNpZ25hbCB3aXRoIHRoZSBlbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbi5cbiAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBBbmd1bGFyJ3Mgc2lnbmFsKCkgd2hlbiB5b3Ugd2FudFxuICogdGhlIHNhbWUgZGVlcCBlcXVhbGl0eSBiZWhhdmlvciBhcyBzaWduYWxUcmVlLlxuICpcbiAqIEluc3BpcmVkIGJ5IHRoZSBtb25vbGl0aGljIGltcGxlbWVudGF0aW9uJ3MgdGVybWluYWwgc2lnbmFsIGNyZWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVybWluYWxTaWduYWw8VD4oXG4gIHZhbHVlOiBULFxuICBjdXN0b21FcXVhbD86IChhOiBULCBiOiBUKSA9PiBib29sZWFuXG4pOiBXcml0YWJsZVNpZ25hbDxUPiB7XG4gIHJldHVybiBzaWduYWwodmFsdWUsIHtcbiAgICBlcXVhbDogY3VzdG9tRXF1YWwgfHwgZXF1YWwsXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGRvdC1ub3RhdGlvbiBwYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyB3aXRoIG1lbW9pemF0aW9uLlxuICogQ3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHdoZW4gYWNjZXNzaW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGZyZXF1ZW50bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGtleXMxID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gU3BsaXRzIGFuZCBjYWNoZXNcbiAqIGNvbnN0IGtleXMyID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gUmV0dXJucyBjYWNoZWQgcmVzdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghcGF0aENhY2hlLmhhcyhwYXRoKSkge1xuICAgIHBhdGhDYWNoZS5zZXQocGF0aCwgcGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICByZXR1cm4gY2FjaGVkID8/IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSBzaWduYWwgdHJlZSB1c2luZyBQcm94eSBmb3Igb24tZGVtYW5kIHNpZ25hbCBjcmVhdGlvbi5cbiAqIE9ubHkgY3JlYXRlcyBzaWduYWxzIHdoZW4gcHJvcGVydGllcyBhcmUgZmlyc3QgYWNjZXNzZWQsIHByb3ZpZGluZ1xuICogbWFzc2l2ZSBtZW1vcnkgc2F2aW5ncyBmb3IgbGFyZ2Ugc3RhdGUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFQsXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuLFxuICBiYXNlUGF0aCA9ICcnXG4pOiBEZWVwU2lnbmFsaWZ5PFQ+IHtcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIC8vIEhhbmRsZSBzeW1ib2wgcHJvcGVydGllcyAobGlrZSBTeW1ib2wuaXRlcmF0b3IpIG5vcm1hbGx5XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWRQcm94eSA9IGNyZWF0ZUxhenlTaWduYWxUcmVlKFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgcGF0aFxuICAgICAgICApO1xuICAgICAgICBuZXN0ZWRQcm94aWVzLnNldChwYXRoLCBuZXN0ZWRQcm94eSk7XG4gICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hbCBmb3IgcHJpbWl0aXZlIHZhbHVlcyBhbmQgYXJyYXlzXG4gICAgICBjb25zdCBuZXdTaWduYWwgPSBzaWduYWwodmFsdWUsIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSk7XG4gICAgICBzaWduYWxDYWNoZS5zZXQocGF0aCwgbmV3U2lnbmFsKTtcbiAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgfSxcblxuICAgIHNldChcbiAgICAgIHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICB2YWx1ZTogdW5rbm93blxuICAgICkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgIGNvbnN0IGNhY2hlZFNpZ25hbCA9IHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIGlmIChjYWNoZWRTaWduYWwpIHtcbiAgICAgICAgY2FjaGVkU2lnbmFsLnNldCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIG5lc3RlZCBwcm94eSBjYWNoZSBpZiB0aGUgdmFsdWUgdHlwZSBjaGFuZ2VkXG4gICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgbmVzdGVkUHJveGllcy5kZWxldGUocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG59XG5cbi8qKlxuICogTmF0aXZlIGRlZXAgZXF1YWxpdHkgY2hlY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbiAqIEhhbmRsZXMgYWxsIGNvbW1vbiBjYXNlcyB0aGF0IGxvZGFzaC5pc0VxdWFsIGhhbmRsZXMgZm9yIG91ciB1c2UgY2FzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBTYW1lIHJlZmVyZW5jZSBvciBwcmltaXRpdmVzXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBEaWZmZXJlbnQgdHlwZXNcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEhhbmRsZSBkYXRlc1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgb2JqZWN0cyAoYnV0IG5vdCBhcnJheXMsIGRhdGVzLCBvciBvdGhlciBzcGVjaWFsIG9iamVjdHMpXG4gIGlmIChcbiAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShhKSAmJlxuICAgICFBcnJheS5pc0FycmF5KGIpICYmXG4gICAgIShhIGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKGIgaW5zdGFuY2VvZiBEYXRlKVxuICApIHtcbiAgICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvYmpCID0gYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqQikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEZvciBhbGwgb3RoZXIgY2FzZXMgKHByaW1pdGl2ZXMgdGhhdCBhcmVuJ3QgZXF1YWwpXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93RXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldICE9PVxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\n/**\n * Creates an equality function based on configuration.\n *\n * @param useShallowComparison - If true, uses Object.is for comparison; otherwise uses deep equality\n * @returns A function that compares two values for equality\n *\n * @example\n * ```typescript\n * const shallowEqual = createEqualityFn(true);\n * const deepEqual = createEqualityFn(false);\n *\n * shallowEqual({ a: 1 }, { a: 1 }); // false (different objects)\n * deepEqual({ a: 1 }, { a: 1 }); // true (same structure and values)\n * ```\n */\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\n/**\n * Core function to create a basic SignalTree.\n * This provides the minimal functionality without advanced features.\n *\n * @template T - The state object type\n * @param obj - The initial state object\n * @param config - Configuration options for the tree\n * @returns A basic SignalTree with core functionality\n *\n * @example\n * ```typescript\n * const tree = create({\n * count: 0,\n * user: { name: 'John', age: 30 }\n * }, {\n * useLazySignals: true,\n * useShallowComparison: false\n * });\n *\n * // Access nested signals\n * console.log(tree.$.count()); // 0\n * tree.$.user.name.set('Jane');\n * ```\n */\nfunction create(obj, config = {}) {\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = config.useLazySignals ?? true; // Default to lazy loading\n // Choose between lazy and eager signal creation\n const signalState = useLazy\n ? createLazySignalTree(obj, equalityFn)\n : createEagerSignalsFromObject(obj, equalityFn);\n const resultTree = {\n state: signalState,\n $: signalState, // $ points to the same state object\n };\n enhanceTree(resultTree);\n return resultTree;\n}\n/**\n * Creates eager signals from an object (non-lazy approach).\n * All signals are created immediately during initialization.\n *\n * @template O - The object type to convert to signals\n * @param obj - The object to convert to signals\n * @param equalityFn - Function to compare values for equality\n * @returns A deeply signalified version of the object\n *\n * @example\n * ```typescript\n * const eagerSignals = createEagerSignalsFromObject({\n * user: { name: 'John', age: 30 },\n * settings: { theme: 'dark' }\n * }, Object.is);\n *\n * // All signals are created immediately\n * eagerSignals.user.name.set('Jane');\n * console.log(eagerSignals.settings.theme()); // 'dark'\n * ```\n */\nfunction createEagerSignalsFromObject(obj, equalityFn) {\n const result = {};\n for (const [key, value] of Object.entries(obj)) {\n const isObj = (v) => typeof v === 'object' && v !== null;\n if (isObj(value) && !Array.isArray(value) && !isSignal(value)) {\n // For nested objects, create nested signal structure directly\n result[key] = createEagerSignalsFromObject(value, equalityFn);\n }\n else if (isSignal(value)) {\n result[key] = value;\n }\n else {\n result[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n return result;\n}\n/**\n * Enhances a tree with basic functionality (unwrap, update, pipe).\n * Adds core methods that every SignalTree needs for basic operation.\n *\n * @template T - The state object type\n * @param tree - The tree to enhance with basic functionality\n * @returns The enhanced tree with unwrap, update, and pipe methods\n *\n * @example\n * ```typescript\n * const basicTree = { state: signalState, $: signalState };\n * enhanceTree(basicTree);\n *\n * // Now has basic methods:\n * const currentState = basicTree.unwrap();\n * basicTree.update(state => ({ ...state, count: state.count + 1 }));\n * const enhancedTree = basicTree.pipe(withSomeFeature());\n * ```\n */\nfunction enhanceTree(tree) {\n /**\n * Unwraps the current state by reading all signal values.\n * Recursively converts the signal tree back to plain JavaScript values.\n *\n * @returns The current state as a plain object\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0\n * });\n *\n * tree.$.user.name.set('Jane');\n * tree.$.count.set(5);\n *\n * const currentState = tree.unwrap();\n * // { user: { name: 'Jane', age: 30 }, count: 5 }\n * ```\n */\n tree.unwrap = () => {\n // Recursively unwrap with proper typing\n const unwrapObject = (obj) => {\n const result = {};\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n // Nested signal state\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n /**\n * Updates the state using an updater function.\n * The updater receives the current state and returns a partial update.\n * Automatically handles nested signal updates.\n *\n * @param updater - Function that receives current state and returns partial updates\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0,\n * todos: []\n * });\n *\n * // Simple update\n * tree.update(state => ({ count: state.count + 1 }));\n *\n * // Nested update\n * tree.update(state => ({\n * user: { ...state.user, age: state.user.age + 1 },\n * todos: [...state.todos, { id: 1, text: 'New todo' }]\n * }));\n *\n * // Conditional update\n * tree.update(state =>\n * state.count < 10\n * ? { count: state.count + 1 }\n * : { count: 0, user: { ...state.user, name: 'Reset' } }\n * );\n * ```\n */\n tree.update = (updater) => {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n // Recursively update with better typing\n const updateObject = (target, updates) => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentSignalOrState = target[key];\n if (isSignal(currentSignalOrState)) {\n // Direct signal update\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null) {\n // Nested object - recurse\n updateObject(currentSignalOrState, updateValue);\n }\n }\n };\n updateObject(tree.state, partialObj);\n };\n // Pipe implementation for function composition with improved type safety\n tree.pipe = ((...fns // eslint-disable-line @typescript-eslint/no-explicit-any\n ) => {\n // eslint-disable-line @typescript-eslint/no-explicit-any\n if (fns.length === 0) {\n return tree;\n }\n // Type-safe reduce - the return type is determined by the overload signature\n return fns.reduce((acc, fn) => fn(acc), tree);\n });\n // Stub implementations for advanced features (will log warnings)\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', '\\nTo enable batch updates, install @signaltree/batching');\n // Fallback: Just call update directly\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', '\\nTo enable memoized computations, install @signaltree/memoization');\n // Fallback: Use simple Angular computed without memoization\n void cacheKey; // Mark as intentionally unused\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n // Fallback for test environments without injection context\n console.warn('Effect requires Angular injection context', error);\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n // Fallback for test environment - call once immediately\n console.warn('Subscribe requires Angular injection context', error);\n fn(tree.unwrap());\n return () => {\n // No-op unsubscribe\n };\n }\n };\n // Stub implementations for performance features\n tree.optimize = () => {\n console.warn('⚠️ optimize() called but tree optimization is not available.', '\\nTo enable optimization, install @signaltree/memoization');\n };\n tree.clearCache = () => {\n console.warn('⚠️ clearCache() called but caching is not available.', '\\nTo enable caching, install @signaltree/memoization');\n };\n tree.invalidatePattern = () => {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.', '\\nTo enable pattern invalidation, install @signaltree/memoization');\n return 0;\n };\n tree.destroy = () => {\n // Basic cleanup for non-enhanced trees\n console.log('[MEMORY-CLEANUP] Basic tree destroyed');\n };\n tree.getMetrics = () => {\n console.warn('⚠️ getMetrics() called but performance tracking is not enabled.', '\\nTo enable performance tracking, install @signaltree/middleware');\n // Return minimal metrics when tracking not enabled\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n // Stub implementations for middleware\n tree.addTap = (middleware) => {\n console.warn('⚠️ addTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void middleware; // Mark as intentionally unused\n };\n tree.removeTap = (id) => {\n console.warn('⚠️ removeTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void id; // Mark as intentionally unused\n };\n // Stub implementations for entity helpers\n tree.asCrud = () => {\n console.warn('⚠️ asCrud() called but entity helpers are not available.', '\\nTo enable entity helpers, install @signaltree/entities');\n return {};\n };\n // Stub implementations for async actions\n tree.asyncAction = (operation, config = {}) => {\n console.warn('⚠️ asyncAction() called but async actions are not available.', '\\nTo enable async actions, install @signaltree/async');\n void operation;\n void config;\n return {};\n };\n // Stub implementations for time travel\n tree.undo = () => {\n console.warn('⚠️ undo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.redo = () => {\n console.warn('⚠️ redo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.getHistory = () => {\n console.warn('⚠️ getHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n return [];\n };\n tree.resetHistory = () => {\n console.warn('⚠️ resetHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n return tree;\n}\n/**\n * Implementation of the signalTree factory function.\n */\nexport function signalTree(obj, configOrPreset) {\n // Handle preset strings\n if (typeof configOrPreset === 'string') {\n console.warn('⚠️ Preset configurations are not available in @signaltree/core.', '\\nTo use presets, install @signaltree/presets');\n // Fallback to basic configuration\n return create(obj, {});\n }\n // Handle configuration objects or default (smart enhancement)\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBY3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLG9CQUE2QjtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsTUFBTSxDQUNiLEdBQU0sRUFDTixTQUFxQixFQUFFO0lBRXZCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUV6RSxnREFBZ0Q7SUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTztRQUN6QixDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN2QyxDQUFDLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLENBQUMsRUFBRSxXQUFXLEVBQUUsb0NBQW9DO0tBQ3BDLENBQUM7SUFFbkIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sVUFB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QyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxuICBTdGF0ZU9iamVjdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHVzZVNoYWxsb3dDb21wYXJpc29uIC0gSWYgdHJ1ZSwgdXNlcyBPYmplY3QuaXMgZm9yIGNvbXBhcmlzb247IG90aGVyd2lzZSB1c2VzIGRlZXAgZXF1YWxpdHlcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gdmFsdWVzIGZvciBlcXVhbGl0eVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzaGFsbG93RXF1YWwgPSBjcmVhdGVFcXVhbGl0eUZuKHRydWUpO1xuICogY29uc3QgZGVlcEVxdWFsID0gY3JlYXRlRXF1YWxpdHlGbihmYWxzZSk7XG4gKlxuICogc2hhbGxvd0VxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7IC8vIGZhbHNlIChkaWZmZXJlbnQgb2JqZWN0cylcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAvLyB0cnVlIChzYW1lIHN0cnVjdHVyZSBhbmQgdmFsdWVzKVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Rm4odXNlU2hhbGxvd0NvbXBhcmlzb246IGJvb2xlYW4pIHtcbiAgcmV0dXJuIHVzZVNoYWxsb3dDb21wYXJpc29uID8gT2JqZWN0LmlzIDogZXF1YWw7XG59XG5cbi8qKlxuICogQ29yZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyBTaWduYWxUcmVlLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGVcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB0cmVlXG4gKiBAcmV0dXJucyBBIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IGNyZWF0ZSh7XG4gKiAgIGNvdW50OiAwLFxuICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9XG4gKiB9LCB7XG4gKiAgIHVzZUxhenlTaWduYWxzOiB0cnVlLFxuICogICB1c2VTaGFsbG93Q29tcGFyaXNvbjogZmFsc2VcbiAqIH0pO1xuICpcbiAqIC8vIEFjY2VzcyBuZXN0ZWQgc2lnbmFsc1xuICogY29uc29sZS5sb2codHJlZS4kLmNvdW50KCkpOyAvLyAwXG4gKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgY29uc3QgZXF1YWxpdHlGbiA9IGNyZWF0ZUVxdWFsaXR5Rm4oY29uZmlnLnVzZVNoYWxsb3dDb21wYXJpc29uID8/IGZhbHNlKTtcbiAgY29uc3QgdXNlTGF6eSA9IGNvbmZpZy51c2VMYXp5U2lnbmFscyA/PyB0cnVlOyAvLyBEZWZhdWx0IHRvIGxhenkgbG9hZGluZ1xuXG4gIC8vIENob29zZSBiZXR3ZWVuIGxhenkgYW5kIGVhZ2VyIHNpZ25hbCBjcmVhdGlvblxuICBjb25zdCBzaWduYWxTdGF0ZSA9IHVzZUxhenlcbiAgICA/IGNyZWF0ZUxhenlTaWduYWxUcmVlKG9iaiwgZXF1YWxpdHlGbilcbiAgICA6IGNyZWF0ZUVhZ2VyU2lnbmFsc0Zyb21PYmplY3Qob2JqLCBlcXVhbGl0eUZuKTtcblxuICBjb25zdCByZXN1bHRUcmVlID0ge1xuICAgIHN0YXRlOiBzaWduYWxTdGF0ZSxcbiAgICAkOiBzaWduYWxTdGF0ZSwgLy8gJCBwb2ludHMgdG8gdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gIH0gYXMgU2lnbmFsVHJlZTxUPjtcblxuICBlbmhhbmNlVHJlZShyZXN1bHRUcmVlKTtcbiAgcmV0dXJuIHJlc3VsdFRyZWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBlYWdlciBzaWduYWxzIGZyb20gYW4gb2JqZWN0IChub24tbGF6eSBhcHByb2FjaCkuXG4gKiBBbGwgc2lnbmFscyBhcmUgY3JlYXRlZCBpbW1lZGlhdGVseSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gKlxuICogQHRlbXBsYXRlIE8gLSBUaGUgb2JqZWN0IHR5cGUgdG8gY29udmVydCB0byBzaWduYWxzXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIHNpZ25hbHNcbiAqIEBwYXJhbSBlcXVhbGl0eUZuIC0gRnVuY3Rpb24gdG8gY29tcGFyZSB2YWx1ZXMgZm9yIGVxdWFsaXR5XG4gKiBAcmV0dXJucyBBIGRlZXBseSBzaWduYWxpZmllZCB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZWFnZXJTaWduYWxzID0gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdCh7XG4gKiAgIHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfVxuICogfSwgT2JqZWN0LmlzKTtcbiAqXG4gKiAvLyBBbGwgc2lnbmFscyBhcmUgY3JlYXRlZCBpbW1lZGlhdGVseVxuICogZWFnZXJTaWduYWxzLnVzZXIubmFtZS5zZXQoJ0phbmUnKTtcbiAqIGNvbnNvbGUubG9nKGVhZ2VyU2lnbmFscy5zZXR0aW5ncy50aGVtZSgpKTsgLy8gJ2RhcmsnXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdDxPIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IE8sXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBEZWVwU2lnbmFsaWZ5PE8+IHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgRGVlcFNpZ25hbGlmeTxPPjtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3QgaXNPYmogPSAodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuXG4gICAgaWYgKGlzT2JqKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgLy8gRm9yIG5lc3RlZCBvYmplY3RzLCBjcmVhdGUgbmVzdGVkIHNpZ25hbCBzdHJ1Y3R1cmUgZGlyZWN0bHlcbiAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBjcmVhdGVFYWdlclNpZ25hbHNGcm9tT2JqZWN0KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIHRyZWUgd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5ICh1bndyYXAsIHVwZGF0ZSwgcGlwZSkuXG4gKiBBZGRzIGNvcmUgbWV0aG9kcyB0aGF0IGV2ZXJ5IFNpZ25hbFRyZWUgbmVlZHMgZm9yIGJhc2ljIG9wZXJhdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZVxuICogQHBhcmFtIHRyZWUgLSBUaGUgdHJlZSB0byBlbmhhbmNlIHdpdGggYmFzaWMgZnVuY3Rpb25hbGl0eVxuICogQHJldHVybnMgVGhlIGVuaGFuY2VkIHRyZWUgd2l0aCB1bndyYXAsIHVwZGF0ZSwgYW5kIHBpcGUgbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBiYXNpY1RyZWUgPSB7IHN0YXRlOiBzaWduYWxTdGF0ZSwgJDogc2lnbmFsU3RhdGUgfTtcbiAqIGVuaGFuY2VUcmVlKGJhc2ljVHJlZSk7XG4gKlxuICogLy8gTm93IGhhcyBiYXNpYyBtZXRob2RzOlxuICogY29uc3QgY3VycmVudFN0YXRlID0gYmFzaWNUcmVlLnVud3JhcCgpO1xuICogYmFzaWNUcmVlLnVwZGF0ZShzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKiBjb25zdCBlbmhhbmNlZFRyZWUgPSBiYXNpY1RyZWUucGlwZSh3aXRoU29tZUZlYXR1cmUoKSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgdHJlZTogU2lnbmFsVHJlZTxUPlxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIC8qKlxuICAgKiBVbndyYXBzIHRoZSBjdXJyZW50IHN0YXRlIGJ5IHJlYWRpbmcgYWxsIHNpZ25hbCB2YWx1ZXMuXG4gICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIHRoZSBzaWduYWwgdHJlZSBiYWNrIHRvIHBsYWluIEphdmFTY3JpcHQgdmFsdWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzdGF0ZSBhcyBhIHBsYWluIG9iamVjdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRyZWUgPSBzaWduYWxUcmVlKHtcbiAgICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9LFxuICAgKiAgIGNvdW50OiAwXG4gICAqIH0pO1xuICAgKlxuICAgKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICAgKiB0cmVlLiQuY291bnQuc2V0KDUpO1xuICAgKlxuICAgKiBjb25zdCBjdXJyZW50U3RhdGUgPSB0cmVlLnVud3JhcCgpO1xuICAgKiAvLyB7IHVzZXI6IHsgbmFtZTogJ0phbmUnLCBhZ2U6IDMwIH0sIGNvdW50OiA1IH1cbiAgICogYGBgXG4gICAqL1xuICB0cmVlLnVud3JhcCA9ICgpOiBUID0+IHtcbiAgICAvLyBSZWN1cnNpdmVseSB1bndyYXAgd2l0aCBwcm9wZXIgdHlwaW5nXG4gICAgY29uc3QgdW53cmFwT2JqZWN0ID0gPE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICBvYmo6IERlZXBTaWduYWxpZnk8Tz5cbiAgICApOiBPID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBOZXN0ZWQgc2lnbmFsIHN0YXRlXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB1bndyYXBPYmplY3QoXG4gICAgICAgICAgICB2YWx1ZSBhcyBEZWVwU2lnbmFsaWZ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIE87XG4gICAgfTtcblxuICAgIHJldHVybiB1bndyYXBPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3RhdGUgdXNpbmcgYW4gdXBkYXRlciBmdW5jdGlvbi5cbiAgICogVGhlIHVwZGF0ZXIgcmVjZWl2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHJldHVybnMgYSBwYXJ0aWFsIHVwZGF0ZS5cbiAgICogQXV0b21hdGljYWxseSBoYW5kbGVzIG5lc3RlZCBzaWduYWwgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXIgLSBGdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGN1cnJlbnQgc3RhdGUgYW5kIHJldHVybnMgcGFydGlhbCB1cGRhdGVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdHJlZSA9IHNpZ25hbFRyZWUoe1xuICAgKiAgIHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sXG4gICAqICAgY291bnQ6IDAsXG4gICAqICAgdG9kb3M6IFtdXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBTaW1wbGUgdXBkYXRlXG4gICAqIHRyZWUudXBkYXRlKHN0YXRlID0+ICh7IGNvdW50OiBzdGF0ZS5jb3VudCArIDEgfSkpO1xuICAgKlxuICAgKiAvLyBOZXN0ZWQgdXBkYXRlXG4gICAqIHRyZWUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAqICAgdXNlcjogeyAuLi5zdGF0ZS51c2VyLCBhZ2U6IHN0YXRlLnVzZXIuYWdlICsgMSB9LFxuICAgKiAgIHRvZG9zOiBbLi4uc3RhdGUudG9kb3MsIHsgaWQ6IDEsIHRleHQ6ICdOZXcgdG9kbycgfV1cbiAgICogfSkpO1xuICAgKlxuICAgKiAvLyBDb25kaXRpb25hbCB1cGRhdGVcbiAgICogdHJlZS51cGRhdGUoc3RhdGUgPT5cbiAgICogICBzdGF0ZS5jb3VudCA8IDEwXG4gICAqICAgICA/IHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9XG4gICAqICAgICA6IHsgY291bnQ6IDAsIHVzZXI6IHsgLi4uc3RhdGUudXNlciwgbmFtZTogJ1Jlc2V0JyB9IH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB0cmVlLnVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRyZWUudW53cmFwKCk7XG4gICAgY29uc3QgcGFydGlhbE9iaiA9IHVwZGF0ZXIoY3VycmVudFZhbHVlKTtcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHVwZGF0ZSB3aXRoIGJldHRlciB0eXBpbmdcbiAgICBjb25zdCB1cGRhdGVPYmplY3QgPSA8TyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIHRhcmdldDogRGVlcFNpZ25hbGlmeTxPPixcbiAgICAgIHVwZGF0ZXM6IFBhcnRpYWw8Tz5cbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlcywga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSB1cGRhdGVzW2tleV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaWduYWxPclN0YXRlID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpKSB7XG4gICAgICAgICAgLy8gRGlyZWN0IHNpZ25hbCB1cGRhdGVcbiAgICAgICAgICAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh1cGRhdGVWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHVwZGF0ZVZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHVwZGF0ZVZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodXBkYXRlVmFsdWUpICYmXG4gICAgICAgICAgdHlwZW9mIGN1cnJlbnRTaWduYWxPclN0YXRlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIGN1cnJlbnRTaWduYWxPclN0YXRlICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgLSByZWN1cnNlXG4gICAgICAgICAgdXBkYXRlT2JqZWN0KFxuICAgICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgRGVlcFNpZ25hbGlmeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgICAgICAgICB1cGRhdGVWYWx1ZSBhcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdXBkYXRlT2JqZWN0KHRyZWUuc3RhdGUgYXMgRGVlcFNpZ25hbGlmeTxUPiwgcGFydGlhbE9iaik7XG4gIH07XG5cbiAgLy8gUGlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgZnVuY3Rpb24gY29tcG9zaXRpb24gd2l0aCBpbXByb3ZlZCB0eXBlIHNhZmV0eVxuICB0cmVlLnBpcGUgPSAoKFxuICAgIC4uLmZuczogQXJyYXk8KGlucHV0OiBhbnkpID0+IGFueT4gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IGFueSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIC8vIFR5cGUtc2FmZSByZWR1Y2UgLSB0aGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3ZlcmxvYWQgc2lnbmF0dXJlXG4gICAgcmV0dXJuIGZucy5yZWR1Y2UoKGFjYywgZm4pID0+IGZuKGFjYyksIHRyZWUpO1xuICB9KSBhcyBTaWduYWxUcmVlPFQ+WydwaXBlJ107XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzICh3aWxsIGxvZyB3YXJuaW5ncylcbiAgdHJlZS5iYXRjaFVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYmF0Y2hVcGRhdGUoKSBjYWxsZWQgYnV0IGJhdGNoaW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGJhdGNoIHVwZGF0ZXMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYmF0Y2hpbmcnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjazogSnVzdCBjYWxsIHVwZGF0ZSBkaXJlY3RseVxuICAgIHRyZWUudXBkYXRlKHVwZGF0ZXIpO1xuICB9O1xuXG4gIHRyZWUubWVtb2l6ZSA9IDxSPihmbjogKHRyZWU6IFQpID0+IFIsIGNhY2hlS2V5Pzogc3RyaW5nKTogU2lnbmFsPFI+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIG1lbW9pemUoKSBjYWxsZWQgYnV0IG1lbW9pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1lbW9pemVkIGNvbXB1dGF0aW9ucywgaW5zdGFsbCBAc2lnbmFsdHJlZS9tZW1vaXphdGlvbidcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBVc2Ugc2ltcGxlIEFuZ3VsYXIgY29tcHV0ZWQgd2l0aG91dCBtZW1vaXphdGlvblxuICAgIHZvaWQgY2FjaGVLZXk7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICB9O1xuXG4gIHRyZWUuZWZmZWN0ID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3QoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudHMgd2l0aG91dCBpbmplY3Rpb24gY29udGV4dFxuICAgICAgY29uc29sZS53YXJuKCdFZmZlY3QgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5zdWJzY3JpYmUgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICBlZmZlY3RSZWYuZGVzdHJveSgpO1xuICAgICAgfTtcblxuICAgICAgZGVzdHJveVJlZi5vbkRlc3Ryb3kodW5zdWJzY3JpYmUpO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudCAtIGNhbGwgb25jZSBpbW1lZGlhdGVseVxuICAgICAgY29uc29sZS53YXJuKCdTdWJzY3JpYmUgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICAgIGZuKHRyZWUudW53cmFwKCkpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gTm8tb3AgdW5zdWJzY3JpYmVcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBwZXJmb3JtYW5jZSBmZWF0dXJlc1xuICB0cmVlLm9wdGltaXplID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gb3B0aW1pemUoKSBjYWxsZWQgYnV0IHRyZWUgb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgb3B0aW1pemF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gY2xlYXJDYWNoZSgpIGNhbGxlZCBidXQgY2FjaGluZyBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGNhY2hpbmcsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmludmFsaWRhdGVQYXR0ZXJuID0gKCk6IG51bWJlciA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBpbnZhbGlkYXRlUGF0dGVybigpIGNhbGxlZCBidXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBhdHRlcm4gaW52YWxpZGF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgIC8vIEJhc2ljIGNsZWFudXAgZm9yIG5vbi1lbmhhbmNlZCB0cmVlc1xuICAgIGNvbnNvbGUubG9nKCdbTUVNT1JZLUNMRUFOVVBdIEJhc2ljIHRyZWUgZGVzdHJveWVkJyk7XG4gIH07XG5cbiAgdHJlZS5nZXRNZXRyaWNzID0gKCk6IFBlcmZvcm1hbmNlTWV0cmljcyA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBnZXRNZXRyaWNzKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSB0cmFja2luZyBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBwZXJmb3JtYW5jZSB0cmFja2luZywgaW5zdGFsbCBAc2lnbmFsdHJlZS9taWRkbGV3YXJlJ1xuICAgICk7XG4gICAgLy8gUmV0dXJuIG1pbmltYWwgbWV0cmljcyB3aGVuIHRyYWNraW5nIG5vdCBlbmFibGVkXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICBjb21wdXRhdGlvbnM6IDAsXG4gICAgICBjYWNoZUhpdHM6IDAsXG4gICAgICBjYWNoZU1pc3NlczogMCxcbiAgICAgIGF2ZXJhZ2VVcGRhdGVUaW1lOiAwLFxuICAgIH07XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIG1pZGRsZXdhcmVcbiAgdHJlZS5hZGRUYXAgPSAobWlkZGxld2FyZTogTWlkZGxld2FyZTxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYWRkVGFwKCkgY2FsbGVkIGJ1dCBtaWRkbGV3YXJlIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBtaWRkbGV3YXJlLCBpbnN0YWxsIEBzaWduYWx0cmVlL21pZGRsZXdhcmUnXG4gICAgKTtcbiAgICB2b2lkIG1pZGRsZXdhcmU7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgfTtcblxuICB0cmVlLnJlbW92ZVRhcCA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZW1vdmVUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1pZGRsZXdhcmUsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWlkZGxld2FyZSdcbiAgICApO1xuICAgIHZvaWQgaWQ7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgZW50aXR5IGhlbHBlcnNcbiAgdHJlZS5hc0NydWQgPSA8RSBleHRlbmRzIHsgaWQ6IHN0cmluZyB8IG51bWJlciB9PigpOiBFbnRpdHlIZWxwZXJzPEU+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGFzQ3J1ZCgpIGNhbGxlZCBidXQgZW50aXR5IGhlbHBlcnMgYXJlIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgZW50aXR5IGhlbHBlcnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvZW50aXRpZXMnXG4gICAgKTtcbiAgICByZXR1cm4ge30gYXMgRW50aXR5SGVscGVyczxFPjtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYXN5bmMgYWN0aW9uc1xuICB0cmVlLmFzeW5jQWN0aW9uID0gPFRJbnB1dCwgVFJlc3VsdD4oXG4gICAgb3BlcmF0aW9uOiAoaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTxUUmVzdWx0PixcbiAgICBjb25maWc6IEFzeW5jQWN0aW9uQ29uZmlnPFQsIFRSZXN1bHQ+ID0ge31cbiAgKTogQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PiA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBhc3luY0FjdGlvbigpIGNhbGxlZCBidXQgYXN5bmMgYWN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBhc3luYyBhY3Rpb25zLCBpbnN0YWxsIEBzaWduYWx0cmVlL2FzeW5jJ1xuICAgICk7XG4gICAgdm9pZCBvcGVyYXRpb247XG4gICAgdm9pZCBjb25maWc7XG4gICAgcmV0dXJuIHt9IGFzIEFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD47XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIHRpbWUgdHJhdmVsXG4gIHRyZWUudW5kbyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHVuZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLnJlZG8gPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZWRvKCkgY2FsbGVkIGJ1dCB0aW1lIHRyYXZlbCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHRpbWUgdHJhdmVsLCBpbnN0YWxsIEBzaWduYWx0cmVlL3RpbWUtdHJhdmVsJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5nZXRIaXN0b3J5ID0gKCk6IFRpbWVUcmF2ZWxFbnRyeTxUPltdID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGdldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH07XG5cbiAgdHJlZS5yZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZXNldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBVQkxJQyBBUElcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggc21hcnQgcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQuXG4gKlxuICogRmVhdHVyZXMgYXV0by1lbmFibGUgb24gZmlyc3QgdXNlLiBVc2VzIGludGVsbGlnZW50IGRlZmF1bHRzIGJhc2VkIG9uXG4gKiBlbnZpcm9ubWVudCAoZGV2ZWxvcG1lbnQgdnMgcHJvZHVjdGlvbikuIE5vIGNvbmZ1c2luZyB3YXJuaW5ncyBvclxuICogZmFrZSBpbXBsZW1lbnRhdGlvbnMgLSBldmVyeXRoaW5nIGp1c3Qgd29ya3MhXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSB3aXRoIGF1dG8tZW5hYmxpbmcgZmVhdHVyZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCwgdXNlcnM6IFtdIH0pO1xuICpcbiAqIC8vIENvcmUgZnVuY3Rpb25hbGl0eSBhbHdheXMgd29ya3NcbiAqIHRyZWUuc3RhdGUuY291bnQuc2V0KDUpO1xuICogdHJlZS51cGRhdGUoc3RhdGUgPT4gKHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKlxuICogLy8gQ29tcG9zaXRpb24gd2l0aCBwaXBlXG4gKiB0cmVlLnBpcGUoXG4gKiAgIHdpdGhCYXRjaGluZygpLFxuICogICB3aXRoTWVtb2l6YXRpb24oKSxcbiAqICAgd2l0aFRpbWVUcmF2ZWwoKVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KG9iajogVCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggcHJlc2V0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlcyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gc2NlbmFyaW9zIHdoaWxlIHN0aWxsXG4gKiBhbGxvd2luZyBmZWF0dXJlcyB0byBhdXRvLWVuYWJsZSBhcyBuZWVkZWQuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBwcmVzZXQgLSBQcmVzZXQgY29uZmlndXJhdGlvbiAoJ2Jhc2ljJywgJ3BlcmZvcm1hbmNlJywgJ2RldmVsb3BtZW50JywgJ3Byb2R1Y3Rpb24nKVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZXNldFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBPcHRpbWl6ZWQgZm9yIHByb2R1Y3Rpb25cbiAqIGNvbnN0IHByb2RUcmVlID0gc2lnbmFsVHJlZShzdGF0ZSwgJ3Byb2R1Y3Rpb24nKTtcbiAqXG4gKiAvLyBGdWxsIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXNcbiAqIGNvbnN0IGRldlRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCAnZGV2ZWxvcG1lbnQnKTtcbiAqXG4gKiAvLyBNYXhpbXVtIHBlcmZvcm1hbmNlXG4gKiBjb25zdCBwZXJmVHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsICdwZXJmb3JtYW5jZScpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQgZXh0ZW5kcyBTdGF0ZU9iamVjdD4oXG4gIG9iajogVCxcbiAgcHJlc2V0OiBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFByb3ZpZGVzIGZ1bGwgY29udHJvbCBvdmVyIGZlYXR1cmUgZW5hYmxlbWVudCB3aGlsZSBtYWludGFpbmluZ1xuICogYXV0by1lbmFibGluZyBiZWhhdmlvciBmb3IgdW5zcGVjaWZpZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBjb25maWcgLSBDdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb25cbiAqIGNvbnN0IGN1c3RvbVRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCB7XG4gKiAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAqICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gKiAgIG1heENhY2hlU2l6ZTogNTAwLFxuICogICB0cmVlTmFtZTogJ015QXBwJ1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBjb25maWc6IFRyZWVDb25maWdcbik6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNpZ25hbFRyZWUgZmFjdG9yeSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBjb25maWdPclByZXNldD86IFRyZWVDb25maWcgfCBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gSGFuZGxlIHByZXNldCBzdHJpbmdzXG4gIGlmICh0eXBlb2YgY29uZmlnT3JQcmVzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBQcmVzZXQgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gQHNpZ25hbHRyZWUvY29yZS4nLFxuICAgICAgJ1xcblRvIHVzZSBwcmVzZXRzLCBpbnN0YWxsIEBzaWduYWx0cmVlL3ByZXNldHMnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjayB0byBiYXNpYyBjb25maWd1cmF0aW9uXG4gICAgcmV0dXJuIGNyZWF0ZShvYmosIHt9KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25maWd1cmF0aW9uIG9iamVjdHMgb3IgZGVmYXVsdCAoc21hcnQgZW5oYW5jZW1lbnQpXG4gIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ09yUHJlc2V0IHx8IHt9O1xuICByZXR1cm4gY3JlYXRlKG9iaiwgY29uZmlnKTtcbn1cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFsdHJlZS1jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signaltree/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"description": "Lightweight, type-safe signal-based state management for Angular. Core package providing hierarchical signal trees, basic entity management, and async actions.",
|
|
4
5
|
"peerDependencies": {
|
|
5
6
|
"@angular/common": "^20.1.0",
|
|
6
7
|
"@angular/core": "^20.1.0"
|