qBitrr2 5.6.2__py3-none-any.whl → 5.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigView.js","sources":["../../../webui/node_modules/immer/dist/immer.mjs","../../../webui/node_modules/fast-deep-equal/index.js","../../../webui/node_modules/lodash-es/_freeGlobal.js","../../../webui/node_modules/lodash-es/_root.js","../../../webui/node_modules/lodash-es/_Symbol.js","../../../webui/node_modules/lodash-es/_getRawTag.js","../../../webui/node_modules/lodash-es/_objectToString.js","../../../webui/node_modules/lodash-es/_baseGetTag.js","../../../webui/node_modules/lodash-es/isObjectLike.js","../../../webui/node_modules/lodash-es/isSymbol.js","../../../webui/node_modules/lodash-es/_arrayMap.js","../../../webui/node_modules/lodash-es/isArray.js","../../../webui/node_modules/lodash-es/_baseToString.js","../../../webui/node_modules/lodash-es/isObject.js","../../../webui/node_modules/lodash-es/isFunction.js","../../../webui/node_modules/lodash-es/_coreJsData.js","../../../webui/node_modules/lodash-es/_isMasked.js","../../../webui/node_modules/lodash-es/_toSource.js","../../../webui/node_modules/lodash-es/_baseIsNative.js","../../../webui/node_modules/lodash-es/_getValue.js","../../../webui/node_modules/lodash-es/_getNative.js","../../../webui/node_modules/lodash-es/_defineProperty.js","../../../webui/node_modules/lodash-es/_isIndex.js","../../../webui/node_modules/lodash-es/_baseAssignValue.js","../../../webui/node_modules/lodash-es/eq.js","../../../webui/node_modules/lodash-es/_assignValue.js","../../../webui/node_modules/lodash-es/_isKey.js","../../../webui/node_modules/lodash-es/_nativeCreate.js","../../../webui/node_modules/lodash-es/_hashClear.js","../../../webui/node_modules/lodash-es/_hashDelete.js","../../../webui/node_modules/lodash-es/_hashGet.js","../../../webui/node_modules/lodash-es/_hashHas.js","../../../webui/node_modules/lodash-es/_hashSet.js","../../../webui/node_modules/lodash-es/_Hash.js","../../../webui/node_modules/lodash-es/_listCacheClear.js","../../../webui/node_modules/lodash-es/_assocIndexOf.js","../../../webui/node_modules/lodash-es/_listCacheDelete.js","../../../webui/node_modules/lodash-es/_listCacheGet.js","../../../webui/node_modules/lodash-es/_listCacheHas.js","../../../webui/node_modules/lodash-es/_listCacheSet.js","../../../webui/node_modules/lodash-es/_ListCache.js","../../../webui/node_modules/lodash-es/_Map.js","../../../webui/node_modules/lodash-es/_mapCacheClear.js","../../../webui/node_modules/lodash-es/_isKeyable.js","../../../webui/node_modules/lodash-es/_getMapData.js","../../../webui/node_modules/lodash-es/_mapCacheDelete.js","../../../webui/node_modules/lodash-es/_mapCacheGet.js","../../../webui/node_modules/lodash-es/_mapCacheHas.js","../../../webui/node_modules/lodash-es/_mapCacheSet.js","../../../webui/node_modules/lodash-es/_MapCache.js","../../../webui/node_modules/lodash-es/memoize.js","../../../webui/node_modules/lodash-es/_memoizeCapped.js","../../../webui/node_modules/lodash-es/_stringToPath.js","../../../webui/node_modules/lodash-es/toString.js","../../../webui/node_modules/lodash-es/_castPath.js","../../../webui/node_modules/lodash-es/_toKey.js","../../../webui/node_modules/lodash-es/_baseGet.js","../../../webui/node_modules/lodash-es/get.js","../../../webui/node_modules/lodash-es/_baseSet.js","../../../webui/node_modules/lodash-es/set.js","../../../webui/src/config/tooltips.ts","../../../webui/src/icons/visibility.svg","../../../webui/src/icons/plus.svg","../../../webui/src/icons/check-mark.svg","../../../webui/src/icons/trash.svg","../../../webui/src/pages/ConfigView.tsx"],"sourcesContent":["// src/utils/env.ts\nvar NOTHING = Symbol.for(\"immer-nothing\");\nvar DRAFTABLE = Symbol.for(\"immer-draftable\");\nvar DRAFT_STATE = Symbol.for(\"immer-state\");\n\n// src/utils/errors.ts\nvar errors = process.env.NODE_ENV !== \"production\" ? [\n // All error codes, starting by 0:\n function(plugin) {\n return `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`;\n },\n function(thing) {\n return `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`;\n },\n \"This object has been frozen and should not be mutated\",\n function(data) {\n return \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" + data;\n },\n \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n \"Immer forbids circular references\",\n \"The first or second argument to `produce` must be a function\",\n \"The third argument to `produce` must be a function or undefined\",\n \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n function(thing) {\n return `'current' expects a draft, got: ${thing}`;\n },\n \"Object.defineProperty() cannot be used on an Immer draft\",\n \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n \"Immer only supports deleting array indices\",\n \"Immer only supports setting array indices and the 'length' property\",\n function(thing) {\n return `'original' expects a draft, got: ${thing}`;\n }\n // Note: if more errors are added, the errorOffset in Patches.ts should be increased\n // See Patches.ts for additional errors\n] : [];\nfunction die(error, ...args) {\n if (process.env.NODE_ENV !== \"production\") {\n const e = errors[error];\n const msg = typeof e === \"function\" ? e.apply(null, args) : e;\n throw new Error(`[Immer] ${msg}`);\n }\n throw new Error(\n `[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n );\n}\n\n// src/utils/common.ts\nvar getPrototypeOf = Object.getPrototypeOf;\nfunction isDraft(value) {\n return !!value && !!value[DRAFT_STATE];\n}\nfunction isDraftable(value) {\n if (!value)\n return false;\n return isPlainObject(value) || Array.isArray(value) || !!value[DRAFTABLE] || !!value.constructor?.[DRAFTABLE] || isMap(value) || isSet(value);\n}\nvar objectCtorString = Object.prototype.constructor.toString();\nvar cachedCtorStrings = /* @__PURE__ */ new WeakMap();\nfunction isPlainObject(value) {\n if (!value || typeof value !== \"object\")\n return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null || proto === Object.prototype)\n return true;\n const Ctor = Object.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n if (Ctor === Object)\n return true;\n if (typeof Ctor !== \"function\")\n return false;\n let ctorString = cachedCtorStrings.get(Ctor);\n if (ctorString === void 0) {\n ctorString = Function.toString.call(Ctor);\n cachedCtorStrings.set(Ctor, ctorString);\n }\n return ctorString === objectCtorString;\n}\nfunction original(value) {\n if (!isDraft(value))\n die(15, value);\n return value[DRAFT_STATE].base_;\n}\nfunction each(obj, iter, strict = true) {\n if (getArchtype(obj) === 0 /* Object */) {\n const keys = strict ? Reflect.ownKeys(obj) : Object.keys(obj);\n keys.forEach((key) => {\n iter(key, obj[key], obj);\n });\n } else {\n obj.forEach((entry, index) => iter(index, entry, obj));\n }\n}\nfunction getArchtype(thing) {\n const state = thing[DRAFT_STATE];\n return state ? state.type_ : Array.isArray(thing) ? 1 /* Array */ : isMap(thing) ? 2 /* Map */ : isSet(thing) ? 3 /* Set */ : 0 /* Object */;\n}\nfunction has(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.has(prop) : Object.prototype.hasOwnProperty.call(thing, prop);\n}\nfunction get(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.get(prop) : thing[prop];\n}\nfunction set(thing, propOrOldValue, value) {\n const t = getArchtype(thing);\n if (t === 2 /* Map */)\n thing.set(propOrOldValue, value);\n else if (t === 3 /* Set */) {\n thing.add(value);\n } else\n thing[propOrOldValue] = value;\n}\nfunction is(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\nfunction isMap(target) {\n return target instanceof Map;\n}\nfunction isSet(target) {\n return target instanceof Set;\n}\nfunction latest(state) {\n return state.copy_ || state.base_;\n}\nfunction shallowCopy(base, strict) {\n if (isMap(base)) {\n return new Map(base);\n }\n if (isSet(base)) {\n return new Set(base);\n }\n if (Array.isArray(base))\n return Array.prototype.slice.call(base);\n const isPlain = isPlainObject(base);\n if (strict === true || strict === \"class_only\" && !isPlain) {\n const descriptors = Object.getOwnPropertyDescriptors(base);\n delete descriptors[DRAFT_STATE];\n let keys = Reflect.ownKeys(descriptors);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const desc = descriptors[key];\n if (desc.writable === false) {\n desc.writable = true;\n desc.configurable = true;\n }\n if (desc.get || desc.set)\n descriptors[key] = {\n configurable: true,\n writable: true,\n // could live with !!desc.set as well here...\n enumerable: desc.enumerable,\n value: base[key]\n };\n }\n return Object.create(getPrototypeOf(base), descriptors);\n } else {\n const proto = getPrototypeOf(base);\n if (proto !== null && isPlain) {\n return { ...base };\n }\n const obj = Object.create(proto);\n return Object.assign(obj, base);\n }\n}\nfunction freeze(obj, deep = false) {\n if (isFrozen(obj) || isDraft(obj) || !isDraftable(obj))\n return obj;\n if (getArchtype(obj) > 1) {\n Object.defineProperties(obj, {\n set: dontMutateMethodOverride,\n add: dontMutateMethodOverride,\n clear: dontMutateMethodOverride,\n delete: dontMutateMethodOverride\n });\n }\n Object.freeze(obj);\n if (deep)\n Object.values(obj).forEach((value) => freeze(value, true));\n return obj;\n}\nfunction dontMutateFrozenCollections() {\n die(2);\n}\nvar dontMutateMethodOverride = {\n value: dontMutateFrozenCollections\n};\nfunction isFrozen(obj) {\n if (obj === null || typeof obj !== \"object\")\n return true;\n return Object.isFrozen(obj);\n}\n\n// src/utils/plugins.ts\nvar plugins = {};\nfunction getPlugin(pluginKey) {\n const plugin = plugins[pluginKey];\n if (!plugin) {\n die(0, pluginKey);\n }\n return plugin;\n}\nfunction loadPlugin(pluginKey, implementation) {\n if (!plugins[pluginKey])\n plugins[pluginKey] = implementation;\n}\n\n// src/core/scope.ts\nvar currentScope;\nfunction getCurrentScope() {\n return currentScope;\n}\nfunction createScope(parent_, immer_) {\n return {\n drafts_: [],\n parent_,\n immer_,\n // Whenever the modified draft contains a draft from another scope, we\n // need to prevent auto-freezing so the unowned draft can be finalized.\n canAutoFreeze_: true,\n unfinalizedDrafts_: 0\n };\n}\nfunction usePatchesInScope(scope, patchListener) {\n if (patchListener) {\n getPlugin(\"Patches\");\n scope.patches_ = [];\n scope.inversePatches_ = [];\n scope.patchListener_ = patchListener;\n }\n}\nfunction revokeScope(scope) {\n leaveScope(scope);\n scope.drafts_.forEach(revokeDraft);\n scope.drafts_ = null;\n}\nfunction leaveScope(scope) {\n if (scope === currentScope) {\n currentScope = scope.parent_;\n }\n}\nfunction enterScope(immer2) {\n return currentScope = createScope(currentScope, immer2);\n}\nfunction revokeDraft(draft) {\n const state = draft[DRAFT_STATE];\n if (state.type_ === 0 /* Object */ || state.type_ === 1 /* Array */)\n state.revoke_();\n else\n state.revoked_ = true;\n}\n\n// src/core/finalize.ts\nfunction processResult(result, scope) {\n scope.unfinalizedDrafts_ = scope.drafts_.length;\n const baseDraft = scope.drafts_[0];\n const isReplaced = result !== void 0 && result !== baseDraft;\n if (isReplaced) {\n if (baseDraft[DRAFT_STATE].modified_) {\n revokeScope(scope);\n die(4);\n }\n if (isDraftable(result)) {\n result = finalize(scope, result);\n if (!scope.parent_)\n maybeFreeze(scope, result);\n }\n if (scope.patches_) {\n getPlugin(\"Patches\").generateReplacementPatches_(\n baseDraft[DRAFT_STATE].base_,\n result,\n scope.patches_,\n scope.inversePatches_\n );\n }\n } else {\n result = finalize(scope, baseDraft, []);\n }\n revokeScope(scope);\n if (scope.patches_) {\n scope.patchListener_(scope.patches_, scope.inversePatches_);\n }\n return result !== NOTHING ? result : void 0;\n}\nfunction finalize(rootScope, value, path) {\n if (isFrozen(value))\n return value;\n const useStrictIteration = rootScope.immer_.shouldUseStrictIteration();\n const state = value[DRAFT_STATE];\n if (!state) {\n each(\n value,\n (key, childValue) => finalizeProperty(rootScope, state, value, key, childValue, path),\n useStrictIteration\n );\n return value;\n }\n if (state.scope_ !== rootScope)\n return value;\n if (!state.modified_) {\n maybeFreeze(rootScope, state.base_, true);\n return state.base_;\n }\n if (!state.finalized_) {\n state.finalized_ = true;\n state.scope_.unfinalizedDrafts_--;\n const result = state.copy_;\n let resultEach = result;\n let isSet2 = false;\n if (state.type_ === 3 /* Set */) {\n resultEach = new Set(result);\n result.clear();\n isSet2 = true;\n }\n each(\n resultEach,\n (key, childValue) => finalizeProperty(\n rootScope,\n state,\n result,\n key,\n childValue,\n path,\n isSet2\n ),\n useStrictIteration\n );\n maybeFreeze(rootScope, result, false);\n if (path && rootScope.patches_) {\n getPlugin(\"Patches\").generatePatches_(\n state,\n path,\n rootScope.patches_,\n rootScope.inversePatches_\n );\n }\n }\n return state.copy_;\n}\nfunction finalizeProperty(rootScope, parentState, targetObject, prop, childValue, rootPath, targetIsSet) {\n if (childValue == null) {\n return;\n }\n if (typeof childValue !== \"object\" && !targetIsSet) {\n return;\n }\n const childIsFrozen = isFrozen(childValue);\n if (childIsFrozen && !targetIsSet) {\n return;\n }\n if (process.env.NODE_ENV !== \"production\" && childValue === targetObject)\n die(5);\n if (isDraft(childValue)) {\n const path = rootPath && parentState && parentState.type_ !== 3 /* Set */ && // Set objects are atomic since they have no keys.\n !has(parentState.assigned_, prop) ? rootPath.concat(prop) : void 0;\n const res = finalize(rootScope, childValue, path);\n set(targetObject, prop, res);\n if (isDraft(res)) {\n rootScope.canAutoFreeze_ = false;\n } else\n return;\n } else if (targetIsSet) {\n targetObject.add(childValue);\n }\n if (isDraftable(childValue) && !childIsFrozen) {\n if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n return;\n }\n if (parentState && parentState.base_ && parentState.base_[prop] === childValue && childIsFrozen) {\n return;\n }\n finalize(rootScope, childValue);\n if ((!parentState || !parentState.scope_.parent_) && typeof prop !== \"symbol\" && (isMap(targetObject) ? targetObject.has(prop) : Object.prototype.propertyIsEnumerable.call(targetObject, prop)))\n maybeFreeze(rootScope, childValue);\n }\n}\nfunction maybeFreeze(scope, value, deep = false) {\n if (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n freeze(value, deep);\n }\n}\n\n// src/core/proxy.ts\nfunction createProxyProxy(base, parent) {\n const isArray = Array.isArray(base);\n const state = {\n type_: isArray ? 1 /* Array */ : 0 /* Object */,\n // Track which produce call this is associated with.\n scope_: parent ? parent.scope_ : getCurrentScope(),\n // True for both shallow and deep changes.\n modified_: false,\n // Used during finalization.\n finalized_: false,\n // Track which properties have been assigned (true) or deleted (false).\n assigned_: {},\n // The parent draft state.\n parent_: parent,\n // The base state.\n base_: base,\n // The base proxy.\n draft_: null,\n // set below\n // The base copy with any updated values.\n copy_: null,\n // Called by the `produce` function.\n revoke_: null,\n isManual_: false\n };\n let target = state;\n let traps = objectTraps;\n if (isArray) {\n target = [state];\n traps = arrayTraps;\n }\n const { revoke, proxy } = Proxy.revocable(target, traps);\n state.draft_ = proxy;\n state.revoke_ = revoke;\n return proxy;\n}\nvar objectTraps = {\n get(state, prop) {\n if (prop === DRAFT_STATE)\n return state;\n const source = latest(state);\n if (!has(source, prop)) {\n return readPropFromProto(state, source, prop);\n }\n const value = source[prop];\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value === peek(state.base_, prop)) {\n prepareCopy(state);\n return state.copy_[prop] = createProxy(value, state);\n }\n return value;\n },\n has(state, prop) {\n return prop in latest(state);\n },\n ownKeys(state) {\n return Reflect.ownKeys(latest(state));\n },\n set(state, prop, value) {\n const desc = getDescriptorFromProto(latest(state), prop);\n if (desc?.set) {\n desc.set.call(state.draft_, value);\n return true;\n }\n if (!state.modified_) {\n const current2 = peek(latest(state), prop);\n const currentState = current2?.[DRAFT_STATE];\n if (currentState && currentState.base_ === value) {\n state.copy_[prop] = value;\n state.assigned_[prop] = false;\n return true;\n }\n if (is(value, current2) && (value !== void 0 || has(state.base_, prop)))\n return true;\n prepareCopy(state);\n markChanged(state);\n }\n if (state.copy_[prop] === value && // special case: handle new props with value 'undefined'\n (value !== void 0 || prop in state.copy_) || // special case: NaN\n Number.isNaN(value) && Number.isNaN(state.copy_[prop]))\n return true;\n state.copy_[prop] = value;\n state.assigned_[prop] = true;\n return true;\n },\n deleteProperty(state, prop) {\n if (peek(state.base_, prop) !== void 0 || prop in state.base_) {\n state.assigned_[prop] = false;\n prepareCopy(state);\n markChanged(state);\n } else {\n delete state.assigned_[prop];\n }\n if (state.copy_) {\n delete state.copy_[prop];\n }\n return true;\n },\n // Note: We never coerce `desc.value` into an Immer draft, because we can't make\n // the same guarantee in ES5 mode.\n getOwnPropertyDescriptor(state, prop) {\n const owner = latest(state);\n const desc = Reflect.getOwnPropertyDescriptor(owner, prop);\n if (!desc)\n return desc;\n return {\n writable: true,\n configurable: state.type_ !== 1 /* Array */ || prop !== \"length\",\n enumerable: desc.enumerable,\n value: owner[prop]\n };\n },\n defineProperty() {\n die(11);\n },\n getPrototypeOf(state) {\n return getPrototypeOf(state.base_);\n },\n setPrototypeOf() {\n die(12);\n }\n};\nvar arrayTraps = {};\neach(objectTraps, (key, fn) => {\n arrayTraps[key] = function() {\n arguments[0] = arguments[0][0];\n return fn.apply(this, arguments);\n };\n});\narrayTraps.deleteProperty = function(state, prop) {\n if (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop)))\n die(13);\n return arrayTraps.set.call(this, state, prop, void 0);\n};\narrayTraps.set = function(state, prop, value) {\n if (process.env.NODE_ENV !== \"production\" && prop !== \"length\" && isNaN(parseInt(prop)))\n die(14);\n return objectTraps.set.call(this, state[0], prop, value, state[0]);\n};\nfunction peek(draft, prop) {\n const state = draft[DRAFT_STATE];\n const source = state ? latest(state) : draft;\n return source[prop];\n}\nfunction readPropFromProto(state, source, prop) {\n const desc = getDescriptorFromProto(source, prop);\n return desc ? `value` in desc ? desc.value : (\n // This is a very special case, if the prop is a getter defined by the\n // prototype, we should invoke it with the draft as context!\n desc.get?.call(state.draft_)\n ) : void 0;\n}\nfunction getDescriptorFromProto(source, prop) {\n if (!(prop in source))\n return void 0;\n let proto = getPrototypeOf(source);\n while (proto) {\n const desc = Object.getOwnPropertyDescriptor(proto, prop);\n if (desc)\n return desc;\n proto = getPrototypeOf(proto);\n }\n return void 0;\n}\nfunction markChanged(state) {\n if (!state.modified_) {\n state.modified_ = true;\n if (state.parent_) {\n markChanged(state.parent_);\n }\n }\n}\nfunction prepareCopy(state) {\n if (!state.copy_) {\n state.copy_ = shallowCopy(\n state.base_,\n state.scope_.immer_.useStrictShallowCopy_\n );\n }\n}\n\n// src/core/immerClass.ts\nvar Immer2 = class {\n constructor(config) {\n this.autoFreeze_ = true;\n this.useStrictShallowCopy_ = false;\n this.useStrictIteration_ = true;\n /**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\n this.produce = (base, recipe, patchListener) => {\n if (typeof base === \"function\" && typeof recipe !== \"function\") {\n const defaultBase = recipe;\n recipe = base;\n const self = this;\n return function curriedProduce(base2 = defaultBase, ...args) {\n return self.produce(base2, (draft) => recipe.call(this, draft, ...args));\n };\n }\n if (typeof recipe !== \"function\")\n die(6);\n if (patchListener !== void 0 && typeof patchListener !== \"function\")\n die(7);\n let result;\n if (isDraftable(base)) {\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n let hasError = true;\n try {\n result = recipe(proxy);\n hasError = false;\n } finally {\n if (hasError)\n revokeScope(scope);\n else\n leaveScope(scope);\n }\n usePatchesInScope(scope, patchListener);\n return processResult(result, scope);\n } else if (!base || typeof base !== \"object\") {\n result = recipe(base);\n if (result === void 0)\n result = base;\n if (result === NOTHING)\n result = void 0;\n if (this.autoFreeze_)\n freeze(result, true);\n if (patchListener) {\n const p = [];\n const ip = [];\n getPlugin(\"Patches\").generateReplacementPatches_(base, result, p, ip);\n patchListener(p, ip);\n }\n return result;\n } else\n die(1, base);\n };\n this.produceWithPatches = (base, recipe) => {\n if (typeof base === \"function\") {\n return (state, ...args) => this.produceWithPatches(state, (draft) => base(draft, ...args));\n }\n let patches, inversePatches;\n const result = this.produce(base, recipe, (p, ip) => {\n patches = p;\n inversePatches = ip;\n });\n return [result, patches, inversePatches];\n };\n if (typeof config?.autoFreeze === \"boolean\")\n this.setAutoFreeze(config.autoFreeze);\n if (typeof config?.useStrictShallowCopy === \"boolean\")\n this.setUseStrictShallowCopy(config.useStrictShallowCopy);\n if (typeof config?.useStrictIteration === \"boolean\")\n this.setUseStrictIteration(config.useStrictIteration);\n }\n createDraft(base) {\n if (!isDraftable(base))\n die(8);\n if (isDraft(base))\n base = current(base);\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n proxy[DRAFT_STATE].isManual_ = true;\n leaveScope(scope);\n return proxy;\n }\n finishDraft(draft, patchListener) {\n const state = draft && draft[DRAFT_STATE];\n if (!state || !state.isManual_)\n die(9);\n const { scope_: scope } = state;\n usePatchesInScope(scope, patchListener);\n return processResult(void 0, scope);\n }\n /**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * By default, auto-freezing is enabled.\n */\n setAutoFreeze(value) {\n this.autoFreeze_ = value;\n }\n /**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\n setUseStrictShallowCopy(value) {\n this.useStrictShallowCopy_ = value;\n }\n /**\n * Pass false to use faster iteration that skips non-enumerable properties\n * but still handles symbols for compatibility.\n *\n * By default, strict iteration is enabled (includes all own properties).\n */\n setUseStrictIteration(value) {\n this.useStrictIteration_ = value;\n }\n shouldUseStrictIteration() {\n return this.useStrictIteration_;\n }\n applyPatches(base, patches) {\n let i;\n for (i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (patch.path.length === 0 && patch.op === \"replace\") {\n base = patch.value;\n break;\n }\n }\n if (i > -1) {\n patches = patches.slice(i + 1);\n }\n const applyPatchesImpl = getPlugin(\"Patches\").applyPatches_;\n if (isDraft(base)) {\n return applyPatchesImpl(base, patches);\n }\n return this.produce(\n base,\n (draft) => applyPatchesImpl(draft, patches)\n );\n }\n};\nfunction createProxy(value, parent) {\n const draft = isMap(value) ? getPlugin(\"MapSet\").proxyMap_(value, parent) : isSet(value) ? getPlugin(\"MapSet\").proxySet_(value, parent) : createProxyProxy(value, parent);\n const scope = parent ? parent.scope_ : getCurrentScope();\n scope.drafts_.push(draft);\n return draft;\n}\n\n// src/core/current.ts\nfunction current(value) {\n if (!isDraft(value))\n die(10, value);\n return currentImpl(value);\n}\nfunction currentImpl(value) {\n if (!isDraftable(value) || isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n let copy;\n let strict = true;\n if (state) {\n if (!state.modified_)\n return state.base_;\n state.finalized_ = true;\n copy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_);\n strict = state.scope_.immer_.shouldUseStrictIteration();\n } else {\n copy = shallowCopy(value, true);\n }\n each(\n copy,\n (key, childValue) => {\n set(copy, key, currentImpl(childValue));\n },\n strict\n );\n if (state) {\n state.finalized_ = false;\n }\n return copy;\n}\n\n// src/plugins/patches.ts\nfunction enablePatches() {\n const errorOffset = 16;\n if (process.env.NODE_ENV !== \"production\") {\n errors.push(\n 'Sets cannot have \"replace\" patches.',\n function(op) {\n return \"Unsupported patch operation: \" + op;\n },\n function(path) {\n return \"Cannot apply patch, path doesn't resolve: \" + path;\n },\n \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n );\n }\n const REPLACE = \"replace\";\n const ADD = \"add\";\n const REMOVE = \"remove\";\n function generatePatches_(state, basePath, patches, inversePatches) {\n switch (state.type_) {\n case 0 /* Object */:\n case 2 /* Map */:\n return generatePatchesFromAssigned(\n state,\n basePath,\n patches,\n inversePatches\n );\n case 1 /* Array */:\n return generateArrayPatches(state, basePath, patches, inversePatches);\n case 3 /* Set */:\n return generateSetPatches(\n state,\n basePath,\n patches,\n inversePatches\n );\n }\n }\n function generateArrayPatches(state, basePath, patches, inversePatches) {\n let { base_, assigned_ } = state;\n let copy_ = state.copy_;\n if (copy_.length < base_.length) {\n ;\n [base_, copy_] = [copy_, base_];\n [patches, inversePatches] = [inversePatches, patches];\n }\n for (let i = 0; i < base_.length; i++) {\n if (assigned_[i] && copy_[i] !== base_[i]) {\n const path = basePath.concat([i]);\n patches.push({\n op: REPLACE,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n inversePatches.push({\n op: REPLACE,\n path,\n value: clonePatchValueIfNeeded(base_[i])\n });\n }\n }\n for (let i = base_.length; i < copy_.length; i++) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n }\n for (let i = copy_.length - 1; base_.length <= i; --i) {\n const path = basePath.concat([i]);\n inversePatches.push({\n op: REMOVE,\n path\n });\n }\n }\n function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {\n const { base_, copy_ } = state;\n each(state.assigned_, (key, assignedValue) => {\n const origValue = get(base_, key);\n const value = get(copy_, key);\n const op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;\n if (origValue === value && op === REPLACE)\n return;\n const path = basePath.concat(key);\n patches.push(op === REMOVE ? { op, path } : { op, path, value });\n inversePatches.push(\n op === ADD ? { op: REMOVE, path } : op === REMOVE ? { op: ADD, path, value: clonePatchValueIfNeeded(origValue) } : { op: REPLACE, path, value: clonePatchValueIfNeeded(origValue) }\n );\n });\n }\n function generateSetPatches(state, basePath, patches, inversePatches) {\n let { base_, copy_ } = state;\n let i = 0;\n base_.forEach((value) => {\n if (!copy_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: REMOVE,\n path,\n value\n });\n inversePatches.unshift({\n op: ADD,\n path,\n value\n });\n }\n i++;\n });\n i = 0;\n copy_.forEach((value) => {\n if (!base_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n value\n });\n inversePatches.unshift({\n op: REMOVE,\n path,\n value\n });\n }\n i++;\n });\n }\n function generateReplacementPatches_(baseValue, replacement, patches, inversePatches) {\n patches.push({\n op: REPLACE,\n path: [],\n value: replacement === NOTHING ? void 0 : replacement\n });\n inversePatches.push({\n op: REPLACE,\n path: [],\n value: baseValue\n });\n }\n function applyPatches_(draft, patches) {\n patches.forEach((patch) => {\n const { path, op } = patch;\n let base = draft;\n for (let i = 0; i < path.length - 1; i++) {\n const parentType = getArchtype(base);\n let p = path[i];\n if (typeof p !== \"string\" && typeof p !== \"number\") {\n p = \"\" + p;\n }\n if ((parentType === 0 /* Object */ || parentType === 1 /* Array */) && (p === \"__proto__\" || p === \"constructor\"))\n die(errorOffset + 3);\n if (typeof base === \"function\" && p === \"prototype\")\n die(errorOffset + 3);\n base = get(base, p);\n if (typeof base !== \"object\")\n die(errorOffset + 2, path.join(\"/\"));\n }\n const type = getArchtype(base);\n const value = deepClonePatchValue(patch.value);\n const key = path[path.length - 1];\n switch (op) {\n case REPLACE:\n switch (type) {\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n die(errorOffset);\n default:\n return base[key] = value;\n }\n case ADD:\n switch (type) {\n case 1 /* Array */:\n return key === \"-\" ? base.push(value) : base.splice(key, 0, value);\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n return base.add(value);\n default:\n return base[key] = value;\n }\n case REMOVE:\n switch (type) {\n case 1 /* Array */:\n return base.splice(key, 1);\n case 2 /* Map */:\n return base.delete(key);\n case 3 /* Set */:\n return base.delete(patch.value);\n default:\n return delete base[key];\n }\n default:\n die(errorOffset + 1, op);\n }\n });\n return draft;\n }\n function deepClonePatchValue(obj) {\n if (!isDraftable(obj))\n return obj;\n if (Array.isArray(obj))\n return obj.map(deepClonePatchValue);\n if (isMap(obj))\n return new Map(\n Array.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n );\n if (isSet(obj))\n return new Set(Array.from(obj).map(deepClonePatchValue));\n const cloned = Object.create(getPrototypeOf(obj));\n for (const key in obj)\n cloned[key] = deepClonePatchValue(obj[key]);\n if (has(obj, DRAFTABLE))\n cloned[DRAFTABLE] = obj[DRAFTABLE];\n return cloned;\n }\n function clonePatchValueIfNeeded(obj) {\n if (isDraft(obj)) {\n return deepClonePatchValue(obj);\n } else\n return obj;\n }\n loadPlugin(\"Patches\", {\n applyPatches_,\n generatePatches_,\n generateReplacementPatches_\n });\n}\n\n// src/plugins/mapset.ts\nfunction enableMapSet() {\n class DraftMap extends Map {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 2 /* Map */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n assigned_: void 0,\n base_: target,\n draft_: this,\n isManual_: false,\n revoked_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(key) {\n return latest(this[DRAFT_STATE]).has(key);\n }\n set(key, value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!latest(state).has(key) || latest(state).get(key) !== value) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_.set(key, true);\n state.copy_.set(key, value);\n state.assigned_.set(key, true);\n }\n return this;\n }\n delete(key) {\n if (!this.has(key)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareMapCopy(state);\n markChanged(state);\n if (state.base_.has(key)) {\n state.assigned_.set(key, false);\n } else {\n state.assigned_.delete(key);\n }\n state.copy_.delete(key);\n return true;\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_ = /* @__PURE__ */ new Map();\n each(state.base_, (key) => {\n state.assigned_.set(key, false);\n });\n state.copy_.clear();\n }\n }\n forEach(cb, thisArg) {\n const state = this[DRAFT_STATE];\n latest(state).forEach((_value, key, _map) => {\n cb.call(thisArg, this.get(key), key, this);\n });\n }\n get(key) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n const value = latest(state).get(key);\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value !== state.base_.get(key)) {\n return value;\n }\n const draft = createProxy(value, state);\n prepareMapCopy(state);\n state.copy_.set(key, draft);\n return draft;\n }\n keys() {\n return latest(this[DRAFT_STATE]).keys();\n }\n values() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.values(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value\n };\n }\n };\n }\n entries() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.entries(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value: [r.value, value]\n };\n }\n };\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.entries();\n }\n }\n function proxyMap_(target, parent) {\n return new DraftMap(target, parent);\n }\n function prepareMapCopy(state) {\n if (!state.copy_) {\n state.assigned_ = /* @__PURE__ */ new Map();\n state.copy_ = new Map(state.base_);\n }\n }\n class DraftSet extends Set {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 3 /* Set */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n base_: target,\n draft_: this,\n drafts_: /* @__PURE__ */ new Map(),\n revoked_: false,\n isManual_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!state.copy_) {\n return state.base_.has(value);\n }\n if (state.copy_.has(value))\n return true;\n if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n return true;\n return false;\n }\n add(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!this.has(value)) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.add(value);\n }\n return this;\n }\n delete(value) {\n if (!this.has(value)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n markChanged(state);\n return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) : (\n /* istanbul ignore next */\n false\n ));\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.clear();\n }\n }\n values() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.values();\n }\n entries() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.entries();\n }\n keys() {\n return this.values();\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.values();\n }\n forEach(cb, thisArg) {\n const iterator = this.values();\n let result = iterator.next();\n while (!result.done) {\n cb.call(thisArg, result.value, result.value, this);\n result = iterator.next();\n }\n }\n }\n function proxySet_(target, parent) {\n return new DraftSet(target, parent);\n }\n function prepareSetCopy(state) {\n if (!state.copy_) {\n state.copy_ = /* @__PURE__ */ new Set();\n state.base_.forEach((value) => {\n if (isDraftable(value)) {\n const draft = createProxy(value, state);\n state.drafts_.set(value, draft);\n state.copy_.add(draft);\n } else {\n state.copy_.add(value);\n }\n });\n }\n }\n function assertUnrevoked(state) {\n if (state.revoked_)\n die(3, JSON.stringify(latest(state)));\n }\n loadPlugin(\"MapSet\", { proxyMap_, proxySet_ });\n}\n\n// src/immer.ts\nvar immer = new Immer2();\nvar produce = immer.produce;\nvar produceWithPatches = /* @__PURE__ */ immer.produceWithPatches.bind(\n immer\n);\nvar setAutoFreeze = /* @__PURE__ */ immer.setAutoFreeze.bind(immer);\nvar setUseStrictShallowCopy = /* @__PURE__ */ immer.setUseStrictShallowCopy.bind(\n immer\n);\nvar setUseStrictIteration = /* @__PURE__ */ immer.setUseStrictIteration.bind(\n immer\n);\nvar applyPatches = /* @__PURE__ */ immer.applyPatches.bind(immer);\nvar createDraft = /* @__PURE__ */ immer.createDraft.bind(immer);\nvar finishDraft = /* @__PURE__ */ immer.finishDraft.bind(immer);\nfunction castDraft(value) {\n return value;\n}\nfunction castImmutable(value) {\n return value;\n}\nexport {\n Immer2 as Immer,\n applyPatches,\n castDraft,\n castImmutable,\n createDraft,\n current,\n enableMapSet,\n enablePatches,\n finishDraft,\n freeze,\n DRAFTABLE as immerable,\n isDraft,\n isDraftable,\n NOTHING as nothing,\n original,\n produce,\n produceWithPatches,\n setAutoFreeze,\n setUseStrictIteration,\n setUseStrictShallowCopy\n};\n//# sourceMappingURL=immer.mjs.map","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n","import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n","import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n","import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n","import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseSet from './_baseSet.js';\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n}\n\nexport default set;\n","export const FIELD_TOOLTIPS: Record<string, string> = {\n \"Settings.ConsoleLevel\":\n \"Level of logging; choose between CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, TRACE.\",\n \"Settings.Logging\": \"Enable writing log output to files.\",\n \"Settings.CompletedDownloadFolder\":\n \"Folder where completed downloads are stored. Replace backslashes with forward slashes.\",\n \"Settings.FreeSpace\":\n \"Desired free space threshold (use K, M, G, T suffix). Set to -1 to disable the free space guard.\",\n \"Settings.FreeSpaceFolder\":\n \"Path used when checking free space. Replace backslashes with forward slashes.\",\n \"Settings.AutoPauseResume\":\n \"Automatically pause and resume torrents in response to the free space guard.\",\n \"Settings.NoInternetSleepTimer\":\n \"Delay, in seconds, before retrying when no internet connectivity is detected.\",\n \"Settings.LoopSleepTimer\":\n \"Delay, in seconds, between processing passes when monitoring torrents.\",\n \"Settings.SearchLoopDelay\":\n \"Delay, in seconds, between media search requests.\",\n \"Settings.FailedCategory\": \"Category that marks torrents as failed.\",\n \"Settings.RecheckCategory\": \"Category that triggers recheck handling.\",\n \"Settings.Tagless\": \"Enable tagless operation when categories are not used.\",\n \"Settings.IgnoreTorrentsYoungerThan\":\n \"Ignore torrents younger than this many seconds when evaluating failures.\",\n \"Settings.PingURLS\":\n \"Hostnames used to test for internet connectivity. They are pinged frequently.\",\n \"Settings.FFprobeAutoUpdate\":\n \"Download and update the bundled ffprobe binary automatically.\",\n \"Settings.AutoUpdateEnabled\":\n \"Enable the background worker that periodically checks for qBitrr updates.\",\n \"Settings.AutoUpdateCron\":\n \"Cron expression describing when to check for updates (default weekly Sunday at 03:00).\",\n \"Settings.AutoRestartProcesses\":\n \"Automatically restart worker processes that crash unexpectedly. Recommended to keep enabled for reliability.\",\n \"Settings.MaxProcessRestarts\":\n \"Maximum number of times a worker process can be restarted within the restart window before auto-restart is disabled. Prevents infinite crash loops.\",\n \"Settings.ProcessRestartWindow\":\n \"Time window in seconds for tracking restart attempts. If MaxProcessRestarts is exceeded within this window, auto-restart is disabled for that process.\",\n \"Settings.ProcessRestartDelay\":\n \"Delay in seconds before restarting a crashed worker process. Gives time for transient issues to resolve.\",\n \"WebUI.Host\":\n \"Interface address for the built-in WebUI. 0.0.0.0 binds on all interfaces.\",\n \"WebUI.Port\": \"Port number for the built-in WebUI.\",\n \"WebUI.Token\":\n \"Optional bearer token required by the WebUI/API. Leave empty to disable authentication.\",\n \"WebUI.LiveArr\": \"Enable live updates for Arr views.\",\n \"WebUI.GroupSonarr\": \"Group Sonarr views by series and seasons in collapsible sections.\",\n \"WebUI.Theme\": \"Choose the visual theme for the WebUI (light or dark).\",\n\n \"qBit.Disabled\":\n \"Disable qBitrr's direct qBittorrent integration (headless mode for search-only setups).\",\n \"qBit.Host\": \"qBittorrent WebUI host or IP address.\",\n \"qBit.Port\": \"qBittorrent WebUI port.\",\n \"qBit.UserName\": \"qBittorrent WebUI username.\",\n \"qBit.Password\":\n \"qBittorrent WebUI password. Remove this if authentication is bypassed for the host.\",\n\n \"ARR.Managed\": \"Toggle whether this Servarr instance is actively managed by qBitrr.\",\n \"ARR.URI\":\n \"Servarr URL, including protocol and port if needed (for example http://localhost:8989).\",\n \"ARR.APIKey\": \"Servarr API key from Settings > General > Security.\",\n \"ARR.Category\":\n \"qBittorrent category applied by the Servarr instance to its downloads.\",\n \"ARR.ReSearch\": \"Re-run searches for failed torrents that qBitrr removes.\",\n \"ARR.importMode\":\n \"Preferred import mode (Move, Copy, or Auto) when Servarr grabs completed files.\",\n \"ARR.RssSyncTimer\":\n \"Interval, in minutes, between RSS sync requests (0 disables the task).\",\n \"ARR.RefreshDownloadsTimer\":\n \"Interval, in minutes, between queue refresh requests (0 disables the task).\",\n \"ARR.ArrErrorCodesToBlocklist\":\n \"List of Servarr error messages that should trigger blocklisting and cleanup.\",\n\n \"EntrySearch.SearchMissing\": \"Search for missing media items.\",\n \"EntrySearch.AlsoSearchSpecials\": \"Include season 0 specials in missing searches.\",\n \"EntrySearch.Unmonitored\": \"Include unmonitored series or episodes in searches.\",\n \"EntrySearch.SearchLimit\":\n \"Maximum number of concurrent search tasks (Servarr enforces its own limits).\",\n \"EntrySearch.SearchByYear\":\n \"Order searches by the year the episode or movie first aired.\",\n \"EntrySearch.SearchInReverse\":\n \"Reverse search order (search oldest to newest instead of newest to oldest).\",\n \"EntrySearch.SearchRequestsEvery\":\n \"Delay, in seconds, between submitting individual search requests.\",\n \"EntrySearch.DoUpgradeSearch\":\n \"Search for improved releases even if a file already exists.\",\n \"EntrySearch.QualityUnmetSearch\":\n \"Search again when the quality requirements were not met.\",\n \"EntrySearch.CustomFormatUnmetSearch\":\n \"Search again when the minimum custom format score was not met.\",\n \"EntrySearch.ForceMinimumCustomFormat\":\n \"Automatically remove torrents that do not meet the minimum custom format score.\",\n \"EntrySearch.SearchAgainOnSearchCompletion\":\n \"Restart the search loop when the configured year range is exhausted.\",\n \"EntrySearch.UseTempForMissing\":\n \"Switch to temporary profiles when searching for missing media.\",\n \"EntrySearch.KeepTempProfile\": \"Do not revert to the main profile after using the temp profile.\",\n \"EntrySearch.MainQualityProfile\":\n \"Primary quality profile names, in the same order as the temporary profiles.\",\n \"EntrySearch.TempQualityProfile\":\n \"Temporary quality profile names, paired with the primary profiles.\",\n \"EntrySearch.SearchBySeries\":\n \"Search by entire series instead of individual episodes when applicable.\",\n \"EntrySearch.PrioritizeTodaysReleases\":\n \"Prioritise items released today (similar to RSS prioritisation).\",\n\n \"EntrySearch.Ombi.SearchOmbiRequests\":\n \"Pull pending Ombi requests when SearchMissing is enabled.\",\n \"EntrySearch.Ombi.OmbiURI\": \"Ombi server URL.\",\n \"EntrySearch.Ombi.OmbiAPIKey\": \"Ombi API key.\",\n \"EntrySearch.Ombi.ApprovedOnly\": \"Only process Ombi requests that are approved.\",\n \"EntrySearch.Ombi.Is4K\": \"Treat this Ombi configuration as 4K specific.\",\n\n \"EntrySearch.Overseerr.SearchOverseerrRequests\":\n \"Pull Overseerr requests when SearchMissing is enabled.\",\n \"EntrySearch.Overseerr.OverseerrURI\": \"Overseerr server URL.\",\n \"EntrySearch.Overseerr.OverseerrAPIKey\": \"Overseerr API key.\",\n \"EntrySearch.Overseerr.ApprovedOnly\": \"Only process Overseerr requests that are approved.\",\n \"EntrySearch.Overseerr.Is4K\": \"Treat this Overseerr configuration as 4K specific.\",\n\n \"Torrent.CaseSensitiveMatches\":\n \"When enabled, regex matches will respect case; otherwise they are case-insensitive.\",\n \"Torrent.FolderExclusionRegex\":\n \"Regex patterns that exclude folders outright (full-name match).\",\n \"Torrent.FileNameExclusionRegex\":\n \"Regex patterns that exclude individual files based on the file name.\",\n \"Torrent.FileExtensionAllowlist\":\n \"Allowed file extensions (or regex) for downloads; leave empty to allow all.\",\n \"Torrent.AutoDelete\": \"Automatically delete files that are not recognised as media.\",\n \"Torrent.IgnoreTorrentsYoungerThan\":\n \"Ignore torrents younger than this many seconds for failure handling.\",\n \"Torrent.MaximumETA\":\n \"Maximum allowed remaining ETA in seconds; values above this are considered stalled.\",\n \"Torrent.MaximumDeletablePercentage\":\n \"Upper bound for completion percentage when deciding to delete a torrent.\",\n \"Torrent.DoNotRemoveSlow\": \"Ignore slow torrents when pruning.\",\n \"Torrent.StalledDelay\":\n \"Minutes to allow stalled torrents before taking action (-1 disables, 0 is infinite).\",\n \"Torrent.ReSearchStalled\":\n \"Re-run searches for stalled torrents before or after removal depending on configuration.\",\n \"Torrent.RemoveDeadTrackers\": \"Remove trackers flagged as dead.\",\n \"Torrent.RemoveTrackerWithMessage\":\n \"Tracker status messages that should trigger tracker removal when RemoveDeadTrackers is enabled.\",\n\n \"Torrent.SeedingMode.DownloadRateLimitPerTorrent\":\n \"Per-torrent download rate limit in bytes per second (-1 disables the limit).\",\n \"Torrent.SeedingMode.UploadRateLimitPerTorrent\":\n \"Per-torrent upload rate limit in bytes per second (-1 disables the limit).\",\n \"Torrent.SeedingMode.MaxUploadRatio\":\n \"Maximum allowed upload ratio (-1 disables the limit).\",\n \"Torrent.SeedingMode.MaxSeedingTime\":\n \"Maximum seeding duration in seconds (-1 disables the limit).\",\n \"Torrent.SeedingMode.RemoveTorrent\":\n \"Removal policy: -1 do not remove, 1 remove on ratio, 2 remove on time, 3 remove on ratio or time, 4 remove on ratio and time.\",\n};\n\nexport function getTooltip(path: string[]): string | undefined {\n const joined = path.join(\".\");\n if (FIELD_TOOLTIPS[joined]) return FIELD_TOOLTIPS[joined];\n if (path.length > 1) {\n const withArrPrefix = [\"ARR\", ...path.slice(1)].join(\".\");\n if (FIELD_TOOLTIPS[withArrPrefix]) return FIELD_TOOLTIPS[withArrPrefix];\n const entrySearchPrefix = [\"EntrySearch\", ...path.slice(2)].join(\".\");\n if (path[1] === \"EntrySearch\" && FIELD_TOOLTIPS[entrySearchPrefix]) {\n return FIELD_TOOLTIPS[entrySearchPrefix];\n }\n const torrentPrefix = [\"Torrent\", ...path.slice(2)].join(\".\");\n if (path[1] === \"Torrent\" && FIELD_TOOLTIPS[torrentPrefix]) {\n return FIELD_TOOLTIPS[torrentPrefix];\n }\n }\n const leaf = path[path.length - 1];\n return FIELD_TOOLTIPS[leaf];\n}\n","export default \"__VITE_ASSET__CdYVzc2P__\"","export default \"__VITE_ASSET__DD$$IqcQ__\"","export default \"__VITE_ASSET__DxHRzqTL__\"","export default \"__VITE_ASSET__By16xPBV__\"","import { useCallback, useEffect, useMemo, useState, type JSX } from \"react\";\nimport { produce } from \"immer\";\nimport equal from \"fast-deep-equal\";\nimport { get, set } from \"lodash-es\";\nimport { getConfig, updateConfig, testArrConnection, type TestConnectionResponse } from \"../api/client\";\nimport type { ConfigDocument } from \"../api/types\";\nimport { useToast } from \"../context/ToastContext\";\nimport { useWebUI } from \"../context/WebUIContext\";\nimport { getTooltip } from \"../config/tooltips\";\nimport { IconImage } from \"../components/IconImage\";\nimport Select from \"react-select\";\nimport ConfigureIcon from \"../icons/gear.svg\";\n\nimport RefreshIcon from \"../icons/refresh-arrow.svg\";\nimport VisibilityIcon from \"../icons/visibility.svg\";\nimport AddIcon from \"../icons/plus.svg\";\nimport SaveIcon from \"../icons/check-mark.svg\";\nimport DeleteIcon from \"../icons/trash.svg\";\nimport CloseIcon from \"../icons/close.svg\";\n\ntype FieldType = \"text\" | \"number\" | \"checkbox\" | \"password\" | \"select\";\n\ninterface ValidationContext {\n root: ConfigDocument;\n section?: ConfigDocument | null;\n sectionKey?: string;\n}\n\ntype FieldValidator = (value: unknown, context: ValidationContext) => string | undefined;\n\ninterface FieldDefinition {\n label: string;\n path?: string[];\n type: FieldType;\n options?: string[];\n placeholder?: string;\n description?: string;\n parse?: (value: string | boolean) => unknown;\n format?: (value: unknown) => string | boolean;\n sectionName?: boolean;\n secure?: boolean;\n required?: boolean;\n validate?: FieldValidator;\n fullWidth?: boolean;\n}\n\ninterface ValidationError {\n path: string[];\n message: string;\n}\n\nconst SERVARR_SECTION_REGEX = /(rad|son|lid)arr/i;\n\n// Helper function for react-select theme-aware styles\nconst getSelectStyles = () => {\n const isDark = document.documentElement.getAttribute('data-theme') === 'dark';\n return {\n control: (base: any) => ({\n ...base,\n background: isDark ? '#0f131a' : '#ffffff',\n color: isDark ? '#eaeef2' : '#1d1d1f',\n borderColor: isDark ? '#2a2f36' : '#d2d2d7',\n minHeight: '38px',\n boxShadow: 'none',\n '&:hover': {\n borderColor: isDark ? '#3a4149' : '#b8b8bd',\n }\n }),\n menu: (base: any) => ({\n ...base,\n background: isDark ? '#0f131a' : '#ffffff',\n borderColor: isDark ? '#2a2f36' : '#d2d2d7',\n border: `1px solid ${isDark ? '#2a2f36' : '#d2d2d7'}`,\n }),\n option: (base: any, state: any) => ({\n ...base,\n background: state.isFocused\n ? (isDark ? 'rgba(122, 162, 247, 0.15)' : 'rgba(0, 113, 227, 0.1)')\n : (isDark ? '#0f131a' : '#ffffff'),\n color: isDark ? '#eaeef2' : '#1d1d1f',\n '&:active': {\n background: isDark ? 'rgba(122, 162, 247, 0.25)' : 'rgba(0, 113, 227, 0.2)',\n }\n }),\n singleValue: (base: any) => ({\n ...base,\n color: isDark ? '#eaeef2' : '#1d1d1f',\n }),\n input: (base: any) => ({\n ...base,\n color: isDark ? '#eaeef2' : '#1d1d1f',\n }),\n placeholder: (base: any) => ({\n ...base,\n color: isDark ? '#9aa3ac' : '#6e6e73',\n }),\n menuList: (base: any) => ({\n ...base,\n padding: '4px',\n }),\n };\n};\n\nconst parseList = (value: string | boolean): string[] =>\n String(value)\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n\nconst formatList = (value: unknown): string =>\n Array.isArray(value) ? value.join(\", \") : String(value ?? \"\");\n\nconst IMPORT_MODE_OPTIONS = [\"Move\", \"Copy\", \"Auto\"];\n\n\n\n\n\n\n\nconst SENTENCE_END = /(.+?[.!?])(\\s|$)/;\n\nfunction extractTooltipSummary(tooltip?: string): string | undefined {\n if (!tooltip) return undefined;\n const trimmed = tooltip.trim();\n if (!trimmed) return undefined;\n const match = trimmed.match(SENTENCE_END);\n const sentence = match ? match[1] : trimmed;\n return sentence.length > 160 ? `${sentence.slice(0, 157)}…` : sentence;\n}\n\n\n\n\n\nconst SETTINGS_FIELDS: FieldDefinition[] = [\n {\n label: \"Console Level\",\n path: [\"Settings\", \"ConsoleLevel\"],\n type: \"select\",\n options: [\"CRITICAL\", \"ERROR\", \"WARNING\", \"NOTICE\", \"INFO\", \"DEBUG\", \"TRACE\"],\n required: true,\n },\n { label: \"Logging\", path: [\"Settings\", \"Logging\"], type: \"checkbox\" },\n {\n label: \"Completed Download Folder\",\n path: [\"Settings\", \"CompletedDownloadFolder\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n const folder = String(value ?? \"\").trim();\n if (!folder || folder.toUpperCase() === \"CHANGE_ME\") {\n return \"Completed Download Folder must be set to a valid path.\";\n }\n return undefined;\n },\n },\n {\n label: \"Free Space\",\n path: [\"Settings\", \"FreeSpace\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return \"Free Space must be provided.\";\n }\n if (raw === \"-1\") {\n return undefined;\n }\n if (!/^-?\\d+(\\.\\d+)?[KMGTP]?$/i.test(raw)) {\n return \"Free Space must be -1 or a number optionally suffixed with K, M, G, T, or P.\";\n }\n return undefined;\n },\n },\n {\n label: \"Free Space Folder\",\n path: [\"Settings\", \"FreeSpaceFolder\"],\n type: \"text\",\n validate: (value, context) => {\n const freeSpace = getValue(context.root, [\"Settings\", \"FreeSpace\"]);\n const requiresFolder = String(freeSpace ?? \"\").trim() !== \"-1\";\n if (!requiresFolder) {\n return undefined;\n }\n const folder = String(value ?? \"\").trim();\n if (!folder || folder.toUpperCase() === \"CHANGE_ME\") {\n return \"Free Space Folder is required when Free Space monitoring is enabled.\";\n }\n return undefined;\n },\n },\n { label: \"Auto Pause/Resume\", path: [\"Settings\", \"AutoPauseResume\"], type: \"checkbox\" },\n {\n label: \"No Internet Sleep (s)\",\n path: [\"Settings\", \"NoInternetSleepTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"No Internet Sleep must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Loop Sleep (s)\",\n path: [\"Settings\", \"LoopSleepTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Loop Sleep must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Search Loop Delay (s)\",\n path: [\"Settings\", \"SearchLoopDelay\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Search Loop Delay must be a non-negative number.\";\n }\n return undefined;\n },\n },\n { label: \"Failed Category\", path: [\"Settings\", \"FailedCategory\"], type: \"text\" },\n { label: \"Recheck Category\", path: [\"Settings\", \"RecheckCategory\"], type: \"text\" },\n { label: \"Tagless\", path: [\"Settings\", \"Tagless\"], type: \"checkbox\" },\n {\n label: \"Ignore Torrents Younger Than\",\n path: [\"Settings\", \"IgnoreTorrentsYoungerThan\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Ignore Torrents Younger Than must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Ping URLs\",\n path: [\"Settings\", \"PingURLS\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n placeholder: \"one.one.one.one, dns.google.com\",\n },\n {\n label: \"FFprobe Auto Update\",\n path: [\"Settings\", \"FFprobeAutoUpdate\"],\n type: \"checkbox\",\n },\n {\n label: \"Auto Update Enabled\",\n path: [\"Settings\", \"AutoUpdateEnabled\"],\n type: \"checkbox\",\n },\n {\n label: \"Auto Update Cron\",\n path: [\"Settings\", \"AutoUpdateCron\"],\n type: \"text\",\n placeholder: \"0 3 * * 0\",\n required: true,\n validate: (value) => {\n const cron = String(value ?? \"\").trim();\n const parts = cron.split(/\\s+/).filter(Boolean);\n if (parts.length < 5 || parts.length > 6) {\n return \"Auto Update Cron must contain 5 or 6 space-separated fields.\";\n }\n return undefined;\n },\n },\n {\n label: \"Auto-Restart Processes\",\n path: [\"Settings\", \"AutoRestartProcesses\"],\n type: \"checkbox\",\n },\n {\n label: \"Max Process Restarts\",\n path: [\"Settings\", \"MaxProcessRestarts\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Max Process Restarts must be at least 1.\";\n }\n return undefined;\n },\n },\n {\n label: \"Process Restart Window (s)\",\n path: [\"Settings\", \"ProcessRestartWindow\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Process Restart Window must be at least 1 second.\";\n }\n return undefined;\n },\n },\n {\n label: \"Process Restart Delay (s)\",\n path: [\"Settings\", \"ProcessRestartDelay\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Process Restart Delay must be a non-negative number.\";\n }\n return undefined;\n },\n },\n\n];\n\nconst WEB_SETTINGS_FIELDS: FieldDefinition[] = [\n {\n label: \"WebUI Host\",\n path: [\"WebUI\", \"Host\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n if (!String(value ?? \"\").trim()) {\n return \"WebUI Host is required.\";\n }\n return undefined;\n },\n },\n {\n label: \"WebUI Port\",\n path: [\"WebUI\", \"Port\"],\n type: \"number\",\n validate: (value) => {\n const port = typeof value === \"number\" ? value : Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n return \"WebUI Port must be between 1 and 65535.\";\n }\n return undefined;\n },\n },\n {\n label: \"WebUI Token\",\n path: [\"WebUI\", \"Token\"],\n type: \"password\",\n secure: true,\n fullWidth: true,\n },\n];\n\nconst QBIT_FIELDS: FieldDefinition[] = [\n { label: \"Disabled\", path: [\"qBit\", \"Disabled\"], type: \"checkbox\" },\n {\n label: \"Host\",\n path: [\"qBit\", \"Host\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n if (!String(value ?? \"\").trim()) {\n return \"qBit Host is required.\";\n }\n return undefined;\n },\n },\n {\n label: \"Port\",\n path: [\"qBit\", \"Port\"],\n type: \"number\",\n validate: (value) => {\n const port = typeof value === \"number\" ? value : Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n return \"qBit Port must be between 1 and 65535.\";\n }\n return undefined;\n },\n },\n { label: \"UserName\", path: [\"qBit\", \"UserName\"], type: \"text\" },\n { label: \"Password\", path: [\"qBit\", \"Password\"], type: \"password\" },\n];\n\nconst ARR_GENERAL_FIELDS: FieldDefinition[] = [\n { label: \"Display Name\", type: \"text\", placeholder: \"Sonarr-TV\", sectionName: true },\n { label: \"Managed\", path: [\"Managed\"], type: \"checkbox\" },\n {\n label: \"URI\",\n path: [\"URI\"],\n type: \"text\",\n placeholder: \"http://host:port\",\n required: true,\n validate: (value, context) => {\n const uri = String(value ?? \"\").trim();\n const managed = Boolean(getValue(context.section ?? {}, [\"Managed\"]));\n if (!managed) {\n return undefined;\n }\n if (!uri || uri.toUpperCase() === \"CHANGE_ME\") {\n return \"URI must be set to a valid URL when the instance is managed.\";\n }\n return undefined;\n },\n },\n {\n label: \"API Key\",\n path: [\"APIKey\"],\n type: \"password\",\n secure: true,\n required: true,\n validate: (value, context) => {\n const apiKey = String(value ?? \"\").trim();\n const managed = Boolean(getValue(context.section ?? {}, [\"Managed\"]));\n if (!managed) {\n return undefined;\n }\n if (!apiKey || apiKey.toUpperCase() === \"CHANGE_ME\") {\n return \"API Key must be provided when the instance is managed.\";\n }\n return undefined;\n },\n },\n {\n label: \"Category\",\n path: [\"Category\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n if (!String(value ?? \"\").trim()) {\n return \"Category is required.\";\n }\n return undefined;\n },\n },\n { label: \"Re-search\", path: [\"ReSearch\"], type: \"checkbox\" },\n {\n label: \"Import Mode\",\n path: [\"importMode\"],\n type: \"select\",\n options: IMPORT_MODE_OPTIONS,\n required: true,\n },\n {\n label: \"RSS Sync Timer (min)\",\n path: [\"RssSyncTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"RSS Sync Timer must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Refresh Downloads Timer (min)\",\n path: [\"RefreshDownloadsTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Refresh Downloads Timer must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Arr Error Codes To Blocklist\",\n path: [\"ArrErrorCodesToBlocklist\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n];\n\nconst ARR_ENTRY_SEARCH_FIELDS: FieldDefinition[] = [\n {\n label: \"Search Missing\",\n path: [\"EntrySearch\", \"SearchMissing\"],\n type: \"checkbox\",\n },\n {\n label: \"Also Search Specials\",\n path: [\"EntrySearch\", \"AlsoSearchSpecials\"],\n type: \"checkbox\",\n },\n {\n label: \"Unmonitored\",\n path: [\"EntrySearch\", \"Unmonitored\"],\n type: \"checkbox\",\n },\n {\n label: \"Do Upgrade Search\",\n path: [\"EntrySearch\", \"DoUpgradeSearch\"],\n type: \"checkbox\",\n },\n {\n label: \"Quality Unmet Search\",\n path: [\"EntrySearch\", \"QualityUnmetSearch\"],\n type: \"checkbox\",\n },\n {\n label: \"Custom Format Unmet Search\",\n path: [\"EntrySearch\", \"CustomFormatUnmetSearch\"],\n type: \"checkbox\",\n },\n {\n label: \"Force Minimum Custom Format\",\n path: [\"EntrySearch\", \"ForceMinimumCustomFormat\"],\n type: \"checkbox\",\n },\n {\n label: \"Search Limit\",\n path: [\"EntrySearch\", \"SearchLimit\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Search Limit must be at least 1.\";\n }\n return undefined;\n },\n },\n {\n label: \"Search By Year\",\n path: [\"EntrySearch\", \"SearchByYear\"],\n type: \"checkbox\",\n },\n {\n label: \"Search In Reverse\",\n path: [\"EntrySearch\", \"SearchInReverse\"],\n type: \"checkbox\",\n },\n {\n label: \"Search Requests Every (s)\",\n path: [\"EntrySearch\", \"SearchRequestsEvery\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Search Requests Every must be at least 1 second.\";\n }\n return undefined;\n },\n },\n {\n label: \"Search Again On Completion\",\n path: [\"EntrySearch\", \"SearchAgainOnSearchCompletion\"],\n type: \"checkbox\",\n },\n {\n label: \"Use Temp Profile For Missing\",\n path: [\"EntrySearch\", \"UseTempForMissing\"],\n type: \"checkbox\",\n },\n {\n label: \"Keep Temp Profile\",\n path: [\"EntrySearch\", \"KeepTempProfile\"],\n type: \"checkbox\",\n },\n {\n label: \"Force Reset Temp Profiles\",\n path: [\"EntrySearch\", \"ForceResetTempProfiles\"],\n type: \"checkbox\",\n description: \"Reset all items using temp profiles to their original main profile on qBitrr startup\",\n },\n {\n label: \"Temp Profile Reset Timeout (Minutes)\",\n path: [\"EntrySearch\", \"TempProfileResetTimeoutMinutes\"],\n type: \"number\",\n description: \"Timeout in minutes after which items with temp profiles are automatically reset to main profile (0 = disabled)\",\n },\n {\n label: \"Profile Switch Retry Attempts\",\n path: [\"EntrySearch\", \"ProfileSwitchRetryAttempts\"],\n type: \"number\",\n description: \"Number of retry attempts for profile switch API calls (default: 3)\",\n },\n {\n label: \"Search By Series\",\n path: [\"EntrySearch\", \"SearchBySeries\"],\n type: \"select\",\n options: [\"smart\", \"true\", \"false\"],\n description: \"smart = auto (series search for multiple episodes, episode search for single), true = always series search, false = always episode search\",\n format: (value: unknown) => {\n // Convert boolean or string to string for display\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n return String(value || \"smart\");\n },\n parse: (value: string | boolean) => {\n // Keep as string for config - backend will handle parsing\n const str = String(value);\n if (str === \"true\" || str === \"false\") {\n return str;\n }\n return \"smart\";\n },\n },\n {\n label: \"Prioritize Today's Releases\",\n path: [\"EntrySearch\", \"PrioritizeTodaysReleases\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_ENTRY_SEARCH_OMBI_FIELDS: FieldDefinition[] = [\n {\n label: \"Search Ombi Requests\",\n path: [\"EntrySearch\", \"Ombi\", \"SearchOmbiRequests\"],\n type: \"checkbox\",\n },\n {\n label: \"Ombi URI\",\n path: [\"EntrySearch\", \"Ombi\", \"OmbiURI\"],\n type: \"text\",\n placeholder: \"http://host:port\",\n },\n {\n label: \"Ombi API Key\",\n path: [\"EntrySearch\", \"Ombi\", \"OmbiAPIKey\"],\n type: \"password\",\n },\n {\n label: \"Approved Only\",\n path: [\"EntrySearch\", \"Ombi\", \"ApprovedOnly\"],\n type: \"checkbox\",\n },\n {\n label: \"Is 4K Instance\",\n path: [\"EntrySearch\", \"Ombi\", \"Is4K\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_ENTRY_SEARCH_OVERSEERR_FIELDS: FieldDefinition[] = [\n {\n label: \"Search Overseerr Requests\",\n path: [\"EntrySearch\", \"Overseerr\", \"SearchOverseerrRequests\"],\n type: \"checkbox\",\n },\n {\n label: \"Overseerr URI\",\n path: [\"EntrySearch\", \"Overseerr\", \"OverseerrURI\"],\n type: \"text\",\n placeholder: \"http://host:port\",\n },\n {\n label: \"Overseerr API Key\",\n path: [\"EntrySearch\", \"Overseerr\", \"OverseerrAPIKey\"],\n type: \"password\",\n },\n {\n label: \"Approved Only\",\n path: [\"EntrySearch\", \"Overseerr\", \"ApprovedOnly\"],\n type: \"checkbox\",\n },\n {\n label: \"Is 4K Instance\",\n path: [\"EntrySearch\", \"Overseerr\", \"Is4K\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_TORRENT_FIELDS: FieldDefinition[] = [\n {\n label: \"Case Sensitive Matches\",\n path: [\"Torrent\", \"CaseSensitiveMatches\"],\n type: \"checkbox\",\n },\n {\n label: \"Folder Exclusion Regex\",\n path: [\"Torrent\", \"FolderExclusionRegex\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n {\n label: \"File Name Exclusion Regex\",\n path: [\"Torrent\", \"FileNameExclusionRegex\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n {\n label: \"File Extension Allowlist\",\n path: [\"Torrent\", \"FileExtensionAllowlist\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n {\n label: \"Auto Delete\",\n path: [\"Torrent\", \"AutoDelete\"],\n type: \"checkbox\",\n },\n {\n label: \"Ignore Torrents Younger Than (s)\",\n path: [\"Torrent\", \"IgnoreTorrentsYoungerThan\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Ignore Torrents Younger Than must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Maximum ETA (s)\",\n path: [\"Torrent\", \"MaximumETA\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Maximum ETA must be -1 or a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Maximum Deletable Percentage\",\n path: [\"Torrent\", \"MaximumDeletablePercentage\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0 || num > 100) {\n return \"Maximum Deletable Percentage must be between 0 and 100.\";\n }\n return undefined;\n },\n },\n {\n label: \"Do Not Remove Slow\",\n path: [\"Torrent\", \"DoNotRemoveSlow\"],\n type: \"checkbox\",\n },\n {\n label: \"Stalled Delay (min)\",\n path: [\"Torrent\", \"StalledDelay\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Stalled Delay must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Re-search Stalled\",\n path: [\"Torrent\", \"ReSearchStalled\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_SEEDING_FIELDS: FieldDefinition[] = [\n {\n label: \"Download Rate Limit Per Torrent\",\n path: [\"Torrent\", \"SeedingMode\", \"DownloadRateLimitPerTorrent\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Download Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Upload Rate Limit Per Torrent\",\n path: [\"Torrent\", \"SeedingMode\", \"UploadRateLimitPerTorrent\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Upload Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Upload Ratio\",\n path: [\"Torrent\", \"SeedingMode\", \"MaxUploadRatio\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Upload Ratio must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Seeding Time (s)\",\n path: [\"Torrent\", \"SeedingMode\", \"MaxSeedingTime\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Seeding Time must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Remove Torrent (policy)\",\n path: [\"Torrent\", \"SeedingMode\", \"RemoveTorrent\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num)) {\n return \"Remove Torrent policy must be a number.\";\n }\n if (num === -1) {\n return undefined;\n }\n if (![1, 2, 3, 4].includes(num)) {\n return \"Remove Torrent policy must be -1, 1, 2, 3, or 4.\";\n }\n return undefined;\n },\n },\n {\n label: \"Remove Dead Trackers\",\n path: [\"Torrent\", \"SeedingMode\", \"RemoveDeadTrackers\"],\n type: \"checkbox\",\n },\n {\n label: \"Remove Tracker Messages\",\n path: [\"Torrent\", \"SeedingMode\", \"RemoveTrackerWithMessage\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n fullWidth: true,\n },\n];\n\nconst ARR_TRACKER_FIELDS: FieldDefinition[] = [\n { label: \"Name\", path: [\"Name\"], type: \"text\", required: true },\n { label: \"URI\", path: [\"URI\"], type: \"text\", required: true },\n {\n label: \"Priority\",\n path: [\"Priority\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Priority must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Maximum ETA\",\n path: [\"MaximumETA\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Maximum ETA must be -1 or a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Download Rate Limit\",\n path: [\"DownloadRateLimit\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Download Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Upload Rate Limit\",\n path: [\"UploadRateLimit\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Upload Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Upload Ratio\",\n path: [\"MaxUploadRatio\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Upload Ratio must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Seeding Time\",\n path: [\"MaxSeedingTime\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Seeding Time must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Add Tracker If Missing\",\n path: [\"AddTrackerIfMissing\"],\n type: \"checkbox\",\n },\n { label: \"Remove If Exists\", path: [\"RemoveIfExists\"], type: \"checkbox\" },\n { label: \"Super Seed Mode\", path: [\"SuperSeedMode\"], type: \"checkbox\" },\n {\n label: \"Add Tags\",\n path: [\"AddTags\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n];\n\nfunction getArrFieldSets(arrKey: string) {\n const lower = arrKey.toLowerCase();\n const isSonarr = lower.includes(\"sonarr\");\n const isLidarr = lower.includes(\"lidarr\");\n const generalFields = [...ARR_GENERAL_FIELDS];\n const entryFields = ARR_ENTRY_SEARCH_FIELDS.filter((field) => {\n if (!field.path) {\n return true;\n }\n const joined = field.path.join(\".\");\n if (!isSonarr) {\n if (\n joined === \"EntrySearch.AlsoSearchSpecials\" ||\n joined === \"EntrySearch.SearchBySeries\" ||\n joined === \"EntrySearch.PrioritizeTodaysReleases\"\n ) {\n return false;\n }\n }\n if (isLidarr) {\n // Lidarr doesn't support SearchByYear (music albums don't have the same year-based search)\n if (joined === \"EntrySearch.SearchByYear\") {\n return false;\n }\n }\n return true;\n });\n // Ombi and Overseerr don't support music requests, so hide them for Lidarr\n const entryOmbiFields = isLidarr ? [] : [...ARR_ENTRY_SEARCH_OMBI_FIELDS];\n const entryOverseerrFields = isLidarr ? [] : [...ARR_ENTRY_SEARCH_OVERSEERR_FIELDS];\n const torrentFields = [...ARR_TORRENT_FIELDS];\n const seedingFields = [...ARR_SEEDING_FIELDS];\n const trackerFields = [...ARR_TRACKER_FIELDS];\n return {\n generalFields,\n entryFields,\n entryOmbiFields,\n entryOverseerrFields,\n torrentFields,\n seedingFields,\n trackerFields,\n };\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n (typeof value === \"string\" && value.trim() === \"\") ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nfunction basicValidation(def: FieldDefinition, value: unknown): string | undefined {\n const label = def.label;\n const isRequired = def.required ?? (def.type === \"number\" || def.type === \"select\");\n switch (def.type) {\n case \"text\":\n case \"password\": {\n if (!isRequired) {\n return undefined;\n }\n if (isEmptyValue(value)) {\n return `${label} is required.`;\n }\n return undefined;\n }\n case \"number\": {\n if (value === null || value === undefined || value === \"\") {\n return isRequired ? `${label} is required.` : undefined;\n }\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num)) {\n return `${label} must be a valid number.`;\n }\n return undefined;\n }\n case \"checkbox\": {\n if (value === null || value === undefined) {\n return isRequired ? `${label} is required.` : undefined;\n }\n if (typeof value !== \"boolean\") {\n return `${label} must be true or false.`;\n }\n return undefined;\n }\n case \"select\": {\n if (isEmptyValue(value)) {\n return `${label} is required.`;\n }\n if (typeof value !== \"string\") {\n return `${label} must be selected.`;\n }\n if (def.options && !def.options.includes(value)) {\n return `${label} must be one of ${def.options.join(\", \")}.`;\n }\n return undefined;\n }\n default:\n return undefined;\n }\n}\n\nfunction validateFieldGroup(\n errors: ValidationError[],\n fields: FieldDefinition[],\n state: ConfigDocument | null,\n basePath: string[],\n context: ValidationContext\n): void {\n if (!state) return;\n for (const field of fields) {\n if (field.sectionName) {\n continue;\n }\n const pathSegments = field.path ?? [];\n const value = pathSegments.length\n ? getValue(state as ConfigDocument, pathSegments)\n : undefined;\n const fullPath = [...basePath, ...pathSegments];\n const baseError = basicValidation(field, value);\n if (baseError) {\n errors.push({ path: fullPath, message: baseError });\n continue;\n }\n if (field.validate) {\n const customError = field.validate(value, context);\n if (customError) {\n errors.push({ path: fullPath, message: customError });\n }\n }\n }\n}\n\nfunction validateFormState(formState: ConfigDocument | null): ValidationError[] {\n if (!formState) return [];\n const errors: ValidationError[] = [];\n const rootContext: ValidationContext = { root: formState };\n validateFieldGroup(errors, SETTINGS_FIELDS, formState, [], rootContext);\n validateFieldGroup(errors, WEB_SETTINGS_FIELDS, formState, [], rootContext);\n validateFieldGroup(errors, QBIT_FIELDS, formState, [], rootContext);\n for (const [key, value] of Object.entries(formState)) {\n if (!SERVARR_SECTION_REGEX.test(key) || !value || typeof value !== \"object\") {\n continue;\n }\n const section = value as ConfigDocument;\n const sectionContext: ValidationContext = { root: formState, section, sectionKey: key };\n const fieldSets = getArrFieldSets(key);\n validateFieldGroup(errors, fieldSets.generalFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.entryFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.entryOmbiFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.entryOverseerrFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.torrentFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.seedingFields, section, [key], sectionContext);\n }\n return errors;\n}\n\n// Note: cloneConfig is no longer needed - using immer's produce for immutable updates\n\n// Utility wrappers around lodash for ConfigDocument operations\nfunction getValue(doc: ConfigDocument | null, path: string[]): unknown {\n if (!doc) return undefined;\n return get(doc, path);\n}\n\nfunction setValue(\n doc: ConfigDocument,\n path: string[],\n value: unknown\n): void {\n set(doc, path, value);\n}\n\n// Custom flatten to create dot-notation keys (e.g., \"Settings.FreeSpace\")\n// Note: lodash's flatten is for arrays; this is a specialized object flattener\nfunction flatten(doc: ConfigDocument, prefix: string[] = []): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(doc)) {\n const nextPath = [...prefix, key];\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, flatten(value as ConfigDocument, nextPath));\n } else {\n result[nextPath.join(\".\")] = value;\n }\n }\n return result;\n}\n\nfunction ensureArrDefaults(type: string): ConfigDocument {\n const lowerType = type.toLowerCase();\n const isSonarr = lowerType.includes(\"sonarr\");\n const isRadarr = lowerType.includes(\"radarr\");\n const isLidarr = lowerType.includes(\"lidarr\");\n\n const arrErrorCodes = isRadarr\n ? [\n \"Not a preferred word upgrade for existing movie file(s)\",\n \"Not an upgrade for existing movie file(s)\",\n \"Unable to determine if file is a sample\",\n ]\n : isLidarr\n ? [\n \"Not a preferred word upgrade for existing album file(s)\",\n \"Not an upgrade for existing album file(s)\",\n \"Unable to determine if file is a sample\",\n ]\n : [\n \"Not a preferred word upgrade for existing episode file(s)\",\n \"Not an upgrade for existing episode file(s)\",\n \"Unable to determine if file is a sample\",\n ];\n\n const entrySearch: Record<string, unknown> = {\n SearchMissing: true,\n Unmonitored: false,\n SearchLimit: 5,\n SearchByYear: true,\n SearchInReverse: false,\n SearchRequestsEvery: 300,\n DoUpgradeSearch: false,\n QualityUnmetSearch: false,\n CustomFormatUnmetSearch: false,\n ForceMinimumCustomFormat: false,\n SearchAgainOnSearchCompletion: true,\n UseTempForMissing: false,\n KeepTempProfile: false,\n ForceResetTempProfiles: false,\n TempProfileResetTimeoutMinutes: 0,\n ProfileSwitchRetryAttempts: 3,\n QualityProfileMappings: {},\n };\n\n if (isSonarr) {\n entrySearch.AlsoSearchSpecials = false;\n entrySearch.SearchBySeries = \"smart\";\n entrySearch.PrioritizeTodaysReleases = true;\n }\n\n entrySearch.Ombi = {\n SearchOmbiRequests: false,\n OmbiURI: \"CHANGE_ME\",\n OmbiAPIKey: \"CHANGE_ME\",\n ApprovedOnly: true,\n };\n entrySearch.Overseerr = {\n SearchOverseerrRequests: false,\n OverseerrURI: \"CHANGE_ME\",\n OverseerrAPIKey: \"CHANGE_ME\",\n ApprovedOnly: true,\n Is4K: false,\n };\n\n const torrent: Record<string, unknown> = {\n CaseSensitiveMatches: false,\n FolderExclusionRegex: [\n \"\\\\bextras?\\\\b\",\n \"\\\\bfeaturettes?\\\\b\",\n \"\\\\bsamples?\\\\b\",\n \"\\\\bscreens?\\\\b\",\n \"\\\\bnc(ed|op)?(\\\\\\\\d+)?\\\\b\",\n ],\n FileNameExclusionRegex: [\n \"\\\\bncop\\\\\\\\d+?\\\\b\",\n \"\\\\bnced\\\\\\\\d+?\\\\b\",\n \"\\\\bsample\\\\b\",\n \"brarbg.com\\\\b\",\n \"\\\\btrailer\\\\b\",\n \"music video\",\n \"comandotorrents.com\",\n ],\n FileExtensionAllowlist: isLidarr\n ? [\".mp3\", \".flac\", \".m4a\", \".aac\", \".ogg\", \".opus\", \".wav\", \".ape\", \".wma\", \".!qB\", \".parts\", \".log\", \".cue\"]\n : [\".mp4\", \".mkv\", \".sub\", \".ass\", \".srt\", \".!qB\", \".parts\"],\n AutoDelete: false,\n IgnoreTorrentsYoungerThan: 600,\n MaximumETA: 604800,\n MaximumDeletablePercentage: 0.99,\n DoNotRemoveSlow: true,\n StalledDelay: 15,\n ReSearchStalled: false,\n RemoveDeadTrackers: false,\n RemoveTrackerWithMessage: [\n \"skipping tracker announce (unreachable)\",\n \"No such host is known\",\n \"unsupported URL protocol\",\n \"info hash is not authorized with this tracker\",\n ],\n SeedingMode: {\n DownloadRateLimitPerTorrent: -1,\n UploadRateLimitPerTorrent: -1,\n MaxUploadRatio: -1,\n MaxSeedingTime: -1,\n RemoveTorrent: -1,\n },\n };\n\n return {\n Managed: true,\n URI: \"CHANGE_ME\",\n APIKey: \"CHANGE_ME\",\n Category: type,\n ReSearch: true,\n importMode: \"Auto\",\n RssSyncTimer: 5,\n RefreshDownloadsTimer: 5,\n ArrErrorCodesToBlocklist: arrErrorCodes,\n EntrySearch: entrySearch as ConfigDocument,\n Torrent: torrent as ConfigDocument,\n } as ConfigDocument;\n}\n\ninterface ConfigViewProps {\n onDirtyChange?: (dirty: boolean) => void;\n}\n\nexport function ConfigView(props?: ConfigViewProps): JSX.Element {\n const { onDirtyChange } = props ?? {};\n const { push } = useToast();\n const [originalConfig, setOriginalConfig] = useState<ConfigDocument | null>(\n null\n );\n const [formState, setFormState] = useState<ConfigDocument | null>(null);\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n\n const loadConfig = useCallback(async () => {\n setLoading(true);\n try {\n const config = await getConfig();\n setOriginalConfig(config);\n // Deep clone config for form state (immer will handle immutability from here)\n setFormState(config ? JSON.parse(JSON.stringify(config)) : null);\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to load configuration\",\n \"error\"\n );\n } finally {\n setLoading(false);\n }\n }, [push]);\n\n useEffect(() => {\n void loadConfig();\n }, [loadConfig]);\n\n const handleFieldChange = useCallback(\n (path: string[], def: FieldDefinition, raw: unknown) => {\n if (!formState) return;\n const parsed =\n def.parse?.(raw as string | boolean) ??\n (def.type === \"number\"\n ? Number(raw) || 0\n : def.type === \"checkbox\"\n ? Boolean(raw)\n : raw);\n setFormState(\n produce(formState, (draft) => {\n setValue(draft, path, parsed);\n })\n );\n },\n [formState]\n );\n\n const arrSections = useMemo(() => {\n if (!formState) return [] as Array<[string, ConfigDocument]>;\n return Object.entries(formState).filter(([key, value]) =>\n SERVARR_SECTION_REGEX.test(key) && value && typeof value === \"object\"\n ) as Array<[string, ConfigDocument]>;\n }, [formState]);\n const groupedArrSections = useMemo(() => {\n const groups: Array<{\n label: string;\n type: \"radarr\" | \"sonarr\" | \"lidarr\" | \"other\";\n items: Array<[string, ConfigDocument]>;\n }> = [];\n const sorted = [...arrSections].sort((a, b) =>\n a[0].localeCompare(b[0], undefined, { numeric: true, sensitivity: \"base\" })\n );\n const radarr: Array<[string, ConfigDocument]> = [];\n const sonarr: Array<[string, ConfigDocument]> = [];\n const lidarr: Array<[string, ConfigDocument]> = [];\n const others: Array<[string, ConfigDocument]> = [];\n for (const entry of sorted) {\n const [key] = entry;\n const keyLower = key.toLowerCase();\n if (keyLower.startsWith(\"radarr\")) {\n radarr.push(entry);\n } else if (keyLower.startsWith(\"sonarr\")) {\n sonarr.push(entry);\n } else if (keyLower.startsWith(\"lidarr\")) {\n lidarr.push(entry);\n } else {\n others.push(entry);\n }\n }\n\n groups.push({ label: \"Radarr Instances\", type: \"radarr\", items: radarr });\n groups.push({ label: \"Sonarr Instances\", type: \"sonarr\", items: sonarr });\n groups.push({ label: \"Lidarr Instances\", type: \"lidarr\", items: lidarr });\n if (others.length) {\n groups.push({ label: \"Other Instances\", type: \"other\", items: others });\n }\n return groups;\n }, [arrSections]);\n const [activeArrKey, setActiveArrKey] = useState<string | null>(null);\n const [isSettingsOpen, setSettingsOpen] = useState(false);\n const [isWebSettingsOpen, setWebSettingsOpen] = useState(false);\n const [isQbitOpen, setQbitOpen] = useState(false);\n const [isDirty, setDirty] = useState(false);\n\n useEffect(() => {\n if (!formState || !originalConfig) {\n setDirty(false);\n return;\n }\n const flattenedOriginal = flatten(originalConfig);\n const flattenedCurrent = flatten(formState);\n\n // Keys that are managed dynamically and should not trigger dirty state\n const liveKeys = new Set([\n \"WebUI.LiveArr\",\n \"WebUI.GroupSonarr\",\n \"WebUI.GroupLidarr\",\n \"WebUI.Theme\",\n ]);\n\n let dirty = false;\n for (const [key, value] of Object.entries(flattenedCurrent)) {\n // Skip live WebUI settings\n if (liveKeys.has(key)) continue;\n\n const originalValue = flattenedOriginal[key];\n // Use fast-deep-equal for accurate comparison (handles arrays, objects, etc.)\n if (!equal(value, originalValue)) {\n dirty = true;\n break;\n }\n }\n if (!dirty) {\n for (const key of Object.keys(flattenedOriginal)) {\n // Skip live WebUI settings\n if (liveKeys.has(key)) continue;\n\n if (!(key in flattenedCurrent)) {\n dirty = true;\n break;\n }\n }\n }\n setDirty(dirty);\n }, [formState, originalConfig]);\n\n useEffect(() => {\n onDirtyChange?.(isDirty);\n }, [isDirty, onDirtyChange]);\n\n useEffect(() => {\n if (!isDirty) return;\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n event.returnValue = \"\";\n };\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }, [isDirty]);\n\n useEffect(() => {\n return () => {\n onDirtyChange?.(false);\n };\n }, [onDirtyChange]);\n\n useEffect(() => {\n const anyModalOpen = Boolean(activeArrKey || isSettingsOpen || isWebSettingsOpen || isQbitOpen);\n if (!anyModalOpen) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setActiveArrKey(null);\n setSettingsOpen(false);\n setQbitOpen(false);\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n const { style } = document.body;\n const originalOverflow = style.overflow;\n style.overflow = \"hidden\";\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n style.overflow = originalOverflow;\n };\n }, [activeArrKey, isSettingsOpen, isWebSettingsOpen, isQbitOpen]);\n\n useEffect(() => {\n if (!activeArrKey) return;\n if (!arrSections.some(([key]) => key === activeArrKey)) {\n setActiveArrKey(null);\n }\n }, [activeArrKey, arrSections]);\n\n const addArrInstance = useCallback(\n (type: \"radarr\" | \"sonarr\" | \"lidarr\") => {\n if (!formState) return;\n const prefix = type.charAt(0).toUpperCase() + type.slice(1);\n let index = 1;\n let key = `${prefix}-${index}`;\n while (formState[key]) {\n index += 1;\n key = `${prefix}-${index}`;\n }\n const defaults = ensureArrDefaults(type);\n if (defaults && typeof defaults === \"object\") {\n (defaults as Record<string, unknown>).Name = key;\n }\n setFormState(\n produce(formState, (draft) => {\n draft[key] = defaults;\n })\n );\n // Open modal for immediate configuration\n setActiveArrKey(key);\n },\n [formState]\n );\n const deleteArrInstance = useCallback(\n (key: string) => {\n if (!formState) return;\n const keyLower = key.toLowerCase();\n if (!keyLower.startsWith(\"radarr\") && !keyLower.startsWith(\"sonarr\") && !keyLower.startsWith(\"lidarr\")) {\n return;\n }\n const confirmed = window.confirm(\n `Delete ${key}? This action cannot be undone.`\n );\n if (!confirmed) {\n return;\n }\n if (!(key in formState)) {\n return;\n }\n setFormState(\n produce(formState, (draft) => {\n delete draft[key];\n })\n );\n if (activeArrKey === key) {\n setActiveArrKey(null);\n }\n push(`${key} removed`, \"success\");\n },\n [formState, activeArrKey, push]\n );\n\n const handleRenameSection = useCallback(\n (oldName: string, rawNewName: string) => {\n if (!formState) return;\n const newName = rawNewName.trim();\n if (!newName || newName === oldName) {\n return;\n }\n if (formState[newName]) {\n push(`An instance named \"${newName}\" already exists`, \"error\");\n return;\n }\n setFormState(\n produce(formState, (draft) => {\n const section = draft[oldName];\n delete draft[oldName];\n draft[newName] = section;\n if (section && typeof section === \"object\") {\n (section as Record<string, unknown>).Name = newName;\n }\n })\n );\n if (activeArrKey === oldName) {\n setActiveArrKey(newName);\n }\n },\n [formState, push, activeArrKey]\n );\n\n const handleSubmit = useCallback(async () => {\n if (!formState) return;\n setSaving(true);\n try {\n const validationErrors = validateFormState(formState);\n if (validationErrors.length) {\n const formatted = validationErrors\n .map((error) => `${error.path.join(\".\")}: ${error.message}`)\n .join(\"\\n\");\n const message =\n validationErrors.length === 1\n ? formatted\n : `Please resolve the following issues:\\n${formatted}`;\n push(message, \"error\");\n setSaving(false);\n return;\n }\n const flattenedOriginal = flatten(originalConfig ?? {});\n const flattenedCurrent = flatten(formState);\n const changes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(flattenedCurrent)) {\n const originalValue = flattenedOriginal[key];\n // Use fast-deep-equal for accurate comparison\n if (!equal(value, originalValue)) {\n changes[key] = value;\n }\n }\n for (const key of Object.keys(flattenedOriginal)) {\n if (!(key in flattenedCurrent)) {\n changes[key] = null;\n }\n }\n if (Object.keys(changes).length === 0) {\n push(\"No changes detected\", \"info\");\n setSaving(false);\n return;\n }\n const { configReloaded, reloadType, affectedInstances } = await updateConfig({ changes });\n\n // Build appropriate success message\n let message = \"Configuration saved\";\n if (reloadType === \"full\") {\n message += \" • All instances reloaded\";\n } else if (reloadType === \"multi_arr\" && affectedInstances?.length) {\n message += ` • Reloaded ${affectedInstances.length} instances: ${affectedInstances.join(\", \")}`;\n } else if (reloadType === \"single_arr\" && affectedInstances?.length) {\n message += ` • Reloaded: ${affectedInstances.join(\", \")}`;\n } else if (reloadType === \"webui\") {\n message += \" • WebUI restarting...\";\n } else if (reloadType === \"frontend\") {\n message += \" • Theme/display settings updated\";\n }\n push(message, \"success\");\n\n // Only clear browser cache if backend reloaded (non-frontend-only changes)\n if (configReloaded && 'caches' in window) {\n try {\n const cacheNames = await caches.keys();\n await Promise.all(\n cacheNames.map(cacheName => caches.delete(cacheName))\n );\n } catch (error) {\n console.warn('Failed to clear caches:', error);\n }\n }\n\n await loadConfig();\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to update configuration\",\n \"error\"\n );\n } finally {\n setSaving(false);\n }\n }, [formState, originalConfig, loadConfig, push]);\n\n if (loading || !formState) {\n return (\n <section className=\"card\">\n <div className=\"card-header\">Config</div>\n <div className=\"card-body\">\n <div className=\"loading\">\n <span className=\"spinner\" /> Loading configuration…\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <>\n <section className=\"card\">\n <div className=\"card-header\">Config</div>\n <div className=\"card-body config-layout\">\n <section className=\"config-arr-group\">\n <details className=\"config-arr-group__details\" open>\n <summary>\n <span>Core Configuration</span>\n </summary>\n <div className=\"config-grid\">\n <ConfigSummaryCard\n title=\"Settings\"\n description=\"Core application configuration\"\n onConfigure={() => setSettingsOpen(true)}\n />\n <ConfigSummaryCard\n title=\"Web Settings\"\n description=\"Web UI configuration\"\n onConfigure={() => setWebSettingsOpen(true)}\n />\n <ConfigSummaryCard\n title=\"qBit\"\n description=\"qBittorrent connection details\"\n onConfigure={() => setQbitOpen(true)}\n />\n </div>\n </details>\n </section>\n {groupedArrSections.length ? (\n <div className=\"config-arr-groups\">\n {groupedArrSections.map((group) => (\n <section className=\"config-arr-group\" key={group.type}>\n <details className=\"config-arr-group__details\" open>\n <summary>\n <span>{group.label}</span>\n <span className=\"config-arr-group__count\">\n {group.items.length}\n </span>\n {(group.type === \"radarr\" || group.type === \"sonarr\" || group.type === \"lidarr\") && (\n <button\n className=\"btn small\"\n type=\"button\"\n onClick={() => addArrInstance(group.type as \"radarr\" | \"sonarr\" | \"lidarr\")}\n >\n <IconImage src={AddIcon} />\n Add Instance\n </button>\n )}\n </summary>\n <div className=\"config-arr-grid\">\n {group.items.map(([key, value]) => {\n const uri = getValue(value as ConfigDocument, [\"URI\"]);\n const category = getValue(value as ConfigDocument, [\"Category\"]);\n const managed = getValue(value as ConfigDocument, [\"Managed\"]);\n const canDelete = group.type === \"radarr\" || group.type === \"sonarr\" || group.type === \"lidarr\";\n return (\n <div className=\"card config-card config-arr-card\" key={key}>\n <div className=\"card-header\">{key}</div>\n <div className=\"card-body\">\n <dl className=\"config-arr-summary\">\n <div className=\"config-arr-summary__item\">\n <dt>Managed</dt>\n <dd>{managed ? \"Enabled\" : \"Disabled\"}</dd>\n </div>\n <div className=\"config-arr-summary__item\">\n <dt>Category</dt>\n <dd>{category ? String(category) : \"-\"}</dd>\n </div>\n <div className=\"config-arr-summary__item\">\n <dt>URI</dt>\n <dd className=\"config-arr-summary__uri\">\n {uri ? String(uri) : \"-\"}\n </dd>\n </div>\n </dl>\n <div className=\"config-arr-actions\">\n {canDelete ? (\n <button\n className=\"btn danger\"\n type=\"button\"\n onClick={() => deleteArrInstance(key)}\n >\n <IconImage src={DeleteIcon} />\n Delete\n </button>\n ) : null}\n <button\n className=\"btn primary\"\n type=\"button\"\n onClick={() => setActiveArrKey(key)}\n >\n <IconImage src={ConfigureIcon} />\n Configure\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </details>\n </section>\n ))}\n </div>\n ) : null}\n <div className=\"config-footer\">\n <button\n className=\"btn primary\"\n onClick={() => void handleSubmit()}\n disabled={saving}\n >\n <IconImage src={SaveIcon} />\n Save + Live Reload\n </button>\n </div>\n </div>\n </section>\n {activeArrKey && formState ? (\n <ArrInstanceModal\n keyName={activeArrKey}\n state={(formState[activeArrKey] as ConfigDocument) ?? null}\n onChange={handleFieldChange}\n onRename={handleRenameSection}\n onClose={() => setActiveArrKey(null)}\n />\n ) : null}\n {isSettingsOpen ? (\n <SimpleConfigModal\n title=\"Settings\"\n fields={SETTINGS_FIELDS}\n state={formState}\n basePath={[]}\n onChange={handleFieldChange}\n onClose={() => setSettingsOpen(false)}\n />\n ) : null}\n {isWebSettingsOpen ? (\n <SimpleConfigModal\n title=\"Web Settings\"\n fields={WEB_SETTINGS_FIELDS}\n state={formState}\n basePath={[]}\n onChange={handleFieldChange}\n onClose={() => setWebSettingsOpen(false)}\n showLiveSettings={true}\n />\n ) : null}\n {isQbitOpen ? (\n <SimpleConfigModal\n title=\"qBit\"\n fields={QBIT_FIELDS}\n state={formState}\n basePath={[]}\n onChange={handleFieldChange}\n onClose={() => setQbitOpen(false)}\n />\n ) : null}\n </>\n );\n}\n\ninterface ConfigSummaryCardProps {\n title: string;\n description: string;\n onConfigure: () => void;\n}\n\nfunction ConfigSummaryCard({\n title,\n description,\n onConfigure,\n}: ConfigSummaryCardProps): JSX.Element {\n return (\n <div className=\"card config-card\">\n <div className=\"card-header\">{title}</div>\n <div className=\"card-body config-summary-card\">\n <p>{description}</p>\n <div className=\"config-arr-actions\">\n <button className=\"btn primary\" type=\"button\" onClick={onConfigure}>\n <IconImage src={ConfigureIcon} />\n Configure\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n\n\ninterface FieldGroupProps {\n title: string | null;\n fields: FieldDefinition[];\n state: ConfigDocument | ConfigDocument[keyof ConfigDocument] | null;\n basePath: string[];\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onRenameSection?: (oldName: string, newName: string) => void;\n defaultOpen?: boolean;\n qualityProfiles?: Array<{ id: number; name: string }>;\n sectionKey?: string;\n}\n\nfunction FieldGroup({\n title,\n fields,\n state,\n basePath,\n onChange,\n onRenameSection,\n defaultOpen = false,\n qualityProfiles = [],\n sectionKey,\n}: FieldGroupProps): JSX.Element {\n const sectionName = sectionKey ?? basePath[0] ?? \"\";\n\n if (title === \"Quality Profile Mappings\") {\n const mappings = (getValue(state as ConfigDocument, [\"EntrySearch\", \"QualityProfileMappings\"]) ?? {}) as Record<string, string>;\n const mappingEntries = Object.entries(mappings);\n\n // Check if credentials exist (URI and APIKey)\n const hasCredentials = Boolean(\n getValue(state as ConfigDocument, [\"URI\"]) &&\n getValue(state as ConfigDocument, [\"APIKey\"])\n );\n const hasProfiles = qualityProfiles.length > 0;\n\n const handleAddMapping = () => {\n const nextMappings = { ...mappings, \"\": \"\" };\n onChange([...basePath, \"EntrySearch\", \"QualityProfileMappings\"], {} as FieldDefinition, nextMappings);\n };\n\n const handleUpdateMapping = (oldKey: string, newKey: string, newValue: string) => {\n const nextMappings = { ...mappings };\n if (oldKey !== newKey) {\n delete nextMappings[oldKey];\n }\n if (newKey.trim()) {\n nextMappings[newKey.trim()] = newValue.trim();\n }\n onChange([...basePath, \"EntrySearch\", \"QualityProfileMappings\"], {} as FieldDefinition, nextMappings);\n };\n\n const handleDeleteMapping = (key: string) => {\n const nextMappings = { ...mappings };\n delete nextMappings[key];\n onChange([...basePath, \"EntrySearch\", \"QualityProfileMappings\"], {} as FieldDefinition, nextMappings);\n };\n\n return (\n <details className=\"config-section\" open={defaultOpen}>\n <summary>{title}</summary>\n <div className=\"config-section__body\">\n <div className=\"field-description\" style={{ marginBottom: '1rem' }}>\n Map main quality profile names to temporary profile names. Items will be downgraded to the temp profile when not found, then upgraded back to the main profile when available.\n </div>\n\n {!hasCredentials ? (\n <div className=\"alert warning\">\n ⚠️ Please configure URI and API Key first, then click \"Test Connection\" to load quality profiles\n </div>\n ) : !hasProfiles ? (\n <div className=\"alert info\">\n ℹ️ Click \"Test Connection\" above to load quality profiles from your {sectionName} instance\n </div>\n ) : (\n <>\n <div className=\"profile-mappings-grid\">\n {mappingEntries.map(([mainProfile, tempProfile], index) => (\n <div key={index} className=\"profile-mapping-row\">\n <div className=\"field\">\n <label>Main Profile</label>\n <Select\n options={qualityProfiles.map((p) => ({\n value: p.name,\n label: p.name,\n }))}\n value={\n mainProfile\n ? { value: mainProfile, label: mainProfile }\n : null\n }\n onChange={(option) =>\n handleUpdateMapping(\n mainProfile,\n option?.value || \"\",\n tempProfile\n )\n }\n placeholder=\"Select main profile...\"\n isClearable\n styles={getSelectStyles()}\n classNamePrefix=\"react-select\"\n />\n </div>\n <div className=\"field\">\n <label>Temp Profile</label>\n <Select\n options={qualityProfiles.map((p) => ({\n value: p.name,\n label: p.name,\n }))}\n value={\n tempProfile\n ? { value: tempProfile, label: tempProfile }\n : null\n }\n onChange={(option) =>\n handleUpdateMapping(\n mainProfile,\n mainProfile,\n option?.value || \"\"\n )\n }\n placeholder=\"Select temp profile...\"\n isClearable\n styles={getSelectStyles()}\n classNamePrefix=\"react-select\"\n />\n </div>\n <button\n className=\"btn ghost icon-only\"\n type=\"button\"\n onClick={() => handleDeleteMapping(mainProfile)}\n title=\"Delete mapping\"\n >\n <IconImage src={DeleteIcon} />\n </button>\n </div>\n ))}\n </div>\n <div className=\"config-actions\">\n <button className=\"btn\" type=\"button\" onClick={handleAddMapping}>\n <IconImage src={AddIcon} />\n Add Profile Mapping\n </button>\n </div>\n </>\n )}\n </div>\n </details>\n );\n }\n\n if (title === \"Trackers\") {\n const trackers = (getValue(state as ConfigDocument, [\"Torrent\", \"Trackers\"]) ?? []) as ConfigDocument[];\n const handleAddTracker = () => {\n const nextTrackers = [\n ...trackers,\n {\n Url: \"\",\n RemoveIfExists: false,\n SuperSeedMode: false,\n AddTags: [],\n },\n ];\n onChange([...basePath, \"Torrent\", \"Trackers\"], {} as FieldDefinition, nextTrackers);\n };\n const handleDeleteTracker = (index: number) => {\n const nextTrackers = [...trackers];\n nextTrackers.splice(index, 1);\n onChange([...basePath, \"Torrent\", \"Trackers\"], {} as FieldDefinition, nextTrackers);\n };\n return (\n <details className=\"config-section\" open={defaultOpen}>\n <summary>{title}</summary>\n <div className=\"config-section__body\">\n <div className=\"tracker-grid\">\n {trackers.map((tracker, index) => (\n <TrackerCard\n key={index}\n fields={fields}\n state={tracker}\n basePath={[...basePath, \"Torrent\", \"Trackers\", String(index)]}\n onChange={onChange}\n onDelete={() => handleDeleteTracker(index)}\n />\n ))}\n </div>\n <div className=\"config-actions\">\n <button className=\"btn\" type=\"button\" onClick={handleAddTracker}>\n <IconImage src={AddIcon} />\n Add Tracker\n </button>\n </div>\n </div>\n </details>\n );\n }\n\n const renderedFields = fields.map((field) => {\n if (field.sectionName) {\n if (!sectionName) {\n return null;\n }\n const tooltip = getTooltip([sectionName]);\n\n // Determine expected prefix for Arr instances\n let expectedPrefix: string | undefined;\n if (sectionName.startsWith(\"Radarr\")) {\n expectedPrefix = \"Radarr\";\n } else if (sectionName.startsWith(\"Sonarr\")) {\n expectedPrefix = \"Sonarr\";\n } else if (sectionName.startsWith(\"Lidarr\")) {\n expectedPrefix = \"Lidarr\";\n }\n\n return (\n <SectionNameField\n key={`${sectionName}.__name`}\n label={field.label}\n tooltip={tooltip}\n currentName={sectionName}\n placeholder={field.placeholder}\n expectedPrefix={expectedPrefix}\n onRename={(newName) => onRenameSection?.(sectionName, newName)}\n />\n );\n }\n\n const pathSegments = field.path ?? [];\n const path = [...basePath, ...pathSegments];\n const key = path.join('.');\n const rawValue = path.length > 0\n ? getValue(state as ConfigDocument, path)\n : undefined;\n const formatted =\n field.format?.(rawValue) ??\n (field.type === \"checkbox\" ? Boolean(rawValue) : String(rawValue ?? \"\"));\n const tooltip = getTooltip(path);\n const description =\n field.description ??\n extractTooltipSummary(tooltip) ??\n (field.type === \"checkbox\"\n ? `Enable or disable ${field.label}.`\n : `Set the ${field.label} value.`);\n\n const isArrInstance = basePath.length > 0 && SERVARR_SECTION_REGEX.test(basePath[0] ?? \"\");\n const isArrApiKey = isArrInstance && (field.path?.[field.path.length - 1] ?? \"\") === \"APIKey\";\n const fieldClassName = field.fullWidth ? \"field field--full-width\" : \"field\";\n\n if (field.secure) {\n return (\n <SecureField\n key={key}\n label={field.label}\n tooltip={tooltip}\n description={description}\n value={String(rawValue ?? '')}\n placeholder={field.placeholder}\n canRefresh={!isArrApiKey}\n onChange={(val) => onChange(path, field, val)}\n />\n );\n }\n\n\n\n if (field.type === \"checkbox\") {\n return (\n <div key={key} className=\"checkbox-field\">\n <label title={tooltip}>\n <input\n type=\"checkbox\"\n checked={Boolean(formatted)}\n onChange={(event) => onChange(path, field, event.target.checked)}\n />\n {field.label}\n </label>\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n }\n if (field.type === \"select\") {\n // Special handling for Theme field - apply immediately without save\n const isThemeField = field.label === \"Theme\" && path.join('.') === \"WebUI.Theme\";\n\n // Normalize the formatted value for theme field (case-insensitive)\n let displayValue = formatted;\n if (isThemeField && typeof formatted === \"string\") {\n const normalizedLower = formatted.toLowerCase();\n if (normalizedLower === \"light\") {\n displayValue = \"Light\";\n } else if (normalizedLower === \"dark\") {\n displayValue = \"Dark\";\n } else {\n // Default to Dark if invalid\n displayValue = \"Dark\";\n }\n }\n\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <Select\n options={(field.options ?? []).map(o => ({ value: o, label: o }))}\n value={displayValue ? { value: displayValue, label: displayValue } : null}\n onChange={(option) => {\n const newValue = option?.value || \"\";\n onChange(path, field, newValue);\n\n // If this is the theme field, apply immediately\n if (isThemeField && typeof newValue === \"string\" && newValue) {\n const theme = newValue.toLowerCase() as \"light\" | \"dark\";\n document.documentElement.setAttribute('data-theme', theme);\n localStorage.setItem(\"theme\", theme);\n }\n }}\n styles={getSelectStyles()}\n />\n {description && <div className=\"field-description\">{description}</div>}\n {isThemeField && <div className=\"field-hint\">Theme changes apply immediately</div>}\n </div>\n );\n }\n if (field.type === \"number\") {\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <input\n type=\"number\"\n value={Number(formatted) || 0}\n onChange={(event) => onChange(path, field, String(event.target.value))}\n placeholder={field.placeholder}\n />\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n }\n if (field.type === \"password\") {\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <input\n type=\"password\"\n value={String(formatted)}\n onChange={(event) => onChange(path, field, event.target.value)}\n placeholder={field.placeholder}\n />\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n }\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <input\n type=\"text\"\n value={String(formatted)}\n onChange={(event) => onChange(path, field, event.target.value)}\n placeholder={field.placeholder}\n />\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n });\n\n if (title) {\n return (\n <details className=\"config-section\" open={defaultOpen}>\n <summary>{title}</summary>\n <div className=\"config-section__body field-grid\">{renderedFields}</div>\n </details>\n );\n }\n\n return <div className=\"field-grid\">{renderedFields}</div>;\n}\n\nfunction TrackerCard({\n fields,\n state,\n basePath,\n onChange,\n onDelete,\n}: {\n fields: FieldDefinition[];\n state: ConfigDocument | null;\n basePath: string[];\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onDelete: () => void;\n}): JSX.Element {\n const trackerName = (getValue(state, [\"Name\"]) as string) || \"New Tracker\";\n return (\n <details className=\"card tracker-card\" open>\n <summary className=\"card-header\">\n <span>{trackerName}</span>\n <button className=\"btn danger ghost\" type=\"button\" onClick={onDelete}>\n <IconImage src={DeleteIcon} />\n </button>\n </summary>\n <div className=\"card-body\">\n <FieldGroup title={null} fields={fields} state={state} basePath={basePath} onChange={onChange} />\n </div>\n </details>\n );\n}\n\ninterface SectionNameFieldProps {\n label: string;\n currentName: string;\n placeholder?: string;\n tooltip?: string;\n expectedPrefix?: string;\n onRename: (newName: string) => void;\n}\n\nfunction SectionNameField({\n label,\n currentName,\n placeholder,\n tooltip,\n expectedPrefix,\n onRename,\n}: SectionNameFieldProps): JSX.Element {\n const [value, setValue] = useState(currentName);\n const description =\n extractTooltipSummary(tooltip) ?? `Rename the ${currentName} instance.`;\n\n useEffect(() => {\n setValue(currentName);\n }, [currentName]);\n\n const commit = () => {\n const trimmed = value.trim();\n if (!trimmed) {\n setValue(currentName);\n return;\n }\n\n let adjustedName = trimmed;\n\n // Enforce prefix if specified\n if (expectedPrefix && !trimmed.startsWith(expectedPrefix)) {\n // If user entered something without the prefix, prepend it\n adjustedName = expectedPrefix + (trimmed.startsWith(\"-\") ? trimmed : `-${trimmed}`);\n }\n\n // Enforce format: (Rad|Son|Lid)arr-.+ (prefix-suffix with at least one character after dash)\n const formatRegex = /^(Radarr|Sonarr|Lidarr)-.+$/;\n if (!formatRegex.test(adjustedName)) {\n // Invalid format - show error and reset\n alert(`Instance name must match format: ${expectedPrefix || '(Rad|Son|Lid)arr'}-(name)\\nExample: ${expectedPrefix || 'Radarr'}-Movies`);\n setValue(currentName);\n return;\n }\n\n if (adjustedName !== currentName) {\n onRename(adjustedName);\n } else {\n setValue(currentName); // Reset if no actual change\n }\n };\n\n return (\n <div className=\"field\">\n <label className=\"field-label\">\n <span>{label}</span>\n {tooltip ? (\n <span className=\"help-icon\" title={tooltip} aria-label={tooltip}>\n ?\n </span>\n ) : null}\n </label>\n {description ? <p className=\"field-description\">{description}</p> : null}\n <input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => setValue(event.target.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n commit();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(currentName);\n }\n }}\n />\n </div>\n );\n}\n\ninterface SecureFieldProps {\n label: string;\n value: string;\n placeholder?: string;\n tooltip?: string;\n description?: string;\n canRefresh?: boolean;\n onChange: (value: string) => void;\n}\n\nfunction SecureField({\n label,\n value,\n placeholder,\n tooltip,\n description,\n canRefresh = true,\n onChange,\n}: SecureFieldProps): JSX.Element {\n const [showValue, setShowValue] = useState(false);\n\n const handleRefresh = () => {\n let newKey = \"\";\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n newKey = crypto.randomUUID().replace(/-/g, \"\");\n } else {\n newKey = Array.from({ length: 32 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join(\"\");\n }\n onChange(newKey);\n };\n\n return (\n <div className=\"field secure-field\">\n <label title={tooltip}>{label}</label>\n <div className=\"secure-field__input-group\">\n <input\n type={showValue ? \"text\" : \"password\"}\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n />\n <button type=\"button\" className=\"btn ghost\" onClick={() => setShowValue(!showValue)}>\n <IconImage src={VisibilityIcon} />\n </button>\n {canRefresh && (\n <button type=\"button\" className=\"btn ghost\" onClick={handleRefresh}>\n <IconImage src={RefreshIcon} />\n </button>\n )}\n </div>\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n}\n\ninterface ArrInstanceModalProps {\n keyName: string;\n state: ConfigDocument | ConfigDocument[keyof ConfigDocument] | null;\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onRename: (oldName: string, newName: string) => void;\n onClose: () => void;\n}\n\nfunction ArrInstanceModal({\n keyName,\n state,\n onChange,\n onRename,\n onClose,\n}: ArrInstanceModalProps): JSX.Element {\n const { generalFields, entryFields, entryOmbiFields, entryOverseerrFields, torrentFields, seedingFields, trackerFields } =\n getArrFieldSets(keyName);\n const { push } = useToast();\n\n // State for test connection\n const [testState, setTestState] = useState<{\n testing: boolean;\n result: TestConnectionResponse | null;\n }>({ testing: false, result: null });\n\n const [qualityProfiles, setQualityProfiles] = useState<\n Array<{ id: number; name: string }>\n >([]);\n\n // Helper to get value from state\n const getValue = (path: string[]): unknown => {\n if (!state) return undefined;\n // state is already the Arr instance object, not the full ConfigDocument\n return get(state, path);\n };\n\n // Clear test state when URI or APIKey changes\n useEffect(() => {\n setTestState({ testing: false, result: null });\n setQualityProfiles([]);\n }, [getValue([\"URI\"]), getValue([\"APIKey\"])]);\n\n // Auto-test connection when modal opens if credentials exist\n useEffect(() => {\n const uri = getValue([\"URI\"]) as string;\n const apiKey = getValue([\"APIKey\"]) as string;\n\n if (uri && apiKey && !testState.testing && !testState.result) {\n // Auto-test silently (without toasts)\n handleTestConnection(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only run on mount\n\n // Test connection handler\n const handleTestConnection = async (silent = false) => {\n const uri = getValue([\"URI\"]) as string;\n const apiKey = getValue([\"APIKey\"]) as string;\n\n // Determine Arr type from keyName\n const keyLower = keyName.toLowerCase();\n const arrType = keyLower.includes(\"radarr\")\n ? \"radarr\"\n : keyLower.includes(\"sonarr\")\n ? \"sonarr\"\n : \"lidarr\";\n\n if (!uri || !apiKey) {\n if (!silent) {\n push(\"Please configure URI and API Key first\", \"error\");\n }\n return false;\n }\n\n setTestState({ testing: true, result: null });\n\n try {\n const result = await testArrConnection({ arrType, uri, apiKey });\n setTestState({ testing: false, result });\n\n if (result.success) {\n // Cache quality profiles for dropdown use\n if (result.qualityProfiles) {\n setQualityProfiles(result.qualityProfiles);\n }\n if (!silent) {\n push(`Connected to ${keyName} successfully!`, \"success\");\n }\n return true;\n } else {\n if (!silent) {\n push(`Connection failed: ${result.message}`, \"error\");\n }\n return false;\n }\n } catch {\n setTestState({ testing: false, result: null });\n if (!silent) {\n push(\"Test connection failed\", \"error\");\n }\n return false;\n }\n };\n\n // Handle save with connection test\n const handleSave = async () => {\n const uri = getValue([\"URI\"]) as string;\n const apiKey = getValue([\"APIKey\"]) as string;\n\n // If credentials exist, test connection before saving\n if (uri && apiKey) {\n const success = await handleTestConnection(false);\n if (success) {\n push(\"Configuration saved successfully\", \"success\");\n onClose();\n }\n // If unsuccessful, stay open so user can fix config\n } else {\n // No credentials to test, just close\n onClose();\n }\n };\n\n return (\n <div className=\"modal-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"arr-instance-modal-title\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2 id=\"arr-instance-modal-title\">\n Configure <code>{keyName}</code>\n </h2>\n <button className=\"btn ghost\" type=\"button\" onClick={onClose}>\n <IconImage src={CloseIcon} />\n Close\n </button>\n </div>\n <div className=\"modal-body\">\n <FieldGroup\n title={null}\n fields={generalFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n onRenameSection={onRename}\n sectionKey={keyName}\n defaultOpen\n />\n {testState.result && (\n <div\n className={`alert ${testState.result.success ? \"success\" : \"error\"}`}\n style={{ margin: \"16px 0\" }}\n >\n {testState.result.success ? (\n <>\n <strong>✓ {testState.result.message}</strong>\n {testState.result.systemInfo && (\n <div className=\"alert-details\">\n Version: {testState.result.systemInfo.version}\n {testState.result.systemInfo.branch &&\n ` (${testState.result.systemInfo.branch})`}\n </div>\n )}\n {testState.result.qualityProfiles && (\n <div className=\"alert-details\">\n Found {testState.result.qualityProfiles.length} quality\n profile(s)\n </div>\n )}\n </>\n ) : (\n <>\n <strong>⚠️ Connection Failed</strong>\n <br />\n {testState.result.message}\n </>\n )}\n </div>\n )}\n <FieldGroup\n title=\"Entry Search\"\n fields={entryFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n defaultOpen\n />\n <FieldGroup\n title=\"Quality Profile Mappings\"\n fields={[]}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n defaultOpen\n qualityProfiles={qualityProfiles}\n />\n {entryOmbiFields.length > 0 && (\n <FieldGroup\n title=\"Ombi Integration\"\n fields={entryOmbiFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n )}\n {entryOverseerrFields.length > 0 && (\n <FieldGroup\n title=\"Overseerr Integration\"\n fields={entryOverseerrFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n )}\n <FieldGroup\n title=\"Torrent Handling\"\n fields={torrentFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n <FieldGroup\n title=\"Seeding\"\n fields={seedingFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n <FieldGroup\n title=\"Trackers\"\n fields={trackerFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n </div>\n <div className=\"modal-footer\">\n <button\n className=\"btn secondary\"\n type=\"button\"\n onClick={() => handleTestConnection(false)}\n disabled={testState.testing}\n >\n {testState.testing ? (\n <>\n <IconImage src={RefreshIcon} />\n Testing...\n </>\n ) : (\n \"Test\"\n )}\n </button>\n <button className=\"btn primary\" type=\"button\" onClick={handleSave}>\n <IconImage src={SaveIcon} />\n Save\n </button>\n </div>\n </div>\n </div>\n );\n}\n\ninterface SimpleConfigModalProps {\n title: string;\n fields: FieldDefinition[];\n state: ConfigDocument | null;\n basePath: string[];\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onClose: () => void;\n showLiveSettings?: boolean;\n}\n\nfunction SimpleConfigModal({\n title,\n fields,\n state,\n basePath,\n onChange,\n onClose,\n showLiveSettings = false,\n}: SimpleConfigModalProps): JSX.Element | null {\n const webUI = useWebUI();\n\n if (!state) return null;\n return (\n <div className=\"modal-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={`${title}-modal-title`}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2 id={`${title}-modal-title`}>{title}</h2>\n <button className=\"btn ghost\" type=\"button\" onClick={onClose}>\n <IconImage src={CloseIcon} />\n Close\n </button>\n </div>\n <div className=\"modal-body\">\n <FieldGroup\n title={null}\n fields={fields}\n state={state}\n basePath={basePath}\n onChange={onChange}\n defaultOpen\n />\n {showLiveSettings && webUI && (\n <div className=\"field-group\">\n <h3 className=\"field-group-title\">Live Settings</h3>\n <div className=\"field-group-content\">\n <div className=\"field\">\n <label>\n <input\n type=\"checkbox\"\n checked={webUI.liveArr}\n onChange={(e) => webUI.setLiveArr(e.target.checked)}\n />\n {\" \"}Live Arr Updates\n </label>\n <p className=\"field-description\">Enable real-time updates for Arr views</p>\n </div>\n <div className=\"field\">\n <label>\n <input\n type=\"checkbox\"\n checked={webUI.groupSonarr}\n onChange={(e) => webUI.setGroupSonarr(e.target.checked)}\n />\n {\" \"}Group Sonarr by Series\n </label>\n <p className=\"field-description\">Group Sonarr episodes by series in views</p>\n </div>\n <div className=\"field\">\n <label>\n <input\n type=\"checkbox\"\n checked={webUI.groupLidarr}\n onChange={(e) => webUI.setGroupLidarr(e.target.checked)}\n />\n {\" \"}Group Lidarr by Artist\n </label>\n <p className=\"field-description\">Group Lidarr albums by artist in views</p>\n </div>\n <div className=\"field\">\n <label>Theme</label>\n <select\n value={webUI.theme}\n onChange={(e) => webUI.setTheme(e.target.value as \"light\" | \"dark\")}\n >\n <option value=\"dark\">Dark</option>\n <option value=\"light\">Light</option>\n </select>\n <p className=\"field-description\">WebUI theme (Light or Dark)</p>\n </div>\n </div>\n </div>\n )}\n </div>\n <div className=\"modal-footer\">\n <button className=\"btn primary\" type=\"button\" onClick={onClose}>\n <IconImage src={SaveIcon} />\n Done\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["NOTHING","DRAFTABLE","DRAFT_STATE","die","error","args","getPrototypeOf","isDraft","value","isDraftable","isPlainObject","isMap","isSet","objectCtorString","cachedCtorStrings","proto","Ctor","ctorString","each","obj","iter","strict","getArchtype","key","entry","index","thing","state","has","prop","set","propOrOldValue","t","is","x","y","target","latest","shallowCopy","base","isPlain","descriptors","keys","i","desc","freeze","deep","isFrozen","dontMutateMethodOverride","dontMutateFrozenCollections","plugins","getPlugin","pluginKey","plugin","currentScope","getCurrentScope","createScope","parent_","immer_","usePatchesInScope","scope","patchListener","revokeScope","leaveScope","revokeDraft","enterScope","immer2","draft","processResult","result","baseDraft","finalize","maybeFreeze","rootScope","path","useStrictIteration","childValue","finalizeProperty","resultEach","isSet2","parentState","targetObject","rootPath","targetIsSet","childIsFrozen","res","createProxyProxy","parent","isArray","traps","objectTraps","arrayTraps","revoke","proxy","source","readPropFromProto","peek","prepareCopy","createProxy","getDescriptorFromProto","current2","currentState","markChanged","owner","fn","Immer2","config","recipe","defaultBase","self","base2","hasError","p","ip","patches","inversePatches","current","patch","applyPatchesImpl","currentImpl","copy","immer","produce","fastDeepEqual","equal","a","b","length","freeGlobal","freeSelf","root","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","symbolTag","isSymbol","arrayMap","array","iteratee","symbolProto","symbolToString","baseToString","isObject","type","asyncTag","funcTag","genTag","proxyTag","isFunction","coreJsData","maskSrcKey","uid","isMasked","func","funcProto","funcToString","toSource","reRegExpChar","reIsHostCtor","reIsNative","baseIsNative","pattern","getValue","object","getNative","defineProperty","MAX_SAFE_INTEGER","reIsUint","isIndex","baseAssignValue","eq","other","assignValue","objValue","reIsDeepProp","reIsPlainProp","isKey","nativeCreate","hashClear","hashDelete","HASH_UNDEFINED","hashGet","data","hashHas","hashSet","Hash","entries","listCacheClear","assocIndexOf","arrayProto","splice","listCacheDelete","lastIndex","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","isKeyable","getMapData","map","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","size","MapCache","FUNC_ERROR_TEXT","memoize","resolver","memoized","cache","MAX_MEMOIZE_SIZE","memoizeCapped","rePropName","reEscapeChar","stringToPath","string","match","number","quote","subString","toString","castPath","toKey","baseGet","get","defaultValue","baseSet","customizer","nested","newValue","FIELD_TOOLTIPS","getTooltip","joined","withArrPrefix","entrySearchPrefix","torrentPrefix","leaf","VisibilityIcon","AddIcon","SaveIcon","DeleteIcon","SERVARR_SECTION_REGEX","getSelectStyles","isDark","parseList","part","formatList","IMPORT_MODE_OPTIONS","SENTENCE_END","extractTooltipSummary","tooltip","trimmed","sentence","SETTINGS_FIELDS","folder","raw","context","freeSpace","num","parts","WEB_SETTINGS_FIELDS","port","QBIT_FIELDS","ARR_GENERAL_FIELDS","uri","apiKey","ARR_ENTRY_SEARCH_FIELDS","str","ARR_ENTRY_SEARCH_OMBI_FIELDS","ARR_ENTRY_SEARCH_OVERSEERR_FIELDS","ARR_TORRENT_FIELDS","ARR_SEEDING_FIELDS","ARR_TRACKER_FIELDS","getArrFieldSets","arrKey","lower","isSonarr","isLidarr","generalFields","entryFields","field","entryOmbiFields","entryOverseerrFields","torrentFields","seedingFields","trackerFields","isEmptyValue","basicValidation","def","label","isRequired","validateFieldGroup","errors","fields","basePath","pathSegments","fullPath","baseError","customError","validateFormState","formState","rootContext","section","sectionContext","fieldSets","doc","setValue","flatten","prefix","nextPath","ensureArrDefaults","lowerType","isRadarr","arrErrorCodes","entrySearch","ConfigView","props","onDirtyChange","push","useToast","originalConfig","setOriginalConfig","useState","setFormState","loading","setLoading","saving","setSaving","loadConfig","useCallback","getConfig","useEffect","handleFieldChange","parsed","arrSections","useMemo","groupedArrSections","groups","sorted","radarr","sonarr","lidarr","others","keyLower","activeArrKey","setActiveArrKey","isSettingsOpen","setSettingsOpen","isWebSettingsOpen","setWebSettingsOpen","isQbitOpen","setQbitOpen","isDirty","setDirty","flattenedOriginal","flattenedCurrent","liveKeys","dirty","originalValue","handleBeforeUnload","event","handleKeyDown","style","originalOverflow","addArrInstance","defaults","deleteArrInstance","handleRenameSection","oldName","rawNewName","newName","handleSubmit","validationErrors","formatted","message","changes","configReloaded","reloadType","affectedInstances","updateConfig","cacheNames","cacheName","jsxs","jsx","Fragment","ConfigSummaryCard","group","IconImage","category","managed","canDelete","ConfigureIcon","ArrInstanceModal","SimpleConfigModal","title","description","onConfigure","FieldGroup","onChange","onRenameSection","defaultOpen","qualityProfiles","sectionKey","sectionName","mappings","mappingEntries","hasCredentials","hasProfiles","handleAddMapping","nextMappings","handleUpdateMapping","oldKey","newKey","handleDeleteMapping","mainProfile","tempProfile","Select","option","trackers","handleAddTracker","nextTrackers","handleDeleteTracker","tracker","TrackerCard","renderedFields","expectedPrefix","SectionNameField","rawValue","isArrApiKey","fieldClassName","SecureField","val","isThemeField","displayValue","normalizedLower","o","theme","onDelete","trackerName","currentName","placeholder","onRename","commit","adjustedName","canRefresh","showValue","setShowValue","handleRefresh","RefreshIcon","keyName","onClose","testState","setTestState","setQualityProfiles","handleTestConnection","silent","arrType","testArrConnection","handleSave","e","CloseIcon","showLiveSettings","webUI","useWebUI"],"mappings":"+MACA,IAAIA,GAAU,OAAO,IAAI,eAAe,EACpCC,GAAY,OAAO,IAAI,iBAAiB,EACxCC,EAAc,OAAO,IAAI,aAAa,EAkC1C,SAASC,EAAIC,KAAUC,EAAM,CAM3B,MAAM,IAAI,MACR,8BAA8BD,CAAK,yCAAA,CAEvC,CAGA,IAAIE,GAAiB,OAAO,eAC5B,SAASC,EAAQC,EAAO,CACtB,MAAO,CAAC,CAACA,GAAS,CAAC,CAACA,EAAMN,CAAW,CACvC,CACA,SAASO,EAAYD,EAAO,CAC1B,OAAKA,EAEEE,GAAcF,CAAK,GAAK,MAAM,QAAQA,CAAK,GAAK,CAAC,CAACA,EAAMP,EAAS,GAAK,CAAC,CAACO,EAAM,cAAcP,EAAS,GAAKU,GAAMH,CAAK,GAAKI,GAAMJ,CAAK,EADnI,EAEX,CACA,IAAIK,GAAmB,OAAO,UAAU,YAAY,SAAA,EAChDC,OAAwC,QAC5C,SAASJ,GAAcF,EAAO,CAC5B,GAAI,CAACA,GAAS,OAAOA,GAAU,SAC7B,MAAO,GACT,MAAMO,EAAQ,OAAO,eAAeP,CAAK,EACzC,GAAIO,IAAU,MAAQA,IAAU,OAAO,UACrC,MAAO,GACT,MAAMC,EAAO,OAAO,eAAe,KAAKD,EAAO,aAAa,GAAKA,EAAM,YACvE,GAAIC,IAAS,OACX,MAAO,GACT,GAAI,OAAOA,GAAS,WAClB,MAAO,GACT,IAAIC,EAAaH,GAAkB,IAAIE,CAAI,EAC3C,OAAIC,IAAe,SACjBA,EAAa,SAAS,SAAS,KAAKD,CAAI,EACxCF,GAAkB,IAAIE,EAAMC,CAAU,GAEjCA,IAAeJ,EACxB,CAMA,SAASK,GAAKC,EAAKC,EAAMC,EAAS,GAAM,CAClCC,GAAYH,CAAG,IAAM,GACVE,EAAS,QAAQ,QAAQF,CAAG,EAAI,OAAO,KAAKA,CAAG,GACvD,QAASI,GAAQ,CACpBH,EAAKG,EAAKJ,EAAII,CAAG,EAAGJ,CAAG,CACzB,CAAC,EAEDA,EAAI,QAAQ,CAACK,EAAOC,IAAUL,EAAKK,EAAOD,EAAOL,CAAG,CAAC,CAEzD,CACA,SAASG,GAAYI,EAAO,CAC1B,MAAMC,EAAQD,EAAMxB,CAAW,EAC/B,OAAOyB,EAAQA,EAAM,MAAQ,MAAM,QAAQD,CAAK,EAAI,EAAgBf,GAAMe,CAAK,EAAI,EAAcd,GAAMc,CAAK,EAAI,EAAc,CAChI,CACA,SAASE,GAAIF,EAAOG,EAAM,CACxB,OAAOP,GAAYI,CAAK,IAAM,EAAcA,EAAM,IAAIG,CAAI,EAAI,OAAO,UAAU,eAAe,KAAKH,EAAOG,CAAI,CAChH,CAIA,SAASC,GAAIJ,EAAOK,EAAgBvB,EAAO,CACzC,MAAMwB,EAAIV,GAAYI,CAAK,EACvBM,IAAM,EACRN,EAAM,IAAIK,EAAgBvB,CAAK,EACxBwB,IAAM,EACbN,EAAM,IAAIlB,CAAK,EAEfkB,EAAMK,CAAc,EAAIvB,CAC5B,CACA,SAASyB,GAAGC,EAAGC,EAAG,CAChB,OAAID,IAAMC,EACDD,IAAM,GAAK,EAAIA,IAAM,EAAIC,EAEzBD,IAAMA,GAAKC,IAAMA,CAE5B,CACA,SAASxB,GAAMyB,EAAQ,CACrB,OAAOA,aAAkB,GAC3B,CACA,SAASxB,GAAMwB,EAAQ,CACrB,OAAOA,aAAkB,GAC3B,CACA,SAASC,EAAOV,EAAO,CACrB,OAAOA,EAAM,OAASA,EAAM,KAC9B,CACA,SAASW,GAAYC,EAAMlB,EAAQ,CACjC,GAAIV,GAAM4B,CAAI,EACZ,OAAO,IAAI,IAAIA,CAAI,EAErB,GAAI3B,GAAM2B,CAAI,EACZ,OAAO,IAAI,IAAIA,CAAI,EAErB,GAAI,MAAM,QAAQA,CAAI,EACpB,OAAO,MAAM,UAAU,MAAM,KAAKA,CAAI,EACxC,MAAMC,EAAU9B,GAAc6B,CAAI,EAClC,GAAIlB,IAAW,IAAQA,IAAW,cAAgB,CAACmB,EAAS,CAC1D,MAAMC,EAAc,OAAO,0BAA0BF,CAAI,EACzD,OAAOE,EAAYvC,CAAW,EAC9B,IAAIwC,EAAO,QAAQ,QAAQD,CAAW,EACtC,QAASE,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAAK,CACpC,MAAMpB,EAAMmB,EAAKC,CAAC,EACZC,EAAOH,EAAYlB,CAAG,EACxBqB,EAAK,WAAa,KACpBA,EAAK,SAAW,GAChBA,EAAK,aAAe,KAElBA,EAAK,KAAOA,EAAK,OACnBH,EAAYlB,CAAG,EAAI,CACjB,aAAc,GACd,SAAU,GAEV,WAAYqB,EAAK,WACjB,MAAOL,EAAKhB,CAAG,CAAA,EAErB,CACA,OAAO,OAAO,OAAOjB,GAAeiC,CAAI,EAAGE,CAAW,CACxD,KAAO,CACL,MAAM1B,EAAQT,GAAeiC,CAAI,EACjC,GAAIxB,IAAU,MAAQyB,EACpB,MAAO,CAAE,GAAGD,CAAA,EAEd,MAAMpB,EAAM,OAAO,OAAOJ,CAAK,EAC/B,OAAO,OAAO,OAAOI,EAAKoB,CAAI,CAChC,CACF,CACA,SAASM,GAAO1B,EAAK2B,EAAO,GAAO,CACjC,OAAIC,GAAS5B,CAAG,GAAKZ,EAAQY,CAAG,GAAK,CAACV,EAAYU,CAAG,IAEjDG,GAAYH,CAAG,EAAI,GACrB,OAAO,iBAAiBA,EAAK,CAC3B,IAAK6B,GACL,IAAKA,GACL,MAAOA,GACP,OAAQA,EAAA,CACT,EAEH,OAAO,OAAO7B,CAAG,EACb2B,GACF,OAAO,OAAO3B,CAAG,EAAE,QAASX,GAAUqC,GAAOrC,EAAO,EAAI,CAAC,GACpDW,CACT,CACA,SAAS8B,IAA8B,CACrC9C,EAAI,CAAC,CACP,CACA,IAAI6C,GAA2B,CAC7B,MAAOC,EACT,EACA,SAASF,GAAS5B,EAAK,CACrB,OAAIA,IAAQ,MAAQ,OAAOA,GAAQ,SAC1B,GACF,OAAO,SAASA,CAAG,CAC5B,CAGA,IAAI+B,GAAU,CAAA,EACd,SAASC,EAAUC,EAAW,CAC5B,MAAMC,EAASH,GAAQE,CAAS,EAChC,OAAKC,GACHlD,EAAI,EAAGiD,CAAS,EAEXC,CACT,CAOA,IAAIC,GACJ,SAASC,IAAkB,CACzB,OAAOD,EACT,CACA,SAASE,GAAYC,EAASC,EAAQ,CACpC,MAAO,CACL,QAAS,CAAA,EACT,QAAAD,EACA,OAAAC,EAGA,eAAgB,GAChB,mBAAoB,CAAA,CAExB,CACA,SAASC,GAAkBC,EAAOC,EAAe,CAC3CA,IACFV,EAAU,SAAS,EACnBS,EAAM,SAAW,CAAA,EACjBA,EAAM,gBAAkB,CAAA,EACxBA,EAAM,eAAiBC,EAE3B,CACA,SAASC,GAAYF,EAAO,CAC1BG,GAAWH,CAAK,EAChBA,EAAM,QAAQ,QAAQI,EAAW,EACjCJ,EAAM,QAAU,IAClB,CACA,SAASG,GAAWH,EAAO,CACrBA,IAAUN,KACZA,GAAeM,EAAM,QAEzB,CACA,SAASK,GAAWC,EAAQ,CAC1B,OAAOZ,GAAeE,GAAYF,GAAcY,CAAM,CACxD,CACA,SAASF,GAAYG,EAAO,CAC1B,MAAMxC,EAAQwC,EAAMjE,CAAW,EAC3ByB,EAAM,QAAU,GAAkBA,EAAM,QAAU,EACpDA,EAAM,QAAA,EAENA,EAAM,SAAW,EACrB,CAGA,SAASyC,GAAcC,EAAQT,EAAO,CACpCA,EAAM,mBAAqBA,EAAM,QAAQ,OACzC,MAAMU,EAAYV,EAAM,QAAQ,CAAC,EAEjC,OADmBS,IAAW,QAAUA,IAAWC,GAE7CA,EAAUpE,CAAW,EAAE,YACzB4D,GAAYF,CAAK,EACjBzD,EAAI,CAAC,GAEHM,EAAY4D,CAAM,IACpBA,EAASE,GAASX,EAAOS,CAAM,EAC1BT,EAAM,SACTY,GAAYZ,EAAOS,CAAM,GAEzBT,EAAM,UACRT,EAAU,SAAS,EAAE,4BACnBmB,EAAUpE,CAAW,EAAE,MACvBmE,EACAT,EAAM,SACNA,EAAM,eAAA,GAIVS,EAASE,GAASX,EAAOU,EAAW,CAAA,CAAE,EAExCR,GAAYF,CAAK,EACbA,EAAM,UACRA,EAAM,eAAeA,EAAM,SAAUA,EAAM,eAAe,EAErDS,IAAWrE,GAAUqE,EAAS,MACvC,CACA,SAASE,GAASE,EAAWjE,EAAOkE,EAAM,CACxC,GAAI3B,GAASvC,CAAK,EAChB,OAAOA,EACT,MAAMmE,EAAqBF,EAAU,OAAO,yBAAA,EACtC9C,EAAQnB,EAAMN,CAAW,EAC/B,GAAI,CAACyB,EACH,OAAAT,GACEV,EACA,CAACe,EAAKqD,IAAeC,GAAiBJ,EAAW9C,EAAOnB,EAAOe,EAAKqD,EAAYF,CAAI,EACpFC,CAAA,EAEKnE,EAET,GAAImB,EAAM,SAAW8C,EACnB,OAAOjE,EACT,GAAI,CAACmB,EAAM,UACT,OAAA6C,GAAYC,EAAW9C,EAAM,MAAO,EAAI,EACjCA,EAAM,MAEf,GAAI,CAACA,EAAM,WAAY,CACrBA,EAAM,WAAa,GACnBA,EAAM,OAAO,qBACb,MAAM0C,EAAS1C,EAAM,MACrB,IAAImD,EAAaT,EACbU,EAAS,GACTpD,EAAM,QAAU,IAClBmD,EAAa,IAAI,IAAIT,CAAM,EAC3BA,EAAO,MAAA,EACPU,EAAS,IAEX7D,GACE4D,EACA,CAACvD,EAAKqD,IAAeC,GACnBJ,EACA9C,EACA0C,EACA9C,EACAqD,EACAF,EACAK,CAAA,EAEFJ,CAAA,EAEFH,GAAYC,EAAWJ,EAAQ,EAAK,EAChCK,GAAQD,EAAU,UACpBtB,EAAU,SAAS,EAAE,iBACnBxB,EACA+C,EACAD,EAAU,SACVA,EAAU,eAAA,CAGhB,CACA,OAAO9C,EAAM,KACf,CACA,SAASkD,GAAiBJ,EAAWO,EAAaC,EAAcpD,EAAM+C,EAAYM,EAAUC,EAAa,CAIvG,GAHIP,GAAc,MAGd,OAAOA,GAAe,UAAY,CAACO,EACrC,OAEF,MAAMC,EAAgBrC,GAAS6B,CAAU,EACzC,GAAI,EAAAQ,GAAiB,CAACD,GAKtB,IAAI5E,EAAQqE,CAAU,EAAG,CACvB,MAAMF,EAAOQ,GAAYF,GAAeA,EAAY,QAAU,GAC9D,CAACpD,GAAIoD,EAAY,UAAWnD,CAAI,EAAIqD,EAAS,OAAOrD,CAAI,EAAI,OACtDwD,EAAMd,GAASE,EAAWG,EAAYF,CAAI,EAEhD,GADA5C,GAAImD,EAAcpD,EAAMwD,CAAG,EACvB9E,EAAQ8E,CAAG,EACbZ,EAAU,eAAiB,OAE3B,OACJ,MAAWU,GACTF,EAAa,IAAIL,CAAU,EAE7B,GAAInE,EAAYmE,CAAU,GAAK,CAACQ,EAAe,CAI7C,GAHI,CAACX,EAAU,OAAO,aAAeA,EAAU,mBAAqB,GAGhEO,GAAeA,EAAY,OAASA,EAAY,MAAMnD,CAAI,IAAM+C,GAAcQ,EAChF,OAEFb,GAASE,EAAWG,CAAU,GACzB,CAACI,GAAe,CAACA,EAAY,OAAO,UAAY,OAAOnD,GAAS,WAAalB,GAAMsE,CAAY,EAAIA,EAAa,IAAIpD,CAAI,EAAI,OAAO,UAAU,qBAAqB,KAAKoD,EAAcpD,CAAI,IAC5L2C,GAAYC,EAAWG,CAAU,CACrC,EACF,CACA,SAASJ,GAAYZ,EAAOpD,EAAOsC,EAAO,GAAO,CAC3C,CAACc,EAAM,SAAWA,EAAM,OAAO,aAAeA,EAAM,gBACtDf,GAAOrC,EAAOsC,CAAI,CAEtB,CAGA,SAASwC,GAAiB/C,EAAMgD,EAAQ,CACtC,MAAMC,EAAU,MAAM,QAAQjD,CAAI,EAC5BZ,EAAQ,CACZ,MAAO6D,EAAU,EAAgB,EAEjC,OAAQD,EAASA,EAAO,OAAShC,GAAA,EAEjC,UAAW,GAEX,WAAY,GAEZ,UAAW,CAAA,EAEX,QAASgC,EAET,MAAOhD,EAEP,OAAQ,KAGR,MAAO,KAEP,QAAS,KACT,UAAW,EAAA,EAEb,IAAIH,EAAST,EACT8D,EAAQC,GACRF,IACFpD,EAAS,CAACT,CAAK,EACf8D,EAAQE,IAEV,KAAM,CAAE,OAAAC,EAAQ,MAAAC,CAAA,EAAU,MAAM,UAAUzD,EAAQqD,CAAK,EACvD,OAAA9D,EAAM,OAASkE,EACflE,EAAM,QAAUiE,EACTC,CACT,CACA,IAAIH,GAAc,CAChB,IAAI/D,EAAOE,EAAM,CACf,GAAIA,IAAS3B,EACX,OAAOyB,EACT,MAAMmE,EAASzD,EAAOV,CAAK,EAC3B,GAAI,CAACC,GAAIkE,EAAQjE,CAAI,EACnB,OAAOkE,GAAkBpE,EAAOmE,EAAQjE,CAAI,EAE9C,MAAMrB,EAAQsF,EAAOjE,CAAI,EACzB,OAAIF,EAAM,YAAc,CAAClB,EAAYD,CAAK,EACjCA,EAELA,IAAUwF,GAAKrE,EAAM,MAAOE,CAAI,GAClCoE,GAAYtE,CAAK,EACVA,EAAM,MAAME,CAAI,EAAIqE,GAAY1F,EAAOmB,CAAK,GAE9CnB,CACT,EACA,IAAImB,EAAOE,EAAM,CACf,OAAOA,KAAQQ,EAAOV,CAAK,CAC7B,EACA,QAAQA,EAAO,CACb,OAAO,QAAQ,QAAQU,EAAOV,CAAK,CAAC,CACtC,EACA,IAAIA,EAAOE,EAAMrB,EAAO,CACtB,MAAMoC,EAAOuD,GAAuB9D,EAAOV,CAAK,EAAGE,CAAI,EACvD,GAAIe,GAAM,IACR,OAAAA,EAAK,IAAI,KAAKjB,EAAM,OAAQnB,CAAK,EAC1B,GAET,GAAI,CAACmB,EAAM,UAAW,CACpB,MAAMyE,EAAWJ,GAAK3D,EAAOV,CAAK,EAAGE,CAAI,EACnCwE,EAAeD,IAAWlG,CAAW,EAC3C,GAAImG,GAAgBA,EAAa,QAAU7F,EACzC,OAAAmB,EAAM,MAAME,CAAI,EAAIrB,EACpBmB,EAAM,UAAUE,CAAI,EAAI,GACjB,GAET,GAAII,GAAGzB,EAAO4F,CAAQ,IAAM5F,IAAU,QAAUoB,GAAID,EAAM,MAAOE,CAAI,GACnE,MAAO,GACToE,GAAYtE,CAAK,EACjB2E,GAAY3E,CAAK,CACnB,CACA,OAAIA,EAAM,MAAME,CAAI,IAAMrB,IACzBA,IAAU,QAAUqB,KAAQF,EAAM,QACnC,OAAO,MAAMnB,CAAK,GAAK,OAAO,MAAMmB,EAAM,MAAME,CAAI,CAAC,IAErDF,EAAM,MAAME,CAAI,EAAIrB,EACpBmB,EAAM,UAAUE,CAAI,EAAI,IACjB,EACT,EACA,eAAeF,EAAOE,EAAM,CAC1B,OAAImE,GAAKrE,EAAM,MAAOE,CAAI,IAAM,QAAUA,KAAQF,EAAM,OACtDA,EAAM,UAAUE,CAAI,EAAI,GACxBoE,GAAYtE,CAAK,EACjB2E,GAAY3E,CAAK,GAEjB,OAAOA,EAAM,UAAUE,CAAI,EAEzBF,EAAM,OACR,OAAOA,EAAM,MAAME,CAAI,EAElB,EACT,EAGA,yBAAyBF,EAAOE,EAAM,CACpC,MAAM0E,EAAQlE,EAAOV,CAAK,EACpBiB,EAAO,QAAQ,yBAAyB2D,EAAO1E,CAAI,EACzD,OAAKe,GAEE,CACL,SAAU,GACV,aAAcjB,EAAM,QAAU,GAAiBE,IAAS,SACxD,WAAYe,EAAK,WACjB,MAAO2D,EAAM1E,CAAI,CAAA,CAErB,EACA,gBAAiB,CACf1B,EAAI,EAAE,CACR,EACA,eAAewB,EAAO,CACpB,OAAOrB,GAAeqB,EAAM,KAAK,CACnC,EACA,gBAAiB,CACfxB,EAAI,EAAE,CACR,CACF,EACIwF,GAAa,CAAA,EACjBzE,GAAKwE,GAAa,CAACnE,EAAKiF,IAAO,CAC7Bb,GAAWpE,CAAG,EAAI,UAAW,CAC3B,iBAAU,CAAC,EAAI,UAAU,CAAC,EAAE,CAAC,EACtBiF,EAAG,MAAM,KAAM,SAAS,CACjC,CACF,CAAC,EACDb,GAAW,eAAiB,SAAShE,EAAOE,EAAM,CAGhD,OAAO8D,GAAW,IAAI,KAAK,KAAMhE,EAAOE,EAAM,MAAM,CACtD,EACA8D,GAAW,IAAM,SAAShE,EAAOE,EAAMrB,EAAO,CAG5C,OAAOkF,GAAY,IAAI,KAAK,KAAM/D,EAAM,CAAC,EAAGE,EAAMrB,EAAOmB,EAAM,CAAC,CAAC,CACnE,EACA,SAASqE,GAAK7B,EAAOtC,EAAM,CACzB,MAAMF,EAAQwC,EAAMjE,CAAW,EAE/B,OADeyB,EAAQU,EAAOV,CAAK,EAAIwC,GACzBtC,CAAI,CACpB,CACA,SAASkE,GAAkBpE,EAAOmE,EAAQjE,EAAM,CAC9C,MAAMe,EAAOuD,GAAuBL,EAAQjE,CAAI,EAChD,OAAOe,EAAO,UAAWA,EAAOA,EAAK,MAGnCA,EAAK,KAAK,KAAKjB,EAAM,MAAM,EACzB,MACN,CACA,SAASwE,GAAuBL,EAAQjE,EAAM,CAC5C,GAAI,EAAEA,KAAQiE,GACZ,OACF,IAAI/E,EAAQT,GAAewF,CAAM,EACjC,KAAO/E,GAAO,CACZ,MAAM6B,EAAO,OAAO,yBAAyB7B,EAAOc,CAAI,EACxD,GAAIe,EACF,OAAOA,EACT7B,EAAQT,GAAeS,CAAK,CAC9B,CAEF,CACA,SAASuF,GAAY3E,EAAO,CACrBA,EAAM,YACTA,EAAM,UAAY,GACdA,EAAM,SACR2E,GAAY3E,EAAM,OAAO,EAG/B,CACA,SAASsE,GAAYtE,EAAO,CACrBA,EAAM,QACTA,EAAM,MAAQW,GACZX,EAAM,MACNA,EAAM,OAAO,OAAO,qBAAA,EAG1B,CAGA,IAAI8E,GAAS,KAAM,CACjB,YAAYC,EAAQ,CAClB,KAAK,YAAc,GACnB,KAAK,sBAAwB,GAC7B,KAAK,oBAAsB,GAoB3B,KAAK,QAAU,CAACnE,EAAMoE,EAAQ9C,IAAkB,CAC9C,GAAI,OAAOtB,GAAS,YAAc,OAAOoE,GAAW,WAAY,CAC9D,MAAMC,EAAcD,EACpBA,EAASpE,EACT,MAAMsE,EAAO,KACb,OAAO,SAAwBC,EAAQF,KAAgBvG,EAAM,CAC3D,OAAOwG,EAAK,QAAQC,EAAQ3C,GAAUwC,EAAO,KAAK,KAAMxC,EAAO,GAAG9D,CAAI,CAAC,CACzE,CACF,CACI,OAAOsG,GAAW,YACpBxG,EAAI,CAAC,EACH0D,IAAkB,QAAU,OAAOA,GAAkB,YACvD1D,EAAI,CAAC,EACP,IAAIkE,EACJ,GAAI5D,EAAY8B,CAAI,EAAG,CACrB,MAAMqB,EAAQK,GAAW,IAAI,EACvB4B,EAAQK,GAAY3D,EAAM,MAAM,EACtC,IAAIwE,EAAW,GACf,GAAI,CACF1C,EAASsC,EAAOd,CAAK,EACrBkB,EAAW,EACb,QAAA,CACMA,EACFjD,GAAYF,CAAK,EAEjBG,GAAWH,CAAK,CACpB,CACA,OAAAD,GAAkBC,EAAOC,CAAa,EAC/BO,GAAcC,EAAQT,CAAK,CACpC,SAAW,CAACrB,GAAQ,OAAOA,GAAS,SAAU,CAQ5C,GAPA8B,EAASsC,EAAOpE,CAAI,EAChB8B,IAAW,SACbA,EAAS9B,GACP8B,IAAWrE,KACbqE,EAAS,QACP,KAAK,aACPxB,GAAOwB,EAAQ,EAAI,EACjBR,EAAe,CACjB,MAAMmD,EAAI,CAAA,EACJC,EAAK,CAAA,EACX9D,EAAU,SAAS,EAAE,4BAA4BZ,EAAM8B,EAAQ2C,EAAGC,CAAE,EACpEpD,EAAcmD,EAAGC,CAAE,CACrB,CACA,OAAO5C,CACT,MACElE,EAAI,EAAGoC,CAAI,CACf,EACA,KAAK,mBAAqB,CAACA,EAAMoE,IAAW,CAC1C,GAAI,OAAOpE,GAAS,WAClB,MAAO,CAACZ,KAAUtB,IAAS,KAAK,mBAAmBsB,EAAQwC,GAAU5B,EAAK4B,EAAO,GAAG9D,CAAI,CAAC,EAE3F,IAAI6G,EAASC,EAKb,MAAO,CAJQ,KAAK,QAAQ5E,EAAMoE,EAAQ,CAACK,EAAGC,IAAO,CACnDC,EAAUF,EACVG,EAAiBF,CACnB,CAAC,EACeC,EAASC,CAAc,CACzC,EACI,OAAOT,GAAQ,YAAe,WAChC,KAAK,cAAcA,EAAO,UAAU,EAClC,OAAOA,GAAQ,sBAAyB,WAC1C,KAAK,wBAAwBA,EAAO,oBAAoB,EACtD,OAAOA,GAAQ,oBAAuB,WACxC,KAAK,sBAAsBA,EAAO,kBAAkB,CACxD,CACA,YAAYnE,EAAM,CACX9B,EAAY8B,CAAI,GACnBpC,EAAI,CAAC,EACHI,EAAQgC,CAAI,IACdA,EAAO6E,GAAQ7E,CAAI,GACrB,MAAMqB,EAAQK,GAAW,IAAI,EACvB4B,EAAQK,GAAY3D,EAAM,MAAM,EACtC,OAAAsD,EAAM3F,CAAW,EAAE,UAAY,GAC/B6D,GAAWH,CAAK,EACTiC,CACT,CACA,YAAY1B,EAAON,EAAe,CAChC,MAAMlC,EAAQwC,GAASA,EAAMjE,CAAW,GACpC,CAACyB,GAAS,CAACA,EAAM,YACnBxB,EAAI,CAAC,EACP,KAAM,CAAE,OAAQyD,CAAA,EAAUjC,EAC1B,OAAAgC,GAAkBC,EAAOC,CAAa,EAC/BO,GAAc,OAAQR,CAAK,CACpC,CAMA,cAAcpD,EAAO,CACnB,KAAK,YAAcA,CACrB,CAMA,wBAAwBA,EAAO,CAC7B,KAAK,sBAAwBA,CAC/B,CAOA,sBAAsBA,EAAO,CAC3B,KAAK,oBAAsBA,CAC7B,CACA,0BAA2B,CACzB,OAAO,KAAK,mBACd,CACA,aAAa+B,EAAM2E,EAAS,CAC1B,IAAIvE,EACJ,IAAKA,EAAIuE,EAAQ,OAAS,EAAGvE,GAAK,EAAGA,IAAK,CACxC,MAAM0E,EAAQH,EAAQvE,CAAC,EACvB,GAAI0E,EAAM,KAAK,SAAW,GAAKA,EAAM,KAAO,UAAW,CACrD9E,EAAO8E,EAAM,MACb,KACF,CACF,CACI1E,EAAI,KACNuE,EAAUA,EAAQ,MAAMvE,EAAI,CAAC,GAE/B,MAAM2E,EAAmBnE,EAAU,SAAS,EAAE,cAC9C,OAAI5C,EAAQgC,CAAI,EACP+E,EAAiB/E,EAAM2E,CAAO,EAEhC,KAAK,QACV3E,EACC4B,GAAUmD,EAAiBnD,EAAO+C,CAAO,CAAA,CAE9C,CACF,EACA,SAAShB,GAAY1F,EAAO+E,EAAQ,CAClC,MAAMpB,EAAQxD,GAAMH,CAAK,EAAI2C,EAAU,QAAQ,EAAE,UAAU3C,EAAO+E,CAAM,EAAI3E,GAAMJ,CAAK,EAAI2C,EAAU,QAAQ,EAAE,UAAU3C,EAAO+E,CAAM,EAAID,GAAiB9E,EAAO+E,CAAM,EAExK,OADcA,EAASA,EAAO,OAAShC,GAAA,GACjC,QAAQ,KAAKY,CAAK,EACjBA,CACT,CAGA,SAASiD,GAAQ5G,EAAO,CACtB,OAAKD,EAAQC,CAAK,GAChBL,EAAI,GAAIK,CAAK,EACR+G,GAAY/G,CAAK,CAC1B,CACA,SAAS+G,GAAY/G,EAAO,CAC1B,GAAI,CAACC,EAAYD,CAAK,GAAKuC,GAASvC,CAAK,EACvC,OAAOA,EACT,MAAMmB,EAAQnB,EAAMN,CAAW,EAC/B,IAAIsH,EACAnG,EAAS,GACb,GAAIM,EAAO,CACT,GAAI,CAACA,EAAM,UACT,OAAOA,EAAM,MACfA,EAAM,WAAa,GACnB6F,EAAOlF,GAAY9B,EAAOmB,EAAM,OAAO,OAAO,qBAAqB,EACnEN,EAASM,EAAM,OAAO,OAAO,yBAAA,CAC/B,MACE6F,EAAOlF,GAAY9B,EAAO,EAAI,EAEhC,OAAAU,GACEsG,EACA,CAACjG,EAAKqD,IAAe,CACnB9C,GAAI0F,EAAMjG,EAAKgG,GAAY3C,CAAU,CAAC,CACxC,EACAvD,CAAA,EAEEM,IACFA,EAAM,WAAa,IAEd6F,CACT,CAyeA,IAAIC,GAAQ,IAAIhB,GACZiB,GAAUD,GAAM,6CCnuCpBE,GAAiB,SAASC,EAAMC,EAAGC,EAAG,CACpC,GAAID,IAAMC,EAAG,MAAO,GAEpB,GAAID,GAAKC,GAAK,OAAOD,GAAK,UAAY,OAAOC,GAAK,SAAU,CAC1D,GAAID,EAAE,cAAgBC,EAAE,YAAa,MAAO,GAE5C,IAAIC,EAAQ,EAAGrF,EACf,GAAI,MAAM,QAAQmF,CAAC,EAAG,CAEpB,GADAE,EAASF,EAAE,OACPE,GAAUD,EAAE,OAAQ,MAAO,GAC/B,IAAK,EAAIC,EAAQ,MAAQ,GACvB,GAAI,CAACH,EAAMC,EAAE,CAAC,EAAGC,EAAE,CAAC,CAAC,EAAG,MAAO,GACjC,MAAO,EACb,CAII,GAAID,EAAE,cAAgB,OAAQ,OAAOA,EAAE,SAAWC,EAAE,QAAUD,EAAE,QAAUC,EAAE,MAC5E,GAAID,EAAE,UAAY,OAAO,UAAU,QAAS,OAAOA,EAAE,QAAO,IAAOC,EAAE,QAAO,EAC5E,GAAID,EAAE,WAAa,OAAO,UAAU,SAAU,OAAOA,EAAE,SAAQ,IAAOC,EAAE,SAAQ,EAIhF,GAFApF,EAAO,OAAO,KAAKmF,CAAC,EACpBE,EAASrF,EAAK,OACVqF,IAAW,OAAO,KAAKD,CAAC,EAAE,OAAQ,MAAO,GAE7C,IAAK,EAAIC,EAAQ,MAAQ,GACvB,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKD,EAAGpF,EAAK,CAAC,CAAC,EAAG,MAAO,GAEhE,IAAK,EAAIqF,EAAQ,MAAQ,GAAI,CAC3B,IAAIxG,EAAMmB,EAAK,CAAC,EAEhB,GAAI,CAACkF,EAAMC,EAAEtG,CAAG,EAAGuG,EAAEvG,CAAG,CAAC,EAAG,MAAO,EACzC,CAEI,MAAO,EACX,CAGE,OAAOsG,IAAIA,GAAKC,IAAIA,CACtB,kCC5CA,IAAIE,GAAa,OAAO,QAAU,UAAY,QAAU,OAAO,SAAW,QAAU,OCEhFC,GAAW,OAAO,MAAQ,UAAY,MAAQ,KAAK,SAAW,QAAU,KAGxEC,GAAOF,IAAcC,IAAY,SAAS,aAAa,EAAC,ECHxDE,EAASD,GAAK,OCAdE,GAAc,OAAO,UAGrBC,GAAiBD,GAAY,eAO7BE,GAAuBF,GAAY,SAGnCG,GAAiBJ,EAASA,EAAO,YAAc,OASnD,SAASK,GAAUhI,EAAO,CACxB,IAAIiI,EAAQJ,GAAe,KAAK7H,EAAO+H,EAAc,EACjDG,EAAMlI,EAAM+H,EAAc,EAE9B,GAAI,CACF/H,EAAM+H,EAAc,EAAI,OACxB,IAAII,EAAW,EACjB,MAAY,CAAC,CAEb,IAAItE,EAASiE,GAAqB,KAAK9H,CAAK,EAC5C,OAAImI,IACEF,EACFjI,EAAM+H,EAAc,EAAIG,EAExB,OAAOlI,EAAM+H,EAAc,GAGxBlE,CACT,CC1CA,IAAI+D,GAAc,OAAO,UAOrBE,GAAuBF,GAAY,SASvC,SAASQ,GAAepI,EAAO,CAC7B,OAAO8H,GAAqB,KAAK9H,CAAK,CACxC,CCdA,IAAIqI,GAAU,gBACVC,GAAe,qBAGfP,GAAiBJ,EAASA,EAAO,YAAc,OASnD,SAASY,GAAWvI,EAAO,CACzB,OAAIA,GAAS,KACJA,IAAU,OAAYsI,GAAeD,GAEtCN,IAAkBA,MAAkB,OAAO/H,CAAK,EACpDgI,GAAUhI,CAAK,EACfoI,GAAepI,CAAK,CAC1B,CCDA,SAASwI,GAAaxI,EAAO,CAC3B,OAAOA,GAAS,MAAQ,OAAOA,GAAS,QAC1C,CCtBA,IAAIyI,GAAY,kBAmBhB,SAASC,GAAS1I,EAAO,CACvB,OAAO,OAAOA,GAAS,UACpBwI,GAAaxI,CAAK,GAAKuI,GAAWvI,CAAK,GAAKyI,EACjD,CCjBA,SAASE,GAASC,EAAOC,EAAU,CAKjC,QAJI5H,EAAQ,GACRsG,EAASqB,GAAS,KAAO,EAAIA,EAAM,OACnC/E,EAAS,MAAM0D,CAAM,EAElB,EAAEtG,EAAQsG,GACf1D,EAAO5C,CAAK,EAAI4H,EAASD,EAAM3H,CAAK,EAAGA,EAAO2H,CAAK,EAErD,OAAO/E,CACT,CCKA,IAAImB,GAAU,MAAM,QCdhB8D,GAAcnB,EAASA,EAAO,UAAY,OAC1CoB,GAAiBD,GAAcA,GAAY,SAAW,OAU1D,SAASE,GAAahJ,EAAO,CAE3B,GAAI,OAAOA,GAAS,SAClB,OAAOA,EAET,GAAIgF,GAAQhF,CAAK,EAEf,OAAO2I,GAAS3I,EAAOgJ,EAAY,EAAI,GAEzC,GAAIN,GAAS1I,CAAK,EAChB,OAAO+I,GAAiBA,GAAe,KAAK/I,CAAK,EAAI,GAEvD,IAAI6D,EAAU7D,EAAQ,GACtB,OAAQ6D,GAAU,KAAQ,EAAI7D,GAAU,KAAa,KAAO6D,CAC9D,CCTA,SAASoF,GAASjJ,EAAO,CACvB,IAAIkJ,EAAO,OAAOlJ,EAClB,OAAOA,GAAS,OAASkJ,GAAQ,UAAYA,GAAQ,WACvD,CCxBA,IAAIC,GAAW,yBACXC,GAAU,oBACVC,GAAS,6BACTC,GAAW,iBAmBf,SAASC,GAAWvJ,EAAO,CACzB,GAAI,CAACiJ,GAASjJ,CAAK,EACjB,MAAO,GAIT,IAAIkI,EAAMK,GAAWvI,CAAK,EAC1B,OAAOkI,GAAOkB,IAAWlB,GAAOmB,IAAUnB,GAAOiB,IAAYjB,GAAOoB,EACtE,CC/BA,IAAIE,GAAa9B,GAAK,oBAAoB,ECAtC+B,IAAc,UAAW,CAC3B,IAAIC,EAAM,SAAS,KAAKF,IAAcA,GAAW,MAAQA,GAAW,KAAK,UAAY,EAAE,EACvF,OAAOE,EAAO,iBAAmBA,EAAO,EAC1C,KASA,SAASC,GAASC,EAAM,CACtB,MAAO,CAAC,CAACH,IAAeA,MAAcG,CACxC,CChBA,IAAIC,GAAY,SAAS,UAGrBC,GAAeD,GAAU,SAS7B,SAASE,GAASH,EAAM,CACtB,GAAIA,GAAQ,KAAM,CAChB,GAAI,CACF,OAAOE,GAAa,KAAKF,CAAI,CAC/B,MAAY,CAAC,CACb,GAAI,CACF,OAAQA,EAAO,EACjB,MAAY,CAAC,CACf,CACA,MAAO,EACT,CCdA,IAAII,GAAe,sBAGfC,GAAe,8BAGfJ,GAAY,SAAS,UACrBjC,GAAc,OAAO,UAGrBkC,GAAeD,GAAU,SAGzBhC,GAAiBD,GAAY,eAG7BsC,GAAa,OAAO,IACtBJ,GAAa,KAAKjC,EAAc,EAAE,QAAQmC,GAAc,MAAM,EAC7D,QAAQ,yDAA0D,OAAO,EAAI,GAChF,EAUA,SAASG,GAAanK,EAAO,CAC3B,GAAI,CAACiJ,GAASjJ,CAAK,GAAK2J,GAAS3J,CAAK,EACpC,MAAO,GAET,IAAIoK,EAAUb,GAAWvJ,CAAK,EAAIkK,GAAaD,GAC/C,OAAOG,EAAQ,KAAKL,GAAS/J,CAAK,CAAC,CACrC,CCpCA,SAASqK,GAASC,EAAQvJ,EAAK,CAC7B,OAAoCuJ,IAAOvJ,CAAG,CAChD,CCCA,SAASwJ,GAAUD,EAAQvJ,EAAK,CAC9B,IAAIf,EAAQqK,GAASC,EAAQvJ,CAAG,EAChC,OAAOoJ,GAAanK,CAAK,EAAIA,EAAQ,MACvC,CCZA,IAAIwK,IAAkB,UAAW,CAC/B,GAAI,CACF,IAAIZ,EAAOW,GAAU,OAAQ,gBAAgB,EAC7C,OAAAX,EAAK,CAAA,EAAI,GAAI,EAAE,EACRA,CACT,MAAY,CAAC,CACf,KCPIa,GAAmB,iBAGnBC,GAAW,mBAUf,SAASC,GAAQ3K,EAAOuH,EAAQ,CAC9B,IAAI2B,EAAO,OAAOlJ,EAClB,OAAAuH,EAASA,GAAiBkD,GAEnB,CAAC,CAAClD,IACN2B,GAAQ,UACNA,GAAQ,UAAYwB,GAAS,KAAK1K,CAAK,IACrCA,EAAQ,IAAMA,EAAQ,GAAK,GAAKA,EAAQuH,CACjD,CCXA,SAASqD,GAAgBN,EAAQvJ,EAAKf,EAAO,CACvCe,GAAO,aAAeyJ,GACxBA,GAAeF,EAAQvJ,EAAK,CAC1B,aAAgB,GAChB,WAAc,GACd,MAASf,EACT,SAAY,EAClB,CAAK,EAEDsK,EAAOvJ,CAAG,EAAIf,CAElB,CCUA,SAAS6K,GAAG7K,EAAO8K,EAAO,CACxB,OAAO9K,IAAU8K,GAAU9K,IAAUA,GAAS8K,IAAUA,CAC1D,CC9BA,IAAIlD,GAAc,OAAO,UAGrBC,GAAiBD,GAAY,eAYjC,SAASmD,GAAYT,EAAQvJ,EAAKf,EAAO,CACvC,IAAIgL,EAAWV,EAAOvJ,CAAG,GACrB,EAAE8G,GAAe,KAAKyC,EAAQvJ,CAAG,GAAK8J,GAAGG,EAAUhL,CAAK,IACvDA,IAAU,QAAa,EAAEe,KAAOuJ,KACnCM,GAAgBN,EAAQvJ,EAAKf,CAAK,CAEtC,CCrBA,IAAIiL,GAAe,mDACfC,GAAgB,QAUpB,SAASC,GAAMnL,EAAOsK,EAAQ,CAC5B,GAAItF,GAAQhF,CAAK,EACf,MAAO,GAET,IAAIkJ,EAAO,OAAOlJ,EAClB,OAAIkJ,GAAQ,UAAYA,GAAQ,UAAYA,GAAQ,WAChDlJ,GAAS,MAAQ0I,GAAS1I,CAAK,EAC1B,GAEFkL,GAAc,KAAKlL,CAAK,GAAK,CAACiL,GAAa,KAAKjL,CAAK,GACzDsK,GAAU,MAAQtK,KAAS,OAAOsK,CAAM,CAC7C,CCvBA,IAAIc,GAAeb,GAAU,OAAQ,QAAQ,ECM7C,SAASc,IAAY,CACnB,KAAK,SAAWD,GAAeA,GAAa,IAAI,EAAI,CAAA,EACpD,KAAK,KAAO,CACd,CCFA,SAASE,GAAWvK,EAAK,CACvB,IAAI8C,EAAS,KAAK,IAAI9C,CAAG,GAAK,OAAO,KAAK,SAASA,CAAG,EACtD,YAAK,MAAQ8C,EAAS,EAAI,EACnBA,CACT,CCXA,IAAI0H,GAAiB,4BAGjB3D,GAAc,OAAO,UAGrBC,GAAiBD,GAAY,eAWjC,SAAS4D,GAAQzK,EAAK,CACpB,IAAI0K,EAAO,KAAK,SAChB,GAAIL,GAAc,CAChB,IAAIvH,EAAS4H,EAAK1K,CAAG,EACrB,OAAO8C,IAAW0H,GAAiB,OAAY1H,CACjD,CACA,OAAOgE,GAAe,KAAK4D,EAAM1K,CAAG,EAAI0K,EAAK1K,CAAG,EAAI,MACtD,CCxBA,IAAI6G,GAAc,OAAO,UAGrBC,GAAiBD,GAAY,eAWjC,SAAS8D,GAAQ3K,EAAK,CACpB,IAAI0K,EAAO,KAAK,SAChB,OAAOL,GAAgBK,EAAK1K,CAAG,IAAM,OAAa8G,GAAe,KAAK4D,EAAM1K,CAAG,CACjF,CCjBA,IAAIwK,GAAiB,4BAYrB,SAASI,GAAQ5K,EAAKf,EAAO,CAC3B,IAAIyL,EAAO,KAAK,SAChB,YAAK,MAAQ,KAAK,IAAI1K,CAAG,EAAI,EAAI,EACjC0K,EAAK1K,CAAG,EAAKqK,IAAgBpL,IAAU,OAAauL,GAAiBvL,EAC9D,IACT,CCPA,SAAS4L,EAAKC,EAAS,CACrB,IAAI5K,EAAQ,GACRsG,EAASsE,GAAW,KAAO,EAAIA,EAAQ,OAG3C,IADA,KAAK,MAAK,EACH,EAAE5K,EAAQsG,GAAQ,CACvB,IAAIvG,EAAQ6K,EAAQ5K,CAAK,EACzB,KAAK,IAAID,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC7B,CACF,CAGA4K,EAAK,UAAU,MAAQP,GACvBO,EAAK,UAAU,OAAYN,GAC3BM,EAAK,UAAU,IAAMJ,GACrBI,EAAK,UAAU,IAAMF,GACrBE,EAAK,UAAU,IAAMD,GCtBrB,SAASG,IAAiB,CACxB,KAAK,SAAW,CAAA,EAChB,KAAK,KAAO,CACd,CCAA,SAASC,GAAanD,EAAO7H,EAAK,CAEhC,QADIwG,EAASqB,EAAM,OACZrB,KACL,GAAIsD,GAAGjC,EAAMrB,CAAM,EAAE,CAAC,EAAGxG,CAAG,EAC1B,OAAOwG,EAGX,MAAO,EACT,CCfA,IAAIyE,GAAa,MAAM,UAGnBC,GAASD,GAAW,OAWxB,SAASE,GAAgBnL,EAAK,CAC5B,IAAI0K,EAAO,KAAK,SACZxK,EAAQ8K,GAAaN,EAAM1K,CAAG,EAElC,GAAIE,EAAQ,EACV,MAAO,GAET,IAAIkL,EAAYV,EAAK,OAAS,EAC9B,OAAIxK,GAASkL,EACXV,EAAK,IAAG,EAERQ,GAAO,KAAKR,EAAMxK,EAAO,CAAC,EAE5B,EAAE,KAAK,KACA,EACT,CCrBA,SAASmL,GAAarL,EAAK,CACzB,IAAI0K,EAAO,KAAK,SACZxK,EAAQ8K,GAAaN,EAAM1K,CAAG,EAElC,OAAOE,EAAQ,EAAI,OAAYwK,EAAKxK,CAAK,EAAE,CAAC,CAC9C,CCLA,SAASoL,GAAatL,EAAK,CACzB,OAAOgL,GAAa,KAAK,SAAUhL,CAAG,EAAI,EAC5C,CCDA,SAASuL,GAAavL,EAAKf,EAAO,CAChC,IAAIyL,EAAO,KAAK,SACZxK,EAAQ8K,GAAaN,EAAM1K,CAAG,EAElC,OAAIE,EAAQ,GACV,EAAE,KAAK,KACPwK,EAAK,KAAK,CAAC1K,EAAKf,CAAK,CAAC,GAEtByL,EAAKxK,CAAK,EAAE,CAAC,EAAIjB,EAEZ,IACT,CCVA,SAASuM,GAAUV,EAAS,CAC1B,IAAI5K,EAAQ,GACRsG,EAASsE,GAAW,KAAO,EAAIA,EAAQ,OAG3C,IADA,KAAK,MAAK,EACH,EAAE5K,EAAQsG,GAAQ,CACvB,IAAIvG,EAAQ6K,EAAQ5K,CAAK,EACzB,KAAK,IAAID,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC7B,CACF,CAGAuL,GAAU,UAAU,MAAQT,GAC5BS,GAAU,UAAU,OAAYL,GAChCK,GAAU,UAAU,IAAMH,GAC1BG,GAAU,UAAU,IAAMF,GAC1BE,GAAU,UAAU,IAAMD,GCzB1B,IAAIE,GAAMjC,GAAU7C,GAAM,KAAK,ECO/B,SAAS+E,IAAgB,CACvB,KAAK,KAAO,EACZ,KAAK,SAAW,CACd,KAAQ,IAAIb,EACZ,IAAO,IAAKY,IAAOD,IACnB,OAAU,IAAIX,CAClB,CACA,CCXA,SAASc,GAAU1M,EAAO,CACxB,IAAIkJ,EAAO,OAAOlJ,EAClB,OAAQkJ,GAAQ,UAAYA,GAAQ,UAAYA,GAAQ,UAAYA,GAAQ,UACvElJ,IAAU,YACVA,IAAU,IACjB,CCFA,SAAS2M,GAAWC,EAAK7L,EAAK,CAC5B,IAAI0K,EAAOmB,EAAI,SACf,OAAOF,GAAU3L,CAAG,EAChB0K,EAAK,OAAO1K,GAAO,SAAW,SAAW,MAAM,EAC/C0K,EAAK,GACX,CCJA,SAASoB,GAAe9L,EAAK,CAC3B,IAAI8C,EAAS8I,GAAW,KAAM5L,CAAG,EAAE,OAAUA,CAAG,EAChD,YAAK,MAAQ8C,EAAS,EAAI,EACnBA,CACT,CCJA,SAASiJ,GAAY/L,EAAK,CACxB,OAAO4L,GAAW,KAAM5L,CAAG,EAAE,IAAIA,CAAG,CACtC,CCFA,SAASgM,GAAYhM,EAAK,CACxB,OAAO4L,GAAW,KAAM5L,CAAG,EAAE,IAAIA,CAAG,CACtC,CCDA,SAASiM,GAAYjM,EAAKf,EAAO,CAC/B,IAAIyL,EAAOkB,GAAW,KAAM5L,CAAG,EAC3BkM,EAAOxB,EAAK,KAEhB,OAAAA,EAAK,IAAI1K,EAAKf,CAAK,EACnB,KAAK,MAAQyL,EAAK,MAAQwB,EAAO,EAAI,EAC9B,IACT,CCNA,SAASC,EAASrB,EAAS,CACzB,IAAI5K,EAAQ,GACRsG,EAASsE,GAAW,KAAO,EAAIA,EAAQ,OAG3C,IADA,KAAK,MAAK,EACH,EAAE5K,EAAQsG,GAAQ,CACvB,IAAIvG,EAAQ6K,EAAQ5K,CAAK,EACzB,KAAK,IAAID,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC7B,CACF,CAGAkM,EAAS,UAAU,MAAQT,GAC3BS,EAAS,UAAU,OAAYL,GAC/BK,EAAS,UAAU,IAAMJ,GACzBI,EAAS,UAAU,IAAMH,GACzBG,EAAS,UAAU,IAAMF,GC1BzB,IAAIG,GAAkB,sBA8CtB,SAASC,GAAQxD,EAAMyD,EAAU,CAC/B,GAAI,OAAOzD,GAAQ,YAAeyD,GAAY,MAAQ,OAAOA,GAAY,WACvE,MAAM,IAAI,UAAUF,EAAe,EAErC,IAAIG,EAAW,UAAW,CACxB,IAAIzN,EAAO,UACPkB,EAAMsM,EAAWA,EAAS,MAAM,KAAMxN,CAAI,EAAIA,EAAK,CAAC,EACpD0N,EAAQD,EAAS,MAErB,GAAIC,EAAM,IAAIxM,CAAG,EACf,OAAOwM,EAAM,IAAIxM,CAAG,EAEtB,IAAI8C,EAAS+F,EAAK,MAAM,KAAM/J,CAAI,EAClC,OAAAyN,EAAS,MAAQC,EAAM,IAAIxM,EAAK8C,CAAM,GAAK0J,EACpC1J,CACT,EACA,OAAAyJ,EAAS,MAAQ,IAAKF,GAAQ,OAASF,GAChCI,CACT,CAGAF,GAAQ,MAAQF,ECnEhB,IAAIM,GAAmB,IAUvB,SAASC,GAAc7D,EAAM,CAC3B,IAAI/F,EAASuJ,GAAQxD,EAAM,SAAS7I,EAAK,CACvC,OAAIwM,EAAM,OAASC,IACjBD,EAAM,MAAK,EAENxM,CACT,CAAC,EAEGwM,EAAQ1J,EAAO,MACnB,OAAOA,CACT,CCpBA,IAAI6J,GAAa,mGAGbC,GAAe,WASfC,GAAeH,GAAc,SAASI,EAAQ,CAChD,IAAIhK,EAAS,CAAA,EACb,OAAIgK,EAAO,WAAW,CAAC,IAAM,IAC3BhK,EAAO,KAAK,EAAE,EAEhBgK,EAAO,QAAQH,GAAY,SAASI,EAAOC,EAAQC,EAAOC,EAAW,CACnEpK,EAAO,KAAKmK,EAAQC,EAAU,QAAQN,GAAc,IAAI,EAAKI,GAAUD,CAAM,CAC/E,CAAC,EACMjK,CACT,CAAC,ECDD,SAASqK,GAASlO,EAAO,CACvB,OAAOA,GAAS,KAAO,GAAKgJ,GAAahJ,CAAK,CAChD,CCZA,SAASmO,GAASnO,EAAOsK,EAAQ,CAC/B,OAAItF,GAAQhF,CAAK,EACRA,EAEFmL,GAAMnL,EAAOsK,CAAM,EAAI,CAACtK,CAAK,EAAI4N,GAAaM,GAASlO,CAAK,CAAC,CACtE,CCNA,SAASoO,GAAMpO,EAAO,CACpB,GAAI,OAAOA,GAAS,UAAY0I,GAAS1I,CAAK,EAC5C,OAAOA,EAET,IAAI6D,EAAU7D,EAAQ,GACtB,OAAQ6D,GAAU,KAAQ,EAAI7D,GAAU,KAAa,KAAO6D,CAC9D,CCPA,SAASwK,GAAQ/D,EAAQpG,EAAM,CAC7BA,EAAOiK,GAASjK,EAAMoG,CAAM,EAK5B,QAHIrJ,EAAQ,EACRsG,EAASrD,EAAK,OAEXoG,GAAU,MAAQrJ,EAAQsG,GAC/B+C,EAASA,EAAO8D,GAAMlK,EAAKjD,GAAO,CAAC,CAAC,EAEtC,OAAQA,GAASA,GAASsG,EAAU+C,EAAS,MAC/C,CCMA,SAASgE,GAAIhE,EAAQpG,EAAMqK,EAAc,CACvC,IAAI1K,EAASyG,GAAU,KAAO,OAAY+D,GAAQ/D,EAAQpG,CAAI,EAC9D,OAAOL,IAAW,OAAY0K,EAAe1K,CAC/C,CCdA,SAAS2K,GAAQlE,EAAQpG,EAAMlE,EAAOyO,EAAY,CAChD,GAAI,CAACxF,GAASqB,CAAM,EAClB,OAAOA,EAETpG,EAAOiK,GAASjK,EAAMoG,CAAM,EAO5B,QALIrJ,EAAQ,GACRsG,EAASrD,EAAK,OACdiI,EAAY5E,EAAS,EACrBmH,EAASpE,EAENoE,GAAU,MAAQ,EAAEzN,EAAQsG,GAAQ,CACzC,IAAIxG,EAAMqN,GAAMlK,EAAKjD,CAAK,CAAC,EACvB0N,EAAW3O,EAEf,GAAIe,IAAQ,aAAeA,IAAQ,eAAiBA,IAAQ,YAC1D,OAAOuJ,EAGT,GAAIrJ,GAASkL,EAAW,CACtB,IAAInB,EAAW0D,EAAO3N,CAAG,EACzB4N,EAA4D,OACxDA,IAAa,SACfA,EAAW1F,GAAS+B,CAAQ,EACxBA,EACCL,GAAQzG,EAAKjD,EAAQ,CAAC,CAAC,EAAI,CAAA,EAAK,GAEzC,CACA8J,GAAY2D,EAAQ3N,EAAK4N,CAAQ,EACjCD,EAASA,EAAO3N,CAAG,CACrB,CACA,OAAOuJ,CACT,CClBA,SAAShJ,GAAIgJ,EAAQpG,EAAMlE,EAAO,CAChC,OAAOsK,GAAU,KAAOA,EAASkE,GAAQlE,EAAQpG,EAAMlE,CAAK,CAC9D,CChCO,MAAM4O,EAAyC,CACpD,wBACE,yFACF,mBAAoB,sCACpB,mCACE,yFACF,qBACE,mGACF,2BACE,gFACF,2BACE,+EACF,gCACE,gFACF,0BACE,yEACF,2BACE,oDACF,0BAA2B,0CAC3B,2BAA4B,2CAC5B,mBAAoB,yDACpB,qCACE,2EACF,oBACE,gFACF,6BACE,gEACF,6BACE,4EACF,0BACE,yFACF,gCACE,+GACF,8BACE,sJACF,gCACE,yJACF,+BACE,2GACF,aACE,6EACF,aAAc,sCACd,cACE,0FACD,gBAAiB,qCACjB,oBAAqB,oEACrB,cAAe,yDAEhB,gBACE,0FACF,YAAa,wCACb,YAAa,0BACb,gBAAiB,8BACjB,gBACE,sFAEF,cAAe,sEACf,UACE,0FACF,aAAc,sDACd,eACE,yEACF,eAAgB,2DAChB,iBACE,kFACF,mBACE,yEACF,4BACE,8EACF,+BACE,+EAEF,4BAA6B,kCAC7B,iCAAkC,iDAClC,0BAA2B,sDAC3B,0BACE,+EACF,2BACE,+DACF,8BACE,8EACF,kCACE,oEACF,8BACE,8DACF,iCACE,2DACF,sCACE,iEACF,uCACE,kFACF,4CACE,uEACF,gCACE,iEACF,8BAA+B,kEAC/B,iCACE,8EACF,iCACE,qEACF,6BACE,0EACF,uCACE,mEAEF,sCACE,4DACF,2BAA4B,mBAC5B,8BAA+B,gBAC/B,gCAAiC,gDACjC,wBAAyB,gDAEzB,gDACE,yDACF,qCAAsC,wBACtC,wCAAyC,qBACzC,qCAAsC,qDACtC,6BAA8B,qDAE9B,+BACE,sFACF,+BACE,kEACF,iCACE,uEACF,iCACE,8EACF,qBAAsB,+DACtB,oCACE,uEACF,qBACE,sFACF,qCACE,2EACF,0BAA2B,qCAC3B,uBACE,uFACF,0BACE,2FACF,6BAA8B,mCAC9B,mCACE,kGAEF,kDACE,+EACF,gDACE,6EACF,qCACE,wDACF,qCACE,+DACF,oCACE,+HACJ,EAEO,SAASC,GAAW3K,EAAoC,CAC7D,MAAM4K,EAAS5K,EAAK,KAAK,GAAG,EAC5B,GAAI0K,EAAeE,CAAM,EAAG,OAAOF,EAAeE,CAAM,EACxD,GAAI5K,EAAK,OAAS,EAAG,CACnB,MAAM6K,EAAgB,CAAC,MAAO,GAAG7K,EAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,EACxD,GAAI0K,EAAeG,CAAa,EAAG,OAAOH,EAAeG,CAAa,EACtE,MAAMC,EAAoB,CAAC,cAAe,GAAG9K,EAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,EACpE,GAAIA,EAAK,CAAC,IAAM,eAAiB0K,EAAeI,CAAiB,EAC/D,OAAOJ,EAAeI,CAAiB,EAEzC,MAAMC,EAAgB,CAAC,UAAW,GAAG/K,EAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,EAC5D,GAAIA,EAAK,CAAC,IAAM,WAAa0K,EAAeK,CAAa,EACvD,OAAOL,EAAeK,CAAa,CAEvC,CACA,MAAMC,EAAOhL,EAAKA,EAAK,OAAS,CAAC,EACjC,OAAO0K,EAAeM,CAAI,CAC5B,CC5KA,MAAAC,GAAe,gCCAfC,GAAe,0BCAfC,GAAe,gCCAfC,GAAe,2BCmDTC,GAAwB,oBAGxBC,GAAkB,IAAM,CAC5B,MAAMC,EAAS,SAAS,gBAAgB,aAAa,YAAY,IAAM,OACvE,MAAO,CACL,QAAU1N,IAAe,CACvB,GAAGA,EACH,WAAY0N,EAAS,UAAY,UACjC,MAAOA,EAAS,UAAY,UAC5B,YAAaA,EAAS,UAAY,UAClC,UAAW,OACX,UAAW,OACX,UAAW,CACT,YAAaA,EAAS,UAAY,SAAA,CACpC,GAEF,KAAO1N,IAAe,CACpB,GAAGA,EACH,WAAY0N,EAAS,UAAY,UACjC,YAAaA,EAAS,UAAY,UAClC,OAAQ,aAAaA,EAAS,UAAY,SAAS,EAAA,GAErD,OAAQ,CAAC1N,EAAWZ,KAAgB,CAClC,GAAGY,EACH,WAAYZ,EAAM,UACbsO,EAAS,4BAA8B,yBACvCA,EAAS,UAAY,UAC1B,MAAOA,EAAS,UAAY,UAC5B,WAAY,CACV,WAAYA,EAAS,4BAA8B,wBAAA,CACrD,GAEF,YAAc1N,IAAe,CAC3B,GAAGA,EACH,MAAO0N,EAAS,UAAY,SAAA,GAE9B,MAAQ1N,IAAe,CACrB,GAAGA,EACH,MAAO0N,EAAS,UAAY,SAAA,GAE9B,YAAc1N,IAAe,CAC3B,GAAGA,EACH,MAAO0N,EAAS,UAAY,SAAA,GAE9B,SAAW1N,IAAe,CACxB,GAAGA,EACH,QAAS,KAAA,EACX,CAEJ,EAEM2N,EAAa1P,GACjB,OAAOA,CAAK,EACT,MAAM,GAAG,EACT,IAAK2P,GAASA,EAAK,MAAM,EACzB,OAAO,OAAO,EAEbC,EAAc5P,GAClB,MAAM,QAAQA,CAAK,EAAIA,EAAM,KAAK,IAAI,EAAI,OAAOA,GAAS,EAAE,EAExD6P,GAAsB,CAAC,OAAQ,OAAQ,MAAM,EAQ7CC,GAAe,mBAErB,SAASC,GAAsBC,EAAsC,CACnE,GAAI,CAACA,EAAS,OACd,MAAMC,EAAUD,EAAQ,KAAA,EACxB,GAAI,CAACC,EAAS,OACd,MAAMnC,EAAQmC,EAAQ,MAAMH,EAAY,EAClCI,EAAWpC,EAAQA,EAAM,CAAC,EAAImC,EACpC,OAAOC,EAAS,OAAS,IAAM,GAAGA,EAAS,MAAM,EAAG,GAAG,CAAC,IAAMA,CAChE,CAMA,MAAMC,GAAqC,CACzC,CACE,MAAO,gBACP,KAAM,CAAC,WAAY,cAAc,EACjC,KAAM,SACN,QAAS,CAAC,WAAY,QAAS,UAAW,SAAU,OAAQ,QAAS,OAAO,EAC5E,SAAU,EAAA,EAEZ,CAAE,MAAO,UAAW,KAAM,CAAC,WAAY,SAAS,EAAG,KAAM,UAAA,EACzD,CACE,MAAO,4BACP,KAAM,CAAC,WAAY,yBAAyB,EAC5C,KAAM,OACN,SAAU,GACV,SAAWnQ,GAAU,CACnB,MAAMoQ,EAAS,OAAOpQ,GAAS,EAAE,EAAE,KAAA,EACnC,GAAI,CAACoQ,GAAUA,EAAO,YAAA,IAAkB,YACtC,MAAO,wDAGX,CAAA,EAEF,CACE,MAAO,aACP,KAAM,CAAC,WAAY,WAAW,EAC9B,KAAM,OACN,SAAU,GACV,SAAWpQ,GAAU,CACnB,MAAMqQ,EAAM,OAAOrQ,GAAS,EAAE,EAAE,KAAA,EAChC,GAAI,CAACqQ,EACH,MAAO,+BAET,GAAIA,IAAQ,MAGR,CAAC,2BAA2B,KAAKA,CAAG,EACtC,MAAO,8EAGX,CAAA,EAEF,CACE,MAAO,oBACP,KAAM,CAAC,WAAY,iBAAiB,EACpC,KAAM,OACN,SAAU,CAACrQ,EAAOsQ,IAAY,CAC5B,MAAMC,EAAYlG,EAASiG,EAAQ,KAAM,CAAC,WAAY,WAAW,CAAC,EAElE,GAAI,EADmB,OAAOC,GAAa,EAAE,EAAE,SAAW,MAExD,OAEF,MAAMH,EAAS,OAAOpQ,GAAS,EAAE,EAAE,KAAA,EACnC,GAAI,CAACoQ,GAAUA,EAAO,YAAA,IAAkB,YACtC,MAAO,sEAGX,CAAA,EAEF,CAAE,MAAO,oBAAqB,KAAM,CAAC,WAAY,iBAAiB,EAAG,KAAM,UAAA,EAC3E,CACE,MAAO,wBACP,KAAM,CAAC,WAAY,sBAAsB,EACzC,KAAM,SACN,SAAWpQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,kDAGX,CAAA,EAEF,CACE,MAAO,iBACP,KAAM,CAAC,WAAY,gBAAgB,EACnC,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,2CAGX,CAAA,EAEF,CACE,MAAO,wBACP,KAAM,CAAC,WAAY,iBAAiB,EACpC,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,kDAGX,CAAA,EAEF,CAAE,MAAO,kBAAmB,KAAM,CAAC,WAAY,gBAAgB,EAAG,KAAM,MAAA,EACxE,CAAE,MAAO,mBAAoB,KAAM,CAAC,WAAY,iBAAiB,EAAG,KAAM,MAAA,EAC1E,CAAE,MAAO,UAAW,KAAM,CAAC,WAAY,SAAS,EAAG,KAAM,UAAA,EACzD,CACE,MAAO,+BACP,KAAM,CAAC,WAAY,2BAA2B,EAC9C,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,6DAGX,CAAA,EAEF,CACE,MAAO,YACP,KAAM,CAAC,WAAY,UAAU,EAC7B,KAAM,OACN,MAAOd,EACP,OAAQE,EACR,YAAa,iCAAA,EAEf,CACE,MAAO,sBACP,KAAM,CAAC,WAAY,mBAAmB,EACtC,KAAM,UAAA,EAER,CACE,MAAO,sBACP,KAAM,CAAC,WAAY,mBAAmB,EACtC,KAAM,UAAA,EAER,CACE,MAAO,mBACP,KAAM,CAAC,WAAY,gBAAgB,EACnC,KAAM,OACN,YAAa,YACb,SAAU,GACV,SAAW5P,GAAU,CAEnB,MAAMyQ,EADO,OAAOzQ,GAAS,EAAE,EAAE,KAAA,EACd,MAAM,KAAK,EAAE,OAAO,OAAO,EAC9C,GAAIyQ,EAAM,OAAS,GAAKA,EAAM,OAAS,EACrC,MAAO,8DAGX,CAAA,EAEF,CACE,MAAO,yBACP,KAAM,CAAC,WAAY,sBAAsB,EACzC,KAAM,UAAA,EAER,CACE,MAAO,uBACP,KAAM,CAAC,WAAY,oBAAoB,EACvC,KAAM,SACN,SAAWzQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,0CAGX,CAAA,EAEF,CACE,MAAO,6BACP,KAAM,CAAC,WAAY,sBAAsB,EACzC,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,mDAGX,CAAA,EAEF,CACE,MAAO,4BACP,KAAM,CAAC,WAAY,qBAAqB,EACxC,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,sDAGX,CAAA,CAGJ,EAEME,GAAyC,CAC7C,CACE,MAAO,aACP,KAAM,CAAC,QAAS,MAAM,EACtB,KAAM,OACN,SAAU,GACV,SAAW1Q,GAAU,CACnB,GAAI,CAAC,OAAOA,GAAS,EAAE,EAAE,OACvB,MAAO,yBAGX,CAAA,EAEF,CACE,MAAO,aACP,KAAM,CAAC,QAAS,MAAM,EACtB,KAAM,SACN,SAAWA,GAAU,CACnB,MAAM2Q,EAAO,OAAO3Q,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC7D,GAAI,CAAC,OAAO,UAAU2Q,CAAI,GAAKA,EAAO,GAAKA,EAAO,MAChD,MAAO,yCAGX,CAAA,EAEF,CACE,MAAO,cACP,KAAM,CAAC,QAAS,OAAO,EACvB,KAAM,WACN,OAAQ,GACR,UAAW,EAAA,CAEf,EAEMC,GAAiC,CACrC,CAAE,MAAO,WAAY,KAAM,CAAC,OAAQ,UAAU,EAAG,KAAM,UAAA,EACvD,CACE,MAAO,OACP,KAAM,CAAC,OAAQ,MAAM,EACrB,KAAM,OACN,SAAU,GACV,SAAW5Q,GAAU,CACnB,GAAI,CAAC,OAAOA,GAAS,EAAE,EAAE,OACvB,MAAO,wBAGX,CAAA,EAEF,CACE,MAAO,OACP,KAAM,CAAC,OAAQ,MAAM,EACrB,KAAM,SACN,SAAWA,GAAU,CACnB,MAAM2Q,EAAO,OAAO3Q,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC7D,GAAI,CAAC,OAAO,UAAU2Q,CAAI,GAAKA,EAAO,GAAKA,EAAO,MAChD,MAAO,wCAGX,CAAA,EAEF,CAAE,MAAO,WAAY,KAAM,CAAC,OAAQ,UAAU,EAAG,KAAM,MAAA,EACvD,CAAE,MAAO,WAAY,KAAM,CAAC,OAAQ,UAAU,EAAG,KAAM,UAAA,CACzD,EAEME,GAAwC,CAC5C,CAAE,MAAO,eAAgB,KAAM,OAAQ,YAAa,YAAa,YAAa,EAAA,EAC9E,CAAE,MAAO,UAAW,KAAM,CAAC,SAAS,EAAG,KAAM,UAAA,EAC7C,CACE,MAAO,MACP,KAAM,CAAC,KAAK,EACZ,KAAM,OACN,YAAa,mBACb,SAAU,GACV,SAAU,CAAC7Q,EAAOsQ,IAAY,CAC5B,MAAMQ,EAAM,OAAO9Q,GAAS,EAAE,EAAE,KAAA,EAEhC,GADwBqK,EAASiG,EAAQ,SAAW,CAAA,EAAI,CAAC,SAAS,CAAC,IAI/D,CAACQ,GAAOA,EAAI,YAAA,IAAkB,aAChC,MAAO,8DAGX,CAAA,EAEF,CACE,MAAO,UACP,KAAM,CAAC,QAAQ,EACf,KAAM,WACN,OAAQ,GACR,SAAU,GACV,SAAU,CAAC9Q,EAAOsQ,IAAY,CAC5B,MAAMS,EAAS,OAAO/Q,GAAS,EAAE,EAAE,KAAA,EAEnC,GADwBqK,EAASiG,EAAQ,SAAW,CAAA,EAAI,CAAC,SAAS,CAAC,IAI/D,CAACS,GAAUA,EAAO,YAAA,IAAkB,aACtC,MAAO,wDAGX,CAAA,EAEF,CACE,MAAO,WACP,KAAM,CAAC,UAAU,EACjB,KAAM,OACN,SAAU,GACV,SAAW/Q,GAAU,CACnB,GAAI,CAAC,OAAOA,GAAS,EAAE,EAAE,OACvB,MAAO,uBAGX,CAAA,EAEF,CAAE,MAAO,YAAa,KAAM,CAAC,UAAU,EAAG,KAAM,UAAA,EAChD,CACE,MAAO,cACP,KAAM,CAAC,YAAY,EACnB,KAAM,SACN,QAAS6P,GACT,SAAU,EAAA,EAEZ,CACE,MAAO,uBACP,KAAM,CAAC,cAAc,EACrB,KAAM,SACN,SAAW7P,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,+CAGX,CAAA,EAEF,CACE,MAAO,gCACP,KAAM,CAAC,uBAAuB,EAC9B,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,wDAGX,CAAA,EAEF,CACE,MAAO,+BACP,KAAM,CAAC,0BAA0B,EACjC,KAAM,OACN,MAAOd,EACP,OAAQE,CAAA,CAEZ,EAEMoB,GAA6C,CACjD,CACE,MAAO,iBACP,KAAM,CAAC,cAAe,eAAe,EACrC,KAAM,UAAA,EAER,CACE,MAAO,uBACP,KAAM,CAAC,cAAe,oBAAoB,EAC1C,KAAM,UAAA,EAER,CACE,MAAO,cACP,KAAM,CAAC,cAAe,aAAa,EACnC,KAAM,UAAA,EAER,CACE,MAAO,oBACP,KAAM,CAAC,cAAe,iBAAiB,EACvC,KAAM,UAAA,EAER,CACE,MAAO,uBACP,KAAM,CAAC,cAAe,oBAAoB,EAC1C,KAAM,UAAA,EAER,CACE,MAAO,6BACP,KAAM,CAAC,cAAe,yBAAyB,EAC/C,KAAM,UAAA,EAER,CACE,MAAO,8BACP,KAAM,CAAC,cAAe,0BAA0B,EAChD,KAAM,UAAA,EAER,CACE,MAAO,eACP,KAAM,CAAC,cAAe,aAAa,EACnC,KAAM,SACN,SAAWhR,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,kCAGX,CAAA,EAEF,CACE,MAAO,iBACP,KAAM,CAAC,cAAe,cAAc,EACpC,KAAM,UAAA,EAER,CACE,MAAO,oBACP,KAAM,CAAC,cAAe,iBAAiB,EACvC,KAAM,UAAA,EAER,CACE,MAAO,4BACP,KAAM,CAAC,cAAe,qBAAqB,EAC3C,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,kDAGX,CAAA,EAEF,CACE,MAAO,6BACP,KAAM,CAAC,cAAe,+BAA+B,EACrD,KAAM,UAAA,EAER,CACE,MAAO,+BACP,KAAM,CAAC,cAAe,mBAAmB,EACzC,KAAM,UAAA,EAER,CACE,MAAO,oBACP,KAAM,CAAC,cAAe,iBAAiB,EACvC,KAAM,UAAA,EAER,CACE,MAAO,4BACP,KAAM,CAAC,cAAe,wBAAwB,EAC9C,KAAM,WACN,YAAa,sFAAA,EAEf,CACE,MAAO,uCACP,KAAM,CAAC,cAAe,gCAAgC,EACtD,KAAM,SACN,YAAa,gHAAA,EAEf,CACE,MAAO,gCACP,KAAM,CAAC,cAAe,4BAA4B,EAClD,KAAM,SACN,YAAa,oEAAA,EAEf,CACE,MAAO,mBACP,KAAM,CAAC,cAAe,gBAAgB,EACtC,KAAM,SACN,QAAS,CAAC,QAAS,OAAQ,OAAO,EAClC,YAAa,4IACb,OAASxQ,GAEH,OAAOA,GAAU,UACZA,EAAQ,OAAS,QAEnB,OAAOA,GAAS,OAAO,EAEhC,MAAQA,GAA4B,CAElC,MAAMiR,EAAM,OAAOjR,CAAK,EACxB,OAAIiR,IAAQ,QAAUA,IAAQ,QACrBA,EAEF,OACT,CAAA,EAEF,CACE,MAAO,8BACP,KAAM,CAAC,cAAe,0BAA0B,EAChD,KAAM,UAAA,CAEV,EAEMC,GAAkD,CACtD,CACE,MAAO,uBACP,KAAM,CAAC,cAAe,OAAQ,oBAAoB,EAClD,KAAM,UAAA,EAER,CACE,MAAO,WACP,KAAM,CAAC,cAAe,OAAQ,SAAS,EACvC,KAAM,OACN,YAAa,kBAAA,EAEf,CACE,MAAO,eACP,KAAM,CAAC,cAAe,OAAQ,YAAY,EAC1C,KAAM,UAAA,EAER,CACE,MAAO,gBACP,KAAM,CAAC,cAAe,OAAQ,cAAc,EAC5C,KAAM,UAAA,EAER,CACE,MAAO,iBACP,KAAM,CAAC,cAAe,OAAQ,MAAM,EACpC,KAAM,UAAA,CAEV,EAEMC,GAAuD,CAC3D,CACE,MAAO,4BACP,KAAM,CAAC,cAAe,YAAa,yBAAyB,EAC5D,KAAM,UAAA,EAER,CACE,MAAO,gBACP,KAAM,CAAC,cAAe,YAAa,cAAc,EACjD,KAAM,OACN,YAAa,kBAAA,EAEf,CACE,MAAO,oBACP,KAAM,CAAC,cAAe,YAAa,iBAAiB,EACpD,KAAM,UAAA,EAER,CACE,MAAO,gBACP,KAAM,CAAC,cAAe,YAAa,cAAc,EACjD,KAAM,UAAA,EAER,CACE,MAAO,iBACP,KAAM,CAAC,cAAe,YAAa,MAAM,EACzC,KAAM,UAAA,CAEV,EAEMC,GAAwC,CAC5C,CACE,MAAO,yBACP,KAAM,CAAC,UAAW,sBAAsB,EACxC,KAAM,UAAA,EAER,CACE,MAAO,yBACP,KAAM,CAAC,UAAW,sBAAsB,EACxC,KAAM,OACN,MAAO1B,EACP,OAAQE,CAAA,EAEV,CACE,MAAO,4BACP,KAAM,CAAC,UAAW,wBAAwB,EAC1C,KAAM,OACN,MAAOF,EACP,OAAQE,CAAA,EAEV,CACE,MAAO,2BACP,KAAM,CAAC,UAAW,wBAAwB,EAC1C,KAAM,OACN,MAAOF,EACP,OAAQE,CAAA,EAEV,CACE,MAAO,cACP,KAAM,CAAC,UAAW,YAAY,EAC9B,KAAM,UAAA,EAER,CACE,MAAO,mCACP,KAAM,CAAC,UAAW,2BAA2B,EAC7C,KAAM,SACN,SAAW5P,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,6DAGX,CAAA,EAEF,CACE,MAAO,kBACP,KAAM,CAAC,UAAW,YAAY,EAC9B,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,kDAGX,CAAA,EAEF,CACE,MAAO,+BACP,KAAM,CAAC,UAAW,4BAA4B,EAC9C,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GAAKA,EAAM,IAC5C,MAAO,yDAGX,CAAA,EAEF,CACE,MAAO,qBACP,KAAM,CAAC,UAAW,iBAAiB,EACnC,KAAM,UAAA,EAER,CACE,MAAO,sBACP,KAAM,CAAC,UAAW,cAAc,EAChC,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,8CAGX,CAAA,EAEF,CACE,MAAO,oBACP,KAAM,CAAC,UAAW,iBAAiB,EACnC,KAAM,UAAA,CAEV,EAEMa,GAAwC,CAC5C,CACE,MAAO,kCACP,KAAM,CAAC,UAAW,cAAe,6BAA6B,EAC9D,KAAM,SACN,SAAWrR,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,4CAGX,CAAA,EAEF,CACE,MAAO,gCACP,KAAM,CAAC,UAAW,cAAe,2BAA2B,EAC5D,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,0CAGX,CAAA,EAEF,CACE,MAAO,mBACP,KAAM,CAAC,UAAW,cAAe,gBAAgB,EACjD,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,yCAGX,CAAA,EAEF,CACE,MAAO,uBACP,KAAM,CAAC,UAAW,cAAe,gBAAgB,EACjD,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,yCAGX,CAAA,EAEF,CACE,MAAO,0BACP,KAAM,CAAC,UAAW,cAAe,eAAe,EAChD,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,EACtB,MAAO,0CAET,GAAIA,IAAQ,IAGR,CAAC,CAAC,EAAG,EAAG,EAAG,CAAC,EAAE,SAASA,CAAG,EAC5B,MAAO,kDAGX,CAAA,EAEF,CACE,MAAO,uBACP,KAAM,CAAC,UAAW,cAAe,oBAAoB,EACrD,KAAM,UAAA,EAER,CACE,MAAO,0BACP,KAAM,CAAC,UAAW,cAAe,0BAA0B,EAC3D,KAAM,OACN,MAAOd,EACP,OAAQE,EACR,UAAW,EAAA,CAEf,EAEM0B,GAAwC,CAC5C,CAAE,MAAO,OAAQ,KAAM,CAAC,MAAM,EAAG,KAAM,OAAQ,SAAU,EAAA,EACzD,CAAE,MAAO,MAAO,KAAM,CAAC,KAAK,EAAG,KAAM,OAAQ,SAAU,EAAA,EACvD,CACE,MAAO,WACP,KAAM,CAAC,UAAU,EACjB,KAAM,SACN,SAAWtR,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,EACjC,MAAO,yCAGX,CAAA,EAEF,CACE,MAAO,cACP,KAAM,CAAC,YAAY,EACnB,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,kDAGX,CAAA,EAEF,CACE,MAAO,sBACP,KAAM,CAAC,mBAAmB,EAC1B,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,4CAGX,CAAA,EAEF,CACE,MAAO,oBACP,KAAM,CAAC,iBAAiB,EACxB,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,0CAGX,CAAA,EAEF,CACE,MAAO,mBACP,KAAM,CAAC,gBAAgB,EACvB,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,yCAGX,CAAA,EAEF,CACE,MAAO,mBACP,KAAM,CAAC,gBAAgB,EACvB,KAAM,SACN,SAAWxQ,GAAU,CACnB,MAAMwQ,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,GAAI,CAAC,OAAO,SAASwQ,CAAG,GAAKA,EAAM,GACjC,MAAO,yCAGX,CAAA,EAEF,CACE,MAAO,yBACP,KAAM,CAAC,qBAAqB,EAC5B,KAAM,UAAA,EAER,CAAE,MAAO,mBAAoB,KAAM,CAAC,gBAAgB,EAAG,KAAM,UAAA,EAC7D,CAAE,MAAO,kBAAmB,KAAM,CAAC,eAAe,EAAG,KAAM,UAAA,EAC3D,CACE,MAAO,WACP,KAAM,CAAC,SAAS,EAChB,KAAM,OACN,MAAOd,EACP,OAAQE,CAAA,CAEZ,EAEA,SAAS2B,GAAgBC,EAAgB,CACvC,MAAMC,EAAQD,EAAO,YAAA,EACfE,EAAWD,EAAM,SAAS,QAAQ,EAClCE,EAAWF,EAAM,SAAS,QAAQ,EAClCG,EAAgB,CAAC,GAAGf,EAAkB,EACtCgB,EAAcb,GAAwB,OAAQc,GAAU,CAC5D,GAAI,CAACA,EAAM,KACT,MAAO,GAET,MAAMhD,EAASgD,EAAM,KAAK,KAAK,GAAG,EAUlC,MATI,GAACJ,IAED5C,IAAW,kCACXA,IAAW,8BACXA,IAAW,yCAKX6C,GAEE7C,IAAW,2BAKnB,CAAC,EAEKiD,EAAkBJ,EAAW,GAAK,CAAC,GAAGT,EAA4B,EAClEc,EAAuBL,EAAW,GAAK,CAAC,GAAGR,EAAiC,EAC5Ec,EAAgB,CAAC,GAAGb,EAAkB,EACtCc,EAAgB,CAAC,GAAGb,EAAkB,EACtCc,EAAgB,CAAC,GAAGb,EAAkB,EAC5C,MAAO,CACL,cAAAM,EACA,YAAAC,EACA,gBAAAE,EACA,qBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,cAAAC,CAAA,CAEJ,CAEA,SAASC,GAAapS,EAAyB,CAC7C,OACEA,GAAU,MAET,OAAOA,GAAU,UAAYA,EAAM,KAAA,IAAW,IAC9C,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,CAE9C,CAEA,SAASqS,GAAgBC,EAAsBtS,EAAoC,CACjF,MAAMuS,EAAQD,EAAI,MACZE,EAAaF,EAAI,WAAaA,EAAI,OAAS,UAAYA,EAAI,OAAS,UAC1E,OAAQA,EAAI,KAAA,CACV,IAAK,OACL,IAAK,WACH,OAAKE,GAGDJ,GAAapS,CAAK,EACb,GAAGuS,CAAK,gBAHf,OAOJ,IAAK,SAAU,CACb,GAAIvS,GAAU,MAA+BA,IAAU,GACrD,OAAOwS,EAAa,GAAGD,CAAK,gBAAkB,OAEhD,MAAM/B,EAAM,OAAOxQ,GAAU,SAAWA,EAAQ,OAAOA,CAAK,EAC5D,OAAK,OAAO,SAASwQ,CAAG,EAGxB,OAFS,GAAG+B,CAAK,0BAGnB,CACA,IAAK,WACH,OAAIvS,GAAU,KACLwS,EAAa,GAAGD,CAAK,gBAAkB,OAE5C,OAAOvS,GAAU,UACZ,GAAGuS,CAAK,0BAEjB,OAEF,IAAK,SACH,OAAIH,GAAapS,CAAK,EACb,GAAGuS,CAAK,gBAEb,OAAOvS,GAAU,SACZ,GAAGuS,CAAK,qBAEbD,EAAI,SAAW,CAACA,EAAI,QAAQ,SAAStS,CAAK,EACrC,GAAGuS,CAAK,mBAAmBD,EAAI,QAAQ,KAAK,IAAI,CAAC,IAE1D,OAEF,QACE,MAAO,CAEb,CAEA,SAASG,EACPC,EACAC,EACAxR,EACAyR,EACAtC,EACM,CACN,GAAKnP,EACL,UAAW2Q,KAASa,EAAQ,CAC1B,GAAIb,EAAM,YACR,SAEF,MAAMe,EAAef,EAAM,MAAQ,CAAA,EAC7B9R,EAAQ6S,EAAa,OACvBxI,EAASlJ,EAAyB0R,CAAY,EAC9C,OACEC,EAAW,CAAC,GAAGF,EAAU,GAAGC,CAAY,EACxCE,EAAYV,GAAgBP,EAAO9R,CAAK,EAC9C,GAAI+S,EAAW,CACbL,EAAO,KAAK,CAAE,KAAMI,EAAU,QAASC,EAAW,EAClD,QACF,CACA,GAAIjB,EAAM,SAAU,CAClB,MAAMkB,EAAclB,EAAM,SAAS9R,EAAOsQ,CAAO,EAC7C0C,GACFN,EAAO,KAAK,CAAE,KAAMI,EAAU,QAASE,EAAa,CAExD,CACF,CACF,CAEA,SAASC,GAAkBC,EAAqD,CAC9E,GAAI,CAACA,EAAW,MAAO,CAAA,EACvB,MAAMR,EAA4B,CAAA,EAC5BS,EAAiC,CAAE,KAAMD,CAAA,EAC/CT,EAAmBC,EAAQvC,GAAiB+C,EAAW,CAAA,EAAIC,CAAW,EACtEV,EAAmBC,EAAQhC,GAAqBwC,EAAW,CAAA,EAAIC,CAAW,EAC1EV,EAAmBC,EAAQ9B,GAAasC,EAAW,CAAA,EAAIC,CAAW,EAClE,SAAW,CAACpS,EAAKf,CAAK,IAAK,OAAO,QAAQkT,CAAS,EAAG,CACpD,GAAI,CAAC3D,GAAsB,KAAKxO,CAAG,GAAK,CAACf,GAAS,OAAOA,GAAU,SACjE,SAEF,MAAMoT,EAAUpT,EACVqT,EAAoC,CAAE,KAAMH,EAAW,QAAAE,EAAS,WAAYrS,CAAA,EAC5EuS,EAAY/B,GAAgBxQ,CAAG,EACrC0R,EAAmBC,EAAQY,EAAU,cAAeF,EAAS,CAACrS,CAAG,EAAGsS,CAAc,EAClFZ,EAAmBC,EAAQY,EAAU,YAAaF,EAAS,CAACrS,CAAG,EAAGsS,CAAc,EAChFZ,EAAmBC,EAAQY,EAAU,gBAAiBF,EAAS,CAACrS,CAAG,EAAGsS,CAAc,EACpFZ,EAAmBC,EAAQY,EAAU,qBAAsBF,EAAS,CAACrS,CAAG,EAAGsS,CAAc,EACzFZ,EAAmBC,EAAQY,EAAU,cAAeF,EAAS,CAACrS,CAAG,EAAGsS,CAAc,EAClFZ,EAAmBC,EAAQY,EAAU,cAAeF,EAAS,CAACrS,CAAG,EAAGsS,CAAc,CACpF,CACA,OAAOX,CACT,CAKA,SAASrI,EAASkJ,EAA4BrP,EAAyB,CACrE,GAAKqP,EACL,OAAOjF,GAAIiF,EAAKrP,CAAI,CACtB,CAEA,SAASsP,GACPD,EACArP,EACAlE,EACM,CACNsB,GAAIiS,EAAKrP,EAAMlE,CAAK,CACtB,CAIA,SAASyT,GAAQF,EAAqBG,EAAmB,GAA6B,CACpF,MAAM7P,EAAkC,CAAA,EACxC,SAAW,CAAC9C,EAAKf,CAAK,IAAK,OAAO,QAAQuT,CAAG,EAAG,CAC9C,MAAMI,EAAW,CAAC,GAAGD,EAAQ3S,CAAG,EAC5Bf,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAC5D,OAAO,OAAO6D,EAAQ4P,GAAQzT,EAAyB2T,CAAQ,CAAC,EAEhE9P,EAAO8P,EAAS,KAAK,GAAG,CAAC,EAAI3T,CAEjC,CACA,OAAO6D,CACT,CAEA,SAAS+P,GAAkB1K,EAA8B,CACvD,MAAM2K,EAAY3K,EAAK,YAAA,EACjBwI,EAAWmC,EAAU,SAAS,QAAQ,EACtCC,EAAWD,EAAU,SAAS,QAAQ,EACtClC,EAAWkC,EAAU,SAAS,QAAQ,EAEtCE,EAAgBD,EAClB,CACE,0DACA,4CACA,yCAAA,EAEFnC,EACA,CACE,0DACA,4CACA,yCAAA,EAEF,CACE,4DACA,8CACA,yCAAA,EAGAqC,EAAuC,CAC3C,cAAe,GACf,YAAa,GACb,YAAa,EACb,aAAc,GACd,gBAAiB,GACjB,oBAAqB,IACrB,gBAAiB,GACjB,mBAAoB,GACpB,wBAAyB,GACzB,yBAA0B,GAC1B,8BAA+B,GAC/B,kBAAmB,GACnB,gBAAiB,GACjB,uBAAwB,GACxB,+BAAgC,EAChC,2BAA4B,EAC5B,uBAAwB,CAAA,CAAC,EAG3B,OAAItC,IACFsC,EAAY,mBAAqB,GACjCA,EAAY,eAAiB,QAC7BA,EAAY,yBAA2B,IAGzCA,EAAY,KAAO,CACjB,mBAAoB,GACpB,QAAS,YACT,WAAY,YACZ,aAAc,EAAA,EAEhBA,EAAY,UAAY,CACtB,wBAAyB,GACzB,aAAc,YACd,gBAAiB,YACjB,aAAc,GACd,KAAM,EAAA,EA+CD,CACL,QAAS,GACT,IAAK,YACL,OAAQ,YACR,SAAU9K,EACV,SAAU,GACV,WAAY,OACZ,aAAc,EACd,sBAAuB,EACvB,yBAA0B6K,EAC1B,YAAaC,EACb,QAvDuC,CACvC,qBAAsB,GACtB,qBAAsB,CACpB,gBACA,qBACA,iBACA,iBACA,2BAAA,EAEF,uBAAwB,CACtB,oBACA,oBACA,eACA,gBACA,gBACA,cACA,qBAAA,EAEF,uBAAwBrC,EACpB,CAAC,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,SAAU,OAAQ,MAAM,EAC3G,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAAQ,EAC7D,WAAY,GACZ,0BAA2B,IAC3B,WAAY,OACZ,2BAA4B,IAC5B,gBAAiB,GACjB,aAAc,GACd,gBAAiB,GACjB,mBAAoB,GACpB,yBAA0B,CACxB,0CACA,wBACA,2BACA,+CAAA,EAEF,YAAa,CACX,4BAA6B,GAC7B,0BAA2B,GAC3B,eAAgB,GAChB,eAAgB,GAChB,cAAe,EAAA,CACjB,CAcS,CAEb,CAMO,SAASsC,GAAWC,EAAsC,CAC/D,KAAM,CAAE,cAAAC,GAAkBD,GAAS,CAAA,EAC7B,CAAE,KAAAE,CAAA,EAASC,GAAA,EACX,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAC1C,IAAA,EAEI,CAACtB,EAAWuB,CAAY,EAAID,EAAAA,SAAgC,IAAI,EAChE,CAACE,EAASC,CAAU,EAAIH,EAAAA,SAAS,EAAK,EACtC,CAACI,EAAQC,CAAS,EAAIL,EAAAA,SAAS,EAAK,EAEpCM,EAAaC,EAAAA,YAAY,SAAY,CACzCJ,EAAW,EAAI,EACf,GAAI,CACF,MAAMzO,EAAS,MAAM8O,GAAA,EACrBT,EAAkBrO,CAAM,EAExBuO,EAAavO,EAAS,KAAK,MAAM,KAAK,UAAUA,CAAM,CAAC,EAAI,IAAI,CACjE,OAAStG,EAAO,CACdwU,EACExU,aAAiB,MACbA,EAAM,QACN,+BACJ,OAAA,CAEJ,QAAA,CACE+U,EAAW,EAAK,CAClB,CACF,EAAG,CAACP,CAAI,CAAC,EAETa,EAAAA,UAAU,IAAM,CACTH,EAAA,CACP,EAAG,CAACA,CAAU,CAAC,EAEf,MAAMI,EAAoBH,EAAAA,YACxB,CAAC7Q,EAAgBoO,EAAsBjC,IAAiB,CACtD,GAAI,CAAC6C,EAAW,OAChB,MAAMiC,EACJ7C,EAAI,QAAQjC,CAAuB,IAClCiC,EAAI,OAAS,SACV,OAAOjC,CAAG,GAAK,EACfiC,EAAI,OAAS,WACb,EAAQjC,EACRA,GACNoE,EACEvN,GAAQgM,EAAYvP,GAAU,CAC5B6P,GAAS7P,EAAOO,EAAMiR,CAAM,CAC9B,CAAC,CAAA,CAEL,EACA,CAACjC,CAAS,CAAA,EAGNkC,EAAcC,EAAAA,QAAQ,IACrBnC,EACE,OAAO,QAAQA,CAAS,EAAE,OAAO,CAAC,CAACnS,EAAKf,CAAK,IAClDuP,GAAsB,KAAKxO,CAAG,GAAKf,GAAS,OAAOA,GAAU,QAAA,EAFxC,CAAA,EAItB,CAACkT,CAAS,CAAC,EACRoC,EAAqBD,EAAAA,QAAQ,IAAM,CACvC,MAAME,EAID,CAAA,EACCC,EAAS,CAAC,GAAGJ,CAAW,EAAE,KAAK,CAAC/N,EAAGC,IACvCD,EAAE,CAAC,EAAE,cAAcC,EAAE,CAAC,EAAG,OAAW,CAAE,QAAS,GAAM,YAAa,OAAQ,CAAA,EAEtEmO,EAA0C,CAAA,EAC1CC,EAA0C,CAAA,EAC1CC,EAA0C,CAAA,EAC1CC,EAA0C,CAAA,EAChD,UAAW5U,KAASwU,EAAQ,CAC1B,KAAM,CAACzU,CAAG,EAAIC,EACR6U,EAAW9U,EAAI,YAAA,EACjB8U,EAAS,WAAW,QAAQ,EAC9BJ,EAAO,KAAKzU,CAAK,EACR6U,EAAS,WAAW,QAAQ,EACrCH,EAAO,KAAK1U,CAAK,EACR6U,EAAS,WAAW,QAAQ,EACrCF,EAAO,KAAK3U,CAAK,EAEjB4U,EAAO,KAAK5U,CAAK,CAErB,CAEA,OAAAuU,EAAO,KAAK,CAAE,MAAO,mBAAoB,KAAM,SAAU,MAAOE,EAAQ,EACxEF,EAAO,KAAK,CAAE,MAAO,mBAAoB,KAAM,SAAU,MAAOG,EAAQ,EACxEH,EAAO,KAAK,CAAE,MAAO,mBAAoB,KAAM,SAAU,MAAOI,EAAQ,EACpEC,EAAO,QACTL,EAAO,KAAK,CAAE,MAAO,kBAAmB,KAAM,QAAS,MAAOK,EAAQ,EAEjEL,CACT,EAAG,CAACH,CAAW,CAAC,EACV,CAACU,EAAcC,CAAe,EAAIvB,EAAAA,SAAwB,IAAI,EAC9D,CAACwB,EAAgBC,CAAe,EAAIzB,EAAAA,SAAS,EAAK,EAClD,CAAC0B,EAAmBC,CAAkB,EAAI3B,EAAAA,SAAS,EAAK,EACxD,CAAC4B,EAAYC,CAAW,EAAI7B,EAAAA,SAAS,EAAK,EAC1C,CAAC8B,EAASC,CAAQ,EAAI/B,EAAAA,SAAS,EAAK,EAE1CS,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC/B,GAAa,CAACoB,EAAgB,CACjCiC,EAAS,EAAK,EACd,MACF,CACA,MAAMC,EAAoB/C,GAAQa,CAAc,EAC1CmC,EAAmBhD,GAAQP,CAAS,EAGpCwD,MAAe,IAAI,CACvB,gBACA,oBACA,oBACA,aAAA,CACD,EAED,IAAIC,EAAQ,GACZ,SAAW,CAAC5V,EAAKf,CAAK,IAAK,OAAO,QAAQyW,CAAgB,EAAG,CAE3D,GAAIC,EAAS,IAAI3V,CAAG,EAAG,SAEvB,MAAM6V,EAAgBJ,EAAkBzV,CAAG,EAE3C,GAAI,CAACqG,GAAMpH,EAAO4W,CAAa,EAAG,CAChCD,EAAQ,GACR,KACF,CACF,CACA,GAAI,CAACA,GACH,UAAW5V,KAAO,OAAO,KAAKyV,CAAiB,EAE7C,GAAI,CAAAE,EAAS,IAAI3V,CAAG,GAEhB,EAAEA,KAAO0V,GAAmB,CAC9BE,EAAQ,GACR,KACF,EAGJJ,EAASI,CAAK,CAChB,EAAG,CAACzD,EAAWoB,CAAc,CAAC,EAE9BW,EAAAA,UAAU,IAAM,CACdd,IAAgBmC,CAAO,CACzB,EAAG,CAACA,EAASnC,CAAa,CAAC,EAE3Bc,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqB,EAAS,OACd,MAAMO,EAAsBC,GAA6B,CACvDA,EAAM,eAAA,EACNA,EAAM,YAAc,EACtB,EACA,cAAO,iBAAiB,eAAgBD,CAAkB,EACnD,IAAM,CACX,OAAO,oBAAoB,eAAgBA,CAAkB,CAC/D,CACF,EAAG,CAACP,CAAO,CAAC,EAEZrB,EAAAA,UAAU,IACD,IAAM,CACXd,IAAgB,EAAK,CACvB,EACC,CAACA,CAAa,CAAC,EAElBc,EAAAA,UAAU,IAAM,CAEd,GAAI,CADiB,GAAQa,GAAgBE,GAAkBE,GAAqBE,GACjE,OACnB,MAAMW,EAAiBD,GAAyB,CAC1CA,EAAM,MAAQ,WAChBf,EAAgB,IAAI,EACpBE,EAAgB,EAAK,EACrBI,EAAY,EAAK,EAErB,EACA,OAAO,iBAAiB,UAAWU,CAAa,EAChD,KAAM,CAAE,MAAAC,GAAU,SAAS,KACrBC,EAAmBD,EAAM,SAC/B,OAAAA,EAAM,SAAW,SACV,IAAM,CACX,OAAO,oBAAoB,UAAWD,CAAa,EACnDC,EAAM,SAAWC,CACnB,CACF,EAAG,CAACnB,EAAcE,EAAgBE,EAAmBE,CAAU,CAAC,EAEhEnB,EAAAA,UAAU,IAAM,CACTa,IACAV,EAAY,KAAK,CAAC,CAACrU,CAAG,IAAMA,IAAQ+U,CAAY,GACnDC,EAAgB,IAAI,EAExB,EAAG,CAACD,EAAcV,CAAW,CAAC,EAE9B,MAAM8B,EAAiBnC,EAAAA,YACpB7L,GAAyC,CACxC,GAAI,CAACgK,EAAW,OAChB,MAAMQ,EAASxK,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,MAAM,CAAC,EAC1D,IAAIjI,EAAQ,EACRF,EAAM,GAAG2S,CAAM,IAAIzS,CAAK,GAC5B,KAAOiS,EAAUnS,CAAG,GAClBE,GAAS,EACTF,EAAM,GAAG2S,CAAM,IAAIzS,CAAK,GAE1B,MAAMkW,EAAWvD,GAAkB1K,CAAI,EACnCiO,GAAY,OAAOA,GAAa,WACjCA,EAAqC,KAAOpW,GAE/C0T,EACEvN,GAAQgM,EAAYvP,GAAU,CAC5BA,EAAM5C,CAAG,EAAIoW,CACf,CAAC,CAAA,EAGHpB,EAAgBhV,CAAG,CACrB,EACA,CAACmS,CAAS,CAAA,EAENkE,GAAoBrC,EAAAA,YACvBhU,GAAgB,CACf,GAAI,CAACmS,EAAW,OAChB,MAAM2C,EAAW9U,EAAI,YAAA,EACjB,CAAC8U,EAAS,WAAW,QAAQ,GAAK,CAACA,EAAS,WAAW,QAAQ,GAAK,CAACA,EAAS,WAAW,QAAQ,GAMjG,CAHc,OAAO,QACvB,UAAU9U,CAAG,iCAAA,GAKTA,KAAOmS,IAGbuB,EACEvN,GAAQgM,EAAYvP,GAAU,CAC5B,OAAOA,EAAM5C,CAAG,CAClB,CAAC,CAAA,EAEC+U,IAAiB/U,GACnBgV,EAAgB,IAAI,EAEtB3B,EAAK,GAAGrT,CAAG,WAAY,SAAS,EAClC,EACA,CAACmS,EAAW4C,EAAc1B,CAAI,CAAA,EAG1BiD,GAAsBtC,EAAAA,YAC1B,CAACuC,EAAiBC,IAAuB,CACvC,GAAI,CAACrE,EAAW,OAChB,MAAMsE,EAAUD,EAAW,KAAA,EAC3B,GAAI,GAACC,GAAWA,IAAYF,GAG5B,IAAIpE,EAAUsE,CAAO,EAAG,CACtBpD,EAAK,sBAAsBoD,CAAO,mBAAoB,OAAO,EAC7D,MACF,CACA/C,EACEvN,GAAQgM,EAAYvP,GAAU,CAC5B,MAAMyP,EAAUzP,EAAM2T,CAAO,EAC7B,OAAO3T,EAAM2T,CAAO,EACpB3T,EAAM6T,CAAO,EAAIpE,EACbA,GAAW,OAAOA,GAAY,WAC/BA,EAAoC,KAAOoE,EAEhD,CAAC,CAAA,EAEC1B,IAAiBwB,GACnBvB,EAAgByB,CAAO,EAE3B,EACA,CAACtE,EAAWkB,EAAM0B,CAAY,CAAA,EAG1B2B,GAAe1C,EAAAA,YAAY,SAAY,CAC3C,GAAK7B,EACL,CAAA2B,EAAU,EAAI,EACd,GAAI,CACF,MAAM6C,EAAmBzE,GAAkBC,CAAS,EACpD,GAAIwE,EAAiB,OAAQ,CAC3B,MAAMC,EAAYD,EACf,IAAK9X,IAAU,GAAGA,GAAM,KAAK,KAAK,GAAG,CAAC,KAAKA,GAAM,OAAO,EAAE,EAC1D,KAAK;AAAA,CAAI,EACNgY,EACJF,EAAiB,SAAW,EACxBC,EACA;AAAA,EAAyCA,CAAS,GACxDvD,EAAKwD,EAAS,OAAO,EACrB/C,EAAU,EAAK,EACf,MACF,CACA,MAAM2B,EAAoB/C,GAAQa,GAAkB,EAAE,EAChDmC,EAAmBhD,GAAQP,CAAS,EACpC2E,EAAmC,CAAA,EACzC,SAAW,CAAC9W,EAAKf,CAAK,IAAK,OAAO,QAAQyW,CAAgB,EAAG,CAC3D,MAAMG,GAAgBJ,EAAkBzV,CAAG,EAEtCqG,GAAMpH,EAAO4W,EAAa,IAC7BiB,EAAQ9W,CAAG,EAAIf,EAEnB,CACA,UAAWe,KAAO,OAAO,KAAKyV,CAAiB,EACvCzV,KAAO0V,IACXoB,EAAQ9W,CAAG,EAAI,MAGnB,GAAI,OAAO,KAAK8W,CAAO,EAAE,SAAW,EAAG,CACrCzD,EAAK,sBAAuB,MAAM,EAClCS,EAAU,EAAK,EACf,MACF,CACA,KAAM,CAAE,eAAAiD,EAAgB,WAAAC,EAAY,kBAAAC,CAAA,EAAsB,MAAMC,GAAa,CAAE,QAAAJ,EAAS,EAGxF,IAAID,EAAU,sBAed,GAdIG,IAAe,OACjBH,GAAW,4BACFG,IAAe,aAAeC,GAAmB,OAC1DJ,GAAW,eAAeI,EAAkB,MAAM,eAAeA,EAAkB,KAAK,IAAI,CAAC,GACpFD,IAAe,cAAgBC,GAAmB,OAC3DJ,GAAW,gBAAgBI,EAAkB,KAAK,IAAI,CAAC,GAC9CD,IAAe,QACxBH,GAAW,yBACFG,IAAe,aACxBH,GAAW,qCAEbxD,EAAKwD,EAAS,SAAS,EAGnBE,GAAkB,WAAY,OAChC,GAAI,CACF,MAAMI,EAAa,MAAM,OAAO,KAAA,EAChC,MAAM,QAAQ,IACZA,EAAW,IAAIC,GAAa,OAAO,OAAOA,CAAS,CAAC,CAAA,CAExD,OAASvY,EAAO,CACd,QAAQ,KAAK,0BAA2BA,CAAK,CAC/C,CAGF,MAAMkV,EAAA,CACR,OAASlV,EAAO,CACdwU,EACExU,aAAiB,MACbA,EAAM,QACN,iCACJ,OAAA,CAEJ,QAAA,CACEiV,EAAU,EAAK,CACjB,EACF,EAAG,CAAC3B,EAAWoB,EAAgBQ,EAAYV,CAAI,CAAC,EAEhD,OAAIM,GAAW,CAACxB,EAEZkF,EAAAA,KAAC,UAAA,CAAQ,UAAU,OACjB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,SAAA,SAAM,QAClC,MAAA,CAAI,UAAU,YACb,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,SAAA,CAAU,EAAE,yBAAA,CAAA,CAC9B,CAAA,CACF,CAAA,EACF,EAKFD,EAAAA,KAAAE,WAAA,CACE,SAAA,CAAAF,EAAAA,KAAC,UAAA,CAAQ,UAAU,OACjB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,SAAA,SAAM,EACnCD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,UAAA,CAAQ,UAAU,mBACjB,SAAAD,EAAAA,KAAC,WAAQ,UAAU,4BAA4B,KAAI,GACjD,SAAA,CAAAC,MAAC,UAAA,CACC,SAAAA,EAAAA,IAAC,OAAA,CAAK,SAAA,oBAAA,CAAkB,EAC1B,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAC,EAAAA,IAACE,GAAA,CACC,MAAM,WACN,YAAY,iCACZ,YAAa,IAAMtC,EAAgB,EAAI,CAAA,CAAA,EAEzCoC,EAAAA,IAACE,GAAA,CACC,MAAM,eACN,YAAY,uBACZ,YAAa,IAAMpC,EAAmB,EAAI,CAAA,CAAA,EAE5CkC,EAAAA,IAACE,GAAA,CACC,MAAM,OACN,YAAY,iCACZ,YAAa,IAAMlC,EAAY,EAAI,CAAA,CAAA,CACrC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,EACCf,EAAmB,OAClB+C,MAAC,OAAI,UAAU,oBACZ,WAAmB,IAAKG,GACvBH,EAAAA,IAAC,UAAA,CAAQ,UAAU,mBACjB,SAAAD,EAAAA,KAAC,WAAQ,UAAU,4BAA4B,KAAI,GAChD,SAAA,CAAAA,OAAC,UAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAM,WAAM,KAAA,CAAM,QAClB,OAAA,CAAK,UAAU,0BACb,SAAAG,EAAM,MAAM,OACf,GACGA,EAAM,OAAS,UAAYA,EAAM,OAAS,UAAYA,EAAM,OAAS,WACvEJ,EAAAA,KAAC,SAAA,CACC,UAAU,YACV,KAAK,SACL,QAAS,IAAMlB,EAAesB,EAAM,IAAsC,EAE1E,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAU,IAAKrJ,EAAA,CAAS,EAAE,cAAA,CAAA,CAAA,CAE7B,EAEH,EACDiJ,EAAAA,IAAC,MAAA,CAAI,UAAU,kBACZ,SAAAG,EAAM,MAAM,IAAI,CAAC,CAACzX,EAAKf,CAAK,IAAM,CACjC,MAAM8Q,EAAMzG,EAASrK,EAAyB,CAAC,KAAK,CAAC,EAC/C0Y,EAAWrO,EAASrK,EAAyB,CAAC,UAAU,CAAC,EACzD2Y,EAAUtO,EAASrK,EAAyB,CAAC,SAAS,CAAC,EACvD4Y,EAAYJ,EAAM,OAAS,UAAYA,EAAM,OAAS,UAAYA,EAAM,OAAS,SACvF,OACEJ,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAe,SAAAtX,EAAI,EAClCqX,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,qBACZ,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,SAAA,CAAO,EACXA,EAAAA,IAAC,KAAA,CAAI,SAAAM,EAAU,UAAY,UAAA,CAAW,CAAA,EACxC,EACAP,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,UAAA,CAAQ,QACX,KAAA,CAAI,SAAAK,EAAW,OAAOA,CAAQ,EAAI,GAAA,CAAI,CAAA,EACzC,EACAN,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,KAAA,CAAG,EACPA,MAAC,MAAG,UAAU,0BACX,WAAM,OAAOvH,CAAG,EAAI,GAAA,CACvB,CAAA,CAAA,CACF,CAAA,EACF,EACAsH,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACZ,SAAA,CAAAQ,EACCR,EAAAA,KAAC,SAAA,CACC,UAAU,aACV,KAAK,SACL,QAAS,IAAMhB,GAAkBrW,CAAG,EAEpC,SAAA,CAAAsX,EAAAA,IAACI,EAAA,CAAU,IAAKnJ,EAAA,CAAY,EAAE,QAAA,CAAA,CAAA,EAG9B,KACJ8I,EAAAA,KAAC,SAAA,CACC,UAAU,cACV,KAAK,SACL,QAAS,IAAMrC,EAAgBhV,CAAG,EAElC,SAAA,CAAAsX,EAAAA,IAACI,EAAA,CAAU,IAAKI,EAAA,CAAe,EAAE,WAAA,CAAA,CAAA,CAEnC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,EAvCqD9X,CAwCvD,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EArEyCyX,EAAM,IAsEjD,CACD,EACH,EACE,KACJH,EAAAA,IAAC,MAAA,CAAI,UAAU,gBACb,SAAAD,EAAAA,KAAC,SAAA,CACC,UAAU,cACV,QAAS,IAAM,KAAKX,GAAA,EACpB,SAAU7C,EAEV,SAAA,CAAAyD,EAAAA,IAACI,EAAA,CAAU,IAAKpJ,EAAA,CAAU,EAAE,oBAAA,CAAA,CAAA,CAE9B,CACF,CAAA,CAAA,CACF,CAAA,EACF,EACCyG,GAAgB5C,EACfmF,EAAAA,IAACS,GAAA,CACC,QAAShD,EACT,MAAQ5C,EAAU4C,CAAY,GAAwB,KACtD,SAAUZ,EACV,SAAUmC,GACV,QAAS,IAAMtB,EAAgB,IAAI,CAAA,CAAA,EAEnC,KACHC,EACCqC,EAAAA,IAACU,GAAA,CACC,MAAM,WACN,OAAQ5I,GACR,MAAO+C,EACP,SAAU,CAAA,EACV,SAAUgC,EACV,QAAS,IAAMe,EAAgB,EAAK,CAAA,CAAA,EAEpC,KACHC,EACCmC,EAAAA,IAACU,GAAA,CACC,MAAM,eACN,OAAQrI,GACR,MAAOwC,EACP,SAAU,CAAA,EACV,SAAUgC,EACV,QAAS,IAAMiB,EAAmB,EAAK,EACvC,iBAAkB,EAAA,CAAA,EAElB,KACHC,EACCiC,EAAAA,IAACU,GAAA,CACC,MAAM,OACN,OAAQnI,GACR,MAAOsC,EACP,SAAU,CAAA,EACV,SAAUgC,EACV,QAAS,IAAMmB,EAAY,EAAK,CAAA,CAAA,EAEhC,IAAA,EACN,CAEJ,CAQA,SAASkC,GAAkB,CACzB,MAAAS,EACA,YAAAC,EACA,YAAAC,CACF,EAAwC,CACtC,OACEd,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAe,SAAAW,EAAM,EACpCZ,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAC,EAAAA,IAAC,KAAG,SAAAY,CAAA,CAAY,EAChBZ,EAAAA,IAAC,MAAA,CAAI,UAAU,qBACb,SAAAD,EAAAA,KAAC,SAAA,CAAO,UAAU,cAAc,KAAK,SAAS,QAASc,EACrD,SAAA,CAAAb,EAAAA,IAACI,EAAA,CAAU,IAAKI,EAAA,CAAe,EAAE,WAAA,CAAA,CAEnC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAgBA,SAASM,EAAW,CAClB,MAAAH,EACA,OAAArG,EACA,MAAAxR,EACA,SAAAyR,EACA,SAAAwG,EACA,gBAAAC,EACA,YAAAC,EAAc,GACd,gBAAAC,EAAkB,CAAA,EAClB,WAAAC,CACF,EAAiC,CAC/B,MAAMC,EAAcD,GAAc5G,EAAS,CAAC,GAAK,GAEjD,GAAIoG,IAAU,2BAA4B,CACxC,MAAMU,EAAYrP,EAASlJ,EAAyB,CAAC,cAAe,wBAAwB,CAAC,GAAK,CAAA,EAC5FwY,EAAiB,OAAO,QAAQD,CAAQ,EAGxCE,EAAiB,GACrBvP,EAASlJ,EAAyB,CAAC,KAAK,CAAC,GACvCkJ,EAASlJ,EAAyB,CAAC,QAAQ,CAAC,GAE1C0Y,EAAcN,EAAgB,OAAS,EAEvCO,EAAmB,IAAM,CAC7B,MAAMC,EAAe,CAAE,GAAGL,EAAU,GAAI,EAAA,EACxCN,EAAS,CAAC,GAAGxG,EAAU,cAAe,wBAAwB,EAAG,CAAA,EAAuBmH,CAAY,CACtG,EAEMC,EAAsB,CAACC,EAAgBC,EAAgBvL,IAAqB,CAChF,MAAMoL,EAAe,CAAE,GAAGL,CAAA,EACtBO,IAAWC,GACb,OAAOH,EAAaE,CAAM,EAExBC,EAAO,SACTH,EAAaG,EAAO,KAAA,CAAM,EAAIvL,EAAS,KAAA,GAEzCyK,EAAS,CAAC,GAAGxG,EAAU,cAAe,wBAAwB,EAAG,CAAA,EAAuBmH,CAAY,CACtG,EAEMI,EAAuBpZ,GAAgB,CAC3C,MAAMgZ,EAAe,CAAE,GAAGL,CAAA,EAC1B,OAAOK,EAAahZ,CAAG,EACvBqY,EAAS,CAAC,GAAGxG,EAAU,cAAe,wBAAwB,EAAG,CAAA,EAAuBmH,CAAY,CACtG,EAEA,OACE3B,EAAAA,KAAC,UAAA,CAAQ,UAAU,iBAAiB,KAAMkB,EACxC,SAAA,CAAAjB,EAAAA,IAAC,WAAS,SAAAW,CAAA,CAAM,EAChBZ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAoB,MAAO,CAAE,aAAc,MAAA,EAAU,SAAA,gLAAA,CAEpE,EAEEuB,EAIGC,EAKHzB,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACZ,SAAAsB,EAAe,IAAI,CAAC,CAACS,EAAaC,CAAW,EAAGpZ,IAC/CmX,EAAAA,KAAC,MAAA,CAAgB,UAAU,sBACzB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAC,EAAAA,IAAC,SAAM,SAAA,cAAA,CAAY,EACnBA,EAAAA,IAACiC,GAAA,CACC,QAASf,EAAgB,IAAK/S,IAAO,CACnC,MAAOA,EAAE,KACT,MAAOA,EAAE,IAAA,EACT,EACF,MACE4T,EACI,CAAE,MAAOA,EAAa,MAAOA,GAC7B,KAEN,SAAWG,GACTP,EACEI,EACAG,GAAQ,OAAS,GACjBF,CAAA,EAGJ,YAAY,yBACZ,YAAW,GACX,OAAQ7K,GAAA,EACR,gBAAgB,cAAA,CAAA,CAClB,EACF,EACA4I,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAC,EAAAA,IAAC,SAAM,SAAA,cAAA,CAAY,EACnBA,EAAAA,IAACiC,GAAA,CACC,QAASf,EAAgB,IAAK/S,IAAO,CACnC,MAAOA,EAAE,KACT,MAAOA,EAAE,IAAA,EACT,EACF,MACE6T,EACI,CAAE,MAAOA,EAAa,MAAOA,GAC7B,KAEN,SAAWE,GACTP,EACEI,EACAA,EACAG,GAAQ,OAAS,EAAA,EAGrB,YAAY,yBACZ,YAAW,GACX,OAAQ/K,GAAA,EACR,gBAAgB,cAAA,CAAA,CAClB,EACF,EACA6I,EAAAA,IAAC,SAAA,CACC,UAAU,sBACV,KAAK,SACL,QAAS,IAAM8B,EAAoBC,CAAW,EAC9C,MAAM,iBAEN,SAAA/B,EAAAA,IAACI,EAAA,CAAU,IAAKnJ,EAAA,CAAY,CAAA,CAAA,CAC9B,GA1DQrO,CA2DV,CACD,EACH,EACAoX,EAAAA,IAAC,MAAA,CAAI,UAAU,iBACb,SAAAD,EAAAA,KAAC,SAAA,CAAO,UAAU,MAAM,KAAK,SAAS,QAAS0B,EAC7C,SAAA,CAAAzB,EAAAA,IAACI,EAAA,CAAU,IAAKrJ,EAAA,CAAS,EAAE,qBAAA,CAAA,CAE7B,CAAA,CACF,CAAA,CAAA,CACF,EA3EAgJ,OAAC,MAAA,CAAI,UAAU,aAAa,SAAA,CAAA,uEAC2CqB,EAAY,WAAA,CAAA,CACnF,EANApB,EAAAA,IAAC,MAAA,CAAI,UAAU,gBAAgB,SAAA,kGAAA,CAE/B,CA6EA,CAAA,CAEJ,CAAA,EACF,CAEJ,CAEA,GAAIW,IAAU,WAAY,CACxB,MAAMwB,EAAYnQ,EAASlJ,EAAyB,CAAC,UAAW,UAAU,CAAC,GAAK,CAAA,EAC1EsZ,EAAmB,IAAM,CAC7B,MAAMC,EAAe,CACnB,GAAGF,EACH,CACE,IAAK,GACL,eAAgB,GAChB,cAAe,GACf,QAAS,CAAA,CAAC,CACZ,EAEFpB,EAAS,CAAC,GAAGxG,EAAU,UAAW,UAAU,EAAG,CAAA,EAAuB8H,CAAY,CACpF,EACMC,EAAuB1Z,GAAkB,CAC7C,MAAMyZ,EAAe,CAAC,GAAGF,CAAQ,EACjCE,EAAa,OAAOzZ,EAAO,CAAC,EAC5BmY,EAAS,CAAC,GAAGxG,EAAU,UAAW,UAAU,EAAG,CAAA,EAAuB8H,CAAY,CACpF,EACA,OACEtC,EAAAA,KAAC,UAAA,CAAQ,UAAU,iBAAiB,KAAMkB,EACxC,SAAA,CAAAjB,EAAAA,IAAC,WAAS,SAAAW,CAAA,CAAM,EAChBZ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,eACZ,WAAS,IAAI,CAACuC,EAAS3Z,IACtBoX,EAAAA,IAACwC,GAAA,CAEC,OAAAlI,EACA,MAAOiI,EACP,SAAU,CAAC,GAAGhI,EAAU,UAAW,WAAY,OAAO3R,CAAK,CAAC,EAC5D,SAAAmY,EACA,SAAU,IAAMuB,EAAoB1Z,CAAK,CAAA,EALpCA,CAAA,CAOR,EACH,EACAoX,EAAAA,IAAC,MAAA,CAAI,UAAU,iBACb,SAAAD,EAAAA,KAAC,SAAA,CAAO,UAAU,MAAM,KAAK,SAAS,QAASqC,EAC7C,SAAA,CAAApC,EAAAA,IAACI,EAAA,CAAU,IAAKrJ,EAAA,CAAS,EAAE,aAAA,CAAA,CAE7B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,MAAM0L,EAAiBnI,EAAO,IAAKb,GAAU,CAC3C,GAAIA,EAAM,YAAa,CACrB,GAAI,CAAC2H,EACH,OAAO,KAET,MAAMzJ,EAAUnB,GAAW,CAAC4K,CAAW,CAAC,EAGxC,IAAIsB,EACJ,OAAItB,EAAY,WAAW,QAAQ,EACjCsB,EAAiB,SACRtB,EAAY,WAAW,QAAQ,EACxCsB,EAAiB,SACRtB,EAAY,WAAW,QAAQ,IACxCsB,EAAiB,UAIjB1C,EAAAA,IAAC2C,GAAA,CAEC,MAAOlJ,EAAM,MACb,QAAS9B,EACT,YAAayJ,EACb,YAAa3H,EAAM,YACnB,eAAAiJ,EACA,SAAWvD,GAAY6B,IAAkBI,EAAajC,CAAO,CAAA,EANxD,GAAGiC,CAAW,SAAA,CASzB,CAEA,MAAM5G,EAAef,EAAM,MAAQ,CAAA,EAC7B5N,EAAO,CAAC,GAAG0O,EAAU,GAAGC,CAAY,EACpC9R,EAAMmD,EAAK,KAAK,GAAG,EACnB+W,EAAW/W,EAAK,OAAS,EAC3BmG,EAASlJ,EAAyB+C,CAAI,EACtC,OACEyT,EACJ7F,EAAM,SAASmJ,CAAQ,IACtBnJ,EAAM,OAAS,WAAa,EAAQmJ,EAAY,OAAOA,GAAY,EAAE,GAClEjL,EAAUnB,GAAW3K,CAAI,EACzB+U,EACJnH,EAAM,aACN/B,GAAsBC,CAAO,IAC5B8B,EAAM,OAAS,WACZ,qBAAqBA,EAAM,KAAK,IAChC,WAAWA,EAAM,KAAK,WAGtBoJ,EADgBtI,EAAS,OAAS,GAAKrD,GAAsB,KAAKqD,EAAS,CAAC,GAAK,EAAE,IACnDd,EAAM,OAAOA,EAAM,KAAK,OAAS,CAAC,GAAK,MAAQ,SAC/EqJ,EAAiBrJ,EAAM,UAAY,0BAA4B,QAErE,GAAIA,EAAM,OACR,OACEuG,EAAAA,IAAC+C,GAAA,CAEC,MAAOtJ,EAAM,MACb,QAAA9B,EACA,YAAAiJ,EACA,MAAO,OAAOgC,GAAY,EAAE,EAC5B,YAAanJ,EAAM,YACnB,WAAY,CAACoJ,EACb,SAAWG,GAAQjC,EAASlV,EAAM4N,EAAOuJ,CAAG,CAAA,EAPvCta,CAAA,EAcX,GAAI+Q,EAAM,OAAS,WACjB,OACEsG,EAAAA,KAAC,MAAA,CAAc,UAAU,iBACvB,SAAA,CAAAA,EAAAA,KAAC,QAAA,CAAM,MAAOpI,EACZ,SAAA,CAAAqI,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAS,EAAQV,EACjB,SAAWb,GAAUsC,EAASlV,EAAM4N,EAAOgF,EAAM,OAAO,OAAO,CAAA,CAAA,EAEhEhF,EAAM,KAAA,EACT,EACCmH,GAAeZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAY,CAAA,CAAY,CAAA,CAAA,EATxDlY,CAUV,EAGJ,GAAI+Q,EAAM,OAAS,SAAU,CAE3B,MAAMwJ,EAAexJ,EAAM,QAAU,SAAW5N,EAAK,KAAK,GAAG,IAAM,cAGnE,IAAIqX,EAAe5D,EACnB,GAAI2D,GAAgB,OAAO3D,GAAc,SAAU,CACjD,MAAM6D,EAAkB7D,EAAU,YAAA,EAC9B6D,IAAoB,QACtBD,EAAe,QAEfA,EAAe,MAKnB,CAEA,OACEnD,EAAAA,KAAC,MAAA,CAAc,UAAW+C,EACxB,SAAA,CAAA9C,EAAAA,IAAC,QAAA,CAAM,MAAOrI,EAAU,SAAA8B,EAAM,MAAM,EACpCuG,EAAAA,IAACiC,GAAA,CACC,SAAUxI,EAAM,SAAW,CAAA,GAAI,IAAI2J,IAAM,CAAE,MAAOA,EAAG,MAAOA,CAAA,EAAI,EAChE,MAAOF,EAAe,CAAE,MAAOA,EAAc,MAAOA,GAAiB,KACrE,SAAWhB,GAAW,CACpB,MAAM5L,EAAW4L,GAAQ,OAAS,GAIlC,GAHAnB,EAASlV,EAAM4N,EAAOnD,CAAQ,EAG1B2M,GAAgB,OAAO3M,GAAa,UAAYA,EAAU,CAC5D,MAAM+M,GAAQ/M,EAAS,YAAA,EACvB,SAAS,gBAAgB,aAAa,aAAc+M,EAAK,EACzD,aAAa,QAAQ,QAASA,EAAK,CACrC,CACF,EACA,OAAQlM,GAAA,CAAgB,CAAA,EAEzByJ,GAAeZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAY,EAAY,EAC/DqC,GAAgBjD,EAAAA,IAAC,MAAA,CAAI,UAAU,aAAa,SAAA,iCAAA,CAA+B,CAAA,CAAA,EAnBpEtX,CAoBV,CAEJ,CACA,OAAI+Q,EAAM,OAAS,SAEfsG,EAAAA,KAAC,MAAA,CAAc,UAAW+C,EACxB,SAAA,CAAA9C,EAAAA,IAAC,QAAA,CAAM,MAAOrI,EAAU,SAAA8B,EAAM,MAAM,EACpCuG,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,MAAO,OAAOV,CAAS,GAAK,EAC5B,SAAWb,GAAUsC,EAASlV,EAAM4N,EAAO,OAAOgF,EAAM,OAAO,KAAK,CAAC,EACrE,YAAahF,EAAM,WAAA,CAAA,EAEpBmH,GAAeZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAY,CAAA,CAAY,CAAA,CAAA,EARxDlY,CASV,EAGA+Q,EAAM,OAAS,WAEfsG,EAAAA,KAAC,MAAA,CAAc,UAAW+C,EACxB,SAAA,CAAA9C,EAAAA,IAAC,QAAA,CAAM,MAAOrI,EAAU,SAAA8B,EAAM,MAAM,EACpCuG,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,MAAO,OAAOV,CAAS,EACvB,SAAWb,GAAUsC,EAASlV,EAAM4N,EAAOgF,EAAM,OAAO,KAAK,EAC7D,YAAahF,EAAM,WAAA,CAAA,EAEpBmH,GAAeZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAY,CAAA,CAAY,CAAA,CAAA,EARxDlY,CASV,EAIFqX,EAAAA,KAAC,MAAA,CAAc,UAAW+C,EACxB,SAAA,CAAA9C,EAAAA,IAAC,QAAA,CAAM,MAAOrI,EAAU,SAAA8B,EAAM,MAAM,EACpCuG,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAO,OAAOV,CAAS,EACvB,SAAWb,GAAUsC,EAASlV,EAAM4N,EAAOgF,EAAM,OAAO,KAAK,EAC7D,YAAahF,EAAM,WAAA,CAAA,EAEpBmH,GAAeZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAY,CAAA,CAAY,CAAA,CAAA,EARxDlY,CASV,CAEJ,CAAC,EAED,OAAIiY,EAEAZ,EAAAA,KAAC,UAAA,CAAQ,UAAU,iBAAiB,KAAMkB,EACxC,SAAA,CAAAjB,EAAAA,IAAC,WAAS,SAAAW,CAAA,CAAM,EAChBX,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAyC,CAAA,CAAe,CAAA,EACnE,EAIGzC,EAAAA,IAAC,MAAA,CAAI,UAAU,aAAc,SAAAyC,EAAe,CACrD,CAEA,SAASD,GAAY,CACnB,OAAAlI,EACA,MAAAxR,EACA,SAAAyR,EACA,SAAAwG,EACA,SAAAuC,CACF,EAMgB,CACd,MAAMC,EAAevR,EAASlJ,EAAO,CAAC,MAAM,CAAC,GAAgB,cAC7D,OACEiX,EAAAA,KAAC,UAAA,CAAQ,UAAU,oBAAoB,KAAI,GACzC,SAAA,CAAAA,EAAAA,KAAC,UAAA,CAAQ,UAAU,cACjB,SAAA,CAAAC,EAAAA,IAAC,QAAM,SAAAuD,CAAA,CAAY,EACnBvD,EAAAA,IAAC,SAAA,CAAO,UAAU,mBAAmB,KAAK,SAAS,QAASsD,EAC1D,SAAAtD,EAAAA,IAACI,EAAA,CAAU,IAAKnJ,EAAA,CAAY,CAAA,CAC9B,CAAA,EACF,EACA+I,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAAA,EAAAA,IAACc,EAAA,CAAW,MAAO,KAAM,OAAAxG,EAAgB,MAAAxR,EAAc,SAAAyR,EAAoB,SAAAwG,CAAA,CAAoB,CAAA,CACjG,CAAA,EACF,CAEJ,CAWA,SAAS4B,GAAiB,CACxB,MAAAzI,EACA,YAAAsJ,EACA,YAAAC,EACA,QAAA9L,EACA,eAAA+K,EACA,SAAAgB,CACF,EAAuC,CACrC,KAAM,CAAC/b,EAAOwT,CAAQ,EAAIgB,EAAAA,SAASqH,CAAW,EACxC5C,EACJlJ,GAAsBC,CAAO,GAAK,cAAc6L,CAAW,aAE7D5G,EAAAA,UAAU,IAAM,CACdzB,EAASqI,CAAW,CACtB,EAAG,CAACA,CAAW,CAAC,EAEhB,MAAMG,EAAS,IAAM,CACnB,MAAM/L,EAAUjQ,EAAM,KAAA,EACtB,GAAI,CAACiQ,EAAS,CACZuD,EAASqI,CAAW,EACpB,MACF,CAEA,IAAII,EAAehM,EAUnB,GAPI8K,GAAkB,CAAC9K,EAAQ,WAAW8K,CAAc,IAEtDkB,EAAelB,GAAkB9K,EAAQ,WAAW,GAAG,EAAIA,EAAU,IAAIA,CAAO,KAK9E,CADgB,8BACH,KAAKgM,CAAY,EAAG,CAEnC,MAAM,oCAAoClB,GAAkB,kBAAkB;AAAA,WAAqBA,GAAkB,QAAQ,SAAS,EACtIvH,EAASqI,CAAW,EACpB,MACF,CAEII,IAAiBJ,EACnBE,EAASE,CAAY,EAErBzI,EAASqI,CAAW,CAExB,EAEA,OACEzD,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAA,EAAAA,KAAC,QAAA,CAAM,UAAU,cACf,SAAA,CAAAC,EAAAA,IAAC,QAAM,SAAA9F,CAAA,CAAM,EACZvC,EACCqI,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAY,MAAOrI,EAAS,aAAYA,EAAS,SAAA,GAAA,CAEjE,EACE,IAAA,EACN,EACCiJ,EAAcZ,EAAAA,IAAC,IAAA,CAAE,UAAU,oBAAqB,WAAY,EAAO,KACpEA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAArY,EACA,YAAA8b,EACA,SAAWhF,GAAUtD,EAASsD,EAAM,OAAO,KAAK,EAChD,OAAQkF,EACR,UAAYlF,GAAU,CAChBA,EAAM,MAAQ,SAChBA,EAAM,eAAA,EACNkF,EAAA,GACSlF,EAAM,MAAQ,WACvBA,EAAM,eAAA,EACNtD,EAASqI,CAAW,EAExB,CAAA,CAAA,CACF,EACF,CAEJ,CAYA,SAAST,GAAY,CACnB,MAAA7I,EACA,MAAAvS,EACA,YAAA8b,EACA,QAAA9L,EACA,YAAAiJ,EACA,WAAAiD,EAAa,GACb,SAAA9C,CACF,EAAkC,CAChC,KAAM,CAAC+C,EAAWC,CAAY,EAAI5H,EAAAA,SAAS,EAAK,EAE1C6H,EAAgB,IAAM,CAC1B,IAAInC,EAAS,GACT,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,WAChEA,EAAS,OAAO,WAAA,EAAa,QAAQ,KAAM,EAAE,EAE7CA,EAAS,MAAM,KAAK,CAAE,OAAQ,EAAA,EAAM,IAClC,KAAK,MAAM,KAAK,SAAW,EAAE,EAAE,SAAS,EAAE,CAAA,EAC1C,KAAK,EAAE,EAEXd,EAASc,CAAM,CACjB,EAEA,OACE9B,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,MAAOrI,EAAU,SAAAuC,EAAM,EAC9B6F,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAM8D,EAAY,OAAS,WAC3B,MAAAnc,EACA,YAAA8b,EACA,SAAWhF,GAAUsC,EAAStC,EAAM,OAAO,KAAK,CAAA,CAAA,QAEjD,SAAA,CAAO,KAAK,SAAS,UAAU,YAAY,QAAS,IAAMsF,EAAa,CAACD,CAAS,EAChF,SAAA9D,MAACI,EAAA,CAAU,IAAKtJ,GAAgB,EAClC,EACC+M,GACC7D,EAAAA,IAAC,SAAA,CAAO,KAAK,SAAS,UAAU,YAAY,QAASgE,EACnD,SAAAhE,MAACI,EAAA,CAAU,IAAK6D,GAAa,CAAA,CAC/B,CAAA,EAEJ,EACCrD,GAAeZ,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAY,CAAA,CAAY,CAAA,EAClE,CAEJ,CAUA,SAASH,GAAiB,CACxB,QAAAyD,EACA,MAAApb,EACA,SAAAiY,EACA,SAAA2C,EACA,QAAAS,CACF,EAAuC,CACrC,KAAM,CAAE,cAAA5K,EAAe,YAAAC,EAAa,gBAAAE,EAAiB,qBAAAC,EAAsB,cAAAC,EAAe,cAAAC,EAAe,cAAAC,CAAA,EACvGZ,GAAgBgL,CAAO,EACnB,CAAE,KAAAnI,CAAA,EAASC,GAAA,EAGX,CAACoI,EAAWC,CAAY,EAAIlI,EAAAA,SAG/B,CAAE,QAAS,GAAO,OAAQ,KAAM,EAE7B,CAAC+E,EAAiBoD,CAAkB,EAAInI,EAAAA,SAE5C,CAAA,CAAE,EAGEnK,EAAYnG,GAA4B,CAC5C,GAAK/C,EAEL,OAAOmN,GAAInN,EAAO+C,CAAI,CACxB,EAGA+Q,EAAAA,UAAU,IAAM,CACdyH,EAAa,CAAE,QAAS,GAAO,OAAQ,KAAM,EAC7CC,EAAmB,CAAA,CAAE,CACvB,EAAG,CAACtS,EAAS,CAAC,KAAK,CAAC,EAAGA,EAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAG5C4K,EAAAA,UAAU,IAAM,CACd,MAAMnE,EAAMzG,EAAS,CAAC,KAAK,CAAC,EACtB0G,EAAS1G,EAAS,CAAC,QAAQ,CAAC,EAE9ByG,GAAOC,GAAU,CAAC0L,EAAU,SAAW,CAACA,EAAU,QAEpDG,EAAqB,EAAI,CAG7B,EAAG,CAAA,CAAE,EAGL,MAAMA,EAAuB,MAAOC,EAAS,KAAU,CACrD,MAAM/L,EAAMzG,EAAS,CAAC,KAAK,CAAC,EACtB0G,EAAS1G,EAAS,CAAC,QAAQ,CAAC,EAG5BwL,EAAW0G,EAAQ,YAAA,EACnBO,EAAUjH,EAAS,SAAS,QAAQ,EACtC,SACAA,EAAS,SAAS,QAAQ,EACxB,SACA,SAEN,GAAI,CAAC/E,GAAO,CAACC,EACX,OAAK8L,GACHzI,EAAK,yCAA0C,OAAO,EAEjD,GAGTsI,EAAa,CAAE,QAAS,GAAM,OAAQ,KAAM,EAE5C,GAAI,CACF,MAAM7Y,EAAS,MAAMkZ,GAAkB,CAAE,QAAAD,EAAS,IAAAhM,EAAK,OAAAC,EAAQ,EAG/D,OAFA2L,EAAa,CAAE,QAAS,GAAO,OAAA7Y,CAAA,CAAQ,EAEnCA,EAAO,SAELA,EAAO,iBACT8Y,EAAmB9Y,EAAO,eAAe,EAEtCgZ,GACHzI,EAAK,gBAAgBmI,CAAO,iBAAkB,SAAS,EAElD,KAEFM,GACHzI,EAAK,sBAAsBvQ,EAAO,OAAO,GAAI,OAAO,EAE/C,GAEX,MAAQ,CACN,OAAA6Y,EAAa,CAAE,QAAS,GAAO,OAAQ,KAAM,EACxCG,GACHzI,EAAK,yBAA0B,OAAO,EAEjC,EACT,CACF,EAGM4I,EAAa,SAAY,CAC7B,MAAMlM,EAAMzG,EAAS,CAAC,KAAK,CAAC,EACtB0G,EAAS1G,EAAS,CAAC,QAAQ,CAAC,EAG9ByG,GAAOC,EACO,MAAM6L,EAAqB,EAAK,IAE9CxI,EAAK,mCAAoC,SAAS,EAClDoI,EAAA,GAKFA,EAAA,CAEJ,EAEA,aACG,MAAA,CAAI,UAAU,iBAAiB,KAAK,eAAe,QAASA,EAC3D,SAAApE,EAAAA,KAAC,MAAA,CACC,UAAU,QACV,KAAK,SACL,aAAW,OACX,kBAAgB,2BAChB,QAAU6E,GAAMA,EAAE,gBAAA,EAElB,SAAA,CAAA7E,EAAAA,KAAC,MAAA,CAAI,UAAU,eACb,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,GAAG,2BAA2B,SAAA,CAAA,aACtBC,EAAAA,IAAC,QAAM,SAAAkE,CAAA,CAAQ,CAAA,EAC3B,SACC,SAAA,CAAO,UAAU,YAAY,KAAK,SAAS,QAASC,EACnD,SAAA,CAAAnE,EAAAA,IAACI,EAAA,CAAU,IAAKyE,EAAA,CAAW,EAAE,OAAA,CAAA,CAE/B,CAAA,EACF,EACA9E,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAC,EAAAA,IAACc,EAAA,CACC,MAAO,KACP,OAAQvH,EACR,MAAAzQ,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,gBAAiB+b,EACjB,WAAYQ,EACZ,YAAW,EAAA,CAAA,EAEZE,EAAU,QACTpE,EAAAA,IAAC,MAAA,CACC,UAAW,SAASoE,EAAU,OAAO,QAAU,UAAY,OAAO,GAClE,MAAO,CAAE,OAAQ,QAAA,EAEhB,SAAAA,EAAU,OAAO,QAChBrE,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAAF,OAAC,SAAA,CAAO,SAAA,CAAA,KAAGqE,EAAU,OAAO,OAAA,EAAQ,EACnCA,EAAU,OAAO,YAChBrE,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAAgB,SAAA,CAAA,YACnBqE,EAAU,OAAO,WAAW,QACrCA,EAAU,OAAO,WAAW,QAC3B,KAAKA,EAAU,OAAO,WAAW,MAAM,GAAA,EAC3C,EAEDA,EAAU,OAAO,iBAChBrE,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAAgB,SAAA,CAAA,SACtBqE,EAAU,OAAO,gBAAgB,OAAO,qBAAA,CAAA,CAEjD,CAAA,CAAA,CAEJ,EAEArE,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,IAAC,UAAO,SAAA,sBAAA,CAAoB,QAC3B,KAAA,EAAG,EACHoE,EAAU,OAAO,OAAA,CAAA,CACpB,CAAA,CAAA,EAINpE,EAAAA,IAACc,EAAA,CACC,MAAM,eACN,OAAQtH,EACR,MAAA1Q,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,EACZ,YAAW,EAAA,CAAA,EAEblE,EAAAA,IAACc,EAAA,CACC,MAAM,2BACN,OAAQ,CAAA,EACR,MAAAhY,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,EACZ,YAAW,GACX,gBAAAhD,CAAA,CAAA,EAEDxH,EAAgB,OAAS,GACxBsG,EAAAA,IAACc,EAAA,CACC,MAAM,mBACN,OAAQpH,EACR,MAAA5Q,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,CAAA,CAAA,EAGfvK,EAAqB,OAAS,GAC7BqG,EAAAA,IAACc,EAAA,CACC,MAAM,wBACN,OAAQnH,EACR,MAAA7Q,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,CAAA,CAAA,EAGhBlE,EAAAA,IAACc,EAAA,CACC,MAAM,mBACN,OAAQlH,EACR,MAAA9Q,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,CAAA,CAAA,EAEdlE,EAAAA,IAACc,EAAA,CACC,MAAM,UACN,OAAQjH,EACR,MAAA/Q,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,CAAA,CAAA,EAEdlE,EAAAA,IAACc,EAAA,CACC,MAAM,WACN,OAAQhH,EACR,MAAAhR,EACA,SAAU,CAAA,EACV,SAAU,CAAC+C,EAAMoO,EAAKtS,IAAUoZ,EAAS,CAACmD,EAAS,GAAGrY,CAAI,EAAGoO,EAAKtS,CAAK,EACvE,WAAYuc,CAAA,CAAA,CACd,EACF,EACAnE,EAAAA,KAAC,MAAA,CAAI,UAAU,eACb,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,UAAU,gBACV,KAAK,SACL,QAAS,IAAMuE,EAAqB,EAAK,EACzC,SAAUH,EAAU,QAEnB,SAAAA,EAAU,QACTrE,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,IAACI,EAAA,CAAU,IAAK6D,EAAA,CAAa,EAAE,YAAA,CAAA,CAEjC,EAEA,MAAA,CAAA,SAGH,SAAA,CAAO,UAAU,cAAc,KAAK,SAAS,QAASU,EACrD,SAAA,CAAA3E,EAAAA,IAACI,EAAA,CAAU,IAAKpJ,EAAA,CAAU,EAAE,MAAA,CAAA,CAE9B,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,EAEJ,CAEJ,CAYA,SAAS0J,GAAkB,CACzB,MAAAC,EACA,OAAArG,EACA,MAAAxR,EACA,SAAAyR,EACA,SAAAwG,EACA,QAAAoD,EACA,iBAAAW,EAAmB,EACrB,EAA+C,CAC7C,MAAMC,EAAQC,GAAA,EAEd,OAAKlc,QAEF,MAAA,CAAI,UAAU,iBAAiB,KAAK,eAAe,QAASqb,EAC3D,SAAApE,EAAAA,KAAC,MAAA,CACC,UAAU,QACV,KAAK,SACL,aAAW,OACX,kBAAiB,GAAGY,CAAK,eACzB,QAAUlC,GAAUA,EAAM,gBAAA,EAE1B,SAAA,CAAAsB,EAAAA,KAAC,MAAA,CAAI,UAAU,eACb,SAAA,CAAAC,MAAC,KAAA,CAAG,GAAI,GAAGW,CAAK,eAAiB,SAAAA,EAAM,SACtC,SAAA,CAAO,UAAU,YAAY,KAAK,SAAS,QAASwD,EACnD,SAAA,CAAAnE,EAAAA,IAACI,EAAA,CAAU,IAAKyE,EAAA,CAAW,EAAE,OAAA,CAAA,CAE/B,CAAA,EACF,EACA9E,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAC,EAAAA,IAACc,EAAA,CACC,MAAO,KACP,OAAAxG,EACA,MAAAxR,EACA,SAAAyR,EACA,SAAAwG,EACA,YAAW,EAAA,CAAA,EAEZ+D,GAAoBC,GACnBhF,OAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,oBAAoB,SAAA,gBAAa,EAC/CD,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAA,OAAC,QAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAS+E,EAAM,QACf,SAAWH,GAAMG,EAAM,WAAWH,EAAE,OAAO,OAAO,CAAA,CAAA,EAEnD,IAAI,kBAAA,EACP,EACA5E,EAAAA,IAAC,IAAA,CAAE,UAAU,oBAAoB,SAAA,wCAAA,CAAsC,CAAA,EACzE,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAA,OAAC,QAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAS+E,EAAM,YACf,SAAWH,GAAMG,EAAM,eAAeH,EAAE,OAAO,OAAO,CAAA,CAAA,EAEvD,IAAI,wBAAA,EACP,EACA5E,EAAAA,IAAC,IAAA,CAAE,UAAU,oBAAoB,SAAA,0CAAA,CAAwC,CAAA,EAC3E,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAA,OAAC,QAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAS+E,EAAM,YACf,SAAWH,GAAMG,EAAM,eAAeH,EAAE,OAAO,OAAO,CAAA,CAAA,EAEvD,IAAI,wBAAA,EACP,EACA5E,EAAAA,IAAC,IAAA,CAAE,UAAU,oBAAoB,SAAA,wCAAA,CAAsC,CAAA,EACzE,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,QACb,SAAA,CAAAC,EAAAA,IAAC,SAAM,SAAA,OAAA,CAAK,EACZD,EAAAA,KAAC,SAAA,CACC,MAAOgF,EAAM,MACb,SAAWH,GAAMG,EAAM,SAASH,EAAE,OAAO,KAAyB,EAElE,SAAA,CAAA5E,EAAAA,IAAC,SAAA,CAAO,MAAM,OAAO,SAAA,OAAI,EACzBA,EAAAA,IAAC,SAAA,CAAO,MAAM,QAAQ,SAAA,OAAA,CAAK,CAAA,CAAA,CAAA,EAE7BA,EAAAA,IAAC,IAAA,CAAE,UAAU,oBAAoB,SAAA,6BAAA,CAA2B,CAAA,CAAA,CAC9D,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,eACb,SAAAD,EAAAA,KAAC,SAAA,CAAO,UAAU,cAAc,KAAK,SAAS,QAASoE,EACrD,SAAA,CAAAnE,EAAAA,IAACI,EAAA,CAAU,IAAKpJ,EAAA,CAAU,EAAE,MAAA,CAAA,CAE9B,CAAA,CACF,CAAA,CAAA,CAAA,EAEJ,EArFiB,IAuFrB","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59]}
1
+ {"version":3,"file":"ConfigView.js","sources":["../../../webui/node_modules/immer/dist/immer.mjs","../../../webui/node_modules/fast-deep-equal/index.js","../../../webui/node_modules/lodash-es/_freeGlobal.js","../../../webui/node_modules/lodash-es/_root.js","../../../webui/node_modules/lodash-es/_Symbol.js","../../../webui/node_modules/lodash-es/_getRawTag.js","../../../webui/node_modules/lodash-es/_objectToString.js","../../../webui/node_modules/lodash-es/_baseGetTag.js","../../../webui/node_modules/lodash-es/isObjectLike.js","../../../webui/node_modules/lodash-es/isSymbol.js","../../../webui/node_modules/lodash-es/_arrayMap.js","../../../webui/node_modules/lodash-es/isArray.js","../../../webui/node_modules/lodash-es/_baseToString.js","../../../webui/node_modules/lodash-es/isObject.js","../../../webui/node_modules/lodash-es/isFunction.js","../../../webui/node_modules/lodash-es/_coreJsData.js","../../../webui/node_modules/lodash-es/_isMasked.js","../../../webui/node_modules/lodash-es/_toSource.js","../../../webui/node_modules/lodash-es/_baseIsNative.js","../../../webui/node_modules/lodash-es/_getValue.js","../../../webui/node_modules/lodash-es/_getNative.js","../../../webui/node_modules/lodash-es/_defineProperty.js","../../../webui/node_modules/lodash-es/_isIndex.js","../../../webui/node_modules/lodash-es/_baseAssignValue.js","../../../webui/node_modules/lodash-es/eq.js","../../../webui/node_modules/lodash-es/_assignValue.js","../../../webui/node_modules/lodash-es/_isKey.js","../../../webui/node_modules/lodash-es/_nativeCreate.js","../../../webui/node_modules/lodash-es/_hashClear.js","../../../webui/node_modules/lodash-es/_hashDelete.js","../../../webui/node_modules/lodash-es/_hashGet.js","../../../webui/node_modules/lodash-es/_hashHas.js","../../../webui/node_modules/lodash-es/_hashSet.js","../../../webui/node_modules/lodash-es/_Hash.js","../../../webui/node_modules/lodash-es/_listCacheClear.js","../../../webui/node_modules/lodash-es/_assocIndexOf.js","../../../webui/node_modules/lodash-es/_listCacheDelete.js","../../../webui/node_modules/lodash-es/_listCacheGet.js","../../../webui/node_modules/lodash-es/_listCacheHas.js","../../../webui/node_modules/lodash-es/_listCacheSet.js","../../../webui/node_modules/lodash-es/_ListCache.js","../../../webui/node_modules/lodash-es/_Map.js","../../../webui/node_modules/lodash-es/_mapCacheClear.js","../../../webui/node_modules/lodash-es/_isKeyable.js","../../../webui/node_modules/lodash-es/_getMapData.js","../../../webui/node_modules/lodash-es/_mapCacheDelete.js","../../../webui/node_modules/lodash-es/_mapCacheGet.js","../../../webui/node_modules/lodash-es/_mapCacheHas.js","../../../webui/node_modules/lodash-es/_mapCacheSet.js","../../../webui/node_modules/lodash-es/_MapCache.js","../../../webui/node_modules/lodash-es/memoize.js","../../../webui/node_modules/lodash-es/_memoizeCapped.js","../../../webui/node_modules/lodash-es/_stringToPath.js","../../../webui/node_modules/lodash-es/toString.js","../../../webui/node_modules/lodash-es/_castPath.js","../../../webui/node_modules/lodash-es/_toKey.js","../../../webui/node_modules/lodash-es/_baseGet.js","../../../webui/node_modules/lodash-es/get.js","../../../webui/node_modules/lodash-es/_baseSet.js","../../../webui/node_modules/lodash-es/set.js","../../../webui/src/config/tooltips.ts","../../../webui/src/icons/visibility.svg","../../../webui/src/icons/plus.svg","../../../webui/src/icons/check-mark.svg","../../../webui/src/icons/trash.svg","../../../webui/src/pages/ConfigView.tsx"],"sourcesContent":["// src/utils/env.ts\nvar NOTHING = Symbol.for(\"immer-nothing\");\nvar DRAFTABLE = Symbol.for(\"immer-draftable\");\nvar DRAFT_STATE = Symbol.for(\"immer-state\");\n\n// src/utils/errors.ts\nvar errors = process.env.NODE_ENV !== \"production\" ? [\n // All error codes, starting by 0:\n function(plugin) {\n return `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`;\n },\n function(thing) {\n return `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`;\n },\n \"This object has been frozen and should not be mutated\",\n function(data) {\n return \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" + data;\n },\n \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n \"Immer forbids circular references\",\n \"The first or second argument to `produce` must be a function\",\n \"The third argument to `produce` must be a function or undefined\",\n \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n function(thing) {\n return `'current' expects a draft, got: ${thing}`;\n },\n \"Object.defineProperty() cannot be used on an Immer draft\",\n \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n \"Immer only supports deleting array indices\",\n \"Immer only supports setting array indices and the 'length' property\",\n function(thing) {\n return `'original' expects a draft, got: ${thing}`;\n }\n // Note: if more errors are added, the errorOffset in Patches.ts should be increased\n // See Patches.ts for additional errors\n] : [];\nfunction die(error, ...args) {\n if (process.env.NODE_ENV !== \"production\") {\n const e = errors[error];\n const msg = isFunction(e) ? e.apply(null, args) : e;\n throw new Error(`[Immer] ${msg}`);\n }\n throw new Error(\n `[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n );\n}\n\n// src/utils/common.ts\nvar O = Object;\nvar getPrototypeOf = O.getPrototypeOf;\nvar CONSTRUCTOR = \"constructor\";\nvar PROTOTYPE = \"prototype\";\nvar CONFIGURABLE = \"configurable\";\nvar ENUMERABLE = \"enumerable\";\nvar WRITABLE = \"writable\";\nvar VALUE = \"value\";\nvar isDraft = (value) => !!value && !!value[DRAFT_STATE];\nfunction isDraftable(value) {\n if (!value)\n return false;\n return isPlainObject(value) || isArray(value) || !!value[DRAFTABLE] || !!value[CONSTRUCTOR]?.[DRAFTABLE] || isMap(value) || isSet(value);\n}\nvar objectCtorString = O[PROTOTYPE][CONSTRUCTOR].toString();\nvar cachedCtorStrings = /* @__PURE__ */ new WeakMap();\nfunction isPlainObject(value) {\n if (!value || !isObjectish(value))\n return false;\n const proto = getPrototypeOf(value);\n if (proto === null || proto === O[PROTOTYPE])\n return true;\n const Ctor = O.hasOwnProperty.call(proto, CONSTRUCTOR) && proto[CONSTRUCTOR];\n if (Ctor === Object)\n return true;\n if (!isFunction(Ctor))\n return false;\n let ctorString = cachedCtorStrings.get(Ctor);\n if (ctorString === void 0) {\n ctorString = Function.toString.call(Ctor);\n cachedCtorStrings.set(Ctor, ctorString);\n }\n return ctorString === objectCtorString;\n}\nfunction original(value) {\n if (!isDraft(value))\n die(15, value);\n return value[DRAFT_STATE].base_;\n}\nfunction each(obj, iter, strict = true) {\n if (getArchtype(obj) === 0 /* Object */) {\n const keys = strict ? Reflect.ownKeys(obj) : O.keys(obj);\n keys.forEach((key) => {\n iter(key, obj[key], obj);\n });\n } else {\n obj.forEach((entry, index) => iter(index, entry, obj));\n }\n}\nfunction getArchtype(thing) {\n const state = thing[DRAFT_STATE];\n return state ? state.type_ : isArray(thing) ? 1 /* Array */ : isMap(thing) ? 2 /* Map */ : isSet(thing) ? 3 /* Set */ : 0 /* Object */;\n}\nvar has = (thing, prop, type = getArchtype(thing)) => type === 2 /* Map */ ? thing.has(prop) : O[PROTOTYPE].hasOwnProperty.call(thing, prop);\nvar get = (thing, prop, type = getArchtype(thing)) => (\n // @ts-ignore\n type === 2 /* Map */ ? thing.get(prop) : thing[prop]\n);\nvar set = (thing, propOrOldValue, value, type = getArchtype(thing)) => {\n if (type === 2 /* Map */)\n thing.set(propOrOldValue, value);\n else if (type === 3 /* Set */) {\n thing.add(value);\n } else\n thing[propOrOldValue] = value;\n};\nfunction is(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\nvar isArray = Array.isArray;\nvar isMap = (target) => target instanceof Map;\nvar isSet = (target) => target instanceof Set;\nvar isObjectish = (target) => typeof target === \"object\";\nvar isFunction = (target) => typeof target === \"function\";\nvar isBoolean = (target) => typeof target === \"boolean\";\nfunction isArrayIndex(value) {\n const n = +value;\n return Number.isInteger(n) && String(n) === value;\n}\nvar getProxyDraft = (value) => {\n if (!isObjectish(value))\n return null;\n return value?.[DRAFT_STATE];\n};\nvar latest = (state) => state.copy_ || state.base_;\nvar getValue = (value) => {\n const proxyDraft = getProxyDraft(value);\n return proxyDraft ? proxyDraft.copy_ ?? proxyDraft.base_ : value;\n};\nvar getFinalValue = (state) => state.modified_ ? state.copy_ : state.base_;\nfunction shallowCopy(base, strict) {\n if (isMap(base)) {\n return new Map(base);\n }\n if (isSet(base)) {\n return new Set(base);\n }\n if (isArray(base))\n return Array[PROTOTYPE].slice.call(base);\n const isPlain = isPlainObject(base);\n if (strict === true || strict === \"class_only\" && !isPlain) {\n const descriptors = O.getOwnPropertyDescriptors(base);\n delete descriptors[DRAFT_STATE];\n let keys = Reflect.ownKeys(descriptors);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const desc = descriptors[key];\n if (desc[WRITABLE] === false) {\n desc[WRITABLE] = true;\n desc[CONFIGURABLE] = true;\n }\n if (desc.get || desc.set)\n descriptors[key] = {\n [CONFIGURABLE]: true,\n [WRITABLE]: true,\n // could live with !!desc.set as well here...\n [ENUMERABLE]: desc[ENUMERABLE],\n [VALUE]: base[key]\n };\n }\n return O.create(getPrototypeOf(base), descriptors);\n } else {\n const proto = getPrototypeOf(base);\n if (proto !== null && isPlain) {\n return { ...base };\n }\n const obj = O.create(proto);\n return O.assign(obj, base);\n }\n}\nfunction freeze(obj, deep = false) {\n if (isFrozen(obj) || isDraft(obj) || !isDraftable(obj))\n return obj;\n if (getArchtype(obj) > 1) {\n O.defineProperties(obj, {\n set: dontMutateMethodOverride,\n add: dontMutateMethodOverride,\n clear: dontMutateMethodOverride,\n delete: dontMutateMethodOverride\n });\n }\n O.freeze(obj);\n if (deep)\n each(\n obj,\n (_key, value) => {\n freeze(value, true);\n },\n false\n );\n return obj;\n}\nfunction dontMutateFrozenCollections() {\n die(2);\n}\nvar dontMutateMethodOverride = {\n [VALUE]: dontMutateFrozenCollections\n};\nfunction isFrozen(obj) {\n if (obj === null || !isObjectish(obj))\n return true;\n return O.isFrozen(obj);\n}\n\n// src/utils/plugins.ts\nvar PluginMapSet = \"MapSet\";\nvar PluginPatches = \"Patches\";\nvar PluginArrayMethods = \"ArrayMethods\";\nvar plugins = {};\nfunction getPlugin(pluginKey) {\n const plugin = plugins[pluginKey];\n if (!plugin) {\n die(0, pluginKey);\n }\n return plugin;\n}\nvar isPluginLoaded = (pluginKey) => !!plugins[pluginKey];\nfunction loadPlugin(pluginKey, implementation) {\n if (!plugins[pluginKey])\n plugins[pluginKey] = implementation;\n}\n\n// src/core/scope.ts\nvar currentScope;\nvar getCurrentScope = () => currentScope;\nvar createScope = (parent_, immer_) => ({\n drafts_: [],\n parent_,\n immer_,\n // Whenever the modified draft contains a draft from another scope, we\n // need to prevent auto-freezing so the unowned draft can be finalized.\n canAutoFreeze_: true,\n unfinalizedDrafts_: 0,\n handledSet_: /* @__PURE__ */ new Set(),\n processedForPatches_: /* @__PURE__ */ new Set(),\n mapSetPlugin_: isPluginLoaded(PluginMapSet) ? getPlugin(PluginMapSet) : void 0,\n arrayMethodsPlugin_: isPluginLoaded(PluginArrayMethods) ? getPlugin(PluginArrayMethods) : void 0\n});\nfunction usePatchesInScope(scope, patchListener) {\n if (patchListener) {\n scope.patchPlugin_ = getPlugin(PluginPatches);\n scope.patches_ = [];\n scope.inversePatches_ = [];\n scope.patchListener_ = patchListener;\n }\n}\nfunction revokeScope(scope) {\n leaveScope(scope);\n scope.drafts_.forEach(revokeDraft);\n scope.drafts_ = null;\n}\nfunction leaveScope(scope) {\n if (scope === currentScope) {\n currentScope = scope.parent_;\n }\n}\nvar enterScope = (immer2) => currentScope = createScope(currentScope, immer2);\nfunction revokeDraft(draft) {\n const state = draft[DRAFT_STATE];\n if (state.type_ === 0 /* Object */ || state.type_ === 1 /* Array */)\n state.revoke_();\n else\n state.revoked_ = true;\n}\n\n// src/core/finalize.ts\nfunction processResult(result, scope) {\n scope.unfinalizedDrafts_ = scope.drafts_.length;\n const baseDraft = scope.drafts_[0];\n const isReplaced = result !== void 0 && result !== baseDraft;\n if (isReplaced) {\n if (baseDraft[DRAFT_STATE].modified_) {\n revokeScope(scope);\n die(4);\n }\n if (isDraftable(result)) {\n result = finalize(scope, result);\n }\n const { patchPlugin_ } = scope;\n if (patchPlugin_) {\n patchPlugin_.generateReplacementPatches_(\n baseDraft[DRAFT_STATE].base_,\n result,\n scope\n );\n }\n } else {\n result = finalize(scope, baseDraft);\n }\n maybeFreeze(scope, result, true);\n revokeScope(scope);\n if (scope.patches_) {\n scope.patchListener_(scope.patches_, scope.inversePatches_);\n }\n return result !== NOTHING ? result : void 0;\n}\nfunction finalize(rootScope, value) {\n if (isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n if (!state) {\n const finalValue = handleValue(value, rootScope.handledSet_, rootScope);\n return finalValue;\n }\n if (!isSameScope(state, rootScope)) {\n return value;\n }\n if (!state.modified_) {\n return state.base_;\n }\n if (!state.finalized_) {\n const { callbacks_ } = state;\n if (callbacks_) {\n while (callbacks_.length > 0) {\n const callback = callbacks_.pop();\n callback(rootScope);\n }\n }\n generatePatchesAndFinalize(state, rootScope);\n }\n return state.copy_;\n}\nfunction maybeFreeze(scope, value, deep = false) {\n if (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n freeze(value, deep);\n }\n}\nfunction markStateFinalized(state) {\n state.finalized_ = true;\n state.scope_.unfinalizedDrafts_--;\n}\nvar isSameScope = (state, rootScope) => state.scope_ === rootScope;\nvar EMPTY_LOCATIONS_RESULT = [];\nfunction updateDraftInParent(parent, draftValue, finalizedValue, originalKey) {\n const parentCopy = latest(parent);\n const parentType = parent.type_;\n if (originalKey !== void 0) {\n const currentValue = get(parentCopy, originalKey, parentType);\n if (currentValue === draftValue) {\n set(parentCopy, originalKey, finalizedValue, parentType);\n return;\n }\n }\n if (!parent.draftLocations_) {\n const draftLocations = parent.draftLocations_ = /* @__PURE__ */ new Map();\n each(parentCopy, (key, value) => {\n if (isDraft(value)) {\n const keys = draftLocations.get(value) || [];\n keys.push(key);\n draftLocations.set(value, keys);\n }\n });\n }\n const locations = parent.draftLocations_.get(draftValue) ?? EMPTY_LOCATIONS_RESULT;\n for (const location of locations) {\n set(parentCopy, location, finalizedValue, parentType);\n }\n}\nfunction registerChildFinalizationCallback(parent, child, key) {\n parent.callbacks_.push(function childCleanup(rootScope) {\n const state = child;\n if (!state || !isSameScope(state, rootScope)) {\n return;\n }\n rootScope.mapSetPlugin_?.fixSetContents(state);\n const finalizedValue = getFinalValue(state);\n updateDraftInParent(parent, state.draft_ ?? state, finalizedValue, key);\n generatePatchesAndFinalize(state, rootScope);\n });\n}\nfunction generatePatchesAndFinalize(state, rootScope) {\n const shouldFinalize = state.modified_ && !state.finalized_ && (state.type_ === 3 /* Set */ || state.type_ === 1 /* Array */ && state.allIndicesReassigned_ || (state.assigned_?.size ?? 0) > 0);\n if (shouldFinalize) {\n const { patchPlugin_ } = rootScope;\n if (patchPlugin_) {\n const basePath = patchPlugin_.getPath(state);\n if (basePath) {\n patchPlugin_.generatePatches_(state, basePath, rootScope);\n }\n }\n markStateFinalized(state);\n }\n}\nfunction handleCrossReference(target, key, value) {\n const { scope_ } = target;\n if (isDraft(value)) {\n const state = value[DRAFT_STATE];\n if (isSameScope(state, scope_)) {\n state.callbacks_.push(function crossReferenceCleanup() {\n prepareCopy(target);\n const finalizedValue = getFinalValue(state);\n updateDraftInParent(target, value, finalizedValue, key);\n });\n }\n } else if (isDraftable(value)) {\n target.callbacks_.push(function nestedDraftCleanup() {\n const targetCopy = latest(target);\n if (target.type_ === 3 /* Set */) {\n if (targetCopy.has(value)) {\n handleValue(value, scope_.handledSet_, scope_);\n }\n } else {\n if (get(targetCopy, key, target.type_) === value) {\n if (scope_.drafts_.length > 1 && (target.assigned_.get(key) ?? false) === true && target.copy_) {\n handleValue(\n get(target.copy_, key, target.type_),\n scope_.handledSet_,\n scope_\n );\n }\n }\n }\n });\n }\n}\nfunction handleValue(target, handledSet, rootScope) {\n if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n return target;\n }\n if (isDraft(target) || handledSet.has(target) || !isDraftable(target) || isFrozen(target)) {\n return target;\n }\n handledSet.add(target);\n each(target, (key, value) => {\n if (isDraft(value)) {\n const state = value[DRAFT_STATE];\n if (isSameScope(state, rootScope)) {\n const updatedValue = getFinalValue(state);\n set(target, key, updatedValue, target.type_);\n markStateFinalized(state);\n }\n } else if (isDraftable(value)) {\n handleValue(value, handledSet, rootScope);\n }\n });\n return target;\n}\n\n// src/core/proxy.ts\nfunction createProxyProxy(base, parent) {\n const baseIsArray = isArray(base);\n const state = {\n type_: baseIsArray ? 1 /* Array */ : 0 /* Object */,\n // Track which produce call this is associated with.\n scope_: parent ? parent.scope_ : getCurrentScope(),\n // True for both shallow and deep changes.\n modified_: false,\n // Used during finalization.\n finalized_: false,\n // Track which properties have been assigned (true) or deleted (false).\n // actually instantiated in `prepareCopy()`\n assigned_: void 0,\n // The parent draft state.\n parent_: parent,\n // The base state.\n base_: base,\n // The base proxy.\n draft_: null,\n // set below\n // The base copy with any updated values.\n copy_: null,\n // Called by the `produce` function.\n revoke_: null,\n isManual_: false,\n // `callbacks` actually gets assigned in `createProxy`\n callbacks_: void 0\n };\n let target = state;\n let traps = objectTraps;\n if (baseIsArray) {\n target = [state];\n traps = arrayTraps;\n }\n const { revoke, proxy } = Proxy.revocable(target, traps);\n state.draft_ = proxy;\n state.revoke_ = revoke;\n return [proxy, state];\n}\nvar objectTraps = {\n get(state, prop) {\n if (prop === DRAFT_STATE)\n return state;\n let arrayPlugin = state.scope_.arrayMethodsPlugin_;\n const isArrayWithStringProp = state.type_ === 1 /* Array */ && typeof prop === \"string\";\n if (isArrayWithStringProp) {\n if (arrayPlugin?.isArrayOperationMethod(prop)) {\n return arrayPlugin.createMethodInterceptor(state, prop);\n }\n }\n const source = latest(state);\n if (!has(source, prop, state.type_)) {\n return readPropFromProto(state, source, prop);\n }\n const value = source[prop];\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (isArrayWithStringProp && state.operationMethod && arrayPlugin?.isMutatingArrayMethod(\n state.operationMethod\n ) && isArrayIndex(prop)) {\n return value;\n }\n if (value === peek(state.base_, prop)) {\n prepareCopy(state);\n const childKey = state.type_ === 1 /* Array */ ? +prop : prop;\n const childDraft = createProxy(state.scope_, value, state, childKey);\n return state.copy_[childKey] = childDraft;\n }\n return value;\n },\n has(state, prop) {\n return prop in latest(state);\n },\n ownKeys(state) {\n return Reflect.ownKeys(latest(state));\n },\n set(state, prop, value) {\n const desc = getDescriptorFromProto(latest(state), prop);\n if (desc?.set) {\n desc.set.call(state.draft_, value);\n return true;\n }\n if (!state.modified_) {\n const current2 = peek(latest(state), prop);\n const currentState = current2?.[DRAFT_STATE];\n if (currentState && currentState.base_ === value) {\n state.copy_[prop] = value;\n state.assigned_.set(prop, false);\n return true;\n }\n if (is(value, current2) && (value !== void 0 || has(state.base_, prop, state.type_)))\n return true;\n prepareCopy(state);\n markChanged(state);\n }\n if (state.copy_[prop] === value && // special case: handle new props with value 'undefined'\n (value !== void 0 || prop in state.copy_) || // special case: NaN\n Number.isNaN(value) && Number.isNaN(state.copy_[prop]))\n return true;\n state.copy_[prop] = value;\n state.assigned_.set(prop, true);\n handleCrossReference(state, prop, value);\n return true;\n },\n deleteProperty(state, prop) {\n prepareCopy(state);\n if (peek(state.base_, prop) !== void 0 || prop in state.base_) {\n state.assigned_.set(prop, false);\n markChanged(state);\n } else {\n state.assigned_.delete(prop);\n }\n if (state.copy_) {\n delete state.copy_[prop];\n }\n return true;\n },\n // Note: We never coerce `desc.value` into an Immer draft, because we can't make\n // the same guarantee in ES5 mode.\n getOwnPropertyDescriptor(state, prop) {\n const owner = latest(state);\n const desc = Reflect.getOwnPropertyDescriptor(owner, prop);\n if (!desc)\n return desc;\n return {\n [WRITABLE]: true,\n [CONFIGURABLE]: state.type_ !== 1 /* Array */ || prop !== \"length\",\n [ENUMERABLE]: desc[ENUMERABLE],\n [VALUE]: owner[prop]\n };\n },\n defineProperty() {\n die(11);\n },\n getPrototypeOf(state) {\n return getPrototypeOf(state.base_);\n },\n setPrototypeOf() {\n die(12);\n }\n};\nvar arrayTraps = {};\nfor (let key in objectTraps) {\n let fn = objectTraps[key];\n arrayTraps[key] = function() {\n const args = arguments;\n args[0] = args[0][0];\n return fn.apply(this, args);\n };\n}\narrayTraps.deleteProperty = function(state, prop) {\n if (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop)))\n die(13);\n return arrayTraps.set.call(this, state, prop, void 0);\n};\narrayTraps.set = function(state, prop, value) {\n if (process.env.NODE_ENV !== \"production\" && prop !== \"length\" && isNaN(parseInt(prop)))\n die(14);\n return objectTraps.set.call(this, state[0], prop, value, state[0]);\n};\nfunction peek(draft, prop) {\n const state = draft[DRAFT_STATE];\n const source = state ? latest(state) : draft;\n return source[prop];\n}\nfunction readPropFromProto(state, source, prop) {\n const desc = getDescriptorFromProto(source, prop);\n return desc ? VALUE in desc ? desc[VALUE] : (\n // This is a very special case, if the prop is a getter defined by the\n // prototype, we should invoke it with the draft as context!\n desc.get?.call(state.draft_)\n ) : void 0;\n}\nfunction getDescriptorFromProto(source, prop) {\n if (!(prop in source))\n return void 0;\n let proto = getPrototypeOf(source);\n while (proto) {\n const desc = Object.getOwnPropertyDescriptor(proto, prop);\n if (desc)\n return desc;\n proto = getPrototypeOf(proto);\n }\n return void 0;\n}\nfunction markChanged(state) {\n if (!state.modified_) {\n state.modified_ = true;\n if (state.parent_) {\n markChanged(state.parent_);\n }\n }\n}\nfunction prepareCopy(state) {\n if (!state.copy_) {\n state.assigned_ = /* @__PURE__ */ new Map();\n state.copy_ = shallowCopy(\n state.base_,\n state.scope_.immer_.useStrictShallowCopy_\n );\n }\n}\n\n// src/core/immerClass.ts\nvar Immer2 = class {\n constructor(config) {\n this.autoFreeze_ = true;\n this.useStrictShallowCopy_ = false;\n this.useStrictIteration_ = false;\n /**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\n this.produce = (base, recipe, patchListener) => {\n if (isFunction(base) && !isFunction(recipe)) {\n const defaultBase = recipe;\n recipe = base;\n const self = this;\n return function curriedProduce(base2 = defaultBase, ...args) {\n return self.produce(base2, (draft) => recipe.call(this, draft, ...args));\n };\n }\n if (!isFunction(recipe))\n die(6);\n if (patchListener !== void 0 && !isFunction(patchListener))\n die(7);\n let result;\n if (isDraftable(base)) {\n const scope = enterScope(this);\n const proxy = createProxy(scope, base, void 0);\n let hasError = true;\n try {\n result = recipe(proxy);\n hasError = false;\n } finally {\n if (hasError)\n revokeScope(scope);\n else\n leaveScope(scope);\n }\n usePatchesInScope(scope, patchListener);\n return processResult(result, scope);\n } else if (!base || !isObjectish(base)) {\n result = recipe(base);\n if (result === void 0)\n result = base;\n if (result === NOTHING)\n result = void 0;\n if (this.autoFreeze_)\n freeze(result, true);\n if (patchListener) {\n const p = [];\n const ip = [];\n getPlugin(PluginPatches).generateReplacementPatches_(base, result, {\n patches_: p,\n inversePatches_: ip\n });\n patchListener(p, ip);\n }\n return result;\n } else\n die(1, base);\n };\n this.produceWithPatches = (base, recipe) => {\n if (isFunction(base)) {\n return (state, ...args) => this.produceWithPatches(state, (draft) => base(draft, ...args));\n }\n let patches, inversePatches;\n const result = this.produce(base, recipe, (p, ip) => {\n patches = p;\n inversePatches = ip;\n });\n return [result, patches, inversePatches];\n };\n if (isBoolean(config?.autoFreeze))\n this.setAutoFreeze(config.autoFreeze);\n if (isBoolean(config?.useStrictShallowCopy))\n this.setUseStrictShallowCopy(config.useStrictShallowCopy);\n if (isBoolean(config?.useStrictIteration))\n this.setUseStrictIteration(config.useStrictIteration);\n }\n createDraft(base) {\n if (!isDraftable(base))\n die(8);\n if (isDraft(base))\n base = current(base);\n const scope = enterScope(this);\n const proxy = createProxy(scope, base, void 0);\n proxy[DRAFT_STATE].isManual_ = true;\n leaveScope(scope);\n return proxy;\n }\n finishDraft(draft, patchListener) {\n const state = draft && draft[DRAFT_STATE];\n if (!state || !state.isManual_)\n die(9);\n const { scope_: scope } = state;\n usePatchesInScope(scope, patchListener);\n return processResult(void 0, scope);\n }\n /**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * By default, auto-freezing is enabled.\n */\n setAutoFreeze(value) {\n this.autoFreeze_ = value;\n }\n /**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\n setUseStrictShallowCopy(value) {\n this.useStrictShallowCopy_ = value;\n }\n /**\n * Pass false to use faster iteration that skips non-enumerable properties\n * but still handles symbols for compatibility.\n *\n * By default, strict iteration is enabled (includes all own properties).\n */\n setUseStrictIteration(value) {\n this.useStrictIteration_ = value;\n }\n shouldUseStrictIteration() {\n return this.useStrictIteration_;\n }\n applyPatches(base, patches) {\n let i;\n for (i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (patch.path.length === 0 && patch.op === \"replace\") {\n base = patch.value;\n break;\n }\n }\n if (i > -1) {\n patches = patches.slice(i + 1);\n }\n const applyPatchesImpl = getPlugin(PluginPatches).applyPatches_;\n if (isDraft(base)) {\n return applyPatchesImpl(base, patches);\n }\n return this.produce(\n base,\n (draft) => applyPatchesImpl(draft, patches)\n );\n }\n};\nfunction createProxy(rootScope, value, parent, key) {\n const [draft, state] = isMap(value) ? getPlugin(PluginMapSet).proxyMap_(value, parent) : isSet(value) ? getPlugin(PluginMapSet).proxySet_(value, parent) : createProxyProxy(value, parent);\n const scope = parent?.scope_ ?? getCurrentScope();\n scope.drafts_.push(draft);\n state.callbacks_ = parent?.callbacks_ ?? [];\n state.key_ = key;\n if (parent && key !== void 0) {\n registerChildFinalizationCallback(parent, state, key);\n } else {\n state.callbacks_.push(function rootDraftCleanup(rootScope2) {\n rootScope2.mapSetPlugin_?.fixSetContents(state);\n const { patchPlugin_ } = rootScope2;\n if (state.modified_ && patchPlugin_) {\n patchPlugin_.generatePatches_(state, [], rootScope2);\n }\n });\n }\n return draft;\n}\n\n// src/core/current.ts\nfunction current(value) {\n if (!isDraft(value))\n die(10, value);\n return currentImpl(value);\n}\nfunction currentImpl(value) {\n if (!isDraftable(value) || isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n let copy;\n let strict = true;\n if (state) {\n if (!state.modified_)\n return state.base_;\n state.finalized_ = true;\n copy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_);\n strict = state.scope_.immer_.shouldUseStrictIteration();\n } else {\n copy = shallowCopy(value, true);\n }\n each(\n copy,\n (key, childValue) => {\n set(copy, key, currentImpl(childValue));\n },\n strict\n );\n if (state) {\n state.finalized_ = false;\n }\n return copy;\n}\n\n// src/plugins/patches.ts\nfunction enablePatches() {\n const errorOffset = 16;\n if (process.env.NODE_ENV !== \"production\") {\n errors.push(\n 'Sets cannot have \"replace\" patches.',\n function(op) {\n return \"Unsupported patch operation: \" + op;\n },\n function(path) {\n return \"Cannot apply patch, path doesn't resolve: \" + path;\n },\n \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n );\n }\n function getPath(state, path = []) {\n if (state.key_ !== void 0) {\n const parentCopy = state.parent_.copy_ ?? state.parent_.base_;\n const proxyDraft = getProxyDraft(get(parentCopy, state.key_));\n const valueAtKey = get(parentCopy, state.key_);\n if (valueAtKey === void 0) {\n return null;\n }\n if (valueAtKey !== state.draft_ && valueAtKey !== state.base_ && valueAtKey !== state.copy_) {\n return null;\n }\n if (proxyDraft != null && proxyDraft.base_ !== state.base_) {\n return null;\n }\n const isSet2 = state.parent_.type_ === 3 /* Set */;\n let key;\n if (isSet2) {\n const setParent = state.parent_;\n key = Array.from(setParent.drafts_.keys()).indexOf(state.key_);\n } else {\n key = state.key_;\n }\n if (!(isSet2 && parentCopy.size > key || has(parentCopy, key))) {\n return null;\n }\n path.push(key);\n }\n if (state.parent_) {\n return getPath(state.parent_, path);\n }\n path.reverse();\n try {\n resolvePath(state.copy_, path);\n } catch (e) {\n return null;\n }\n return path;\n }\n function resolvePath(base, path) {\n let current2 = base;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n current2 = get(current2, key);\n if (!isObjectish(current2) || current2 === null) {\n throw new Error(`Cannot resolve path at '${path.join(\"/\")}'`);\n }\n }\n return current2;\n }\n const REPLACE = \"replace\";\n const ADD = \"add\";\n const REMOVE = \"remove\";\n function generatePatches_(state, basePath, scope) {\n if (state.scope_.processedForPatches_.has(state)) {\n return;\n }\n state.scope_.processedForPatches_.add(state);\n const { patches_, inversePatches_ } = scope;\n switch (state.type_) {\n case 0 /* Object */:\n case 2 /* Map */:\n return generatePatchesFromAssigned(\n state,\n basePath,\n patches_,\n inversePatches_\n );\n case 1 /* Array */:\n return generateArrayPatches(\n state,\n basePath,\n patches_,\n inversePatches_\n );\n case 3 /* Set */:\n return generateSetPatches(\n state,\n basePath,\n patches_,\n inversePatches_\n );\n }\n }\n function generateArrayPatches(state, basePath, patches, inversePatches) {\n let { base_, assigned_ } = state;\n let copy_ = state.copy_;\n if (copy_.length < base_.length) {\n ;\n [base_, copy_] = [copy_, base_];\n [patches, inversePatches] = [inversePatches, patches];\n }\n const allReassigned = state.allIndicesReassigned_ === true;\n for (let i = 0; i < base_.length; i++) {\n const copiedItem = copy_[i];\n const baseItem = base_[i];\n const isAssigned = allReassigned || assigned_?.get(i.toString());\n if (isAssigned && copiedItem !== baseItem) {\n const childState = copiedItem?.[DRAFT_STATE];\n if (childState && childState.modified_) {\n continue;\n }\n const path = basePath.concat([i]);\n patches.push({\n op: REPLACE,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copiedItem)\n });\n inversePatches.push({\n op: REPLACE,\n path,\n value: clonePatchValueIfNeeded(baseItem)\n });\n }\n }\n for (let i = base_.length; i < copy_.length; i++) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n }\n for (let i = copy_.length - 1; base_.length <= i; --i) {\n const path = basePath.concat([i]);\n inversePatches.push({\n op: REMOVE,\n path\n });\n }\n }\n function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {\n const { base_, copy_, type_ } = state;\n each(state.assigned_, (key, assignedValue) => {\n const origValue = get(base_, key, type_);\n const value = get(copy_, key, type_);\n const op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;\n if (origValue === value && op === REPLACE)\n return;\n const path = basePath.concat(key);\n patches.push(\n op === REMOVE ? { op, path } : { op, path, value: clonePatchValueIfNeeded(value) }\n );\n inversePatches.push(\n op === ADD ? { op: REMOVE, path } : op === REMOVE ? { op: ADD, path, value: clonePatchValueIfNeeded(origValue) } : { op: REPLACE, path, value: clonePatchValueIfNeeded(origValue) }\n );\n });\n }\n function generateSetPatches(state, basePath, patches, inversePatches) {\n let { base_, copy_ } = state;\n let i = 0;\n base_.forEach((value) => {\n if (!copy_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: REMOVE,\n path,\n value\n });\n inversePatches.unshift({\n op: ADD,\n path,\n value\n });\n }\n i++;\n });\n i = 0;\n copy_.forEach((value) => {\n if (!base_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n value\n });\n inversePatches.unshift({\n op: REMOVE,\n path,\n value\n });\n }\n i++;\n });\n }\n function generateReplacementPatches_(baseValue, replacement, scope) {\n const { patches_, inversePatches_ } = scope;\n patches_.push({\n op: REPLACE,\n path: [],\n value: replacement === NOTHING ? void 0 : replacement\n });\n inversePatches_.push({\n op: REPLACE,\n path: [],\n value: baseValue\n });\n }\n function applyPatches_(draft, patches) {\n patches.forEach((patch) => {\n const { path, op } = patch;\n let base = draft;\n for (let i = 0; i < path.length - 1; i++) {\n const parentType = getArchtype(base);\n let p = path[i];\n if (typeof p !== \"string\" && typeof p !== \"number\") {\n p = \"\" + p;\n }\n if ((parentType === 0 /* Object */ || parentType === 1 /* Array */) && (p === \"__proto__\" || p === CONSTRUCTOR))\n die(errorOffset + 3);\n if (isFunction(base) && p === PROTOTYPE)\n die(errorOffset + 3);\n base = get(base, p);\n if (!isObjectish(base))\n die(errorOffset + 2, path.join(\"/\"));\n }\n const type = getArchtype(base);\n const value = deepClonePatchValue(patch.value);\n const key = path[path.length - 1];\n switch (op) {\n case REPLACE:\n switch (type) {\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n die(errorOffset);\n default:\n return base[key] = value;\n }\n case ADD:\n switch (type) {\n case 1 /* Array */:\n return key === \"-\" ? base.push(value) : base.splice(key, 0, value);\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n return base.add(value);\n default:\n return base[key] = value;\n }\n case REMOVE:\n switch (type) {\n case 1 /* Array */:\n return base.splice(key, 1);\n case 2 /* Map */:\n return base.delete(key);\n case 3 /* Set */:\n return base.delete(patch.value);\n default:\n return delete base[key];\n }\n default:\n die(errorOffset + 1, op);\n }\n });\n return draft;\n }\n function deepClonePatchValue(obj) {\n if (!isDraftable(obj))\n return obj;\n if (isArray(obj))\n return obj.map(deepClonePatchValue);\n if (isMap(obj))\n return new Map(\n Array.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n );\n if (isSet(obj))\n return new Set(Array.from(obj).map(deepClonePatchValue));\n const cloned = Object.create(getPrototypeOf(obj));\n for (const key in obj)\n cloned[key] = deepClonePatchValue(obj[key]);\n if (has(obj, DRAFTABLE))\n cloned[DRAFTABLE] = obj[DRAFTABLE];\n return cloned;\n }\n function clonePatchValueIfNeeded(obj) {\n if (isDraft(obj)) {\n return deepClonePatchValue(obj);\n } else\n return obj;\n }\n loadPlugin(PluginPatches, {\n applyPatches_,\n generatePatches_,\n generateReplacementPatches_,\n getPath\n });\n}\n\n// src/plugins/mapset.ts\nfunction enableMapSet() {\n class DraftMap extends Map {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 2 /* Map */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n assigned_: void 0,\n base_: target,\n draft_: this,\n isManual_: false,\n revoked_: false,\n callbacks_: []\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(key) {\n return latest(this[DRAFT_STATE]).has(key);\n }\n set(key, value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!latest(state).has(key) || latest(state).get(key) !== value) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_.set(key, true);\n state.copy_.set(key, value);\n state.assigned_.set(key, true);\n handleCrossReference(state, key, value);\n }\n return this;\n }\n delete(key) {\n if (!this.has(key)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareMapCopy(state);\n markChanged(state);\n if (state.base_.has(key)) {\n state.assigned_.set(key, false);\n } else {\n state.assigned_.delete(key);\n }\n state.copy_.delete(key);\n return true;\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_ = /* @__PURE__ */ new Map();\n each(state.base_, (key) => {\n state.assigned_.set(key, false);\n });\n state.copy_.clear();\n }\n }\n forEach(cb, thisArg) {\n const state = this[DRAFT_STATE];\n latest(state).forEach((_value, key, _map) => {\n cb.call(thisArg, this.get(key), key, this);\n });\n }\n get(key) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n const value = latest(state).get(key);\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value !== state.base_.get(key)) {\n return value;\n }\n const draft = createProxy(state.scope_, value, state, key);\n prepareMapCopy(state);\n state.copy_.set(key, draft);\n return draft;\n }\n keys() {\n return latest(this[DRAFT_STATE]).keys();\n }\n values() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.values(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value\n };\n }\n };\n }\n entries() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.entries(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value: [r.value, value]\n };\n }\n };\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.entries();\n }\n }\n function proxyMap_(target, parent) {\n const map = new DraftMap(target, parent);\n return [map, map[DRAFT_STATE]];\n }\n function prepareMapCopy(state) {\n if (!state.copy_) {\n state.assigned_ = /* @__PURE__ */ new Map();\n state.copy_ = new Map(state.base_);\n }\n }\n class DraftSet extends Set {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 3 /* Set */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n base_: target,\n draft_: this,\n drafts_: /* @__PURE__ */ new Map(),\n revoked_: false,\n isManual_: false,\n assigned_: void 0,\n callbacks_: []\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!state.copy_) {\n return state.base_.has(value);\n }\n if (state.copy_.has(value))\n return true;\n if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n return true;\n return false;\n }\n add(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!this.has(value)) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.add(value);\n handleCrossReference(state, value, value);\n }\n return this;\n }\n delete(value) {\n if (!this.has(value)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n markChanged(state);\n return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) : (\n /* istanbul ignore next */\n false\n ));\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.clear();\n }\n }\n values() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.values();\n }\n entries() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.entries();\n }\n keys() {\n return this.values();\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.values();\n }\n forEach(cb, thisArg) {\n const iterator = this.values();\n let result = iterator.next();\n while (!result.done) {\n cb.call(thisArg, result.value, result.value, this);\n result = iterator.next();\n }\n }\n }\n function proxySet_(target, parent) {\n const set2 = new DraftSet(target, parent);\n return [set2, set2[DRAFT_STATE]];\n }\n function prepareSetCopy(state) {\n if (!state.copy_) {\n state.copy_ = /* @__PURE__ */ new Set();\n state.base_.forEach((value) => {\n if (isDraftable(value)) {\n const draft = createProxy(state.scope_, value, state, value);\n state.drafts_.set(value, draft);\n state.copy_.add(draft);\n } else {\n state.copy_.add(value);\n }\n });\n }\n }\n function assertUnrevoked(state) {\n if (state.revoked_)\n die(3, JSON.stringify(latest(state)));\n }\n function fixSetContents(target) {\n if (target.type_ === 3 /* Set */ && target.copy_) {\n const copy = new Set(target.copy_);\n target.copy_.clear();\n copy.forEach((value) => {\n target.copy_.add(getValue(value));\n });\n }\n }\n loadPlugin(PluginMapSet, { proxyMap_, proxySet_, fixSetContents });\n}\n\n// src/plugins/arrayMethods.ts\nfunction enableArrayMethods() {\n const SHIFTING_METHODS = /* @__PURE__ */ new Set([\"shift\", \"unshift\"]);\n const QUEUE_METHODS = /* @__PURE__ */ new Set([\"push\", \"pop\"]);\n const RESULT_RETURNING_METHODS = /* @__PURE__ */ new Set([\n ...QUEUE_METHODS,\n ...SHIFTING_METHODS\n ]);\n const REORDERING_METHODS = /* @__PURE__ */ new Set([\"reverse\", \"sort\"]);\n const MUTATING_METHODS = /* @__PURE__ */ new Set([\n ...RESULT_RETURNING_METHODS,\n ...REORDERING_METHODS,\n \"splice\"\n ]);\n const FIND_METHODS = /* @__PURE__ */ new Set([\"find\", \"findLast\"]);\n const NON_MUTATING_METHODS = /* @__PURE__ */ new Set([\n \"filter\",\n \"slice\",\n \"concat\",\n \"flat\",\n ...FIND_METHODS,\n \"findIndex\",\n \"findLastIndex\",\n \"some\",\n \"every\",\n \"indexOf\",\n \"lastIndexOf\",\n \"includes\",\n \"join\",\n \"toString\",\n \"toLocaleString\"\n ]);\n function isMutatingArrayMethod(method) {\n return MUTATING_METHODS.has(method);\n }\n function isNonMutatingArrayMethod(method) {\n return NON_MUTATING_METHODS.has(method);\n }\n function isArrayOperationMethod(method) {\n return isMutatingArrayMethod(method) || isNonMutatingArrayMethod(method);\n }\n function enterOperation(state, method) {\n state.operationMethod = method;\n }\n function exitOperation(state) {\n state.operationMethod = void 0;\n }\n function executeArrayMethod(state, operation, markLength = true) {\n prepareCopy(state);\n const result = operation();\n markChanged(state);\n if (markLength)\n state.assigned_.set(\"length\", true);\n return result;\n }\n function markAllIndicesReassigned(state) {\n state.allIndicesReassigned_ = true;\n }\n function normalizeSliceIndex(index, length) {\n if (index < 0) {\n return Math.max(length + index, 0);\n }\n return Math.min(index, length);\n }\n function handleSimpleOperation(state, method, args) {\n return executeArrayMethod(state, () => {\n const result = state.copy_[method](...args);\n if (SHIFTING_METHODS.has(method)) {\n markAllIndicesReassigned(state);\n }\n return RESULT_RETURNING_METHODS.has(method) ? result : state.draft_;\n });\n }\n function handleReorderingOperation(state, method, args) {\n return executeArrayMethod(\n state,\n () => {\n ;\n state.copy_[method](...args);\n markAllIndicesReassigned(state);\n return state.draft_;\n },\n false\n );\n }\n function createMethodInterceptor(state, originalMethod) {\n return function interceptedMethod(...args) {\n const method = originalMethod;\n enterOperation(state, method);\n try {\n if (isMutatingArrayMethod(method)) {\n if (RESULT_RETURNING_METHODS.has(method)) {\n return handleSimpleOperation(state, method, args);\n }\n if (REORDERING_METHODS.has(method)) {\n return handleReorderingOperation(state, method, args);\n }\n if (method === \"splice\") {\n const res = executeArrayMethod(\n state,\n () => state.copy_.splice(...args)\n );\n markAllIndicesReassigned(state);\n return res;\n }\n } else {\n return handleNonMutatingOperation(state, method, args);\n }\n } finally {\n exitOperation(state);\n }\n };\n }\n function handleNonMutatingOperation(state, method, args) {\n const source = latest(state);\n if (method === \"filter\") {\n const predicate = args[0];\n const result = [];\n for (let i = 0; i < source.length; i++) {\n if (predicate(source[i], i, source)) {\n result.push(state.draft_[i]);\n }\n }\n return result;\n }\n if (FIND_METHODS.has(method)) {\n const predicate = args[0];\n const isForward = method === \"find\";\n const step = isForward ? 1 : -1;\n const start = isForward ? 0 : source.length - 1;\n for (let i = start; i >= 0 && i < source.length; i += step) {\n if (predicate(source[i], i, source)) {\n return state.draft_[i];\n }\n }\n return void 0;\n }\n if (method === \"slice\") {\n const rawStart = args[0] ?? 0;\n const rawEnd = args[1] ?? source.length;\n const start = normalizeSliceIndex(rawStart, source.length);\n const end = normalizeSliceIndex(rawEnd, source.length);\n const result = [];\n for (let i = start; i < end; i++) {\n result.push(state.draft_[i]);\n }\n return result;\n }\n return source[method](...args);\n }\n loadPlugin(PluginArrayMethods, {\n createMethodInterceptor,\n isArrayOperationMethod,\n isMutatingArrayMethod\n });\n}\n\n// src/immer.ts\nvar immer = new Immer2();\nvar produce = immer.produce;\nvar produceWithPatches = /* @__PURE__ */ immer.produceWithPatches.bind(\n immer\n);\nvar setAutoFreeze = /* @__PURE__ */ immer.setAutoFreeze.bind(immer);\nvar setUseStrictShallowCopy = /* @__PURE__ */ immer.setUseStrictShallowCopy.bind(\n immer\n);\nvar setUseStrictIteration = /* @__PURE__ */ immer.setUseStrictIteration.bind(\n immer\n);\nvar applyPatches = /* @__PURE__ */ immer.applyPatches.bind(immer);\nvar createDraft = /* @__PURE__ */ immer.createDraft.bind(immer);\nvar finishDraft = /* @__PURE__ */ immer.finishDraft.bind(immer);\nvar castDraft = (value) => value;\nvar castImmutable = (value) => value;\nexport {\n Immer2 as Immer,\n applyPatches,\n castDraft,\n castImmutable,\n createDraft,\n current,\n enableArrayMethods,\n enableMapSet,\n enablePatches,\n finishDraft,\n freeze,\n DRAFTABLE as immerable,\n isDraft,\n isDraftable,\n NOTHING as nothing,\n original,\n produce,\n produceWithPatches,\n setAutoFreeze,\n setUseStrictIteration,\n setUseStrictShallowCopy\n};\n//# sourceMappingURL=immer.mjs.map","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n","import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n","import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n","import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n","import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseSet from './_baseSet.js';\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n}\n\nexport default set;\n","export const FIELD_TOOLTIPS: Record<string, string> = {\n \"Settings.ConsoleLevel\":\n \"Level of logging; choose between CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, TRACE.\",\n \"Settings.Logging\": \"Enable writing log output to files.\",\n \"Settings.CompletedDownloadFolder\":\n \"Folder where completed downloads are stored. Replace backslashes with forward slashes.\",\n \"Settings.FreeSpace\":\n \"Desired free space threshold (use K, M, G, T suffix). Set to -1 to disable the free space guard.\",\n \"Settings.FreeSpaceFolder\":\n \"Path used when checking free space. Replace backslashes with forward slashes.\",\n \"Settings.AutoPauseResume\":\n \"Automatically pause and resume torrents in response to the free space guard.\",\n \"Settings.NoInternetSleepTimer\":\n \"Delay, in seconds, before retrying when no internet connectivity is detected.\",\n \"Settings.LoopSleepTimer\":\n \"Delay, in seconds, between processing passes when monitoring torrents.\",\n \"Settings.SearchLoopDelay\":\n \"Delay, in seconds, between media search requests.\",\n \"Settings.FailedCategory\": \"Category that marks torrents as failed.\",\n \"Settings.RecheckCategory\": \"Category that triggers recheck handling.\",\n \"Settings.Tagless\": \"Enable tagless operation when categories are not used.\",\n \"Settings.IgnoreTorrentsYoungerThan\":\n \"Ignore torrents younger than this many seconds when evaluating failures.\",\n \"Settings.PingURLS\":\n \"Hostnames used to test for internet connectivity. They are pinged frequently.\",\n \"Settings.FFprobeAutoUpdate\":\n \"Download and update the bundled ffprobe binary automatically.\",\n \"Settings.AutoUpdateEnabled\":\n \"Enable the background worker that periodically checks for qBitrr updates.\",\n \"Settings.AutoUpdateCron\":\n \"Cron expression describing when to check for updates (default weekly Sunday at 03:00).\",\n \"Settings.AutoRestartProcesses\":\n \"Automatically restart worker processes that crash unexpectedly. Recommended to keep enabled for reliability.\",\n \"Settings.MaxProcessRestarts\":\n \"Maximum number of times a worker process can be restarted within the restart window before auto-restart is disabled. Prevents infinite crash loops.\",\n \"Settings.ProcessRestartWindow\":\n \"Time window in seconds for tracking restart attempts. If MaxProcessRestarts is exceeded within this window, auto-restart is disabled for that process.\",\n \"Settings.ProcessRestartDelay\":\n \"Delay in seconds before restarting a crashed worker process. Gives time for transient issues to resolve.\",\n \"WebUI.Host\":\n \"Interface address for the built-in WebUI. 0.0.0.0 binds on all interfaces.\",\n \"WebUI.Port\": \"Port number for the built-in WebUI.\",\n \"WebUI.Token\":\n \"Optional bearer token required by the WebUI/API. Leave empty to disable authentication.\",\n \"WebUI.LiveArr\": \"Enable live updates for Arr views.\",\n \"WebUI.GroupSonarr\": \"Group Sonarr views by series and seasons in collapsible sections.\",\n \"WebUI.Theme\": \"Choose the visual theme for the WebUI (light or dark).\",\n\n \"qBit.Disabled\":\n \"Disable qBitrr's direct qBittorrent integration (headless mode for search-only setups).\",\n \"qBit.Host\": \"qBittorrent WebUI host or IP address.\",\n \"qBit.Port\": \"qBittorrent WebUI port.\",\n \"qBit.UserName\": \"qBittorrent WebUI username.\",\n \"qBit.Password\":\n \"qBittorrent WebUI password. Remove this if authentication is bypassed for the host.\",\n\n \"Disabled\":\n \"Disable this qBittorrent instance (headless mode for search-only setups).\",\n \"Host\": \"qBittorrent WebUI host or IP address.\",\n \"Port\": \"qBittorrent WebUI port.\",\n \"UserName\": \"qBittorrent WebUI username.\",\n \"Password\":\n \"qBittorrent WebUI password. Remove this if authentication is bypassed for the host.\",\n\n \"ARR.Managed\": \"Toggle whether this Servarr instance is actively managed by qBitrr.\",\n \"ARR.URI\":\n \"Servarr URL, including protocol and port if needed (for example http://localhost:8989).\",\n \"ARR.APIKey\": \"Servarr API key from Settings > General > Security.\",\n \"ARR.Category\":\n \"qBittorrent category applied by the Servarr instance to its downloads.\",\n \"ARR.ReSearch\": \"Re-run searches for failed torrents that qBitrr removes.\",\n \"ARR.importMode\":\n \"Preferred import mode (Move, Copy, or Auto) when Servarr grabs completed files.\",\n \"ARR.RssSyncTimer\":\n \"Interval, in minutes, between RSS sync requests (0 disables the task).\",\n \"ARR.RefreshDownloadsTimer\":\n \"Interval, in minutes, between queue refresh requests (0 disables the task).\",\n \"ARR.ArrErrorCodesToBlocklist\":\n \"List of Servarr error messages that should trigger blocklisting and cleanup.\",\n\n \"EntrySearch.SearchMissing\": \"Search for missing media items.\",\n \"EntrySearch.AlsoSearchSpecials\": \"Include season 0 specials in missing searches.\",\n \"EntrySearch.Unmonitored\": \"Include unmonitored series or episodes in searches.\",\n \"EntrySearch.SearchLimit\":\n \"Maximum number of concurrent search tasks (Servarr enforces its own limits).\",\n \"EntrySearch.SearchByYear\":\n \"Order searches by the year the episode or movie first aired.\",\n \"EntrySearch.SearchInReverse\":\n \"Reverse search order (search oldest to newest instead of newest to oldest).\",\n \"EntrySearch.SearchRequestsEvery\":\n \"Delay, in seconds, between submitting individual search requests.\",\n \"EntrySearch.DoUpgradeSearch\":\n \"Search for improved releases even if a file already exists.\",\n \"EntrySearch.QualityUnmetSearch\":\n \"Search again when the quality requirements were not met.\",\n \"EntrySearch.CustomFormatUnmetSearch\":\n \"Search again when the minimum custom format score was not met.\",\n \"EntrySearch.ForceMinimumCustomFormat\":\n \"Automatically remove torrents that do not meet the minimum custom format score.\",\n \"EntrySearch.SearchAgainOnSearchCompletion\":\n \"Restart the search loop when the configured year range is exhausted.\",\n \"EntrySearch.UseTempForMissing\":\n \"Switch to temporary profiles when searching for missing media.\",\n \"EntrySearch.KeepTempProfile\": \"Do not revert to the main profile after using the temp profile.\",\n \"EntrySearch.MainQualityProfile\":\n \"Primary quality profile names, in the same order as the temporary profiles.\",\n \"EntrySearch.TempQualityProfile\":\n \"Temporary quality profile names, paired with the primary profiles.\",\n \"EntrySearch.SearchBySeries\":\n \"Search by entire series instead of individual episodes when applicable.\",\n \"EntrySearch.PrioritizeTodaysReleases\":\n \"Prioritise items released today (similar to RSS prioritisation).\",\n\n \"EntrySearch.Ombi.SearchOmbiRequests\":\n \"Pull pending Ombi requests when SearchMissing is enabled.\",\n \"EntrySearch.Ombi.OmbiURI\": \"Ombi server URL.\",\n \"EntrySearch.Ombi.OmbiAPIKey\": \"Ombi API key.\",\n \"EntrySearch.Ombi.ApprovedOnly\": \"Only process Ombi requests that are approved.\",\n \"EntrySearch.Ombi.Is4K\": \"Treat this Ombi configuration as 4K specific.\",\n\n \"EntrySearch.Overseerr.SearchOverseerrRequests\":\n \"Pull Overseerr requests when SearchMissing is enabled.\",\n \"EntrySearch.Overseerr.OverseerrURI\": \"Overseerr server URL.\",\n \"EntrySearch.Overseerr.OverseerrAPIKey\": \"Overseerr API key.\",\n \"EntrySearch.Overseerr.ApprovedOnly\": \"Only process Overseerr requests that are approved.\",\n \"EntrySearch.Overseerr.Is4K\": \"Treat this Overseerr configuration as 4K specific.\",\n\n \"Torrent.CaseSensitiveMatches\":\n \"When enabled, regex matches will respect case; otherwise they are case-insensitive.\",\n \"Torrent.FolderExclusionRegex\":\n \"Regex patterns that exclude folders outright (full-name match).\",\n \"Torrent.FileNameExclusionRegex\":\n \"Regex patterns that exclude individual files based on the file name.\",\n \"Torrent.FileExtensionAllowlist\":\n \"Allowed file extensions (or regex) for downloads; leave empty to allow all.\",\n \"Torrent.AutoDelete\": \"Automatically delete files that are not recognised as media.\",\n \"Torrent.IgnoreTorrentsYoungerThan\":\n \"Ignore torrents younger than this many seconds for failure handling.\",\n \"Torrent.MaximumETA\":\n \"Maximum allowed remaining ETA in seconds; values above this are considered stalled.\",\n \"Torrent.MaximumDeletablePercentage\":\n \"Upper bound for completion percentage when deciding to delete a torrent.\",\n \"Torrent.DoNotRemoveSlow\": \"Ignore slow torrents when pruning.\",\n \"Torrent.StalledDelay\":\n \"Minutes to allow stalled torrents before taking action (-1 disables, 0 is infinite).\",\n \"Torrent.ReSearchStalled\":\n \"Re-run searches for stalled torrents before or after removal depending on configuration.\",\n \"Torrent.RemoveDeadTrackers\": \"Remove trackers flagged as dead.\",\n \"Torrent.RemoveTrackerWithMessage\":\n \"Tracker status messages that should trigger tracker removal when RemoveDeadTrackers is enabled.\",\n\n \"Torrent.SeedingMode.DownloadRateLimitPerTorrent\":\n \"Per-torrent download rate limit in bytes per second (-1 disables the limit).\",\n \"Torrent.SeedingMode.UploadRateLimitPerTorrent\":\n \"Per-torrent upload rate limit in bytes per second (-1 disables the limit).\",\n \"Torrent.SeedingMode.MaxUploadRatio\":\n \"Maximum allowed upload ratio (-1 disables the limit).\",\n \"Torrent.SeedingMode.MaxSeedingTime\":\n \"Maximum seeding duration in seconds (-1 disables the limit).\",\n \"Torrent.SeedingMode.RemoveTorrent\":\n \"Removal policy: -1 do not remove, 1 remove on ratio, 2 remove on time, 3 remove on ratio or time, 4 remove on ratio and time.\",\n};\n\nexport function getTooltip(path: string[]): string | undefined {\n const joined = path.join(\".\");\n if (FIELD_TOOLTIPS[joined]) return FIELD_TOOLTIPS[joined];\n if (path.length > 1) {\n // Check for qBit-specific tooltips\n const isQbitInstance = path[0] && /^qBit(-.*)?$/i.test(path[0]);\n if (isQbitInstance) {\n const qbitPrefix = [\"qBit\", ...path.slice(1)].join(\".\");\n if (FIELD_TOOLTIPS[qbitPrefix]) return FIELD_TOOLTIPS[qbitPrefix];\n }\n\n const withArrPrefix = [\"ARR\", ...path.slice(1)].join(\".\");\n if (FIELD_TOOLTIPS[withArrPrefix]) return FIELD_TOOLTIPS[withArrPrefix];\n const entrySearchPrefix = [\"EntrySearch\", ...path.slice(2)].join(\".\");\n if (path[1] === \"EntrySearch\" && FIELD_TOOLTIPS[entrySearchPrefix]) {\n return FIELD_TOOLTIPS[entrySearchPrefix];\n }\n const torrentPrefix = [\"Torrent\", ...path.slice(2)].join(\".\");\n if (path[1] === \"Torrent\" && FIELD_TOOLTIPS[torrentPrefix]) {\n return FIELD_TOOLTIPS[torrentPrefix];\n }\n }\n const leaf = path[path.length - 1];\n return FIELD_TOOLTIPS[leaf];\n}\n","export default \"__VITE_ASSET__CdYVzc2P__\"","export default \"__VITE_ASSET__DD$$IqcQ__\"","export default \"__VITE_ASSET__DxHRzqTL__\"","export default \"__VITE_ASSET__By16xPBV__\"","import { useCallback, useEffect, useMemo, useState, type JSX } from \"react\";\nimport { produce } from \"immer\";\nimport equal from \"fast-deep-equal\";\nimport { get, set } from \"lodash-es\";\nimport { getConfig, updateConfig, testArrConnection, type TestConnectionResponse } from \"../api/client\";\nimport type { ConfigDocument } from \"../api/types\";\nimport { useToast } from \"../context/ToastContext\";\nimport { useWebUI } from \"../context/WebUIContext\";\nimport { getTooltip } from \"../config/tooltips\";\nimport { IconImage } from \"../components/IconImage\";\nimport Select from \"react-select\";\nimport ConfigureIcon from \"../icons/gear.svg\";\n\nimport RefreshIcon from \"../icons/refresh-arrow.svg\";\nimport VisibilityIcon from \"../icons/visibility.svg\";\nimport AddIcon from \"../icons/plus.svg\";\nimport SaveIcon from \"../icons/check-mark.svg\";\nimport DeleteIcon from \"../icons/trash.svg\";\nimport CloseIcon from \"../icons/close.svg\";\n\ntype FieldType = \"text\" | \"number\" | \"checkbox\" | \"password\" | \"select\";\n\ninterface ValidationContext {\n root: ConfigDocument;\n section?: ConfigDocument | null;\n sectionKey?: string;\n}\n\ntype FieldValidator = (value: unknown, context: ValidationContext) => string | undefined;\n\ninterface FieldDefinition {\n label: string;\n path?: string[];\n type: FieldType;\n options?: string[];\n placeholder?: string;\n description?: string;\n parse?: (value: string | boolean) => unknown;\n format?: (value: unknown) => string | boolean;\n sectionName?: boolean;\n secure?: boolean;\n required?: boolean;\n validate?: FieldValidator;\n fullWidth?: boolean;\n}\n\ninterface ValidationError {\n path: string[];\n message: string;\n}\n\nconst SERVARR_SECTION_REGEX = /(rad|son|lid)arr/i;\nconst QBIT_SECTION_REGEX = /^qBit(-.*)?$/i;\n\n// Helper function for react-select theme-aware styles\nconst getSelectStyles = () => {\n const isDark = document.documentElement.getAttribute('data-theme') === 'dark';\n return {\n control: (base: any) => ({\n ...base,\n background: isDark ? '#0f131a' : '#ffffff',\n color: isDark ? '#eaeef2' : '#1d1d1f',\n borderColor: isDark ? '#2a2f36' : '#d2d2d7',\n minHeight: '38px',\n boxShadow: 'none',\n '&:hover': {\n borderColor: isDark ? '#3a4149' : '#b8b8bd',\n }\n }),\n menu: (base: any) => ({\n ...base,\n background: isDark ? '#0f131a' : '#ffffff',\n borderColor: isDark ? '#2a2f36' : '#d2d2d7',\n border: `1px solid ${isDark ? '#2a2f36' : '#d2d2d7'}`,\n }),\n option: (base: any, state: any) => ({\n ...base,\n background: state.isFocused\n ? (isDark ? 'rgba(122, 162, 247, 0.15)' : 'rgba(0, 113, 227, 0.1)')\n : (isDark ? '#0f131a' : '#ffffff'),\n color: isDark ? '#eaeef2' : '#1d1d1f',\n '&:active': {\n background: isDark ? 'rgba(122, 162, 247, 0.25)' : 'rgba(0, 113, 227, 0.2)',\n }\n }),\n singleValue: (base: any) => ({\n ...base,\n color: isDark ? '#eaeef2' : '#1d1d1f',\n }),\n input: (base: any) => ({\n ...base,\n color: isDark ? '#eaeef2' : '#1d1d1f',\n }),\n placeholder: (base: any) => ({\n ...base,\n color: isDark ? '#9aa3ac' : '#6e6e73',\n }),\n menuList: (base: any) => ({\n ...base,\n padding: '4px',\n }),\n };\n};\n\nconst parseList = (value: string | boolean): string[] =>\n String(value)\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n\nconst formatList = (value: unknown): string =>\n Array.isArray(value) ? value.join(\", \") : String(value ?? \"\");\n\nconst IMPORT_MODE_OPTIONS = [\"Move\", \"Copy\", \"Auto\"];\n\n\n\n\n\n\n\nconst SENTENCE_END = /(.+?[.!?])(\\s|$)/;\n\nfunction extractTooltipSummary(tooltip?: string): string | undefined {\n if (!tooltip) return undefined;\n const trimmed = tooltip.trim();\n if (!trimmed) return undefined;\n const match = trimmed.match(SENTENCE_END);\n const sentence = match ? match[1] : trimmed;\n return sentence.length > 160 ? `${sentence.slice(0, 157)}…` : sentence;\n}\n\n\n\n\n\nconst SETTINGS_FIELDS: FieldDefinition[] = [\n {\n label: \"Console Level\",\n path: [\"Settings\", \"ConsoleLevel\"],\n type: \"select\",\n options: [\"CRITICAL\", \"ERROR\", \"WARNING\", \"NOTICE\", \"INFO\", \"DEBUG\", \"TRACE\"],\n required: true,\n },\n { label: \"Logging\", path: [\"Settings\", \"Logging\"], type: \"checkbox\" },\n {\n label: \"Completed Download Folder\",\n path: [\"Settings\", \"CompletedDownloadFolder\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n const folder = String(value ?? \"\").trim();\n if (!folder || folder.toUpperCase() === \"CHANGE_ME\") {\n return \"Completed Download Folder must be set to a valid path.\";\n }\n return undefined;\n },\n },\n {\n label: \"Free Space\",\n path: [\"Settings\", \"FreeSpace\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return \"Free Space must be provided.\";\n }\n if (raw === \"-1\") {\n return undefined;\n }\n if (!/^-?\\d+(\\.\\d+)?[KMGTP]?$/i.test(raw)) {\n return \"Free Space must be -1 or a number optionally suffixed with K, M, G, T, or P.\";\n }\n return undefined;\n },\n },\n {\n label: \"Free Space Folder\",\n path: [\"Settings\", \"FreeSpaceFolder\"],\n type: \"text\",\n validate: (value, context) => {\n const freeSpace = getValue(context.root, [\"Settings\", \"FreeSpace\"]);\n const requiresFolder = String(freeSpace ?? \"\").trim() !== \"-1\";\n if (!requiresFolder) {\n return undefined;\n }\n const folder = String(value ?? \"\").trim();\n if (!folder || folder.toUpperCase() === \"CHANGE_ME\") {\n return \"Free Space Folder is required when Free Space monitoring is enabled.\";\n }\n return undefined;\n },\n },\n { label: \"Auto Pause/Resume\", path: [\"Settings\", \"AutoPauseResume\"], type: \"checkbox\" },\n {\n label: \"No Internet Sleep (s)\",\n path: [\"Settings\", \"NoInternetSleepTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"No Internet Sleep must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Loop Sleep (s)\",\n path: [\"Settings\", \"LoopSleepTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Loop Sleep must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Search Loop Delay (s)\",\n path: [\"Settings\", \"SearchLoopDelay\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Search Loop Delay must be a non-negative number.\";\n }\n return undefined;\n },\n },\n { label: \"Failed Category\", path: [\"Settings\", \"FailedCategory\"], type: \"text\" },\n { label: \"Recheck Category\", path: [\"Settings\", \"RecheckCategory\"], type: \"text\" },\n { label: \"Tagless\", path: [\"Settings\", \"Tagless\"], type: \"checkbox\" },\n {\n label: \"Ignore Torrents Younger Than\",\n path: [\"Settings\", \"IgnoreTorrentsYoungerThan\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Ignore Torrents Younger Than must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Ping URLs\",\n path: [\"Settings\", \"PingURLS\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n placeholder: \"one.one.one.one, dns.google.com\",\n },\n {\n label: \"FFprobe Auto Update\",\n path: [\"Settings\", \"FFprobeAutoUpdate\"],\n type: \"checkbox\",\n },\n {\n label: \"Auto Update Enabled\",\n path: [\"Settings\", \"AutoUpdateEnabled\"],\n type: \"checkbox\",\n },\n {\n label: \"Auto Update Cron\",\n path: [\"Settings\", \"AutoUpdateCron\"],\n type: \"text\",\n placeholder: \"0 3 * * 0\",\n required: true,\n validate: (value) => {\n const cron = String(value ?? \"\").trim();\n const parts = cron.split(/\\s+/).filter(Boolean);\n if (parts.length < 5 || parts.length > 6) {\n return \"Auto Update Cron must contain 5 or 6 space-separated fields.\";\n }\n return undefined;\n },\n },\n {\n label: \"Auto-Restart Processes\",\n path: [\"Settings\", \"AutoRestartProcesses\"],\n type: \"checkbox\",\n },\n {\n label: \"Max Process Restarts\",\n path: [\"Settings\", \"MaxProcessRestarts\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Max Process Restarts must be at least 1.\";\n }\n return undefined;\n },\n },\n {\n label: \"Process Restart Window (s)\",\n path: [\"Settings\", \"ProcessRestartWindow\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Process Restart Window must be at least 1 second.\";\n }\n return undefined;\n },\n },\n {\n label: \"Process Restart Delay (s)\",\n path: [\"Settings\", \"ProcessRestartDelay\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Process Restart Delay must be a non-negative number.\";\n }\n return undefined;\n },\n },\n\n];\n\nconst WEB_SETTINGS_FIELDS: FieldDefinition[] = [\n {\n label: \"WebUI Host\",\n path: [\"WebUI\", \"Host\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n if (!String(value ?? \"\").trim()) {\n return \"WebUI Host is required.\";\n }\n return undefined;\n },\n },\n {\n label: \"WebUI Port\",\n path: [\"WebUI\", \"Port\"],\n type: \"number\",\n validate: (value) => {\n const port = typeof value === \"number\" ? value : Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n return \"WebUI Port must be between 1 and 65535.\";\n }\n return undefined;\n },\n },\n {\n label: \"WebUI Token\",\n path: [\"WebUI\", \"Token\"],\n type: \"password\",\n secure: true,\n fullWidth: true,\n },\n];\n\nconst QBIT_FIELDS: FieldDefinition[] = [\n { label: \"Display Name\", type: \"text\", placeholder: \"qBit-seedbox\", sectionName: true },\n { label: \"Disabled\", path: [\"Disabled\"], type: \"checkbox\" },\n {\n label: \"Host\",\n path: [\"Host\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n if (!String(value ?? \"\").trim()) {\n return \"qBit Host is required.\";\n }\n return undefined;\n },\n },\n {\n label: \"Port\",\n path: [\"Port\"],\n type: \"number\",\n validate: (value) => {\n const port = typeof value === \"number\" ? value : Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n return \"qBit Port must be between 1 and 65535.\";\n }\n return undefined;\n },\n },\n { label: \"UserName\", path: [\"UserName\"], type: \"text\" },\n { label: \"Password\", path: [\"Password\"], type: \"password\", secure: true },\n];\n\nconst ARR_GENERAL_FIELDS: FieldDefinition[] = [\n { label: \"Display Name\", type: \"text\", placeholder: \"Sonarr-TV\", sectionName: true },\n { label: \"Managed\", path: [\"Managed\"], type: \"checkbox\" },\n {\n label: \"URI\",\n path: [\"URI\"],\n type: \"text\",\n placeholder: \"http://host:port\",\n required: true,\n validate: (value, context) => {\n const uri = String(value ?? \"\").trim();\n const managed = Boolean(getValue(context.section ?? {}, [\"Managed\"]));\n if (!managed) {\n return undefined;\n }\n if (!uri || uri.toUpperCase() === \"CHANGE_ME\") {\n return \"URI must be set to a valid URL when the instance is managed.\";\n }\n return undefined;\n },\n },\n {\n label: \"API Key\",\n path: [\"APIKey\"],\n type: \"password\",\n secure: true,\n required: true,\n validate: (value, context) => {\n const apiKey = String(value ?? \"\").trim();\n const managed = Boolean(getValue(context.section ?? {}, [\"Managed\"]));\n if (!managed) {\n return undefined;\n }\n if (!apiKey || apiKey.toUpperCase() === \"CHANGE_ME\") {\n return \"API Key must be provided when the instance is managed.\";\n }\n return undefined;\n },\n },\n {\n label: \"Category\",\n path: [\"Category\"],\n type: \"text\",\n required: true,\n validate: (value) => {\n if (!String(value ?? \"\").trim()) {\n return \"Category is required.\";\n }\n return undefined;\n },\n },\n { label: \"Re-search\", path: [\"ReSearch\"], type: \"checkbox\" },\n {\n label: \"Import Mode\",\n path: [\"importMode\"],\n type: \"select\",\n options: IMPORT_MODE_OPTIONS,\n required: true,\n },\n {\n label: \"RSS Sync Timer (min)\",\n path: [\"RssSyncTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"RSS Sync Timer must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Refresh Downloads Timer (min)\",\n path: [\"RefreshDownloadsTimer\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Refresh Downloads Timer must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Arr Error Codes To Blocklist\",\n path: [\"ArrErrorCodesToBlocklist\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n];\n\nconst ARR_ENTRY_SEARCH_FIELDS: FieldDefinition[] = [\n {\n label: \"Search Missing\",\n path: [\"EntrySearch\", \"SearchMissing\"],\n type: \"checkbox\",\n },\n {\n label: \"Also Search Specials\",\n path: [\"EntrySearch\", \"AlsoSearchSpecials\"],\n type: \"checkbox\",\n },\n {\n label: \"Unmonitored\",\n path: [\"EntrySearch\", \"Unmonitored\"],\n type: \"checkbox\",\n },\n {\n label: \"Do Upgrade Search\",\n path: [\"EntrySearch\", \"DoUpgradeSearch\"],\n type: \"checkbox\",\n },\n {\n label: \"Quality Unmet Search\",\n path: [\"EntrySearch\", \"QualityUnmetSearch\"],\n type: \"checkbox\",\n },\n {\n label: \"Custom Format Unmet Search\",\n path: [\"EntrySearch\", \"CustomFormatUnmetSearch\"],\n type: \"checkbox\",\n },\n {\n label: \"Force Minimum Custom Format\",\n path: [\"EntrySearch\", \"ForceMinimumCustomFormat\"],\n type: \"checkbox\",\n },\n {\n label: \"Search Limit\",\n path: [\"EntrySearch\", \"SearchLimit\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Search Limit must be at least 1.\";\n }\n return undefined;\n },\n },\n {\n label: \"Search By Year\",\n path: [\"EntrySearch\", \"SearchByYear\"],\n type: \"checkbox\",\n },\n {\n label: \"Search In Reverse\",\n path: [\"EntrySearch\", \"SearchInReverse\"],\n type: \"checkbox\",\n },\n {\n label: \"Search Requests Every (s)\",\n path: [\"EntrySearch\", \"SearchRequestsEvery\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 1) {\n return \"Search Requests Every must be at least 1 second.\";\n }\n return undefined;\n },\n },\n {\n label: \"Search Again On Completion\",\n path: [\"EntrySearch\", \"SearchAgainOnSearchCompletion\"],\n type: \"checkbox\",\n },\n {\n label: \"Use Temp Profile For Missing\",\n path: [\"EntrySearch\", \"UseTempForMissing\"],\n type: \"checkbox\",\n },\n {\n label: \"Keep Temp Profile\",\n path: [\"EntrySearch\", \"KeepTempProfile\"],\n type: \"checkbox\",\n },\n {\n label: \"Force Reset Temp Profiles\",\n path: [\"EntrySearch\", \"ForceResetTempProfiles\"],\n type: \"checkbox\",\n description: \"Reset all items using temp profiles to their original main profile on qBitrr startup\",\n },\n {\n label: \"Temp Profile Reset Timeout (Minutes)\",\n path: [\"EntrySearch\", \"TempProfileResetTimeoutMinutes\"],\n type: \"number\",\n description: \"Timeout in minutes after which items with temp profiles are automatically reset to main profile (0 = disabled)\",\n },\n {\n label: \"Profile Switch Retry Attempts\",\n path: [\"EntrySearch\", \"ProfileSwitchRetryAttempts\"],\n type: \"number\",\n description: \"Number of retry attempts for profile switch API calls (default: 3)\",\n },\n {\n label: \"Search By Series\",\n path: [\"EntrySearch\", \"SearchBySeries\"],\n type: \"select\",\n options: [\"smart\", \"true\", \"false\"],\n description: \"smart = auto (series search for multiple episodes, episode search for single), true = always series search, false = always episode search\",\n format: (value: unknown) => {\n // Convert boolean or string to string for display\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n return String(value || \"smart\");\n },\n parse: (value: string | boolean) => {\n // Keep as string for config - backend will handle parsing\n const str = String(value);\n if (str === \"true\" || str === \"false\") {\n return str;\n }\n return \"smart\";\n },\n },\n {\n label: \"Prioritize Today's Releases\",\n path: [\"EntrySearch\", \"PrioritizeTodaysReleases\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_ENTRY_SEARCH_OMBI_FIELDS: FieldDefinition[] = [\n {\n label: \"Search Ombi Requests\",\n path: [\"EntrySearch\", \"Ombi\", \"SearchOmbiRequests\"],\n type: \"checkbox\",\n },\n {\n label: \"Ombi URI\",\n path: [\"EntrySearch\", \"Ombi\", \"OmbiURI\"],\n type: \"text\",\n placeholder: \"http://host:port\",\n },\n {\n label: \"Ombi API Key\",\n path: [\"EntrySearch\", \"Ombi\", \"OmbiAPIKey\"],\n type: \"password\",\n },\n {\n label: \"Approved Only\",\n path: [\"EntrySearch\", \"Ombi\", \"ApprovedOnly\"],\n type: \"checkbox\",\n },\n {\n label: \"Is 4K Instance\",\n path: [\"EntrySearch\", \"Ombi\", \"Is4K\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_ENTRY_SEARCH_OVERSEERR_FIELDS: FieldDefinition[] = [\n {\n label: \"Search Overseerr Requests\",\n path: [\"EntrySearch\", \"Overseerr\", \"SearchOverseerrRequests\"],\n type: \"checkbox\",\n },\n {\n label: \"Overseerr URI\",\n path: [\"EntrySearch\", \"Overseerr\", \"OverseerrURI\"],\n type: \"text\",\n placeholder: \"http://host:port\",\n },\n {\n label: \"Overseerr API Key\",\n path: [\"EntrySearch\", \"Overseerr\", \"OverseerrAPIKey\"],\n type: \"password\",\n },\n {\n label: \"Approved Only\",\n path: [\"EntrySearch\", \"Overseerr\", \"ApprovedOnly\"],\n type: \"checkbox\",\n },\n {\n label: \"Is 4K Instance\",\n path: [\"EntrySearch\", \"Overseerr\", \"Is4K\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_TORRENT_FIELDS: FieldDefinition[] = [\n {\n label: \"Case Sensitive Matches\",\n path: [\"Torrent\", \"CaseSensitiveMatches\"],\n type: \"checkbox\",\n },\n {\n label: \"Folder Exclusion Regex\",\n path: [\"Torrent\", \"FolderExclusionRegex\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n {\n label: \"File Name Exclusion Regex\",\n path: [\"Torrent\", \"FileNameExclusionRegex\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n {\n label: \"File Extension Allowlist\",\n path: [\"Torrent\", \"FileExtensionAllowlist\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n {\n label: \"Auto Delete\",\n path: [\"Torrent\", \"AutoDelete\"],\n type: \"checkbox\",\n },\n {\n label: \"Ignore Torrents Younger Than (s)\",\n path: [\"Torrent\", \"IgnoreTorrentsYoungerThan\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Ignore Torrents Younger Than must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Maximum ETA (s)\",\n path: [\"Torrent\", \"MaximumETA\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Maximum ETA must be -1 or a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Maximum Deletable Percentage\",\n path: [\"Torrent\", \"MaximumDeletablePercentage\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0 || num > 100) {\n return \"Maximum Deletable Percentage must be between 0 and 100.\";\n }\n return undefined;\n },\n },\n {\n label: \"Do Not Remove Slow\",\n path: [\"Torrent\", \"DoNotRemoveSlow\"],\n type: \"checkbox\",\n },\n {\n label: \"Stalled Delay (min)\",\n path: [\"Torrent\", \"StalledDelay\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Stalled Delay must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Re-search Stalled\",\n path: [\"Torrent\", \"ReSearchStalled\"],\n type: \"checkbox\",\n },\n];\n\nconst ARR_SEEDING_FIELDS: FieldDefinition[] = [\n {\n label: \"Download Rate Limit Per Torrent\",\n path: [\"Torrent\", \"SeedingMode\", \"DownloadRateLimitPerTorrent\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Download Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Upload Rate Limit Per Torrent\",\n path: [\"Torrent\", \"SeedingMode\", \"UploadRateLimitPerTorrent\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Upload Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Upload Ratio\",\n path: [\"Torrent\", \"SeedingMode\", \"MaxUploadRatio\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Upload Ratio must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Seeding Time (s)\",\n path: [\"Torrent\", \"SeedingMode\", \"MaxSeedingTime\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Seeding Time must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Remove Torrent (policy)\",\n path: [\"Torrent\", \"SeedingMode\", \"RemoveTorrent\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num)) {\n return \"Remove Torrent policy must be a number.\";\n }\n if (num === -1) {\n return undefined;\n }\n if (![1, 2, 3, 4].includes(num)) {\n return \"Remove Torrent policy must be -1, 1, 2, 3, or 4.\";\n }\n return undefined;\n },\n },\n {\n label: \"Remove Dead Trackers\",\n path: [\"Torrent\", \"SeedingMode\", \"RemoveDeadTrackers\"],\n type: \"checkbox\",\n },\n {\n label: \"Remove Tracker Messages\",\n path: [\"Torrent\", \"SeedingMode\", \"RemoveTrackerWithMessage\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n fullWidth: true,\n },\n];\n\nconst ARR_TRACKER_FIELDS: FieldDefinition[] = [\n { label: \"Name\", path: [\"Name\"], type: \"text\", required: true },\n { label: \"URI\", path: [\"URI\"], type: \"text\", required: true },\n {\n label: \"Priority\",\n path: [\"Priority\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < 0) {\n return \"Priority must be a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Maximum ETA\",\n path: [\"MaximumETA\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Maximum ETA must be -1 or a non-negative number.\";\n }\n return undefined;\n },\n },\n {\n label: \"Download Rate Limit\",\n path: [\"DownloadRateLimit\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Download Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Upload Rate Limit\",\n path: [\"UploadRateLimit\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Upload Rate Limit must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Upload Ratio\",\n path: [\"MaxUploadRatio\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Upload Ratio must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Max Seeding Time\",\n path: [\"MaxSeedingTime\"],\n type: \"number\",\n validate: (value) => {\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num) || num < -1) {\n return \"Max Seeding Time must be -1 or greater.\";\n }\n return undefined;\n },\n },\n {\n label: \"Add Tracker If Missing\",\n path: [\"AddTrackerIfMissing\"],\n type: \"checkbox\",\n },\n { label: \"Remove If Exists\", path: [\"RemoveIfExists\"], type: \"checkbox\" },\n { label: \"Super Seed Mode\", path: [\"SuperSeedMode\"], type: \"checkbox\" },\n {\n label: \"Add Tags\",\n path: [\"AddTags\"],\n type: \"text\",\n parse: parseList,\n format: formatList,\n },\n];\n\nfunction getArrFieldSets(arrKey: string) {\n const lower = arrKey.toLowerCase();\n const isSonarr = lower.includes(\"sonarr\");\n const isLidarr = lower.includes(\"lidarr\");\n const generalFields = [...ARR_GENERAL_FIELDS];\n const entryFields = ARR_ENTRY_SEARCH_FIELDS.filter((field) => {\n if (!field.path) {\n return true;\n }\n const joined = field.path.join(\".\");\n if (!isSonarr) {\n if (\n joined === \"EntrySearch.AlsoSearchSpecials\" ||\n joined === \"EntrySearch.SearchBySeries\" ||\n joined === \"EntrySearch.PrioritizeTodaysReleases\"\n ) {\n return false;\n }\n }\n if (isLidarr) {\n // Lidarr doesn't support SearchByYear (music albums don't have the same year-based search)\n if (joined === \"EntrySearch.SearchByYear\") {\n return false;\n }\n }\n return true;\n });\n // Ombi and Overseerr don't support music requests, so hide them for Lidarr\n const entryOmbiFields = isLidarr ? [] : [...ARR_ENTRY_SEARCH_OMBI_FIELDS];\n const entryOverseerrFields = isLidarr ? [] : [...ARR_ENTRY_SEARCH_OVERSEERR_FIELDS];\n const torrentFields = [...ARR_TORRENT_FIELDS];\n const seedingFields = [...ARR_SEEDING_FIELDS];\n const trackerFields = [...ARR_TRACKER_FIELDS];\n return {\n generalFields,\n entryFields,\n entryOmbiFields,\n entryOverseerrFields,\n torrentFields,\n seedingFields,\n trackerFields,\n };\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n (typeof value === \"string\" && value.trim() === \"\") ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nfunction basicValidation(def: FieldDefinition, value: unknown): string | undefined {\n const label = def.label;\n const isRequired = def.required ?? (def.type === \"number\" || def.type === \"select\");\n switch (def.type) {\n case \"text\":\n case \"password\": {\n if (!isRequired) {\n return undefined;\n }\n if (isEmptyValue(value)) {\n return `${label} is required.`;\n }\n return undefined;\n }\n case \"number\": {\n if (value === null || value === undefined || value === \"\") {\n return isRequired ? `${label} is required.` : undefined;\n }\n const num = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(num)) {\n return `${label} must be a valid number.`;\n }\n return undefined;\n }\n case \"checkbox\": {\n if (value === null || value === undefined) {\n return isRequired ? `${label} is required.` : undefined;\n }\n if (typeof value !== \"boolean\") {\n return `${label} must be true or false.`;\n }\n return undefined;\n }\n case \"select\": {\n if (isEmptyValue(value)) {\n return `${label} is required.`;\n }\n if (typeof value !== \"string\") {\n return `${label} must be selected.`;\n }\n if (def.options && !def.options.includes(value)) {\n return `${label} must be one of ${def.options.join(\", \")}.`;\n }\n return undefined;\n }\n default:\n return undefined;\n }\n}\n\nfunction validateFieldGroup(\n errors: ValidationError[],\n fields: FieldDefinition[],\n state: ConfigDocument | null,\n basePath: string[],\n context: ValidationContext\n): void {\n if (!state) return;\n for (const field of fields) {\n if (field.sectionName) {\n continue;\n }\n const pathSegments = field.path ?? [];\n const value = pathSegments.length\n ? getValue(state as ConfigDocument, pathSegments)\n : undefined;\n const fullPath = [...basePath, ...pathSegments];\n const baseError = basicValidation(field, value);\n if (baseError) {\n errors.push({ path: fullPath, message: baseError });\n continue;\n }\n if (field.validate) {\n const customError = field.validate(value, context);\n if (customError) {\n errors.push({ path: fullPath, message: customError });\n }\n }\n }\n}\n\nfunction validateFormState(formState: ConfigDocument | null): ValidationError[] {\n if (!formState) return [];\n const errors: ValidationError[] = [];\n const rootContext: ValidationContext = { root: formState };\n validateFieldGroup(errors, SETTINGS_FIELDS, formState, [], rootContext);\n validateFieldGroup(errors, WEB_SETTINGS_FIELDS, formState, [], rootContext);\n\n for (const [key, value] of Object.entries(formState)) {\n if (QBIT_SECTION_REGEX.test(key) && value && typeof value === \"object\") {\n const section = value as ConfigDocument;\n const sectionContext: ValidationContext = { root: formState, section, sectionKey: key };\n validateFieldGroup(errors, QBIT_FIELDS, section, [key], sectionContext);\n } else if (SERVARR_SECTION_REGEX.test(key) && value && typeof value === \"object\") {\n const section = value as ConfigDocument;\n const sectionContext: ValidationContext = { root: formState, section, sectionKey: key };\n const fieldSets = getArrFieldSets(key);\n validateFieldGroup(errors, fieldSets.generalFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.entryFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.entryOmbiFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.entryOverseerrFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.torrentFields, section, [key], sectionContext);\n validateFieldGroup(errors, fieldSets.seedingFields, section, [key], sectionContext);\n }\n }\n return errors;\n}\n\n// Note: cloneConfig is no longer needed - using immer's produce for immutable updates\n\n// Utility wrappers around lodash for ConfigDocument operations\nfunction getValue(doc: ConfigDocument | null, path: string[]): unknown {\n if (!doc) return undefined;\n return get(doc, path);\n}\n\nfunction setValue(\n doc: ConfigDocument,\n path: string[],\n value: unknown\n): void {\n set(doc, path, value);\n}\n\n// Custom flatten to create dot-notation keys (e.g., \"Settings.FreeSpace\")\n// Note: lodash's flatten is for arrays; this is a specialized object flattener\nfunction flatten(doc: ConfigDocument, prefix: string[] = []): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(doc)) {\n const nextPath = [...prefix, key];\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, flatten(value as ConfigDocument, nextPath));\n } else {\n result[nextPath.join(\".\")] = value;\n }\n }\n return result;\n}\n\nfunction ensureArrDefaults(type: string): ConfigDocument {\n const lowerType = type.toLowerCase();\n const isSonarr = lowerType.includes(\"sonarr\");\n const isRadarr = lowerType.includes(\"radarr\");\n const isLidarr = lowerType.includes(\"lidarr\");\n\n const arrErrorCodes = isRadarr\n ? [\n \"Not a preferred word upgrade for existing movie file(s)\",\n \"Not an upgrade for existing movie file(s)\",\n \"Unable to determine if file is a sample\",\n ]\n : isLidarr\n ? [\n \"Not a preferred word upgrade for existing album file(s)\",\n \"Not an upgrade for existing album file(s)\",\n \"Unable to determine if file is a sample\",\n ]\n : [\n \"Not a preferred word upgrade for existing episode file(s)\",\n \"Not an upgrade for existing episode file(s)\",\n \"Unable to determine if file is a sample\",\n ];\n\n const entrySearch: Record<string, unknown> = {\n SearchMissing: true,\n Unmonitored: false,\n SearchLimit: 5,\n SearchByYear: true,\n SearchInReverse: false,\n SearchRequestsEvery: 300,\n DoUpgradeSearch: false,\n QualityUnmetSearch: false,\n CustomFormatUnmetSearch: false,\n ForceMinimumCustomFormat: false,\n SearchAgainOnSearchCompletion: true,\n UseTempForMissing: false,\n KeepTempProfile: false,\n ForceResetTempProfiles: false,\n TempProfileResetTimeoutMinutes: 0,\n ProfileSwitchRetryAttempts: 3,\n QualityProfileMappings: {},\n };\n\n if (isSonarr) {\n entrySearch.AlsoSearchSpecials = false;\n entrySearch.SearchBySeries = \"smart\";\n entrySearch.PrioritizeTodaysReleases = true;\n }\n\n entrySearch.Ombi = {\n SearchOmbiRequests: false,\n OmbiURI: \"CHANGE_ME\",\n OmbiAPIKey: \"CHANGE_ME\",\n ApprovedOnly: true,\n };\n entrySearch.Overseerr = {\n SearchOverseerrRequests: false,\n OverseerrURI: \"CHANGE_ME\",\n OverseerrAPIKey: \"CHANGE_ME\",\n ApprovedOnly: true,\n Is4K: false,\n };\n\n const torrent: Record<string, unknown> = {\n CaseSensitiveMatches: false,\n FolderExclusionRegex: [\n \"\\\\bextras?\\\\b\",\n \"\\\\bfeaturettes?\\\\b\",\n \"\\\\bsamples?\\\\b\",\n \"\\\\bscreens?\\\\b\",\n \"\\\\bnc(ed|op)?(\\\\\\\\d+)?\\\\b\",\n ],\n FileNameExclusionRegex: [\n \"\\\\bncop\\\\\\\\d+?\\\\b\",\n \"\\\\bnced\\\\\\\\d+?\\\\b\",\n \"\\\\bsample\\\\b\",\n \"brarbg.com\\\\b\",\n \"\\\\btrailer\\\\b\",\n \"music video\",\n \"comandotorrents.com\",\n ],\n FileExtensionAllowlist: isLidarr\n ? [\".mp3\", \".flac\", \".m4a\", \".aac\", \".ogg\", \".opus\", \".wav\", \".ape\", \".wma\", \".!qB\", \".parts\", \".log\", \".cue\"]\n : [\".mp4\", \".mkv\", \".sub\", \".ass\", \".srt\", \".!qB\", \".parts\"],\n AutoDelete: false,\n IgnoreTorrentsYoungerThan: 600,\n MaximumETA: 604800,\n MaximumDeletablePercentage: 0.99,\n DoNotRemoveSlow: true,\n StalledDelay: 15,\n ReSearchStalled: false,\n RemoveDeadTrackers: false,\n RemoveTrackerWithMessage: [\n \"skipping tracker announce (unreachable)\",\n \"No such host is known\",\n \"unsupported URL protocol\",\n \"info hash is not authorized with this tracker\",\n ],\n SeedingMode: {\n DownloadRateLimitPerTorrent: -1,\n UploadRateLimitPerTorrent: -1,\n MaxUploadRatio: -1,\n MaxSeedingTime: -1,\n RemoveTorrent: -1,\n },\n };\n\n return {\n Managed: true,\n URI: \"CHANGE_ME\",\n APIKey: \"CHANGE_ME\",\n Category: type,\n ReSearch: true,\n importMode: \"Auto\",\n RssSyncTimer: 5,\n RefreshDownloadsTimer: 5,\n ArrErrorCodesToBlocklist: arrErrorCodes,\n EntrySearch: entrySearch as ConfigDocument,\n Torrent: torrent as ConfigDocument,\n } as ConfigDocument;\n}\n\ninterface ConfigViewProps {\n onDirtyChange?: (dirty: boolean) => void;\n}\n\nexport function ConfigView(props?: ConfigViewProps): JSX.Element {\n const { onDirtyChange } = props ?? {};\n const { push } = useToast();\n const [originalConfig, setOriginalConfig] = useState<ConfigDocument | null>(\n null\n );\n const [formState, setFormState] = useState<ConfigDocument | null>(null);\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n\n const loadConfig = useCallback(async () => {\n setLoading(true);\n try {\n const config = await getConfig();\n setOriginalConfig(config);\n // Deep clone config for form state (immer will handle immutability from here)\n setFormState(config ? JSON.parse(JSON.stringify(config)) : null);\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to load configuration\",\n \"error\"\n );\n } finally {\n setLoading(false);\n }\n }, [push]);\n\n useEffect(() => {\n void loadConfig();\n }, [loadConfig]);\n\n const handleFieldChange = useCallback(\n (path: string[], def: FieldDefinition, raw: unknown) => {\n if (!formState) return;\n const parsed =\n def.parse?.(raw as string | boolean) ??\n (def.type === \"number\"\n ? Number(raw) || 0\n : def.type === \"checkbox\"\n ? Boolean(raw)\n : raw);\n setFormState(\n produce(formState, (draft) => {\n setValue(draft, path, parsed);\n })\n );\n },\n [formState]\n );\n\n const arrSections = useMemo(() => {\n if (!formState) return [] as Array<[string, ConfigDocument]>;\n return Object.entries(formState).filter(([key, value]) =>\n SERVARR_SECTION_REGEX.test(key) && value && typeof value === \"object\"\n ) as Array<[string, ConfigDocument]>;\n }, [formState]);\n\n const qbitSections = useMemo(() => {\n if (!formState) return [] as Array<[string, ConfigDocument]>;\n return Object.entries(formState).filter(([key, value]) =>\n QBIT_SECTION_REGEX.test(key) && value && typeof value === \"object\"\n ) as Array<[string, ConfigDocument]>;\n }, [formState]);\n const groupedArrSections = useMemo(() => {\n const groups: Array<{\n label: string;\n type: \"radarr\" | \"sonarr\" | \"lidarr\" | \"other\";\n items: Array<[string, ConfigDocument]>;\n }> = [];\n const sorted = [...arrSections].sort((a, b) =>\n a[0].localeCompare(b[0], undefined, { numeric: true, sensitivity: \"base\" })\n );\n const radarr: Array<[string, ConfigDocument]> = [];\n const sonarr: Array<[string, ConfigDocument]> = [];\n const lidarr: Array<[string, ConfigDocument]> = [];\n const others: Array<[string, ConfigDocument]> = [];\n for (const entry of sorted) {\n const [key] = entry;\n const keyLower = key.toLowerCase();\n if (keyLower.startsWith(\"radarr\")) {\n radarr.push(entry);\n } else if (keyLower.startsWith(\"sonarr\")) {\n sonarr.push(entry);\n } else if (keyLower.startsWith(\"lidarr\")) {\n lidarr.push(entry);\n } else {\n others.push(entry);\n }\n }\n\n groups.push({ label: \"Radarr Instances\", type: \"radarr\", items: radarr });\n groups.push({ label: \"Sonarr Instances\", type: \"sonarr\", items: sonarr });\n groups.push({ label: \"Lidarr Instances\", type: \"lidarr\", items: lidarr });\n if (others.length) {\n groups.push({ label: \"Other Instances\", type: \"other\", items: others });\n }\n return groups;\n }, [arrSections]);\n const [activeArrKey, setActiveArrKey] = useState<string | null>(null);\n const [activeQbitKey, setActiveQbitKey] = useState<string | null>(null);\n const [isSettingsOpen, setSettingsOpen] = useState(false);\n const [isWebSettingsOpen, setWebSettingsOpen] = useState(false);\n const [isDirty, setDirty] = useState(false);\n\n useEffect(() => {\n if (!formState || !originalConfig) {\n setDirty(false);\n return;\n }\n const flattenedOriginal = flatten(originalConfig);\n const flattenedCurrent = flatten(formState);\n\n // Keys that are managed dynamically and should not trigger dirty state\n const liveKeys = new Set([\n \"WebUI.LiveArr\",\n \"WebUI.GroupSonarr\",\n \"WebUI.GroupLidarr\",\n \"WebUI.Theme\",\n ]);\n\n let dirty = false;\n for (const [key, value] of Object.entries(flattenedCurrent)) {\n // Skip live WebUI settings\n if (liveKeys.has(key)) continue;\n\n const originalValue = flattenedOriginal[key];\n // Use fast-deep-equal for accurate comparison (handles arrays, objects, etc.)\n if (!equal(value, originalValue)) {\n dirty = true;\n break;\n }\n }\n if (!dirty) {\n for (const key of Object.keys(flattenedOriginal)) {\n // Skip live WebUI settings\n if (liveKeys.has(key)) continue;\n\n if (!(key in flattenedCurrent)) {\n dirty = true;\n break;\n }\n }\n }\n setDirty(dirty);\n }, [formState, originalConfig]);\n\n useEffect(() => {\n onDirtyChange?.(isDirty);\n }, [isDirty, onDirtyChange]);\n\n useEffect(() => {\n if (!isDirty) return;\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n event.returnValue = \"\";\n };\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }, [isDirty]);\n\n useEffect(() => {\n return () => {\n onDirtyChange?.(false);\n };\n }, [onDirtyChange]);\n\n useEffect(() => {\n const anyModalOpen = Boolean(activeArrKey || activeQbitKey || isSettingsOpen || isWebSettingsOpen);\n if (!anyModalOpen) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setActiveArrKey(null);\n setActiveQbitKey(null);\n setSettingsOpen(false);\n setWebSettingsOpen(false);\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n const { style } = document.body;\n const originalOverflow = style.overflow;\n style.overflow = \"hidden\";\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n style.overflow = originalOverflow;\n };\n }, [activeArrKey, activeQbitKey, isSettingsOpen, isWebSettingsOpen]);\n\n useEffect(() => {\n if (!activeArrKey) return;\n if (!arrSections.some(([key]) => key === activeArrKey)) {\n setActiveArrKey(null);\n }\n }, [activeArrKey, arrSections]);\n\n const addArrInstance = useCallback(\n (type: \"radarr\" | \"sonarr\" | \"lidarr\") => {\n if (!formState) return;\n const prefix = type.charAt(0).toUpperCase() + type.slice(1);\n let index = 1;\n let key = `${prefix}-${index}`;\n while (formState[key]) {\n index += 1;\n key = `${prefix}-${index}`;\n }\n const defaults = ensureArrDefaults(type);\n if (defaults && typeof defaults === \"object\") {\n (defaults as Record<string, unknown>).Name = key;\n }\n setFormState(\n produce(formState, (draft) => {\n draft[key] = defaults;\n })\n );\n // Open modal for immediate configuration\n setActiveArrKey(key);\n },\n [formState]\n );\n const deleteArrInstance = useCallback(\n (key: string) => {\n if (!formState) return;\n const keyLower = key.toLowerCase();\n if (!keyLower.startsWith(\"radarr\") && !keyLower.startsWith(\"sonarr\") && !keyLower.startsWith(\"lidarr\")) {\n return;\n }\n const confirmed = window.confirm(\n `Delete ${key}? This action cannot be undone.`\n );\n if (!confirmed) {\n return;\n }\n if (!(key in formState)) {\n return;\n }\n setFormState(\n produce(formState, (draft) => {\n delete draft[key];\n })\n );\n if (activeArrKey === key) {\n setActiveArrKey(null);\n }\n push(`${key} removed`, \"success\");\n },\n [formState, activeArrKey, push]\n );\n\n const addQbitInstance = useCallback(() => {\n if (!formState) return;\n let index = 1;\n let key = `qBit-${index}`;\n while (formState[key]) {\n index += 1;\n key = `qBit-${index}`;\n }\n const defaults: ConfigDocument = {\n Disabled: false,\n Host: \"localhost\",\n Port: 8080,\n UserName: \"\",\n Password: \"\",\n };\n setFormState(\n produce(formState, (draft) => {\n draft[key] = defaults;\n })\n );\n setActiveQbitKey(key);\n }, [formState]);\n\n const deleteQbitInstance = useCallback(\n (key: string) => {\n if (!formState) return;\n if (key === \"qBit\") {\n push(\"Cannot delete the default qBit instance\", \"error\");\n return;\n }\n const confirmed = window.confirm(\n `Delete ${key}? This action cannot be undone.`\n );\n if (!confirmed) {\n return;\n }\n if (!(key in formState)) {\n return;\n }\n setFormState(\n produce(formState, (draft) => {\n delete draft[key];\n })\n );\n if (activeQbitKey === key) {\n setActiveQbitKey(null);\n }\n push(`${key} removed`, \"success\");\n },\n [formState, activeQbitKey, push]\n );\n\n const handleRenameSection = useCallback(\n (oldName: string, rawNewName: string) => {\n if (!formState) return;\n const newName = rawNewName.trim();\n if (!newName || newName === oldName) {\n return;\n }\n if (formState[newName]) {\n push(`An instance named \"${newName}\" already exists`, \"error\");\n return;\n }\n setFormState(\n produce(formState, (draft) => {\n const section = draft[oldName];\n delete draft[oldName];\n draft[newName] = section;\n if (section && typeof section === \"object\") {\n (section as Record<string, unknown>).Name = newName;\n }\n })\n );\n if (activeArrKey === oldName) {\n setActiveArrKey(newName);\n }\n },\n [formState, push, activeArrKey]\n );\n\n const handleRenameQbitSection = useCallback(\n (oldName: string, rawNewName: string) => {\n if (!formState) return;\n const newName = rawNewName.trim();\n if (!newName || newName === oldName) {\n return;\n }\n if (oldName === \"qBit\" && newName !== \"qBit\") {\n push(\"Cannot rename the default qBit instance. Create a new instance instead.\", \"error\");\n return;\n }\n if (formState[newName]) {\n push(`An instance named \"${newName}\" already exists`, \"error\");\n return;\n }\n setFormState(\n produce(formState, (draft) => {\n const section = draft[oldName];\n delete draft[oldName];\n draft[newName] = section;\n })\n );\n if (activeQbitKey === oldName) {\n setActiveQbitKey(newName);\n }\n },\n [formState, push, activeQbitKey]\n );\n\n const handleSubmit = useCallback(async () => {\n if (!formState) return;\n setSaving(true);\n try {\n const validationErrors = validateFormState(formState);\n if (validationErrors.length) {\n const formatted = validationErrors\n .map((error) => `${error.path.join(\".\")}: ${error.message}`)\n .join(\"\\n\");\n const message =\n validationErrors.length === 1\n ? formatted\n : `Please resolve the following issues:\\n${formatted}`;\n push(message, \"error\");\n setSaving(false);\n return;\n }\n const flattenedOriginal = flatten(originalConfig ?? {});\n const flattenedCurrent = flatten(formState);\n const changes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(flattenedCurrent)) {\n const originalValue = flattenedOriginal[key];\n // Use fast-deep-equal for accurate comparison\n if (!equal(value, originalValue)) {\n changes[key] = value;\n }\n }\n for (const key of Object.keys(flattenedOriginal)) {\n if (!(key in flattenedCurrent)) {\n changes[key] = null;\n }\n }\n if (Object.keys(changes).length === 0) {\n push(\"No changes detected\", \"info\");\n setSaving(false);\n return;\n }\n const { configReloaded, reloadType, affectedInstances } = await updateConfig({ changes });\n\n // Build appropriate success message\n let message = \"Configuration saved\";\n if (reloadType === \"full\") {\n message += \" • All instances reloaded\";\n } else if (reloadType === \"multi_arr\" && affectedInstances?.length) {\n message += ` • Reloaded ${affectedInstances.length} instances: ${affectedInstances.join(\", \")}`;\n } else if (reloadType === \"single_arr\" && affectedInstances?.length) {\n message += ` • Reloaded: ${affectedInstances.join(\", \")}`;\n } else if (reloadType === \"webui\") {\n message += \" • WebUI restarting...\";\n } else if (reloadType === \"frontend\") {\n message += \" • Theme/display settings updated\";\n }\n push(message, \"success\");\n\n // Only clear browser cache if backend reloaded (non-frontend-only changes)\n if (configReloaded && 'caches' in window) {\n try {\n const cacheNames = await caches.keys();\n await Promise.all(\n cacheNames.map(cacheName => caches.delete(cacheName))\n );\n } catch (error) {\n console.warn('Failed to clear caches:', error);\n }\n }\n\n await loadConfig();\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to update configuration\",\n \"error\"\n );\n } finally {\n setSaving(false);\n }\n }, [formState, originalConfig, loadConfig, push]);\n\n if (loading || !formState) {\n return (\n <section className=\"card\">\n <div className=\"card-header\">Config</div>\n <div className=\"card-body\">\n <div className=\"loading\">\n <span className=\"spinner\" /> Loading configuration…\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <>\n <section className=\"card\">\n <div className=\"card-header\">Config</div>\n <div className=\"card-body config-layout\">\n <section className=\"config-arr-group\">\n <details className=\"config-arr-group__details\" open>\n <summary>\n <span>Core Configuration</span>\n </summary>\n <div className=\"config-grid\">\n <ConfigSummaryCard\n title=\"Settings\"\n description=\"Core application configuration\"\n onConfigure={() => setSettingsOpen(true)}\n />\n <ConfigSummaryCard\n title=\"Web Settings\"\n description=\"Web UI configuration\"\n onConfigure={() => setWebSettingsOpen(true)}\n />\n </div>\n </details>\n </section>\n <section className=\"config-arr-group\">\n <details className=\"config-arr-group__details\" open>\n <summary>\n <span>qBittorrent Instances</span>\n <span className=\"config-arr-group__count\">\n {qbitSections.length}\n </span>\n <button\n className=\"btn small\"\n type=\"button\"\n onClick={addQbitInstance}\n >\n <IconImage src={AddIcon} />\n Add Instance\n </button>\n </summary>\n <div className=\"config-arr-grid\">\n {qbitSections.map(([key, value]) => {\n const host = getValue(value as ConfigDocument, [\"Host\"]);\n const port = getValue(value as ConfigDocument, [\"Port\"]);\n const disabled = getValue(value as ConfigDocument, [\"Disabled\"]);\n const isDefault = key === \"qBit\";\n return (\n <div className=\"card config-card config-arr-card\" key={key}>\n <div className=\"card-header\">\n {key}\n {isDefault && <span style={{ marginLeft: '8px', opacity: 0.6 }}>(Default)</span>}\n </div>\n <div className=\"card-body\">\n <dl className=\"config-arr-summary\">\n <div className=\"config-arr-summary__item\">\n <dt>Status</dt>\n <dd>{disabled ? \"Disabled\" : \"Enabled\"}</dd>\n </div>\n <div className=\"config-arr-summary__item\">\n <dt>Host</dt>\n <dd>{host ? `${String(host)}:${port ?? 8080}` : \"-\"}</dd>\n </div>\n </dl>\n <div className=\"config-arr-actions\">\n {!isDefault ? (\n <button\n className=\"btn danger\"\n type=\"button\"\n onClick={() => deleteQbitInstance(key)}\n >\n <IconImage src={DeleteIcon} />\n Delete\n </button>\n ) : null}\n <button\n className=\"btn primary\"\n type=\"button\"\n onClick={() => setActiveQbitKey(key)}\n >\n <IconImage src={ConfigureIcon} />\n Configure\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </details>\n </section>\n {groupedArrSections.length ? (\n <div className=\"config-arr-groups\">\n {groupedArrSections.map((group) => (\n <section className=\"config-arr-group\" key={group.type}>\n <details className=\"config-arr-group__details\" open>\n <summary>\n <span>{group.label}</span>\n <span className=\"config-arr-group__count\">\n {group.items.length}\n </span>\n {(group.type === \"radarr\" || group.type === \"sonarr\" || group.type === \"lidarr\") && (\n <button\n className=\"btn small\"\n type=\"button\"\n onClick={() => addArrInstance(group.type as \"radarr\" | \"sonarr\" | \"lidarr\")}\n >\n <IconImage src={AddIcon} />\n Add Instance\n </button>\n )}\n </summary>\n <div className=\"config-arr-grid\">\n {group.items.map(([key, value]) => {\n const uri = getValue(value as ConfigDocument, [\"URI\"]);\n const category = getValue(value as ConfigDocument, [\"Category\"]);\n const managed = getValue(value as ConfigDocument, [\"Managed\"]);\n const canDelete = group.type === \"radarr\" || group.type === \"sonarr\" || group.type === \"lidarr\";\n return (\n <div className=\"card config-card config-arr-card\" key={key}>\n <div className=\"card-header\">{key}</div>\n <div className=\"card-body\">\n <dl className=\"config-arr-summary\">\n <div className=\"config-arr-summary__item\">\n <dt>Managed</dt>\n <dd>{managed ? \"Enabled\" : \"Disabled\"}</dd>\n </div>\n <div className=\"config-arr-summary__item\">\n <dt>Category</dt>\n <dd>{category ? String(category) : \"-\"}</dd>\n </div>\n <div className=\"config-arr-summary__item\">\n <dt>URI</dt>\n <dd className=\"config-arr-summary__uri\">\n {uri ? String(uri) : \"-\"}\n </dd>\n </div>\n </dl>\n <div className=\"config-arr-actions\">\n {canDelete ? (\n <button\n className=\"btn danger\"\n type=\"button\"\n onClick={() => deleteArrInstance(key)}\n >\n <IconImage src={DeleteIcon} />\n Delete\n </button>\n ) : null}\n <button\n className=\"btn primary\"\n type=\"button\"\n onClick={() => setActiveArrKey(key)}\n >\n <IconImage src={ConfigureIcon} />\n Configure\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </details>\n </section>\n ))}\n </div>\n ) : null}\n <div className=\"config-footer\">\n <button\n className=\"btn primary\"\n onClick={() => void handleSubmit()}\n disabled={saving}\n >\n <IconImage src={SaveIcon} />\n Save + Live Reload\n </button>\n </div>\n </div>\n </section>\n {activeArrKey && formState ? (\n <ArrInstanceModal\n keyName={activeArrKey}\n state={(formState[activeArrKey] as ConfigDocument) ?? null}\n onChange={handleFieldChange}\n onRename={handleRenameSection}\n onClose={() => setActiveArrKey(null)}\n />\n ) : null}\n {isSettingsOpen ? (\n <SimpleConfigModal\n title=\"Settings\"\n fields={SETTINGS_FIELDS}\n state={formState}\n basePath={[]}\n onChange={handleFieldChange}\n onClose={() => setSettingsOpen(false)}\n />\n ) : null}\n {isWebSettingsOpen ? (\n <SimpleConfigModal\n title=\"Web Settings\"\n fields={WEB_SETTINGS_FIELDS}\n state={formState}\n basePath={[]}\n onChange={handleFieldChange}\n onClose={() => setWebSettingsOpen(false)}\n showLiveSettings={true}\n />\n ) : null}\n {activeQbitKey && formState ? (\n <QbitInstanceModal\n keyName={activeQbitKey}\n state={(formState[activeQbitKey] as ConfigDocument) ?? null}\n onChange={handleFieldChange}\n onRename={handleRenameQbitSection}\n onClose={() => setActiveQbitKey(null)}\n />\n ) : null}\n </>\n );\n}\n\ninterface ConfigSummaryCardProps {\n title: string;\n description: string;\n onConfigure: () => void;\n}\n\nfunction ConfigSummaryCard({\n title,\n description,\n onConfigure,\n}: ConfigSummaryCardProps): JSX.Element {\n return (\n <div className=\"card config-card\">\n <div className=\"card-header\">{title}</div>\n <div className=\"card-body config-summary-card\">\n <p>{description}</p>\n <div className=\"config-arr-actions\">\n <button className=\"btn primary\" type=\"button\" onClick={onConfigure}>\n <IconImage src={ConfigureIcon} />\n Configure\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n\n\ninterface FieldGroupProps {\n title: string | null;\n fields: FieldDefinition[];\n state: ConfigDocument | ConfigDocument[keyof ConfigDocument] | null;\n basePath: string[];\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onRenameSection?: (oldName: string, newName: string) => void;\n defaultOpen?: boolean;\n qualityProfiles?: Array<{ id: number; name: string }>;\n sectionKey?: string;\n}\n\nfunction FieldGroup({\n title,\n fields,\n state,\n basePath,\n onChange,\n onRenameSection,\n defaultOpen = false,\n qualityProfiles = [],\n sectionKey,\n}: FieldGroupProps): JSX.Element {\n const sectionName = sectionKey ?? basePath[0] ?? \"\";\n\n if (title === \"Quality Profile Mappings\") {\n const mappings = (getValue(state as ConfigDocument, [\"EntrySearch\", \"QualityProfileMappings\"]) ?? {}) as Record<string, string>;\n const mappingEntries = Object.entries(mappings);\n\n // Check if credentials exist (URI and APIKey)\n const hasCredentials = Boolean(\n getValue(state as ConfigDocument, [\"URI\"]) &&\n getValue(state as ConfigDocument, [\"APIKey\"])\n );\n const hasProfiles = qualityProfiles.length > 0;\n\n const handleAddMapping = () => {\n const nextMappings = { ...mappings, \"\": \"\" };\n onChange([...basePath, \"EntrySearch\", \"QualityProfileMappings\"], {} as FieldDefinition, nextMappings);\n };\n\n const handleUpdateMapping = (oldKey: string, newKey: string, newValue: string) => {\n const nextMappings = { ...mappings };\n if (oldKey !== newKey) {\n delete nextMappings[oldKey];\n }\n if (newKey.trim()) {\n nextMappings[newKey.trim()] = newValue.trim();\n }\n onChange([...basePath, \"EntrySearch\", \"QualityProfileMappings\"], {} as FieldDefinition, nextMappings);\n };\n\n const handleDeleteMapping = (key: string) => {\n const nextMappings = { ...mappings };\n delete nextMappings[key];\n onChange([...basePath, \"EntrySearch\", \"QualityProfileMappings\"], {} as FieldDefinition, nextMappings);\n };\n\n return (\n <details className=\"config-section\" open={defaultOpen}>\n <summary>{title}</summary>\n <div className=\"config-section__body\">\n <div className=\"field-description\" style={{ marginBottom: '1rem' }}>\n Map main quality profile names to temporary profile names. Items will be downgraded to the temp profile when not found, then upgraded back to the main profile when available.\n </div>\n\n {!hasCredentials ? (\n <div className=\"alert warning\">\n ⚠️ Please configure URI and API Key first, then click \"Test Connection\" to load quality profiles\n </div>\n ) : !hasProfiles ? (\n <div className=\"alert info\">\n ℹ️ Click \"Test Connection\" above to load quality profiles from your {sectionName} instance\n </div>\n ) : (\n <>\n <div className=\"profile-mappings-grid\">\n {mappingEntries.map(([mainProfile, tempProfile], index) => (\n <div key={index} className=\"profile-mapping-row\">\n <div className=\"field\">\n <label>Main Profile</label>\n <Select\n options={qualityProfiles.map((p) => ({\n value: p.name,\n label: p.name,\n }))}\n value={\n mainProfile\n ? { value: mainProfile, label: mainProfile }\n : null\n }\n onChange={(option) =>\n handleUpdateMapping(\n mainProfile,\n option?.value || \"\",\n tempProfile\n )\n }\n placeholder=\"Select main profile...\"\n isClearable\n styles={getSelectStyles()}\n classNamePrefix=\"react-select\"\n />\n </div>\n <div className=\"field\">\n <label>Temp Profile</label>\n <Select\n options={qualityProfiles.map((p) => ({\n value: p.name,\n label: p.name,\n }))}\n value={\n tempProfile\n ? { value: tempProfile, label: tempProfile }\n : null\n }\n onChange={(option) =>\n handleUpdateMapping(\n mainProfile,\n mainProfile,\n option?.value || \"\"\n )\n }\n placeholder=\"Select temp profile...\"\n isClearable\n styles={getSelectStyles()}\n classNamePrefix=\"react-select\"\n />\n </div>\n <button\n className=\"btn ghost icon-only\"\n type=\"button\"\n onClick={() => handleDeleteMapping(mainProfile)}\n title=\"Delete mapping\"\n >\n <IconImage src={DeleteIcon} />\n </button>\n </div>\n ))}\n </div>\n <div className=\"config-actions\">\n <button className=\"btn\" type=\"button\" onClick={handleAddMapping}>\n <IconImage src={AddIcon} />\n Add Profile Mapping\n </button>\n </div>\n </>\n )}\n </div>\n </details>\n );\n }\n\n if (title === \"Trackers\") {\n const trackers = (getValue(state as ConfigDocument, [\"Torrent\", \"Trackers\"]) ?? []) as ConfigDocument[];\n const handleAddTracker = () => {\n const nextTrackers = [\n ...trackers,\n {\n Url: \"\",\n RemoveIfExists: false,\n SuperSeedMode: false,\n AddTags: [],\n },\n ];\n onChange([...basePath, \"Torrent\", \"Trackers\"], {} as FieldDefinition, nextTrackers);\n };\n const handleDeleteTracker = (index: number) => {\n const nextTrackers = [...trackers];\n nextTrackers.splice(index, 1);\n onChange([...basePath, \"Torrent\", \"Trackers\"], {} as FieldDefinition, nextTrackers);\n };\n return (\n <details className=\"config-section\" open={defaultOpen}>\n <summary>{title}</summary>\n <div className=\"config-section__body\">\n <div className=\"tracker-grid\">\n {trackers.map((tracker, index) => (\n <TrackerCard\n key={index}\n fields={fields}\n state={tracker}\n basePath={[...basePath, \"Torrent\", \"Trackers\", String(index)]}\n onChange={onChange}\n onDelete={() => handleDeleteTracker(index)}\n />\n ))}\n </div>\n <div className=\"config-actions\">\n <button className=\"btn\" type=\"button\" onClick={handleAddTracker}>\n <IconImage src={AddIcon} />\n Add Tracker\n </button>\n </div>\n </div>\n </details>\n );\n }\n\n const renderedFields = fields.map((field) => {\n if (field.sectionName) {\n if (!sectionName) {\n return null;\n }\n const tooltip = getTooltip([sectionName]);\n\n // Determine expected prefix for Arr instances\n let expectedPrefix: string | undefined;\n if (sectionName.startsWith(\"Radarr\")) {\n expectedPrefix = \"Radarr\";\n } else if (sectionName.startsWith(\"Sonarr\")) {\n expectedPrefix = \"Sonarr\";\n } else if (sectionName.startsWith(\"Lidarr\")) {\n expectedPrefix = \"Lidarr\";\n }\n\n return (\n <SectionNameField\n key={`${sectionName}.__name`}\n label={field.label}\n tooltip={tooltip}\n currentName={sectionName}\n placeholder={field.placeholder}\n expectedPrefix={expectedPrefix}\n onRename={(newName) => onRenameSection?.(sectionName, newName)}\n />\n );\n }\n\n const pathSegments = field.path ?? [];\n const path = [...basePath, ...pathSegments];\n const key = path.join('.');\n const rawValue = path.length > 0\n ? getValue(state as ConfigDocument, path)\n : undefined;\n const formatted =\n field.format?.(rawValue) ??\n (field.type === \"checkbox\" ? Boolean(rawValue) : String(rawValue ?? \"\"));\n const tooltip = getTooltip(path);\n const description =\n field.description ??\n extractTooltipSummary(tooltip) ??\n (field.type === \"checkbox\"\n ? `Enable or disable ${field.label}.`\n : `Set the ${field.label} value.`);\n\n const isArrInstance = basePath.length > 0 && SERVARR_SECTION_REGEX.test(basePath[0] ?? \"\");\n const isArrApiKey = isArrInstance && (field.path?.[field.path.length - 1] ?? \"\") === \"APIKey\";\n const fieldClassName = field.fullWidth ? \"field field--full-width\" : \"field\";\n\n if (field.secure) {\n return (\n <SecureField\n key={key}\n label={field.label}\n tooltip={tooltip}\n description={description}\n value={String(rawValue ?? '')}\n placeholder={field.placeholder}\n canRefresh={!isArrApiKey}\n onChange={(val) => onChange(path, field, val)}\n />\n );\n }\n\n\n\n if (field.type === \"checkbox\") {\n return (\n <div key={key} className=\"checkbox-field\">\n <label title={tooltip}>\n <input\n type=\"checkbox\"\n checked={Boolean(formatted)}\n onChange={(event) => onChange(path, field, event.target.checked)}\n />\n {field.label}\n </label>\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n }\n if (field.type === \"select\") {\n // Special handling for Theme field - apply immediately without save\n const isThemeField = field.label === \"Theme\" && path.join('.') === \"WebUI.Theme\";\n\n // Normalize the formatted value for theme field (case-insensitive)\n let displayValue = formatted;\n if (isThemeField && typeof formatted === \"string\") {\n const normalizedLower = formatted.toLowerCase();\n if (normalizedLower === \"light\") {\n displayValue = \"Light\";\n } else if (normalizedLower === \"dark\") {\n displayValue = \"Dark\";\n } else {\n // Default to Dark if invalid\n displayValue = \"Dark\";\n }\n }\n\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <Select\n options={(field.options ?? []).map(o => ({ value: o, label: o }))}\n value={displayValue ? { value: displayValue, label: displayValue } : null}\n onChange={(option) => {\n const newValue = option?.value || \"\";\n onChange(path, field, newValue);\n\n // If this is the theme field, apply immediately\n if (isThemeField && typeof newValue === \"string\" && newValue) {\n const theme = newValue.toLowerCase() as \"light\" | \"dark\";\n document.documentElement.setAttribute('data-theme', theme);\n localStorage.setItem(\"theme\", theme);\n }\n }}\n styles={getSelectStyles()}\n />\n {description && <div className=\"field-description\">{description}</div>}\n {isThemeField && <div className=\"field-hint\">Theme changes apply immediately</div>}\n </div>\n );\n }\n if (field.type === \"number\") {\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <input\n type=\"number\"\n value={Number(formatted) || 0}\n onChange={(event) => onChange(path, field, String(event.target.value))}\n placeholder={field.placeholder}\n />\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n }\n if (field.type === \"password\") {\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <input\n type=\"password\"\n value={String(formatted)}\n onChange={(event) => onChange(path, field, event.target.value)}\n placeholder={field.placeholder}\n />\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n }\n return (\n <div key={key} className={fieldClassName}>\n <label title={tooltip}>{field.label}</label>\n <input\n type=\"text\"\n value={String(formatted)}\n onChange={(event) => onChange(path, field, event.target.value)}\n placeholder={field.placeholder}\n />\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n });\n\n if (title) {\n return (\n <details className=\"config-section\" open={defaultOpen}>\n <summary>{title}</summary>\n <div className=\"config-section__body field-grid\">{renderedFields}</div>\n </details>\n );\n }\n\n return <div className=\"field-grid\">{renderedFields}</div>;\n}\n\nfunction TrackerCard({\n fields,\n state,\n basePath,\n onChange,\n onDelete,\n}: {\n fields: FieldDefinition[];\n state: ConfigDocument | null;\n basePath: string[];\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onDelete: () => void;\n}): JSX.Element {\n const trackerName = (getValue(state, [\"Name\"]) as string) || \"New Tracker\";\n return (\n <details className=\"card tracker-card\" open>\n <summary className=\"card-header\">\n <span>{trackerName}</span>\n <button className=\"btn danger ghost\" type=\"button\" onClick={onDelete}>\n <IconImage src={DeleteIcon} />\n </button>\n </summary>\n <div className=\"card-body\">\n <FieldGroup title={null} fields={fields} state={state} basePath={basePath} onChange={onChange} />\n </div>\n </details>\n );\n}\n\ninterface SectionNameFieldProps {\n label: string;\n currentName: string;\n placeholder?: string;\n tooltip?: string;\n expectedPrefix?: string;\n onRename: (newName: string) => void;\n}\n\nfunction SectionNameField({\n label,\n currentName,\n placeholder,\n tooltip,\n expectedPrefix,\n onRename,\n}: SectionNameFieldProps): JSX.Element {\n const [value, setValue] = useState(currentName);\n const description =\n extractTooltipSummary(tooltip) ?? `Rename the ${currentName} instance.`;\n\n useEffect(() => {\n setValue(currentName);\n }, [currentName]);\n\n const commit = () => {\n const trimmed = value.trim();\n if (!trimmed) {\n setValue(currentName);\n return;\n }\n\n let adjustedName = trimmed;\n\n // Check if this is a qBit instance\n const isQbitInstance = QBIT_SECTION_REGEX.test(currentName);\n\n if (isQbitInstance) {\n // qBit instances must follow qBit-NAME format (or just \"qBit\" for default)\n if (trimmed === \"qBit\") {\n // Allow default name\n adjustedName = \"qBit\";\n } else if (!trimmed.startsWith(\"qBit-\")) {\n // If user entered something without the prefix, prepend it\n adjustedName = `qBit-${trimmed}`;\n }\n\n // Validate format\n if (adjustedName !== \"qBit\" && !adjustedName.match(/^qBit-.+$/)) {\n alert(`qBit instance name must match format: qBit-NAME\\nExample: qBit-seedbox`);\n setValue(currentName);\n return;\n }\n } else {\n // Enforce prefix if specified (for Arr instances)\n if (expectedPrefix && !trimmed.startsWith(expectedPrefix)) {\n // If user entered something without the prefix, prepend it\n adjustedName = expectedPrefix + (trimmed.startsWith(\"-\") ? trimmed : `-${trimmed}`);\n }\n\n // Enforce format: (Rad|Son|Lid)arr-.+ (prefix-suffix with at least one character after dash)\n const formatRegex = /^(Radarr|Sonarr|Lidarr)-.+$/;\n if (!formatRegex.test(adjustedName)) {\n // Invalid format - show error and reset\n alert(`Instance name must match format: ${expectedPrefix || '(Rad|Son|Lid)arr'}-(name)\\nExample: ${expectedPrefix || 'Radarr'}-Movies`);\n setValue(currentName);\n return;\n }\n }\n\n if (adjustedName !== currentName) {\n onRename(adjustedName);\n } else {\n setValue(currentName); // Reset if no actual change\n }\n };\n\n return (\n <div className=\"field\">\n <label className=\"field-label\">\n <span>{label}</span>\n {tooltip ? (\n <span className=\"help-icon\" title={tooltip} aria-label={tooltip}>\n ?\n </span>\n ) : null}\n </label>\n {description ? <p className=\"field-description\">{description}</p> : null}\n <input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n onChange={(event) => setValue(event.target.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n commit();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(currentName);\n }\n }}\n />\n </div>\n );\n}\n\ninterface SecureFieldProps {\n label: string;\n value: string;\n placeholder?: string;\n tooltip?: string;\n description?: string;\n canRefresh?: boolean;\n onChange: (value: string) => void;\n}\n\nfunction SecureField({\n label,\n value,\n placeholder,\n tooltip,\n description,\n canRefresh = true,\n onChange,\n}: SecureFieldProps): JSX.Element {\n const [showValue, setShowValue] = useState(false);\n\n const handleRefresh = () => {\n let newKey = \"\";\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n newKey = crypto.randomUUID().replace(/-/g, \"\");\n } else {\n newKey = Array.from({ length: 32 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join(\"\");\n }\n onChange(newKey);\n };\n\n return (\n <div className=\"field secure-field\">\n <label title={tooltip}>{label}</label>\n <div className=\"secure-field__input-group\">\n <input\n type={showValue ? \"text\" : \"password\"}\n value={value}\n placeholder={placeholder}\n onChange={(event) => onChange(event.target.value)}\n />\n <button type=\"button\" className=\"btn ghost\" onClick={() => setShowValue(!showValue)}>\n <IconImage src={VisibilityIcon} />\n </button>\n {canRefresh && (\n <button type=\"button\" className=\"btn ghost\" onClick={handleRefresh}>\n <IconImage src={RefreshIcon} />\n </button>\n )}\n </div>\n {description && <div className=\"field-description\">{description}</div>}\n </div>\n );\n}\n\ninterface ArrInstanceModalProps {\n keyName: string;\n state: ConfigDocument | ConfigDocument[keyof ConfigDocument] | null;\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onRename: (oldName: string, newName: string) => void;\n onClose: () => void;\n}\n\nfunction ArrInstanceModal({\n keyName,\n state,\n onChange,\n onRename,\n onClose,\n}: ArrInstanceModalProps): JSX.Element {\n const { generalFields, entryFields, entryOmbiFields, entryOverseerrFields, torrentFields, seedingFields, trackerFields } =\n getArrFieldSets(keyName);\n const { push } = useToast();\n\n // State for test connection\n const [testState, setTestState] = useState<{\n testing: boolean;\n result: TestConnectionResponse | null;\n }>({ testing: false, result: null });\n\n const [qualityProfiles, setQualityProfiles] = useState<\n Array<{ id: number; name: string }>\n >([]);\n\n // Helper to get value from state\n const getValue = (path: string[]): unknown => {\n if (!state) return undefined;\n // state is already the Arr instance object, not the full ConfigDocument\n return get(state, path);\n };\n\n // Clear test state when URI or APIKey changes\n useEffect(() => {\n setTestState({ testing: false, result: null });\n setQualityProfiles([]);\n }, [getValue([\"URI\"]), getValue([\"APIKey\"])]);\n\n // Auto-test connection when modal opens if credentials exist\n useEffect(() => {\n const uri = getValue([\"URI\"]) as string;\n const apiKey = getValue([\"APIKey\"]) as string;\n\n if (uri && apiKey && !testState.testing && !testState.result) {\n // Auto-test silently (without toasts)\n handleTestConnection(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only run on mount\n\n // Test connection handler\n const handleTestConnection = async (silent = false) => {\n const uri = getValue([\"URI\"]) as string;\n const apiKey = getValue([\"APIKey\"]) as string;\n\n // Determine Arr type from keyName\n const keyLower = keyName.toLowerCase();\n const arrType = keyLower.includes(\"radarr\")\n ? \"radarr\"\n : keyLower.includes(\"sonarr\")\n ? \"sonarr\"\n : \"lidarr\";\n\n if (!uri || !apiKey) {\n if (!silent) {\n push(\"Please configure URI and API Key first\", \"error\");\n }\n return false;\n }\n\n setTestState({ testing: true, result: null });\n\n try {\n const result = await testArrConnection({ arrType, uri, apiKey });\n setTestState({ testing: false, result });\n\n if (result.success) {\n // Cache quality profiles for dropdown use\n if (result.qualityProfiles) {\n setQualityProfiles(result.qualityProfiles);\n }\n if (!silent) {\n push(`Connected to ${keyName} successfully!`, \"success\");\n }\n return true;\n } else {\n if (!silent) {\n push(`Connection failed: ${result.message}`, \"error\");\n }\n return false;\n }\n } catch {\n setTestState({ testing: false, result: null });\n if (!silent) {\n push(\"Test connection failed\", \"error\");\n }\n return false;\n }\n };\n\n // Handle save with connection test\n const handleSave = async () => {\n const uri = getValue([\"URI\"]) as string;\n const apiKey = getValue([\"APIKey\"]) as string;\n\n // If credentials exist, test connection before saving\n if (uri && apiKey) {\n const success = await handleTestConnection(false);\n if (success) {\n push(\"Configuration saved successfully\", \"success\");\n onClose();\n }\n // If unsuccessful, stay open so user can fix config\n } else {\n // No credentials to test, just close\n onClose();\n }\n };\n\n return (\n <div className=\"modal-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"arr-instance-modal-title\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2 id=\"arr-instance-modal-title\">\n Configure <code>{keyName}</code>\n </h2>\n <button className=\"btn ghost\" type=\"button\" onClick={onClose}>\n <IconImage src={CloseIcon} />\n Close\n </button>\n </div>\n <div className=\"modal-body\">\n <FieldGroup\n title={null}\n fields={generalFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n onRenameSection={onRename}\n sectionKey={keyName}\n defaultOpen\n />\n {testState.result && (\n <div\n className={`alert ${testState.result.success ? \"success\" : \"error\"}`}\n style={{ margin: \"16px 0\" }}\n >\n {testState.result.success ? (\n <>\n <strong>✓ {testState.result.message}</strong>\n {testState.result.systemInfo && (\n <div className=\"alert-details\">\n Version: {testState.result.systemInfo.version}\n {testState.result.systemInfo.branch &&\n ` (${testState.result.systemInfo.branch})`}\n </div>\n )}\n {testState.result.qualityProfiles && (\n <div className=\"alert-details\">\n Found {testState.result.qualityProfiles.length} quality\n profile(s)\n </div>\n )}\n </>\n ) : (\n <>\n <strong>⚠️ Connection Failed</strong>\n <br />\n {testState.result.message}\n </>\n )}\n </div>\n )}\n <FieldGroup\n title=\"Entry Search\"\n fields={entryFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n defaultOpen\n />\n <FieldGroup\n title=\"Quality Profile Mappings\"\n fields={[]}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n defaultOpen\n qualityProfiles={qualityProfiles}\n />\n {entryOmbiFields.length > 0 && (\n <FieldGroup\n title=\"Ombi Integration\"\n fields={entryOmbiFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n )}\n {entryOverseerrFields.length > 0 && (\n <FieldGroup\n title=\"Overseerr Integration\"\n fields={entryOverseerrFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n )}\n <FieldGroup\n title=\"Torrent Handling\"\n fields={torrentFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n <FieldGroup\n title=\"Seeding\"\n fields={seedingFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n <FieldGroup\n title=\"Trackers\"\n fields={trackerFields}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n sectionKey={keyName}\n />\n </div>\n <div className=\"modal-footer\">\n <button\n className=\"btn secondary\"\n type=\"button\"\n onClick={() => handleTestConnection(false)}\n disabled={testState.testing}\n >\n {testState.testing ? (\n <>\n <IconImage src={RefreshIcon} />\n Testing...\n </>\n ) : (\n \"Test\"\n )}\n </button>\n <button className=\"btn primary\" type=\"button\" onClick={handleSave}>\n <IconImage src={SaveIcon} />\n Save\n </button>\n </div>\n </div>\n </div>\n );\n}\n\ninterface QbitInstanceModalProps {\n keyName: string;\n state: ConfigDocument | ConfigDocument[keyof ConfigDocument] | null;\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onRename: (oldName: string, newName: string) => void;\n onClose: () => void;\n}\n\nfunction QbitInstanceModal({\n keyName,\n state,\n onChange,\n onRename,\n onClose,\n}: QbitInstanceModalProps): JSX.Element {\n const isDefault = keyName === \"qBit\";\n\n return (\n <div className=\"modal-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"qbit-instance-modal-title\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2 id=\"qbit-instance-modal-title\">\n Configure <code>{keyName}</code>\n {isDefault && <span style={{ marginLeft: '8px', opacity: 0.6 }}>(Default Instance)</span>}\n </h2>\n <button className=\"btn ghost\" type=\"button\" onClick={onClose}>\n <IconImage src={CloseIcon} />\n Close\n </button>\n </div>\n <div className=\"modal-body\">\n <FieldGroup\n title={null}\n fields={QBIT_FIELDS}\n state={state}\n basePath={[]}\n onChange={(path, def, value) => onChange([keyName, ...path], def, value)}\n onRenameSection={isDefault ? undefined : onRename}\n sectionKey={keyName}\n defaultOpen\n />\n {isDefault && (\n <div className=\"alert info\" style={{ marginTop: '16px' }}>\n ℹ️ This is the default qBittorrent instance (required). To add additional instances, use the \"Add Instance\" button.\n </div>\n )}\n </div>\n <div className=\"modal-footer\">\n <button className=\"btn primary\" type=\"button\" onClick={onClose}>\n <IconImage src={SaveIcon} />\n Done\n </button>\n </div>\n </div>\n </div>\n );\n}\n\ninterface SimpleConfigModalProps {\n title: string;\n fields: FieldDefinition[];\n state: ConfigDocument | null;\n basePath: string[];\n onChange: (path: string[], def: FieldDefinition, value: unknown) => void;\n onClose: () => void;\n showLiveSettings?: boolean;\n}\n\nfunction SimpleConfigModal({\n title,\n fields,\n state,\n basePath,\n onChange,\n onClose,\n showLiveSettings = false,\n}: SimpleConfigModalProps): JSX.Element | null {\n const webUI = useWebUI();\n\n if (!state) return null;\n return (\n <div className=\"modal-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={`${title}-modal-title`}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2 id={`${title}-modal-title`}>{title}</h2>\n <button className=\"btn ghost\" type=\"button\" onClick={onClose}>\n <IconImage src={CloseIcon} />\n Close\n </button>\n </div>\n <div className=\"modal-body\">\n <FieldGroup\n title={null}\n fields={fields}\n state={state}\n basePath={basePath}\n onChange={onChange}\n defaultOpen\n />\n {showLiveSettings && webUI && (\n <div className=\"field-group\">\n <h3 className=\"field-group-title\">Live Settings</h3>\n <div className=\"field-group-content\">\n <div className=\"field\">\n <label>\n <input\n type=\"checkbox\"\n checked={webUI.liveArr}\n onChange={(e) => webUI.setLiveArr(e.target.checked)}\n />\n {\" \"}Live Arr Updates\n </label>\n <p className=\"field-description\">Enable real-time updates for Arr views</p>\n </div>\n <div className=\"field\">\n <label>\n <input\n type=\"checkbox\"\n checked={webUI.groupSonarr}\n onChange={(e) => webUI.setGroupSonarr(e.target.checked)}\n />\n {\" \"}Group Sonarr by Series\n </label>\n <p className=\"field-description\">Group Sonarr episodes by series in views</p>\n </div>\n <div className=\"field\">\n <label>\n <input\n type=\"checkbox\"\n checked={webUI.groupLidarr}\n onChange={(e) => webUI.setGroupLidarr(e.target.checked)}\n />\n {\" \"}Group Lidarr by Artist\n </label>\n <p className=\"field-description\">Group Lidarr albums by artist in views</p>\n </div>\n <div className=\"field\">\n <label>Theme</label>\n <select\n value={webUI.theme}\n onChange={(e) => webUI.setTheme(e.target.value as \"light\" | \"dark\")}\n >\n <option value=\"dark\">Dark</option>\n <option value=\"light\">Light</option>\n </select>\n <p className=\"field-description\">WebUI theme (Light or Dark)</p>\n </div>\n </div>\n </div>\n )}\n </div>\n <div className=\"modal-footer\">\n <button className=\"btn primary\" type=\"button\" onClick={onClose}>\n <IconImage src={SaveIcon} />\n Done\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["NOTHING","DRAFTABLE","DRAFT_STATE","die","error","args","O","getPrototypeOf","CONSTRUCTOR","PROTOTYPE","CONFIGURABLE","ENUMERABLE","WRITABLE","VALUE","isDraft","value","isDraftable","isPlainObject","isArray","isMap","isSet","objectCtorString","cachedCtorStrings","isObjectish","proto","Ctor","isFunction","ctorString","each","obj","iter","strict","getArchtype","key","entry","index","thing","state","has","prop","type","get","set","propOrOldValue","is","x","y","target","isBoolean","isArrayIndex","n","latest","getFinalValue","shallowCopy","base","isPlain","descriptors","keys","desc","freeze","deep","isFrozen","dontMutateMethodOverride","_key","dontMutateFrozenCollections","PluginMapSet","PluginPatches","PluginArrayMethods","plugins","getPlugin","pluginKey","plugin","isPluginLoaded","currentScope","getCurrentScope","createScope","parent_","immer_","usePatchesInScope","scope","patchListener","revokeScope","leaveScope","revokeDraft","enterScope","immer2","draft","processResult","result","baseDraft","finalize","patchPlugin_","maybeFreeze","rootScope","handleValue","isSameScope","callbacks_","generatePatchesAndFinalize","markStateFinalized","EMPTY_LOCATIONS_RESULT","updateDraftInParent","parent","draftValue","finalizedValue","originalKey","parentCopy","parentType","draftLocations","locations","location","registerChildFinalizationCallback","child","basePath","handleCrossReference","scope_","prepareCopy","targetCopy","handledSet","updatedValue","createProxyProxy","baseIsArray","traps","objectTraps","arrayTraps","revoke","proxy","arrayPlugin","isArrayWithStringProp","source","readPropFromProto","peek","childKey","childDraft","createProxy","getDescriptorFromProto","current2","currentState","markChanged","owner","fn","Immer2","config","recipe","defaultBase","self","base2","hasError","p","ip","patches","inversePatches","current","i","patch","applyPatchesImpl","rootScope2","currentImpl","copy","childValue","immer","produce","fastDeepEqual","equal","a","b","length","freeGlobal","freeSelf","root","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","symbolTag","isSymbol","arrayMap","array","iteratee","symbolProto","symbolToString","baseToString","isObject","asyncTag","funcTag","genTag","proxyTag","coreJsData","maskSrcKey","uid","isMasked","func","funcProto","funcToString","toSource","reRegExpChar","reIsHostCtor","reIsNative","baseIsNative","pattern","getValue","object","getNative","defineProperty","MAX_SAFE_INTEGER","reIsUint","isIndex","baseAssignValue","eq","other","assignValue","objValue","reIsDeepProp","reIsPlainProp","isKey","nativeCreate","hashClear","hashDelete","HASH_UNDEFINED","hashGet","data","hashHas","hashSet","Hash","entries","listCacheClear","assocIndexOf","arrayProto","splice","listCacheDelete","lastIndex","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","isKeyable","getMapData","map","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","size","MapCache","FUNC_ERROR_TEXT","memoize","resolver","memoized","cache","MAX_MEMOIZE_SIZE","memoizeCapped","rePropName","reEscapeChar","stringToPath","string","match","number","quote","subString","toString","castPath","toKey","baseGet","path","defaultValue","baseSet","customizer","nested","newValue","FIELD_TOOLTIPS","getTooltip","joined","qbitPrefix","withArrPrefix","entrySearchPrefix","torrentPrefix","leaf","VisibilityIcon","AddIcon","SaveIcon","DeleteIcon","SERVARR_SECTION_REGEX","QBIT_SECTION_REGEX","getSelectStyles","isDark","parseList","part","formatList","IMPORT_MODE_OPTIONS","SENTENCE_END","extractTooltipSummary","tooltip","trimmed","sentence","SETTINGS_FIELDS","folder","raw","context","freeSpace","num","parts","WEB_SETTINGS_FIELDS","port","QBIT_FIELDS","ARR_GENERAL_FIELDS","uri","apiKey","ARR_ENTRY_SEARCH_FIELDS","str","ARR_ENTRY_SEARCH_OMBI_FIELDS","ARR_ENTRY_SEARCH_OVERSEERR_FIELDS","ARR_TORRENT_FIELDS","ARR_SEEDING_FIELDS","ARR_TRACKER_FIELDS","getArrFieldSets","arrKey","lower","isSonarr","isLidarr","generalFields","entryFields","field","entryOmbiFields","entryOverseerrFields","torrentFields","seedingFields","trackerFields","isEmptyValue","basicValidation","def","label","isRequired","validateFieldGroup","errors","fields","pathSegments","fullPath","baseError","customError","validateFormState","formState","rootContext","section","sectionContext","fieldSets","doc","setValue","flatten","prefix","nextPath","ensureArrDefaults","lowerType","isRadarr","arrErrorCodes","entrySearch","ConfigView","props","onDirtyChange","push","useToast","originalConfig","setOriginalConfig","useState","setFormState","loading","setLoading","saving","setSaving","loadConfig","useCallback","getConfig","useEffect","handleFieldChange","parsed","arrSections","useMemo","qbitSections","groupedArrSections","groups","sorted","radarr","sonarr","lidarr","others","keyLower","activeArrKey","setActiveArrKey","activeQbitKey","setActiveQbitKey","isSettingsOpen","setSettingsOpen","isWebSettingsOpen","setWebSettingsOpen","isDirty","setDirty","flattenedOriginal","flattenedCurrent","liveKeys","dirty","originalValue","handleBeforeUnload","event","handleKeyDown","style","originalOverflow","addArrInstance","defaults","deleteArrInstance","addQbitInstance","deleteQbitInstance","handleRenameSection","oldName","rawNewName","newName","handleRenameQbitSection","handleSubmit","validationErrors","formatted","message","changes","configReloaded","reloadType","affectedInstances","updateConfig","cacheNames","cacheName","jsxs","jsx","Fragment","ConfigSummaryCard","IconImage","host","disabled","isDefault","ConfigureIcon","group","category","managed","canDelete","ArrInstanceModal","SimpleConfigModal","QbitInstanceModal","title","description","onConfigure","FieldGroup","onChange","onRenameSection","defaultOpen","qualityProfiles","sectionKey","sectionName","mappings","mappingEntries","hasCredentials","hasProfiles","handleAddMapping","nextMappings","handleUpdateMapping","oldKey","newKey","handleDeleteMapping","mainProfile","tempProfile","Select","option","trackers","handleAddTracker","nextTrackers","handleDeleteTracker","tracker","TrackerCard","renderedFields","expectedPrefix","SectionNameField","rawValue","isArrApiKey","fieldClassName","SecureField","val","isThemeField","displayValue","normalizedLower","o","theme","onDelete","trackerName","currentName","placeholder","onRename","commit","adjustedName","canRefresh","showValue","setShowValue","handleRefresh","RefreshIcon","keyName","onClose","testState","setTestState","setQualityProfiles","handleTestConnection","silent","arrType","testArrConnection","handleSave","e","CloseIcon","showLiveSettings","webUI","useWebUI"],"mappings":"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CT,CClBA,SAASxK,GAAIwK,EAAQgE,EAAMnQ,EAAO,CAChC,OAAOmM,GAAU,KAAOA,EAASkE,GAAQlE,EAAQgE,EAAMnQ,CAAK,CAC9D,CChCO,MAAMyQ,EAAyC,CACpD,wBACE,yFACF,mBAAoB,sCACpB,mCACE,yFACF,qBACE,mGACF,2BACE,gFACF,2BACE,+EACF,gCACE,gFACF,0BACE,yEACF,2BACE,oDACF,0BAA2B,0CAC3B,2BAA4B,2CAC5B,mBAAoB,yDACpB,qCACE,2EACF,oBACE,gFACF,6BACE,gEACF,6BACE,4EACF,0BACE,yFACF,gCACE,+GACF,8BACE,sJACF,gCACE,yJACF,+BACE,2GACF,aACE,6EACF,aAAc,sCACd,cACE,0FACD,gBAAiB,qCACjB,oBAAqB,oEACrB,cAAe,yDAEhB,gBACE,0FACF,YAAa,wCACb,YAAa,0BACb,gBAAiB,8BACjB,gBACE,sFAEF,SACE,4EACF,KAAQ,wCACR,KAAQ,0BACR,SAAY,8BACZ,SACE,sFAEF,cAAe,sEACf,UACE,0FACF,aAAc,sDACd,eACE,yEACF,eAAgB,2DAChB,iBACE,kFACF,mBACE,yEACF,4BACE,8EACF,+BACE,+EAEF,4BAA6B,kCAC7B,iCAAkC,iDAClC,0BAA2B,sDAC3B,0BACE,+EACF,2BACE,+DACF,8BACE,8EACF,kCACE,oEACF,8BACE,8DACF,iCACE,2DACF,sCACE,iEACF,uCACE,kFACF,4CACE,uEACF,gCACE,iEACF,8BAA+B,kEAC/B,iCACE,8EACF,iCACE,qEACF,6BACE,0EACF,uCACE,mEAEF,sCACE,4DACF,2BAA4B,mBAC5B,8BAA+B,gBAC/B,gCAAiC,gDACjC,wBAAyB,gDAEzB,gDACE,yDACF,qCAAsC,wBACtC,wCAAyC,qBACzC,qCAAsC,qDACtC,6BAA8B,qDAE9B,+BACE,sFACF,+BACE,kEACF,iCACE,uEACF,iCACE,8EACF,qBAAsB,+DACtB,oCACE,uEACF,qBACE,sFACF,qCACE,2EACF,0BAA2B,qCAC3B,uBACE,uFACF,0BACE,2FACF,6BAA8B,mCAC9B,mCACE,k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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59]}