{
  "version": 3,
  "sources": ["../../src/vendors/library/src/engine/consts.ts", "../../src/vendors/library/src/utils/polyfills.ts", "../../src/vendors/library/src/utils/paths.ts", "../../src/vendors/library/src/engine/signals.ts", "../../src/vendors/library/src/utils/dom.ts", "../../src/vendors/library/src/utils/text.ts", "../../src/vendors/library/src/engine/engine.ts", "../../src/vendors/library/src/plugins/actions/peek.ts", "../../src/vendors/library/src/plugins/actions/setAll.ts", "../../src/vendors/library/src/plugins/actions/toggleAll.ts", "../../src/vendors/library/src/plugins/actions/fetch.ts", "../../src/vendors/library/src/plugins/attributes/attr.ts", "../../src/vendors/library/src/plugins/attributes/bind.ts", "../../src/vendors/library/src/plugins/attributes/class.ts", "../../src/vendors/library/src/plugins/attributes/computed.ts", "../../src/vendors/library/src/plugins/attributes/effect.ts", "../../src/vendors/library/src/plugins/attributes/indicator.ts", "../../src/vendors/library/src/utils/tags.ts", "../../src/vendors/library/src/utils/timing.ts", "../../src/vendors/library/src/utils/view-transitions.ts", "../../src/vendors/library/src/plugins/attributes/init.ts", "../../src/vendors/library/src/plugins/attributes/jsonSignals.ts", "../../src/vendors/library/src/plugins/attributes/on.ts", "../../src/vendors/library/src/utils/math.ts", "../../src/vendors/library/src/plugins/attributes/onIntersect.ts", "../../src/vendors/library/src/plugins/attributes/onInterval.ts", "../../src/vendors/library/src/plugins/attributes/onSignalPatch.ts", "../../src/vendors/library/src/plugins/attributes/ref.ts", "../../src/vendors/library/src/plugins/attributes/show.ts", "../../src/vendors/library/src/plugins/attributes/signals.ts", "../../src/vendors/library/src/plugins/attributes/style.ts", "../../src/vendors/library/src/plugins/attributes/text.ts", "../../src/vendors/library/src/plugins/watchers/patchElements.ts", "../../src/vendors/library/src/plugins/watchers/patchSignals.ts", "../../src/vendors/basecoat/basecoat.js", "../../src/vendors/basecoat/dropdown-menu.js", "../../src/vendors/basecoat/command.js", "../../src/vendors/basecoat/select.js", "../../src/vendors/basecoat/tabs.js", "../../src/vendors/mujs/mu.js", "../../src/js/charts.js", "../../src/js/budget-autoselect.js", "../../src/js/batch-select.js", "../../src/js/widgets/tags-input.js", "../../src/js/widgets/multi-select-search.js", "../../src/js/widgets/index.js", "../../src/js/accordion.js", "../../src/vendors/driver/driver.js", "../../src/js/tour.js", "../../src/js/app.js"],
  "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\nexport const DATASTAR_SIGNAL_PATCH_EVENT = 'datastar-signal-patch'\n", "export const hasOwn: (obj: object, prop: PropertyKey) => boolean =\n  // @ts-expect-error\n  Object.hasOwn ?? Object.prototype.hasOwnProperty.call\n", "import type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\n\nexport const isPojo = (obj: any): obj is Record<string, any> =>\n  obj !== null &&\n  typeof obj === 'object' &&\n  (Object.getPrototypeOf(obj) === Object.prototype ||\n    Object.getPrototypeOf(obj) === null)\n\nexport const isEmpty = (obj: Record<string, any>): boolean => {\n  for (const prop in obj) {\n    if (hasOwn(obj, prop)) {\n      return false\n    }\n  }\n  return true\n}\n\nexport const updateLeaves = (\n  obj: Record<string, any>,\n  fn: (oldValue: any) => any,\n) => {\n  for (const key in obj) {\n    const val = obj[key]\n    if (isPojo(val) || Array.isArray(val)) {\n      updateLeaves(val, fn)\n    } else {\n      obj[key] = fn(val)\n    }\n  }\n}\n\nexport const pathToObj = (paths: Paths): Record<string, any> => {\n  const result: Record<string, any> = {}\n  for (const [path, value] of paths) {\n    const keys = path.split('.')\n    const lastKey = keys.pop()!\n    const obj = keys.reduce((acc, key) => (acc[key] ??= {}), result)\n    obj[lastKey] = value\n  }\n  return result\n}\n", "import { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport type {\n  Computed,\n  Effect,\n  JSONPatch,\n  MergePatchArgs,\n  Paths,\n  Signal,\n  SignalFilterOptions,\n} from '@engine/types'\nimport { isPojo, pathToObj } from '@utils/paths'\nimport { hasOwn } from '@utils/polyfills'\n\ninterface ReactiveNode {\n  deps_?: Link\n  depsTail_?: Link\n  subs_?: Link\n  subsTail_?: Link\n  flags_: ReactiveFlags\n}\n\ninterface Link {\n  version_: number\n  dep_: ReactiveNode\n  sub_: ReactiveNode\n  prevSub_?: Link\n  nextSub_?: Link\n  prevDep_?: Link\n  nextDep_?: Link\n}\n\ninterface Stack<T> {\n  value_: T\n  prev_?: Stack<T>\n}\n\nenum ReactiveFlags {\n  None = 0,\n  Mutable = 1 << 0,\n  Watching = 1 << 1,\n  RecursedCheck = 1 << 2,\n  Recursed = 1 << 3,\n  Dirty = 1 << 4,\n  Pending = 1 << 5,\n}\n\nenum EffectFlags {\n  Queued = 1 << 6,\n}\n\ninterface AlienEffect extends ReactiveNode {\n  fn_(): void\n}\n\ninterface AlienComputed<T = unknown> extends ReactiveNode {\n  value_?: T\n  getter(previousValue?: T): T\n}\n\ninterface AlienSignal<T = unknown> extends ReactiveNode {\n  previousValue: T\n  value_: T\n}\n\nconst currentPatch: Paths = []\nconst queuedEffects: (AlienEffect | undefined)[] = []\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet prevSub: ReactiveNode | undefined\nlet activeSub: ReactiveNode | undefined\nlet version = 0\n\nexport const beginBatch = (): void => {\n  batchDepth++\n}\n\nexport const endBatch = (): void => {\n  if (!--batchDepth) {\n    flush()\n    dispatch()\n  }\n}\n\nexport const startPeeking = (sub?: ReactiveNode): void => {\n  prevSub = activeSub\n  activeSub = sub\n}\n\nexport const stopPeeking = (): void => {\n  activeSub = prevSub\n  prevSub = undefined\n}\n\nexport const signal = <T>(initialValue?: T): Signal<T> => {\n  return signalOper.bind(0, {\n    previousValue: initialValue,\n    value_: initialValue,\n    flags_: 1 satisfies ReactiveFlags.Mutable,\n  }) as Signal<T>\n}\n\nconst computedSymbol = Symbol('computed')\nexport const computed = <T>(getter: (previousValue?: T) => T): Computed<T> => {\n  const c = computedOper.bind(0, {\n    flags_: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\n    getter,\n  }) as Computed<T>\n  // @ts-expect-error\n  c[computedSymbol] = 1\n  return c\n}\n\nexport const effect = (fn: () => void): Effect => {\n  const e: AlienEffect = {\n    fn_: fn,\n    flags_: 2 satisfies ReactiveFlags.Watching,\n  }\n  if (activeSub) {\n    link(e, activeSub)\n  }\n  startPeeking(e)\n  beginBatch()\n  try {\n    e.fn_()\n  } finally {\n    endBatch()\n    stopPeeking()\n  }\n  return effectOper.bind(0, e)\n}\n\nconst flush = () => {\n  while (notifyIndex < queuedEffectsLength) {\n    const effect = queuedEffects[notifyIndex]!\n    queuedEffects[notifyIndex++] = undefined\n    run(effect, (effect.flags_ &= ~EffectFlags.Queued))\n  }\n  notifyIndex = 0\n  queuedEffectsLength = 0\n}\n\nconst update = (signal: AlienSignal | AlienComputed): boolean => {\n  if ('getter' in signal) {\n    return updateComputed(signal)\n  }\n  return updateSignal(signal, signal.value_)\n}\n\nconst updateComputed = (c: AlienComputed): boolean => {\n  startPeeking(c)\n  startTracking(c)\n  try {\n    const oldValue = c.value_\n    return oldValue !== (c.value_ = c.getter(oldValue))\n  } finally {\n    stopPeeking()\n    endTracking(c)\n  }\n}\n\nconst updateSignal = <T>(s: AlienSignal<T>, value: T): boolean => {\n  s.flags_ = 1 satisfies ReactiveFlags.Mutable\n  return s.previousValue !== (s.previousValue = value)\n}\n\nconst notify = (e: AlienEffect): void => {\n  const flags = e.flags_\n  if (!(flags & EffectFlags.Queued)) {\n    e.flags_ = flags | EffectFlags.Queued\n    const subs = e.subs_\n    if (subs) {\n      notify(subs.sub_ as AlienEffect)\n    } else {\n      queuedEffects[queuedEffectsLength++] = e\n    }\n  }\n}\n\nconst run = (e: AlienEffect, flags: ReactiveFlags): void => {\n  if (\n    flags & (16 satisfies ReactiveFlags.Dirty) ||\n    (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps_!, e))\n  ) {\n    startPeeking(e)\n    startTracking(e)\n    beginBatch()\n    try {\n      e.fn_()\n    } finally {\n      endBatch()\n      stopPeeking()\n      endTracking(e)\n    }\n    return\n  }\n  if (flags & (32 satisfies ReactiveFlags.Pending)) {\n    e.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n  }\n  let link = e.deps_\n  while (link) {\n    const dep = link.dep_\n    const depFlags = dep.flags_\n    if (depFlags & EffectFlags.Queued) {\n      run(dep as AlienEffect, (dep.flags_ = depFlags & ~EffectFlags.Queued))\n    }\n    link = link.nextDep_\n  }\n}\n\nconst signalOper = <T>(s: AlienSignal<T>, ...value: [T]): T | boolean => {\n  if (value.length) {\n    if (s.value_ !== (s.value_ = value[0])) {\n      s.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n      const subs = s.subs_\n      if (subs) {\n        propagate(subs)\n        if (!batchDepth) {\n          flush()\n        }\n      }\n      return true\n    }\n    return false\n  }\n  const currentValue = s.value_\n  if (s.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n    if (updateSignal(s, currentValue)) {\n      const subs_ = s.subs_\n      if (subs_) {\n        shallowPropagate(subs_)\n      }\n    }\n  }\n  if (activeSub) {\n    link(s, activeSub)\n  }\n  return currentValue\n}\n\nconst computedOper = <T>(c: AlienComputed<T>): T => {\n  const flags = c.flags_\n  if (\n    flags & (16 satisfies ReactiveFlags.Dirty) ||\n    (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(c.deps_!, c))\n  ) {\n    if (updateComputed(c)) {\n      const subs = c.subs_\n      if (subs) {\n        shallowPropagate(subs)\n      }\n    }\n  } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n    c.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n  }\n  if (activeSub) {\n    link(c, activeSub)\n  }\n  return c.value_!\n}\n\nconst effectOper = (e: AlienEffect): void => {\n  let dep = e.deps_\n  while (dep) {\n    dep = unlink(dep, e)\n  }\n  const sub = e.subs_\n  if (sub) {\n    unlink(sub)\n  }\n  e.flags_ = 0 satisfies ReactiveFlags.None\n}\n\nconst link = (dep: ReactiveNode, sub: ReactiveNode): void => {\n  const prevDep = sub.depsTail_\n  if (prevDep && prevDep.dep_ === dep) {\n    return\n  }\n  const nextDep = prevDep ? prevDep.nextDep_ : sub.deps_\n  if (nextDep && nextDep.dep_ === dep) {\n    nextDep.version_ = version\n    sub.depsTail_ = nextDep\n    return\n  }\n  const prevSub = dep.subsTail_\n  if (prevSub && prevSub.version_ === version && prevSub.sub_ === sub) {\n    return\n  }\n  const newLink =\n    (sub.depsTail_ =\n    dep.subsTail_ =\n      {\n        version_: version,\n        dep_: dep,\n        sub_: sub,\n        prevDep_: prevDep,\n        nextDep_: nextDep,\n        prevSub_: prevSub,\n      })\n  if (nextDep) {\n    nextDep.prevDep_ = newLink\n  }\n  if (prevDep) {\n    prevDep.nextDep_ = newLink\n  } else {\n    sub.deps_ = newLink\n  }\n  if (prevSub) {\n    prevSub.nextSub_ = newLink\n  } else {\n    dep.subs_ = newLink\n  }\n}\n\nconst unlink = (link: Link, sub = link.sub_): Link | undefined => {\n  const dep_ = link.dep_\n  const prevDep_ = link.prevDep_\n  const nextDep_ = link.nextDep_\n  const nextSub_ = link.nextSub_\n  const prevSub_ = link.prevSub_\n  if (nextDep_) {\n    nextDep_.prevDep_ = prevDep_\n  } else {\n    sub.depsTail_ = prevDep_\n  }\n  if (prevDep_) {\n    prevDep_.nextDep_ = nextDep_\n  } else {\n    sub.deps_ = nextDep_\n  }\n  if (nextSub_) {\n    nextSub_.prevSub_ = prevSub_\n  } else {\n    dep_.subsTail_ = prevSub_\n  }\n  if (prevSub_) {\n    prevSub_.nextSub_ = nextSub_\n  } else if (!(dep_.subs_ = nextSub_)) {\n    if ('getter' in dep_) {\n      let toRemove = dep_.deps_\n      if (toRemove) {\n        dep_.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n        do {\n          toRemove = unlink(toRemove, dep_)\n        } while (toRemove)\n      }\n    } else if (!('previousValue' in dep_)) {\n      effectOper(dep_ as AlienEffect)\n    }\n  }\n  return nextDep_\n}\n\nconst propagate = (link: Link): void => {\n  let next = link.nextSub_\n  let stack: Stack<Link | undefined> | undefined\n\n  top: while (true) {\n    const sub = link.sub_\n\n    let flags = sub.flags_\n\n    if (\n      !(\n        flags &\n        (60 as\n          | ReactiveFlags.RecursedCheck\n          | ReactiveFlags.Recursed\n          | ReactiveFlags.Dirty\n          | ReactiveFlags.Pending)\n      )\n    ) {\n      sub.flags_ = flags | (32 satisfies ReactiveFlags.Pending)\n    } else if (\n      !(flags & (12 as ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n    ) {\n      flags = 0 satisfies ReactiveFlags.None\n    } else if (!(flags & (4 satisfies ReactiveFlags.RecursedCheck))) {\n      sub.flags_ =\n        (flags & ~(8 satisfies ReactiveFlags.Recursed)) |\n        (32 satisfies ReactiveFlags.Pending)\n    } else if (\n      !(flags & (48 as ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n      isValidLink(link, sub)\n    ) {\n      sub.flags_ =\n        flags | (40 as ReactiveFlags.Recursed | ReactiveFlags.Pending)\n      flags &= 1 satisfies ReactiveFlags.Mutable\n    } else {\n      flags = 0 satisfies ReactiveFlags.None\n    }\n\n    if (flags & (2 satisfies ReactiveFlags.Watching)) {\n      notify(sub as AlienEffect)\n    }\n\n    if (flags & (1 satisfies ReactiveFlags.Mutable)) {\n      const subSubs = sub.subs_\n      if (subSubs) {\n        const nextSub = (link = subSubs).nextSub_\n        if (nextSub) {\n          stack = { value_: next, prev_: stack }\n          next = nextSub\n        }\n        continue\n      }\n    }\n\n    if ((link = next!)) {\n      next = link.nextSub_\n      continue\n    }\n\n    while (stack) {\n      link = stack.value_!\n      stack = stack.prev_\n      if (link) {\n        next = link.nextSub_\n        continue top\n      }\n    }\n\n    break\n  }\n}\n\nconst startTracking = (sub: ReactiveNode): void => {\n  version++\n  sub.depsTail_ = undefined\n  sub.flags_ =\n    (sub.flags_ &\n      ~(56 as\n        | ReactiveFlags.Recursed\n        | ReactiveFlags.Dirty\n        | ReactiveFlags.Pending)) |\n    (4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst endTracking = (sub: ReactiveNode): void => {\n  const depsTail_ = sub.depsTail_\n  let toRemove = depsTail_ ? depsTail_.nextDep_ : sub.deps_\n  while (toRemove) {\n    toRemove = unlink(toRemove, sub)\n  }\n  sub.flags_ &= ~(4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst checkDirty = (link: Link, sub: ReactiveNode): boolean => {\n  let stack: Stack<Link> | undefined\n  let checkDepth = 0\n  let dirty = false\n\n  top: while (true) {\n    const dep = link.dep_\n    const flags = dep.flags_\n\n    if (sub.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n      dirty = true\n    } else if (\n      (flags & (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n      (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n    ) {\n      if (update(dep as AlienSignal | AlienComputed)) {\n        const subs = dep.subs_!\n        if (subs.nextSub_) {\n          shallowPropagate(subs)\n        }\n        dirty = true\n      }\n    } else if (\n      (flags & (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n      (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)\n    ) {\n      if (link.nextSub_ || link.prevSub_) {\n        stack = { value_: link, prev_: stack }\n      }\n      link = dep.deps_!\n      sub = dep\n      ++checkDepth\n      continue\n    }\n\n    if (!dirty) {\n      const nextDep = link.nextDep_\n      if (nextDep) {\n        link = nextDep\n        continue\n      }\n    }\n\n    while (checkDepth--) {\n      const firstSub = sub.subs_!\n      const hasMultipleSubs = firstSub.nextSub_\n      if (hasMultipleSubs) {\n        link = stack!.value_\n        stack = stack!.prev_\n      } else {\n        link = firstSub\n      }\n      if (dirty) {\n        if (update(sub as AlienSignal | AlienComputed)) {\n          if (hasMultipleSubs) {\n            shallowPropagate(firstSub)\n          }\n          sub = link.sub_\n          continue\n        }\n        dirty = false\n      } else {\n        sub.flags_ &= ~(32 satisfies ReactiveFlags.Pending)\n      }\n      sub = link.sub_\n      if (link.nextDep_) {\n        link = link.nextDep_\n        continue top\n      }\n    }\n\n    return dirty\n  }\n}\n\nconst shallowPropagate = (link: Link): void => {\n  do {\n    const sub = link.sub_\n    const flags = sub.flags_\n    if (\n      (flags & (48 as ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n      (32 satisfies ReactiveFlags.Pending)\n    ) {\n      sub.flags_ = flags | (16 satisfies ReactiveFlags.Dirty)\n      if (flags & (2 satisfies ReactiveFlags.Watching)) {\n        notify(sub as AlienEffect)\n      }\n    }\n  } while ((link = link.nextSub_!))\n}\n\nconst isValidLink = (checkLink: Link, sub: ReactiveNode): boolean => {\n  let link = sub.depsTail_\n  while (link) {\n    if (link === checkLink) {\n      return true\n    }\n    link = link.prevDep_\n  }\n  return false\n}\n\nexport const getPath = <T = any>(path: string): T | undefined => {\n  let result = root\n  const split = path.split('.')\n  for (const path of split) {\n    if (result == null || !hasOwn(result, path)) {\n      return\n    }\n    result = result[path]\n  }\n  return result as T\n}\n\nconst deep = (value: any, prefix = ''): any => {\n  const isArr = Array.isArray(value)\n  if (isArr || isPojo(value)) {\n    const deepObj = (isArr ? [] : {}) as Record<string, Signal<any>>\n    for (const key in value) {\n      deepObj[key] = signal(\n        deep((value as Record<string, Signal<any>>)[key], `${prefix + key}.`),\n      )\n    }\n    const keys = signal(0)\n    return new Proxy(deepObj, {\n      get(_, prop: string) {\n        // JSON.stringify calls `.toJSON()` directly instead of checking if it exists on the object\n        // so we have to check if `toJSON` is being called and prevent a signal from automatically\n        // being made so JSON.stringify can fallback to the default stringify\n        if (!(prop === 'toJSON' && !hasOwn(deepObj, prop))) {\n          // special case for when prop is an array function because every array function needs to\n          // be reactive to when the keys change\n          if (isArr && prop in Array.prototype) {\n            keys()\n            return deepObj[prop]\n          }\n          // if prop is a symbol just return the symbol because we don't want to make up that theres\n          // an iterator symbol on an object or not\n          if (typeof prop === 'symbol') {\n            return deepObj[prop]\n          }\n          // if obj doesnt have prop OR prop is null or undefined then create a signal and default\n          // to an empty string\n          if (!hasOwn(deepObj, prop) || deepObj[prop]() == null) {\n            deepObj[prop] = signal('')\n            dispatch(prefix + prop, '')\n            keys(keys() + 1)\n          }\n          return deepObj[prop]()\n        }\n      },\n      set(_, prop: string, newValue) {\n        const path = prefix + prop\n        // special case for when setting length so we can make a diff patch\n        if (isArr && prop === 'length') {\n          const diff = (deepObj[prop] as unknown as number) - newValue\n          deepObj[prop] = newValue\n          // manually make a diff patch for now, shouldnt have to do this when object diffing is\n          // implemented. see https://github.com/starfederation/datastar-dev/issues/274\n          if (diff > 0) {\n            const patch: Record<string, any> = {}\n            for (let i = newValue; i < deepObj[prop]; i++) {\n              patch[i] = null\n            }\n            dispatch(prefix.slice(0, -1), patch)\n            keys(keys() + 1)\n          }\n        } else if (hasOwn(deepObj, prop)) {\n          if (newValue == null) {\n            delete deepObj[prop]\n            // if newValue is a computed set the computed directly instead of wrapping in signal\n          } else if (hasOwn(newValue, computedSymbol)) {\n            deepObj[prop] = newValue\n            dispatch(path, '')\n            // if prop changed after setting it then dispatch\n          } else {\n            const currentValue = deepObj[prop]()\n            const pathStr = `${path}.`\n            if (isPojo(currentValue) && isPojo(newValue)) {\n              for (const key in currentValue) {\n                if (!hasOwn(newValue, key)) {\n                  delete currentValue[key]\n                  dispatch(pathStr + key, null)\n                }\n              }\n              for (const key in newValue) {\n                const nextVal = newValue[key]\n                if (currentValue[key] !== nextVal) {\n                  currentValue[key] = nextVal\n                }\n              }\n            } else if (deepObj[prop](deep(newValue, pathStr))) {\n              dispatch(path, newValue)\n            }\n          }\n          // if newValue is null or undefined then noop\n        } else if (newValue != null) {\n          // if newValue is a computed set the computed directly instead of wrapping in signal\n          if (hasOwn(newValue, computedSymbol)) {\n            deepObj[prop] = newValue\n            dispatch(path, '')\n          } else {\n            deepObj[prop] = signal(deep(newValue, `${path}.`))\n            dispatch(path, newValue)\n          }\n          keys(keys() + 1)\n        }\n\n        return true\n      },\n      deleteProperty(_, prop: string) {\n        delete deepObj[prop]\n        keys(keys() + 1)\n        return true\n      },\n      ownKeys() {\n        keys()\n        return Reflect.ownKeys(deepObj)\n      },\n      has(_, prop) {\n        keys()\n        return prop in deepObj\n      },\n    })\n  }\n  return value\n}\n\nconst dispatch = (path?: string, value?: any) => {\n  if (path !== undefined && value !== undefined) {\n    currentPatch.push([path, value])\n  }\n  if (!batchDepth && currentPatch.length) {\n    const detail = pathToObj(currentPatch)\n    currentPatch.length = 0\n    document.dispatchEvent(\n      new CustomEvent<JSONPatch>(DATASTAR_SIGNAL_PATCH_EVENT, {\n        detail,\n      }),\n    )\n  }\n}\n\nexport const mergePatch = (\n  patch: JSONPatch,\n  { ifMissing }: MergePatchArgs = {},\n): void => {\n  beginBatch()\n  for (const key in patch) {\n    if (patch[key] == null) {\n      if (!ifMissing) {\n        delete root[key]\n      }\n    } else {\n      mergeInner(patch[key], key, root, '', ifMissing)\n    }\n  }\n  endBatch()\n}\n\nexport const mergePaths = (paths: Paths, options?: MergePatchArgs): void =>\n  mergePatch(pathToObj(paths), options)\n\nconst mergeInner = (\n  patch: any,\n  target: string,\n  targetParent: Record<string, any>,\n  prefix: string,\n  ifMissing: boolean | undefined,\n): void => {\n  if (isPojo(patch)) {\n    if (\n      !(\n        hasOwn(targetParent, target) &&\n        (isPojo(targetParent[target]) || Array.isArray(targetParent[target]))\n      )\n    ) {\n      targetParent[target] = {}\n    }\n\n    for (const key in patch) {\n      if (patch[key] == null) {\n        if (!ifMissing) {\n          delete targetParent[target][key]\n        }\n      } else {\n        mergeInner(\n          patch[key],\n          key,\n          targetParent[target],\n          `${prefix + target}.`,\n          ifMissing,\n        )\n      }\n    }\n  } else if (!(ifMissing && hasOwn(targetParent, target))) {\n    targetParent[target] = patch\n  }\n}\n\nconst toRegExp = (val: string | RegExp): RegExp =>\n  typeof val === 'string' ? RegExp(val.replace(/^\\/|\\/$/g, '')) : val\n\n/**\n * Filters the root store based on an include and exclude RegExp\n *\n * @returns The filtered object\n */\nexport const filtered = (\n  { include = /.*/, exclude = /(?!)/ }: SignalFilterOptions = {},\n  obj: JSONPatch = root,\n): Record<string, any> => {\n  const includeRe = toRegExp(include)\n  const excludeRe = toRegExp(exclude)\n  const paths: Paths = []\n  const stack: [any, string][] = [[obj, '']]\n\n  while (stack.length) {\n    const [node, prefix] = stack.pop()!\n\n    for (const key in node) {\n      const path = prefix + key\n      if (isPojo(node[key])) {\n        stack.push([node[key], `${path}.`])\n      } else if (includeRe.test(path) && !excludeRe.test(path)) {\n        paths.push([path, getPath(path)])\n      }\n    }\n  }\n\n  return pathToObj(paths)\n}\n\nexport const root: Record<string, any> = deep({})\n", "import type { HTMLOrSVG } from '@engine/types'\n\nexport const isHTMLOrSVG = (el: Node): el is HTMLOrSVG =>\n  el instanceof HTMLElement ||\n  el instanceof SVGElement ||\n  el instanceof MathMLElement\n", "import type { Modifiers } from '@engine/types'\n\nexport const kebab = (str: string): string =>\n  str\n    .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n    .replace(/([a-z])([0-9]+)/gi, '$1-$2')\n    .replace(/([0-9]+)([a-z])/gi, '$1-$2')\n    .replace(/[\\s_]+/g, '-') // Replace whitespace and underscores with hyphens\n    .toLowerCase()\n\nexport const camel = (str: string): string =>\n  kebab(str).replace(/-./g, (x) => x[1].toUpperCase())\n\nexport const snake = (str: string): string => kebab(str).replace(/-/g, '_')\n\nexport const pascal = (str: string): string =>\n  camel(str).replace(/(^.|(?<=\\.).)/g, (x) => x[0].toUpperCase())\n\nexport const title = (str: string): string =>\n  str.replace(/\\b\\w/g, (char) => char.toUpperCase())\n\nexport const jsStrToObject = (raw: string) => {\n  try {\n    return JSON.parse(raw)\n  } catch {\n    // If JSON parsing fails, try to evaluate as a JavaScript object\n    // This is less safe and should be used with caution\n    return Function(`return (${raw})`)()\n  }\n}\n\nconst caseFns: Record<string, (s: string) => string> = {\n  camel: (str) => str.replace(/-[a-z]/g, (x) => x[1].toUpperCase()),\n  snake: (str) => str.replace(/-/g, '_'),\n  pascal: (str) => str[0].toUpperCase() + caseFns.camel(str.slice(1)),\n}\n\nexport const modifyCasing = (\n  str: string,\n  mods: Modifiers,\n  defaultCase = 'camel',\n): string => {\n  for (const c of mods.get('case') || [defaultCase]) {\n    str = caseFns[c]?.(str) || str\n  }\n  return str\n}\n\nexport const aliasify = (name: string) =>\n  ALIAS ? `data-${ALIAS}-${name}` : `data-${name}`\n", "import { DATASTAR_FETCH_EVENT, DSP, DSS } from '@engine/consts'\nimport { root } from '@engine/signals'\nimport type {\n  ActionContext,\n  ActionPlugin,\n  AttributeContext,\n  AttributePlugin,\n  DatastarFetchEvent,\n  HTMLOrSVG,\n  Modifiers,\n  Requirement,\n  WatcherPlugin,\n} from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify, snake } from '@utils/text'\n\nconst url = 'https://data-star.dev/errors'\n\nconst error = (\n  ctx: Record<string, any>,\n  reason: string,\n  metadata: Record<string, any> = {},\n) => {\n  Object.assign(metadata, ctx)\n  const e = new Error()\n  const r = snake(reason)\n  const q = new URLSearchParams({\n    metadata: JSON.stringify(metadata),\n  }).toString()\n  const c = JSON.stringify(metadata, null, 2)\n  e.message = `${reason}\\nMore info: ${url}/${r}?${q}\\nContext: ${c}`\n  return e\n}\n\nconst actionPlugins: Map<string, ActionPlugin> = new Map()\nconst attributePlugins: Map<string, AttributePlugin> = new Map()\nconst watcherPlugins: Map<string, WatcherPlugin> = new Map()\n\nexport const actions: Record<\n  string,\n  (ctx: ActionContext, ...args: any[]) => any\n> = new Proxy(\n  {},\n  {\n    get: (_, prop: string) => actionPlugins.get(prop)?.apply,\n    has: (_, prop: string) => actionPlugins.has(prop),\n    ownKeys: () => Reflect.ownKeys(actionPlugins),\n    set: () => false,\n    deleteProperty: () => false,\n  },\n)\n\n// Map of cleanups keyed by element, attribute name, and cleanup name\nconst removals = new Map<HTMLOrSVG, Map<string, Map<string, () => void>>>()\n\nconst queuedAttributes: AttributePlugin[] = []\nconst queuedAttributeNames = new Set<string>()\nconst observedRoots = new WeakSet<Node>()\nexport const attribute = <R extends Requirement, B extends boolean>(\n  plugin: AttributePlugin<R, B>,\n): void => {\n  queuedAttributes.push(plugin as unknown as AttributePlugin)\n\n  if (queuedAttributes.length === 1) {\n    setTimeout(() => {\n      for (const attribute of queuedAttributes) {\n        queuedAttributeNames.add(attribute.name)\n        attributePlugins.set(attribute.name, attribute)\n      }\n      queuedAttributes.length = 0\n      apply()\n      queuedAttributeNames.clear()\n    })\n  }\n}\n\nexport const action = <T>(plugin: ActionPlugin<T>): void => {\n  actionPlugins.set(plugin.name, plugin)\n}\n\ndocument.addEventListener(DATASTAR_FETCH_EVENT, ((\n  evt: CustomEvent<DatastarFetchEvent>,\n) => {\n  const plugin = watcherPlugins.get(evt.detail.type)\n  if (plugin) {\n    plugin.apply(\n      {\n        error: error.bind(0, {\n          plugin: { type: 'watcher', name: plugin.name },\n          element: {\n            id: (evt.target as Element).id,\n            tag: (evt.target as Element).tagName,\n          },\n        }),\n      },\n      evt.detail.argsRaw,\n    )\n  }\n}) as EventListener)\n\nexport const watcher = (plugin: WatcherPlugin): void => {\n  watcherPlugins.set(plugin.name, plugin)\n}\n\nconst cleanupEls = (els: Iterable<HTMLOrSVG>): void => {\n  for (const el of els) {\n    const elCleanups = removals.get(el)\n    if (elCleanups && removals.delete(el)) {\n      for (const attrCleanups of elCleanups.values()) {\n        for (const cleanup of attrCleanups.values()) {\n          cleanup()\n        }\n      }\n    }\n  }\n}\n\nconst aliasedIgnore = aliasify('ignore')\nconst aliasedIgnoreAttr = `[${aliasedIgnore}]`\nconst shouldIgnore = (el: HTMLOrSVG) =>\n  el.hasAttribute(`${aliasedIgnore}__self`) || !!el.closest(aliasedIgnoreAttr)\n\nconst applyEls = (els: Iterable<HTMLOrSVG>, onlyNew?: boolean): void => {\n  for (const el of els) {\n    if (!shouldIgnore(el)) {\n      for (const key in el.dataset) {\n        applyAttributePlugin(\n          el,\n          key.replace(/[A-Z]/g, '-$&').toLowerCase(),\n          el.dataset[key]!,\n          onlyNew,\n        )\n      }\n    }\n  }\n}\n\nconst observe = (mutations: MutationRecord[]) => {\n  for (const {\n    target,\n    type,\n    attributeName,\n    addedNodes,\n    removedNodes,\n  } of mutations) {\n    if (type === 'childList') {\n      for (const node of removedNodes) {\n        if (isHTMLOrSVG(node)) {\n          cleanupEls([node])\n          cleanupEls(node.querySelectorAll<HTMLOrSVG>('*'))\n        }\n      }\n\n      for (const node of addedNodes) {\n        if (isHTMLOrSVG(node)) {\n          applyEls([node])\n          applyEls(node.querySelectorAll<HTMLOrSVG>('*'))\n        }\n      }\n    } else if (\n      type === 'attributes' &&\n      attributeName!.startsWith('data-') &&\n      isHTMLOrSVG(target) &&\n      !shouldIgnore(target)\n    ) {\n      // skip over 'data-'\n      const key = attributeName!.slice(5)\n      const value = target.getAttribute(attributeName!)\n      if (value === null) {\n        const elCleanups = removals.get(target)\n        if (elCleanups) {\n          const attrCleanups = elCleanups.get(key)\n          if (attrCleanups) {\n            for (const cleanup of attrCleanups.values()) {\n              cleanup()\n            }\n            elCleanups.delete(key)\n          }\n        }\n      } else {\n        applyAttributePlugin(target, key, value)\n      }\n    }\n  }\n}\n\n// TODO: mutation observer per root so applying to web component doesnt overwrite main observer\nconst mutationObserver = new MutationObserver(observe)\n\nexport const parseAttributeKey = (\n  rawKey: string,\n): {\n  pluginName: string\n  key: string | undefined\n  mods: Modifiers\n} => {\n  const [namePart, ...rawModifiers] = rawKey.split('__')\n  const [pluginName, key] = namePart.split(/:(.+)/)\n  const mods: Modifiers = new Map()\n\n  for (const rawMod of rawModifiers) {\n    const [label, ...mod] = rawMod.split('.')\n    mods.set(label, new Set(mod))\n  }\n\n  return { pluginName, key, mods }\n}\n\nexport const isDocumentObserverActive = () =>\n  observedRoots.has(document.documentElement)\n\nexport const apply = (\n  root: HTMLOrSVG | ShadowRoot = document.documentElement,\n  observeRoot = true,\n): void => {\n  if (isHTMLOrSVG(root)) {\n    applyEls([root], true)\n  }\n  applyEls(root.querySelectorAll<HTMLOrSVG>('*'), true)\n\n  if (observeRoot) {\n    mutationObserver.observe(root, {\n      subtree: true,\n      childList: true,\n      attributes: true,\n    })\n    observedRoots.add(root)\n  }\n}\n\nconst applyAttributePlugin = (\n  el: HTMLOrSVG,\n  attrKey: string,\n  value: string,\n  onlyNew?: boolean,\n): void => {\n  if (!ALIAS || attrKey.startsWith(`${ALIAS}-`)) {\n    const rawKey = ALIAS ? attrKey.slice(ALIAS.length + 1) : attrKey\n    const { pluginName, key, mods } = parseAttributeKey(rawKey)\n    const plugin = attributePlugins.get(pluginName)\n    if ((!onlyNew || queuedAttributeNames.has(pluginName)) && plugin) {\n      const ctx = {\n        el,\n        rawKey,\n        mods,\n        error: error.bind(0, {\n          plugin: { type: 'attribute', name: plugin.name },\n          element: { id: el.id, tag: el.tagName },\n          expression: { rawKey, key, value },\n        }),\n        key,\n        value,\n        loadedPluginNames: {\n          actions: new Set(actionPlugins.keys()),\n          attributes: new Set(attributePlugins.keys()),\n        },\n        rx: undefined,\n      } as AttributeContext\n\n      const keyReq =\n        (plugin.requirement &&\n          (typeof plugin.requirement === 'string'\n            ? plugin.requirement\n            : plugin.requirement.key)) ||\n        'allowed'\n      const valueReq =\n        (plugin.requirement &&\n          (typeof plugin.requirement === 'string'\n            ? plugin.requirement\n            : plugin.requirement.value)) ||\n        'allowed'\n\n      const keyProvided = key !== undefined && key !== null && key !== ''\n      const valueProvided =\n        value !== undefined && value !== null && value !== ''\n\n      if (keyProvided) {\n        if (keyReq === 'denied') {\n          throw ctx.error('KeyNotAllowed')\n        }\n      } else if (keyReq === 'must') {\n        throw ctx.error('KeyRequired')\n      }\n\n      if (valueProvided) {\n        if (valueReq === 'denied') {\n          throw ctx.error('ValueNotAllowed')\n        }\n      } else if (valueReq === 'must') {\n        throw ctx.error('ValueRequired')\n      }\n\n      if (keyReq === 'exclusive' || valueReq === 'exclusive') {\n        if (keyProvided && valueProvided) {\n          throw ctx.error('KeyAndValueProvided')\n        }\n        if (!keyProvided && !valueProvided) {\n          throw ctx.error('KeyOrValueRequired')\n        }\n      }\n\n      const cleanups = new Map<string, () => void>()\n      if (valueProvided) {\n        let cachedRx: GenRxFn\n        ctx.rx = (...args: any[]) => {\n          if (!cachedRx) {\n            cachedRx = genRx(value, {\n              returnsValue: plugin.returnsValue,\n              argNames: plugin.argNames,\n              cleanups,\n            })\n          }\n          return cachedRx(el, ...args)\n        }\n      }\n\n      const cleanup = plugin.apply(ctx)\n      if (cleanup) {\n        cleanups.set('attribute', cleanup)\n      }\n\n      let elCleanups = removals.get(el)\n      if (elCleanups) {\n        const attrCleanups = elCleanups.get(rawKey)\n        if (attrCleanups) {\n          for (const oldCleanup of attrCleanups.values()) {\n            oldCleanup()\n          }\n        }\n      } else {\n        elCleanups = new Map()\n        removals.set(el, elCleanups)\n      }\n      elCleanups.set(rawKey, cleanups)\n    }\n  }\n}\n\ntype GenRxOptions = {\n  returnsValue?: boolean\n  argNames?: string[]\n  cleanups?: Map<string, () => void>\n}\n\ntype GenRxFn = <T>(el: HTMLOrSVG, ...args: any[]) => T\n\nconst genRx = (\n  value: string,\n  {\n    returnsValue = false,\n    argNames = [],\n    cleanups = new Map(),\n  }: GenRxOptions = {},\n): GenRxFn => {\n  let expr = ''\n  if (returnsValue) {\n    // This regex allows Datastar expressions to support nested\n    // regex and strings that contain ; without breaking.\n    //\n    // Each of these regex defines a block type we want to match\n    // (importantly we ignore the content within these blocks):\n    //\n    // regex            \\/(\\\\\\/|[^\\/])*\\/\n    // double quotes      \"(\\\\\"|[^\\\"])*\"\n    // single quotes      '(\\\\'|[^'])*'\n    // ticks              `(\\\\`|[^`])*`\n    // iife               \\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;)\\{]*)\\s*\\)\\s*\\(\\s*\\)\n    //\n    // The iife support is (intentionally) limited. It only supports\n    // function and arrow syntax with no arguments, and no nested IIFEs.\n    //\n    // We also want to match the non delimiter part of statements\n    // note we only support ; statement delimiters:\n    //\n    // [^;]\n    //\n    const statementRe =\n      /(\\/(\\\\\\/|[^/])*\\/|\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|\\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;){]*)\\s*\\)\\s*\\(\\s*\\)|[^;])+/gm\n    const statements = value.trim().match(statementRe)\n    if (statements) {\n      const lastIdx = statements.length - 1\n      const last = statements[lastIdx].trim()\n      if (!last.startsWith('return')) {\n        statements[lastIdx] = `return (${last});`\n      }\n      expr = statements.join(';\\n')\n    }\n  } else {\n    expr = value.trim()\n  }\n\n  // Ignore any escaped values\n  const escaped = new Map<string, string>()\n  const escapeRe = RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n  let counter = 0\n  for (const match of expr.matchAll(escapeRe)) {\n    const k = match[1]\n    const v = `__escaped${counter++}`\n    escaped.set(v, k)\n    expr = expr.replace(DSP + k + DSS, v)\n  }\n\n  // Replace signal references with bracket notation\n  // Examples:\n  //   $count          -> $['count']\n  //   $count--        -> $['count']--\n  //   $foo.bar        -> $['foo']['bar']\n  //   $foo-bar        -> $['foo-bar']\n  //   $foo.bar-baz    -> $['foo']['bar-baz']\n  //   $foo-$bar       -> $['foo']-$['bar']\n  //   $arr[$index]    -> $['arr'][$['index']]\n  //   $['foo']        -> $['foo']\n  //   $foo[obj.bar]   -> $['foo'][obj.bar]\n  //   $foo['bar.baz'] -> $['foo']['bar.baz']\n  //   $123            -> $['123']\n  //   $foo.0.name     -> $['foo']['0']['name']\n\n  expr = expr\n    // $['x'] -> $x (normalize existing bracket notation)\n    .replace(/\\$\\['([a-zA-Z_$\\d][\\w$]*)'\\]/g, '$$$1')\n    // $x -> $['x'] (including dots and hyphens)\n    .replace(/\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g, (_, signalName) =>\n      signalName\n        .split('.')\n        .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\n    )\n\n  expr = expr.replaceAll(/@([A-Za-z_$][\\w$]*)\\(/g, '__action(\"$1\",evt,')\n\n  // Replace any escaped values\n  for (const [k, v] of escaped) {\n    expr = expr.replace(k, v)\n  }\n\n  try {\n    const fn = Function('el', '$', '__action', 'evt', ...argNames, expr)\n    return (el: HTMLOrSVG, ...args: any[]) => {\n      const action = (name: string, evt: Event | undefined, ...args: any[]) => {\n        const err = error.bind(0, {\n          plugin: { type: 'action', name },\n          element: { id: el.id, tag: el.tagName },\n          expression: {\n            fnContent: expr,\n            value,\n          },\n        })\n        const fn = actions[name]\n        if (fn) {\n          return fn(\n            {\n              el,\n              evt,\n              error: err,\n              cleanups,\n            },\n            ...args,\n          )\n        }\n        throw err('UndefinedAction')\n      }\n      try {\n        return fn(el, root, action, undefined, ...args)\n      } catch (e: any) {\n        console.error(e)\n        throw error(\n          {\n            element: { id: el.id, tag: el.tagName },\n            expression: {\n              fnContent: expr,\n              value,\n            },\n            error: e.message,\n          },\n          'ExecuteExpression',\n        )\n      }\n    }\n  } catch (e: any) {\n    console.error(e)\n    throw error(\n      {\n        expression: {\n          fnContent: expr,\n          value,\n        },\n        error: e.message,\n      },\n      'GenerateExpression',\n    )\n  }\n}\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { startPeeking, stopPeeking } from '@engine/signals'\n\naction({\n  name: 'peek',\n  apply(_, fn: () => any) {\n    startPeeking()\n    try {\n      return fn()\n    } finally {\n      stopPeeking()\n    }\n  },\n})\n", "// Icon: ion:checkmark-round\n// Slug: Sets the value of all matching signals.\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\n\nimport { action } from '@engine'\nimport {\n  filtered,\n  mergePatch,\n  startPeeking,\n  stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n  name: 'setAll',\n  apply(_, value: any, filter: SignalFilterOptions) {\n    // peek because in an effect you would be subscribing to signals and then setting them which\n    // would cause an infinite loop and why would you want to infinite loop on purpose\n    startPeeking()\n    const masked = filtered(filter)\n    updateLeaves(masked, () => value)\n    mergePatch(masked)\n    stopPeeking()\n  },\n})\n", "// Icon: material-symbols:toggle-off\n// Slug: Toggles the value of all matching signals.\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\n\nimport { action } from '@engine'\nimport {\n  filtered,\n  mergePatch,\n  startPeeking,\n  stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n  name: 'toggleAll',\n  apply(_, filter: SignalFilterOptions) {\n    // peek because in an effect you would be subscribing to signals and then setting them which\n    // would cause an infinite loop and why would you want to infinite loop on purpose\n    startPeeking()\n    const masked = filtered(filter)\n    updateLeaves(masked, (oldValue: any) => !oldValue)\n    mergePatch(masked)\n    stopPeeking()\n  },\n})\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\nimport type {\n  DatastarFetchEvent,\n  HTMLOrSVG,\n  SignalFilterOptions,\n} from '@engine/types'\nimport { kebab } from '@utils/text'\n\nconst createHttpMethod = (\n  name: string,\n  method: string,\n  openWhenHiddenDefault: boolean = true,\n): void =>\n  action({\n    name,\n    apply: async (\n      { el, evt, error, cleanups },\n      url: string,\n      {\n        selector,\n        headers: userHeaders,\n        contentType = 'json',\n        filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\n        openWhenHidden = openWhenHiddenDefault,\n        payload,\n        requestCancellation = 'auto',\n        retry = 'auto',\n        retryInterval = 1_000,\n        retryScaler = 2,\n        retryMaxWaitMs = 30_000,\n        retryMaxCount = 10,\n      }: FetchArgs = {},\n    ) => {\n      const controller =\n        requestCancellation instanceof AbortController\n          ? requestCancellation\n          : new AbortController()\n      if (requestCancellation === 'auto') {\n        cleanups.get(`@${name}`)?.()\n        cleanups.set(`@${name}`, async () => {\n          controller.abort()\n          // wait one tick for FINISHED to fire\n          await Promise.resolve()\n        })\n      }\n\n      let cleanupFn = null\n\n      try {\n        if (!url?.length) {\n          throw error('FetchNoUrlProvided', { action })\n        }\n\n        const initialHeaders: Record<string, any> = {\n          Accept: 'text/event-stream, text/html, application/json',\n          'Datastar-Request': true,\n        }\n        if (contentType === 'json') {\n          initialHeaders['Content-Type'] = 'application/json'\n        }\n        const headers = Object.assign({}, initialHeaders, userHeaders)\n\n        // We ignore the content-type header if using form data\n        // if missing the boundary will be set automatically\n\n        const req: FetchEventSourceInit = {\n          method,\n          headers,\n          openWhenHidden,\n          retry,\n          retryInterval,\n          retryScaler,\n          retryMaxWaitMs,\n          retryMaxCount,\n          signal: controller.signal,\n          onopen: async (response: Response) => {\n            if (response.status >= 400)\n              dispatchFetch(ERROR, el, { status: response.status.toString() })\n          },\n          onmessage: (evt) => {\n            if (!evt.event.startsWith('datastar')) return\n            const type = evt.event\n            const argsRawLines: Record<string, string[]> = {}\n\n            for (const line of evt.data.split('\\n')) {\n              const i = line.indexOf(' ')\n              const k = line.slice(0, i)\n              const v = line.slice(i + 1)\n              ;(argsRawLines[k] ||= []).push(v)\n            }\n\n            const argsRaw = Object.fromEntries(\n              Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\n            )\n\n            dispatchFetch(type, el, argsRaw)\n          },\n          onerror: (error) => {\n            if (isWrongContent(error)) {\n              // don't retry if the content-type is wrong\n              throw error('FetchExpectedTextEventStream', { url })\n            }\n            // do nothing and it will retry\n            if (error) {\n              console.error(error.message)\n              dispatchFetch(RETRYING, el, { message: error.message })\n            }\n          },\n        }\n\n        const urlInstance = new URL(url, document.baseURI)\n        const queryParams = new URLSearchParams(urlInstance.search)\n\n        if (contentType === 'json') {\n          startPeeking()\n          payload =\n            payload !== undefined ? payload : filtered({ include, exclude })\n          stopPeeking()\n          const body = JSON.stringify(payload)\n          if (method === 'GET') {\n            queryParams.set('datastar', body)\n          } else {\n            req.body = body\n          }\n        } else if (contentType === 'form') {\n          const formEl = (\n            selector ? document.querySelector(selector) : el.closest('form')\n          ) as HTMLFormElement\n          if (!formEl) {\n            throw error('FetchFormNotFound', { action, selector })\n          }\n\n          // Validate the form\n          if (!formEl.noValidate && !formEl.checkValidity()) {\n            formEl.reportValidity()\n            return\n          }\n\n          // Collect the form data\n          const formData = new FormData(formEl)\n          let submitter = el as HTMLElement | null\n\n          if (el === formEl && evt instanceof SubmitEvent) {\n            // Get the submitter from the event\n            submitter = evt.submitter\n          } else {\n            // Prevent the form being submitted\n            const preventDefault = (evt: Event) => evt.preventDefault()\n            formEl.addEventListener('submit', preventDefault)\n            cleanupFn = () => {\n              formEl.removeEventListener('submit', preventDefault)\n            }\n          }\n\n          // Append the value of the form submitter if it is a button with a name\n          if (submitter instanceof HTMLButtonElement) {\n            const name = submitter.getAttribute('name')\n            if (name) formData.append(name, submitter.value)\n          }\n\n          const multipart =\n            formEl.getAttribute('enctype') === 'multipart/form-data'\n          // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\n          if (!multipart) {\n            headers['Content-Type'] = 'application/x-www-form-urlencoded'\n          }\n\n          const formParams = new URLSearchParams(formData as any)\n          if (method === 'GET') {\n            for (const [key, value] of formParams) {\n              queryParams.append(key, value)\n            }\n          } else if (multipart) {\n            req.body = formData\n          } else {\n            req.body = formParams\n          }\n        } else {\n          throw error('FetchInvalidContentType', { action, contentType })\n        }\n\n        dispatchFetch(STARTED, el, {})\n        urlInstance.search = queryParams.toString()\n\n        try {\n          await fetchEventSource(urlInstance.toString(), el, req)\n        } catch (e: any) {\n          if (!isWrongContent(e)) {\n            throw error('FetchFailed', { method, url, error: e.message })\n          }\n          // exit gracefully and do nothing if the content-type is wrong\n          // this can happen if the client is sending a request\n          // where no response is expected, and they haven\u2019t\n          // set the content-type to text/event-stream\n        }\n      } finally {\n        dispatchFetch(FINISHED, el, {})\n        cleanupFn?.()\n        cleanups.delete(`@${name}`)\n      }\n    },\n  })\n\ncreateHttpMethod('get', 'GET', false)\ncreateHttpMethod('patch', 'PATCH')\ncreateHttpMethod('post', 'POST')\ncreateHttpMethod('put', 'PUT')\ncreateHttpMethod('delete', 'DELETE')\n\nexport const STARTED = 'started'\nexport const FINISHED = 'finished'\nexport const ERROR = 'error'\nexport const RETRYING = 'retrying'\nexport const RETRIES_FAILED = 'retries-failed'\n\nconst dispatchFetch = (\n  type: string,\n  el: HTMLOrSVG,\n  argsRaw: Record<string, string>,\n) =>\n  document.dispatchEvent(\n    new CustomEvent<DatastarFetchEvent>(DATASTAR_FETCH_EVENT, {\n      detail: { type, el, argsRaw },\n    }),\n  )\n\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\n\ntype ResponseOverrides =\n  | {\n      selector?: string\n      mode?: string\n      namespace?: string\n      useViewTransition?: boolean\n    }\n  | {\n      onlyIfMissing?: boolean\n    }\n\nexport type FetchArgs = {\n  selector?: string\n  headers?: Record<string, string>\n  contentType?: 'json' | 'form'\n  filterSignals?: SignalFilterOptions\n  openWhenHidden?: boolean\n  payload?: any\n  requestCancellation?: 'auto' | 'disabled' | AbortController\n  responseOverrides?: ResponseOverrides\n  retry?: 'auto' | 'error' | 'always' | 'never'\n  retryInterval?: number\n  retryScaler?: number\n  retryMaxWaitMs?: number\n  retryMaxCount?: number\n}\n\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\n\n/**\n * Represents a message sent in an event stream\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\n */\n\ninterface EventSourceMessage {\n  id: string\n  event: string\n  data: string\n  retry?: number\n}\n\n/**\n * Converts a ReadableStream into a callback pattern.\n * @param stream The input ReadableStream.\n * @param onChunk A function that will be called on each new byte chunk in the stream.\n * @returns {Promise<void>} A promise that will be resolved when the stream closes.\n */\nconst getBytes = async (\n  stream: ReadableStream<Uint8Array>,\n  onChunk: (arr: Uint8Array) => void,\n): Promise<void> => {\n  const reader = stream.getReader()\n  let result = await reader.read()\n  while (!result.done) {\n    onChunk(result.value)\n    result = await reader.read()\n  }\n}\n\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\n  let buffer: Uint8Array | undefined\n  let position: number // current read position\n  let fieldLength: number // length of the `field` portion of the line\n  let discardTrailingNewline = false\n\n  // return a function that can process each incoming byte chunk:\n  return (arr: Uint8Array) => {\n    if (!buffer) {\n      buffer = arr\n      position = 0\n      fieldLength = -1\n    } else {\n      // we're still parsing the old line. Append the new bytes into buffer:\n      buffer = concat(buffer, arr)\n    }\n\n    const bufLength = buffer.length\n    let lineStart = 0 // index where the current line starts\n    while (position < bufLength) {\n      if (discardTrailingNewline) {\n        if (buffer[position] === 10) lineStart = ++position // skip to next char\n        discardTrailingNewline = false\n      }\n\n      // start looking forward till the end of line:\n      let lineEnd = -1 // index of the \\r or \\n char\n      for (; position < bufLength && lineEnd === -1; ++position) {\n        switch (buffer[position]) {\n          case 58: // :\n            if (fieldLength === -1) {\n              // first colon in line\n              fieldLength = position - lineStart\n            }\n            break\n          // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\n          // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\n          case 13: // \\r\n            discardTrailingNewline = true\n          case 10: // \\n\n            lineEnd = position\n            break\n        }\n      }\n\n      if (lineEnd === -1) break // Wait for the next arr and then continue parsing\n\n      // we've reached the line end, send it out:\n      onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\n      lineStart = position // we're now on the next line\n      fieldLength = -1\n    }\n\n    if (lineStart === bufLength)\n      buffer = undefined // we've finished reading it\n    else if (lineStart) {\n      // Create a new view into buffer beginning at lineStart so we don't\n      // need to copy over the previous lines when we get the new arr:\n      buffer = buffer.subarray(lineStart)\n      position -= lineStart\n    }\n  }\n}\n\nconst getMessages = (\n  onId: (id: string) => void,\n  onRetry: (retry: number) => void,\n  onMessage?: (msg: EventSourceMessage) => void,\n): ((line: Uint8Array, fieldLength: number) => void) => {\n  let message = newMessage()\n  const decoder = new TextDecoder()\n\n  // return a function that can process each incoming line buffer:\n  return (line, fieldLength) => {\n    if (!line.length) {\n      // empty line denotes end of message. Trigger the callback and start a new message:\n      onMessage?.(message)\n      message = newMessage()\n    } else if (fieldLength > 0) {\n      // exclude comments and lines with no values\n      // line is of format \"<field>:<value>\" or \"<field>: <value>\"\n      // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n      const field = decoder.decode(line.subarray(0, fieldLength))\n      const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\n      const value = decoder.decode(line.subarray(valueOffset))\n\n      switch (field) {\n        case 'data':\n          message.data = message.data ? `${message.data}\\n${value}` : value\n          break\n        case 'event':\n          message.event = value\n          break\n        case 'id':\n          onId((message.id = value))\n          break\n        case 'retry': {\n          const retry = +value\n          if (!Number.isNaN(retry)) {\n            // per spec, ignore non-integers\n            onRetry((message.retry = retry))\n          }\n          break\n        }\n      }\n    }\n  }\n}\n\nconst concat = (a: Uint8Array, b: Uint8Array) => {\n  const res = new Uint8Array(a.length + b.length)\n  res.set(a)\n  res.set(b, a.length)\n  return res\n}\n\nconst newMessage = (): EventSourceMessage => ({\n  // data, event, and id must be initialized to empty strings:\n  // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n  // retry should be initialized to undefined so we return a consistent shape\n  // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\n  data: '',\n  event: '',\n  id: '',\n  retry: undefined,\n})\n\ntype FetchEventSourceInit = RequestInit & {\n  headers?: Record<string, string>\n  onopen?: (response: Response) => Promise<void>\n  onmessage?: (ev: EventSourceMessage) => void\n  onclose?: () => void\n  onerror?: (err: any) => number | null | undefined | void\n  openWhenHidden?: boolean\n  fetch?: typeof fetch\n  retry?: 'auto' | 'error' | 'always' | 'never'\n  retryInterval?: number\n  retryScaler?: number\n  retryMaxWaitMs?: number\n  retryMaxCount?: number\n  responseOverrides?: ResponseOverrides\n}\n\nconst fetchEventSource = (\n  input: RequestInfo,\n  el: HTMLOrSVG,\n  {\n    signal: inputSignal,\n    headers: inputHeaders,\n    onopen: inputOnOpen,\n    onmessage,\n    onclose,\n    onerror,\n    openWhenHidden,\n    fetch: inputFetch,\n    retry = 'auto',\n    retryInterval = 1_000,\n    retryScaler = 2,\n    retryMaxWaitMs = 30_000,\n    retryMaxCount = 10,\n    responseOverrides,\n    ...rest\n  }: FetchEventSourceInit,\n): Promise<void> => {\n  return new Promise<void>((resolve, reject) => {\n    // make a copy of the input headers since we may modify it below:\n    const headers: Record<string, string> = {\n      ...inputHeaders,\n    }\n\n    let curRequestController: AbortController\n    const onVisibilityChange = () => {\n      curRequestController.abort() // close existing request on every visibility change\n      if (!document.hidden) create() // page is now visible again, recreate request.\n    }\n\n    if (!openWhenHidden) {\n      document.addEventListener('visibilitychange', onVisibilityChange)\n    }\n\n    let retryTimer: ReturnType<typeof setTimeout> | undefined\n    const dispose = () => {\n      document.removeEventListener('visibilitychange', onVisibilityChange)\n      clearTimeout(retryTimer)\n      curRequestController.abort()\n    }\n\n    // if the incoming signal aborts, dispose resources and resolve:\n    inputSignal?.addEventListener('abort', () => {\n      dispose()\n      resolve() // don't waste time constructing/logging errors\n    })\n\n    const fetch = inputFetch || window.fetch\n    const onopen = inputOnOpen || (() => {})\n\n    let retries = 0\n    let baseRetryInterval = retryInterval\n    const create = async () => {\n      curRequestController = new AbortController()\n      const curRequestSignal = curRequestController.signal\n      try {\n        const response = await fetch(input, {\n          ...rest,\n          headers,\n          signal: curRequestSignal,\n        })\n\n        await onopen(response)\n\n        const dispatchNonSSE = async (\n          dispatchType: string,\n          response: Response,\n          name: string,\n          responseOverrides?: ResponseOverrides,\n          ...argNames: string[]\n        ) => {\n          const argsRaw: Record<string, string> = {\n            [name]: await response.text(),\n          }\n          for (const n of argNames) {\n            let v = response.headers.get(`datastar-${kebab(n)}`)\n            if (responseOverrides) {\n              const o = (responseOverrides as any)[n]\n              if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\n            }\n            if (v) argsRaw[n] = v\n          }\n\n          dispatchFetch(dispatchType, el, argsRaw)\n          dispose()\n          resolve()\n        }\n\n        const status = response.status\n        const isNoContentStatus = status === 204\n        const isRedirectStatus = status >= 300 && status < 400\n        const isErrorStatus = status >= 400 && status < 600\n\n        if (status !== 200) {\n          onclose?.()\n          if (\n            retry !== 'never' &&\n            !isNoContentStatus &&\n            !isRedirectStatus &&\n            (retry === 'always' || (retry === 'error' && isErrorStatus))\n          ) {\n            clearTimeout(retryTimer)\n            retryTimer = setTimeout(create, retryInterval)\n            return\n          }\n          dispose()\n          resolve()\n          return\n        }\n\n        // on successful connection, reset the retry logic\n        retries = 0\n        retryInterval = baseRetryInterval\n\n        const ct = response.headers.get('Content-Type')\n        if (ct?.includes('text/html')) {\n          return await dispatchNonSSE(\n            'datastar-patch-elements',\n            response,\n            'elements',\n            responseOverrides,\n            'selector',\n            'mode',\n            'namespace',\n            'useViewTransition',\n          )\n        }\n\n        if (ct?.includes('application/json')) {\n          return await dispatchNonSSE(\n            'datastar-patch-signals',\n            response,\n            'signals',\n            responseOverrides,\n            'onlyIfMissing',\n          )\n        }\n\n        if (ct?.includes('text/javascript')) {\n          const script = document.createElement('script')\n          const scriptAttributesHeader = response.headers.get(\n            'datastar-script-attributes',\n          )\n\n          if (scriptAttributesHeader) {\n            for (const [name, value] of Object.entries(\n              JSON.parse(scriptAttributesHeader),\n            )) {\n              script.setAttribute(name, value as string)\n            }\n          }\n          script.textContent = await response.text()\n          document.head.appendChild(script)\n          dispose()\n          return\n        }\n\n        await getBytes(\n          response.body!,\n          getLines(\n            getMessages(\n              (id) => {\n                if (id) {\n                  // signals the id and send it back on the next retry:\n                  headers['last-event-id'] = id\n                } else {\n                  // don't send the last-event-id header anymore:\n                  delete headers['last-event-id']\n                }\n              },\n              (retry) => {\n                baseRetryInterval = retryInterval = retry\n              },\n              onmessage,\n            ),\n          ),\n        )\n\n        onclose?.()\n\n        if (retry === 'always' && !isRedirectStatus) {\n          clearTimeout(retryTimer)\n          retryTimer = setTimeout(create, retryInterval)\n          return\n        }\n\n        dispose()\n        resolve()\n      } catch (err) {\n        if (!curRequestSignal.aborted) {\n          // if we haven\u2019t aborted the request ourselves:\n          try {\n            // check if we need to retry:\n            const interval: any = onerror?.(err) || retryInterval\n            clearTimeout(retryTimer)\n            retryTimer = setTimeout(create, interval)\n            retryInterval = Math.min(\n              retryInterval * retryScaler,\n              retryMaxWaitMs,\n            ) // exponential backoff\n            if (++retries >= retryMaxCount) {\n              dispatchFetch(RETRIES_FAILED, el, {})\n              // we should not retry anymore:\n              dispose()\n              reject('Max retries reached.') // Max retries reached, check your server or network connection\n            } else {\n              console.error(\n                `Datastar failed to reach ${input.toString()} retrying in ${interval}ms.`,\n              )\n            }\n          } catch (innerErr) {\n            // we should not retry anymore:\n            dispose()\n            reject(innerErr)\n          }\n        }\n      }\n    }\n\n    create()\n  })\n}\n", "// Icon: material-symbols:edit-attributes-outline\n// Slug: Syncs the value of an attribute with an expression.\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n  name: 'attr',\n  requirement: { value: 'must' },\n  returnsValue: true,\n  apply({ el, key, rx }) {\n    const syncAttr = (key: string, val: any) => {\n      if (val === '' || val === true) {\n        el.setAttribute(key, '')\n      } else if (val === false || val == null) {\n        el.removeAttribute(key)\n      } else if (typeof val === 'string') {\n        el.setAttribute(key, val)\n      } else {\n        el.setAttribute(key, JSON.stringify(val))\n      }\n    }\n\n    const update = key\n      ? () => {\n          observer.disconnect()\n          const val = rx() as string\n          syncAttr(key, val)\n          observer.observe(el, {\n            attributeFilter: [key],\n          })\n        }\n      : () => {\n          observer.disconnect()\n          const obj = rx() as Record<string, any>\n          const attributeFilter = Object.keys(obj)\n          for (const key of attributeFilter) {\n            syncAttr(key, obj[key])\n          }\n          observer.observe(el, {\n            attributeFilter,\n          })\n        }\n\n    const observer = new MutationObserver(update)\n    const cleanup = effect(update)\n\n    return () => {\n      observer.disconnect()\n      cleanup()\n    }\n  },\n})\n", "// Icon: akar-icons:link-chain\n// Slug: Creates a signal with two-way data binding.\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\n\nimport { attribute } from '@engine'\nimport { effect, getPath, mergePaths } from '@engine/signals'\nimport type { Paths } from '@engine/types'\nimport { aliasify, modifyCasing } from '@utils/text'\n\ntype SignalFile = {\n  name: string\n  contents: string\n  mime: string\n}\n\nconst dataURIRegex = /^data:(?<mime>[^;]+);base64,(?<contents>.*)$/\nconst empty = Symbol('empty')\n\nconst aliasedBind = aliasify('bind')\n\nattribute({\n  name: 'bind',\n  requirement: 'exclusive',\n  apply({ el, key, mods, value, error }) {\n    const signalName = key != null ? modifyCasing(key, mods) : value\n\n    let get = (el: any, type: string) =>\n      type === 'number' ? +el.value : el.value\n\n    let set = (value: any) => {\n      ;(el as HTMLInputElement).value = `${value}`\n    }\n\n    if (el instanceof HTMLInputElement) {\n      switch (el.type) {\n        case 'range':\n        case 'number':\n          get = (el: any, type: string) =>\n            type === 'string' ? el.value : +el.value\n          break\n\n        case 'checkbox':\n          get = (el: HTMLInputElement, type: string) => {\n            if (el.value !== 'on') {\n              if (type === 'boolean') {\n                return el.checked\n              } else {\n                return el.checked ? el.value : ''\n              }\n            } else {\n              if (type === 'string') {\n                return el.checked ? el.value : ''\n              } else {\n                return el.checked\n              }\n            }\n          }\n          set = (value: string | boolean) => {\n            el.checked = typeof value === 'string' ? value === el.value : value\n          }\n          break\n\n        case 'radio':\n          // Set up radio button name attribute if not present\n          if (!el.getAttribute('name')?.length) {\n            el.setAttribute('name', signalName)\n          }\n\n          get = (el: HTMLInputElement, type: string) =>\n            el.checked ? (type === 'number' ? +el.value : el.value) : empty\n          set = (value: string | number) => {\n            el.checked =\n              value === (typeof value === 'number' ? +el.value : el.value)\n          }\n          break\n        case 'file': {\n          const syncSignal = () => {\n            const files = [...(el.files || [])]\n            const signalFiles: SignalFile[] = []\n            Promise.all(\n              files.map(\n                (f) =>\n                  new Promise<void>((resolve) => {\n                    const reader = new FileReader()\n                    reader.onload = () => {\n                      if (typeof reader.result !== 'string') {\n                        throw error('InvalidFileResultType', {\n                          resultType: typeof reader.result,\n                        })\n                      }\n                      const match = reader.result.match(dataURIRegex)\n                      if (!match?.groups) {\n                        throw error('InvalidDataUri', {\n                          result: reader.result,\n                        })\n                      }\n                      signalFiles.push({\n                        name: f.name,\n                        contents: match.groups.contents,\n                        mime: match.groups.mime,\n                      })\n                    }\n                    reader.onloadend = () => resolve()\n                    reader.readAsDataURL(f)\n                  }),\n              ),\n            ).then(() => {\n              mergePaths([[signalName, signalFiles]])\n            })\n          }\n\n          el.addEventListener('change', syncSignal)\n          el.addEventListener('input', syncSignal)\n\n          return () => {\n            el.removeEventListener('change', syncSignal)\n            el.removeEventListener('input', syncSignal)\n          }\n        }\n      }\n    } else if (el instanceof HTMLSelectElement) {\n      if (el.multiple) {\n        const typeMap = new Map<string, string>()\n        get = (el: HTMLSelectElement) =>\n          [...el.selectedOptions].map((option) => {\n            const type = typeMap.get(option.value)\n            return type === 'string' || type == null\n              ? option.value\n              : +option.value\n          })\n\n        set = (value: (string | number)[]) => {\n          for (const option of el.options) {\n            if (value.includes(option.value)) {\n              typeMap.set(option.value, 'string')\n              option.selected = true\n            } else if (value.includes(+option.value)) {\n              typeMap.set(option.value, 'number')\n              option.selected = true\n            } else {\n              option.selected = false\n            }\n          }\n        }\n      }\n    } else if (el instanceof HTMLTextAreaElement) {\n      // default case\n    } else {\n      // web component\n      get = (el: Element) =>\n        'value' in el ? el.value : el.getAttribute('value')\n      set = (value: any) => {\n        if ('value' in el) {\n          el.value = value\n        } else {\n          el.setAttribute('value', value)\n        }\n      }\n    }\n\n    const initialValue = getPath(signalName)\n    const type = typeof initialValue\n\n    let path = signalName\n    if (\n      Array.isArray(initialValue) &&\n      !(el instanceof HTMLSelectElement && el.multiple)\n    ) {\n      const signalNameKebab = key ? key : value!\n      const inputs = document.querySelectorAll(\n        `[${aliasedBind}\\\\:${CSS.escape(signalNameKebab)}],[${aliasedBind}=\"${CSS.escape(signalNameKebab)}\"]`,\n      ) as NodeListOf<HTMLInputElement>\n\n      const paths: Paths = []\n      let i = 0\n      for (const input of inputs) {\n        paths.push([`${path}.${i}`, get(input, 'none')])\n\n        if (el === input) {\n          break\n        }\n        i++\n      }\n      mergePaths(paths, { ifMissing: true })\n      path = `${path}.${i}`\n    } else {\n      mergePaths([[path, get(el, type)]], {\n        ifMissing: true,\n      })\n    }\n\n    const syncSignal = () => {\n      const signalValue = getPath(path)\n      if (signalValue != null) {\n        const value = get(el, typeof signalValue)\n        if (value !== empty) {\n          mergePaths([[path, value]])\n        }\n      }\n    }\n\n    el.addEventListener('input', syncSignal)\n    el.addEventListener('change', syncSignal)\n    const cleanup = effect(() => {\n      set(getPath(path))\n    })\n\n    return () => {\n      cleanup()\n      el.removeEventListener('input', syncSignal)\n      el.removeEventListener('change', syncSignal)\n    }\n  },\n})\n", "// Icon: ic:baseline-format-paint\n// Slug: Adds or removes a class based on an expression.\n// Description: Adds or removes a class to or from an element based on an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n  name: 'class',\n  requirement: {\n    value: 'must',\n  },\n  returnsValue: true,\n  apply({ key, el, mods, rx }) {\n    key &&= modifyCasing(key, mods, 'kebab')\n\n    let classes: Record<string, boolean>\n    const callback = () => {\n      observer.disconnect()\n\n      classes = key\n        ? { [key]: rx() as boolean }\n        : (rx() as Record<string, boolean>)\n\n      for (const k in classes) {\n        const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n        if (classes[k]) {\n          for (const name of classNames) {\n            if (!el.classList.contains(name)) {\n              el.classList.add(name)\n            }\n          }\n        } else {\n          for (const name of classNames) {\n            if (el.classList.contains(name)) {\n              el.classList.remove(name)\n            }\n          }\n        }\n      }\n\n      observer.observe(el, { attributeFilter: ['class'] })\n    }\n\n    const observer = new MutationObserver(callback)\n    const cleanup = effect(callback)\n\n    return () => {\n      observer.disconnect()\n      cleanup()\n\n      for (const k in classes) {\n        const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n        for (const name of classNames) {\n          el.classList.remove(name)\n        }\n      }\n    }\n  },\n})\n", "// Icon: streamline-ultimate:wifi-signal-2\n// Slug: Creates a computed signal.\n// Description: Creates a signal that is computed based on an expression.\n\nimport { attribute } from '@engine'\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { updateLeaves } from '@utils/paths'\n\nattribute({\n  name: 'computed',\n  requirement: {\n    value: 'must',\n  },\n  returnsValue: true,\n  apply({ key, mods, rx, error }) {\n    if (key) {\n      mergePaths([[modifyCasing(key, mods), computed(rx)]])\n    } else {\n      const patch = Object.assign({}, rx() as Record<string, () => any>)\n      updateLeaves(patch, (old) => {\n        if (typeof old === 'function') {\n          return computed(old)\n        } else {\n          throw error('ComputedExpectedFunction')\n        }\n      })\n      mergePatch(patch)\n    }\n  },\n})\n", "// Icon: oui:security-signal\n// Slug: Executes an expression when signals change.\n// Description: Executes an expression on page load and whenever any signals in the expression change.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n  name: 'effect',\n  requirement: {\n    key: 'denied',\n    value: 'must',\n  },\n  apply: ({ rx }) => effect(rx),\n})\n", "// Icon: streamline:signal-loading-remix\n// Slug: Creates an indicator for whether an SSE request is in flight.\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { mergePaths } from '@engine/signals'\nimport type { DatastarFetchEvent } from '@engine/types'\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n  name: 'indicator',\n  requirement: 'exclusive',\n  apply({ el, key, mods, value }) {\n    const signalName = key != null ? modifyCasing(key, mods) : value\n\n    mergePaths([[signalName, false]])\n\n    const watcher = ((event: CustomEvent<DatastarFetchEvent>) => {\n      const { type, el: elt } = event.detail\n      if (elt !== el) {\n        return\n      }\n      switch (type) {\n        case STARTED:\n          mergePaths([[signalName, true]])\n          break\n        case FINISHED:\n          mergePaths([[signalName, false]])\n          break\n      }\n    }) as EventListener\n    document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\n    return () => {\n      mergePaths([[signalName, false]])\n      document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\n    }\n  },\n})\n", "export const tagToMs = (args: Set<string>) => {\n  if (!args || args.size <= 0) return 0\n  for (const arg of args) {\n    if (arg.endsWith('ms')) {\n      return +arg.replace('ms', '')\n    }\n    if (arg.endsWith('s')) {\n      return +arg.replace('s', '') * 1000\n    }\n    try {\n      return Number.parseFloat(arg)\n    } catch (_) {}\n  }\n  return 0\n}\n\nexport const tagHas = (\n  tags: Set<string>,\n  tag: string,\n  defaultValue = false,\n) => {\n  if (!tags) return defaultValue\n  return tags.has(tag.toLowerCase())\n}\n\nexport const tagFirst = (tags?: Set<string>, defaultValue = ''): string => {\n  if (tags && tags.size > 0) {\n    for (const tag of tags) {\n      return tag\n    }\n  }\n  return defaultValue\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\nimport { tagHas, tagToMs } from '@utils/tags'\n\nexport const delay = (\n  callback: EventCallbackHandler,\n  wait: number,\n): EventCallbackHandler => {\n  return (...args: any[]) => {\n    setTimeout(() => {\n      callback(...args)\n    }, wait)\n  }\n}\n\nexport const throttle = (\n  callback: EventCallbackHandler,\n  wait: number,\n  leading = true,\n  trailing = false,\n  debounce = false,\n): EventCallbackHandler => {\n  let lastArgs: Parameters<EventCallbackHandler> | null = null\n  let timer = 0\n\n  return (...args: any[]) => {\n    if (leading && !timer) {\n      callback(...args)\n      lastArgs = null\n    } else {\n      lastArgs = args\n    }\n    if (!timer || debounce) {\n      if (timer) {\n        clearTimeout(timer)\n      }\n      timer = setTimeout(() => {\n        if (trailing && lastArgs !== null) {\n          callback(...lastArgs)\n        }\n        lastArgs = null\n        timer = 0\n      }, wait)\n    }\n  }\n}\n\nexport const modifyTiming = (\n  callback: EventCallbackHandler,\n  mods: Modifiers,\n): EventCallbackHandler => {\n  const delayArgs = mods.get('delay')\n  if (delayArgs) {\n    const wait = tagToMs(delayArgs)\n    callback = delay(callback, wait)\n  }\n\n  const debounceArgs = mods.get('debounce')\n  if (debounceArgs) {\n    const wait = tagToMs(debounceArgs)\n    const leading = tagHas(debounceArgs, 'leading', false)\n    const trailing = !tagHas(debounceArgs, 'notrailing', false)\n    callback = throttle(callback, wait, leading, trailing, true)\n  }\n\n  const throttleArgs = mods.get('throttle')\n  if (throttleArgs) {\n    const wait = tagToMs(throttleArgs)\n    const leading = !tagHas(throttleArgs, 'noleading', false)\n    const trailing = tagHas(throttleArgs, 'trailing', false)\n    callback = throttle(callback, wait, leading, trailing)\n  }\n\n  return callback\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\n\nexport const supportsViewTransitions = !!document.startViewTransition\n\nexport const modifyViewTransition = (\n  callback: EventCallbackHandler,\n  mods: Modifiers,\n): EventCallbackHandler => {\n  if (mods.has('viewtransition') && supportsViewTransitions) {\n    const cb = callback // I hate javascript\n    callback = (...args: any[]) =>\n      document.startViewTransition(() => cb(...args))\n  }\n\n  return callback\n}\n", "// Icon: material-symbols:timer-play-outline\n// Slug: Runs an expression when loaded into the DOM.\n// Description: Runs an expression when the element is loaded into the DOM.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagToMs } from '@utils/tags'\nimport { delay } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n  name: 'init',\n  requirement: {\n    key: 'denied',\n    value: 'must',\n  },\n  apply({ rx, mods }) {\n    let callback = () => {\n      beginBatch()\n      rx()\n      endBatch()\n    }\n    callback = modifyViewTransition(callback, mods)\n    let wait = 0\n    const delayArgs = mods.get('delay')\n    if (delayArgs) {\n      wait = tagToMs(delayArgs)\n      if (wait > 0) {\n        callback = delay(callback, wait)\n      }\n    }\n    callback()\n  },\n})\n", "// Icon: si:json-fill\n// Slug: Outputs a JSON stringified version of signals.\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\n\nimport { attribute } from '@engine'\nimport { effect, filtered } from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { jsStrToObject } from '@utils/text'\n\nattribute({\n  name: 'json-signals',\n  requirement: {\n    key: 'denied',\n  },\n  apply({ el, value, mods }) {\n    const spaces = mods.has('terse') ? 0 : 2\n    let filters: SignalFilterOptions = {}\n    if (value) {\n      filters = jsStrToObject(value)\n    }\n\n    const callback = () => {\n      observer.disconnect()\n      el.textContent = JSON.stringify(filtered(filters), null, spaces)\n      observer.observe(el, {\n        childList: true,\n        characterData: true,\n        subtree: true,\n      })\n    }\n    const observer = new MutationObserver(callback)\n    const cleanup = effect(callback)\n\n    return () => {\n      observer.disconnect()\n      cleanup()\n    }\n  },\n})\n", "// Icon: material-symbols:mail\n// Slug: Attaches an event listener to an element.\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\n\nimport { attribute } from '@engine'\nimport {\n  DATASTAR_FETCH_EVENT,\n  DATASTAR_SIGNAL_PATCH_EVENT,\n} from '@engine/consts'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n  name: 'on',\n  requirement: 'must',\n  argNames: ['evt'],\n  apply({ el, key, mods, rx }) {\n    let target: Element | Window | Document = el\n    if (mods.has('window')) target = window\n    let callback = (evt?: Event) => {\n      if (evt) {\n        if (mods.has('prevent')) {\n          evt.preventDefault()\n        }\n        if (mods.has('stop')) {\n          evt.stopPropagation()\n        }\n      }\n      beginBatch()\n      rx(evt)\n      endBatch()\n    }\n    callback = modifyViewTransition(callback, mods)\n    callback = modifyTiming(callback, mods)\n    const evtListOpts: AddEventListenerOptions = {\n      capture: mods.has('capture'),\n      passive: mods.has('passive'),\n      once: mods.has('once'),\n    }\n    if (mods.has('outside')) {\n      target = document\n      const cb = callback\n      callback = (evt?: Event) => {\n        if (!el.contains(evt?.target as HTMLElement)) {\n          cb(evt)\n        }\n      }\n    }\n    const eventName = modifyCasing(key, mods, 'kebab')\n    // Listen for Datastar events on the document\n    if (\n      eventName === DATASTAR_FETCH_EVENT ||\n      eventName === DATASTAR_SIGNAL_PATCH_EVENT\n    ) {\n      target = document\n    }\n    // Prevent default on form submit events\n    if (el instanceof HTMLFormElement && eventName === 'submit') {\n      const cb = callback\n      callback = (evt?: Event) => {\n        evt?.preventDefault()\n        cb(evt)\n      }\n    }\n    target.addEventListener(eventName, callback, evtListOpts)\n    return () => {\n      target.removeEventListener(eventName, callback)\n    }\n  },\n})\n", "export const clamp = (value: number, min: number, max: number): number => {\n  return Math.max(min, Math.min(max, value))\n}\n\nexport const lerp = (\n  min: number,\n  max: number,\n  t: number,\n  clamped = true,\n): number => {\n  const v = min + (max - min) * t\n  return clamped ? clamp(v, min, max) : v\n}\n\nexport const inverseLerp = (\n  min: number,\n  max: number,\n  value: number,\n  clamped = true,\n): number => {\n  if (value < min) return 0\n  if (value > max) return 1\n  const v = (value - min) / (max - min)\n  return clamped ? clamp(v, min, max) : v\n}\n\nexport const fit = (\n  value: number,\n  inMin: number,\n  inMax: number,\n  outMin: number,\n  outMax: number,\n  clamped = true,\n  rounded = false,\n): number => {\n  const t = inverseLerp(inMin, inMax, value, clamped)\n  const fitted = lerp(outMin, outMax, t, clamped)\n  return rounded ? Math.round(fitted) : fitted\n}\n", "// Icon: mdi-light:vector-intersection\n// Slug: Runs an expression on intersection.\n// Description: Runs an expression when the element intersects with the viewport.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport type { HTMLOrSVG } from '@engine/types'\nimport { clamp } from '@utils/math'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nconst once = new WeakSet<HTMLOrSVG>()\n\nattribute({\n  name: 'on-intersect',\n  requirement: {\n    key: 'denied',\n    value: 'must',\n  },\n  apply({ el, mods, rx }) {\n    let callback = () => {\n      beginBatch()\n      rx()\n      endBatch()\n    }\n    callback = modifyViewTransition(callback, mods)\n    callback = modifyTiming(callback, mods)\n    const options = { threshold: 0 }\n    if (mods.has('full')) {\n      options.threshold = 1\n    } else if (mods.has('half')) {\n      options.threshold = 0.5\n    } else if (mods.get('threshold')) {\n      options.threshold = clamp(Number(mods.get('threshold')), 0, 100) / 100\n    }\n    const exit = mods.has('exit')\n    let observer: IntersectionObserver | null = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting !== exit) {\n            callback()\n            if (observer && once.has(el)) {\n              observer.disconnect()\n            }\n          }\n        }\n      },\n      options,\n    )\n    observer.observe(el)\n    if (mods.has('once')) {\n      once.add(el)\n    }\n    return () => {\n      if (!mods.has('once')) {\n        once.delete(el)\n      }\n      if (observer) {\n        observer.disconnect()\n        observer = null\n      }\n    }\n  },\n})\n", "// Icon: material-symbols:timer-outline\n// Slug: Runs an expression at a regular interval.\n// Description: Runs an expression at a regular interval.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagHas, tagToMs } from '@utils/tags'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n  name: 'on-interval',\n  requirement: {\n    key: 'denied',\n    value: 'must',\n  },\n  apply({ mods, rx }) {\n    let callback = () => {\n      beginBatch()\n      rx()\n      endBatch()\n    }\n    callback = modifyViewTransition(callback, mods)\n    let duration = 1000\n    const durationArgs = mods.get('duration')\n    if (durationArgs) {\n      duration = tagToMs(durationArgs)\n      const leading = tagHas(durationArgs, 'leading', false)\n      if (leading) {\n        callback()\n      }\n    }\n    const intervalId = setInterval(callback, duration)\n    return () => {\n      clearInterval(intervalId)\n    }\n  },\n})\n", "// Icon: material-symbols:change-circle-outline\n// Slug: Runs an expression when signals are patched.\n// Description: Runs an expression whenever one or more signals are patched.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\nimport { isEmpty } from '@utils/paths'\nimport { aliasify, jsStrToObject } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\n\nattribute({\n  name: 'on-signal-patch',\n  requirement: {\n    value: 'must',\n  },\n  argNames: ['patch'],\n  returnsValue: true,\n  apply({ el, key, mods, rx, error }) {\n    if (!!key && key !== 'filter') {\n      throw error('KeyNotAllowed')\n    }\n\n    const filterAttr = aliasify(`${this.name}-filter`)\n    const filtersRaw = el.getAttribute(filterAttr)\n    let filters: SignalFilterOptions = {}\n    if (filtersRaw) {\n      filters = jsStrToObject(filtersRaw)\n    }\n\n    let running = false\n\n    const callback: EventListener = modifyTiming(\n      (evt: CustomEvent<JSONPatch>) => {\n        if (running) return\n        const watched = filtered(filters, evt.detail)\n        if (!isEmpty(watched)) {\n          running = true\n          beginBatch()\n          try {\n            rx(watched)\n          } finally {\n            endBatch()\n            running = false\n          }\n        }\n      },\n      mods,\n    )\n\n    document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n    return () => {\n      document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n    }\n  },\n})\n", "// Icon: mdi:cursor-pointer\n// Slug: Creates a reference to an element.\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\n\nimport { attribute } from '@engine'\nimport { mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n  name: 'ref',\n  requirement: 'exclusive',\n  apply({ el, key, mods, value }) {\n    const signalName = key != null ? modifyCasing(key, mods) : value\n    mergePaths([[signalName, el]])\n  },\n})\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\n// Slug: Shows or hides an element.\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nconst NONE = 'none'\nconst DISPLAY = 'display'\n\nattribute({\n  name: 'show',\n  requirement: {\n    key: 'denied',\n    value: 'must',\n  },\n  returnsValue: true,\n  apply({ el, rx }) {\n    const update = () => {\n      observer.disconnect()\n      const shouldShow = rx()\n      if (shouldShow) {\n        if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\n      } else {\n        el.style.setProperty(DISPLAY, NONE)\n      }\n      observer.observe(el, { attributeFilter: ['style'] })\n    }\n    const observer = new MutationObserver(update)\n    const cleanup = effect(update)\n\n    return () => {\n      observer.disconnect()\n      cleanup()\n    }\n  },\n})\n", "// Icon: streamline:wifi-signal-full-remix\n// Slug: Patches signals into the existing signals.\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\n\nimport { attribute } from '@engine'\nimport { mergePatch, mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n  name: 'signals',\n  returnsValue: true,\n  apply({ key, mods, rx }) {\n    const ifMissing = mods.has('ifmissing')\n\n    if (key) {\n      key = modifyCasing(key, mods)\n      mergePaths([[key, rx?.()]], { ifMissing })\n    } else {\n      const patch = Object.assign({}, rx?.() as Record<string, any>)\n      mergePatch(patch, { ifMissing })\n    }\n  },\n})\n", "// Icon: material-symbols:format-paint-outline\n// Slug: Sets inline styles on an element based on an expression.\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { kebab } from '@utils/text'\n\nattribute({\n  name: 'style',\n  requirement: {\n    value: 'must',\n  },\n  returnsValue: true,\n  apply({ key, el, rx }) {\n    const { style } = el\n    const initialStyles = new Map<string, string>()\n\n    const apply = (prop: string, value: any) => {\n      const initial = initialStyles.get(prop)\n      if (!value && value !== 0) {\n        initial !== undefined &&\n          (initial\n            ? style.setProperty(prop, initial)\n            : style.removeProperty(prop))\n      } else {\n        initial === undefined &&\n          initialStyles.set(prop, style.getPropertyValue(prop))\n        style.setProperty(prop, String(value))\n      }\n    }\n\n    const update = () => {\n      observer.disconnect()\n\n      if (key) {\n        apply(key, rx())\n      } else {\n        const styles = rx() as Record<string, any>\n\n        for (const [prop, initial] of initialStyles) {\n          prop in styles ||\n            (initial\n              ? style.setProperty(prop, initial)\n              : style.removeProperty(prop))\n        }\n\n        for (const prop in styles) {\n          apply(kebab(prop), styles[prop])\n        }\n      }\n\n      observer.observe(el, { attributeFilter: ['style'] })\n    }\n\n    const observer = new MutationObserver(update)\n    const cleanup = effect(update)\n\n    return () => {\n      observer.disconnect()\n      cleanup()\n      for (const [prop, initial] of initialStyles) {\n        initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\n      }\n    }\n  },\n})\n", "// Icon: icon-park-outline:text\n// Slug: Binds the text content of an element.\n// Description: Binds the text content of an element to an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n  name: 'text',\n  requirement: {\n    key: 'denied',\n    value: 'must',\n  },\n  returnsValue: true,\n  apply({ el, rx }) {\n    const update = () => {\n      observer.disconnect()\n      el.textContent = `${rx()}`\n      observer.observe(el, {\n        childList: true,\n        characterData: true,\n        subtree: true,\n      })\n    }\n\n    const observer = new MutationObserver(update)\n    const cleanup = effect(update)\n\n    return () => {\n      observer.disconnect()\n      cleanup()\n    }\n  },\n})\n", "// Icon: material-symbols:cloud-download\n// Slug: Patches elements into the DOM.\n// Description: Patches elements into the DOM.\n\nimport { watcher } from '@engine'\nimport type { WatcherContext } from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify } from '@utils/text'\nimport { supportsViewTransitions } from '@utils/view-transitions'\n\nconst isValidType = <T extends readonly string[]>(\n  arr: T,\n  value: string,\n): value is T[number] => (arr as readonly string[]).includes(value)\n\nconst PATCH_MODES = [\n  'remove',\n  'outer',\n  'inner',\n  'replace',\n  'prepend',\n  'append',\n  'before',\n  'after',\n] as const\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\n\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\ntype Namespace = (typeof NAMESPACES)[number]\n\ntype PatchElementsArgs = {\n  selector: string\n  mode: PatchElementsMode\n  namespace: Namespace\n  useViewTransition: boolean\n  elements: string\n}\n\nwatcher({\n  name: 'datastar-patch-elements',\n  apply(\n    ctx,\n    {\n      selector = '',\n      mode = 'outer',\n      namespace = 'html',\n      useViewTransition = '',\n      elements = '',\n    },\n  ) {\n    if (!isValidType(PATCH_MODES, mode)) {\n      throw ctx.error('PatchElementsInvalidMode', { mode })\n    }\n\n    if (!selector && mode !== 'outer' && mode !== 'replace') {\n      throw ctx.error('PatchElementsExpectedSelector')\n    }\n\n    if (!isValidType(NAMESPACES, namespace)) {\n      throw ctx.error('PatchElementsInvalidNamespace', { namespace })\n    }\n\n    const args2: PatchElementsArgs = {\n      selector,\n      mode,\n      namespace,\n      useViewTransition: useViewTransition.trim() === 'true',\n      elements,\n    }\n\n    if (supportsViewTransitions && useViewTransition) {\n      document.startViewTransition(() => onPatchElements(ctx, args2))\n    } else {\n      onPatchElements(ctx, args2)\n    }\n  },\n})\n\nconst onPatchElements = (\n  { error }: WatcherContext,\n  { selector, mode, namespace, elements }: PatchElementsArgs,\n) => {\n  const elementsWithSvgsRemoved = elements.replace(\n    /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n    '',\n  )\n  const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\n  const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\n  const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\n\n  const wrapperTag =\n    namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\n  const wrappedEls = wrapperTag\n    ? `<${wrapperTag}>${elements}</${wrapperTag}>`\n    : elements\n\n  const newDocument = new DOMParser().parseFromString(\n    hasHtml || hasHead || hasBody\n      ? elements\n      : `<body><template>${wrappedEls}</template></body>`,\n    'text/html',\n  )\n\n  let newContent = document.createDocumentFragment()\n  if (hasHtml) {\n    newContent.appendChild(newDocument.documentElement)\n  } else if (hasHead && hasBody) {\n    newContent.appendChild(newDocument.head)\n    newContent.appendChild(newDocument.body)\n  } else if (hasHead) {\n    newContent.appendChild(newDocument.head)\n  } else if (hasBody) {\n    newContent.appendChild(newDocument.body)\n  } else if (wrapperTag) {\n    const wrapperEl = newDocument\n      .querySelector('template')!\n      .content.querySelector(wrapperTag)!\n    for (const child of wrapperEl.childNodes) {\n      newContent.appendChild(child)\n    }\n  } else {\n    newContent = newDocument.querySelector('template')!.content\n  }\n\n  if (!selector && (mode === 'outer' || mode === 'replace')) {\n    for (const child of newContent.children) {\n      let target: Element\n      if (child instanceof HTMLHtmlElement) {\n        target = document.documentElement\n      } else if (child instanceof HTMLBodyElement) {\n        target = document.body\n      } else if (child instanceof HTMLHeadElement) {\n        target = document.head\n      } else {\n        target = document.getElementById(child.id)!\n        if (!target) {\n          console.warn(error('PatchElementsNoTargetsFound'), {\n            element: { id: child.id },\n          })\n          continue\n        }\n      }\n\n      applyToTargets(mode as PatchElementsMode, child, [target])\n    }\n  } else {\n    const targets = document.querySelectorAll(selector)\n    if (!targets.length) {\n      console.warn(error('PatchElementsNoTargetsFound'), { selector })\n      return\n    }\n\n    applyToTargets(mode as PatchElementsMode, newContent, targets)\n  }\n}\n\nconst scripts = new WeakSet<HTMLScriptElement>()\nfor (const script of document.querySelectorAll('script')) {\n  scripts.add(script)\n}\n\nconst execute = (target: Element): void => {\n  const elScripts =\n    target instanceof HTMLScriptElement\n      ? [target]\n      : target.querySelectorAll('script')\n  for (const old of elScripts) {\n    if (!scripts.has(old)) {\n      const script = document.createElement('script')\n      for (const { name, value } of old.attributes) {\n        script.setAttribute(name, value)\n      }\n      script.text = old.text\n      old.replaceWith(script)\n      scripts.add(script)\n    }\n  }\n}\n\nconst applyPatchMode = (\n  targets: Iterable<Element>,\n  element: DocumentFragment | Element,\n  action: string,\n) => {\n  for (const target of targets) {\n    const cloned = element.cloneNode(true) as Element\n    execute(cloned)\n    // @ts-expect-error\n    target[action](cloned)\n  }\n}\n\nconst applyToTargets = (\n  mode: PatchElementsMode,\n  element: DocumentFragment | Element,\n  targets: Iterable<Element>,\n) => {\n  switch (mode) {\n    case 'remove':\n      for (const target of targets) {\n        target.remove()\n      }\n      break\n    case 'outer':\n    case 'inner':\n      for (const target of targets) {\n        morph(target, element.cloneNode(true) as Element, mode)\n        execute(target)\n      }\n      break\n    case 'replace':\n      applyPatchMode(targets, element, 'replaceWith')\n      break\n    case 'prepend':\n    case 'append':\n    case 'before':\n    case 'after':\n      applyPatchMode(targets, element, mode)\n  }\n}\n\nconst ctxIdMap = new Map<Node, Set<string>>()\nconst ctxPersistentIds = new Set<string>()\nconst oldIdTagNameMap = new Map<string, string>()\nconst duplicateIds = new Set<string>()\nconst ctxPantry = document.createElement('div')\nctxPantry.hidden = true\n\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\nconst morph = (\n  oldElt: Element | ShadowRoot,\n  newContent: DocumentFragment | Element,\n  mode: 'outer' | 'inner' = 'outer',\n): void => {\n  if (\n    (isHTMLOrSVG(oldElt) &&\n      isHTMLOrSVG(newContent) &&\n      oldElt.hasAttribute(aliasedIgnoreMorph) &&\n      newContent.hasAttribute(aliasedIgnoreMorph)) ||\n    oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\n  ) {\n    return\n  }\n\n  const normalizedElt = document.createElement('div')\n  normalizedElt.append(newContent)\n  document.body.insertAdjacentElement('afterend', ctxPantry)\n\n  // Computes the set of IDs that persist between the two contents excluding duplicates\n  const oldIdElements = oldElt.querySelectorAll('[id]')\n  for (const { id, tagName } of oldIdElements) {\n    if (oldIdTagNameMap.has(id)) {\n      duplicateIds.add(id)\n    } else {\n      oldIdTagNameMap.set(id, tagName)\n    }\n  }\n  if (oldElt instanceof Element && oldElt.id) {\n    if (oldIdTagNameMap.has(oldElt.id)) {\n      duplicateIds.add(oldElt.id)\n    } else {\n      oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\n    }\n  }\n\n  ctxPersistentIds.clear()\n  const newIdElements = normalizedElt.querySelectorAll('[id]')\n  for (const { id, tagName } of newIdElements) {\n    if (ctxPersistentIds.has(id)) {\n      duplicateIds.add(id)\n    } else if (oldIdTagNameMap.get(id) === tagName) {\n      ctxPersistentIds.add(id)\n    }\n  }\n\n  for (const id of duplicateIds) {\n    ctxPersistentIds.delete(id)\n  }\n\n  oldIdTagNameMap.clear()\n  duplicateIds.clear()\n  ctxIdMap.clear()\n\n  const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\n  populateIdMapWithTree(parent, oldIdElements)\n  populateIdMapWithTree(normalizedElt, newIdElements)\n\n  morphChildren(\n    parent,\n    normalizedElt,\n    mode === 'outer' ? oldElt : null,\n    oldElt.nextSibling,\n  )\n\n  ctxPantry.remove()\n}\n\n// This is the core algorithm for matching up children.\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\n// We greedily match, which allows us to keep the algorithm fast,\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\nconst morphChildren = (\n  oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\n  newParent: Element, // the parent element of the new content\n  insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\n  endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\n): void => {\n  // normalize\n  if (\n    oldParent instanceof HTMLTemplateElement &&\n    newParent instanceof HTMLTemplateElement\n  ) {\n    // we can pretend the DocumentElement is an Element\n    oldParent = oldParent.content as unknown as Element\n    newParent = newParent.content as unknown as Element\n  }\n  insertionPoint ??= oldParent.firstChild\n\n  // run through all the new content\n  for (const newChild of newParent.childNodes) {\n    // once we reach the end of the old parent content skip to the end and insert the rest\n    if (insertionPoint && insertionPoint !== endPoint) {\n      const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\n      if (bestMatch) {\n        // if the node to morph is not at the insertion point then remove/move up to it\n        if (bestMatch !== insertionPoint) {\n          let cursor: Node | null = insertionPoint\n          // Remove nodes between the start and end nodes\n          while (cursor && cursor !== bestMatch) {\n            const tempNode = cursor\n            cursor = cursor.nextSibling\n            removeNode(tempNode)\n          }\n        }\n        morphNode(bestMatch, newChild)\n        insertionPoint = bestMatch.nextSibling\n        continue\n      }\n    }\n\n    // if the matching node is elsewhere in the original content\n    if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\n      // move it and all its children here and morph, will always be found\n      // Search for an element by ID within the document and pantry, and move it using moveBefore.\n      const movedChild = document.getElementById(newChild.id) as Element\n\n      // Removes an element from its ancestors' ID maps.\n      // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\n      // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\n      // preventing their removal hooks from being called.\n      let current = movedChild\n      while ((current = current.parentNode as Element)) {\n        const idSet = ctxIdMap.get(current)\n        if (idSet) {\n          idSet.delete(newChild.id)\n          if (!idSet.size) {\n            ctxIdMap.delete(current)\n          }\n        }\n      }\n\n      moveBefore(oldParent, movedChild, insertionPoint)\n      morphNode(movedChild, newChild)\n      insertionPoint = movedChild.nextSibling\n      continue\n    }\n\n    // This performs the action of inserting a new node while handling situations where the node contains\n    // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\n    if (ctxIdMap.has(newChild)) {\n      // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\n      const namespaceURI = (newChild as Element).namespaceURI\n      const tagName = (newChild as Element).tagName\n      const newEmptyChild =\n        namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\n          ? document.createElementNS(namespaceURI, tagName)\n          : document.createElement(tagName)\n      oldParent.insertBefore(newEmptyChild, insertionPoint)\n      morphNode(newEmptyChild, newChild)\n      insertionPoint = newEmptyChild.nextSibling\n    } else {\n      // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\n      const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\n      oldParent.insertBefore(newClonedChild, insertionPoint)\n      insertionPoint = newClonedChild.nextSibling\n    }\n  }\n\n  // remove any remaining old nodes that didn't match up with new content\n  while (insertionPoint && insertionPoint !== endPoint) {\n    const tempNode = insertionPoint\n    insertionPoint = insertionPoint.nextSibling\n    removeNode(tempNode)\n  }\n}\n\n// Scans forward from the startPoint to the endPoint looking for a match for the node.\n// It looks for an id set match first, then a soft match.\n// We abort soft matching if we find two future soft matches, to reduce churn.\nconst findBestMatch = (\n  node: Node,\n  startPoint: Node | null,\n  endPoint: Node | null,\n): Node | null => {\n  let bestMatch: Node | null | undefined = null\n  let nextSibling = node.nextSibling\n  let siblingSoftMatchCount = 0\n  let displaceMatchCount = 0\n\n  // Max ID matches we are willing to displace in our search\n  const nodeMatchCount = ctxIdMap.get(node)?.size || 0\n\n  let cursor = startPoint\n  while (cursor && cursor !== endPoint) {\n    // soft matching is a prerequisite for id set matching\n    if (isSoftMatch(cursor, node)) {\n      let isIdSetMatch = false\n      const oldSet = ctxIdMap.get(cursor)\n      const newSet = ctxIdMap.get(node)\n\n      if (newSet && oldSet) {\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            isIdSetMatch = true\n            break\n          }\n        }\n      }\n\n      if (isIdSetMatch) {\n        return cursor // found an id set match, we're done!\n      }\n\n      // we haven\u2019t yet saved a soft match fallback\n      // the current soft match will hard match something else in the future, leave it\n      if (!bestMatch && !ctxIdMap.has(cursor)) {\n        // optimization: if node can't id set match, we can just return the soft match immediately\n        if (!nodeMatchCount) {\n          return cursor\n        }\n        // save this as the fallback if we get through the loop without finding a hard match\n        bestMatch = cursor\n      }\n    }\n\n    // check for IDs we may be displaced when matching\n    displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\n    if (displaceMatchCount > nodeMatchCount) {\n      // if we are going to displace more IDs than the node contains then\n      // we do not have a good candidate for an ID match, so return\n      break\n    }\n\n    if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {\n      // The next new node has a soft match with this node, so\n      // increment the count of future soft matches\n      siblingSoftMatchCount++\n      nextSibling = nextSibling.nextSibling\n\n      // If there are two future soft matches, block soft matching for this node to allow\n      // future siblings to soft match. This is to reduce churn in the DOM when an element\n      // is prepended.\n      if (siblingSoftMatchCount >= 2) {\n        bestMatch = undefined\n      }\n    }\n\n    cursor = cursor.nextSibling\n  }\n\n  return bestMatch || null\n}\n\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\n  oldNode.nodeType === newNode.nodeType &&\n  (oldNode as Element).tagName === (newNode as Element).tagName &&\n  // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\n  // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n  // its not persistent, and new nodes can't have any hidden state.\n  (!(oldNode as Element).id ||\n    (oldNode as Element).id === (newNode as Element).id)\n\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n// - Persistent nodes will be moved to the pantry for later reuse\n// - Other nodes will have their hooks called, and then are removed\nconst removeNode = (node: Node): void => {\n  // are we going to id set match this later?\n  ctxIdMap.has(node)\n    ? // skip callbacks and move to pantry\n      moveBefore(ctxPantry, node, null)\n    : // remove for realsies\n      node.parentNode?.removeChild(node)\n}\n\n// Moves an element before another element within the same parent.\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n// This is essentially a forward-compat wrapper.\nconst moveBefore: (parentNode: Node, node: Node, after: Node | null) => void =\n  // @ts-expect-error\n  removeNode.call.bind(ctxPantry.moveBefore ?? ctxPantry.insertBefore)\n\nconst aliasedPreserveAttr = aliasify('preserve-attr')\n\n// syncs the oldNode to the newNode, copying over all attributes and\n// inner element state from the newNode to the oldNode\nconst morphNode = (\n  oldNode: Node, // root node to merge content into\n  newNode: Node, // new content to merge\n): Node => {\n  const type = newNode.nodeType\n\n  // if is an element type, sync the attributes from the\n  // new node into the new node\n  if (type === 1 /* element type */) {\n    const oldElt = oldNode as Element\n    const newElt = newNode as Element\n    const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\n    if (\n      oldElt.hasAttribute(aliasedIgnoreMorph) &&\n      newElt.hasAttribute(aliasedIgnoreMorph)\n    ) {\n      return oldNode\n    }\n\n    //  many bothans died to bring us this information:\n    //  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n    //  https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\n    if (\n      oldElt instanceof HTMLInputElement &&\n      newElt instanceof HTMLInputElement &&\n      newElt.type !== 'file'\n    ) {\n      // https://github.com/bigskysoftware/idiomorph/issues/27\n      // | old input value | new input value  | behaviour                              |\n      // | --------------- | ---------------- | -------------------------------------- |\n      // | `null`          | `null`           | preserve old input value               |\n      // | some value      | the same value   | preserve old input value               |\n      // | some value      | `null`           | set old input value to `\"\"`            |\n      // | `null`          | some value       | set old input value to new input value |\n      // | some value      | some other value | set old input value to new input value |\n      if (newElt.getAttribute('value') !== oldElt.getAttribute('value')) {\n        oldElt.value = newElt.getAttribute('value') ?? ''\n      }\n    } else if (\n      oldElt instanceof HTMLTextAreaElement &&\n      newElt instanceof HTMLTextAreaElement\n    ) {\n      if (newElt.value !== oldElt.value) {\n        oldElt.value = newElt.value\n      }\n      if (oldElt.firstChild && oldElt.firstChild.nodeValue !== newElt.value) {\n        oldElt.firstChild.nodeValue = newElt.value\n      }\n    }\n\n    const preserveAttrs = (\n      (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\n    ).split(' ')\n\n    for (const { name, value } of newElt.attributes) {\n      if (\n        oldElt.getAttribute(name) !== value &&\n        !preserveAttrs.includes(name)\n      ) {\n        oldElt.setAttribute(name, value)\n      }\n    }\n\n    for (let i = oldElt.attributes.length - 1; i >= 0; i--) {\n      const { name } = oldElt.attributes[i]!\n      if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\n        oldElt.removeAttribute(name)\n      }\n    }\n\n    // Preserve the scope marker even if the incoming markup doesn't carry it.\n    if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\n      oldElt.setAttribute('data-scope-children', '')\n    }\n\n    if (!oldElt.isEqualNode(newElt)) {\n      morphChildren(oldElt, newElt)\n    }\n\n    if (shouldScopeChildren) {\n      oldElt.dispatchEvent(\n        new CustomEvent('datastar:scope-children', { bubbles: false }),\n      )\n    }\n  }\n\n  if (type === 8 /* comment */ || type === 3 /* text */) {\n    if (oldNode.nodeValue !== newNode.nodeValue) {\n      oldNode.nodeValue = newNode.nodeValue\n    }\n  }\n\n  return oldNode\n}\n\n// A bottom-up algorithm that populates a map of Element -> IdSet.\n// The ID set for a given element is the set of all IDs contained within its subtree.\n// As an optimization, we filter these IDs through the given list of persistent IDs,\n// because we don't need to bother considering IDed elements that won't be in the new content.\nconst populateIdMapWithTree = (\n  root: Element | ShadowRoot | null,\n  elements: Iterable<Element>,\n): void => {\n  for (const elt of elements) {\n    if (ctxPersistentIds.has(elt.id)) {\n      let current: Element | null = elt\n      // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\n      while (current && current !== root) {\n        let idSet = ctxIdMap.get(current)\n        // if the ID set doesn\u2019t exist, create it and insert it in the map\n        if (!idSet) {\n          idSet = new Set()\n          ctxIdMap.set(current, idSet)\n        }\n        idSet.add(elt.id)\n        current = current.parentElement\n      }\n    }\n  }\n}\n", "// Icon: material-symbols:settings-input-antenna\n// Slug: Patches signals.\n// Description: Patches signals.\n\nimport { watcher } from '@engine'\nimport { mergePatch } from '@engine/signals'\nimport { jsStrToObject } from '@utils/text'\n\nwatcher({\n  name: 'datastar-patch-signals',\n  apply({ error }, { signals, onlyIfMissing }) {\n    if (signals) {\n      const ifMissing = onlyIfMissing?.trim() === 'true'\n      mergePatch(jsStrToObject(signals), { ifMissing })\n    } else {\n      throw error('PatchSignalsExpectedSignals')\n    }\n  },\n})\n", "(() => {\n  const componentRegistry = {};\n  let observer = null;\n\n  const registerComponent = (name, selector, initFunction) => {\n    componentRegistry[name] = {\n      selector,\n      init: initFunction\n    };\n  };\n\n  const initComponent = (element, componentName) => {\n    const component = componentRegistry[componentName];\n    if (!component) return;\n\n    try {\n      component.init(element);\n    } catch (error) {\n      console.error(`Failed to initialize ${componentName}:`, error);\n    }\n  };\n\n  const initAllComponents = () => {\n    Object.entries(componentRegistry).forEach(([name, { selector, init }]) => {\n      document.querySelectorAll(selector).forEach(init);\n    });\n  };\n\n  const initNewComponents = (node) => {\n    if (node.nodeType !== Node.ELEMENT_NODE) return;\n\n    Object.entries(componentRegistry).forEach(([name, { selector, init }]) => {\n      if (node.matches(selector)) {\n        init(node);\n      }\n      node.querySelectorAll(selector).forEach(init);\n    });\n  };\n\n  const startObserver = () => {\n    if (observer) return;\n\n    observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        mutation.addedNodes.forEach(initNewComponents);\n      });\n    });\n\n    observer.observe(document.body, { childList: true, subtree: true });\n  };\n\n  const stopObserver = () => {\n    if (observer) {\n      observer.disconnect();\n      observer = null;\n    }\n  };\n\n  const reinitComponent = (componentName) => {\n    const component = componentRegistry[componentName];\n    if (!component) {\n      console.warn(`Component '${componentName}' not found in registry`);\n      return;\n    }\n\n    // Clear initialization flag for this component\n    const flag = `data-${componentName}-initialized`;\n    document.querySelectorAll(`[${flag}]`).forEach(el => {\n      el.removeAttribute(flag);\n    });\n\n    document.querySelectorAll(component.selector).forEach(component.init);\n  };\n\n  const reinitAll = () => {\n    // Clear all initialization flags using the registry\n    Object.entries(componentRegistry).forEach(([name, { selector }]) => {\n      const flag = `data-${name}-initialized`;\n      document.querySelectorAll(`[${flag}]`).forEach(el => {\n        el.removeAttribute(flag);\n      });\n    });\n\n    initAllComponents();\n  };\n\n  window.basecoat = {\n    register: registerComponent,\n    init: reinitComponent,\n    initAll: reinitAll,\n    start: startObserver,\n    stop: stopObserver\n  };\n\n  document.addEventListener('DOMContentLoaded', () => {\n    initAllComponents();\n    startObserver();\n  });\n})();\n", "(() => {\n  const initDropdownMenu = (dropdownMenuComponent) => {\n    const trigger = dropdownMenuComponent.querySelector(':scope > button');\n    const popover = dropdownMenuComponent.querySelector(':scope > [data-popover]');\n    const menu = popover.querySelector('[role=\"menu\"]');\n\n    if (!trigger || !menu || !popover) {\n      const missing = [];\n      if (!trigger) missing.push('trigger');\n      if (!menu) missing.push('menu');\n      if (!popover) missing.push('popover');\n      console.error(`Dropdown menu initialisation failed. Missing element(s): ${missing.join(', ')}`, dropdownMenuComponent);\n      return;\n    }\n\n    let menuItems = [];\n    let activeIndex = -1;\n\n    const closePopover = (focusOnTrigger = true) => {\n      if (trigger.getAttribute('aria-expanded') === 'false') return;\n      trigger.setAttribute('aria-expanded', 'false');\n      trigger.removeAttribute('aria-activedescendant');\n      popover.setAttribute('aria-hidden', 'true');\n\n      if (focusOnTrigger) {\n        trigger.focus();\n      }\n\n      setActiveItem(-1);\n    };\n\n    const openPopover = (initialSelection = false) => {\n      document.dispatchEvent(new CustomEvent('basecoat:popover', {\n        detail: { source: dropdownMenuComponent }\n      }));\n\n      // Position fixed popover when inside table-wrapper (for overflow-x: auto).\n      if (dropdownMenuComponent.closest('.table-wrapper')) {\n        const rect = trigger.getBoundingClientRect();\n        const side = popover.dataset.side || 'bottom';\n        const align = popover.dataset.align || 'start';\n\n        popover.style.position = 'fixed';\n\n        if (side === 'bottom') {\n          popover.style.top = `${rect.bottom + 4}px`;\n          popover.style.bottom = 'auto';\n        } else if (side === 'top') {\n          popover.style.bottom = `${window.innerHeight - rect.top + 4}px`;\n          popover.style.top = 'auto';\n        }\n\n        if (align === 'end') {\n          popover.style.right = `${window.innerWidth - rect.right}px`;\n          popover.style.left = 'auto';\n        } else {\n          popover.style.left = `${rect.left}px`;\n          popover.style.right = 'auto';\n        }\n      }\n\n      trigger.setAttribute('aria-expanded', 'true');\n      popover.setAttribute('aria-hidden', 'false');\n      menuItems = Array.from(menu.querySelectorAll('[role^=\"menuitem\"]')).filter(item =>\n        !item.hasAttribute('disabled') &&\n        item.getAttribute('aria-disabled') !== 'true'\n      );\n\n      if (menuItems.length > 0 && initialSelection) {\n        if (initialSelection === 'first') {\n          setActiveItem(0);\n        } else if (initialSelection === 'last') {\n          setActiveItem(menuItems.length - 1);\n        }\n      }\n    };\n\n    const setActiveItem = (index) => {\n      if (activeIndex > -1 && menuItems[activeIndex]) {\n        menuItems[activeIndex].classList.remove('active');\n      }\n      activeIndex = index;\n      if (activeIndex > -1 && menuItems[activeIndex]) {\n        const activeItem = menuItems[activeIndex];\n        activeItem.classList.add('active');\n        trigger.setAttribute('aria-activedescendant', activeItem.id);\n      } else {\n        trigger.removeAttribute('aria-activedescendant');\n      }\n    };\n\n    trigger.addEventListener('click', () => {\n      const isExpanded = trigger.getAttribute('aria-expanded') === 'true';\n      if (isExpanded) {\n        closePopover();\n      } else {\n        openPopover(false);\n      }\n    });\n\n    dropdownMenuComponent.addEventListener('keydown', (event) => {\n      const isExpanded = trigger.getAttribute('aria-expanded') === 'true';\n\n      if (event.key === 'Escape') {\n        if (isExpanded) closePopover();\n        return;\n      }\n\n      if (!isExpanded) {\n        if (['Enter', ' '].includes(event.key)) {\n          event.preventDefault();\n          openPopover(false);\n        } else if (event.key === 'ArrowDown') {\n          event.preventDefault();\n          openPopover('first');\n        } else if (event.key === 'ArrowUp') {\n          event.preventDefault();\n          openPopover('last');\n        }\n        return;\n      }\n\n      if (menuItems.length === 0) return;\n\n      let nextIndex = activeIndex;\n\n      switch (event.key) {\n        case 'ArrowDown':\n          event.preventDefault();\n          nextIndex = activeIndex === -1 ? 0 : Math.min(activeIndex + 1, menuItems.length - 1);\n          break;\n        case 'ArrowUp':\n          event.preventDefault();\n          nextIndex = activeIndex === -1 ? menuItems.length - 1 : Math.max(activeIndex - 1, 0);\n          break;\n        case 'Home':\n          event.preventDefault();\n          nextIndex = 0;\n          break;\n        case 'End':\n          event.preventDefault();\n          nextIndex = menuItems.length - 1;\n          break;\n        case 'Enter':\n        case ' ':\n          event.preventDefault();\n          menuItems[activeIndex]?.click();\n          closePopover();\n          return;\n      }\n\n      if (nextIndex !== activeIndex) {\n        setActiveItem(nextIndex);\n      }\n    });\n\n    menu.addEventListener('mousemove', (event) => {\n      const menuItem = event.target.closest('[role^=\"menuitem\"]');\n      if (menuItem && menuItems.includes(menuItem)) {\n        const index = menuItems.indexOf(menuItem);\n        if (index !== activeIndex) {\n          setActiveItem(index);\n        }\n      }\n    });\n\n    menu.addEventListener('mouseleave', () => {\n      setActiveItem(-1);\n    });\n\n    menu.addEventListener('click', (event) => {\n      if (event.target.closest('[role^=\"menuitem\"]')) {\n        closePopover();\n      }\n    });\n\n    document.addEventListener('click', (event) => {\n      if (!dropdownMenuComponent.contains(event.target)) {\n        closePopover(false);\n      }\n    });\n\n    document.addEventListener('basecoat:popover', (event) => {\n      if (event.detail.source !== dropdownMenuComponent) {\n        closePopover(false);\n      }\n    });\n\n    dropdownMenuComponent.dataset.dropdownMenuInitialized = true;\n    dropdownMenuComponent.dispatchEvent(new CustomEvent('basecoat:initialized'));\n  };\n\n  if (window.basecoat) {\n    window.basecoat.register('dropdown-menu', '.dropdown-menu:not([data-dropdown-menu-initialized])', initDropdownMenu);\n  }\n})();\n", "(() => {\n  const initCommand = (container) => {\n    const input = container.querySelector('header input');\n    const menu = container.querySelector('[role=\"menu\"]');\n    const hintEl = container.querySelector('[data-transaction-hint]');\n\n    if (!input || !menu) {\n      const missing = [];\n      if (!input) missing.push('input');\n      if (!menu) missing.push('menu');\n      console.error(`Command component initialization failed. Missing element(s): ${missing.join(', ')}`, container);\n      return;\n    }\n\n    let allMenuItems = [];\n    let menuItems = [];\n    let visibleMenuItems = [...menuItems];\n    let activeIndex = -1;\n    let remoteController = null;\n    let remoteTimeout = null;\n\n    // --- Transaction mode state ---\n    let transactionMode = false;\n    let parseTimeout = null;\n    let parseController = null;\n    let charCountSinceLastParse = 0;\n    let parsePreviewEl = null;\n\n    const exitTransactionMode = () => {\n      if (!transactionMode) return;\n      transactionMode = false;\n      if (hintEl) hintEl.hidden = true;\n      clearTimeout(parseTimeout);\n      parseController?.abort();\n      removeParsePreview();\n      allMenuItems.forEach(item => {\n        if (!item.hasAttribute('data-remote-results')) {\n          item.removeAttribute('aria-hidden');\n        }\n      });\n      charCountSinceLastParse = 0;\n    };\n\n    const enterTransactionMode = () => {\n      transactionMode = true;\n      if (hintEl) hintEl.hidden = false;\n      clearRemoteResults();\n      allMenuItems.forEach(item => {\n        if (!item.hasAttribute('data-force')) {\n          item.setAttribute('aria-hidden', 'true');\n        }\n      });\n      visibleMenuItems = [];\n      setActiveItem(-1);\n    };\n\n    const removeParsePreview = () => {\n      if (parsePreviewEl) {\n        parsePreviewEl.remove();\n        parsePreviewEl = null;\n      }\n      menu.querySelectorAll('[data-parse-result]').forEach(el => el.remove());\n      menu.querySelectorAll('[data-parse-loading]').forEach(el => el.remove());\n    };\n\n    const showParseLoading = () => {\n      removeParsePreview();\n      const el = document.createElement('div');\n      el.setAttribute('role', 'menuitem');\n      el.dataset.parseLoading = '';\n      el.dataset.force = '';\n      el.className = 'parse-loading';\n      el.innerHTML = `<span class=\"parse-spinner\"></span>`;\n      menu.prepend(el);\n      parsePreviewEl = el;\n      refreshMenuItems();\n      visibleMenuItems = [];\n      setActiveItem(-1);\n    };\n\n    const scheduleParse = (text) => {\n      const parseUrl = container.dataset.parseUrl;\n      if (!parseUrl || text.length <= 1) {\n        removeParsePreview();\n        return;\n      }\n\n      clearTimeout(parseTimeout);\n      parseTimeout = setTimeout(async () => {\n        parseController?.abort();\n        parseController = new AbortController();\n\n        showParseLoading();\n\n        try {\n          const url = new URL(parseUrl, location.origin);\n          url.searchParams.set('q', text);\n          const response = await fetch(url, {\n            signal: parseController.signal,\n            headers: { 'Accept': 'application/json' },\n          });\n          if (!response.ok) return;\n          const data = await response.json();\n          if (input.value.trim() !== text.trim()) return;\n          renderParseResult(data);\n        } catch (error) {\n          if (error.name !== 'AbortError') {\n            removeParsePreview();\n          }\n        }\n      }, text.length <= 3 ? 0 : 500);\n    };\n\n    const renderParseResult = (data) => {\n      removeParsePreview();\n\n      if (data.success && data.preview) {\n        const p = data.preview;\n        const iconMap = { expense: 'arrow-trending-down', revenue: 'arrow-trending-up', transfer: 'arrows-right-left' };\n\n        const item = document.createElement('a');\n        item.setAttribute('role', 'menuitem');\n        item.setAttribute('href', data.form_url);\n        item.dataset.parseResult = '';\n        item.dataset.force = '';\n        item.className = 'parse-preview';\n\n        const badge = (p.type === 'expense') ? 'text-red-500' :\n                      (p.type === 'revenue') ? 'text-green-500' : 'text-blue-500';\n\n        // Build detail lines\n        const lines = [];\n        const accountLine = (side, resolved, label) => {\n          const labelPart = label ? escHtml(label) : null;\n          const namePart = resolved ? escHtml(resolved.name) : null;\n          if (labelPart && namePart) {\n            return `<span class=\"opacity-70\">${side}:</span> @${labelPart} \u2192 ${namePart}`;\n          }\n          if (labelPart) {\n            return `<span class=\"opacity-70\">${side}:</span> @${labelPart} <span class=\"text-destructive\">(introuvable)</span>`;\n          }\n          if (namePart) {\n            return `<span class=\"opacity-70\">${side}:</span> ${namePart}`;\n          }\n          return null;\n        };\n        const src = accountLine('Source', p.source, p.source_label);\n        const dst = accountLine('Destination', p.destination, p.destination_label);\n        if (src) lines.push(src);\n        if (dst) lines.push(dst);\n\n        // Hint when some accounts are unresolved\n        const hasUnresolved =\n          (p.source_label && !p.source) || (p.destination_label && !p.destination);\n        const hintHtml = hasUnresolved\n          ? `<div class=\"parse-preview-hint\">\u26A0 Certains comptes sont introuvables \u2014 vous pourrez les s\u00E9lectionner sur la page.</div>`\n          : '';\n        if (p.category) {\n          lines.push(`<span class=\"opacity-70\">Cat\u00E9gorie:</span> ${escHtml(p.category.name)}`);\n        }\n        if (p.budget) {\n          lines.push(`<span class=\"opacity-70\">Budget:</span> ${escHtml(p.budget.name)}`);\n        }\n        const detailHtml = lines.length\n          ? `<div class=\"parse-preview-details\">${lines.join('<br>')}</div>`\n          : '';\n\n        item.innerHTML =\n          `<div class=\"parse-preview-header\">` +\n            `<svg class=\"size-5 shrink-0 ${badge}\"><use href=\"#icon-${iconMap[p.type] || 'plus'}\"></use></svg>` +\n            `<span class=\"parse-preview-title\">${escHtml(p.description)}</span>` +\n            `<span class=\"parse-preview-amount\">${escHtml(p.amount_display)} \u00B7 ${escHtml(p.type_label)}</span>` +\n          `</div>` +\n          detailHtml +\n          hintHtml;\n\n        menu.prepend(item);\n        parsePreviewEl = item;\n\n        refreshMenuItems();\n        visibleMenuItems = menuItems.filter(mi => mi === item);\n        if (visibleMenuItems.length > 0) {\n          setActiveItem(menuItems.indexOf(item));\n          item.scrollIntoView({ block: 'nearest' });\n        }\n      } else if (data.error) {\n        const item = document.createElement('div');\n        item.setAttribute('role', 'menuitem');\n        item.dataset.parseResult = '';\n        item.dataset.force = '';\n        item.className = 'text-destructive';\n        item.innerHTML = `<svg class=\"size-4 shrink-0\"><use href=\"#icon-exclamation-circle\"></use></svg>` +\n          `<span class=\"truncate\">${escHtml(data.error)}</span>`;\n        menu.prepend(item);\n        parsePreviewEl = item;\n\n        refreshMenuItems();\n        visibleMenuItems = menuItems.filter(mi => mi === item);\n      }\n    };\n\n    const escHtml = (s) => {\n      const d = document.createElement('div');\n      d.textContent = s;\n      return d.innerHTML;\n    };\n\n    const refreshMenuItems = () => {\n      allMenuItems = Array.from(menu.querySelectorAll('[role=\"menuitem\"]'));\n      menuItems = allMenuItems.filter(item =>\n        !item.hasAttribute('disabled') &&\n        item.getAttribute('aria-disabled') !== 'true'\n      );\n    };\n\n    const clearRemoteResults = () => {\n      menu.querySelectorAll('[data-remote-results]').forEach(item => item.remove());\n      removeParsePreview();\n      delete menu.dataset.remoteResultsActive;\n      refreshMenuItems();\n    };\n\n    const renderRemoteResults = (results = [], query = '') => {\n      clearRemoteResults();\n      if (!results.length || input.value.trim().toLowerCase() !== query) {\n        return;\n      }\n\n      const separator = document.createElement('hr');\n      separator.setAttribute('role', 'separator');\n      separator.dataset.remoteResults = '';\n      menu.dataset.remoteResultsActive = '';\n      menu.appendChild(separator);\n\n      const groups = new Map();\n      results.forEach(result => {\n        const groupName = result.group || 'Results';\n        if (!groups.has(groupName)) {\n          groups.set(groupName, []);\n        }\n        groups.get(groupName).push(result);\n      });\n\n      groups.forEach((items, groupName) => {\n        const group = document.createElement('div');\n        const headingId = `cmd-remote-${groupName.toLowerCase().replace(/\\W+/g, '-')}`;\n        group.setAttribute('role', 'group');\n        group.setAttribute('aria-labelledby', headingId);\n        group.dataset.remoteResults = '';\n\n        const heading = document.createElement('span');\n        heading.setAttribute('role', 'heading');\n        heading.id = headingId;\n        heading.textContent = groupName;\n        group.appendChild(heading);\n\n        items.forEach(result => {\n          const item = document.createElement('a');\n          item.setAttribute('role', 'menuitem');\n          item.setAttribute('href', result.url);\n          item.dataset.remoteResults = '';\n          item.dataset.force = '';\n          item.dataset.filter = `${result.title || ''} ${result.subtitle || ''}`;\n\n          const title = document.createElement('span');\n          title.className = 'truncate';\n          title.textContent = result.title || '';\n          item.appendChild(title);\n\n          if (result.subtitle) {\n            const subtitle = document.createElement('span');\n            subtitle.className = 'ml-auto shrink-0 text-xs text-current opacity-70';\n            subtitle.textContent = result.subtitle;\n            item.appendChild(subtitle);\n          }\n\n          group.appendChild(item);\n        });\n\n        menu.appendChild(group);\n      });\n\n      refreshMenuItems();\n      visibleMenuItems = menuItems.filter(item => item.hasAttribute('data-remote-results'));\n      if (visibleMenuItems.length > 0) {\n        setActiveItem(menuItems.indexOf(visibleMenuItems[0]));\n        visibleMenuItems[0].scrollIntoView({ block: 'nearest' });\n      }\n    };\n\n    const scheduleRemoteSearch = (query) => {\n      const searchUrl = container.dataset.searchUrl;\n      if (!searchUrl || query.length < 2) {\n        return;\n      }\n\n      clearTimeout(remoteTimeout);\n      remoteTimeout = setTimeout(async () => {\n        remoteController?.abort();\n        remoteController = new AbortController();\n\n        try {\n          const url = new URL(searchUrl, location.origin);\n          url.searchParams.set('q', query);\n          const response = await fetch(url, {\n            signal: remoteController.signal,\n            headers: { 'Accept': 'application/json' },\n          });\n          if (!response.ok) {\n            return;\n          }\n          const data = await response.json();\n          renderRemoteResults(data.results || [], query);\n        } catch (error) {\n          if (error.name !== 'AbortError') {\n            clearRemoteResults();\n          }\n        }\n      }, 200);\n    };\n\n    refreshMenuItems();\n    visibleMenuItems = [...menuItems];\n\n    const setActiveItem = (index) => {\n      if (activeIndex > -1 && menuItems[activeIndex]) {\n        menuItems[activeIndex].classList.remove('active');\n      }\n\n      activeIndex = index;\n\n      if (activeIndex > -1) {\n        const activeItem = menuItems[activeIndex];\n        activeItem.classList.add('active');\n        if (activeItem.id) {\n          input.setAttribute('aria-activedescendant', activeItem.id);\n        } else {\n          input.removeAttribute('aria-activedescendant');\n        }\n      } else {\n        input.removeAttribute('aria-activedescendant');\n      }\n    };\n\n    const filterMenuItems = () => {\n      const searchTerm = input.value.trim().toLowerCase();\n\n      // --- Transaction mode: '>' prefix ---\n      if (input.value.startsWith('>')) {\n        if (!transactionMode) {\n          enterTransactionMode();\n        }\n        charCountSinceLastParse++;\n        if (charCountSinceLastParse >= 3) {\n          scheduleParse(input.value);\n          charCountSinceLastParse = 0;\n        }\n        clearTimeout(parseTimeout);\n        parseTimeout = setTimeout(() => {\n          if (input.value.startsWith('>')) {\n            scheduleParse(input.value);\n            charCountSinceLastParse = 0;\n          }\n        }, 500);\n        return;\n      } else {\n        exitTransactionMode();\n      }\n\n      clearRemoteResults();\n      setActiveItem(-1);\n\n      visibleMenuItems = [];\n      allMenuItems.forEach(item => {\n        if (item.hasAttribute('data-force')) {\n          item.setAttribute('aria-hidden', 'false');\n          if (menuItems.includes(item)) {\n            visibleMenuItems.push(item);\n          }\n          return;\n        }\n\n        const itemText = (item.dataset.filter || item.textContent).trim().toLowerCase();\n        const keywordList = (item.dataset.keywords || '')\n          .toLowerCase()\n          .split(/[\\s,]+/)\n          .filter(Boolean);\n        const matchesKeyword = keywordList.some(keyword => keyword.includes(searchTerm));\n        const matches = itemText.includes(searchTerm) || matchesKeyword;\n        item.setAttribute('aria-hidden', String(!matches));\n        if (matches && menuItems.includes(item)) {\n          visibleMenuItems.push(item);\n        }\n      });\n\n      if (visibleMenuItems.length > 0) {\n        setActiveItem(menuItems.indexOf(visibleMenuItems[0]));\n        visibleMenuItems[0].scrollIntoView({ block: 'nearest' });\n      } else {\n        scheduleRemoteSearch(searchTerm);\n      }\n    };\n\n    input.addEventListener('input', filterMenuItems);\n\n    const handleKeyNavigation = (event) => {\n      if (!['ArrowDown', 'ArrowUp', 'Enter', 'Home', 'End'].includes(event.key)) {\n        return;\n      }\n\n      if (event.key === 'Enter') {\n        event.preventDefault();\n        if (activeIndex > -1) {\n          menuItems[activeIndex]?.click();\n        }\n        return;\n      }\n\n      if (visibleMenuItems.length === 0) return;\n\n      event.preventDefault();\n\n      const currentVisibleIndex = activeIndex > -1 ? visibleMenuItems.indexOf(menuItems[activeIndex]) : -1;\n      let nextVisibleIndex = currentVisibleIndex;\n\n      switch (event.key) {\n        case 'ArrowDown':\n          if (currentVisibleIndex < visibleMenuItems.length - 1) {\n            nextVisibleIndex = currentVisibleIndex + 1;\n          } else {\n            nextVisibleIndex = 0;\n          }\n          break;\n        case 'ArrowUp':\n          if (currentVisibleIndex > 0) {\n            nextVisibleIndex = currentVisibleIndex - 1;\n          } else {\n            nextVisibleIndex = visibleMenuItems.length - 1;\n          }\n          break;\n        case 'Home':\n          nextVisibleIndex = 0;\n          break;\n        case 'End':\n          nextVisibleIndex = visibleMenuItems.length - 1;\n          break;\n      }\n\n      if (nextVisibleIndex !== currentVisibleIndex) {\n        const newActiveItem = visibleMenuItems[nextVisibleIndex];\n        setActiveItem(menuItems.indexOf(newActiveItem));\n        newActiveItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n      }\n    };\n\n    menu.addEventListener('mousemove', (event) => {\n      const menuItem = event.target.closest('[role=\"menuitem\"]');\n      if (menuItem && visibleMenuItems.includes(menuItem)) {\n        const index = menuItems.indexOf(menuItem);\n        if (index !== activeIndex) {\n          setActiveItem(index);\n        }\n      }\n    });\n\n    menu.addEventListener('click', (event) => {\n      const clickedItem = event.target.closest('[role=\"menuitem\"]');\n      if (clickedItem && visibleMenuItems.includes(clickedItem)) {\n        const dialog = container.closest('dialog.command-dialog');\n        if (dialog && !clickedItem.hasAttribute('data-keep-command-open')) {\n          dialog.close();\n        }\n      }\n    });\n\n    input.addEventListener('keydown', handleKeyNavigation);\n\n    if (visibleMenuItems.length > 0) {\n      setActiveItem(menuItems.indexOf(visibleMenuItems[0]));\n      visibleMenuItems[0].scrollIntoView({ block: 'nearest' });\n    }\n\n    container.dataset.commandInitialized = true;\n    container.dispatchEvent(new CustomEvent('basecoat:initialized'));\n  };\n\n  if (window.basecoat) {\n    window.basecoat.register('command', '.command:not([data-command-initialized])', initCommand);\n  }\n})();\n", "(() => {\n  const initSelect = (selectComponent) => {\n    const trigger = selectComponent.querySelector(':scope > button');\n    const selectedLabel = trigger.querySelector(':scope > span');\n    const popover = selectComponent.querySelector(':scope > [data-popover]');\n    const listbox = popover ? popover.querySelector('[role=\"listbox\"]') : null;\n    const input = selectComponent.querySelector(':scope > input[type=\"hidden\"]');\n    const filter = selectComponent.querySelector('header input[type=\"text\"]');\n\n    if (!trigger || !popover || !listbox || !input) {\n      const missing = [];\n      if (!trigger) missing.push('trigger');\n      if (!popover) missing.push('popover');\n      if (!listbox) missing.push('listbox');\n      if (!input) missing.push('input');\n      console.error(`Select component initialisation failed. Missing element(s): ${missing.join(', ')}`, selectComponent);\n      return;\n    }\n\n    let allOptions = Array.from(listbox.querySelectorAll('[role=\"option\"]'));\n    let options = allOptions.filter(opt => opt.getAttribute('aria-disabled') !== 'true');\n    let visibleOptions = [...options];\n    let activeIndex = -1;\n    const isMultiple = listbox.getAttribute('aria-multiselectable') === 'true';\n    const selectedOptions = isMultiple ? new Set() : null;\n    const placeholder = isMultiple ? (selectComponent.dataset.placeholder || '') : null;\n    const closeOnSelect = selectComponent.dataset.closeOnSelect === 'true';\n\n    const getValue = (opt) => opt.dataset.value ?? opt.textContent.trim();\n\n    const refreshOptions = () => {\n      allOptions = Array.from(listbox.querySelectorAll('[role=\"option\"]'));\n      options = allOptions.filter(opt => opt.getAttribute('aria-disabled') !== 'true');\n      visibleOptions = options.filter(opt => opt.getAttribute('aria-hidden') !== 'true');\n      setActiveOption(-1);\n    };\n\n    const setActiveOption = (index) => {\n      if (activeIndex > -1 && options[activeIndex]) {\n        options[activeIndex].classList.remove('active');\n      }\n\n      activeIndex = index;\n\n      if (activeIndex > -1) {\n        const activeOption = options[activeIndex];\n        activeOption.classList.add('active');\n        if (activeOption.id) {\n          trigger.setAttribute('aria-activedescendant', activeOption.id);\n        } else {\n          trigger.removeAttribute('aria-activedescendant');\n        }\n      } else {\n        trigger.removeAttribute('aria-activedescendant');\n      }\n    };\n\n    const hasTransition = () => {\n      const style = getComputedStyle(popover);\n      return parseFloat(style.transitionDuration) > 0 || parseFloat(style.transitionDelay) > 0;\n    };\n\n    const updateValue = (optionOrOptions, triggerEvent = true) => {\n      let value;\n\n      if (isMultiple) {\n        const opts = Array.isArray(optionOrOptions) ? optionOrOptions : [];\n        selectedOptions.clear();\n        opts.forEach(opt => selectedOptions.add(opt));\n\n        // Get selected options in DOM order\n        const selected = options.filter(opt => selectedOptions.has(opt));\n        if (selected.length === 0) {\n          selectedLabel.textContent = placeholder;\n          selectedLabel.classList.add('text-muted-foreground');\n        } else {\n          selectedLabel.textContent = selected.map(opt => opt.dataset.label || opt.textContent.trim()).join(', ');\n          selectedLabel.classList.remove('text-muted-foreground');\n        }\n\n        value = selected.map(getValue);\n        input.value = JSON.stringify(value);\n      } else {\n        const option = optionOrOptions;\n        if (!option) return;\n        selectedLabel.innerHTML = option.innerHTML;\n        value = getValue(option);\n        input.value = value;\n      }\n\n      options.forEach(opt => {\n        const isSelected = isMultiple ? selectedOptions.has(opt) : opt === optionOrOptions;\n        if (isSelected) {\n          opt.setAttribute('aria-selected', 'true');\n        } else {\n          opt.removeAttribute('aria-selected');\n        }\n      });\n\n      if (triggerEvent) {\n        selectComponent.dispatchEvent(new CustomEvent('change', {\n          detail: { value },\n          bubbles: true\n        }));\n      }\n    };\n\n    const closePopover = (focusOnTrigger = true) => {\n      if (popover.getAttribute('aria-hidden') === 'true') return;\n\n      if (filter) {\n        const resetFilter = () => {\n          filter.value = '';\n          visibleOptions = [...options];\n          allOptions.forEach(opt => opt.setAttribute('aria-hidden', 'false'));\n        };\n\n        if (hasTransition()) {\n          popover.addEventListener('transitionend', resetFilter, { once: true });\n        } else {\n          resetFilter();\n        }\n      }\n\n      if (focusOnTrigger) trigger.focus();\n      popover.setAttribute('aria-hidden', 'true');\n      trigger.setAttribute('aria-expanded', 'false');\n      setActiveOption(-1);\n    };\n\n    const toggleMultipleValue = (option) => {\n      if (selectedOptions.has(option)) {\n        selectedOptions.delete(option);\n      } else {\n        selectedOptions.add(option);\n      }\n      updateValue(options.filter(opt => selectedOptions.has(opt)));\n    };\n\n    const select = (value) => {\n      if (isMultiple) {\n        const option = options.find(opt => getValue(opt) === value && !selectedOptions.has(opt));\n        if (!option) return;\n        selectedOptions.add(option);\n        updateValue(options.filter(opt => selectedOptions.has(opt)));\n      } else {\n        const option = options.find(opt => getValue(opt) === value);\n        if (!option) return;\n        if (input.value !== value) {\n          updateValue(option);\n        }\n        closePopover();\n      }\n    };\n\n    const deselect = (value) => {\n      if (!isMultiple) return;\n      const option = options.find(opt => getValue(opt) === value && selectedOptions.has(opt));\n      if (!option) return;\n      selectedOptions.delete(option);\n      updateValue(options.filter(opt => selectedOptions.has(opt)));\n    };\n\n    const toggle = (value) => {\n      if (!isMultiple) return;\n      const option = options.find(opt => getValue(opt) === value);\n      if (!option) return;\n      toggleMultipleValue(option);\n    };\n\n    if (filter) {\n      const filterOptions = () => {\n        const searchTerm = filter.value.trim().toLowerCase();\n\n        setActiveOption(-1);\n\n        visibleOptions = [];\n        allOptions.forEach(option => {\n          if (option.hasAttribute('data-force')) {\n            option.setAttribute('aria-hidden', 'false');\n            if (options.includes(option)) {\n              visibleOptions.push(option);\n            }\n            return;\n          }\n\n          const optionText = (option.dataset.filter || option.textContent).trim().toLowerCase();\n          const keywordList = (option.dataset.keywords || '')\n            .toLowerCase()\n            .split(/[\\s,]+/)\n            .filter(Boolean);\n          const matchesKeyword = keywordList.some(keyword => keyword.includes(searchTerm));\n          const matches = optionText.includes(searchTerm) || matchesKeyword;\n          option.setAttribute('aria-hidden', String(!matches));\n          if (matches && options.includes(option)) {\n            visibleOptions.push(option);\n          }\n        });\n      };\n\n      filter.addEventListener('input', filterOptions);\n    }\n\n    // Initialization\n    if (isMultiple) {\n      const ariaSelected = options.filter(opt => opt.getAttribute('aria-selected') === 'true');\n      try {\n        const parsed = JSON.parse(input.value || '[]');\n        const validValues = new Set(options.map(getValue));\n        const initialValues = Array.isArray(parsed) ? parsed.filter(v => validValues.has(v)) : [];\n\n        const initialOptions = [];\n        if (initialValues.length > 0) {\n          // Match values to options in order, allowing duplicates\n          initialValues.forEach(val => {\n            const opt = options.find(o => getValue(o) === val && !initialOptions.includes(o));\n            if (opt) initialOptions.push(opt);\n          });\n        } else {\n          initialOptions.push(...ariaSelected);\n        }\n\n        updateValue(initialOptions, false);\n      } catch (e) {\n        updateValue(ariaSelected, false);\n      }\n    } else {\n      const initialOption = options.find(opt => getValue(opt) === input.value && !opt.hasAttribute('data-create'));\n      if (initialOption) {\n        updateValue(initialOption, false);\n      } else if (!input.value) {\n        // No explicit value: default to the first selectable option. API-backed\n        // selects have a value but no matching option in the DOM yet (options are\n        // fetched on demand) \u2014 leave the input untouched in that case so the\n        // server-rendered value isn't clobbered by the empty-label entry.\n        const fallbackOption = options.find(opt => !opt.hasAttribute('data-create'));\n        if (fallbackOption) updateValue(fallbackOption, false);\n      }\n    }\n\n    const handleKeyNavigation = (event) => {\n      const isPopoverOpen = popover.getAttribute('aria-hidden') === 'false';\n\n      if (!['ArrowDown', 'ArrowUp', 'Enter', 'Home', 'End', 'Escape'].includes(event.key)) {\n        return;\n      }\n\n      if (!isPopoverOpen) {\n        if (event.key !== 'Enter' && event.key !== 'Escape') {\n          event.preventDefault();\n          trigger.click();\n        }\n        return;\n      }\n\n      event.preventDefault();\n\n      if (event.key === 'Escape') {\n        closePopover();\n        return;\n      }\n\n      if (event.key === 'Enter') {\n        if (activeIndex > -1) {\n          const option = options[activeIndex];\n          if (isMultiple) {\n            toggleMultipleValue(option);\n            if (closeOnSelect) {\n              closePopover();\n            }\n          } else {\n            if (input.value !== getValue(option)) {\n              updateValue(option);\n            }\n            closePopover();\n          }\n        }\n        return;\n      }\n\n      if (visibleOptions.length === 0) return;\n\n      const currentVisibleIndex = activeIndex > -1 ? visibleOptions.indexOf(options[activeIndex]) : -1;\n      let nextVisibleIndex = currentVisibleIndex;\n\n      switch (event.key) {\n        case 'ArrowDown':\n          if (currentVisibleIndex < visibleOptions.length - 1) {\n            nextVisibleIndex = currentVisibleIndex + 1;\n          }\n          break;\n        case 'ArrowUp':\n          if (currentVisibleIndex > 0) {\n            nextVisibleIndex = currentVisibleIndex - 1;\n          } else if (currentVisibleIndex === -1) {\n            nextVisibleIndex = 0;\n          }\n          break;\n        case 'Home':\n          nextVisibleIndex = 0;\n          break;\n        case 'End':\n          nextVisibleIndex = visibleOptions.length - 1;\n          break;\n      }\n\n      if (nextVisibleIndex !== currentVisibleIndex) {\n        const newActiveOption = visibleOptions[nextVisibleIndex];\n        setActiveOption(options.indexOf(newActiveOption));\n        newActiveOption.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n      }\n    };\n\n    listbox.addEventListener('mousemove', (event) => {\n      const option = event.target.closest('[role=\"option\"]');\n      if (option && visibleOptions.includes(option)) {\n        const index = options.indexOf(option);\n        if (index !== activeIndex) {\n          setActiveOption(index);\n        }\n      }\n    });\n\n    listbox.addEventListener('mouseleave', () => {\n      const selectedOption = listbox.querySelector('[role=\"option\"][aria-selected=\"true\"]');\n      if (selectedOption) {\n        setActiveOption(options.indexOf(selectedOption));\n      } else {\n        setActiveOption(-1);\n      }\n    });\n\n    trigger.addEventListener('keydown', handleKeyNavigation);\n    if (filter) {\n      filter.addEventListener('keydown', handleKeyNavigation);\n    }\n\n    const openPopover = () => {\n      document.dispatchEvent(new CustomEvent('basecoat:popover', {\n        detail: { source: selectComponent }\n      }));\n\n      if (filter) {\n        if (hasTransition()) {\n          popover.addEventListener('transitionend', () => {\n            filter.focus();\n          }, { once: true });\n        } else {\n          filter.focus();\n        }\n      }\n\n      popover.setAttribute('aria-hidden', 'false');\n      trigger.setAttribute('aria-expanded', 'true');\n\n      const selectedOption = listbox.querySelector('[role=\"option\"][aria-selected=\"true\"]');\n      if (selectedOption) {\n        setActiveOption(options.indexOf(selectedOption));\n        selectedOption.scrollIntoView({ block: 'nearest' });\n      }\n    };\n\n    trigger.addEventListener('click', () => {\n      const isExpanded = trigger.getAttribute('aria-expanded') === 'true';\n      if (isExpanded) {\n        closePopover();\n      } else {\n        openPopover();\n      }\n    });\n\n    listbox.addEventListener('click', (event) => {\n      const clickedOption = event.target.closest('[role=\"option\"]');\n      if (!clickedOption) return;\n\n      const option = options.find(opt => opt === clickedOption);\n      if (!option) return;\n\n      if (isMultiple) {\n        toggleMultipleValue(option);\n        if (closeOnSelect) {\n          closePopover();\n        } else {\n          setActiveOption(options.indexOf(option));\n          if (filter) {\n            filter.focus();\n          } else {\n            trigger.focus();\n          }\n        }\n      } else {\n        if (input.value !== getValue(option)) {\n          updateValue(option);\n        }\n        closePopover();\n      }\n    });\n\n    document.addEventListener('click', (event) => {\n      if (!selectComponent.contains(event.target)) {\n        closePopover(false);\n      }\n    });\n\n    document.addEventListener('basecoat:popover', (event) => {\n      if (event.detail.source !== selectComponent) {\n        closePopover(false);\n      }\n    });\n\n    selectComponent.addEventListener('basecoat:options-changed', refreshOptions);\n\n    popover.setAttribute('aria-hidden', 'true');\n\n    // Public API\n    Object.defineProperty(selectComponent, 'value', {\n      get: () => {\n        if (isMultiple) {\n          return options.filter(opt => selectedOptions.has(opt)).map(getValue);\n        } else {\n          return input.value;\n        }\n      },\n      set: (val) => {\n        if (isMultiple) {\n          const values = Array.isArray(val) ? val : (val != null ? [val] : []);\n          const opts = [];\n          values.forEach(v => {\n            const opt = options.find(o => getValue(o) === v && !opts.includes(o));\n            if (opt) opts.push(opt);\n          });\n          updateValue(opts);\n        } else {\n          const option = options.find(opt => getValue(opt) === val);\n          if (option) {\n            updateValue(option);\n            closePopover();\n          }\n        }\n      }\n    });\n\n    selectComponent.select = select;\n    selectComponent.selectByValue = select; // Backward compatibility alias\n    if (isMultiple) {\n      selectComponent.deselect = deselect;\n      selectComponent.toggle = toggle;\n      selectComponent.selectAll = () => updateValue(options);\n      selectComponent.selectNone = () => updateValue([]);\n    }\n    selectComponent.dataset.selectInitialized = true;\n    selectComponent.dispatchEvent(new CustomEvent('basecoat:initialized'));\n  };\n\n  if (window.basecoat) {\n    window.basecoat.register('select', 'div.select:not([data-select-initialized])', initSelect);\n  }\n})();\n", "(() => {\n  const initTabs = (tabsComponent) => {\n    const tablist = tabsComponent.querySelector('[role=\"tablist\"]');\n    if (!tablist) return;\n\n    const tabs = Array.from(tablist.querySelectorAll('[role=\"tab\"]'));\n    const panels = tabs.map(tab => document.getElementById(tab.getAttribute('aria-controls'))).filter(Boolean);\n\n    const selectTab = (tabToSelect) => {\n      tabs.forEach((tab, index) => {\n        tab.setAttribute('aria-selected', 'false');\n        tab.setAttribute('tabindex', '-1');\n        if (panels[index]) panels[index].hidden = true;\n      });\n\n      tabToSelect.setAttribute('aria-selected', 'true');\n      tabToSelect.setAttribute('tabindex', '0');\n      const activePanel = document.getElementById(tabToSelect.getAttribute('aria-controls'));\n      if (activePanel) activePanel.hidden = false;\n    };\n\n    tablist.addEventListener('click', (event) => {\n      const clickedTab = event.target.closest('[role=\"tab\"]');\n      if (clickedTab) selectTab(clickedTab);\n    });\n\n    tablist.addEventListener('keydown', (event) => {\n      const currentTab = event.target;\n      if (!tabs.includes(currentTab)) return;\n\n      let nextTab;\n      const currentIndex = tabs.indexOf(currentTab);\n\n      switch (event.key) {\n        case 'ArrowRight':\n          nextTab = tabs[(currentIndex + 1) % tabs.length];\n          break;\n        case 'ArrowLeft':\n          nextTab = tabs[(currentIndex - 1 + tabs.length) % tabs.length];\n          break;\n        case 'Home':\n          nextTab = tabs[0];\n          break;\n        case 'End':\n          nextTab = tabs[tabs.length - 1];\n          break;\n        default:\n          return;\n      }\n\n      event.preventDefault();\n      selectTab(nextTab);\n      nextTab.focus();\n    });\n\n    tabsComponent.dataset.tabsInitialized = true;\n    tabsComponent.dispatchEvent(new CustomEvent('basecoat:initialized'));\n  };\n\n  if (window.basecoat) {\n    window.basecoat.register('tabs', '.tabs:not([data-tabs-initialized])', initTabs);\n  }\n})();\n", "/**\n * \u00B5JS (muJS) - Lightweight AJAX navigation library\n * https://mujs.org\n * MIT License\n *\n * @file\t\tmu.js\n * @license\t\tMIT\n * @see\t\t\thttps://mujs.org\n *\n *\n * ============================================================================\n * TABLE OF CONTENTS\n * ============================================================================\n *\n * 1. Overview\n * 2. Installation\n * 3. Basic usage\n * 4. Modes\n * 5. Patch mode\n * 6. Attributes reference\n * 7. Configuration reference\n * 8. Events\n * 9. Morphing (idiomorph)\n * 10. View Transitions\n * 11. Forms\n * 12. History & Scroll\n * 13. Prefetch\n * 14. Progress bar\n * 15. Triggers\n * 16. Server-Sent Events (SSE)\n * 17. Programmatic usage\n *\n *\n * ============================================================================\n * 1. OVERVIEW\n * ============================================================================\n *\n * \u00B5JS intercepts clicks on links and form submissions to load pages via AJAX\n * instead of full browser navigation. The fetched content replaces part (or\n * all) of the current page, making navigation faster and smoother.\n *\n * It is inspired by pjax, Turbo (Hotwire), and HTMX, but aims to be simpler\n * and lighter, with zero dependencies.\n *\n *\n * ============================================================================\n * 2. INSTALLATION\n * ============================================================================\n *\n * Include the scripts at the end of <body>:\n *\n *   <script src=\"/path/to/mu.js\"></script>\n *   <script>mu.init();</script>\n *\n * Optionally, load idiomorph before mu.js for DOM morphing support:\n *\n *   <script src=\"/path/to/idiomorph.js\"></script>\n *   <script src=\"/path/to/mu.js\"></script>\n *   <script>mu.init();</script>\n *\n * \u00B5JS auto-detects idiomorph. If present, morphing is enabled by default.\n *\n * Or use as an ES module:\n *\n *   import mu from './mu.js';\n *   mu.init();\n *\n *\n * ============================================================================\n * 3. BASIC USAGE\n * ============================================================================\n *\n * After calling mu.init(), all internal links (href starting with \"/\") are\n * automatically intercepted. Clicking a link fetches the page via AJAX and\n * replaces the current <body> with the fetched <body>.\n *\n * No modification of your HTML is needed for basic usage.\n *\n * Example \u2014 default behavior (full page replacement):\n *\n *   <a href=\"/about\">About</a>\n *\n * Example \u2014 replace only a fragment:\n *\n *   <a href=\"/about\" mu-target=\"#content\" mu-source=\"#main\">About</a>\n *\n * Example \u2014 disable \u00B5JS on a specific link:\n *\n *   <a href=\"/file.pdf\" mu-disabled>Download</a>\n *\n *\n * ============================================================================\n * 4. MODES\n * ============================================================================\n *\n * The \"mu-mode\" attribute controls how fetched content is injected into the\n * current page. Default mode is \"replace\".\n *\n *   replace   Replace the target node with the source node (default).\n *   update    Replace the inner content of the target with the source's\n *             inner content.\n *   prepend   Insert the source node at the beginning of the target.\n *   append    Insert the source node at the end of the target.\n *   before    Insert the source node before the target.\n *   after     Insert the source node after the target.\n *   remove    Remove the target node (source content is ignored).\n *   none      Do nothing to the DOM (events are still fired).\n *   patch     Process multiple targeted fragments (see section 5).\n *\n * Example:\n *\n *   <a href=\"/notifications\" mu-mode=\"update\" mu-target=\"#notifs\">\n *       Refresh notifications\n *   </a>\n *\n *\n * ============================================================================\n * 5. PATCH MODE\n * ============================================================================\n *\n * In patch mode, the fetched HTML contains multiple fragments, each targeting\n * a different part of the current page. Fragments are identified by the\n * \"mu-patch-target\" attribute.\n *\n * Link triggering a patch:\n *\n *   <a href=\"/api/comments/new\" mu-mode=\"patch\">Add comment</a>\n *\n * Server response (plain HTML):\n *\n *   <!-- Replaces #comment-42 (default mode: replace) -->\n *   <div mu-patch-target=\"#comment-42\" class=\"comment\">\n *       Updated comment\n *   </div>\n *\n *   <!-- Appends to #comments -->\n *   <div class=\"comment\" mu-patch-target=\"#comments\" mu-patch-mode=\"append\">\n *       New comment\n *   </div>\n *\n *   <!-- Updates the page title -->\n *   <title mu-patch-target=\"title\">New title</title>\n *\n *   <!-- Removes an element -->\n *   <div mu-patch-target=\"#old-banner\" mu-patch-mode=\"remove\"></div>\n *\n *   <!-- Adds a stylesheet -->\n *   <link rel=\"stylesheet\" href=\"/css/gallery.css\"\n *         mu-patch-target=\"head\" mu-patch-mode=\"append\">\n *\n * Patch fragments are standard HTML elements. No special tags needed.\n * The mu-patch-* attributes are kept on injected nodes for debugging.\n *\n * By default, patch mode does not modify browser history. To enable it:\n *\n *   <a href=\"/products?cat=3\" mu-mode=\"patch\" mu-patch-history=\"true\">\n *       Filter\n *   </a>\n *\n *\n * ============================================================================\n * 6. ATTRIBUTES REFERENCE\n * ============================================================================\n *\n * All attributes support both \"mu-*\" and \"data-mu-*\" syntax.\n *\n *   mu-disabled           Disable \u00B5JS on this element.\n *   mu-mode               Injection mode (see section 4).\n *   mu-target             CSS selector for the target node in the current page.\n *   mu-source             CSS selector for the source node in the fetched page.\n *   mu-url                Override the URL to fetch (instead of href/action).\n *   mu-prefix             URL prefix for the fetch request.\n *   mu-title              Selector for the title node. Supports\n *                         \"selector/attribute\" syntax. Empty string to disable\n *                         title update.\n *   mu-history            \"true\"/\"false\" to add/skip browser history entry.\n *                         Default: true for navigation modes (replace/update),\n *                         false for partial modes and non-GET forms.\n *   mu-scroll             \"true\"/\"false\" to force or prevent scrolling to top.\n *                         Default: true for navigation, false for partial modes.\n *   mu-morph              \"false\" to disable morphing on this element.\n *   mu-transition         \"false\" to disable view transitions on this element.\n *   mu-prefetch           \"false\" to disable prefetch on hover for this link.\n *   mu-method             HTTP method: \"get\", \"post\", \"put\", \"patch\",\n *                         \"delete\", or \"sse\". Default: \"get\" for links,\n *                         form's method attribute for forms.\n *   mu-trigger            Event trigger: \"click\", \"submit\", \"change\",\n *                         \"blur\", \"focus\", \"load\". Default depends on\n *                         element type (see section 15).\n *   mu-debounce           Debounce delay in milliseconds (e.g. \"500\").\n *   mu-repeat             Repeat interval in ms for polling (e.g. \"5000\").\n *   mu-confirm            Confirmation message shown before loading.\n *   mu-confirm-quit       (Forms) Enable quit-page confirmation when the form\n *                         has been modified.\n *   mu-validate           Name of a JS function for form validation. Receives\n *                         the form element. Must return true/false.\n *   mu-patch-target       (Patch fragments) CSS selector of the target node.\n *   mu-patch-mode         (Patch fragments) Injection mode for this fragment.\n *   mu-patch-history      \"true\" to add the URL to browser history in patch\n *                         mode (default: \"false\", no history).\n *\n *\n * ============================================================================\n * 7. CONFIGURATION REFERENCE\n * ============================================================================\n *\n * Pass an object to mu.init() to override defaults:\n *\n *   mu.init({\n *       history: false,\n *       processForms: false,\n *       morph: false\n *   });\n *\n *   processLinks      (bool)    Process <a> tags. Default: true.\n *   processForms      (bool)    Process <form> tags. Default: true.\n *   history           (bool)    Add URL to browser history. Default: true.\n *   mode              (string)  Default injection mode. Default: \"replace\".\n *   target            (string)  Default target selector. Default: \"body\".\n *   source            (string)  Default source selector. Default: \"body\".\n *   title             (string)  Title selector. Default: \"title\".\n *   scroll            (bool)    Force scroll behavior. Default: null (auto).\n *   urlPrefix         (string)  Prefix added to fetched URLs. Default: null.\n *   progress          (bool)    Show progress bar. Default: true.\n *   prefetch          (bool)    Prefetch on hover. Default: true.\n *   morph             (bool)    Enable DOM morphing. Default: true.\n *   transition        (bool)    Enable View Transitions. Default: true.\n *   confirmQuitText   (string)  Quit-page confirmation message.\n *\n *\n * ============================================================================\n * 8. EVENTS\n * ============================================================================\n *\n * \u00B5JS dispatches CustomEvents on `document`. All events carry a `detail`\n * object with `lastUrl` and `previousUrl`.\n *\n *   mu:init           Fired after initialization.\n *                     detail: {url}\n *\n *   mu:before-fetch   Fired before fetching. Cancelable (preventDefault()\n *                     aborts the load).\n *                     detail: {url, fetchUrl, config, sourceElement}\n *\n *   mu:before-render  Fired after fetch, before DOM injection. Cancelable.\n *                     detail.html can be modified to alter injected content.\n *                     detail: {url, finalUrl, html, config}\n *\n *   mu:after-render   Fired after DOM injection.\n *                     detail: {url, finalUrl, mode}\n *\n *   mu:fetch-error    Fired on fetch failure or HTTP error.\n *                     detail: {url, fetchUrl, status, response, error}\n *\n * Example:\n *\n *   document.addEventListener(\"mu:after-render\", function(e) {\n *       console.log(\"Loaded: \" + e.detail.url);\n *       myApp.initWidgets();\n *   });\n *\n *\n * ============================================================================\n * 9. MORPHING (IDIOMORPH)\n * ============================================================================\n *\n * When a morph library is available, \u00B5JS uses it for \"replace\" and \"update\"\n * modes to preserve DOM state (focus, scroll position, video playback, etc.).\n *\n * \u00B5JS auto-detects idiomorph (https://github.com/bigskysoftware/idiomorph):\n *\n *   <script src=\"/path/to/idiomorph.js\"></script>\n *   <script src=\"/path/to/mu.js\"></script>\n *\n * To use a different morph library:\n *\n *   mu.init();\n *   mu.setMorph(function(target, html, opts) {\n *       myMorphLib.morph(target, html, opts);\n *   });\n *\n * Morphing can be disabled globally (morph: false in config) or per-element\n * (mu-morph=\"false\").\n *\n *\n * ============================================================================\n * 10. VIEW TRANSITIONS\n * ============================================================================\n *\n * \u00B5JS uses the View Transitions API (document.startViewTransition) when\n * supported by the browser. This provides smooth animated transitions between\n * page states.\n *\n * Enabled by default. Falls back silently on unsupported browsers.\n *\n * Disable globally:\n *\n *   mu.init({ transition: false });\n *\n * Disable per-element:\n *\n *   <a href=\"/page\" mu-transition=\"false\">Link</a>\n *\n *\n * ============================================================================\n * 11. FORMS\n * ============================================================================\n *\n * \u00B5JS intercepts form submissions. HTML5 validation (reportValidity) is\n * checked before any fetch.\n *\n * GET forms: data is serialized as query string, behaves like a link.\n * POST forms: data is sent as URL-encoded (default) or FormData\n * (when enctype=\"multipart/form-data\", e.g. file uploads).\n * History is disabled by default\n * (POST responses should not be replayed via browser back button).\n *\n * Example \u2014 POST form in patch mode:\n *\n *   <form action=\"/comment/create\" method=\"post\" mu-mode=\"patch\">\n *       <textarea name=\"body\"></textarea>\n *       <button type=\"submit\">Send</button>\n *   </form>\n *\n * Quit-page confirmation: add mu-confirm-quit to a form. If any input is\n * modified, the user will be prompted before navigating away.\n *\n *   <form action=\"/save\" method=\"post\" mu-confirm-quit>...</form>\n *\n * Custom validation via mu-validate attribute:\n *\n *   <form action=\"/save\" method=\"post\" mu-validate=\"myValidator\">...</form>\n *   <script>\n *       function myValidator(form) {\n *           return form.querySelector('#name').value.length > 0;\n *       }\n *   </script>\n *\n *\n * ============================================================================\n * 12. HISTORY & SCROLL\n * ============================================================================\n *\n * mu-history controls whether the URL is added to browser history.\n * mu-scroll controls whether the page scrolls to top after rendering.\n * Both are independent \u2014 setting one does not affect the other.\n *\n * Defaults depend on the mode and context:\n *   - Modes replace/update + GET link/form: history=true, scroll=true.\n *   - Modes replace/update + POST/PUT/PATCH/DELETE form: history=false, scroll=true.\n *   - Modes replace/update + triggers (change/blur/focus/load): history=false, scroll=false.\n *   - Modes append/prepend/before/after/remove/none: history=false, scroll=false.\n *   - Patch mode: history=false, scroll=false.\n *\n * Redirections always add the URL to browser history.\n *\n *   <a href=\"/panel\" mu-history=\"false\">Open panel</a>\n *\n * Disable history globally:\n *\n *   mu.init({ history: false });\n *\n * In patch mode, use mu-patch-history=\"true\" to add the URL to history.\n *\n *\n * ============================================================================\n * 13. PREFETCH\n * ============================================================================\n *\n * When enabled (default), \u00B5JS fetches the page on mouse hover, before the\n * user clicks. A 50ms delay filters accidental hover-throughs.\n * This saves ~100-300ms of perceived loading time.\n *\n * The prefetch cache stores one entry per URL. It is consumed and cleared\n * when the link is clicked.\n *\n * Disable globally:\n *\n *   mu.init({ prefetch: false });\n *\n * Disable per-link:\n *\n *   <a href=\"/heavy-page\" mu-prefetch=\"false\">Link</a>\n *\n *\n * ============================================================================\n * 14. PROGRESS BAR\n * ============================================================================\n *\n * A thin progress bar is displayed at the top of the page during fetch.\n * It is styled with inline CSS (no external stylesheet needed).\n *\n * The bar element has id=\"mu-progress\" and can be styled via CSS:\n *\n *   #mu-progress { background: red !important; height: 5px !important; }\n *\n * Disable globally:\n *\n *   mu.init({ progress: false });\n *\n *\n * ============================================================================\n * 15. TRIGGERS\n * ============================================================================\n *\n * \u00B5JS supports custom event triggers via the mu-trigger attribute. This\n * allows any element with a mu-url to initiate a fetch on events other\n * than click or submit.\n *\n * Default triggers (when mu-trigger is absent):\n *   <a>                          click\n *   <form>                       submit\n *   <input>, <textarea>, <select>  change\n *   Any other element            click\n *\n * Trigger mapping to browser events:\n *   click   \u2192 click (handled by event delegation)\n *   submit  \u2192 submit (handled by event delegation)\n *   change  \u2192 input (browser event)\n *   blur    \u2192 change + blur (deduplicated)\n *   focus   \u2192 focus\n *   load    \u2192 fires immediately when rendered\n *\n * Example \u2014 live search with debounce:\n *\n *   <input type=\"text\" name=\"q\"\n *          mu-trigger=\"change\" mu-debounce=\"500\"\n *          mu-url=\"/search\" mu-target=\"#results\" mu-source=\"#results\"\n *          mu-mode=\"update\">\n *\n * Example \u2014 polling every 5 seconds:\n *\n *   <div mu-trigger=\"load\" mu-repeat=\"5000\"\n *        mu-url=\"/notifications\" mu-target=\"#notifs\" mu-mode=\"update\">\n *   </div>\n *\n * Example \u2014 action on focus:\n *\n *   <input type=\"text\" mu-trigger=\"focus\"\n *          mu-url=\"/suggestions\" mu-target=\"#suggestions\"\n *          mu-mode=\"update\">\n *\n * Triggers other than click/submit default to history=false, scroll=false.\n *\n *\n * ============================================================================\n * 16. SERVER-SENT EVENTS (SSE)\n * ============================================================================\n *\n * \u00B5JS supports Server-Sent Events via mu-method=\"sse\". This opens an\n * EventSource connection to the given URL. Each incoming message is\n * treated as HTML and rendered according to the element's mode.\n *\n * Example \u2014 real-time chat with patch mode:\n *\n *   <div mu-trigger=\"load\" mu-url=\"/chat/stream\"\n *        mu-mode=\"patch\" mu-method=\"sse\">\n *   </div>\n *\n * The server sends SSE messages where each data payload is HTML containing\n * patch fragments (with mu-patch-target attributes).\n *\n * Limitations:\n *   - EventSource does not support custom HTTP headers. Use query\n *     parameters for authentication or identification.\n *   - Browser limit: ~6 SSE connections per domain in HTTP/1.1.\n *     Use HTTP/2 to avoid this limit.\n *   - SSE connections are automatically closed when the element is\n *     removed from the DOM (via _cleanupTriggers).\n *\n *\n * ============================================================================\n * 17. PROGRAMMATIC USAGE\n * ============================================================================\n *\n *   // Load a page\n *   mu.load(\"/page\", { history: false, target: \"#content\" });\n *\n *   // Get last loaded URL\n *   mu.getLastUrl();\n *\n *   // Get previous URL\n *   mu.getPreviousUrl();\n *\n *   // Enable/disable quit-page confirmation\n *   mu.setConfirmQuit(true);\n *   mu.setConfirmQuit(false);\n *\n *   // Register a custom morph function\n *   mu.setMorph(myMorphFunction);\n *\n */\nvar mu = mu || new function() {\n\t/* ********** CONSTANTS ********** */\n\t/** @type {string} Library version. */\n\tthis._VERSION = \"1.4.6\";\n\n\t/* ********** DEFAULT CONFIGURATION ********** */\n\t/**\n\t * Default configuration values.\n\t * Overridden by the object passed to mu.init().\n\t * @type {Object}\n\t */\n\tthis._defaults = {\n\t\t/** @type {boolean} Process <a> tags. */\n\t\tprocessLinks: true,\n\t\t/** @type {boolean} Process <form> tags. */\n\t\tprocessForms: true,\n\t\t/** @type {boolean} Add URL to browser history. */\n\t\thistory: true,\n\t\t/** @type {string} Default injection mode. */\n\t\tmode: \"replace\",\n\t\t/** @type {string} Default target CSS selector. */\n\t\ttarget: \"body\",\n\t\t/** @type {string} Default source CSS selector. */\n\t\tsource: \"body\",\n\t\t/** @type {string} Title selector (\"selector\" or \"selector/attribute\"). */\n\t\ttitle: \"title\",\n\t\t/** @type {boolean|null} Scroll to top. null = auto (true). */\n\t\tscroll: null,\n\t\t/** @type {string|null} Prefix added to fetched URLs. */\n\t\turlPrefix: null,\n\t\t/** @type {boolean} Show progress bar during fetch. */\n\t\tprogress: true,\n\t\t/** @type {boolean} Prefetch pages on link hover. */\n\t\tprefetch: true,\n\t\t/** @type {number} Prefetch cache TTL in milliseconds. */\n\t\tprefetchTtl: 3000,\n\t\t/** @type {boolean} Enable DOM morphing when a morph lib is available. */\n\t\tmorph: true,\n\t\t/** @type {boolean} Enable View Transitions API. */\n\t\ttransition: true,\n\t\t/** @type {string} Confirmation message before leaving a modified form. */\n\t\tconfirmQuitText: \"Are you sure you want to leave this page?\"\n\t};\n\n\t/* ********** INTERNAL STATE ********** */\n\t/** @type {Object} Active configuration (defaults merged with init params). */\n\tthis._cfg = {};\n\t/** @type {string|null} Last URL loaded by \u00B5JS. */\n\tthis._lastUrl = null;\n\t/** @type {string|null} URL before the last one. */\n\tthis._previousUrl = null;\n\t/** @type {AbortController|null} Controller for the current in-flight request. */\n\tthis._abortCtrl = null;\n\t/** @type {Element|null} Progress bar DOM element. */\n\tthis._progressEl = null;\n\t/** @type {Map} Prefetch cache (url => {html, ts} object or null if in-flight). */\n\tthis._prefetchCache = new Map();\n\t/** @type {number|null} Pending prefetch timer (setTimeout ID). */\n\tthis._prefetchTimer = null;\n\t/** @type {boolean} True if quit-page confirmation is active. */\n\tthis._confirmQuit = false;\n\t/** @type {Object} Map of already-loaded external script URLs. */\n\tthis._jsIncludes = {};\n\t/** @type {Function|null} Morph function. Auto-detected or set via setMorph(). */\n\tthis._morph = null;\n\t/** @type {boolean} True after first init() call. Prevents duplicate listeners. */\n\tthis._initialized = false;\n\t/** @type {Element|null} Last clicked submit button (fallback for e.submitter). */\n\tthis._submitter = null;\n\n\t/* ********** INITIALIZATION ********** */\n\t/**\n\t * Initialize \u00B5JS.\n\t * Sets up event delegation and merges configuration.\n\t * Should be called once when the page loads.\n\t * @param\t{Object}\t[params]\tConfiguration overrides (see _defaults).\n\t */\n\tthis.init = function(params) {\n\t\tmu._cfg = Object.assign({}, mu._defaults, params || {});\n\t\t// Parse title selector (supports \"selector/attribute\" syntax)\n\t\tmu._cfg._titleAttr = null;\n\t\tif (mu._cfg.title) {\n\t\t\tvar pos = mu._cfg.title.lastIndexOf(\"/\");\n\t\t\tif (pos !== -1) {\n\t\t\t\tmu._cfg._titleAttr = mu._cfg.title.substring(pos + 1);\n\t\t\t\tmu._cfg.title = mu._cfg.title.substring(0, pos);\n\t\t\t}\n\t\t}\n\t\t// Auto-detect idiomorph\n\t\tif (!mu._morph && typeof window.Idiomorph !== \"undefined\" && typeof window.Idiomorph.morph === \"function\") {\n\t\t\tmu._morph = function(target, html, opts) {\n\t\t\t\twindow.Idiomorph.morph(target, html, opts);\n\t\t\t};\n\t\t}\n\t\t// Pre-populate _jsIncludes with scripts already on the page.\n\t\t// Prevents _runScripts from re-downloading them on navigation.\n\t\tvar existingScripts = document.querySelectorAll(\"script[src]\");\n\t\tfor (var i = 0; i < existingScripts.length; i++)\n\t\t\tmu._jsIncludes[existingScripts[i].getAttribute(\"src\")] = true;\n\t\t// Event delegation (attached once, works for all current and future elements)\n\t\tif (!mu._initialized) {\n\t\t\tdocument.addEventListener(\"click\", mu._onClick);\n\t\t\tdocument.addEventListener(\"submit\", mu._onSubmit);\n\t\t\tdocument.addEventListener(\"mouseover\", mu._onMouseOver);\n\t\t\tdocument.addEventListener(\"mouseout\", mu._onMouseOut);\n\t\t\tdocument.addEventListener(\"input\", mu._onInput);\n\t\t\twindow.addEventListener(\"popstate\", mu._onPopState);\n\t\t\twindow.addEventListener(\"beforeunload\", mu._onBeforeUnload);\n\t\t\tmu._initialized = true;\n\t\t}\n\t\t// Save initial history state\n\t\twindow.history.replaceState({mu: true, url: location.pathname + location.search}, \"\");\n\t\t// Initialize triggers for elements already on the page\n\t\tif (document.body)\n\t\t\tmu._initTriggers(document.body);\n\t\t// If DOM is still loading, re-scan once parsing is complete.\n\t\t// Covers the case where init() is called from <head> or early in <body>\n\t\t// before trigger elements (mu-trigger=\"load\", etc.) are parsed.\n\t\t// The _mu_bound flag on each element prevents duplicate binding.\n\t\tif (document.readyState === \"loading\") {\n\t\t\tdocument.addEventListener(\"DOMContentLoaded\", function() {\n\t\t\t\tmu._initTriggers(document.body);\n\t\t\t});\n\t\t}\n\t\t// Emit init event\n\t\tmu._emit(\"mu:init\", {url: location.pathname + location.search});\n\t};\n\n\t/* ********** PUBLIC API ********** */\n\t/**\n\t * Programmatic page load.\n\t * @param\t{string}\turl\tURL to load.\n\t * @param\t{Object}\t[opts]\tPer-load configuration overrides.\n\t */\n\tthis.load = function(url, opts) {\n\t\tvar cfg = Object.assign({}, mu._cfg, opts || {});\n\t\tmu._loadExec(mu._resolveUrl(url) || url, cfg);\n\t};\n\t/**\n\t * Get the last URL loaded by \u00B5JS.\n\t * @return\t{string|null}\tThe last URL, or null if \u00B5JS hasn't loaded a page yet.\n\t */\n\tthis.getLastUrl = function() {\n\t\treturn (mu._lastUrl);\n\t};\n\t/**\n\t * Get the URL before the last one.\n\t * @return\t{string|null}\tThe previous URL, or null.\n\t */\n\tthis.getPreviousUrl = function() {\n\t\treturn (mu._previousUrl);\n\t};\n\t/**\n\t * Enable or disable quit-page confirmation.\n\t * When enabled, navigating away from the page prompts the user.\n\t * @param\t{boolean}\tval\tTrue to enable, false to disable.\n\t */\n\tthis.setConfirmQuit = function(val) {\n\t\tmu._confirmQuit = !!val;\n\t};\n\t/**\n\t * Register a custom morph function.\n\t * The function receives (targetElement, htmlString, options).\n\t * Options object may contain {morphStyle: \"innerHTML\"|\"outerHTML\"}.\n\t * @param\t{Function}\tfn\tMorph function.\n\t */\n\tthis.setMorph = function(fn) {\n\t\tmu._morph = fn;\n\t};\n\n\t/* ********** ATTRIBUTE HELPERS ********** */\n\t/**\n\t * Read an attribute with mu-* / data-mu-* fallback.\n\t * Tries mu-{name} first, then data-mu-{name}.\n\t * @param\t{Element}\tel\tDOM element.\n\t * @param\t{string}\tname\tAttribute name (without prefix).\n\t * @return\t{string|null}\tAttribute value, or null if not found.\n\t */\n\tthis._attr = function(el, name) {\n\t\tif (el.hasAttribute(\"mu-\" + name))\n\t\t\treturn (el.getAttribute(\"mu-\" + name));\n\t\tif (el.hasAttribute(\"data-mu-\" + name))\n\t\t\treturn (el.getAttribute(\"data-mu-\" + name));\n\t\treturn (null);\n\t};\n\t/**\n\t * Read a boolean attribute with fallback.\n\t * Returns true for values \"\" or \"true\", false for \"false\".\n\t * @param\t{Element}\tel\t\tDOM element.\n\t * @param\t{string}\tname\t\tAttribute name (without prefix).\n\t * @param\t{boolean}\tfallback\tDefault value if attribute is absent.\n\t * @return\t{boolean}\n\t */\n\tthis._attrBool = function(el, name, fallback) {\n\t\tvar v = mu._attr(el, name);\n\t\tif (v === null)\n\t\t\treturn (fallback);\n\t\tif (v === \"\" || v === \"true\")\n\t\t\treturn (true);\n\t\tif (v === \"false\")\n\t\t\treturn (false);\n\t\treturn (fallback);\n\t};\n\n\t/**\n\t * Resolve a target selector containing \"&\" (relative target).\n\t * The \"&\" is replaced by the source element's ID selector.\n\t * If the source element has no ID, one is auto-generated.\n\t * @param\t{string}\tselector\tCSS selector, possibly containing \"&\".\n\t * @param\t{Element}\tsourceEl\tTrigger element (cfg._sourceElement).\n\t * @return\t{string}\tResolved CSS selector.\n\t */\n\tthis._resolveTarget = function(selector, sourceEl) {\n\t\tif (!selector || selector.indexOf(\"&\") === -1 || !sourceEl)\n\t\t\treturn (selector);\n\t\tif (!sourceEl.id)\n\t\t\tsourceEl.id = \"mu-\" + Math.random().toString(36).slice(2);\n\t\treturn (selector.replace(/&/g, \"#\" + sourceEl.id));\n\t};\n\n\t/* ********** URL RESOLUTION ********** */\n\t/**\n\t * Resolve a URL to a local path.\n\t * Handles relative URLs (../page.html, page.html), absolute same-origin URLs\n\t * (https://same-domain.com/page), and local paths (/page).\n\t * Returns null for external URLs, hash-only links, and invalid URLs.\n\t * @param\t{string}\turl\tRaw URL from href, action, or mu-url attribute.\n\t * @return\t{string|null}\tLocal path (e.g. \"/page\") or null if external/invalid.\n\t */\n\tthis._resolveUrl = function(url) {\n\t\t// Skip empty URLs and hash-only URLs\n\t\tif (!url || url.charAt(0) === \"#\")\n\t\t\treturn (null);\n\t\t// Fast path: already a local path (starts with \"/\" but not \"//\")\n\t\tif (url.charAt(0) === \"/\" && url.charAt(1) !== \"/\")\n\t\t\treturn (url);\n\t\t// Resolve relative or absolute URLs\n\t\ttry {\n\t\t\tvar parsed = new URL(url, document.baseURI);\n\t\t\tif (parsed.origin === window.location.origin)\n\t\t\t\treturn (parsed.pathname + parsed.search + parsed.hash);\n\t\t} catch(e) {}\n\t\treturn (null);\n\t};\n\n\t/* ********** ELEMENT FILTERING ********** */\n\t/**\n\t * Determine if an element should be intercepted by \u00B5JS.\n\t * Checks for disabled state, target/download attributes, onclick/onsubmit handlers,\n\t * and URL (must be same-origin: local paths, relative URLs, or absolute same-domain).\n\t * @param\t{Element}\tel\tDOM element (<a> or <form>).\n\t * @return\t{boolean}\tTrue if \u00B5JS should handle this element.\n\t */\n\tthis._shouldProcess = function(el) {\n\t\t// Explicitly disabled\n\t\tif (mu._attr(el, \"disabled\") === \"true\" || mu._attr(el, \"disabled\") === \"\")\n\t\t\treturn (false);\n\t\tif (el.getAttribute(\"mu\") === \"false\" || el.getAttribute(\"data-mu\") === \"false\")\n\t\t\treturn (false);\n\t\t// Has target attribute (opens in new window/frame)\n\t\tif (el.hasAttribute(\"target\"))\n\t\t\treturn (false);\n\t\t// Has download attribute (triggers file download)\n\t\tif (el.hasAttribute(\"download\"))\n\t\t\treturn (false);\n\t\t// Links: skip if has onclick handler\n\t\tif (el.tagName === \"A\" && el.hasAttribute(\"onclick\"))\n\t\t\treturn (false);\n\t\t// Forms: skip if has onsubmit handler\n\t\tif (el.tagName === \"FORM\" && el.hasAttribute(\"onsubmit\"))\n\t\t\treturn (false);\n\t\t// Explicitly enabled (overrides URL check)\n\t\tif (el.getAttribute(\"mu\") === \"true\" || el.getAttribute(\"data-mu\") === \"true\")\n\t\t\treturn (true);\n\t\t// Elements with mu-url: check the mu-url value instead of href/action\n\t\tvar muUrl = mu._attr(el, \"url\");\n\t\tif (muUrl !== null)\n\t\t\treturn (mu._resolveUrl(muUrl) !== null);\n\t\t// Check URL: must be same-origin (local path, relative, or absolute same-domain)\n\t\tvar url = el.getAttribute(\"href\") || el.getAttribute(\"action\") || \"\";\n\t\treturn (mu._resolveUrl(url) !== null);\n\t};\n\n\t/* ********** ELEMENT CONFIGURATION ********** */\n\t/**\n\t * Build the effective configuration for a given element.\n\t * Merges global config with element-level mu-* attributes.\n\t * @param\t{Element}\tel\tDOM element (<a> or <form>).\n\t * @return\t{Object}\tMerged configuration object.\n\t */\n\tthis._elemCfg = function(el) {\n\t\tvar cfg = Object.assign({}, mu._cfg);\n\t\tvar v;\n\t\tif ((v = mu._attr(el, \"mode\")) !== null)\n\t\t\tcfg.mode = v;\n\t\tif ((v = mu._attr(el, \"target\")) !== null)\n\t\t\tcfg.target = v;\n\t\tif ((v = mu._attr(el, \"source\")) !== null)\n\t\t\tcfg.source = v;\n\t\tif ((v = mu._attr(el, \"title\")) !== null) {\n\t\t\tcfg.title = v;\n\t\t\tcfg._titleAttr = null;\n\t\t\tvar pos = v.lastIndexOf(\"/\");\n\t\t\tif (pos !== -1) {\n\t\t\t\tcfg._titleAttr = v.substring(pos + 1);\n\t\t\t\tcfg.title = v.substring(0, pos);\n\t\t\t}\n\t\t}\n\t\tif ((v = mu._attr(el, \"url\")) !== null)\n\t\t\tcfg._url = v;\n\t\tif ((v = mu._attr(el, \"prefix\")) !== null)\n\t\t\tcfg.urlPrefix = v;\n\t\tcfg.history = mu._attrBool(el, \"history\", cfg.history);\n\t\tcfg.scroll = mu._attrBool(el, \"scroll\", cfg.scroll);\n\t\tcfg.morph = mu._attrBool(el, \"morph\", cfg.morph);\n\t\tcfg.transition = mu._attrBool(el, \"transition\", cfg.transition);\n\t\t// mu-method (get, post, put, patch, delete, sse)\n\t\tif ((v = mu._attr(el, \"method\")) !== null)\n\t\t\tcfg.method = v.toLowerCase();\n\t\tcfg.confirm = mu._attr(el, \"confirm\");\n\t\tcfg.patchHistory = mu._attrBool(el, \"patch-history\", false);\n\t\t// Mode-based defaults: non-navigation modes default to no history, no scroll\n\t\tif (cfg.mode !== \"replace\" && cfg.mode !== \"update\" && cfg.mode !== \"patch\") {\n\t\t\tif (mu._attr(el, \"history\") === null)\n\t\t\t\tcfg.history = false;\n\t\t\tif (mu._attr(el, \"scroll\") === null && cfg.scroll === null)\n\t\t\t\tcfg.scroll = false;\n\t\t}\n\t\treturn (cfg);\n\t};\n\n\t/* ********** EVENT HANDLERS ********** */\n\t/**\n\t * Click handler (event delegation on document).\n\t * Intercepts clicks on <a> elements that pass _shouldProcess().\n\t * Modifier keys (ctrl, meta, shift, alt) are ignored to allow\n\t * native browser behavior (open in new tab, etc.).\n\t * @param\t{MouseEvent}\te\tClick event.\n\t */\n\tthis._onClick = function(e) {\n\t\t// Track submit button (fallback for e.submitter on older browsers)\n\t\tmu._submitter = e.target.closest(\"button, input[type='submit'], input[type='image']\");\n\t\tvar el = e.target.closest(\"[mu-url], [data-mu-url], a\");\n\t\tif (!el || !mu._shouldProcess(el))\n\t\t\treturn;\n\t\t// Check trigger: only process if effective trigger is \"click\"\n\t\tif (mu._getTrigger(el) !== \"click\")\n\t\t\treturn;\n\t\t// Links: check processLinks config\n\t\tif (el.tagName === \"A\" && !mu._cfg.processLinks)\n\t\t\treturn;\n\t\t// Modifier keys: let browser handle (new tab, etc.)\n\t\tif (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey)\n\t\t\treturn;\n\t\tvar cfg = mu._elemCfg(el);\n\t\tvar url = mu._resolveUrl(cfg._url || el.getAttribute(\"href\"));\n\t\tif (!url)\n\t\t\treturn;\n\t\te.preventDefault();\n\t\tcfg._sourceElement = el;\n\t\t// Default to GET if no method specified\n\t\tif (!cfg.method)\n\t\t\tcfg.method = \"get\";\n\t\t// Confirmation dialog\n\t\tif (cfg.confirm && !window.confirm(cfg.confirm))\n\t\t\treturn;\n\t\t// Quit page confirmation\n\t\tif (mu._confirmQuit) {\n\t\t\tif (!window.confirm(cfg.confirmQuitText))\n\t\t\t\treturn;\n\t\t\tmu.setConfirmQuit(false);\n\t\t}\n\t\t// Non-GET clicks: no history by default\n\t\tif (cfg.method !== \"get\") {\n\t\t\tif (mu._attr(el, \"history\") === null)\n\t\t\t\tcfg.history = false;\n\t\t}\n\t\t// SSE mode\n\t\tif (cfg.method === \"sse\") {\n\t\t\tmu._openSSE(url, el, cfg);\n\t\t\treturn;\n\t\t}\n\t\tmu._loadExec(url, cfg);\n\t};\n\t/**\n\t * Form submit handler (event delegation on document).\n\t * Intercepts submissions of <form> elements that pass _shouldProcess().\n\t * Runs HTML5 validation and optional custom validation before fetching.\n\t * GET forms: data serialized as query string.\n\t * POST forms: data sent as URL-encoded (or FormData for file uploads),\n\t * history disabled by default.\n\t * @param\t{SubmitEvent}\te\tSubmit event.\n\t */\n\tthis._onSubmit = function(e) {\n\t\tvar form = e.target.closest(\"form\");\n\t\tif (!form || !mu._cfg.processForms || !mu._shouldProcess(form))\n\t\t\treturn;\n\t\t// Check trigger: only process if effective trigger is \"submit\"\n\t\tif (mu._getTrigger(form) !== \"submit\")\n\t\t\treturn;\n\t\t// HTML5 validation\n\t\tif (!form.reportValidity())\n\t\t\treturn;\n\t\t// Custom validation via mu-validate attribute\n\t\tvar validator = mu._attr(form, \"validate\");\n\t\tif (validator && typeof window[validator] === \"function\") {\n\t\t\tif (!window[validator](form))\n\t\t\t\treturn;\n\t\t}\n\t\tvar cfg = mu._elemCfg(form);\n\t\t// Determine method: mu-method takes priority, then form's method attribute\n\t\tvar method = cfg.method || (form.getAttribute(\"method\") || \"get\").toLowerCase();\n\t\tcfg.method = method;\n\t\tvar url = mu._resolveUrl(cfg._url || form.getAttribute(\"action\"));\n\t\tif (!url)\n\t\t\treturn;\n\t\tcfg._sourceElement = form;\n\t\te.preventDefault();\n\t\tvar formData = new FormData(form);\n\t\tvar submitter = e.submitter || mu._submitter;\n\t\tif (submitter && submitter.form === form && submitter.name) {\n\t\t\tformData.append(submitter.name, submitter.value || \"\");\n\t\t}\n\t\tif (method === \"get\") {\n\t\t\tvar qs = new URLSearchParams(formData).toString();\n\t\t\turl = url + \"?\" + qs;\n\t\t} else {\n\t\t\tcfg.postData = (form.enctype === \"multipart/form-data\")\n\t\t\t               ? formData\n\t\t\t               : new URLSearchParams(formData);\n\t\t\t// Non-GET forms: no history by default, scroll to top in navigation mode\n\t\t\tif (mu._attr(form, \"history\") === null)\n\t\t\t\tcfg.history = false;\n\t\t\tif (cfg.scroll === null && cfg.mode !== \"patch\")\n\t\t\t\tcfg.scroll = true;\n\t\t}\n\t\t// Quit page confirmation: disable after submission\n\t\tmu.setConfirmQuit(false);\n\t\tmu._loadExec(url, cfg);\n\t};\n\t/**\n\t * Input handler for quit-page confirmation tracking.\n\t * Activated by event delegation on document. Listens for any input event\n\t * inside a form that has the mu-confirm-quit attribute.\n\t * @param\t{InputEvent}\te\tInput event.\n\t */\n\tthis._onInput = function(e) {\n\t\tvar form = e.target.closest(\"form[mu-confirm-quit], form[data-mu-confirm-quit]\");\n\t\tif (form)\n\t\t\tmu.setConfirmQuit(true);\n\t};\n\t/**\n\t * Mouseover handler for link prefetch.\n\t * Waits 50ms before fetching to filter out accidental hover-throughs.\n\t * The result is stored in _prefetchCache and consumed on click.\n\t * Skips prefetch if the link points to the current page.\n\t * @param\t{MouseEvent}\te\tMouseover event.\n\t */\n\tthis._onMouseOver = function(e) {\n\t\tif (!mu._cfg.prefetch)\n\t\t\treturn;\n\t\tvar el = e.target.closest(\"[mu-url], [data-mu-url], a\");\n\t\tif (!el || !mu._shouldProcess(el))\n\t\t\treturn;\n\t\t// Only prefetch elements with click trigger (not load, change, etc.)\n\t\tif (mu._getTrigger(el) !== \"click\")\n\t\t\treturn;\n\t\t// Only prefetch GET requests (never prefetch post, put, patch, delete, sse)\n\t\tvar method = mu._attr(el, \"method\");\n\t\tif (method && method.toLowerCase() !== \"get\")\n\t\t\treturn;\n\t\tif (mu._attrBool(el, \"prefetch\", true) === false)\n\t\t\treturn;\n\t\tvar url = mu._resolveUrl(mu._attr(el, \"url\") || el.getAttribute(\"href\"));\n\t\tif (!url)\n\t\t\treturn;\n\t\t// Skip if already in-flight or still fresh (within TTL)\n\t\tvar existing = mu._prefetchCache.get(url);\n\t\tif (existing && (Date.now() - existing.ts) < mu._cfg.prefetchTtl)\n\t\t\treturn;\n\t\t// Skip if destination is the current page\n\t\tif (url === location.pathname + location.search)\n\t\t\treturn;\n\t\t// Cancel any pending prefetch timer\n\t\tclearTimeout(mu._prefetchTimer);\n\t\t// Delay prefetch by 50ms to filter accidental hover-throughs\n\t\tmu._prefetchTimer = setTimeout(function() {\n\t\t\tmu._prefetchTimer = null;\n\t\t\t// Re-check cache (may have been populated during the delay)\n\t\t\tvar cached = mu._prefetchCache.get(url);\n\t\t\tif (cached && (Date.now() - cached.ts) < mu._cfg.prefetchTtl)\n\t\t\t\treturn;\n\t\t\t// Store the fetch promise so _loadExec can await it (even if still in-flight)\n\t\t\tvar fetchUrl = mu._cfg.urlPrefix ? mu._cfg.urlPrefix + url : url;\n\t\t\tvar promise = fetch(fetchUrl, {\n\t\t\t\theaders: {\"X-Requested-With\": \"XMLHttpRequest\", \"X-Mu-Prefetch\": \"1\"},\n\t\t\t\tpriority: \"low\"\n\t\t\t})\n\t\t\t.then(function(r) { return (r.ok ? r.text() : null); })\n\t\t\t.catch(function() { return (null); });\n\t\t\tmu._prefetchCache.set(url, {promise: promise, ts: Date.now()});\n\t\t}, 50);\n\t};\n\t/**\n\t * Mouseout handler. Cancels pending prefetch timer.\n\t * Prefetch cache entries are NOT deleted on mouseout. The TTL mechanism\n\t * in _loadExec handles expiration, and _onMouseOver handles stale entries.\n\t * @param\t{MouseEvent}\te\tMouseout event.\n\t */\n\tthis._onMouseOut = function(e) {\n\t\tif (mu._prefetchTimer) {\n\t\t\tclearTimeout(mu._prefetchTimer);\n\t\t\tmu._prefetchTimer = null;\n\t\t}\n\t};\n\t/**\n\t * Popstate handler (browser back/forward buttons).\n\t * Reloads the page from the stored history state.\n\t * If no \u00B5JS state is found, falls back to native browser navigation.\n\t * Restores scroll position after rendering if available in state.\n\t * @param\t{PopStateEvent}\te\tPopState event.\n\t */\n\tthis._onPopState = function(e) {\n\t\tvar state = e.state;\n\t\tif (!state || !state.mu)\n\t\t\treturn;\n\t\tvar cfg = Object.assign({}, mu._cfg);\n\t\tcfg.history = false;\n\t\tcfg.scroll = false; // don't auto-scroll, we restore manually\n\t\tcfg._popstate = true; // skip _saveScroll (wrong history entry during popstate)\n\t\tcfg._restoreScroll = state.scrollX !== undefined ? {x: state.scrollX, y: state.scrollY} : null;\n\t\tmu._loadExec(state.url, cfg);\n\t};\n\t/**\n\t * Before-unload handler for quit-page confirmation.\n\t * Shows a browser-native confirmation dialog if _confirmQuit is true.\n\t * @param\t{BeforeUnloadEvent}\te\tBeforeUnload event.\n\t */\n\tthis._onBeforeUnload = function(e) {\n\t\tif (mu._confirmQuit) {\n\t\t\te.preventDefault();\n\t\t\te.returnValue = mu._cfg.confirmQuitText;\n\t\t}\n\t};\n\n\t/* ********** TRIGGERS ********** */\n\t/**\n\t * Determine the effective trigger event for an element.\n\t * Returns the mu-trigger attribute value if set, otherwise a default\n\t * based on the element's tag name.\n\t * @param\t{Element}\tel\tDOM element.\n\t * @return\t{string}\tTrigger name (click, submit, change, blur, focus, load).\n\t */\n\tthis._getTrigger = function(el) {\n\t\t// check given trigger\n\t\tvar t = mu._attr(el, \"trigger\");\n\t\tif (t)\n\t\t\treturn (t);\n\t\t// default trigger from tag name\n\t\tt = el.tagName;\n\t\tif (t === \"FORM\")\n\t\t\treturn (\"submit\");\n\t\tif (t === \"INPUT\" || t === \"TEXTAREA\" || t === \"SELECT\")\n\t\t\treturn (\"change\");\n\t\treturn (\"click\");\n\t};\n\t/**\n\t * Create a debounced version of a function.\n\t * The returned function delays invocation until after `delay` milliseconds\n\t * have elapsed since the last call.\n\t * @param\t{Function}\tfn\t\tFunction to debounce.\n\t * @param\t{number}\tdelay\tDelay in milliseconds.\n\t * @return\t{Function}\tDebounced function.\n\t */\n\tthis._debounce = function(fn, delay) {\n\t\tvar timer = null;\n\t\treturn function() {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = setTimeout(fn, delay);\n\t\t};\n\t};\n\t/**\n\t * Execute a trigger action for an element.\n\t * Builds configuration, determines URL and method, serializes input\n\t * data, then calls _loadExec or _openSSE as appropriate.\n\t * Used by change, blur, focus, and load triggers.\n\t * @param\t{Element}\tel\tDOM element with mu-url.\n\t */\n\tthis._triggerAction = function(el) {\n\t\tif (!mu._shouldProcess(el))\n\t\t\treturn;\n\t\tvar cfg = mu._elemCfg(el);\n\t\tvar url = mu._resolveUrl(cfg._url || el.getAttribute(\"href\") || el.getAttribute(\"action\"));\n\t\tif (!url)\n\t\t\treturn;\n\t\tcfg._sourceElement = el;\n\t\t// Mark as trigger load (not a navigation)\n\t\tcfg._trigger = true;\n\t\t// No view transitions for partial trigger loads\n\t\tcfg.transition = false;\n\t\t// Default to GET\n\t\tif (!cfg.method)\n\t\t\tcfg.method = \"get\";\n\t\t// Non-click/submit triggers default to no history, no scroll\n\t\tif (mu._attr(el, \"history\") === null)\n\t\t\tcfg.history = false;\n\t\tif (mu._attr(el, \"scroll\") === null && cfg.scroll === null)\n\t\t\tcfg.scroll = false;\n\t\t// Serialize form data for input elements\n\t\tvar t = el.tagName;\n\t\tif (t === \"INPUT\" || t === \"TEXTAREA\" || t === \"SELECT\") {\n\t\t\tvar form = el.closest(\"form\");\n\t\t\tif (form) {\n\t\t\t\tif (cfg.method === \"get\") {\n\t\t\t\t\tvar formData = new FormData(form);\n\t\t\t\t\tvar qs = new URLSearchParams(formData).toString();\n\t\t\t\t\turl = url.split(\"?\")[0] + \"?\" + qs;\n\t\t\t\t} else {\n\t\t\t\t\tcfg.postData = (form.enctype === \"multipart/form-data\")\n\t\t\t\t\t               ? new FormData(form)\n\t\t\t\t\t               : new URLSearchParams(new FormData(form));\n\t\t\t\t}\n\t\t\t} else if (el.name) {\n\t\t\t\tif (cfg.method === \"get\") {\n\t\t\t\t\turl = url.split(\"?\")[0] + \"?\" + encodeURIComponent(el.name) + \"=\" + encodeURIComponent(el.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// SSE mode\n\t\tif (cfg.method === \"sse\") {\n\t\t\tmu._openSSE(url, el, cfg);\n\t\t\treturn;\n\t\t}\n\t\tmu._loadExec(url, cfg);\n\t};\n\t/**\n\t * Initialize trigger listeners on elements within a container.\n\t * Scans for elements with mu-url or mu-trigger and attaches event\n\t * listeners for triggers not handled by event delegation (change,\n\t * blur, focus, load). Handles debounce and repeat (polling).\n\t * Elements are marked with _mu_bound to prevent duplicate binding.\n\t * @param\t{Element}\tcontainer\tDOM element to scan.\n\t */\n\tthis._initTriggers = function(container) {\n\t\tvar els = container.querySelectorAll(\"[mu-url], [data-mu-url], [mu-trigger], [data-mu-trigger]\");\n\t\t// Also check the container itself\n\t\tif (container.matches && container.matches(\"[mu-url], [data-mu-url], [mu-trigger], [data-mu-trigger]\")) {\n\t\t\tvar tmp = [container];\n\t\t\tfor (var j = 0; j < els.length; j++)\n\t\t\t\ttmp.push(els[j]);\n\t\t\tels = tmp;\n\t\t}\n\t\tfor (var i = 0; i < els.length; i++) {\n\t\t\tvar el = els[i];\n\t\t\tif (el._mu_bound)\n\t\t\t\tcontinue;\n\t\t\tvar trigger = mu._getTrigger(el);\n\t\t\t// click and submit are handled by event delegation\n\t\t\tif (trigger === \"click\" || trigger === \"submit\")\n\t\t\t\tcontinue;\n\t\t\t// Element must have a URL to be actionable\n\t\t\tvar url = mu._attr(el, \"url\") || el.getAttribute(\"href\") || el.getAttribute(\"action\");\n\t\t\tif (!url)\n\t\t\t\tcontinue;\n\t\t\tel._mu_bound = true;\n\t\t\tvar debounceMs = parseInt(mu._attr(el, \"debounce\"), 10) || 0;\n\t\t\tvar repeatMs = parseInt(mu._attr(el, \"repeat\"), 10) || 0;\n\t\t\t// Build the base handler\n\t\t\tvar handler = (function(targetEl) {\n\t\t\t\treturn function() { mu._triggerAction(targetEl); };\n\t\t\t})(el);\n\t\t\t// Apply debounce if specified\n\t\t\tif (debounceMs > 0)\n\t\t\t\thandler = mu._debounce(handler, debounceMs);\n\t\t\t// Wrap with repeat (polling) if specified\n\t\t\tif (repeatMs > 0) {\n\t\t\t\thandler = (function(targetEl, fn, ms) {\n\t\t\t\t\tvar started = false;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tfn();\n\t\t\t\t\t\tif (!started) {\n\t\t\t\t\t\t\tstarted = true;\n\t\t\t\t\t\t\ttargetEl._mu_interval = setInterval(fn, ms);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t})(el, handler, repeatMs);\n\t\t\t}\n\t\t\t// Attach event listener(s) based on trigger type\n\t\t\tif (trigger === \"change\") {\n\t\t\t\tel.addEventListener(\"input\", handler);\n\t\t\t} else if (trigger === \"blur\") {\n\t\t\t\t// Deduplicate change+blur firing close together\n\t\t\t\tvar dedupHandler = (function(fn) {\n\t\t\t\t\tvar lastFired = 0;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tvar now = Date.now();\n\t\t\t\t\t\tif (now - lastFired < 50)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tlastFired = now;\n\t\t\t\t\t\tfn();\n\t\t\t\t\t};\n\t\t\t\t})(handler);\n\t\t\t\tel.addEventListener(\"change\", dedupHandler);\n\t\t\t\tel.addEventListener(\"blur\", dedupHandler);\n\t\t\t} else if (trigger === \"focus\") {\n\t\t\t\tel.addEventListener(\"focus\", handler);\n\t\t\t} else if (trigger === \"load\") {\n\t\t\t\thandler();\n\t\t\t}\n\t\t}\n\t};\n\t/**\n\t * Clean up trigger-related resources within a container.\n\t * Clears polling intervals and closes SSE connections on elements\n\t * that are about to be removed from the DOM.\n\t * @param\t{Element}\tcontainer\tDOM element to clean up.\n\t */\n\tthis._cleanupTriggers = function(container) {\n\t\tvar els = container.querySelectorAll ? container.querySelectorAll(\"*\") : [];\n\t\tfor (var i = 0; i < els.length; i++) {\n\t\t\tif (els[i]._mu_interval) {\n\t\t\t\tclearInterval(els[i]._mu_interval);\n\t\t\t\tels[i]._mu_interval = null;\n\t\t\t}\n\t\t\tif (els[i]._mu_sse) {\n\t\t\t\tels[i]._mu_sse.close();\n\t\t\t\tels[i]._mu_sse = null;\n\t\t\t}\n\t\t\tels[i]._mu_bound = false;\n\t\t}\n\t\t// Also check the container itself\n\t\tif (container._mu_interval) {\n\t\t\tclearInterval(container._mu_interval);\n\t\t\tcontainer._mu_interval = null;\n\t\t}\n\t\tif (container._mu_sse) {\n\t\t\tcontainer._mu_sse.close();\n\t\t\tcontainer._mu_sse = null;\n\t\t}\n\t\tcontainer._mu_bound = false;\n\t};\n\t/**\n\t * Open a Server-Sent Events connection.\n\t * Creates an EventSource for the given URL. Incoming messages are\n\t * parsed as HTML and rendered via _renderPatch or _renderPage.\n\t * The connection is stored on the element for cleanup.\n\t * Note: EventSource does not support custom headers. Use query\n\t * parameters for authentication or identification.\n\t * @param\t{string}\turl\tSSE endpoint URL.\n\t * @param\t{Element}\tel\tDOM element that initiated the connection.\n\t * @param\t{Object}\tcfg\tEffective configuration.\n\t */\n\tthis._openSSE = function(url, el, cfg) {\n\t\t// Close existing connection on this element\n\t\tif (el._mu_sse)\n\t\t\tel._mu_sse.close();\n\t\tvar fetchUrl = cfg.urlPrefix ? cfg.urlPrefix + url : url;\n\t\tvar source = new EventSource(fetchUrl);\n\t\tel._mu_sse = source;\n\t\tsource.onmessage = function(e) {\n\t\t\tvar detail = {url: url, html: e.data, config: cfg};\n\t\t\tif (!mu._emit(\"mu:before-render\", detail))\n\t\t\t\treturn;\n\t\t\tif (cfg.mode === \"patch\") {\n\t\t\t\tmu._renderPatch(detail.html, cfg);\n\t\t\t} else {\n\t\t\t\tmu._renderPage(detail.html, cfg);\n\t\t\t}\n\t\t\tmu._emit(\"mu:after-render\", {url: url, finalUrl: url, mode: cfg.mode});\n\t\t};\n\t\tsource.onerror = function() {\n\t\t\tmu._emit(\"mu:fetch-error\", {url: url, fetchUrl: fetchUrl, error: new Error(\"SSE connection error\")});\n\t\t};\n\t};\n\n\t/* ********** CORE LOADING ********** */\n\t/**\n\t * Fetch a URL and render it into the page.\n\t * Handles prefetch cache, abort of in-flight requests, progress bar,\n\t * view transitions, history management, and scroll behavior.\n\t * @param\t{string}\turl\tURL to fetch.\n\t * @param\t{Object}\tcfg\tEffective configuration.\n\t */\n\tthis._loadExec = async function(url, cfg) {\n\t\tvar fetchUrl = cfg.urlPrefix ? cfg.urlPrefix + url : url;\n\t\t// Save current scroll position (skip for trigger loads and popstate)\n\t\tif (!cfg._trigger && !cfg._popstate)\n\t\t\tmu._saveScroll();\n\t\t// Emit before-fetch event (cancelable)\n\t\tif (!mu._emit(\"mu:before-fetch\", {url: url, fetchUrl: fetchUrl, config: cfg, sourceElement: cfg._sourceElement || null}))\n\t\t\treturn;\n\t\t// Abort controller: trigger loads use a local controller to avoid\n\t\t// interfering with the global navigation abort controller.\n\t\tvar abortCtrl;\n\t\tif (cfg._trigger) {\n\t\t\tabortCtrl = new AbortController();\n\t\t} else {\n\t\t\tif (mu._abortCtrl)\n\t\t\t\tmu._abortCtrl.abort();\n\t\t\tabortCtrl = mu._abortCtrl = new AbortController();\n\t\t}\n\t\tif (!cfg._trigger)\n\t\t\tmu._showProgress();\n\t\ttry {\n\t\t\tvar html = null;\n\t\t\tvar resp = null;\n\t\t\tvar finalUrl = url;\n\t\t\t// Check prefetch cache (with TTL validation)\n\t\t\t// The cache stores {promise, ts} \u2014 the promise resolves to HTML or null.\n\t\t\t// This allows _loadExec to await an in-flight prefetch instead of\n\t\t\t// starting a duplicate request.\n\t\t\t// Non-GET requests are never served from cache.\n\t\t\tvar method = cfg.method || \"get\";\n\t\t\tvar cached = mu._prefetchCache.get(url);\n\t\t\tif (method === \"get\" && cached && cached.promise && (Date.now() - cached.ts) < mu._cfg.prefetchTtl) {\n\t\t\t\thtml = await cached.promise;\n\t\t\t\tif (abortCtrl.signal.aborted)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!html) {\n\t\t\t\t// Build fetch options\n\t\t\t\tvar fetchOpts = {\n\t\t\t\t\tsignal: abortCtrl.signal,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\n\t\t\t\t\t\t\"X-Mu-Mode\": cfg.mode\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (method !== \"get\") {\n\t\t\t\t\tfetchOpts.headers[\"X-Mu-Method\"] = fetchOpts.method = method.toUpperCase();\n\t\t\t\t\tif (cfg.postData)\n\t\t\t\t\t\tfetchOpts.body = cfg.postData;\n\t\t\t\t}\n\t\t\t\tresp = await fetch(fetchUrl, fetchOpts);\n\t\t\t\tif (!resp.ok) {\n\t\t\t\t\tmu._emit(\"mu:fetch-error\", {url: url, fetchUrl: fetchUrl, status: resp.status, response: resp});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (resp.redirected)\n\t\t\t\t\tfinalUrl = new URL(resp.url).pathname + new URL(resp.url).search;\n\t\t\t\thtml = await resp.text();\n\t\t\t}\n\t\t\t// Refresh the prefetch cache with a fresh timestamp (GET only).\n\t\t\t// The View Transition API renders asynchronously, which causes\n\t\t\t// the browser to fire a new mouseover after the DOM update.\n\t\t\t// Without a fresh cache entry, _onMouseOver would start a\n\t\t\t// duplicate prefetch for the URL that was just loaded.\n\t\t\tif (!cfg._trigger && method === \"get\")\n\t\t\t\tmu._prefetchCache.set(url, {promise: Promise.resolve(html), ts: Date.now()});\n\t\t\t// Emit before-render (cancelable, allows html modification)\n\t\t\tvar detail = {url: url, finalUrl: finalUrl, html: html, config: cfg};\n\t\t\tif (!mu._emit(\"mu:before-render\", detail))\n\t\t\t\treturn;\n\t\t\t// Compute effective history (used for pushState and title update)\n\t\t\tif (cfg.mode === \"patch\") {\n\t\t\t\tcfg._addHistory = cfg.patchHistory;\n\t\t\t} else {\n\t\t\t\tcfg._addHistory = cfg.history;\n\t\t\t\tif (resp && resp.redirected)\n\t\t\t\t\tcfg._addHistory = true;\n\t\t\t}\n\t\t\t// Post-render tasks: history, scroll, event emission.\n\t\t\t// Grouped in a function so it runs after the DOM update regardless\n\t\t\t// of whether View Transitions are used (async) or not (sync).\n\t\t\tvar postRender = function() {\n\t\t\t\t// History management\n\t\t\t\tmu._previousUrl = mu._lastUrl;\n\t\t\t\tmu._lastUrl = finalUrl;\n\t\t\t\tif (cfg._addHistory)\n\t\t\t\t\twindow.history.pushState({mu: true, url: finalUrl}, \"\", finalUrl);\n\t\t\t\t// Scroll management (not for patch mode)\n\t\t\t\tif (cfg.mode !== \"patch\") {\n\t\t\t\t\tif (cfg._restoreScroll) {\n\t\t\t\t\t\t// Restore scroll position from history state (back/forward)\n\t\t\t\t\t\twindow.scrollTo(cfg._restoreScroll.x, cfg._restoreScroll.y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar shouldScroll = cfg.scroll !== null ? cfg.scroll : true;\n\t\t\t\t\t\tif (shouldScroll) {\n\t\t\t\t\t\t\tvar hashIdx = url.indexOf(\"#\");\n\t\t\t\t\t\t\tif (hashIdx !== -1) {\n\t\t\t\t\t\t\t\tvar anchor = document.getElementById(url.substring(hashIdx + 1));\n\t\t\t\t\t\t\t\tif (anchor)\n\t\t\t\t\t\t\t\t\tanchor.scrollIntoView({behavior: \"smooth\"});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twindow.scrollTo(0, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Reset quit confirmation\n\t\t\t\tmu.setConfirmQuit(false);\n\t\t\t\t// Emit after-render\n\t\t\t\tmu._emit(\"mu:after-render\", {url: url, finalUrl: finalUrl, mode: cfg.mode});\n\t\t\t};\n\t\t\t// Build the DOM update function\n\t\t\tvar applyDom;\n\t\t\tif (cfg.mode === \"patch\") {\n\t\t\t\tapplyDom = function() { mu._renderPatch(detail.html, cfg); };\n\t\t\t} else {\n\t\t\t\tapplyDom = function() { mu._renderPage(detail.html, cfg); };\n\t\t\t}\n\t\t\t// Wrap in View Transition if enabled and supported.\n\t\t\t// startViewTransition runs the callback asynchronously (after\n\t\t\t// capturing the old visual state), so post-render tasks must\n\t\t\t// wait for the updateCallbackDone promise.\n\t\t\tif (cfg.transition && document.startViewTransition) {\n\t\t\t\tdocument.startViewTransition(applyDom).updateCallbackDone.then(postRender);\n\t\t\t} else {\n\t\t\t\tapplyDom();\n\t\t\t\tpostRender();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (err.name === \"AbortError\")\n\t\t\t\treturn;\n\t\t\tmu._emit(\"mu:fetch-error\", {url: url, fetchUrl: fetchUrl, error: err});\n\t\t} finally {\n\t\t\tif (!cfg._trigger)\n\t\t\t\tmu._hideProgress();\n\t\t}\n\t};\n\n\t/* ********** PAGE RENDERING (navigation mode) ********** */\n\t/**\n\t * Parse fetched HTML and inject it into the current page.\n\t * Handles source/target selection, mode application, title update,\n\t * head merging, and script execution.\n\t * @param\t{string}\thtml\tRaw HTML string (full page).\n\t * @param\t{Object}\tcfg\tEffective configuration.\n\t */\n\tthis._renderPage = function(html, cfg) {\n\t\tvar doc = new DOMParser().parseFromString(html, \"text/html\");\n\t\t// Find source node in fetched document\n\t\tvar sourceNode = null;\n\t\tif (cfg.source)\n\t\t\tsourceNode = doc.querySelector(cfg.source);\n\t\tif (!sourceNode)\n\t\t\tsourceNode = doc.body;\n\t\t// Find target node in current page\n\t\tvar resolvedTarget = mu._resolveTarget(cfg.target, cfg._sourceElement);\n\t\tvar targetNode = document.querySelector(resolvedTarget);\n\t\tif (!targetNode) {\n\t\t\tconsole.warn(\"[\u00B5JS] Target element '\" + resolvedTarget + \"' not found.\");\n\t\t\treturn;\n\t\t}\n\t\t// Clean up triggers before replacing content\n\t\tmu._cleanupTriggers(targetNode);\n\t\t// Apply injection mode\n\t\tmu._applyMode(cfg.mode, targetNode, sourceNode, cfg);\n\t\t// Update page title (skip when no history)\n\t\tif (cfg._addHistory)\n\t\t\tmu._updateTitle(doc, cfg);\n\t\t// Merge <head> elements (additive: add missing assets, never remove)\n\t\tmu._mergeHead(doc);\n\t\t// Execute scripts in injected content\n\t\tvar container = document.querySelector(resolvedTarget) || document.body;\n\t\tmu._runScripts(container);\n\t\t// Initialize triggers in new content\n\t\tmu._initTriggers(container);\n\t};\n\n\t/* ********** PATCH RENDERING ********** */\n\t/**\n\t * Process patch fragments from fetched HTML.\n\t * Iterates over all elements with a mu-patch-target attribute and\n\t * injects each one into the current page according to its mu-patch-mode.\n\t * The mu-patch-* attributes are preserved on injected nodes.\n\t * @param\t{string}\thtml\tRaw HTML string containing patch fragments.\n\t * @param\t{Object}\tcfg\tEffective configuration.\n\t */\n\tthis._renderPatch = function(html, cfg) {\n\t\tvar doc = new DOMParser().parseFromString(html, \"text/html\");\n\t\t// Find all patch fragments\n\t\tvar fragments = doc.querySelectorAll(\"[mu-patch-target], [data-mu-patch-target]\");\n\t\tvar patchedSelectors = [];\n\t\tfor (var i = 0; i < fragments.length; i++) {\n\t\t\tvar frag = fragments[i];\n\t\t\tvar targetSel = frag.getAttribute(\"mu-patch-target\") || frag.getAttribute(\"data-mu-patch-target\");\n\t\t\ttargetSel = mu._resolveTarget(targetSel, cfg._sourceElement);\n\t\t\tvar mode = frag.getAttribute(\"mu-patch-mode\") || frag.getAttribute(\"data-mu-patch-mode\") || \"replace\";\n\t\t\t// Find the target in the current page\n\t\t\tvar targetNode = document.querySelector(targetSel);\n\t\t\tif (!targetNode) {\n\t\t\t\tconsole.warn(\"[\u00B5JS] Patch target '\" + targetSel + \"' not found.\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Clean up triggers before replacing content\n\t\t\tmu._cleanupTriggers(targetNode);\n\t\t\t// Apply injection mode\n\t\t\tmu._applyMode(mode, targetNode, frag, cfg);\n\t\t\t// Execute scripts in injected fragment\n\t\t\tif (mode !== \"remove\") {\n\t\t\t\t// For replace: the new node is now in the DOM at the target's position\n\t\t\t\t// For append/prepend/before/after: the fragment is now in the DOM\n\t\t\t\t// We run scripts on the injected node itself\n\t\t\t\tmu._runScripts(frag);\n\t\t\t\tpatchedSelectors.push(targetSel);\n\t\t\t}\n\t\t}\n\t\t// Initialize triggers in patched areas\n\t\tfor (var j = 0; j < patchedSelectors.length; j++) {\n\t\t\tvar patched = document.querySelector(patchedSelectors[j]);\n\t\t\tif (patched)\n\t\t\t\tmu._initTriggers(patched);\n\t\t}\n\t};\n\n\t/* ********** DOM INJECTION ********** */\n\t/**\n\t * Apply an injection mode to insert source content into a target node.\n\t * Uses morphing for \"replace\" and \"update\" modes when available and enabled.\n\t * For \"prepend\", \"append\", \"before\", \"after\": inserts the source node directly.\n\t * @param\t{string}\tmode\t\tInjection mode.\n\t * @param\t{Element}\ttargetNode\tDestination DOM element.\n\t * @param\t{Element}\tsourceNode\tSource DOM element to inject.\n\t * @param\t{Object}\tcfg\t\tConfiguration (used for morph flag).\n\t */\n\tthis._applyMode = function(mode, targetNode, sourceNode, cfg) {\n\t\tvar useMorph = cfg.morph && mu._morph;\n\t\tswitch (mode) {\n\t\t\tcase \"update\":\n\t\t\t\tif (useMorph) {\n\t\t\t\t\tmu._morph(targetNode, sourceNode.innerHTML, {morphStyle: \"innerHTML\"});\n\t\t\t\t} else {\n\t\t\t\t\ttargetNode.innerHTML = sourceNode.innerHTML;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"prepend\":\n\t\t\t\ttargetNode.prepend(sourceNode);\n\t\t\t\tbreak;\n\t\t\tcase \"append\":\n\t\t\t\ttargetNode.append(sourceNode);\n\t\t\t\tbreak;\n\t\t\tcase \"before\":\n\t\t\t\ttargetNode.before(sourceNode);\n\t\t\t\tbreak;\n\t\t\tcase \"after\":\n\t\t\t\ttargetNode.after(sourceNode);\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\ttargetNode.remove();\n\t\t\t\tbreak;\n\t\t\tcase \"none\":\n\t\t\t\tbreak;\n\t\t\tcase \"replace\":\n\t\t\tdefault:\n\t\t\t\t// Cannot replace <body> with replaceWith(); use innerHTML instead\n\t\t\t\tif (targetNode.tagName === \"BODY\" && sourceNode.tagName === \"BODY\") {\n\t\t\t\t\tif (useMorph) {\n\t\t\t\t\t\tmu._morph(targetNode, sourceNode.innerHTML, {morphStyle: \"innerHTML\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttargetNode.innerHTML = sourceNode.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (useMorph) {\n\t\t\t\t\t\tmu._morph(targetNode, sourceNode.outerHTML, {morphStyle: \"outerHTML\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttargetNode.replaceWith(sourceNode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t/* ********** PAGE METADATA ********** */\n\t/**\n\t * Update the page title from the fetched document.\n\t * Supports \"selector/attribute\" syntax: if the title selector contains\n\t * a slash, the part after the slash is used as an attribute name.\n\t * @param\t{Document}\tdoc\tParsed document.\n\t * @param\t{Object}\tcfg\tConfiguration.\n\t */\n\tthis._updateTitle = function(doc, cfg) {\n\t\tif (!cfg.title)\n\t\t\treturn;\n\t\tvar el = doc.querySelector(cfg.title);\n\t\tif (!el)\n\t\t\treturn;\n\t\tvar text = cfg._titleAttr ? el.getAttribute(cfg._titleAttr) : el.textContent;\n\t\tif (text)\n\t\t\tdocument.title = text;\n\t};\n\t/**\n\t * Merge <head> elements from fetched document into current page.\n\t * Additive only: adds missing stylesheets, styles, and scripts.\n\t * Never removes existing elements.\n\t * Scripts are created as new elements to ensure browser execution.\n\t * @param\t{Document}\tdoc\tParsed document.\n\t */\n\tthis._mergeHead = function(doc) {\n\t\tvar selector = \"link[rel='stylesheet'], style, script\";\n\t\tvar oldEls = document.head.querySelectorAll(selector);\n\t\tvar newEls = doc.head.querySelectorAll(selector);\n\t\t// Build set of existing element keys\n\t\tvar oldKeys = new Set();\n\t\tfor (var i = 0; i < oldEls.length; i++)\n\t\t\toldKeys.add(mu._elKey(oldEls[i]));\n\t\t// Add new elements not already present\n\t\tfor (var i = 0; i < newEls.length; i++) {\n\t\t\tif (oldKeys.has(mu._elKey(newEls[i])))\n\t\t\t\tcontinue;\n\t\t\tif (newEls[i].tagName.toUpperCase() === \"SCRIPT\") {\n\t\t\t\t// Create a fresh script element (DOMParser scripts are inert)\n\t\t\t\tvar s = document.createElement(\"script\");\n\t\t\t\tfor (var j = 0; j < newEls[i].attributes.length; j++)\n\t\t\t\t\ts.setAttribute(newEls[i].attributes[j].name, newEls[i].attributes[j].value);\n\t\t\t\ts.textContent = newEls[i].textContent;\n\t\t\t\t// Track external scripts to prevent re-loading by _runScripts\n\t\t\t\tif (s.hasAttribute(\"src\"))\n\t\t\t\t\tmu._jsIncludes[s.getAttribute(\"src\")] = true;\n\t\t\t\tdocument.head.appendChild(s);\n\t\t\t} else {\n\t\t\t\tdocument.head.appendChild(newEls[i].cloneNode(true));\n\t\t\t}\n\t\t}\n\t};\n\t/**\n\t * Generate a unique key for a <head> element, used for deduplication.\n\t * @param\t{Element}\tel\tDOM element (link, style, or script).\n\t * @return\t{string}\tUnique identifier string.\n\t */\n\tthis._elKey = function(el) {\n\t\tvar tag = el.tagName.toUpperCase();\n\t\tif (tag === \"LINK\")\n\t\t\treturn (\"link:\" + el.getAttribute(\"href\"));\n\t\tif (tag === \"STYLE\")\n\t\t\treturn (\"style:\" + el.textContent.substring(0, 100));\n\t\tif (tag === \"SCRIPT\")\n\t\t\treturn (\"script:\" + (el.getAttribute(\"src\") || el.textContent.substring(0, 100)));\n\t\treturn (el.outerHTML);\n\t};\n\n\t/* ********** SCRIPT EXECUTION ********** */\n\t/**\n\t * Execute <script> tags found in a container.\n\t * Creates new script elements to force browser re-evaluation.\n\t * External scripts (with src) are loaded only once (tracked in _jsIncludes).\n\t * Scripts with mu-disabled are skipped.\n\t * @param\t{Element}\tcontainer\tDOM element to search for scripts.\n\t */\n\tthis._runScripts = function(container) {\n\t\tvar scripts = container.querySelectorAll(\"script\");\n\t\tfor (var i = 0; i < scripts.length; i++) {\n\t\t\tvar old = scripts[i];\n\t\t\t// Skip disabled scripts\n\t\t\tif (mu._attr(old, \"disabled\") === \"true\" || mu._attr(old, \"disabled\") === \"\")\n\t\t\t\tcontinue;\n\t\t\t// Skip already-loaded external scripts\n\t\t\tif (old.hasAttribute(\"src\")) {\n\t\t\t\tvar src = old.getAttribute(\"src\");\n\t\t\t\tif (mu._jsIncludes[src])\n\t\t\t\t\tcontinue;\n\t\t\t\tmu._jsIncludes[src] = true;\n\t\t\t}\n\t\t\t// Create a new script element (forces browser re-evaluation)\n\t\t\tvar s = document.createElement(\"script\");\n\t\t\tfor (var j = 0; j < old.attributes.length; j++)\n\t\t\t\ts.setAttribute(old.attributes[j].name, old.attributes[j].value);\n\t\t\ts.textContent = old.textContent;\n\t\t\told.parentNode.replaceChild(s, old);\n\t\t}\n\t};\n\n\t/* ********** PROGRESS BAR ********** */\n\t/**\n\t * Show the progress bar at the top of the page.\n\t * Creates the element on first call. The bar animates to 70% width\n\t * while the request is in progress.\n\t */\n\tthis._showProgress = function() {\n\t\tif (!mu._cfg.progress)\n\t\t\treturn;\n\t\tif (!mu._progressEl) {\n\t\t\tmu._progressEl = document.createElement(\"div\");\n\t\t\tmu._progressEl.id = \"mu-progress\";\n\t\t\tmu._progressEl.style.cssText = \"position:fixed;top:0;left:0;height:3px;background:#29d;z-index:99999;transition:width .3s ease;width:0\";\n\t\t}\n\t\tdocument.body.appendChild(mu._progressEl);\n\t\tmu._progressEl.offsetWidth; // force reflow\n\t\tmu._progressEl.style.width = \"70%\";\n\t};\n\t/**\n\t * Hide the progress bar.\n\t * Animates to 100% width, then resets and removes the element.\n\t */\n\tthis._hideProgress = function() {\n\t\tif (!mu._progressEl)\n\t\t\treturn;\n\t\tmu._progressEl.style.width = \"100%\";\n\t\tsetTimeout(function() {\n\t\t\tif (!mu._progressEl)\n\t\t\t\treturn;\n\t\t\tmu._progressEl.style.transition = \"none\";\n\t\t\tmu._progressEl.style.width = \"0\";\n\t\t\tmu._progressEl.offsetWidth; // force reflow\n\t\t\tmu._progressEl.style.transition = \"width .3s ease\";\n\t\t\tmu._progressEl.remove();\n\t\t}, 200);\n\t};\n\n\t/* ********** SCROLL MANAGEMENT ********** */\n\t/**\n\t * Save the current scroll position into the current history state.\n\t * Called before each navigation so that popstate can restore it.\n\t */\n\tthis._saveScroll = function() {\n\t\tvar state = window.history.state;\n\t\tif (state && state.mu) {\n\t\t\tstate.scrollX = window.scrollX;\n\t\t\tstate.scrollY = window.scrollY;\n\t\t\twindow.history.replaceState(state, \"\");\n\t\t}\n\t};\n\n\t/* ********** EVENT EMITTER ********** */\n\t/**\n\t * Dispatch a CustomEvent on the document.\n\t * Automatically adds lastUrl and previousUrl to the detail object.\n\t * @param\t{string}\tname\tEvent name (e.g. \"mu:before-fetch\").\n\t * @param\t{Object}\t[detail]\tEvent detail data.\n\t * @return\t{boolean}\tFalse if the event was canceled via preventDefault().\n\t */\n\tthis._emit = function(name, detail) {\n\t\tdetail = detail || {};\n\t\tdetail.lastUrl = mu._lastUrl;\n\t\tdetail.previousUrl = mu._previousUrl;\n\t\tvar ev = new CustomEvent(name, {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tdetail: detail\n\t\t});\n\t\treturn (document.dispatchEvent(ev));\n\t};\n};\n\nwindow.mu = mu;\n", "/**\n * Client-side chart rendering for Billow\n * Computes SVG paths for donut charts and renders bar charts\n */\n\n(function () {\n  \"use strict\";\n\n  // ============================================\n  // Configuration (set via data attributes on script tag)\n  // ============================================\n\n  let privacyMode = false;\n\n  /**\n   * Load configuration from script tag data attributes\n   */\n  function loadConfig() {\n    const script = document.querySelector('#chartJSData');\n    if (script && script.dataset.privacyMode !== undefined) {\n      privacyMode = script.dataset.privacyMode.toLowerCase() === \"true\";\n    }\n  }\n\n  // ============================================\n  // Utility functions\n  // ============================================\n\n  /**\n   * Convert polar coordinates to cartesian\n   */\n  function polarToCartesian(cx, cy, radius, angleInDegrees) {\n    const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180;\n    return {\n      x: cx + radius * Math.cos(angleInRadians),\n      y: cy + radius * Math.sin(angleInRadians),\n    };\n  }\n\n  /**\n   * Create SVG donut arc path\n   */\n  function describeArc(cx, cy, outerRadius, innerRadius, startAngle, endAngle) {\n    const outerStart = polarToCartesian(cx, cy, outerRadius, startAngle);\n    const outerEnd = polarToCartesian(cx, cy, outerRadius, endAngle);\n    const innerStart = polarToCartesian(cx, cy, innerRadius, startAngle);\n    const innerEnd = polarToCartesian(cx, cy, innerRadius, endAngle);\n\n    const largeArcFlag = endAngle - startAngle > 180 ? 1 : 0;\n\n    return [\n      \"M\",\n      outerStart.x,\n      outerStart.y,\n      \"A\",\n      outerRadius,\n      outerRadius,\n      0,\n      largeArcFlag,\n      1,\n      outerEnd.x,\n      outerEnd.y,\n      \"L\",\n      innerEnd.x,\n      innerEnd.y,\n      \"A\",\n      innerRadius,\n      innerRadius,\n      0,\n      largeArcFlag,\n      0,\n      innerStart.x,\n      innerStart.y,\n      \"Z\",\n    ].join(\" \");\n  }\n\n  /**\n   * Format number with thousand separators (like Django's intcomma)\n   * e.g., 1234567 -> \"1,234,567\"\n   */\n  function intcomma(value) {\n    return value.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n  }\n\n  /**\n   * Format amount like Django's {% amount %} tag\n   * e.g., 245000 -> \"245,000 F\"\n   */\n  function formatAmount(value, suffix = \" F\") {\n    if (privacyMode) {\n      return \"\u2022\u2022\u2022\u2022\u2022\";\n    }\n    return intcomma(Math.round(value)) + suffix;\n  }\n\n  /**\n   * Format number compactly (e.g., 245000 -> \"245K\")\n   * Used for center values where space is limited\n   */\n  function formatCompact(value) {\n    if (privacyMode) {\n      return \"\u2022\u2022\u2022\";\n    }\n    if (value >= 1000000) {\n      const formatted = (value / 1000000).toFixed(1);\n      return formatted.replace(/\\.0$/, \"\") + \"M\";\n    } else if (value >= 1000) {\n      return Math.round(value / 1000) + \"K\";\n    }\n    return String(Math.round(value));\n  }\n\n  // ============================================\n  // Pie/Donut Chart\n  // ============================================\n\n  /**\n   * Render a donut chart into the given container\n   * @param {HTMLElement} container - Element with data-chart=\"pie\"\n   */\n  function renderPieChart(container) {\n    const svg = container.querySelector(\"svg\");\n    if (!svg) return;\n\n    // Parse data from attribute\n    let data;\n    try {\n      data = JSON.parse(container.dataset.segments || \"[]\");\n    } catch (e) {\n      console.error(\"Invalid pie chart data:\", e);\n      return;\n    }\n\n    if (!data.length) return;\n\n    // Chart dimensions (viewBox is 0 0 100 100)\n    const cx = 50;\n    const cy = 50;\n    const outerRadius = 50;\n    const innerRadius = 28;\n\n    // Calculate total\n    const total = data.reduce((sum, item) => sum + item.value, 0);\n    if (total === 0) return;\n\n    // Clear existing paths (keep other elements like center text)\n    svg.querySelectorAll(\"path\").forEach((el) => el.remove());\n\n    // Create segments\n    let currentAngle = 0;\n\n    data.forEach((item) => {\n      const percentage = item.value / total;\n      const angleSize = percentage * 360;\n\n      // Skip tiny segments\n      if (angleSize < 0.5) return;\n\n      const startAngle = currentAngle;\n      const endAngle = currentAngle + angleSize;\n\n      const path = document.createElementNS(\n        \"http://www.w3.org/2000/svg\",\n        \"path\"\n      );\n      path.setAttribute(\n        \"d\",\n        describeArc(cx, cy, outerRadius, innerRadius, startAngle, endAngle)\n      );\n      path.setAttribute(\"style\", `fill: var(--chart-${item.color || 1})`);\n      path.setAttribute(\n        \"class\",\n        \"transition-opacity hover:opacity-75 cursor-pointer\"\n      );\n\n      // Add tooltip via title element (includes percentage)\n      const title = document.createElementNS(\n        \"http://www.w3.org/2000/svg\",\n        \"title\"\n      );\n      const pct = Math.round(percentage * 100);\n      title.textContent = `${item.label}: ${formatAmount(item.value)} (${pct}%)`;\n      path.appendChild(title);\n\n      svg.appendChild(path);\n\n      currentAngle = endAngle;\n    });\n\n    // Update center value if present\n    const centerValue = container.querySelector(\"[data-center-value]\");\n    if (centerValue) {\n      const rawValue = parseFloat(centerValue.dataset.centerValue);\n      if (!isNaN(rawValue)) {\n        centerValue.textContent = formatCompact(rawValue);\n      } else if (privacyMode) {\n        centerValue.textContent = \"\u2022\u2022\u2022\";\n      }\n    }\n  }\n\n  // ============================================\n  // Bar Chart\n  // ============================================\n\n  /**\n   * Render a bar chart into the given container\n   * @param {HTMLElement} container - Element with data-chart=\"bar\"\n   */\n  function renderBarChart(container) {\n    const barsContainer = container.querySelector(\"[data-bars]\");\n    const labelsContainer = container.querySelector(\"[data-labels]\");\n    const emptyState = container.querySelector(\"[data-empty]\");\n    if (!barsContainer) return;\n\n    // Parse data from attribute\n    let data;\n    try {\n      data = JSON.parse(container.dataset.values || \"[]\");\n    } catch (e) {\n      console.error(\"Invalid bar chart data:\", e);\n      return;\n    }\n\n    // Find max value for scaling\n    const maxValue = Math.max(...data.map((item) => item.value), 0);\n\n    // Show empty state if no data\n    if (!data.length || maxValue === 0) {\n      barsContainer.innerHTML = \"\";\n      if (labelsContainer) labelsContainer.innerHTML = \"\";\n      if (emptyState) {\n        emptyState.classList.remove(\"hidden\");\n        emptyState.classList.add(\"flex\");\n      }\n      return;\n    }\n\n    // Hide empty state if we have data\n    if (emptyState) {\n      emptyState.classList.add(\"hidden\");\n      emptyState.classList.remove(\"flex\");\n    };\n\n    // Determine active index (default to last)\n    const activeIndex = data.length - 1;\n\n    // Clear existing bars and labels\n    barsContainer.innerHTML = \"\";\n    if (labelsContainer) labelsContainer.innerHTML = \"\";\n\n    // Calculate changes and render bars\n    let prevValue = null;\n\n    data.forEach((item, index) => {\n      const height = (item.value / maxValue) * 100;\n      const isActive = index === activeIndex;\n\n      // Calculate change percentage\n      let changeText = \"\";\n      if (prevValue !== null && prevValue > 0) {\n        const pct = ((item.value - prevValue) / prevValue) * 100;\n        changeText = pct >= 0 ? `+${Math.round(pct)}%` : `${Math.round(pct)}%`;\n      }\n\n      // Create bar element\n      const bar = document.createElement(\"div\");\n      bar.className = `flex relative flex-1 justify-center items-end rounded-sm cursor-pointer ${\n        isActive\n          ? \"bg-primary hover:bg-primary/80\"\n          : \"bg-muted-foreground/20 hover:bg-muted-foreground/30\"\n      }`;\n      bar.style.height = `${height}%`;\n      bar.setAttribute(\n        \"data-tooltip\",\n        `${item.label} \u2014 ${formatAmount(item.value)}`\n      );\n      bar.setAttribute(\"data-side\", \"top\");\n\n      // Add change text inside bar (only if not in privacy mode)\n      if (changeText && !privacyMode) {\n        const changeSpan = document.createElement(\"span\");\n        changeSpan.className = `absolute inset-x-0 bottom-1 font-medium tabular-nums text-center text-[10px] ${\n          isActive ? \"text-primary-foreground\" : \"text-muted-foreground\"\n        }`;\n        changeSpan.textContent = changeText;\n        bar.appendChild(changeSpan);\n      }\n\n      barsContainer.appendChild(bar);\n\n      // Create label\n      if (labelsContainer) {\n        const label = document.createElement(\"span\");\n        label.textContent = item.label;\n        labelsContainer.appendChild(label);\n      }\n\n      prevValue = item.value;\n    });\n  }\n\n  // ============================================\n  // Initialization\n  // ============================================\n\n  /**\n   * Initialize all charts on the page\n   */\n  function initCharts() {\n    loadConfig();\n\n    // Render pie charts\n    document.querySelectorAll('[data-chart=\"pie\"]').forEach(renderPieChart);\n\n    // Render bar charts\n    document.querySelectorAll('[data-chart=\"bar\"]').forEach(renderBarChart);\n  }\n\n  // Run on DOM ready\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initCharts);\n  } else {\n    initCharts();\n  }\n\n  // Expose for manual re-initialization (muJS navigation, datastar patches)\n  window.initCharts = initCharts;\n\n  // Datastar patches swap in chart containers after the initial render, so\n  // re-initialize whenever the chart payloads change. The signature guard\n  // prevents re-rendering from our own path mutations looping.\n  function chartSignature() {\n    return Array.from(document.querySelectorAll(\"[data-chart]\"))\n      .map((el) => el.dataset.segments || el.dataset.values || \"\")\n      .join(\"|\");\n  }\n\n  let lastSignature = chartSignature();\n  new MutationObserver(() => {\n    const signature = chartSignature();\n    if (signature && signature !== lastSignature) {\n      lastSignature = signature;\n      initCharts();\n    }\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n", "function setupBudgetAutoSelect(root = document) {\n  const dataElement = document.getElementById(\"budgets-by-category\");\n  if (!dataElement) return;\n\n  const budgetsByCategory = JSON.parse(dataElement.textContent);\n\n  function findBudgetForCategory(categoryId) {\n    if (!categoryId || !budgetsByCategory[categoryId]) return null;\n    const budgets = budgetsByCategory[categoryId];\n    return budgets.length > 0 ? budgets[0] : null;\n  }\n\n  function ensureOption(select, value, label) {\n    const listbox = select.querySelector('[role=\"listbox\"]');\n    if (!listbox) return;\n\n    let option = listbox.querySelector(`[role=\"option\"][data-value=\"${value}\"]`);\n    if (!option) {\n      option = document.createElement(\"div\");\n      option.role = \"option\";\n      option.className = \"cursor-pointer\";\n      option.dataset.value = value;\n      option.textContent = label;\n      listbox.appendChild(option);\n      select.dispatchEvent(new CustomEvent(\"basecoat:options-changed\"));\n    }\n  }\n\n  function clearBudget(select, input) {\n    input.value = \"\";\n    select.querySelectorAll('[role=\"option\"]').forEach((option) => {\n      option.removeAttribute(\"aria-selected\");\n    });\n    const label = select.querySelector(\":scope > button > span\");\n    if (label) label.textContent = \"Aucun budget\";\n  }\n\n  function autoSelectBudget(categorySelect) {\n    const scope =\n      categorySelect.closest(\"[data-budget-autoselect-scope]\") || document;\n    const budgetSelect = scope.querySelector(\"[data-budget-field] .select\");\n    const budgetInput = scope.querySelector(\n      \"[data-budget-field] input[type='hidden']\"\n    );\n\n    if (!budgetSelect || !budgetInput) return;\n\n    const budget = findBudgetForCategory(categorySelect.value);\n    if (!budget) {\n      clearBudget(budgetSelect, budgetInput);\n      return;\n    }\n\n    const budgetId = String(budget.id);\n    ensureOption(budgetSelect, budgetId, budget.name);\n    budgetInput.value = budgetId;\n    budgetSelect.value = budgetId;\n  }\n\n  root.querySelectorAll(\"[data-category-field] .select\").forEach((select) => {\n    if (select.dataset.budgetAutoselectBound) return;\n    select.dataset.budgetAutoselectBound = \"true\";\n    select.addEventListener(\"change\", () => autoSelectBudget(select));\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => setupBudgetAutoSelect());\ndocument.addEventListener(\"mu:after-render\", () => setupBudgetAutoSelect());\ndocument.addEventListener(\"datastar:after-patch-elements\", (event) => {\n  setupBudgetAutoSelect(event.target || document);\n});\n", "/**\n * BatchSelect \u2014 reusable checkbox batch-selection with batch action bar.\n *\n * Usage (in page <script>):\n *   window.BatchSelect.install('catSelect', '.category-checkbox', {\n *     batchBarId: 'batch-bar',\n *     countId: 'selected-count',\n *     onUpdate: function(count, ids) { ... },\n *   });\n *\n * The instance is accessible as window.catSelect.\n * Install() re-runs on DOMContentLoaded *and* mu:after-render, so it\n * survives both cold page loads and mu.js client-side navigation.\n */\n\nexport class BatchSelect {\n  constructor(config = {}) {\n    this.checkboxSelector = config.checkboxSelector;\n    this.batchBarId = config.batchBarId || 'batch-bar';\n    this.countId = config.countId || 'selected-count';\n    this.selectAllId = config.selectAllId || 'select-all';\n    this.onUpdate = config.onUpdate || (() => {});\n\n    this._onChange = this._onChange.bind(this);\n    this._changing = false; // guard against cascading change events\n\n    document.addEventListener('change', this._onChange);\n    this.update();\n  }\n\n  _onChange(e) {\n    // Ignore events we triggered ourselves (toggleSelectAll sets checkboxes)\n    if (this._changing) return;\n\n    if (e.target.matches(this.checkboxSelector)) {\n      this.update();\n      return;\n    }\n    if (e.target.id && e.target.id === this.selectAllId) {\n      this.toggleSelectAll(e.target.checked);\n    }\n  }\n\n  toggleSelectAll(checked) {\n    // Suppress cascading change events while we programmatically\n    // set every checkbox.\n    this._changing = true;\n    const cbs = document.querySelectorAll(this.checkboxSelector);\n    for (let i = 0; i < cbs.length; i++) {\n      cbs[i].checked = checked;\n    }\n    this._changing = false;\n    this.update();\n  }\n\n  clear() {\n    this._changing = true;\n    const cbs = document.querySelectorAll(this.checkboxSelector);\n    for (let i = 0; i < cbs.length; i++) {\n      cbs[i].checked = false;\n    }\n    const sa = document.getElementById(this.selectAllId);\n    if (sa) sa.checked = false;\n    this._changing = false;\n    this.update();\n  }\n\n  getSelected() {\n    const cbs = document.querySelectorAll(this.checkboxSelector + ':checked');\n    return {\n      count: cbs.length,\n      ids: Array.from(cbs).map(cb => cb.value),\n      total: document.querySelectorAll(this.checkboxSelector).length,\n    };\n  }\n\n  update() {\n    const { count, ids, total } = this.getSelected();\n\n    // Batch bar\n    const bar = document.getElementById(this.batchBarId);\n    if (bar) {\n      bar.classList.toggle('hidden', count === 0);\n    }\n\n    // Count\n    const countEl = document.getElementById(this.countId);\n    if (countEl) countEl.textContent = count;\n\n    // Select-all\n    const sa = document.getElementById(this.selectAllId);\n    if (sa) {\n      sa.checked = count === total && total > 0;\n      sa.indeterminate = count > 0 && count < total;\n    }\n\n    this.onUpdate(count, ids);\n  }\n\n  destroy() {\n    document.removeEventListener('change', this._onChange);\n  }\n}\n\nwindow.BatchSelect = BatchSelect;\n", "(function () {\n  \"use strict\";\n\n  function escapeHtml(text) {\n    const div = document.createElement(\"div\");\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  function parseTags(container) {\n    const scriptId = container.dataset.tagsScriptId;\n    const dataScript = scriptId ? document.getElementById(scriptId) : null;\n    if (!dataScript) return [];\n\n    try {\n      return JSON.parse(dataScript.textContent) || [];\n    } catch {\n      return [];\n    }\n  }\n\n  function initTagsInput(container) {\n    if (container.dataset.initialized) return;\n    container.dataset.initialized = \"true\";\n\n    const hiddenInput = container.querySelector(\"[data-tags-value]\");\n    const tagsContainer = container.querySelector(\"[data-tags-container]\");\n    const textInput = container.querySelector(\"[data-tags-text-input]\");\n    if (!hiddenInput || !tagsContainer || !textInput) return;\n\n    hiddenInput.value = JSON.stringify(parseTags(container));\n\n    function getTags() {\n      try {\n        return JSON.parse(hiddenInput.value) || [];\n      } catch {\n        return [];\n      }\n    }\n\n    function setTags(tags) {\n      hiddenInput.value = JSON.stringify(tags);\n      renderTags();\n    }\n\n    function addTag(tag) {\n      const normalized = tag.trim();\n      if (!normalized) return;\n      const tags = getTags();\n      const key = normalized.toLowerCase();\n      if (tags.some((t) => t.toLowerCase() === key)) return;\n      setTags([...tags, normalized]);\n    }\n\n    function removeTag(tag) {\n      setTags(getTags().filter((current) => current !== tag));\n    }\n\n    function renderTags() {\n      const tags = getTags();\n      tagsContainer.querySelectorAll(\"[data-tag]\").forEach((el) => el.remove());\n\n      tags.forEach((tag) => {\n        const span = document.createElement(\"span\");\n        span.className =\n          \"inline-flex gap-1 items-center px-1.5 h-6 text-xs rounded bg-muted\";\n        span.dataset.tag = \"\";\n        span.innerHTML = `\n          <span data-tag-text>${escapeHtml(tag)}</span>\n          <button type=\"button\"\n                  class=\"focus:outline-none hover:text-destructive\"\n                  aria-label=\"Remove ${escapeHtml(tag)}\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"size-2.5\">\n              <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"/>\n            </svg>\n          </button>\n        `;\n        span.querySelector(\"button\").addEventListener(\"click\", () => removeTag(tag));\n        tagsContainer.insertBefore(span, textInput);\n      });\n\n      textInput.placeholder = tags.length ? \"\" : \"Ajouter des tags...\";\n    }\n\n    textInput.addEventListener(\"keydown\", (event) => {\n      if (event.key === \"Enter\" || event.key === \",\") {\n        event.preventDefault();\n        addTag(textInput.value);\n        textInput.value = \"\";\n      } else if (event.key === \"Backspace\" && !textInput.value) {\n        const tags = getTags();\n        if (tags.length) removeTag(tags[tags.length - 1]);\n      }\n    });\n\n    textInput.addEventListener(\"blur\", () => {\n      if (!textInput.value.trim()) return;\n      addTag(textInput.value);\n      textInput.value = \"\";\n    });\n\n    textInput.addEventListener(\"paste\", (event) => {\n      event.preventDefault();\n      event.clipboardData\n        .getData(\"text\")\n        .split(\",\")\n        .forEach((tag) => addTag(tag));\n    });\n\n    container.addEventListener(\"tags:remove\", (event) => removeTag(event.detail));\n  }\n\n  window.BillowWidgets = window.BillowWidgets || {};\n  window.BillowWidgets.initTagsInput = (root = document) => {\n    root.querySelectorAll(\"[data-tags-input]\").forEach(initTagsInput);\n  };\n})();\n", "(function () {\n  \"use strict\";\n\n  function escapeHtml(text) {\n    const div = document.createElement(\"div\");\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  function initMultiSelect(container) {\n    if (container.dataset.initialized) return;\n    container.dataset.initialized = \"true\";\n\n    const hiddenInputsContainer = container.querySelector(\"[data-hidden-inputs]\");\n    const pillsContainer = container.querySelector(\"[data-pills-container]\");\n    const searchInput = container.querySelector(\"[data-search-input]\");\n    const dropdown = container.querySelector(\"[data-dropdown]\");\n    const resultsContainer = container.querySelector(\"[data-results]\");\n    const emptyMessage = container.querySelector(\"[data-empty]\");\n    if (\n      !hiddenInputsContainer ||\n      !pillsContainer ||\n      !searchInput ||\n      !dropdown ||\n      !resultsContainer ||\n      !emptyMessage\n    ) {\n      return;\n    }\n\n    const fieldName =\n      hiddenInputsContainer.querySelector(\"input\")?.name || container.dataset.fieldName;\n    const allChoices = Array.from(resultsContainer.querySelectorAll(\"[data-option]\")).map(\n      (option) => ({\n        value: option.dataset.value,\n        label: option.dataset.label,\n      })\n    );\n\n    function getSelectedValues() {\n      return Array.from(hiddenInputsContainer.querySelectorAll(\"input\")).map(\n        (input) => input.value\n      );\n    }\n\n    function updatePlaceholder() {\n      searchInput.placeholder = getSelectedValues().length ? \"\" : \"Rechercher...\";\n    }\n\n    function removeSelection(value) {\n      const input = Array.from(hiddenInputsContainer.querySelectorAll(\"input\")).find(\n        (candidate) => candidate.value === value\n      );\n      input?.remove();\n\n      const pill = Array.from(pillsContainer.querySelectorAll(\"[data-pill]\")).find(\n        (candidate) => candidate.dataset.value === value\n      );\n      pill?.remove();\n\n      updateDropdown();\n      updatePlaceholder();\n    }\n\n    function addSelection(value, label) {\n      if (getSelectedValues().includes(value)) return;\n\n      const input = document.createElement(\"input\");\n      input.type = \"hidden\";\n      input.name = fieldName;\n      input.value = value;\n      hiddenInputsContainer.appendChild(input);\n\n      const pill = document.createElement(\"span\");\n      pill.className = \"inline-flex gap-1 items-center px-1.5 h-6 text-xs rounded bg-muted\";\n      pill.dataset.pill = \"\";\n      pill.dataset.value = value;\n      pill.innerHTML = `\n        <span>${escapeHtml(label)}</span>\n        <button type=\"button\"\n                class=\"focus:outline-none hover:text-destructive\"\n                data-remove-pill\n                aria-label=\"Remove ${escapeHtml(label)}\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"size-2.5\">\n            <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"/>\n          </svg>\n        </button>\n      `;\n      pill\n        .querySelector(\"[data-remove-pill]\")\n        .addEventListener(\"click\", (event) => {\n          event.stopPropagation();\n          removeSelection(value);\n        });\n      pillsContainer.insertBefore(pill, searchInput);\n\n      updateDropdown();\n      updatePlaceholder();\n    }\n\n    function updateDropdown() {\n      const query = searchInput.value.toLowerCase().trim();\n      const selected = getSelectedValues();\n      const filtered = allChoices.filter(\n        (choice) =>\n          !selected.includes(choice.value) &&\n          (!query || choice.label.toLowerCase().includes(query))\n      );\n\n      resultsContainer.innerHTML = \"\";\n      filtered.forEach((choice) => {\n        const option = document.createElement(\"div\");\n        option.className = \"py-1.5 px-2 text-sm rounded cursor-pointer hover:bg-muted\";\n        option.dataset.option = \"\";\n        option.dataset.value = choice.value;\n        option.dataset.label = choice.label;\n        option.tabIndex = -1;\n        option.textContent = choice.label;\n        option.addEventListener(\"click\", (event) => {\n          event.stopPropagation();\n          addSelection(choice.value, choice.label);\n          searchInput.value = \"\";\n          searchInput.focus();\n          showDropdown();\n        });\n        resultsContainer.appendChild(option);\n      });\n\n      emptyMessage.classList.toggle(\"hidden\", filtered.length > 0);\n    }\n\n    function showDropdown() {\n      updateDropdown();\n      dropdown.classList.remove(\"hidden\");\n      container.style.position = \"relative\";\n    }\n\n    function hideDropdown() {\n      dropdown.classList.add(\"hidden\");\n    }\n\n    searchInput.addEventListener(\"focus\", showDropdown);\n    searchInput.addEventListener(\"input\", updateDropdown);\n\n    pillsContainer.addEventListener(\"click\", (event) => {\n      if (!event.target.closest(\"[data-remove-pill]\")) showDropdown();\n    });\n\n    pillsContainer.querySelectorAll(\"[data-remove-pill]\").forEach((button) => {\n      button.addEventListener(\"click\", (event) => {\n        event.stopPropagation();\n        const pill = button.closest(\"[data-pill]\");\n        if (pill) removeSelection(pill.dataset.value);\n      });\n    });\n\n    searchInput.addEventListener(\"keydown\", (event) => {\n      if (event.key === \"Backspace\" && !searchInput.value) {\n        const pills = pillsContainer.querySelectorAll(\"[data-pill]\");\n        if (pills.length) removeSelection(pills[pills.length - 1].dataset.value);\n      } else if (event.key === \"Escape\") {\n        hideDropdown();\n        searchInput.blur();\n      } else if (event.key === \"ArrowDown\") {\n        event.preventDefault();\n        resultsContainer.querySelector(\"[data-option]\")?.focus();\n      }\n    });\n\n    document.addEventListener(\"click\", (event) => {\n      if (!container.contains(event.target)) hideDropdown();\n    });\n\n    resultsContainer.addEventListener(\"keydown\", (event) => {\n      const options = Array.from(resultsContainer.querySelectorAll(\"[data-option]\"));\n      const index = options.indexOf(document.activeElement);\n\n      if (event.key === \"ArrowDown\") {\n        event.preventDefault();\n        options[index + 1]?.focus();\n      } else if (event.key === \"ArrowUp\") {\n        event.preventDefault();\n        if (index === 0) searchInput.focus();\n        else options[index - 1]?.focus();\n      } else if (event.key === \"Enter\") {\n        event.preventDefault();\n        document.activeElement.click();\n      } else if (event.key === \"Escape\") {\n        hideDropdown();\n        searchInput.focus();\n      }\n    });\n  }\n\n  window.BillowWidgets = window.BillowWidgets || {};\n  window.BillowWidgets.initMultiSelect = (root = document) => {\n    root.querySelectorAll(\"[data-multi-select]\").forEach(initMultiSelect);\n  };\n})();\n", "(function () {\n  \"use strict\";\n\n  window.BillowWidgets = window.BillowWidgets || {};\n  window.BillowWidgets.init = (root = document) => {\n    window.BillowWidgets.initTagsInput?.(root);\n    window.BillowWidgets.initMultiSelect?.(root);\n  };\n\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    window.BillowWidgets.init();\n  });\n\n  document.addEventListener(\"datastar:after-patch-elements\", (event) => {\n    window.BillowWidgets.init(event.target || document);\n  });\n})();\n", "(() => {\n  const states = new WeakMap();\n\n  const isDisabled = (details) => {\n    const summary = details.querySelector(':scope > summary');\n    return details.getAttribute('aria-disabled') === 'true'\n      || details.dataset.disabled === 'true'\n      || summary?.getAttribute('aria-disabled') === 'true';\n  };\n\n  const isMultiple = (root) => root.hasAttribute('data-multiple');\n\n  const closeSiblings = (root, activeDetails) => {\n    if (isMultiple(root) || !activeDetails.open) return;\n    root.querySelectorAll(':scope > details[open]').forEach((details) => {\n      if (details !== activeDetails) details.open = false;\n    });\n  };\n\n  const initAccordion = (root) => {\n    if (root.dataset.accordionInitialized) return;\n\n    const handleClick = (event) => {\n      const summary = event.target.closest('summary');\n      const details = summary?.closest('details');\n      if (!details || details.parentElement !== root || !isDisabled(details)) return;\n      event.preventDefault();\n    };\n\n    const handleKeydown = (event) => {\n      if (event.key !== 'Enter' && event.key !== ' ') return;\n      const summary = event.target.closest('summary');\n      const details = summary?.closest('details');\n      if (!details || details.parentElement !== root || !isDisabled(details)) return;\n      event.preventDefault();\n    };\n\n    const handleToggle = (event) => {\n      const details = event.target;\n      if (details.parentElement !== root) return;\n      if (isDisabled(details)) {\n        details.open = false;\n        return;\n      }\n      closeSiblings(root, details);\n    };\n\n    root.addEventListener('click', handleClick);\n    root.addEventListener('keydown', handleKeydown);\n    root.addEventListener('toggle', handleToggle, true);\n    root.querySelectorAll(':scope > details[open]').forEach((details) => closeSiblings(root, details));\n\n    states.set(root, { handleClick, handleToggle });\n    root._destroy = () => {\n      root.removeEventListener('click', handleClick);\n      root.removeEventListener('keydown', handleKeydown);\n      root.removeEventListener('toggle', handleToggle, true);\n      states.delete(root);\n    };\n\n    root.dataset.accordionInitialized = 'true';\n    root.dispatchEvent(new CustomEvent('basecoat:initialized'));\n  };\n\n  if (window.basecoat) {\n    window.basecoat.register('accordion', '.accordion:not([data-accordion-initialized])', initAccordion);\n  }\n})();\n", "const _d={};_d.js=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t={},n;function r(e={}){t={animate:!0,duration:400,allowClose:!0,allowScroll:!0,overlayClickBehavior:`close`,overlayOpacity:.7,smoothScroll:!1,disableActiveInteraction:!1,showProgress:!1,stagePadding:10,stageRadius:5,popoverOffset:10,showButtons:[`next`,`previous`,`close`],disableButtons:[],overlayColor:`#000`,...e}}function i(e){return e?t[e]:t}function a(e){n=e}function o(){return n}var s={};function c(e,t){s[e]=t}function l(e){s[e]?.()}function u(){s={}}function d(e){let t=window.getComputedStyle(e);return[t.overflow,t.overflowX,t.overflowY].some(e=>e===`auto`||e===`scroll`)}function f(e,t,n,r){return(e/=r/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}function p(e){let t=`a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])`;return e.flatMap(e=>{let n=e.matches(t),r=Array.from(e.querySelectorAll(t));return[...n?[e]:[],...r]}).filter(e=>getComputedStyle(e).pointerEvents!==`none`&&_(e))}function m(e){if(!e||g(e))return;let t=i(`smoothScroll`),n=e.offsetHeight>window.innerHeight;e.scrollIntoView({behavior:!t||h(e)?`auto`:`smooth`,inline:`center`,block:n?`start`:`center`})}function h(e){if(!e||!e.parentElement)return;let t=e.parentElement;return t.scrollHeight>t.clientHeight}function g(e){let t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}function _(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}var v={};function y(e,t){v[e]=t}function b(e){return e?v[e]:v}function x(){v={}}function S(e,t,n,r){let i=b(`__activeStagePosition`),a=i||n.getBoundingClientRect(),o=r.getBoundingClientRect();i={x:f(e,a.x,o.x-a.x,t),y:f(e,a.y,o.y-a.y,t),width:f(e,a.width,o.width-a.width,t),height:f(e,a.height,o.height-a.height,t)},E(i),y(`__activeStagePosition`,i)}function C(e){if(!e)return;let t=e.getBoundingClientRect(),n={x:t.x,y:t.y,width:t.width,height:t.height};y(`__activeStagePosition`,n),E(n)}function w(){let e=b(`__activeStagePosition`),t=b(`__overlaySvg`);if(!e)return;if(!t){console.warn(`No stage svg found.`);return}let n=window.innerWidth,r=window.innerHeight;t.setAttribute(`viewBox`,`0 0 ${n} ${r}`)}function T(e){let t=D(e);document.body.appendChild(t),X(t,e=>{e.target.tagName===`path`&&l(`overlayClick`)}),y(`__overlaySvg`,t)}function E(e){let t=b(`__overlaySvg`);if(!t){T(e);return}let n=t.firstElementChild;if(n?.tagName!==`path`)throw Error(`no path element found in stage svg`);n.setAttribute(`d`,O(e))}function D(e){let t=window.innerWidth,n=window.innerHeight,r=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);r.classList.add(`driver-overlay`,`driver-overlay-animated`),r.setAttribute(`viewBox`,`0 0 ${t} ${n}`),r.setAttribute(`xmlSpace`,`preserve`),r.setAttribute(`xmlnsXlink`,`http://www.w3.org/1999/xlink`),r.setAttribute(`version`,`1.1`),r.setAttribute(`preserveAspectRatio`,`xMinYMin slice`),r.style.fillRule=`evenodd`,r.style.clipRule=`evenodd`,r.style.strokeLinejoin=`round`,r.style.strokeMiterlimit=`2`,r.style.zIndex=`10000`,r.style.position=`fixed`,r.style.top=`0`,r.style.left=`0`,r.style.width=`100%`,r.style.height=`100%`;let a=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);return a.setAttribute(`d`,O(e)),a.style.fill=i(`overlayColor`)||`rgb(0,0,0)`,a.style.opacity=`${i(`overlayOpacity`)}`,a.style.pointerEvents=`auto`,a.style.cursor=`auto`,r.appendChild(a),r}function O(e){let t=window.innerWidth,n=window.innerHeight,r=i(`stagePadding`)||0,a=i(`stageRadius`)||0,o=e.width+r*2,s=e.height+r*2,c=Math.min(a,o/2,s/2),l=Math.floor(Math.max(c,0)),u=e.x-r+l,d=e.y-r,f=o-l*2,p=s-l*2;return`M${t},0L0,0L0,${n}L${t},${n}L${t},0Z\n    M${u},${d} h${f} a${l},${l} 0 0 1 ${l},${l} v${p} a${l},${l} 0 0 1 -${l},${l} h-${f} a${l},${l} 0 0 1 -${l},-${l} v-${p} a${l},${l} 0 0 1 ${l},-${l} z`}function k(){let e=b(`__overlaySvg`);e&&(Z(e),e.remove())}function A(){let e=b(`popover`);if(!e?.wrapper)return;let t=e.wrapper.getBoundingClientRect(),n=i(`stagePadding`)||0,r=i(`popoverOffset`)||0;return{width:t.width+n+r,height:t.height+n+r,realWidth:t.width,realHeight:t.height}}function j(e,t){let{elementDimensions:n,popoverDimensions:r,popoverPadding:i,popoverArrowDimensions:a}=t;return e===`start`?Math.max(Math.min(n.top-i,window.innerHeight-r.realHeight-a.width),a.width):e===`end`?Math.max(Math.min(n.top-r?.realHeight+n.height+i,window.innerHeight-r?.realHeight-a.width),a.width):e===`center`?Math.max(Math.min(n.top+n.height/2-r?.realHeight/2,window.innerHeight-r?.realHeight-a.width),a.width):0}function M(e,t){let{elementDimensions:n,popoverDimensions:r,popoverPadding:i,popoverArrowDimensions:a}=t;return e===`start`?Math.max(Math.min(n.left-i,window.innerWidth-r.realWidth-a.width),a.width):e===`end`?Math.max(Math.min(n.left-r?.realWidth+n.width+i,window.innerWidth-r?.realWidth-a.width),a.width):e===`center`?Math.max(Math.min(n.left+n.width/2-r?.realWidth/2,window.innerWidth-r?.realWidth-a.width),a.width):0}function N(e,t){let n=b(`popover`);if(!n)return;let{align:r=`start`,side:a=`bottom`}=t?.popover||{},o=r,s=e.id===`driver-dummy-element`?`over`:a,c=i(`stagePadding`)||0,l=A(),u=n.arrow.getBoundingClientRect(),d=e.getBoundingClientRect(),f=d.top-l.height,p=f>=0,m=window.innerHeight-(d.bottom+l.height),h=m>=0,g=d.left-l.width,_=g>=0,v=window.innerWidth-(d.right+l.width),y=v>=0,x=!p&&!h&&!_&&!y,S=s;if(s===`top`&&p?y=_=h=!1:s===`bottom`&&h?y=_=p=!1:s===`left`&&_?y=p=h=!1:s===`right`&&y&&(_=p=h=!1),s===`over`){let e=window.innerWidth/2-l.realWidth/2,t=window.innerHeight/2-l.realHeight/2;n.wrapper.style.left=`${e}px`,n.wrapper.style.right=`auto`,n.wrapper.style.top=`${t}px`,n.wrapper.style.bottom=`auto`}else if(x){let e=window.innerWidth/2-l?.realWidth/2;n.wrapper.style.left=`${e}px`,n.wrapper.style.right=`auto`,n.wrapper.style.bottom=`10px`,n.wrapper.style.top=`auto`}else if(_){let e=Math.min(g,window.innerWidth-l?.realWidth-u.width),t=j(o,{elementDimensions:d,popoverDimensions:l,popoverPadding:c,popoverArrowDimensions:u});n.wrapper.style.left=`${e}px`,n.wrapper.style.top=`${t}px`,n.wrapper.style.bottom=`auto`,n.wrapper.style.right=`auto`,S=`left`}else if(y){let e=Math.min(v,window.innerWidth-l?.realWidth-u.width),t=j(o,{elementDimensions:d,popoverDimensions:l,popoverPadding:c,popoverArrowDimensions:u});n.wrapper.style.right=`${e}px`,n.wrapper.style.top=`${t}px`,n.wrapper.style.bottom=`auto`,n.wrapper.style.left=`auto`,S=`right`}else if(p){let e=Math.min(f,window.innerHeight-l.realHeight-u.width),t=M(o,{elementDimensions:d,popoverDimensions:l,popoverPadding:c,popoverArrowDimensions:u});n.wrapper.style.top=`${e}px`,n.wrapper.style.left=`${t}px`,n.wrapper.style.bottom=`auto`,n.wrapper.style.right=`auto`,S=`top`}else if(h){let e=Math.min(m,window.innerHeight-l?.realHeight-u.width),t=M(o,{elementDimensions:d,popoverDimensions:l,popoverPadding:c,popoverArrowDimensions:u});n.wrapper.style.left=`${t}px`,n.wrapper.style.bottom=`${e}px`,n.wrapper.style.top=`auto`,n.wrapper.style.right=`auto`,S=`bottom`}z(x?`over`:S,o,e),[...n.wrapper.classList].filter(e=>e.startsWith(`driver-popover-side-`)||e.startsWith(`driver-popover-align-`)).forEach(e=>n.wrapper.classList.remove(e)),n.wrapper.classList.add(`driver-popover-side-${S}`),n.wrapper.classList.add(`driver-popover-align-${o}`)}var P=10,F=15;function I(e,t,n,r,i){let a=r-n;return e<=n&&t>=r?i===`start`?20:i===`end`?a-F-P/2:a/2:(Math.min(Math.max(e,n),r)+Math.min(Math.max(t,n),r))/2-n}function L(e,t){let n=F,r=t-F-P;if(r<n)return Math.max(0,(t-P)/2);let i=e-P/2;return Math.min(Math.max(i,n),r)}function R(e,t,n){return e===`left`||e===`right`?t.bottom>n.top&&t.top<n.bottom?e:t.bottom<=n.top?`bottom`:`top`:t.right>n.left&&t.left<n.right?e:t.right<=n.left?`right`:`left`}function z(e,t,n){let r=b(`popover`);if(!r)return;let i=r.arrow;if(i.className=`driver-popover-arrow`,i.style.top=``,i.style.right=``,i.style.bottom=``,i.style.left=``,e===`over`){i.classList.add(`driver-popover-arrow-none`);return}let a=n.getBoundingClientRect(),o=r.wrapper.getBoundingClientRect(),s=R(e,a,o);if(i.classList.add(`driver-popover-arrow-side-${s}`),s===`left`||s===`right`){let e=I(a.top,a.bottom,o.top,o.bottom,t);i.style.top=`${L(e,o.height)}px`}else{let e=I(a.left,a.right,o.left,o.right,t);i.style.left=`${L(e,o.width)}px`}}function B(){let e=document.getElementById(`driver-dummy-element`);if(e)return e;let t=document.createElement(`div`);return t.id=`driver-dummy-element`,t.style.width=`0`,t.style.height=`0`,t.style.pointerEvents=`none`,t.style.opacity=`0`,t.style.position=`fixed`,t.style.top=`50%`,t.style.left=`50%`,document.body.appendChild(t),t}function V(e){let{element:t}=e,n=typeof t==`function`?t():typeof t==`string`?document.querySelector(t):t;n||(n=B()),U(n,e)}function H(){let e=b(`__activeElement`),t=b(`__activeStep`);e&&(C(e),w(),N(e,t))}function U(e,t){let n=i(`duration`)||400,r=Date.now(),a=b(`__activeStep`),s=b(`__activeElement`)||e,c=!s||s===e,l=e.id===`driver-dummy-element`,u=s.id===`driver-dummy-element`,f=i(`animate`),p=t.onHighlightStarted||i(`onHighlightStarted`),h=t?.onHighlighted||i(`onHighlighted`),g=a?.onDeselected||i(`onDeselected`),_=i(),v=b();!c&&g&&g(u?void 0:s,a,{config:_,state:v,driver:o()}),p&&p(l?void 0:e,t,{config:_,state:v,driver:o()});let x=!c&&f,w=!1;te(),y(`previousStep`,a),y(`previousElement`,s),y(`activeStep`,t),y(`activeElement`,e);let T=()=>{if(b(`__transitionCallback`)!==T)return;let c=Date.now()-r,u=n-c<=n/2;t.popover&&u&&!w&&x&&($(e,t),w=!0),i(`animate`)&&c<n?S(c,n,s,e):(C(e),h&&h(l?void 0:e,t,{config:i(),state:b(),driver:o()}),y(`__transitionCallback`,void 0),y(`__previousStep`,a),y(`__previousElement`,s),y(`__activeStep`,t),y(`__activeElement`,e)),window.requestAnimationFrame(T)};y(`__transitionCallback`,T),window.requestAnimationFrame(T),m(e),!x&&t.popover&&$(e,t),document.querySelectorAll(`.driver-active-element-parent`).forEach(e=>{e.classList.remove(`driver-active-element-parent`,`driver-active-element-parent-no-scroll`)}),s.classList.remove(`driver-active-element`,`driver-no-interaction`),s.removeAttribute(`aria-haspopup`),s.removeAttribute(`aria-expanded`),s.removeAttribute(`aria-controls`),(t.disableActiveInteraction??i(`disableActiveInteraction`))&&e.classList.add(`driver-no-interaction`);let E=e.parentElement;E&&E!==document.body&&(E.classList.add(`driver-active-element-parent`),d(E)&&E.classList.add(`driver-active-element-parent-no-scroll`)),e.classList.add(`driver-active-element`),e.setAttribute(`aria-haspopup`,`dialog`),e.setAttribute(`aria-expanded`,`true`),e.setAttribute(`aria-controls`,`driver-popover-content`)}function W(){document.getElementById(`driver-dummy-element`)?.remove(),document.querySelectorAll(`.driver-active-element`).forEach(e=>{let t=e.parentElement;t&&t!==document.body&&t.classList.remove(`driver-active-element-parent`,`driver-active-element-parent-no-scroll`),e.classList.remove(`driver-active-element`,`driver-no-interaction`),e.removeAttribute(`aria-haspopup`),e.removeAttribute(`aria-expanded`),e.removeAttribute(`aria-controls`)})}function G(){let e=b(`__resizeTimeout`);e&&window.cancelAnimationFrame(e),y(`__resizeTimeout`,window.requestAnimationFrame(H))}function K(e){if(!b(`isInitialized`)||!(e.key===`Tab`||e.keyCode===9))return;let t=b(`__activeElement`),n=b(`popover`)?.wrapper,r=p([...n?[n]:[],...t?[t]:[]]),i=r[0],a=r[r.length-1];e.preventDefault(),e.shiftKey?(r[r.indexOf(document.activeElement)-1]||a)?.focus():(r[r.indexOf(document.activeElement)+1]||i)?.focus()}function q(e){(i(`allowKeyboardControl`)??!0)&&(e.key===`Escape`?l(`escapePress`):e.key===`ArrowRight`?l(`arrowRightPress`):e.key===`ArrowLeft`&&l(`arrowLeftPress`))}var J=[`pointerdown`,`mousedown`,`pointerup`,`mouseup`,`click`],Y=new WeakMap;function X(e,t,n){Z(e);let r=r=>{let i=r.target;e.contains(i)&&((!n||n(i))&&(r.preventDefault(),r.stopPropagation(),r.stopImmediatePropagation()),r.type===`click`&&t?.(r))};for(let e of J)document.addEventListener(e,r,!0);Y.set(e,r)}function Z(e){let t=Y.get(e);if(t){for(let e of J)document.removeEventListener(e,t,!0);Y.delete(e)}}function Q(){window.addEventListener(`keyup`,q,!1),window.addEventListener(`keydown`,K,!1),window.addEventListener(`resize`,G),window.addEventListener(`scroll`,G)}function ee(){window.removeEventListener(`keyup`,q),window.removeEventListener(`keydown`,K),window.removeEventListener(`resize`,G),window.removeEventListener(`scroll`,G)}function te(){let e=b(`popover`);e&&(e.wrapper.style.display=`none`)}function $(e,t){let n=b(`popover`);n&&(Z(n.wrapper),n.wrapper.remove()),n=ne(),document.body.appendChild(n.wrapper);let{title:r,description:a,showButtons:s,disableButtons:c,showProgress:u,nextBtnText:d=i(`nextBtnText`)||`Next`,prevBtnText:f=i(`prevBtnText`)||`Previous`,progressText:h=i(`progressText`)||`{current} of {total}`}=t.popover||{};n.nextButton.innerHTML=d,n.previousButton.innerHTML=f,n.progress.innerHTML=h;let g=i(`steps`)||[],_=b(`activeIndex`),v=_!==void 0&&_===g.length-1;v&&n.nextButton.classList.add(`driver-popover-done-btn`),r?(n.title.innerHTML=r,n.title.style.display=`block`):n.title.style.display=`none`,a?(n.description.innerHTML=a,n.description.style.display=`block`):n.description.style.display=`none`;let x=s||i(`showButtons`),S=u||i(`showProgress`)||!1,C=x?.includes(`next`)||x?.includes(`previous`)||S;n.closeButton.style.display=x.includes(`close`)?`block`:`none`,C?(n.footer.style.display=`flex`,n.progress.style.display=S?`block`:`none`,n.nextButton.style.display=x.includes(`next`)?`block`:`none`,n.previousButton.style.display=x.includes(`previous`)?`block`:`none`):n.footer.style.display=`none`;let w=c||i(`disableButtons`)||[];w?.includes(`next`)&&(n.nextButton.disabled=!0,n.nextButton.classList.add(`driver-popover-btn-disabled`)),w?.includes(`previous`)&&(n.previousButton.disabled=!0,n.previousButton.classList.add(`driver-popover-btn-disabled`)),w?.includes(`close`)&&(n.closeButton.disabled=!0,n.closeButton.classList.add(`driver-popover-btn-disabled`));let T=n.wrapper;T.style.display=`block`,T.style.left=``,T.style.top=``,T.style.bottom=``,T.style.right=``,T.id=`driver-popover-content`,T.setAttribute(`role`,`dialog`),T.setAttribute(`aria-labelledby`,`driver-popover-title`),T.setAttribute(`aria-describedby`,`driver-popover-description`);let E=n.arrow;E.className=`driver-popover-arrow`,T.className=`driver-popover ${t.popover?.popoverClass||i(`popoverClass`)||``}`.trim(),X(n.wrapper,n=>{let r=n.target,a=t.popover?.onNextClick||i(`onNextClick`),s=t.popover?.onPrevClick||i(`onPrevClick`),c=t.popover?.onCloseClick||i(`onCloseClick`),u=t.popover?.onDoneClick||i(`onDoneClick`);if(r.closest(`.driver-popover-next-btn`))return v&&u?u(e,t,{config:i(),state:b(),driver:o()}):a?a(e,t,{config:i(),state:b(),driver:o()}):l(`nextClick`);if(r.closest(`.driver-popover-prev-btn`))return s?s(e,t,{config:i(),state:b(),driver:o()}):l(`prevClick`);if(r.closest(`.driver-popover-close-btn`))return c?c(e,t,{config:i(),state:b(),driver:o()}):l(`closeClick`)},e=>n?.description.contains(e)||n?.title.contains(e)?!1:!!e.closest(`.driver-popover-prev-btn, .driver-popover-next-btn, .driver-popover-close-btn`)),y(`popover`,n);let D=t.popover?.onPopoverRender||i(`onPopoverRender`);D&&D(n,{config:i(),state:b(),driver:o()}),N(e,t),m(T);let O=p([T,...e.classList.contains(`driver-dummy-element`)?[]:[e]]);O.length>0&&O[0].focus()}function ne(){let e=document.createElement(`div`);e.classList.add(`driver-popover`);let t=document.createElement(`div`);t.classList.add(`driver-popover-arrow`);let n=document.createElement(`header`);n.id=`driver-popover-title`,n.classList.add(`driver-popover-title`),n.style.display=`none`,n.innerText=`Popover Title`;let r=document.createElement(`div`);r.id=`driver-popover-description`,r.classList.add(`driver-popover-description`),r.style.display=`none`,r.innerText=`Popover description is here`;let i=document.createElement(`button`);i.type=`button`,i.classList.add(`driver-popover-close-btn`),i.setAttribute(`aria-label`,`Close`),i.innerHTML=`&times;`;let a=document.createElement(`footer`);a.classList.add(`driver-popover-footer`);let o=document.createElement(`span`);o.classList.add(`driver-popover-progress-text`),o.innerText=``;let s=document.createElement(`span`);s.classList.add(`driver-popover-navigation-btns`);let c=document.createElement(`button`);c.type=`button`,c.classList.add(`driver-popover-prev-btn`,`driver-popover-footer-btn`),c.innerHTML=`Previous`;let l=document.createElement(`button`);return l.type=`button`,l.classList.add(`driver-popover-next-btn`,`driver-popover-footer-btn`),l.innerHTML=`Next`,s.appendChild(c),s.appendChild(l),a.appendChild(o),a.appendChild(s),e.appendChild(i),e.appendChild(t),e.appendChild(n),e.appendChild(r),e.appendChild(a),{wrapper:e,arrow:t,title:n,description:r,footer:a,previousButton:c,nextButton:l,closeButton:i,footerButtons:s,progress:o}}function re(){let e=b(`popover`);e&&(Z(e.wrapper),e.wrapper.parentElement?.removeChild(e.wrapper))}function ie(e={}){r(e);function t(){i(`allowClose`)&&g()}function n(){let e=i(`overlayClickBehavior`);if(i(`allowClose`)&&e===`close`){g();return}if(typeof e==`function`){let t=b(`__activeStep`);e(b(`__activeElement`),t,{config:i(),state:b(),driver:o()});return}if(e===`nextStep`){let e=b(`activeStep`),t=b(`activeElement`),n=i(`steps`)||[],r=b(`activeIndex`)===n.length-1,a=e?.popover?.onDoneClick||i(`onDoneClick`);if(r&&a){a(t,e,{config:i(),state:b(),driver:o()});return}let c=e?.popover?.onNextClick||i(`onNextClick`);if(c){c(t,e,{config:i(),state:b(),driver:o()});return}s()}}function s(){let e=b(`activeIndex`),t=i(`steps`)||[];if(e===void 0)return;let n=e+1;t[n]?h(n):g()}function l(){let e=b(`activeIndex`),t=i(`steps`)||[];if(e===void 0)return;let n=e-1;t[n]?h(n):g()}function d(e){(i(`steps`)||[])[e]?h(e):g()}function f(){if(b(`__transitionCallback`))return;let e=b(`activeIndex`),t=b(`__activeStep`),n=b(`__activeElement`);if(e===void 0||t===void 0||!(i(`steps`)||[])[e-1])return;let r=t.popover?.onPrevClick||i(`onPrevClick`);if(r)return r(n,t,{config:i(),state:b(),driver:o()});l()}function p(){if(b(`__transitionCallback`))return;let e=b(`activeIndex`),t=b(`__activeStep`),n=b(`__activeElement`);if(e===void 0||t===void 0)return;let r=e===(i(`steps`)||[]).length-1,a=t.popover?.onDoneClick||i(`onDoneClick`);if(r&&a)return a(n,t,{config:i(),state:b(),driver:o()});let c=t.popover?.onNextClick||i(`onNextClick`);if(c)return c(n,t,{config:i(),state:b(),driver:o()});s()}function m(){b(`isInitialized`)||(y(`isInitialized`,!0),document.body.classList.add(`driver-active`,i(`animate`)?`driver-fade`:`driver-simple`),i(`allowScroll`)||document.body.classList.add(`driver-no-scroll`),document.body.style.setProperty(`--driver-animation-duration`,`${i(`duration`)||400}ms`),Q(),c(`overlayClick`,n),c(`escapePress`,t),c(`closeClick`,t),c(`arrowLeftPress`,f),c(`arrowRightPress`,p))}function h(e=0){let t=i(`steps`);if(!t){console.error(`No steps to drive through`),g();return}if(!t[e]){g();return}y(`__activeOnDestroyed`,document.activeElement),y(`activeIndex`,e);let n=t[e],r=t[e+1],a=t[e-1],o=n.popover?.doneBtnText||i(`doneBtnText`)||`Done`,s=i(`allowClose`),c=n.popover?.showProgress===void 0?i(`showProgress`):n.popover?.showProgress,l=(n.popover?.progressText||i(`progressText`)||`{{current}} of {{total}}`).replace(`{{current}}`,`${e+1}`).replace(`{{total}}`,`${t.length}`),u=n.popover?.showButtons||i(`showButtons`),d=[`next`,`previous`,...s?[`close`]:[]].filter(e=>!u?.length||u.includes(e)),f=n.popover?.onNextClick||i(`onNextClick`),p=n.popover?.onPrevClick||i(`onPrevClick`),m=n.popover?.onCloseClick||i(`onCloseClick`);V({...n,popover:{showButtons:d,nextBtnText:r?void 0:o,disableButtons:[...a?[]:[`previous`]],showProgress:c,onNextClick:f||(()=>{r?h(e+1):g()}),onPrevClick:p||(()=>{h(e-1)}),onCloseClick:m||(()=>{g()}),...n?.popover||{},progressText:l}})}function g(e=!0){let t=b(`__activeElement`),n=b(`__activeStep`),r=b(`__activeOnDestroyed`),a=i(`onDestroyStarted`);if(e&&a){a(!t||t?.id===`driver-dummy-element`?void 0:t,n,{config:i(),state:b(),driver:o()});return}let s=n?.onDeselected||i(`onDeselected`),c=i(`onDestroyed`);document.body.classList.remove(`driver-active`,`driver-fade`,`driver-simple`,`driver-no-scroll`),document.body.style.removeProperty(`--driver-animation-duration`),ee(),re(),W(),k(),u();let l=b();if(x(),t&&n){let e=t.id===`driver-dummy-element`;s&&s(e?void 0:t,n,{config:i(),state:l,driver:o()}),c&&c(e?void 0:t,n,{config:i(),state:l,driver:o()})}r&&r.focus()}let _={isActive:()=>b(`isInitialized`)||!1,refresh:G,drive:(e=0)=>{m(),h(e)},setConfig:r,setSteps:e=>{x(),r({...i(),steps:e})},getConfig:i,getState:b,getActiveIndex:()=>b(`activeIndex`),isFirstStep:()=>b(`activeIndex`)===0,isLastStep:()=>{let e=i(`steps`)||[],t=b(`activeIndex`);return t!==void 0&&t===e.length-1},getActiveStep:()=>b(`activeStep`),getActiveElement:()=>b(`activeElement`),getPreviousElement:()=>b(`previousElement`),getPreviousStep:()=>b(`previousStep`),getNextStep:()=>{let e=i(`steps`)||[],t=b(`activeIndex`);return t===void 0?void 0:e[t+1]},moveNext:s,movePrevious:l,moveTo:d,hasNextStep:()=>{let e=i(`steps`)||[],t=b(`activeIndex`);return t!==void 0&&!!e[t+1]},hasPreviousStep:()=>{let e=i(`steps`)||[],t=b(`activeIndex`);return t!==void 0&&!!e[t-1]},highlight:e=>{m(),V({...e,popover:e.popover?{showButtons:[],showProgress:!1,progressText:``,...e.popover}:void 0})},destroy:()=>{g(!1)}};return a(_),_}return e.driver=ie,e})({});export const driver=_d.js.driver;\n", "import { driver } from \"../vendors/driver/driver.js\";\n\nconst STORAGE_KEY = \"billow-tours-completed\";\n\n// ---------------------------------------------------------------------------\n// Persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction getCompleted() {\n  try {\n    return JSON.parse(localStorage.getItem(STORAGE_KEY)) || {};\n  } catch {\n    return {};\n  }\n}\n\nfunction setCompleted(tours) {\n  try {\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(tours));\n  } catch {\n    /* quota exceeded \u2014 ignore */\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Tour manager\n// ---------------------------------------------------------------------------\n\nconst BillowTour = {\n  markCompleted(name) {\n    const completed = getCompleted();\n    completed[name] = true;\n    setCompleted(completed);\n  },\n\n  isCompleted(name) {\n    return !!getCompleted()[name];\n  },\n\n  resetAll() {\n    setCompleted({});\n  },\n\n  reset(name) {\n    const completed = getCompleted();\n    delete completed[name];\n    setCompleted(completed);\n  },\n\n  start(name, options = {}) {\n    const tourConfig = TOURS[name];\n    if (!tourConfig) {\n      console.warn(`BillowTour: unknown tour \"${name}\"`);\n      return;\n    }\n\n    const steps = typeof tourConfig.steps === \"function\"\n      ? tourConfig.steps()\n      : tourConfig.steps;\n\n    const d = driver({\n      showProgress: true,\n      showButtons: [\"next\", \"previous\", \"close\"],\n      doneBtnText: \"Termin\u00E9\",\n      nextBtnText: \"Suivant\",\n      prevBtnText: \"Pr\u00E9c\u00E9dent\",\n      closeBtnText: \"Passer\",\n      progressText: \"{{current}} / {{total}}\",\n      ...tourConfig.options,\n      steps,\n      onDestroyed: () => {\n        this.markCompleted(name);\n        if (tourConfig.onComplete) tourConfig.onComplete();\n        if (options.onComplete) options.onComplete();\n      },\n    });\n\n    d.drive();\n  },\n\n  scheduleNext(name) {\n    try { sessionStorage.setItem(\"billow-start-tour\", name); } catch {}\n  },\n\n  autoStart() {\n    if (window.__billow_disable_mujs) return;\n\n    let pendingTour;\n    try {\n      pendingTour = sessionStorage.getItem(\"billow-start-tour\");\n      if (pendingTour) sessionStorage.removeItem(\"billow-start-tour\");\n    } catch {}\n\n    if (pendingTour) {\n      this.reset(pendingTour);\n      setTimeout(() => this.start(pendingTour), 500);\n      return;\n    }\n\n    // Match the current path against page\u2192tour map (prefix match)\n    const path = window.location.pathname;\n    for (const [pattern, tourName] of Object.entries(PAGE_TOUR_MAP)) {\n      if (path.startsWith(pattern) || path === pattern) {\n        const tourCfg = TOURS[tourName];\n        if (tourCfg?.autoStart && !this.isCompleted(tourName)) {\n          setTimeout(() => this.start(tourName), 400);\n        }\n        return;\n      }\n    }\n  },\n\n};\n\n// ---------------------------------------------------------------------------\n// Page \u2192 tour mapping (auto-start \u2014 only welcome + default-accounts)\n// ---------------------------------------------------------------------------\n\nconst PAGE_TOUR_MAP = {\n  \"/dashboard/\": \"welcome\",\n  \"/accounts/settings/\": \"default-accounts\",\n};\n\n// ---------------------------------------------------------------------------\n// Helper\n// ---------------------------------------------------------------------------\n\nfunction step(element, title, description, side = \"bottom\", opts = {}) {\n  return { element, popover: { title, description, side, ...opts } };\n}\n\n// ---------------------------------------------------------------------------\n// Tour definitions\n// ---------------------------------------------------------------------------\n\nconst TOURS = {\n\n  // \u2500\u2500 Welcome (Dashboard) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  welcome: {\n    autoStart: true,\n    steps: [\n      {\n        popover: {\n          title: \"Bienvenue sur Billow ! \uD83C\uDF89\",\n          description:\n            \"D\u00E9couvrons ensemble comment g\u00E9rer vos finances simplement, par SMS ou Telegram.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      step(\n        \"header nav\",\n        \"Navigation\",\n        \"Utilisez la barre de navigation pour acc\u00E9der \u00E0 vos d\u00E9penses, revenus, comptes et bien plus.\",\n        \"bottom\"\n      ),\n      step(\n        \"button[onclick*='command-palette']\",\n        \"Palette de commandes\",\n        \"Cliquez ici ou tapez \u2318K pour ouvrir la palette. Recherchez, naviguez et cr\u00E9ez des transactions en une ligne.\",\n        \"bottom\"\n      ),\n      {\n        popover: {\n          title: \"Cr\u00E9ation rapide\",\n          description:\n            \"Dans la palette, tapez <code>&gt;</code> pour passer en mode cr\u00E9ation, puis&nbsp;:\"\n            + \"<br><br><code>5k caf\u00E9 @supermarch\u00E9</code>&nbsp;&nbsp;\u2192 d\u00E9pense\"\n            + \"<br><code>500k salaire +</code>&nbsp;&nbsp;\u2192 revenu\"\n            + \"<br><code>5k retrait @momo @caisse &gt;</code>&nbsp;&nbsp;\u2192 transfert\",\n          side: \"top\",\n          align: \"center\",\n        },\n      },\n      {\n        popover: {\n          title: \"Configurons vos comptes\",\n          description:\n            \"Avant de commencer, param\u00E9trez vos comptes par d\u00E9faut. C'est rapide !\",\n          side: \"bottom\",\n          align: \"center\",\n          onNextClick: () => {\n            window.location.href = \"/accounts/settings/\";\n          },\n        },\n      },\n    ],\n  },\n\n  // \u2500\u2500 Default Accounts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \"default-accounts\": {\n    autoStart: true,\n    onComplete() {\n      window.location.href = \"/help/\";\n    },\n    steps: [\n      {\n        popover: {\n          title: \"Comptes par d\u00E9faut\",\n          description:\n            \"D\u00E9finissez les comptes utilis\u00E9s automatiquement pour vos transactions rapides et vos imports.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      step(\n        \"label[for='id_default_expense_account']\",\n        \"Compte de d\u00E9penses\",\n        \"S\u00E9lectionnez le compte depuis lequel vous faites vos d\u00E9penses (ex&nbsp;: MTN MoMo, Banque, Esp\u00E8ces).\",\n        \"bottom\"\n      ),\n      step(\n        \"label[for='id_default_revenue_account']\",\n        \"Compte de revenus\",\n        \"S\u00E9lectionnez le compte sur lequel vous recevez de l'argent.\",\n        \"bottom\"\n      ),\n      {\n        popover: {\n          title: \"Comptes par op\u00E9rateur\",\n          description:\n            \"Si vous avez plusieurs comptes Mobile Money, d\u00E9finissez un compte diff\u00E9rent pour chaque op\u00E9rateur. Sinon, laissez le compte de d\u00E9penses par d\u00E9faut.\",\n          side: \"top\",\n          align: \"center\",\n        },\n      },\n      {\n        popover: {\n          title: \"Comptes de frais\",\n          description:\n            \"Les frais des op\u00E9rateurs (SMS, transferts) sont enregistr\u00E9s s\u00E9par\u00E9ment. Vous pouvez modifier les tiers ici.\",\n          side: \"top\",\n          align: \"center\",\n        },\n      },\n      step(\n        \"button.btn[type='submit']\",\n        \"Enregistrer\",\n        \"N'oubliez pas de sauvegarder vos r\u00E9glages !\",\n        \"top\"\n      ),\n      {\n        popover: {\n          title: \"Et maintenant ?\",\n          description:\n            \"Vous \u00EAtes pr\u00EAt \u00E0 utiliser Billow&nbsp;! Consultez <strong>Aide</strong> dans la barre de navigation pour d\u00E9couvrir les autres visites guid\u00E9es&nbsp;: comptes, budgets, \u00E9ch\u00E9ances, SMS, Telegram et plus. Vous pouvez aussi ouvrir la palette de commandes (<kbd>\u2318K</kbd>) et chercher \u00AB&nbsp;visite&nbsp;\u00BB pour en rejouer une \u00E0 tout moment.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n    ],\n  },\n\n  // \u2500\u2500 Accounts listing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  accounts: {\n    steps: () => [\n      {\n        popover: {\n          title: \"Vos comptes\",\n          description:\n            \"Ici vous voyez tous vos comptes&nbsp;: actifs (banque, mobile money, esp\u00E8ces), tiers (destinataires de paiements) et passifs (dettes).\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      step(\n        \"a[href*='/accounts/new/']\",\n        \"Nouveau compte\",\n        \"Cliquez ici pour cr\u00E9er un nouveau compte (actif, tiers ou passif).\",\n        \"left\"\n      ),\n    ],\n  },\n\n  // \u2500\u2500 Recurring transactions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  recurring: {\n    steps: [\n      {\n        popover: {\n          title: \"\u00C9ch\u00E9ances (transactions r\u00E9currentes)\",\n          description:\n            \"Automatisez vos transactions r\u00E9guli\u00E8res&nbsp;: loyer, salaire, abonnements, \u00E9pargne. Billow les cr\u00E9e automatiquement \u00E0 la date pr\u00E9vue.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      step(\n        \"a[href*='/recurring/new/']\",\n        \"Nouvelle \u00E9ch\u00E9ance\",\n        \"Cr\u00E9ez une transaction r\u00E9currente&nbsp;: choisissez la fr\u00E9quence, le montant, et le mode (brouillon \u00E0 valider ou automatique).\",\n        \"left\"\n      ),\n    ],\n  },\n\n  // \u2500\u2500 SMS Sync \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \"sms-sync\": {\n    steps: [\n      {\n        popover: {\n          title: \"Synchronisation SMS\",\n          description:\n            \"Billow peut lire vos notifications bancaires et Mobile Money re\u00E7ues par SMS pour cr\u00E9er automatiquement des transactions. N\u00E9cessite l'application Android.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      {\n        popover: {\n          title: \"Filtres SMS\",\n          description:\n            \"Chaque op\u00E9rateur a des formats de SMS diff\u00E9rents. Billow inclut des filtres pr\u00EAts \u00E0 l'emploi pour MTN MoMo, Moov Money et CeltiisCash.\",\n          side: \"top\",\n          align: \"center\",\n        },\n      },\n      {\n        popover: {\n          title: \"Configuration\",\n          description:\n            \"Installez l'application Android Billow, activez la synchronisation SMS, et vos transactions appara\u00EEtront automatiquement dans vos brouillons.\",\n          side: \"top\",\n          align: \"center\",\n        },\n      },\n    ],\n  },\n\n  // \u2500\u2500 Telegram \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  telegram: {\n    steps: [\n      {\n        popover: {\n          title: \"Telegram\",\n          description:\n            \"Connectez votre compte Telegram pour cr\u00E9er des transactions par message. Tapez simplement <code>5000 courses @carrefour</code> dans le chat&nbsp;!\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n    ],\n  },\n\n  // \u2500\u2500 Budgets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  budgets: {\n    steps: [\n      {\n        popover: {\n          title: \"Budgets\",\n          description:\n            \"D\u00E9finissez des limites de d\u00E9penses par cat\u00E9gorie et suivez votre consommation. Les budgets peuvent \u00EAtre mensuels, trimestriels ou annuels.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      step(\n        \"a[href*='/budgets/new/']\",\n        \"Nouveau budget\",\n        \"Cr\u00E9ez un budget&nbsp;: choisissez un montant, une p\u00E9riode et les cat\u00E9gories concern\u00E9es.\",\n        \"left\"\n      ),\n    ],\n  },\n\n  // \u2500\u2500 Categories \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  categories: {\n    steps: [\n      {\n        popover: {\n          title: \"Cat\u00E9gories\",\n          description:\n            \"Organisez vos transactions par cat\u00E9gorie pour mieux analyser vos d\u00E9penses.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      {\n        popover: {\n          title: \"R\u00E8gles de classification\",\n          description:\n            \"Les r\u00E8gles attribuent automatiquement une cat\u00E9gorie et des tags \u00E0 vos transactions. Elles sont g\u00E9n\u00E9r\u00E9es automatiquement quand vous modifiez un brouillon avant de le confirmer&nbsp;: Billow apprend de vos corrections.\"\n            + \"<br><br>Vous pouvez aussi cr\u00E9er des r\u00E8gles manuellement.\",\n          side: \"top\",\n          align: \"center\",\n          onNextClick: () => {\n            window.location.href = \"/classifications/rules/\";\n          },\n        },\n      },\n    ],\n  },\n\n  // \u2500\u2500 Plugins \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  plugins: {\n    steps: [\n      {\n        popover: {\n          title: \"Plugins\",\n          description:\n            \"Les plugins ajoutent des fonctionnalit\u00E9s \u00E0 Billow&nbsp;: imports de relev\u00E9s bancaires, int\u00E9grations, nouveaux formats de fichiers.\",\n          side: \"bottom\",\n          align: \"center\",\n        },\n      },\n      {\n        popover: {\n          title: \"Activer / d\u00E9sactiver\",\n          description:\n            \"Activez ou d\u00E9sactivez un plugin en un clic. D\u00E9sactiver un plugin masque ses pages et ses formats d'import sans supprimer vos donn\u00E9es.\",\n          side: \"top\",\n          align: \"center\",\n        },\n      },\n    ],\n  },\n};\n\n// ---------------------------------------------------------------------------\n// Expose\n// ---------------------------------------------------------------------------\n\nwindow.BillowTour = BillowTour;\n\ndocument.addEventListener(\"DOMContentLoaded\", () => BillowTour.autoStart());\ndocument.addEventListener(\"mu:after-render\", () => BillowTour.autoStart());\n", "import \"../vendors/datastar/datastar.js\";\nimport \"../vendors/basecoat/basecoat.js\";\nimport \"../vendors/basecoat/dropdown-menu.js\";\nimport \"../vendors/basecoat/command.js\";\nimport \"../vendors/basecoat/select.js\";\nimport \"../vendors/basecoat/tabs.js\";\nimport \"../vendors/mujs/mu.js\";\nimport \"./charts.js\";\nimport \"./budget-autoselect.js\";\nimport \"./batch-select.js\";\n\n// ---------------------------------------------------------------------------\n// BatchSelect wiring \u2014 replaces the synchronous stub from base.html.\n// Inline page scripts call installBatchSelect() before this module loads;\n// the stub queues them in window._bsQueue.  We drain it now.\n// ---------------------------------------------------------------------------\n(() => {\n  let _queue = window._bsQueue || [];\n  delete window._bsQueue;\n\n  const _drain = () => {\n    for (let i = 0; i < _queue.length; i++) {\n      const q = _queue[i];\n      if (window[q.name]) window[q.name].destroy();\n      q.config.checkboxSelector = q.selector;\n      window[q.name] = new window.BatchSelect(q.config);\n    }\n  };\n\n  window.installBatchSelect = (name, selector, config) => {\n    _queue = _queue.filter(q => q.name !== name);\n    _queue.push({ name, selector, config });\n    _drain();\n  };\n\n  _drain();\n\n  // mu.js navigation: destroy old instances BEFORE the new page's\n  // inline scripts run and re-populate the queue.\n  document.addEventListener(\"mu:before-render\", () => {\n    for (let i = 0; i < _queue.length; i++) {\n      const q = _queue[i];\n      if (window[q.name]) window[q.name].destroy();\n    }\n    _queue = [];\n  });\n})();\n\nimport \"./widgets/tags-input.js\";\nimport \"./widgets/multi-select-search.js\";\nimport \"./widgets/index.js\";\nimport \"./accordion.js\";\nimport \"./tour.js\";\n\n(function () {\n  \"use strict\";\n\n  function setupCommandPalette() {\n    document.addEventListener(\"keydown\", (event) => {\n      if (!((event.metaKey || event.ctrlKey) && event.key === \"k\")) return;\n      event.preventDefault();\n      const dialog = document.getElementById(\"command-palette\");\n      if (!dialog) return;\n      dialog.open ? dialog.close() : dialog.showModal();\n    });\n  }\n\n  function setupTheme() {\n    try {\n      const stored = localStorage.getItem(\"themeMode\");\n      const dark = stored\n        ? stored === \"dark\"\n        : matchMedia(\"(prefers-color-scheme: dark)\").matches;\n      document.documentElement.classList.toggle(\"dark\", dark);\n    } catch (_) {\n    }\n\n    const apply = (dark) => {\n      document.documentElement.classList.toggle(\"dark\", dark);\n      try {\n        localStorage.setItem(\"themeMode\", dark ? \"dark\" : \"light\");\n      } catch (_) {\n      }\n    };\n\n    document.addEventListener(\"basecoat:theme\", (event) => {\n      const mode = event.detail?.mode;\n      apply(\n        mode === \"dark\"\n          ? true\n          : mode === \"light\"\n            ? false\n            : !document.documentElement.classList.contains(\"dark\")\n      );\n    });\n  }\n\n  function setupMu() {\n    if (!window.mu) return;\n    // Skip on landing page \u2014 full page navigation only\n    if (window.__billow_disable_mujs) return;\n\n    window.mu.init({\n      target: \"#app-shell\",\n      source: \"#app-shell\",\n    });\n\n    document.addEventListener(\"mu:after-render\", () => {\n      window.initCharts?.();\n      window.BillowWidgets?.init();\n    });\n\n    document.addEventListener(\"mu:fetch-error\", (event) => {\n      const url = event.detail?.url || event.detail?.lastUrl || window.location.href;\n      window.location.assign(url);\n    });\n  }\n\n  setupTheme();\n  setupCommandPalette();\n\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    setupMu();\n    window.BillowWidgets?.init();\n  });\n})();\n"],
  "mappings": "MAAA,IAAMA,GAAAA,iBAAkBC,GACXC,uBACUC,GAAA,iBACaC,GAAA,0BACOC,GAAA,wBCFxBC,EAAA,SAAOC,GAAA,iBAAUC,GAAe,iBCEzCC,GACR,aAAeC,GAAAJ,EAAA,gBACPK,GAAAD,GAAA,aAAwBD,EAAO,EAAAG,GAAAD,KACrC,KAAAE,GAAO,GAAAD,GAAA,CAAA,GAAA,CAAAD,GAAeG,MAAS,IAAA,MAEXA,mDAWtBC,EAAAA,GAEA,gBACEN,EAAA,EAAMO,GAAMF,OACE,cAAW,aAGvBA,WAGN,CAEaG,WACLC,GAA+B,EACrC,aAAuB,GAAKC,CAAO,CACjC,CAAA,CAAA,IAAaC,GAAK,CAAA,EAAA,IAAM,CAAGR,KACXS,EAAK,MACfP,IAAW,EAAA,KAAQQ,GAAKC,GAASD,aACvCR,CAAAA,EAAW,CAAA,EACbU,GACA,GAAAX,GACFA,GCuBA,WACMY,CAA6C,EAAC,EAChDC,GAAa,IACC,IACdC,GACAC,CAAAA,EACAC,IACAC,CAAU,GAEDC,CAAanB,GAAA,OAE1B,SAGO,GAAEc,EAAAA,CACLM,EAAAA,IACAC,EAAS,YAKDJ,EACVA,KAGWK,GAAc,CAAA,KACbN,CAAAA;GG5DSO,EAAAC,GAAA,IAAAC,CAAgBC,EAAG,GAAAH,EAAK,OAAKA,EAAA,IAAAI,EAAAjC,EAAA,cAAA,QAAA,EAAAkC,GAAAD,EAAA,4BAAAF,CAAA,EAAA,EAAA/B,EAAA,KAAA,YAAAiC,CAAA,EAAAA,EAAA,OAAA,EAAA,IAAAE,EAAAF,EAAA,EAAA,GAAA,CAAAE,EAAA,MAAA,IAAA,MAAA,8CAAA,EAAA,OAAAL,GAAA,IAAAC,EAAAI,CAAA,EAAAA,CAAA,EAAAC,GAAA,OAAA,QAAA,OAAA,UAAA,eAAA,KAAAC,GAAA,GAAA,IAAA,MAAA,OAAA,GAAA,WAAA,OAAA,eAAA,CAAA,IAAA,OAAA,WAAA,OAAA,eAAA,CAAA,IAAA,MAAAC,GAAA,GAAA,CAAA,QAAA,KAAA,EAAA,GAAAF,GAAA,EAAA,CAAA,EAAA,MAAA,GAAA,MAAA,EAAA,EAAAG,GAAA,CAAA,EAAA,IAAA,CAAA,QAAAR,KAAA,EAAA,CAAA,IAAAF,EAAA,EAAAE,CAAA,EAAAM,GAAAR,CAAA,GAAA,MAAA,QAAAA,CAAA,EAAAU,GAAAV,EAAA,CAAA,EAAA,EAAAE,CAAA,EAAA,EAAAF,CAAA,CAAA,CAAA,EAAAW,GAAA,GAAA,CAAA,IAAA,EAAA,CAAA,EAAA,OAAA,CAAAT,EAAAF,CAAA,IAAA,EAAA,CAAA,IAAAI,EAAAF,EAAA,MAAA,GAAA,EAAAI,EAAAF,EAAA,IAAA,EAAAQ,EAAAR,EAAA,OAAA,CAAAS,EAAA,IAAAA,EAAA,KAAAA,EAAA,GAAA,CAAA,GAAA,CAAA,EAAAD,EAAAN,CAAA,EAAAN,CAAA,CAAA,OAAA,CAAA,EAAAc,GAAA,CAAA,EAAAC,GAAA,CAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAAC,GAAAC,GAAA,EAAAC,GAAA,IAAA,CAAAN,IAAA,EAAAO,GAAA,IAAA,CAAA,EAAAP,KAAAQ,GAAA,EAAAC,GAAA,EAAA,EAAAC,GAAA,GAAA,CAAAP,GAAA,CAAA,EAAAC,GAAA,EAAAD,EAAA,EAAAC,GAAA,CAAA,EAAAO,GAAA,IAAA,CAAAP,GAAAD,IAAA,EAAAA,GAAAA,IAAA,CAAA,EAAAS,GAAA,GAAAC,GAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAAC,GAAA,OAAA,UAAA,EAAAC,GAAA,GAAA,CAAA,IAAA,EAAAC,GAAA,KAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,CAAA,EAAA,OAAA,EAAAF,EAAA,EAAA,EAAA,CAAA,EAAAG,GAAA,GAAA,CAAA,IAAA,EAAA,CAAA,EAAA,EAAA,EAAA,CAAA,EAAAb,IAAAc,GAAA,EAAAd,EAAA,EAAAM,GAAA,CAAA,EAAAJ,GAAA,EAAA,GAAA,CAAA,EAAA,EAAA,CAAA,QAAA,CAAAC,GAAA,EAAAI,GAAA,CAAA,CAAA,OAAAQ,GAAA,KAAA,EAAA,CAAA,CAAA,EAAAX,GAAA,IAAA,CAAA,KAAAP,GAAAC,IAAA,CAAA,IAAA,EAAAH,GAAAE,EAAA,EAAAF,GAAAE,IAAA,EAAA,OAAAmB,GAAA,EAAA,EAAA,GAAA,GAAA,CAAA,CAAAnB,GAAA,EAAAC,GAAA,CAAA,EAAAmB,GAAA,GAAA,MAAA,EAAAC,GAAA,CAAA,EAAAC,GAAA,EAAA,EAAA,CAAA,EAAAD,GAAA,GAAA,CAAAZ,GAAA,CAAA,EAAAc,GAAA,CAAA,EAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,OAAA,KAAA,EAAA,EAAA,EAAA,EAAA,CAAA,EAAA,QAAA,CAAAb,GAAA,EAAAc,GAAA,CAAA,CAAA,CAAA,EAAAF,GAAA,CAAA,EAAA,KAAA,EAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,IAAAG,GAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,GAAA,IAAAxC,EAAA,EAAA,EAAAA,EAAAwC,GAAAxC,EAAA,CAAA,EAAAa,GAAAG,IAAA,EAAA,CAAA,CAAA,EAAAkB,GAAA,CAAA,EAAA,IAAA,CAAA,GAAA,EAAA,IAAA,EAAA,IAAAO,GAAA,EAAA,EAAA,CAAA,EAAA,CAAAjB,GAAA,CAAA,EAAAc,GAAA,CAAA,EAAAlB,GAAA,EAAA,GAAA,CAAA,EAAA,EAAA,CAAA,QAAA,CAAAC,GAAA,EAAAI,GAAA,EAAAc,GAAA,CAAA,CAAA,CAAA,MAAA,CAAA,EAAA,KAAA,EAAA,EAAA,EAAA,KAAA,IAAAvC,EAAA,EAAA,EAAA,KAAAA,GAAA,CAAA,IAAAF,EAAAE,EAAA,EAAAE,EAAAJ,EAAA,EAAAI,EAAA,IAAAgC,GAAApC,EAAAA,EAAA,EAAAI,EAAA,GAAA,EAAAF,EAAAA,EAAA,CAAA,CAAA,EAAA2B,GAAA,CAAA,KAAA,IAAA,CAAA,GAAA,EAAA,OAAA,CAAA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAA,GAAA,CAAA,EAAA,EAAA,GAAA,IAAA7B,EAAA,EAAA,EAAA,OAAAA,IAAA4C,GAAA5C,CAAA,EAAAgB,IAAAQ,GAAA,GAAA,EAAA,CAAA,MAAA,EAAA,CAAA,IAAAtB,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAAqC,GAAA,EAAArC,CAAA,EAAA,CAAA,IAAAF,EAAA,EAAA,EAAAA,GAAA6C,GAAA7C,CAAA,CAAA,CAAA,OAAAoB,IAAAc,GAAA,EAAAd,EAAA,EAAAlB,CAAA,EAAA8B,GAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,IAAA,EAAA,IAAAW,GAAA,EAAA,EAAA,CAAA,GAAA,GAAAL,GAAA,CAAA,EAAA,CAAA,IAAApC,EAAA,EAAA,EAAAA,GAAA2C,GAAA3C,CAAA,CAAA,OAAA,EAAA,KAAA,EAAA,EAAA,EAAA,KAAA,OAAAkB,IAAAc,GAAA,EAAAd,EAAA,EAAA,EAAA,CAAA,EAAAe,GAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,KAAA,GAAA,EAAAW,GAAA,EAAA,CAAA,EAAA,IAAA5C,EAAA,EAAA,EAAAA,GAAA4C,GAAA5C,CAAA,EAAA,EAAA,EAAA,CAAA,EAAAgC,GAAA,CAAA,EAAA,IAAA,CAAA,IAAAhC,EAAA,EAAA,EAAA,GAAAA,GAAAA,EAAA,IAAA,EAAA,OAAA,IAAAF,EAAAE,EAAAA,EAAA,EAAA,EAAA,EAAA,GAAAF,GAAAA,EAAA,IAAA,EAAA,CAAAA,EAAA,EAAAqB,GAAA,EAAA,EAAArB,EAAA,MAAA,CAAA,IAAAI,EAAA,EAAA,EAAA,GAAAA,GAAAA,EAAA,IAAAiB,IAAAjB,EAAA,IAAA,EAAA,OAAA,IAAAE,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA,EAAAe,GAAA,EAAA,EAAA,EAAA,EAAA,EAAAnB,EAAA,EAAAF,EAAA,EAAAI,CAAA,EAAAJ,IAAAA,EAAA,EAAAM,GAAAJ,EAAAA,EAAA,EAAAI,EAAA,EAAA,EAAAA,EAAAF,EAAAA,EAAA,EAAAE,EAAA,EAAA,EAAAA,CAAA,EAAAwC,GAAA,CAAA,EAAA,EAAA,EAAA,IAAA,CAAA,IAAA5C,EAAA,EAAA,EAAAF,EAAA,EAAA,EAAAI,EAAA,EAAA,EAAAE,EAAA,EAAA,EAAAM,EAAA,EAAA,EAAA,GAAAR,EAAAA,EAAA,EAAAJ,EAAA,EAAA,EAAAA,EAAAA,EAAAA,EAAA,EAAAI,EAAA,EAAA,EAAAA,EAAAE,EAAAA,EAAA,EAAAM,EAAAV,EAAA,EAAAU,EAAAA,EAAAA,EAAA,EAAAN,UAAA,EAAAJ,EAAA,EAAAI,GAAA,GAAA,MAAAJ,EAAA,CAAA,IAAAW,EAAAX,EAAA,EAAA,GAAAW,EAAA,CAAAX,EAAA,EAAA,GAAA,GAAAW,EAAAiC,GAAAjC,EAAAX,CAAA,QAAAW,EAAA,CAAA,KAAA,MAAAX,GAAAiC,GAAAjC,CAAA,EAAA,OAAAE,CAAA,EAAAwC,GAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA1C,EAAA,EAAA,OAAA,CAAA,IAAAF,EAAA,EAAA,EAAAI,EAAAJ,EAAA,EAAA,GAAAI,EAAA,GAAAA,EAAA,GAAAA,EAAA,EAAA,EAAAA,EAAA,KAAA2C,GAAA,EAAA/C,CAAA,GAAAA,EAAA,EAAAI,EAAA,GAAAA,GAAA,GAAAA,EAAA,EAAAJ,EAAA,EAAAI,EAAA,GAAA,GAAAA,EAAA,EAAAJ,EAAA,EAAAI,EAAA,GAAAA,EAAA,GAAAsC,GAAA1C,CAAA,EAAAI,EAAA,EAAA,CAAA,IAAAE,EAAAN,EAAA,EAAA,GAAAM,EAAA,CAAA,IAAAM,GAAA,EAAAN,GAAA,EAAAM,IAAAV,EAAA,CAAA,EAAA,EAAAA,CAAA,EAAA,EAAAU,GAAA,QAAA,CAAA,CAAA,GAAA,EAAA,EAAA,CAAA,EAAA,EAAA,EAAA,QAAA,CAAA,KAAAV,GAAA,GAAA,EAAAA,EAAA,EAAAA,EAAAA,EAAA,EAAA,EAAA,CAAA,EAAA,EAAA,EAAA,SAAA,CAAA,CAAA,KAAA,CAAA,EAAAsC,GAAA,GAAA,CAAAnB,KAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,EAAA,IAAA,CAAA,EAAAoB,GAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAAvC,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,KAAAA,GAAAA,EAAA4C,GAAA5C,EAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAAyC,GAAA,CAAA,EAAA,IAAA,CAAA,IAAAzC,EAAAF,EAAA,EAAAI,EAAA,GAAA,EAAA,OAAA,CAAA,IAAAE,EAAA,EAAA,EAAAM,EAAAN,EAAA,EAAA,GAAA,EAAA,EAAA,GAAAF,EAAA,YAAAQ,EAAA,MAAA,IAAA,GAAAyB,GAAA/B,CAAA,EAAA,CAAA,IAAAO,EAAAP,EAAA,EAAAO,EAAA,GAAAgC,GAAAhC,CAAA,EAAAT,EAAA,EAAA,WAAAQ,EAAA,MAAA,GAAA,EAAA,EAAA,GAAA,EAAA,KAAAV,EAAA,CAAA,EAAA,EAAA,EAAAA,CAAA,GAAA,EAAAI,EAAA,EAAA,EAAAA,EAAA,EAAAN,EAAA,QAAA,CAAA,GAAA,CAAAI,EAAA,CAAA,IAAAS,EAAA,EAAA,EAAA,GAAAA,EAAA,CAAA,EAAAA,EAAA,QAAA,CAAA,CAAA,KAAAb,KAAA,CAAA,IAAAa,EAAA,EAAA,EAAA,EAAAA,EAAA,EAAA,GAAA,GAAA,EAAAX,EAAA,EAAAA,EAAAA,EAAA,GAAA,EAAAW,EAAAT,EAAA,CAAA,GAAAiC,GAAA,CAAA,EAAA,CAAA,GAAAQ,GAAAhC,CAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAAT,EAAA,EAAA,MAAA,EAAA,GAAA,IAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA,EAAA,EAAA,EAAA,SAAA,CAAA,CAAA,CAAA,OAAAA,CAAA,CAAA,EAAAyC,GAAA,GAAA,CAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA3C,EAAA,EAAA,GAAAA,EAAA,MAAA,KAAA,EAAA,EAAAA,EAAA,GAAAA,EAAA,GAAAwC,GAAA,CAAA,EAAA,OAAA,EAAA,EAAA,EAAA,EAAAK,GAAA,CAAA,EAAA,IAAA,CAAA,IAAA7C,EAAA,EAAA,EAAA,KAAAA,GAAA,CAAA,GAAAA,IAAA,EAAA,MAAA,GAAAA,EAAAA,EAAA,CAAA,CAAA,MAAA,EAAA,EAAA8C,GAAA,GAAA,CAAA,IAAA,EAAAC,GAAA/C,EAAA,EAAA,MAAA,GAAA,EAAA,QAAAF,KAAAE,EAAA,CAAA,GAAA,GAAA,MAAA,CAAAK,GAAA,EAAAP,CAAA,EAAA,OAAA,EAAA,EAAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAAkD,GAAA,CAAA,EAAA,EAAA,KAAA,CAAA,IAAAhD,EAAA,MAAA,QAAA,CAAA,EAAA,GAAAA,GAAAM,GAAA,CAAA,EAAA,CAAA,IAAAR,EAAAE,EAAA,CAAA,EAAA,CAAA,EAAA,QAAAI,KAAA,EAAAN,EAAAM,CAAA,EAAAsB,GAAAsB,GAAA,EAAA5C,CAAA,EAAA,GAAA,EAAAA,CAAA,GAAA,CAAA,EAAA,IAAAF,EAAAwB,GAAA,CAAA,EAAA,OAAA,IAAA,MAAA5B,EAAA,CAAA,IAAAM,EAAAM,EAAA,CAAA,GAAA,EAAAA,IAAA,UAAA,CAAAL,GAAAP,EAAAY,CAAA,GAAA,OAAAV,GAAAU,KAAA,MAAA,WAAAR,EAAA,EAAAJ,EAAAY,CAAA,GAAA,OAAAA,GAAA,SAAAZ,EAAAY,CAAA,IAAA,CAAAL,GAAAP,EAAAY,CAAA,GAAAZ,EAAAY,CAAA,EAAA,GAAA,QAAAZ,EAAAY,CAAA,EAAAgB,GAAA,EAAA,EAAAH,GAAA,EAAAb,EAAA,EAAA,EAAAR,EAAAA,EAAA,EAAA,CAAA,GAAAJ,EAAAY,CAAA,EAAA,EAAA,EAAA,IAAAN,EAAAM,EAAAC,EAAA,CAAA,IAAA,EAAA,EAAAD,EAAA,GAAAV,GAAAU,IAAA,SAAA,CAAA,IAAA,EAAAZ,EAAAY,CAAA,EAAAC,EAAA,GAAAb,EAAAY,CAAA,EAAAC,EAAA,EAAA,EAAA,CAAA,IAAAsC,EAAA,CAAA,EAAA,QAAAC,EAAAvC,EAAAuC,EAAApD,EAAAY,CAAA,EAAAwC,IAAAD,EAAAC,CAAA,EAAA,KAAA3B,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA0B,CAAA,EAAA/C,EAAAA,EAAA,EAAA,CAAA,CAAA,CAAA,SAAAG,GAAAP,EAAAY,CAAA,EAAA,GAAAC,GAAA,KAAA,OAAAb,EAAAY,CAAA,UAAAL,GAAAM,EAAAiB,EAAA,EAAA9B,EAAAY,CAAA,EAAAC,EAAAY,GAAA,EAAA,EAAA,MAAA,CAAA,IAAA,EAAAzB,EAAAY,CAAA,EAAA,EAAAuC,EAAA,GAAA,CAAA,IAAA,GAAA3C,GAAA,CAAA,GAAAA,GAAAK,CAAA,EAAA,CAAA,QAAAuC,KAAA,EAAA7C,GAAAM,EAAAuC,CAAA,IAAA,OAAA,EAAAA,CAAA,EAAA3B,GAAA0B,EAAAC,EAAA,IAAA,GAAA,QAAAA,KAAAvC,EAAA,CAAA,IAAAwC,EAAAxC,EAAAuC,CAAA,EAAA,EAAAA,CAAA,IAAAC,IAAA,EAAAD,CAAA,EAAAC,EAAA,CAAA,MAAArD,EAAAY,CAAA,EAAAsC,GAAArC,EAAAsC,CAAA,CAAA,GAAA1B,GAAA,EAAAZ,CAAA,CAAA,MAAAA,GAAA,OAAAN,GAAAM,EAAAiB,EAAA,GAAA9B,EAAAY,CAAA,EAAAC,EAAAY,GAAA,EAAA,EAAA,IAAAzB,EAAAY,CAAA,EAAAgB,GAAAsB,GAAArC,EAAA,GAAA,CAAA,GAAA,CAAA,EAAAY,GAAA,EAAAZ,CAAA,GAAAT,EAAAA,EAAA,EAAA,CAAA,GAAA,MAAA,EAAA,EAAA,eAAAE,EAAAM,EAAA,CAAA,OAAA,OAAAZ,EAAAY,CAAA,EAAAR,EAAAA,EAAA,EAAA,CAAA,EAAA,EAAA,EAAA,SAAA,CAAA,OAAAA,EAAA,EAAA,QAAA,QAAAJ,CAAA,CAAA,EAAA,IAAAM,EAAAM,EAAA,CAAA,OAAAR,EAAA,EAAAQ,KAAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAAyB,GAAA,CAAA,EAAA,IAAA,CAAA,GAAA,IAAA,QAAA,IAAA,QAAAX,GAAA,KAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAAE,IAAAF,GAAA,OAAA,CAAA,IAAAZ,EAAAS,GAAAG,EAAA,EAAAA,GAAA,OAAA,EAAA3C,EAAA,cAAA,IAAA,YAAAD,GAAA,CAAA,OAAAgC,CAAA,CAAA,CAAA,CAAA,CAAA,EAAAoD,GAAA,CAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,IAAA,CAAAhC,GAAA,EAAA,QAAApB,KAAA,EAAA,EAAAA,CAAA,GAAA,KAAA,GAAA,OAAA+C,GAAA/C,CAAA,EAAAqD,GAAA,EAAArD,CAAA,EAAAA,EAAA+C,GAAA,GAAA,CAAA,EAAA1B,GAAA,CAAA,EAAAiC,GAAA,CAAA,EAAA,IAAAF,GAAA3C,GAAA,CAAA,EAAA,CAAA,EAAA4C,GAAA,CAAA,EAAA,EAAArD,EAAAF,EAAAI,IAAA,CAAA,GAAAI,GAAA,CAAA,EAAA,CAAAD,GAAAL,EAAA,CAAA,IAAAM,GAAAN,EAAA,CAAA,CAAA,GAAA,MAAA,QAAAA,EAAA,CAAA,CAAA,KAAAA,EAAA,CAAA,EAAA,CAAA,GAAA,QAAAI,KAAA,EAAA,EAAAA,CAAA,GAAA,KAAAF,GAAA,OAAAF,EAAA,CAAA,EAAAI,CAAA,EAAAiD,GAAA,EAAAjD,CAAA,EAAAA,EAAAJ,EAAA,CAAA,EAAA,GAAAF,EAAA,CAAA,IAAAI,CAAA,CAAA,MAAAA,GAAAG,GAAAL,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,EAAA,EAAAuD,GAAA,GAAA,OAAA,GAAA,SAAA,OAAA,EAAA,QAAA,WAAA,EAAA,CAAA,EAAA,EAAAC,GAAA,CAAA,CAAA,QAAA,EAAA,KAAA,QAAA,EAAA,MAAA,EAAA,CAAA,EAAAxD,EAAA+C,KAAA,CAAA,IAAAjD,EAAAyD,GAAA,CAAA,EAAArD,EAAAqD,GAAA,CAAA,EAAAnD,EAAA,CAAA,EAAAM,EAAA,CAAA,CAAAV,EAAA,EAAA,CAAA,EAAA,KAAAU,EAAA,QAAA,CAAA,GAAA,CAAAC,EAAA,CAAA,EAAAD,EAAA,IAAA,EAAA,QAAA,KAAAC,EAAA,CAAA,IAAAsC,EAAA,EAAA,EAAA3C,GAAAK,EAAA,CAAA,CAAA,EAAAD,EAAA,KAAA,CAAAC,EAAA,CAAA,EAAA,GAAAsC,CAAA,GAAA,CAAA,EAAAnD,EAAA,KAAAmD,CAAA,GAAA,CAAA/C,EAAA,KAAA+C,CAAA,GAAA7C,EAAA,KAAA,CAAA6C,EAAAH,GAAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAAxC,GAAAL,CAAA,CAAA,EAAA2C,GAAAC,GAAA,CAAA,CAAA,EAAAS,GAAA,GAAA,aAAA,aAAA,aAAA,YAAA,aAAA,cAAAC,GAAA,GAAA,EAAA,QAAA,wBAAA,OAAA,EAAA,QAAA,qBAAA,OAAA,EAAA,QAAA,oBAAA,OAAA,EAAA,QAAA,oBAAA,OAAA,EAAA,QAAA,UAAA,GAAA,EAAA,YAAA,EAAAC,GAAA,GAAAD,GAAA,CAAA,EAAA,QAAA,MAAA,GAAA,EAAA,CAAA,EAAA,YAAA,CAAA,EAAAE,GAAA,GAAAF,GAAA,CAAA,EAAA,QAAA,KAAA,GAAA,EAAAG,GAAA,GAAA,OAAA,GAAA,UAAA,EAAA,KAAA,IAAA,OAAAC,GAAA,gFAAAC,GAAA,GAAAC,GAAA,CAAA,EAAA,WAAA,CAAA,GAAA,EAAA,EAAAC,GAAA,CAAA,EAAA,EAAA,CAAA,IAAA,CAAA,GAAA,CAAA,sBAAAjE,EAAA,EAAA,EAAA,EAAA,GAAA,CAAA,OAAAA,EAAA,KAAA,MAAA,EAAA,CAAAF,EAAAI,IAAA,CAAA,GAAA,OAAAA,GAAA,SAAA,OAAAA,EAAA,IAAAE,EAAAF,EAAA,KAAA,EAAA,GAAA,CAAA4D,GAAA,KAAA1D,CAAA,EAAA,OAAAF,EAAA,GAAA,CAAA,IAAAQ,EAAAqD,GAAA3D,CAAA,EAAA,OAAA,OAAAM,GAAA,WAAAA,EAAAR,CAAA,MAAA,CAAA,OAAAA,CAAA,CAAA,CAAA,EAAA,KAAA,MAAA,CAAA,CAAA,MAAA,CAAA,OAAA6D,GAAA,CAAA,CAAA,CAAA,EAAAG,GAAA,CAAA,MAAA,GAAA,EAAA,QAAA,UAAA,GAAA,EAAA,CAAA,EAAA,YAAA,CAAA,EAAA,MAAA,GAAA,EAAA,QAAA,KAAA,GAAA,EAAA,OAAA,GAAA,EAAA,CAAA,EAAA,YAAA,EAAAA,GAAA,MAAA,EAAA,MAAA,CAAA,CAAA,CAAA,EAAAC,GAAA,CAAA,EAAA,EAAAnE,EAAA,UAAA,CAAA,QAAAF,KAAA,EAAA,IAAA,MAAA,GAAA,CAAAE,CAAA,EAAA,EAAAkE,GAAApE,CAAA,IAAA,CAAA,GAAA,EAAA,OAAA,CAAA,EAAAsE,GAAA,GAAA,QAAA,CAAA,GAAAC,GAAA,GAAA,EAAAC,GAAA,+BAAAC,GAAA,CAAA,EAAA,EAAAvE,EAAA,CAAA,IAAA,CAAA,OAAA,OAAAA,EAAA,CAAA,EAAA,IAAAF,EAAA,IAAA,MAAAI,EAAA0D,GAAA,CAAA,EAAAxD,EAAA,IAAA,gBAAA,CAAA,SAAA,KAAA,UAAAJ,CAAA,CAAA,CAAA,EAAA,SAAA,EAAAU,EAAA,KAAA,UAAAV,EAAA,KAAA,CAAA,EAAA,OAAAF,EAAA,QAAA,GAAA,CAAA;aAAewE,EAC1DE,IAGHC,CAAAA,IAA2CrE,CAAI;WAkW1CsE,CAAAA,GAAM5E,CAAA,EAAK6E,GAIpB,IAAMC,IAAUC,GAAI,IACH,IAAAC,GAAO,IAAA,IAASC,GAAA,IAAA,MAAYC,CAAG,EAAA,CAAA,IAAK,CAAI,EACrDC,IACJN,GAAA,IAAA,CAAWO,GAAAA,MAAc,IAAA,CAAA,EAASC,IAChCR,GAAA,IAAUO,CAAM,EAAC,QACP,IAAA,QAAqB,QACnBE,EAAI,EAChBC,IAAY,IAAA,GAAA,eAkBPA,IAEJ,EAAA,CAAA,EAAQC,GAAA,IAAA,IAAAC,GAAA,CAAA,EAAAC,GAAA,IAAA,IAAAC,GAAA,IAAiC,IAAMC,GAE/C,GAAAC,GAAA,GAAQ,CAAAJ,GAAA,KAAA,CAAA,EAAAA,GAAA,SAAA,GAAA,WAAuCK,IAE3C,CAAA,QAAS5F,KACTuF,GAAOC,GAAcK,IAAiB7F,EAAA,IAAM,EAAA6E,GAAS,IAAM7E,EAAA,KAGlEqF,CAAOA,EAAKE,GAAA,OAAA,EAAW,IAAA,EAAAE,GAAA,KAAA,CAAA,GAAAA,EAAA,EAAA,CAAAxH,EAA0B,eAAA,EAAA,QAGjD+B,KAAY8F,EAAIC,GAAA/F,EAAK4E,CACnBS,GAAOA,IAAKrF,CAAA,CAAA,EAAAwF,GAAWJ,MAGrB,CACF,CAAA,CAAA,EAAM1G,GAAK,GAAA,CAAAiG,GAAA,IAAS,EAAA,KAAW,CAAA,CAAA,EAAA1G,EAAA,iBAAoC+H,IACnE,GAAA,CAAA,IAAQC,EAAAA,GAAkBC,IACxB,EAAA,OAA8BC,IAA2BD,EAAAA,GACvD,EAAA,MAAYE,CAAM,MAAK7B,GACrB,KAAA,EAAU,CAAA,OAAM,CAAA,KAAU,UAC1B,KAAA,EAAW,IAAI0B,EAAG,QAAY,CAAA,GAAA,EAAA,OAC9B,GAAA,IAAY,EACV,OAAA,OACA,CAAA,CAAA,CAAAvB,EAEJ,EAAC,OACsB,OAErB,CAAA,EAAA,EAAA,IACE2B,GACE,GACA,CAAAvB,GAAAqB,IACA,EAAA,KACA,CAAA,CAAA,EAAAG,GAAA,GACF,CACA,QAGJ,KAAMC,EAAI,CAAA,IAAAvG,EAAAsF,GAAA,IAAA,CAAA,EACZ,GACAtF,GACEsF,GAAA,OAAUW,CAAIO,EAAMC,QAAQ3G,KAAkBE,EAChD,OAASwE,EACP,QAAAtE,KAAAJ,EAAQ,OAAO,EACTsG,EACJ,CACE,CAAA,EAAAM,GAAAtC,GAAS,QAAS,EAAIuC,GAAKV,IAAGS,EAAA,IAAQE,GACtC,GAAA,EAAA,aACE,GAAWvB,EACX,QAEF,GAAA,CAAA,CAAA,EAAOb,QACTmC,EACA,EAAAE,GAAA,CAAA,EAAA,IAAA,CAAA,QAGN7G,KACF,EAAA,GAAiB,CACf4G,GAAA5G,CAAA,EAAA,CAAA,IAAAF,EAAA,IAAQ,IAAO,QAGXI,KAAAF,EAAA,QACE,CAAA,IAAWqF,EACXnF,EAAA,QAEF,SAAS,KACX,EACA,YAAA,EAAAJ,EAAA,IACFM,CACF,EACF0G,GCneO9G,EACLI,EAAAJ,EAAM,QACNE,CAAA,EAAA,CAAA,CAAMuB,CAAAA,QAEJvB,KACE,MAAOxB,KACTsB,EAAA,UAIJ,EAAC,CCHDyG,GACE,CAAAvG,EAAA,KAAM,WACN,OAAkD,EAGhD6G,SACeC,IAAe5G,EAC9B6G,EAAaC,KAAcxC,MACV,CAAA,EACjB7E,EACF,ICVF4G,CAAAA,GACEK,GAAA9G,EAAMI,EAAAF,EAAA,MAAA,CACN,CAAA,CAAA,CAAA,EAAAiH,GAASC,GAGPL,CAAAA,OACMG,CAAAA,OACND,EAAaC,KAA4BG,EAAQ,cCPrDvH,EAAA,WAGmCI,EAAA,aAI/BE,CAAA,IAAA,EAAO,GAAAJ,IACH,YAAS,CAAA,QAAOU,KAAAN,EAASqD,GAC3BxD,CACA,IACEqG,GAAA,CAAA5F,CAAA,CAAA4G,EACAhB,GAAA5F,EAAA,iBACA6G,GAAc,CAAA,GAAA,QACd7G,KAAAR,EAAAuD,GAAiB/C,CAAA,IAAAmG,GAAAW,CAAU9G,CAAA,CAAA,EAAAmG,GAAMnG,EAAA,iBAAwB,GACzD,CAAA,EAAA,SAAAV,IAAAyH,cAEA3H,EAAA,WAAA,OAAA4H,GAAsBjE,GAAA,CAAA,GACtB,CAAAmD,GAAAe,CAAAA,EAAQ,CAAA,IAAAjH,EACRZ,EAAA,MAAA,CAAA,EAAAa,EAAAiH,GAAgBlH,CAAA,EAChB,GAAA,CAAAC,EAAA,SAAc,IACd,EAAA,EAAA,aAAiBb,CACjB,EAAA,GAAA,IAAA,KAAA+H,CAAAA,IACF,EAAevC,GAAC,IAEhB,CAAA,EAAMwC,GACJJ,EAAAA,CAAAA,IAAAA,EAAAA,EAAAA,IAA+B/G,CAAA,EAAA,GAAAsC,EAAA,CAAA,QAE3BC,KAAID,EAAA,OAAA,EAAAC,EAAA,EACNwE,EAAAA,OAAwB/G,CAAA,CAAA,CAC1BoH,CAAAA,MAAajB,GAAIkB,EAAItH,EAAE,CAAA,CAAA,CAAI,EAC3BqH,GAAS,IAAI5J,GAAAgJ,EAAQ,EAAAc,GAAI,GAAA,CAAA,GAAY,CACnCH,EAAAA,GAAW9H,CAAA,EAAA,EAAM,MAEjB,IAAM,EAAA,CAAAF,EAAQI,CAAA,EAAA,EAAA,MACf,OAGCgI,EAAY9H,EAAA,IAEhB,IACE,QAAUM,KACRV,EAAA,CAAA,GAAMoG,CAAMzF,EAAA,GAAA,CAAA,EAAAD,EAAA,MAAA,GAAA,EAAsBN,EAAE,IAAAO,EAAA8F,IAGtC,IAAM0B,CAAAA,CAAsC,CAC1C,CAAA,MAAQ,CAAA,WAAArI,EAAA,IAAAI,EAAA,KAAAE,CAAA,CAAA,EAAA,GAAA,IAAAqF,GAAA,IAAAxH,EAAA,eACR,EAAAmK,GAAA,IAAoB,CACtB1C,IACI6B,CAAAA,GAAgB,IAAA7B,GAClByC,GAAelK,EAAA,cAAkB,IAAA,MAAAH,EAAA,CAAA,EAAA,EAAAiI,GAEnC,CAAA,EAAMsC,EAAAA,gBAAyB,EAAGF,KAK5BG,CAAAA,GACJ,CAAA,GAAAzB,GAAA0B,CAAAA,CACA,EAAA,EAAA,EAAA1B,GAAAwB,EACA,iBACA,GAAA,EAAA,EAAAV,EACA,IAAAa,GAAA,QACA,EAAA,CAAA,QAAA,GACA,UAAA,GAAA,WACA,EAAA,CAAA,EAAA/C,GAAAoC,IACA,CAAA,EAAAO,GAAQN,EAAW,EAAAhB,GACnB,CAAA,EAAA,EAAQ9G,EAAAF,IAAO2I,CAAAA,IACTA,EAASpE,GAAA,CAAA,EAAA,GAAU,CAAAnE,EACrBwI,OAAqBzC,GAAM,CAAA,WAAiB7F,EAAA,IAAOM,EAAA,KAAWC,CAAC,EACnEsH,GACA/H,CAAA,EAAA,EAAA2E,GAAYsB,IACV/F,CAAA,EAAI,IAAK,CAAAN,GAAA0F,GAAM,IAAApF,CAAA,IAAW,EAAA,CAAA,IAAA6C,EAAU,CAAG,GAAA,EAAA,OACjC0F,EAAOxC,KAAIxF,EACXiI,MAENrE,GAAA,KAAWsE,EAAAA,CAAAA,OAAY,CAAK,KAAA,YAAM,KAAA,EAAA,IAAA,EAAA,QAAA,CAAA,GAAA,EAAA,GAAA,IAAA,EAAA,OAAA,EAAA,WAAA,CAAA,OAAA3I,EAAA,IAAAQ,EAAA,MAAAV,CAAA,CAAA,CAAA,EAAA,IAAAU,EAAA,MAAAV,EAAA,kBAAA,CAAA,QAAA,IAAA,IAAA2E,GAAA,KAAA,CAAA,EAAA,WAAA,IAAA,IAAAE,GAAA,KAAA,CAAA,CAAA,EAAA,GAAA,MAAA,EAAA,EAAA,EAAA,cAAA,OAAA,EAAA,aAAA,SAAA,EAAA,YAAA,EAAA,YAAA,MAAA,UAAA1B,EAAA,EAAA,cAAA,OAAA,EAAA,aAAA,SAAA,EAAA,YAAA,EAAA,YAAA,QAAA,UAAA2F,EAAApI,GAAA,MAAAA,IAAA,GAAAqI,EAAA/I,GAAA,MAAAA,IAAA,GAAA,GAAA8I,GAAA,GAAA,IAAA,SAAA,MAAA7F,EAAA,MAAA,eAAA,UAAA,IAAA,OAAA,MAAAA,EAAA,MAAA,aAAA,EAAA,GAAA8F,GAAA,GAAA5F,IAAA,SAAA,MAAAF,EAAA,MAAA,iBAAA,UAAAE,IAAA,OAAA,MAAAF,EAAA,MAAA,eAAA,EAAA,GAAA,IAAA,aAAAE,IAAA,YAAA,CAAA,GAAA2F,GAAAC,EAAA,MAAA9F,EAAA,MAAA,qBAAA,EAAA,GAAA,CAAA6F,GAAA,CAAAC,EAAA,MAAA9F,EAAA,MAAA,oBAAA,CAAA,CAAA,IAAA+F,EAAA,IAAA,IAAA,GAAAD,EAAA,CAAA,IAAAE,EAAAhG,EAAA,GAAA,IAAA6C,KAAAmD,IAAAA,EAAAC,GAAAlJ,EAAA,CAAA,EAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAAAgJ,CAAA,CAAA,GAAAC,EAAA,EAAA,GAAAnD,CAAA,EAAA,CAAA,IAAAqD,EAAA,EAAA,MAAAlG,CAAA,EAAAkG,GAAAH,EAAA,IAAA,YAAAG,CAAA,EAAA,IAAAC,EAAA9D,GAAA,IAAA,CAAA,EAAA,GAAA8D,EAAA,CAAA,IAAAH,EAAAG,EAAA,IAAAlJ,CAAA,EAAA,GAAA+I,EAAA,QAAAnD,KAAAmD,EAAA,OAAA,EAAAnD,EAAA,CAAA,MAAAsD,EAAA,IAAA,IAAA9D,GAAA,IAAA,EAAA8D,CAAA,EAAAA,EAAA,IAAAlJ,EAAA8I,CAAA,CAAA,CAAA,EAAAK,GAAA,GAAA,EAAA,MAAA,GAAA,EAAA,OAAA,CAAA,EAAArJ,IAAA,GAAA,CAAA,KAAAA,CAAA,KAAA,GAAA,EAAAkJ,GAAA,CAAA,EAAA,CAAA,EAAA,EAAA,GAAA,EAAAlJ,EAAA,CAAA,EAAA,EAAAF,EAAA,IAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAAI,EAAA,GAAA,GAAA,EAAA,CAAA,IAAAE,EAAA,4KAAAM,EAAA,EAAA,KAAA,EAAA,MAAAN,CAAA,EAAA,GAAAM,EAAA,CAAA,IAAAC,EAAAD,EAAA,OAAA,EAAA,EAAAA,EAAAC,CAAA,EAAA,KAAA,EAAA,EAAA,WAAA,QAAA,IAAAD,EAAAC,CAAA,EAAA,WAAA,CAAA,MAAAT,EAAAQ,EAAA,KAAA;CAAI,CAAA,CAAG,MACjCN,EAAIyI,EAAK,KAAA,EAAQ3I,EAAAA,EAAG,QACX,oIAMyC,CAAAE,EAAAM,EAAAC,IAAAD,IAAA,QAAAC,IAAA,OAAAP,EAAAM,IAAA,OAAA,MAAAA,EAAA,QAAA,uBAAA,CAAA,EAAA,IAAA2I,GAAA,CAAA,CAAA,CAAA,IAAAA,GAAA1I,CAAA,CAAA,EAAAT,EAAAA,EAAA,WAAA,yBAAA,oBAAA,EAAA,GAAA,CAAA,IAAAE,EAAA4D,GAAA,CAAA,KAAA,IAAA,WAAA,MAAA,GAAAhE,CAAA,EAAAE,CAAA,EAAA,MAAA,CAAAQ,KAAAC,IAAA,CAAA,IAAA,EAAA,CAAA,EAAAsC,KAAAC,IAAA,CAAA,IAAAC,EAAAoB,GAAA,KAAA,EAAA,CAAA,OAAA,CAAA,KAAA,SAAA,KAAA,CAAA,EAAA,QAAA,CAAA,GAAA7D,EAAA,GAAA,IAAAA,EAAA,OAAA,EAAA,WAAA,CAAA,UAAAR,EAAA,MAAA,CAAA,CAAA,CAAA,EAAA,EAAA6E,GAAA,CAAA,EAAA,GAAA,EAAA,OAAA,EAAA,CAAA,GAAArE,EAAA,IAAAuC,EAAA,MAAAE,EAAA,SAAArD,CAAA,EAAA,GAAAoD,CAAA,EAAA,MAAAC,EAAA,iBAAA,CAAA,EAAA,GAAA,CAAA,OAAA/C,EAAAM,EAAAqC,GAAA,EAAA,OAAA,GAAApC,CAAA,CAAA,OAAA,EAAA,CAAA,MAAA,QAAA,MAAA,CAAA,EAAA4D,GAAA,CAAA,QAAA,CAAA,GAAA7D,EAAA,GAAA,IAAAA,EAAA,OAAA,EAAA,WAAA,CAAA,UAAAR,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA,OAAA,EAAA,mBAAA,CAAA,CAAA,CAAA,OAAAE,EAAA,CAAA,MAAA,QAAA,MAAAA,CAAA,EAAAmE,GAAA,CAAA,WAAA,CAAA,UAAArE,EAAA,MAAA,CAAA,EAAA,MAAAE,EAAA,OAAA,EAAA,oBAAA,CAAA,CAAA,EAAAkJ,GAAA,CAAA,KAAA,OAAA,MAAA,EAAA,EAAA,CAAA9H,GAAA,EAAA,GAAA,CAAA,OAAA,EAAA,CAAA,QAAA,CAAAC,GAAA,CAAA,CAAA,CAAA,CAAA,EAAA6H,GAAA,CAAA,KAAA,SAAA,MAAA,EAAA,EAAAtJ,EAAA,CAAAwB,GAAA,EAAA,IAAA1B,EAAA0D,GAAAxD,CAAA,EAAAQ,GAAAV,EAAA,IAAA,CAAA,EAAAsD,GAAAtD,CAAA,EAAA2B,GAAA,CAAA,CAAA,CAAA,EAAA6H,GAAA,CAAA,KAAA,YAAA,MAAA,EAAA,EAAA,CAAA9H,GAAA,EAAA,IAAAxB,EAAAwD,GAAA,CAAA,EAAAhD,GAAAR,EAAAF,GAAA,CAAAA,CAAA,EAAAsD,GAAApD,CAAA,EAAAyB,GAAA,CAAA,CAAA,CAAA,EAAA,IAAA8H,GAAA,IAAA,IAAAC,GAAA,GAAA,CAAA,CAAA,MAAA,QAAA,EAAA,SAAA,CAAA,EAAAC,GAAA,CAAA,EAAA,EAAAzJ,EAAA,KAAAsJ,GAAA,CAAA,KAAA,EAAA,MAAA,MAAA,CAAA,GAAAxJ,EAAA,IAAAI,EAAA,MAAAE,EAAA,SAAAM,CAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAAsC,EAAA,OAAA,cAAA,CAAA,QAAAC,EAAA,KAAA,QAAAC,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAAnD,EAAA,QAAA+I,EAAA,oBAAAC,EAAA,OAAA,MAAAG,EAAA,OAAA,cAAAC,EAAA,IAAA,YAAAH,EAAA,EAAA,aAAAnD,EAAA,IAAA,cAAA4D,EAAA,EAAA,EAAA,CAAA,IAAA,CAAA,IAAAC,EAAAX,aAAA,gBAAAA,EAAA,IAAA,gBAAAY,EAAA,IAAA,CAAA,GAAA,GAAAZ,IAAA,QAAAA,IAAA,UAAA,CAAA,IAAAa,EAAAN,GAAA,IAAA,CAAA,GAAA,IAAA,IAAAM,EAAA,IAAAlJ,CAAA,GAAA,MAAA,EAAAkJ,EAAA,IAAAlJ,EAAAgJ,CAAA,EAAAJ,GAAA,IAAA,EAAAM,CAAA,CAAA,CAAAb,IAAA,YAAAtI,EAAA,IAAAkJ,CAAA,IAAA,EAAAlJ,EAAA,IAAAkJ,EAAA,SAAA,CAAAD,EAAA,MAAA,EAAA,MAAA,QAAA,QAAA,CAAA,CAAA,GAAA,IAAAG,EAAA,IAAA,CAAA,EAAA,GAAA,CAAA,GAAA,CAAAnJ,GAAA,OAAA,MAAAP,EAAA,qBAAA,CAAA,OAAAkJ,EAAA,CAAA,EAAA,IAAAO,EAAA,CAAA,OAAA,iDAAA,mBAAA,EAAA,EAAA5G,IAAA,QAAAuG,GAAA,CAAA,IAAAK,EAAA,cAAA,EAAA,oBAAA,OAAA,OAAAA,EAAA,CAAA,EAAA,IAAAE,EAAA,CAAA,EAAA,GAAA,OAAA,EAAA,QAAAF,EAAA,EAAA,EAAA,EAAAV,EAAA,EAAAC,EAAA,EAAAH,EAAA,EAAAnD,EAAA,EAAA4D,EAAA,OAAAC,EAAA,OAAA,EAAA,MAAAvE,GAAA,CAAAA,EAAA,QAAA,KAAA4E,GAAAC,GAAAnK,EAAA,CAAA,OAAAsF,EAAA,OAAA,SAAA,CAAA,CAAA,CAAA,EAAA,EAAAA,GAAA,CAAA,GAAA,CAAAA,EAAA,EAAA,WAAA,UAAA,EAAA,OAAA,IAAA8E,EAAA9E,EAAA,EAAA+E,EAAA,CAAA,EAAA,QAAAC,KAAAhF,EAAA,EAAA,MAAA;CAAI,EAAE,CAChE,IAEAsD,EAAcC,EAAM1C,QAEtB,GAAA,EAAUG,EAAUgE,EAClB,MAAwB,EAEtBC,CAAA,EAAAC,EAAAF,EAAMhE,MAAMiE,EAAA,CAAA,GAAAF,EAAAI,KAAAJ,EAAAI,GAAA,CAAA,IAAA,KAAAD,CAAA,CAAA,CAAgC,IAAEE,EAAI,OAIlD,YAAQ,OAAY,QACpB9B,CAAc+B,EAAAA,IAAgB,CAAA,CAAAL,EAAAC,CAAA,IAASjE,CAAMgE,EAAAC,EAAA,KAAS;CA8Qb,CAAK3F,CAAK,CAAA,EAAKA,GAC5DwF,EAAApK,EAAA0K,CACF,CAAA,EAAA,QAAKpF,GACK,CAAA,GAAAsF,GAAQhG,CAChB,EAAA,MACFtE,EAAK,+BAGA,CAAA,IACHO,CAAA,CAAMgH,CAAAA,CAAQ,EAACjD,EACV,IAAA,CAAO,IAAAU,EAAMuC,IAEhBgD,IAAiBhK,EAAA1C,EAAA,OAEnB,EAAAiM,EAEJ,IAGN,gBAGQU,EAAM,MAAI,EAAA,GAAA3H,IAAWtC,OAAE,CAAAa,GAAS2I,EAAE,IAAAA,EAAMpB,IAC9C,OAAIA,EAAAvF,GAAK,CAAA,QACD2G,EAAGxJ,QAAQwC,CACZyH,CACT,EAEMC,GAAAA,EAAa,IAA2BL,EAK5C,KAAM,UACCL,CACP,EAAAX,GAAI,CACJ,EAAAO,EAAA,KAAOS,EAAAN,EACT,IAkBMY,WAIFN,CAAA,CAAA,SACAvH,IACA,OAAQ8H,CAAAA,IACRZ,EAAA,EAAAlM,EAAA,cAEA,CAAA,EAAA6B,EAAA,QACA,MAAA,EAAA,GAAA2H,CAAAA,EACA,MAAOuD,EACP,oBACA,CAAA,OAAApD,GAAgB,SAChB,CAAA,CAAA,EAAA,GAAAqD,CAAAA,EAAc,YACd,CAAAd,EAAA,cACA,EAAA,CAAAA,EAAA,eACA,EAAA,MAAA,CAAA,IACAK,EAAGU,IACL,SAEWf,CAAA,EAAAC,EAAee,EAASC,GAAAA,IAEjCjB,GAAM9B,aAKAgD,YACiBjB,EAAAlK,EAAM,cACb,CAAA,IAAQoL,EACxBC,GAEK9D,EACH,eAAS,EAAA0C,EAAA,iBAAiB,SAAsCG,CAAA,EAGlER,EAAA,IACM0B,CAAUrB,EAAA,oBACL,SAAAG,CAAA,CAAA,CAAoB,CAAA,GAAAF,aAAA,mBAChBqB,aAEfvN,IAGAwN,EAAa,OAAA,SAAA,CAAiB,IAAApB,EAAAF,EAAS,aAGtC,MAEKuB,EAAAA,GAAQX,EAAc,OAAOV,EAAAF,EAAA,KACpBW,CAAAA,CAAAA,IAAgBV,EAAOF,EAAA,aAIvB,SAAY,IACF,sBACvBE,IAAyBuB,EAAAA,cAEvB,EAAMnD,qCAIN,IAEA8B,EAAA,IAAMsB,gBAGJC,CAAAA,EACArD,GACAT,GACA+D,CAAAA,EAAAA,EACGC,KACA3B,EACHG,EAAAD,MACO,QAAG,CAAM9B,EAAAA,CAAS,IAAK8B,EAE9BL,EAAA,OAAWlK,EAAAA,CAAAA,CAAKgM,KACd,OAAQvD,EAAS,0BAAwBwD,CAAMjM,OAC/CsJ,GAAA,YACayC,CAAAA,CAAAA,EAA0B/L,OACjCU,EAAG0E,OAAI8E,EAAOxJ,SAAM,EAAAqJ,EAAWrJ,EAAAA,EAAI,SAAK,EAAAqJ,CAAA,EAAUrJ,GAACwL,GAErD9G,EAAAA,CAAAA,CAAG+G,EAAAA,GAAS,CAAA,MAGlBzD,GAAcoD,EAAc7F,CAAIkG,CAAO,OAEvChB,EACF,CAAA,GAEe1C,CAAAA,GAASrD,CAAA,EAAA,MACEgH,EAAW,cACKA,CAAAA,OACpCC,EAAgBD,IAAUzL,EAAA,MAAgByE,EAEhD,OAAe,CAAA,CAAA,CAAK,QAElB,CADU4E,GAERrC,GAAU7H,EAAA,CAAA,CAAA,EAAAgK,EACV,EAACwC,EACD,OACC3E,CAAAA,CAAU,CAAA,CAAA,CAAA,EAAA8B,GAAA,MAAuB,MAAA,EAAA,EAAW4C,GAC7C,QACA,OAAuB,EACvBZ,GAAa,OAAA,MAAgC,EAC7ChC,GAAA,MAEM,KACA,EACRA,GAAA,SAKF7B,QAEM5F,EAAAA,IAAckK,GAAA,UAAYK,GAAA,WAChCtC,GAAIjI,QAAIwK,GAAA,WAASC,GAAW,iBAExBzC,GAAA,CAAA,EAAA,EAAAhK,IAAA/B,EAAA,cAEA,IAAA,YAEA+H,GAAA,CAAA,OACA,CAAA,KACA,EAAA,GAAA,EAAA,QACAhG,CAAA,CAAA,CAAA,CAAA,EAAA0K,GAAA,GAAA,GACF,CAGF,GAAI1I,SAAI,mBAAS,EAAA0K,GACf,MAAA,EAAO,IAAA,CAAMC,IACX3M,EAAA,EAAA,UAAA,EAAAF,EAAA,MACA2I,EACA,KAAA,EAAA,KAEA,CAAA3I,EAAA,MAAA,EAAAA,EAAA,KAIJ,EAAIkC,EAAAA,MAAIhC,EAAA,KAAS,CAAA,EAAA4M,GAAA,GAAA,CAAA,IAAiB,EAAG5M,EACnCF,EAAAI,EAAM2M,GAAS,OAASzM,GAAA,CAAA,GAAA,CAAA,EAAA,EAAAA,EAAcJ,EAAA,EAAAF,EAAA,OACP2I,CAAAA,IAAS,EAAA,IAAQ,WAC9C,EAAA,OAAArI,EAAA,MAAA,EAAA,EACF,IAEI0M,CAAAA,EACF,EAAA,IAAA1M,EAAY4H,EAAAA,MAAW,EAAK,EAAA,CAAA,CAAA,IAAOtH,EAAA,EAAA,OAC5BC,EAAA,EAAA,KACPX,EACE6M,GAAO,CAAA3M,IAAA,EAAAF,CAAA,IAAagI,KAAqBrH,EAG7CkM,EAAO7M,GAAAE,EAAA,IAAA,IAAc,EAAA,GAAMuI,KAASzI,EAAKU,GACzC,IAAA,GAAA,EAASV,EAAA,OAAK,EAAAA,CAAA,EAAA,CAAA,IACdwL,IACA1L,IAAA,KA0BFA,EAvBAE,EAAAW,GAAMoM,MACK,IACTC,IACEC,EACGC,GAAO,IAGI,IAAA,EAAAlN,EAAA,KAAA,CAAA,GAAe,IAGvB,GAAA,MAAe,EAAA,EAAA,SAAAW,EAEnB,CAAA,EACCgH,CAAAA,EACCwF,EAAAA,EAAoBvF,EACtB,EACAwF,CACFzM,IAIJ0M,EAAAA,EAAU,OAEI1M,IAAA,EAAA,EAAA,SACZA,CAAA,EAAAX,GAAAW,EAAA,CAAa8K,EAAU6B,GACV,CAAA,EAAA,EAAAtN,IAAA,CAAA,IAAgCF,EAC7CyN,GAAA,EAAArN,EAGFsL,IACAL,YACY,MACPqC,CAAiBpN,EAAAM,IAAA,CAAA,GAEpB,CAAIN,EAEF,OAAsBqN,IAAa3N,CAAA,EAAK8H,EACxC2F,GAAA,UAAuB7M,EACvB+K,EAAa,CAAA,IAAA9K,EAAAT,EAAA,OACb0H,EAAgB,SACdA,EAAgBqD,CAAAA,CAChByC,EACF,EACIhN,GAAEiN,EAAW9F,EAAAA,CACfa,IAAckF,GAAgB3H,EAAK,GAEnCuF,EAAQtL,EACRkL,OAAOhL,EAAA,SAAA,CAAA,CAAA,EAAA,OAEPO,EAAA,CAAA,IAAQ,OACNb,EAAA,EAAAA,EAAA,EAAA,GAAAA,EAAA,CAAA;4gkBwBtoBf,IAAM,CACL,IAAM+N,EAAoB,CAAC,EACvBC,EAAW,KAETC,EAAoB,CAACC,EAAMC,EAAUC,IAAiB,CAC1DL,EAAkBG,CAAI,EAAI,CACxB,SAAAC,EACA,KAAMC,CACR,CACF,EAEMC,EAAgB,CAACC,EAASC,IAAkB,CAChD,IAAMC,EAAYT,EAAkBQ,CAAa,EACjD,GAAKC,EAEL,GAAI,CACFA,EAAU,KAAKF,CAAO,CACxB,OAASG,EAAO,CACd,QAAQ,MAAM,wBAAwBF,CAAa,IAAKE,CAAK,CAC/D,CACF,EAEMC,EAAoB,IAAM,CAC9B,OAAO,QAAQX,CAAiB,EAAE,QAAQ,CAAC,CAACG,EAAM,CAAE,SAAAC,EAAU,KAAAQ,CAAK,CAAC,IAAM,CACxE,SAAS,iBAAiBR,CAAQ,EAAE,QAAQQ,CAAI,CAClD,CAAC,CACH,EAEMC,EAAqBC,GAAS,CAC9BA,EAAK,WAAa,KAAK,cAE3B,OAAO,QAAQd,CAAiB,EAAE,QAAQ,CAAC,CAACG,EAAM,CAAE,SAAAC,EAAU,KAAAQ,CAAK,CAAC,IAAM,CACpEE,EAAK,QAAQV,CAAQ,GACvBQ,EAAKE,CAAI,EAEXA,EAAK,iBAAiBV,CAAQ,EAAE,QAAQQ,CAAI,CAC9C,CAAC,CACH,EAEMG,EAAgB,IAAM,CACtBd,IAEJA,EAAW,IAAI,iBAAkBe,GAAc,CAC7CA,EAAU,QAASC,GAAa,CAC9BA,EAAS,WAAW,QAAQJ,CAAiB,CAC/C,CAAC,CACH,CAAC,EAEDZ,EAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EACpE,EAEMiB,EAAe,IAAM,CACrBjB,IACFA,EAAS,WAAW,EACpBA,EAAW,KAEf,EAEMkB,EAAmBX,GAAkB,CACzC,IAAMC,EAAYT,EAAkBQ,CAAa,EACjD,GAAI,CAACC,EAAW,CACd,QAAQ,KAAK,cAAcD,CAAa,yBAAyB,EACjE,MACF,CAGA,IAAMY,EAAO,QAAQZ,CAAa,eAClC,SAAS,iBAAiB,IAAIY,CAAI,GAAG,EAAE,QAAQC,GAAM,CACnDA,EAAG,gBAAgBD,CAAI,CACzB,CAAC,EAED,SAAS,iBAAiBX,EAAU,QAAQ,EAAE,QAAQA,EAAU,IAAI,CACtE,EAEMa,EAAY,IAAM,CAEtB,OAAO,QAAQtB,CAAiB,EAAE,QAAQ,CAAC,CAACG,EAAM,CAAE,SAAAC,CAAS,CAAC,IAAM,CAClE,IAAMgB,EAAO,QAAQjB,CAAI,eACzB,SAAS,iBAAiB,IAAIiB,CAAI,GAAG,EAAE,QAAQC,GAAM,CACnDA,EAAG,gBAAgBD,CAAI,CACzB,CAAC,CACH,CAAC,EAEDT,EAAkB,CACpB,EAEA,OAAO,SAAW,CAChB,SAAUT,EACV,KAAMiB,EACN,QAASG,EACT,MAAOP,EACP,KAAMG,CACR,EAEA,SAAS,iBAAiB,mBAAoB,IAAM,CAClDP,EAAkB,EAClBI,EAAc,CAChB,CAAC,CACH,GAAG,GClGF,IAAM,CACL,IAAMQ,EAAoBC,GAA0B,CAClD,IAAMC,EAAUD,EAAsB,cAAc,iBAAiB,EAC/DE,EAAUF,EAAsB,cAAc,yBAAyB,EACvEG,EAAOD,EAAQ,cAAc,eAAe,EAElD,GAAI,CAACD,GAAW,CAACE,GAAQ,CAACD,EAAS,CACjC,IAAME,EAAU,CAAC,EACZH,GAASG,EAAQ,KAAK,SAAS,EAC/BD,GAAMC,EAAQ,KAAK,MAAM,EACzBF,GAASE,EAAQ,KAAK,SAAS,EACpC,QAAQ,MAAM,4DAA4DA,EAAQ,KAAK,IAAI,CAAC,GAAIJ,CAAqB,EACrH,MACF,CAEA,IAAIK,EAAY,CAAC,EACbC,EAAc,GAEZC,EAAe,CAACC,EAAiB,KAAS,CAC1CP,EAAQ,aAAa,eAAe,IAAM,UAC9CA,EAAQ,aAAa,gBAAiB,OAAO,EAC7CA,EAAQ,gBAAgB,uBAAuB,EAC/CC,EAAQ,aAAa,cAAe,MAAM,EAEtCM,GACFP,EAAQ,MAAM,EAGhBQ,EAAc,EAAE,EAClB,EAEMC,EAAc,CAACC,EAAmB,KAAU,CAMhD,GALA,SAAS,cAAc,IAAI,YAAY,mBAAoB,CACzD,OAAQ,CAAE,OAAQX,CAAsB,CAC1C,CAAC,CAAC,EAGEA,EAAsB,QAAQ,gBAAgB,EAAG,CACnD,IAAMY,EAAOX,EAAQ,sBAAsB,EACrCY,EAAOX,EAAQ,QAAQ,MAAQ,SAC/BY,EAAQZ,EAAQ,QAAQ,OAAS,QAEvCA,EAAQ,MAAM,SAAW,QAErBW,IAAS,UACXX,EAAQ,MAAM,IAAM,GAAGU,EAAK,OAAS,CAAC,KACtCV,EAAQ,MAAM,OAAS,QACdW,IAAS,QAClBX,EAAQ,MAAM,OAAS,GAAG,OAAO,YAAcU,EAAK,IAAM,CAAC,KAC3DV,EAAQ,MAAM,IAAM,QAGlBY,IAAU,OACZZ,EAAQ,MAAM,MAAQ,GAAG,OAAO,WAAaU,EAAK,KAAK,KACvDV,EAAQ,MAAM,KAAO,SAErBA,EAAQ,MAAM,KAAO,GAAGU,EAAK,IAAI,KACjCV,EAAQ,MAAM,MAAQ,OAE1B,CAEAD,EAAQ,aAAa,gBAAiB,MAAM,EAC5CC,EAAQ,aAAa,cAAe,OAAO,EAC3CG,EAAY,MAAM,KAAKF,EAAK,iBAAiB,oBAAoB,CAAC,EAAE,OAAOY,GACzE,CAACA,EAAK,aAAa,UAAU,GAC7BA,EAAK,aAAa,eAAe,IAAM,MACzC,EAEIV,EAAU,OAAS,GAAKM,IACtBA,IAAqB,QACvBF,EAAc,CAAC,EACNE,IAAqB,QAC9BF,EAAcJ,EAAU,OAAS,CAAC,EAGxC,EAEMI,EAAiBO,GAAU,CAK/B,GAJIV,EAAc,IAAMD,EAAUC,CAAW,GAC3CD,EAAUC,CAAW,EAAE,UAAU,OAAO,QAAQ,EAElDA,EAAcU,EACVV,EAAc,IAAMD,EAAUC,CAAW,EAAG,CAC9C,IAAMW,EAAaZ,EAAUC,CAAW,EACxCW,EAAW,UAAU,IAAI,QAAQ,EACjChB,EAAQ,aAAa,wBAAyBgB,EAAW,EAAE,CAC7D,MACEhB,EAAQ,gBAAgB,uBAAuB,CAEnD,EAEAA,EAAQ,iBAAiB,QAAS,IAAM,CACnBA,EAAQ,aAAa,eAAe,IAAM,OAE3DM,EAAa,EAEbG,EAAY,EAAK,CAErB,CAAC,EAEDV,EAAsB,iBAAiB,UAAYkB,GAAU,CAC3D,IAAMC,EAAalB,EAAQ,aAAa,eAAe,IAAM,OAE7D,GAAIiB,EAAM,MAAQ,SAAU,CACtBC,GAAYZ,EAAa,EAC7B,MACF,CAEA,GAAI,CAACY,EAAY,CACX,CAAC,QAAS,GAAG,EAAE,SAASD,EAAM,GAAG,GACnCA,EAAM,eAAe,EACrBR,EAAY,EAAK,GACRQ,EAAM,MAAQ,aACvBA,EAAM,eAAe,EACrBR,EAAY,OAAO,GACVQ,EAAM,MAAQ,YACvBA,EAAM,eAAe,EACrBR,EAAY,MAAM,GAEpB,MACF,CAEA,GAAIL,EAAU,SAAW,EAAG,OAE5B,IAAIe,EAAYd,EAEhB,OAAQY,EAAM,IAAK,CACjB,IAAK,YACHA,EAAM,eAAe,EACrBE,EAAYd,IAAgB,GAAK,EAAI,KAAK,IAAIA,EAAc,EAAGD,EAAU,OAAS,CAAC,EACnF,MACF,IAAK,UACHa,EAAM,eAAe,EACrBE,EAAYd,IAAgB,GAAKD,EAAU,OAAS,EAAI,KAAK,IAAIC,EAAc,EAAG,CAAC,EACnF,MACF,IAAK,OACHY,EAAM,eAAe,EACrBE,EAAY,EACZ,MACF,IAAK,MACHF,EAAM,eAAe,EACrBE,EAAYf,EAAU,OAAS,EAC/B,MACF,IAAK,QACL,IAAK,IACHa,EAAM,eAAe,EACrBb,EAAUC,CAAW,GAAG,MAAM,EAC9BC,EAAa,EACb,MACJ,CAEIa,IAAcd,GAChBG,EAAcW,CAAS,CAE3B,CAAC,EAEDjB,EAAK,iBAAiB,YAAce,GAAU,CAC5C,IAAMG,EAAWH,EAAM,OAAO,QAAQ,oBAAoB,EAC1D,GAAIG,GAAYhB,EAAU,SAASgB,CAAQ,EAAG,CAC5C,IAAML,EAAQX,EAAU,QAAQgB,CAAQ,EACpCL,IAAUV,GACZG,EAAcO,CAAK,CAEvB,CACF,CAAC,EAEDb,EAAK,iBAAiB,aAAc,IAAM,CACxCM,EAAc,EAAE,CAClB,CAAC,EAEDN,EAAK,iBAAiB,QAAUe,GAAU,CACpCA,EAAM,OAAO,QAAQ,oBAAoB,GAC3CX,EAAa,CAEjB,CAAC,EAED,SAAS,iBAAiB,QAAUW,GAAU,CACvClB,EAAsB,SAASkB,EAAM,MAAM,GAC9CX,EAAa,EAAK,CAEtB,CAAC,EAED,SAAS,iBAAiB,mBAAqBW,GAAU,CACnDA,EAAM,OAAO,SAAWlB,GAC1BO,EAAa,EAAK,CAEtB,CAAC,EAEDP,EAAsB,QAAQ,wBAA0B,GACxDA,EAAsB,cAAc,IAAI,YAAY,sBAAsB,CAAC,CAC7E,EAEI,OAAO,UACT,OAAO,SAAS,SAAS,gBAAiB,uDAAwDD,CAAgB,CAEtH,GAAG,GCnMF,IAAM,CACL,IAAMuB,EAAeC,GAAc,CACjC,IAAMC,EAAQD,EAAU,cAAc,cAAc,EAC9CE,EAAOF,EAAU,cAAc,eAAe,EAC9CG,EAASH,EAAU,cAAc,yBAAyB,EAEhE,GAAI,CAACC,GAAS,CAACC,EAAM,CACnB,IAAME,EAAU,CAAC,EACZH,GAAOG,EAAQ,KAAK,OAAO,EAC3BF,GAAME,EAAQ,KAAK,MAAM,EAC9B,QAAQ,MAAM,gEAAgEA,EAAQ,KAAK,IAAI,CAAC,GAAIJ,CAAS,EAC7G,MACF,CAEA,IAAIK,EAAe,CAAC,EAChBC,EAAY,CAAC,EACbC,EAAmB,CAAC,GAAGD,CAAS,EAChCE,EAAc,GACdC,EAAmB,KACnBC,EAAgB,KAGhBC,EAAkB,GAClBC,EAAe,KACfC,EAAkB,KAClBC,EAA0B,EAC1BC,EAAiB,KAEfC,EAAsB,IAAM,CAC3BL,IACLA,EAAkB,GACdR,IAAQA,EAAO,OAAS,IAC5B,aAAaS,CAAY,EACzBC,GAAiB,MAAM,EACvBI,EAAmB,EACnBZ,EAAa,QAAQa,GAAQ,CACtBA,EAAK,aAAa,qBAAqB,GAC1CA,EAAK,gBAAgB,aAAa,CAEtC,CAAC,EACDJ,EAA0B,EAC5B,EAEMK,EAAuB,IAAM,CACjCR,EAAkB,GACdR,IAAQA,EAAO,OAAS,IAC5BiB,EAAmB,EACnBf,EAAa,QAAQa,GAAQ,CACtBA,EAAK,aAAa,YAAY,GACjCA,EAAK,aAAa,cAAe,MAAM,CAE3C,CAAC,EACDX,EAAmB,CAAC,EACpBc,EAAc,EAAE,CAClB,EAEMJ,EAAqB,IAAM,CAC3BF,IACFA,EAAe,OAAO,EACtBA,EAAiB,MAEnBb,EAAK,iBAAiB,qBAAqB,EAAE,QAAQoB,GAAMA,EAAG,OAAO,CAAC,EACtEpB,EAAK,iBAAiB,sBAAsB,EAAE,QAAQoB,GAAMA,EAAG,OAAO,CAAC,CACzE,EAEMC,EAAmB,IAAM,CAC7BN,EAAmB,EACnB,IAAMK,EAAK,SAAS,cAAc,KAAK,EACvCA,EAAG,aAAa,OAAQ,UAAU,EAClCA,EAAG,QAAQ,aAAe,GAC1BA,EAAG,QAAQ,MAAQ,GACnBA,EAAG,UAAY,gBACfA,EAAG,UAAY,sCACfpB,EAAK,QAAQoB,CAAE,EACfP,EAAiBO,EACjBE,EAAiB,EACjBjB,EAAmB,CAAC,EACpBc,EAAc,EAAE,CAClB,EAEMI,EAAiBC,GAAS,CAC9B,IAAMC,EAAW3B,EAAU,QAAQ,SACnC,GAAI,CAAC2B,GAAYD,EAAK,QAAU,EAAG,CACjCT,EAAmB,EACnB,MACF,CAEA,aAAaL,CAAY,EACzBA,EAAe,WAAW,SAAY,CACpCC,GAAiB,MAAM,EACvBA,EAAkB,IAAI,gBAEtBU,EAAiB,EAEjB,GAAI,CACF,IAAMK,EAAM,IAAI,IAAID,EAAU,SAAS,MAAM,EAC7CC,EAAI,aAAa,IAAI,IAAKF,CAAI,EAC9B,IAAMG,EAAW,MAAM,MAAMD,EAAK,CAChC,OAAQf,EAAgB,OACxB,QAAS,CAAE,OAAU,kBAAmB,CAC1C,CAAC,EACD,GAAI,CAACgB,EAAS,GAAI,OAClB,IAAMC,EAAO,MAAMD,EAAS,KAAK,EACjC,GAAI5B,EAAM,MAAM,KAAK,IAAMyB,EAAK,KAAK,EAAG,OACxCK,EAAkBD,CAAI,CACxB,OAASE,EAAO,CACVA,EAAM,OAAS,cACjBf,EAAmB,CAEvB,CACF,EAAGS,EAAK,QAAU,EAAI,EAAI,GAAG,CAC/B,EAEMK,EAAqBD,GAAS,CAGlC,GAFAb,EAAmB,EAEfa,EAAK,SAAWA,EAAK,QAAS,CAChC,IAAMG,EAAIH,EAAK,QACTI,EAAU,CAAE,QAAS,sBAAuB,QAAS,oBAAqB,SAAU,mBAAoB,EAExGhB,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,aAAa,OAAQ,UAAU,EACpCA,EAAK,aAAa,OAAQY,EAAK,QAAQ,EACvCZ,EAAK,QAAQ,YAAc,GAC3BA,EAAK,QAAQ,MAAQ,GACrBA,EAAK,UAAY,gBAEjB,IAAMiB,EAASF,EAAE,OAAS,UAAa,eACxBA,EAAE,OAAS,UAAa,iBAAmB,gBAGpDG,EAAQ,CAAC,EACTC,GAAc,CAACC,GAAMC,GAAUC,KAAU,CAC7C,IAAMC,GAAYD,GAAQE,EAAQF,EAAK,EAAI,KACrCG,GAAWJ,GAAWG,EAAQH,GAAS,IAAI,EAAI,KACrD,OAAIE,IAAaE,GACR,4BAA4BL,EAAI,aAAaG,EAAS,WAAME,EAAQ,GAEzEF,GACK,4BAA4BH,EAAI,aAAaG,EAAS,uDAE3DE,GACK,4BAA4BL,EAAI,YAAYK,EAAQ,GAEtD,IACT,EACMC,GAAMP,GAAY,SAAUJ,EAAE,OAAQA,EAAE,YAAY,EACpDY,GAAMR,GAAY,cAAeJ,EAAE,YAAaA,EAAE,iBAAiB,EACrEW,IAAKR,EAAM,KAAKQ,EAAG,EACnBC,IAAKT,EAAM,KAAKS,EAAG,EAKvB,IAAMC,GADHb,EAAE,cAAgB,CAACA,EAAE,QAAYA,EAAE,mBAAqB,CAACA,EAAE,YAE1D,uIACA,GACAA,EAAE,UACJG,EAAM,KAAK,iDAA8CM,EAAQT,EAAE,SAAS,IAAI,CAAC,EAAE,EAEjFA,EAAE,QACJG,EAAM,KAAK,2CAA2CM,EAAQT,EAAE,OAAO,IAAI,CAAC,EAAE,EAEhF,IAAMc,GAAaX,EAAM,OACrB,sCAAsCA,EAAM,KAAK,MAAM,CAAC,SACxD,GAEJlB,EAAK,UACH,iEACiCiB,CAAK,sBAAsBD,EAAQD,EAAE,IAAI,GAAK,MAAM,mDAC9CS,EAAQT,EAAE,WAAW,CAAC,6CACrBS,EAAQT,EAAE,cAAc,CAAC,SAAMS,EAAQT,EAAE,UAAU,CAAC,gBAE5Fc,GACAD,GAEF5C,EAAK,QAAQgB,CAAI,EACjBH,EAAiBG,EAEjBM,EAAiB,EACjBjB,EAAmBD,EAAU,OAAO0C,IAAMA,KAAO9B,CAAI,EACjDX,EAAiB,OAAS,IAC5Bc,EAAcf,EAAU,QAAQY,CAAI,CAAC,EACrCA,EAAK,eAAe,CAAE,MAAO,SAAU,CAAC,EAE5C,SAAWY,EAAK,MAAO,CACrB,IAAMZ,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,aAAa,OAAQ,UAAU,EACpCA,EAAK,QAAQ,YAAc,GAC3BA,EAAK,QAAQ,MAAQ,GACrBA,EAAK,UAAY,mBACjBA,EAAK,UAAY,wGACWwB,EAAQZ,EAAK,KAAK,CAAC,UAC/C5B,EAAK,QAAQgB,CAAI,EACjBH,EAAiBG,EAEjBM,EAAiB,EACjBjB,EAAmBD,EAAU,OAAO0C,GAAMA,IAAO9B,CAAI,CACvD,CACF,EAEMwB,EAAWO,GAAM,CACrB,IAAMC,EAAI,SAAS,cAAc,KAAK,EACtC,OAAAA,EAAE,YAAcD,EACTC,EAAE,SACX,EAEM1B,EAAmB,IAAM,CAC7BnB,EAAe,MAAM,KAAKH,EAAK,iBAAiB,mBAAmB,CAAC,EACpEI,EAAYD,EAAa,OAAOa,GAC9B,CAACA,EAAK,aAAa,UAAU,GAC7BA,EAAK,aAAa,eAAe,IAAM,MACzC,CACF,EAEME,EAAqB,IAAM,CAC/BlB,EAAK,iBAAiB,uBAAuB,EAAE,QAAQgB,GAAQA,EAAK,OAAO,CAAC,EAC5ED,EAAmB,EACnB,OAAOf,EAAK,QAAQ,oBACpBsB,EAAiB,CACnB,EAEM2B,EAAsB,CAACC,EAAU,CAAC,EAAGC,EAAQ,KAAO,CAExD,GADAjC,EAAmB,EACf,CAACgC,EAAQ,QAAUnD,EAAM,MAAM,KAAK,EAAE,YAAY,IAAMoD,EAC1D,OAGF,IAAMC,EAAY,SAAS,cAAc,IAAI,EAC7CA,EAAU,aAAa,OAAQ,WAAW,EAC1CA,EAAU,QAAQ,cAAgB,GAClCpD,EAAK,QAAQ,oBAAsB,GACnCA,EAAK,YAAYoD,CAAS,EAE1B,IAAMC,EAAS,IAAI,IACnBH,EAAQ,QAAQI,GAAU,CACxB,IAAMC,EAAYD,EAAO,OAAS,UAC7BD,EAAO,IAAIE,CAAS,GACvBF,EAAO,IAAIE,EAAW,CAAC,CAAC,EAE1BF,EAAO,IAAIE,CAAS,EAAE,KAAKD,CAAM,CACnC,CAAC,EAEDD,EAAO,QAAQ,CAACG,EAAOD,IAAc,CACnC,IAAME,GAAQ,SAAS,cAAc,KAAK,EACpCC,GAAY,cAAcH,EAAU,YAAY,EAAE,QAAQ,OAAQ,GAAG,CAAC,GAC5EE,GAAM,aAAa,OAAQ,OAAO,EAClCA,GAAM,aAAa,kBAAmBC,EAAS,EAC/CD,GAAM,QAAQ,cAAgB,GAE9B,IAAME,GAAU,SAAS,cAAc,MAAM,EAC7CA,GAAQ,aAAa,OAAQ,SAAS,EACtCA,GAAQ,GAAKD,GACbC,GAAQ,YAAcJ,EACtBE,GAAM,YAAYE,EAAO,EAEzBH,EAAM,QAAQF,IAAU,CACtB,IAAMtC,GAAO,SAAS,cAAc,GAAG,EACvCA,GAAK,aAAa,OAAQ,UAAU,EACpCA,GAAK,aAAa,OAAQsC,GAAO,GAAG,EACpCtC,GAAK,QAAQ,cAAgB,GAC7BA,GAAK,QAAQ,MAAQ,GACrBA,GAAK,QAAQ,OAAS,GAAGsC,GAAO,OAAS,EAAE,IAAIA,GAAO,UAAY,EAAE,GAEpE,IAAMM,GAAQ,SAAS,cAAc,MAAM,EAK3C,GAJAA,GAAM,UAAY,WAClBA,GAAM,YAAcN,GAAO,OAAS,GACpCtC,GAAK,YAAY4C,EAAK,EAElBN,GAAO,SAAU,CACnB,IAAMO,GAAW,SAAS,cAAc,MAAM,EAC9CA,GAAS,UAAY,mDACrBA,GAAS,YAAcP,GAAO,SAC9BtC,GAAK,YAAY6C,EAAQ,CAC3B,CAEAJ,GAAM,YAAYzC,EAAI,CACxB,CAAC,EAEDhB,EAAK,YAAYyD,EAAK,CACxB,CAAC,EAEDnC,EAAiB,EACjBjB,EAAmBD,EAAU,OAAOY,GAAQA,EAAK,aAAa,qBAAqB,CAAC,EAChFX,EAAiB,OAAS,IAC5Bc,EAAcf,EAAU,QAAQC,EAAiB,CAAC,CAAC,CAAC,EACpDA,EAAiB,CAAC,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,EAE3D,EAEMyD,EAAwBX,GAAU,CACtC,IAAMY,EAAYjE,EAAU,QAAQ,UAChC,CAACiE,GAAaZ,EAAM,OAAS,IAIjC,aAAa3C,CAAa,EAC1BA,EAAgB,WAAW,SAAY,CACrCD,GAAkB,MAAM,EACxBA,EAAmB,IAAI,gBAEvB,GAAI,CACF,IAAMmB,EAAM,IAAI,IAAIqC,EAAW,SAAS,MAAM,EAC9CrC,EAAI,aAAa,IAAI,IAAKyB,CAAK,EAC/B,IAAMxB,EAAW,MAAM,MAAMD,EAAK,CAChC,OAAQnB,EAAiB,OACzB,QAAS,CAAE,OAAU,kBAAmB,CAC1C,CAAC,EACD,GAAI,CAACoB,EAAS,GACZ,OAEF,IAAMC,EAAO,MAAMD,EAAS,KAAK,EACjCsB,EAAoBrB,EAAK,SAAW,CAAC,EAAGuB,CAAK,CAC/C,OAASrB,EAAO,CACVA,EAAM,OAAS,cACjBZ,EAAmB,CAEvB,CACF,EAAG,GAAG,EACR,EAEAI,EAAiB,EACjBjB,EAAmB,CAAC,GAAGD,CAAS,EAEhC,IAAMe,EAAiB6C,GAAU,CAO/B,GANI1D,EAAc,IAAMF,EAAUE,CAAW,GAC3CF,EAAUE,CAAW,EAAE,UAAU,OAAO,QAAQ,EAGlDA,EAAc0D,EAEV1D,EAAc,GAAI,CACpB,IAAM2D,EAAa7D,EAAUE,CAAW,EACxC2D,EAAW,UAAU,IAAI,QAAQ,EAC7BA,EAAW,GACblE,EAAM,aAAa,wBAAyBkE,EAAW,EAAE,EAEzDlE,EAAM,gBAAgB,uBAAuB,CAEjD,MACEA,EAAM,gBAAgB,uBAAuB,CAEjD,EAEMmE,EAAkB,IAAM,CAC5B,IAAMC,EAAapE,EAAM,MAAM,KAAK,EAAE,YAAY,EAGlD,GAAIA,EAAM,MAAM,WAAW,GAAG,EAAG,CAC1BU,GACHQ,EAAqB,EAEvBL,IACIA,GAA2B,IAC7BW,EAAcxB,EAAM,KAAK,EACzBa,EAA0B,GAE5B,aAAaF,CAAY,EACzBA,EAAe,WAAW,IAAM,CAC1BX,EAAM,MAAM,WAAW,GAAG,IAC5BwB,EAAcxB,EAAM,KAAK,EACzBa,EAA0B,EAE9B,EAAG,GAAG,EACN,MACF,MACEE,EAAoB,EAGtBI,EAAmB,EACnBC,EAAc,EAAE,EAEhBd,EAAmB,CAAC,EACpBF,EAAa,QAAQa,GAAQ,CAC3B,GAAIA,EAAK,aAAa,YAAY,EAAG,CACnCA,EAAK,aAAa,cAAe,OAAO,EACpCZ,EAAU,SAASY,CAAI,GACzBX,EAAiB,KAAKW,CAAI,EAE5B,MACF,CAEA,IAAMoD,GAAYpD,EAAK,QAAQ,QAAUA,EAAK,aAAa,KAAK,EAAE,YAAY,EAKxEqD,GAJerD,EAAK,QAAQ,UAAY,IAC3C,YAAY,EACZ,MAAM,QAAQ,EACd,OAAO,OAAO,EACkB,KAAKsD,IAAWA,GAAQ,SAASH,CAAU,CAAC,EACzEI,EAAUH,EAAS,SAASD,CAAU,GAAKE,EACjDrD,EAAK,aAAa,cAAe,OAAO,CAACuD,CAAO,CAAC,EAC7CA,GAAWnE,EAAU,SAASY,CAAI,GACpCX,EAAiB,KAAKW,CAAI,CAE9B,CAAC,EAEGX,EAAiB,OAAS,GAC5Bc,EAAcf,EAAU,QAAQC,EAAiB,CAAC,CAAC,CAAC,EACpDA,EAAiB,CAAC,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,GAEvDyD,EAAqBK,CAAU,CAEnC,EAEApE,EAAM,iBAAiB,QAASmE,CAAe,EAE/C,IAAMM,EAAuBC,GAAU,CACrC,GAAI,CAAC,CAAC,YAAa,UAAW,QAAS,OAAQ,KAAK,EAAE,SAASA,EAAM,GAAG,EACtE,OAGF,GAAIA,EAAM,MAAQ,QAAS,CACzBA,EAAM,eAAe,EACjBnE,EAAc,IAChBF,EAAUE,CAAW,GAAG,MAAM,EAEhC,MACF,CAEA,GAAID,EAAiB,SAAW,EAAG,OAEnCoE,EAAM,eAAe,EAErB,IAAMC,EAAsBpE,EAAc,GAAKD,EAAiB,QAAQD,EAAUE,CAAW,CAAC,EAAI,GAC9FqE,EAAmBD,EAEvB,OAAQD,EAAM,IAAK,CACjB,IAAK,YACCC,EAAsBrE,EAAiB,OAAS,EAClDsE,EAAmBD,EAAsB,EAEzCC,EAAmB,EAErB,MACF,IAAK,UACCD,EAAsB,EACxBC,EAAmBD,EAAsB,EAEzCC,EAAmBtE,EAAiB,OAAS,EAE/C,MACF,IAAK,OACHsE,EAAmB,EACnB,MACF,IAAK,MACHA,EAAmBtE,EAAiB,OAAS,EAC7C,KACJ,CAEA,GAAIsE,IAAqBD,EAAqB,CAC5C,IAAME,EAAgBvE,EAAiBsE,CAAgB,EACvDxD,EAAcf,EAAU,QAAQwE,CAAa,CAAC,EAC9CA,EAAc,eAAe,CAAE,MAAO,UAAW,SAAU,QAAS,CAAC,CACvE,CACF,EAEA5E,EAAK,iBAAiB,YAAcyE,GAAU,CAC5C,IAAMI,EAAWJ,EAAM,OAAO,QAAQ,mBAAmB,EACzD,GAAII,GAAYxE,EAAiB,SAASwE,CAAQ,EAAG,CACnD,IAAMb,EAAQ5D,EAAU,QAAQyE,CAAQ,EACpCb,IAAU1D,GACZa,EAAc6C,CAAK,CAEvB,CACF,CAAC,EAEDhE,EAAK,iBAAiB,QAAUyE,GAAU,CACxC,IAAMK,EAAcL,EAAM,OAAO,QAAQ,mBAAmB,EAC5D,GAAIK,GAAezE,EAAiB,SAASyE,CAAW,EAAG,CACzD,IAAMC,EAASjF,EAAU,QAAQ,uBAAuB,EACpDiF,GAAU,CAACD,EAAY,aAAa,wBAAwB,GAC9DC,EAAO,MAAM,CAEjB,CACF,CAAC,EAEDhF,EAAM,iBAAiB,UAAWyE,CAAmB,EAEjDnE,EAAiB,OAAS,IAC5Bc,EAAcf,EAAU,QAAQC,EAAiB,CAAC,CAAC,CAAC,EACpDA,EAAiB,CAAC,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,GAGzDP,EAAU,QAAQ,mBAAqB,GACvCA,EAAU,cAAc,IAAI,YAAY,sBAAsB,CAAC,CACjE,EAEI,OAAO,UACT,OAAO,SAAS,SAAS,UAAW,2CAA4CD,CAAW,CAE/F,GAAG,GCzeF,IAAM,CACL,IAAMmF,EAAcC,GAAoB,CACtC,IAAMC,EAAUD,EAAgB,cAAc,iBAAiB,EACzDE,EAAgBD,EAAQ,cAAc,eAAe,EACrDE,EAAUH,EAAgB,cAAc,yBAAyB,EACjEI,EAAUD,EAAUA,EAAQ,cAAc,kBAAkB,EAAI,KAChEE,EAAQL,EAAgB,cAAc,+BAA+B,EACrEM,EAASN,EAAgB,cAAc,2BAA2B,EAExE,GAAI,CAACC,GAAW,CAACE,GAAW,CAACC,GAAW,CAACC,EAAO,CAC9C,IAAME,EAAU,CAAC,EACZN,GAASM,EAAQ,KAAK,SAAS,EAC/BJ,GAASI,EAAQ,KAAK,SAAS,EAC/BH,GAASG,EAAQ,KAAK,SAAS,EAC/BF,GAAOE,EAAQ,KAAK,OAAO,EAChC,QAAQ,MAAM,+DAA+DA,EAAQ,KAAK,IAAI,CAAC,GAAIP,CAAe,EAClH,MACF,CAEA,IAAIQ,EAAa,MAAM,KAAKJ,EAAQ,iBAAiB,iBAAiB,CAAC,EACnEK,EAAUD,EAAW,OAAOE,GAAOA,EAAI,aAAa,eAAe,IAAM,MAAM,EAC/EC,EAAiB,CAAC,GAAGF,CAAO,EAC5BG,EAAc,GACZC,EAAaT,EAAQ,aAAa,sBAAsB,IAAM,OAC9DU,EAAkBD,EAAa,IAAI,IAAQ,KAC3CE,EAAcF,EAAcb,EAAgB,QAAQ,aAAe,GAAM,KACzEgB,EAAgBhB,EAAgB,QAAQ,gBAAkB,OAE1DiB,EAAYP,GAAQA,EAAI,QAAQ,OAASA,EAAI,YAAY,KAAK,EAE9DQ,EAAiB,IAAM,CAC3BV,EAAa,MAAM,KAAKJ,EAAQ,iBAAiB,iBAAiB,CAAC,EACnEK,EAAUD,EAAW,OAAOE,GAAOA,EAAI,aAAa,eAAe,IAAM,MAAM,EAC/EC,EAAiBF,EAAQ,OAAOC,GAAOA,EAAI,aAAa,aAAa,IAAM,MAAM,EACjFS,EAAgB,EAAE,CACpB,EAEMA,EAAmBC,GAAU,CAOjC,GANIR,EAAc,IAAMH,EAAQG,CAAW,GACzCH,EAAQG,CAAW,EAAE,UAAU,OAAO,QAAQ,EAGhDA,EAAcQ,EAEVR,EAAc,GAAI,CACpB,IAAMS,EAAeZ,EAAQG,CAAW,EACxCS,EAAa,UAAU,IAAI,QAAQ,EAC/BA,EAAa,GACfpB,EAAQ,aAAa,wBAAyBoB,EAAa,EAAE,EAE7DpB,EAAQ,gBAAgB,uBAAuB,CAEnD,MACEA,EAAQ,gBAAgB,uBAAuB,CAEnD,EAEMqB,EAAgB,IAAM,CAC1B,IAAMC,EAAQ,iBAAiBpB,CAAO,EACtC,OAAO,WAAWoB,EAAM,kBAAkB,EAAI,GAAK,WAAWA,EAAM,eAAe,EAAI,CACzF,EAEMC,EAAc,CAACC,EAAiBC,EAAe,KAAS,CAC5D,IAAIC,EAEJ,GAAId,EAAY,CACd,IAAMe,EAAO,MAAM,QAAQH,CAAe,EAAIA,EAAkB,CAAC,EACjEX,EAAgB,MAAM,EACtBc,EAAK,QAAQlB,GAAOI,EAAgB,IAAIJ,CAAG,CAAC,EAG5C,IAAMmB,EAAWpB,EAAQ,OAAOC,GAAOI,EAAgB,IAAIJ,CAAG,CAAC,EAC3DmB,EAAS,SAAW,GACtB3B,EAAc,YAAca,EAC5Bb,EAAc,UAAU,IAAI,uBAAuB,IAEnDA,EAAc,YAAc2B,EAAS,IAAInB,GAAOA,EAAI,QAAQ,OAASA,EAAI,YAAY,KAAK,CAAC,EAAE,KAAK,IAAI,EACtGR,EAAc,UAAU,OAAO,uBAAuB,GAGxDyB,EAAQE,EAAS,IAAIZ,CAAQ,EAC7BZ,EAAM,MAAQ,KAAK,UAAUsB,CAAK,CACpC,KAAO,CACL,IAAMG,EAASL,EACf,GAAI,CAACK,EAAQ,OACb5B,EAAc,UAAY4B,EAAO,UACjCH,EAAQV,EAASa,CAAM,EACvBzB,EAAM,MAAQsB,CAChB,CAEAlB,EAAQ,QAAQC,GAAO,EACFG,EAAaC,EAAgB,IAAIJ,CAAG,EAAIA,IAAQe,GAEjEf,EAAI,aAAa,gBAAiB,MAAM,EAExCA,EAAI,gBAAgB,eAAe,CAEvC,CAAC,EAEGgB,GACF1B,EAAgB,cAAc,IAAI,YAAY,SAAU,CACtD,OAAQ,CAAE,MAAA2B,CAAM,EAChB,QAAS,EACX,CAAC,CAAC,CAEN,EAEMI,EAAe,CAACC,EAAiB,KAAS,CAC9C,GAAI7B,EAAQ,aAAa,aAAa,IAAM,OAE5C,IAAIG,EAAQ,CACV,IAAM2B,EAAc,IAAM,CACxB3B,EAAO,MAAQ,GACfK,EAAiB,CAAC,GAAGF,CAAO,EAC5BD,EAAW,QAAQE,GAAOA,EAAI,aAAa,cAAe,OAAO,CAAC,CACpE,EAEIY,EAAc,EAChBnB,EAAQ,iBAAiB,gBAAiB8B,EAAa,CAAE,KAAM,EAAK,CAAC,EAErEA,EAAY,CAEhB,CAEID,GAAgB/B,EAAQ,MAAM,EAClCE,EAAQ,aAAa,cAAe,MAAM,EAC1CF,EAAQ,aAAa,gBAAiB,OAAO,EAC7CkB,EAAgB,EAAE,EACpB,EAEMe,EAAuBJ,GAAW,CAClChB,EAAgB,IAAIgB,CAAM,EAC5BhB,EAAgB,OAAOgB,CAAM,EAE7BhB,EAAgB,IAAIgB,CAAM,EAE5BN,EAAYf,EAAQ,OAAOC,GAAOI,EAAgB,IAAIJ,CAAG,CAAC,CAAC,CAC7D,EAEMyB,EAAUR,GAAU,CACxB,GAAId,EAAY,CACd,IAAMiB,EAASrB,EAAQ,KAAKC,GAAOO,EAASP,CAAG,IAAMiB,GAAS,CAACb,EAAgB,IAAIJ,CAAG,CAAC,EACvF,GAAI,CAACoB,EAAQ,OACbhB,EAAgB,IAAIgB,CAAM,EAC1BN,EAAYf,EAAQ,OAAOC,GAAOI,EAAgB,IAAIJ,CAAG,CAAC,CAAC,CAC7D,KAAO,CACL,IAAMoB,EAASrB,EAAQ,KAAKC,GAAOO,EAASP,CAAG,IAAMiB,CAAK,EAC1D,GAAI,CAACG,EAAQ,OACTzB,EAAM,QAAUsB,GAClBH,EAAYM,CAAM,EAEpBC,EAAa,CACf,CACF,EAEMK,EAAYT,GAAU,CAC1B,GAAI,CAACd,EAAY,OACjB,IAAMiB,EAASrB,EAAQ,KAAKC,GAAOO,EAASP,CAAG,IAAMiB,GAASb,EAAgB,IAAIJ,CAAG,CAAC,EACjFoB,IACLhB,EAAgB,OAAOgB,CAAM,EAC7BN,EAAYf,EAAQ,OAAOC,GAAOI,EAAgB,IAAIJ,CAAG,CAAC,CAAC,EAC7D,EAEM2B,EAAUV,GAAU,CACxB,GAAI,CAACd,EAAY,OACjB,IAAMiB,EAASrB,EAAQ,KAAKC,GAAOO,EAASP,CAAG,IAAMiB,CAAK,EACrDG,GACLI,EAAoBJ,CAAM,CAC5B,EAEA,GAAIxB,EAAQ,CACV,IAAMgC,EAAgB,IAAM,CAC1B,IAAMC,EAAajC,EAAO,MAAM,KAAK,EAAE,YAAY,EAEnDa,EAAgB,EAAE,EAElBR,EAAiB,CAAC,EAClBH,EAAW,QAAQsB,GAAU,CAC3B,GAAIA,EAAO,aAAa,YAAY,EAAG,CACrCA,EAAO,aAAa,cAAe,OAAO,EACtCrB,EAAQ,SAASqB,CAAM,GACzBnB,EAAe,KAAKmB,CAAM,EAE5B,MACF,CAEA,IAAMU,GAAcV,EAAO,QAAQ,QAAUA,EAAO,aAAa,KAAK,EAAE,YAAY,EAK9EW,GAJeX,EAAO,QAAQ,UAAY,IAC7C,YAAY,EACZ,MAAM,QAAQ,EACd,OAAO,OAAO,EACkB,KAAKY,GAAWA,EAAQ,SAASH,CAAU,CAAC,EACzEI,EAAUH,EAAW,SAASD,CAAU,GAAKE,EACnDX,EAAO,aAAa,cAAe,OAAO,CAACa,CAAO,CAAC,EAC/CA,GAAWlC,EAAQ,SAASqB,CAAM,GACpCnB,EAAe,KAAKmB,CAAM,CAE9B,CAAC,CACH,EAEAxB,EAAO,iBAAiB,QAASgC,CAAa,CAChD,CAGA,GAAIzB,EAAY,CACd,IAAM+B,EAAenC,EAAQ,OAAOC,GAAOA,EAAI,aAAa,eAAe,IAAM,MAAM,EACvF,GAAI,CACF,IAAMmC,EAAS,KAAK,MAAMxC,EAAM,OAAS,IAAI,EACvCyC,EAAc,IAAI,IAAIrC,EAAQ,IAAIQ,CAAQ,CAAC,EAC3C8B,EAAgB,MAAM,QAAQF,CAAM,EAAIA,EAAO,OAAOG,GAAKF,EAAY,IAAIE,CAAC,CAAC,EAAI,CAAC,EAElFC,EAAiB,CAAC,EACpBF,EAAc,OAAS,EAEzBA,EAAc,QAAQG,GAAO,CAC3B,IAAMxC,EAAMD,EAAQ,KAAK0C,GAAKlC,EAASkC,CAAC,IAAMD,GAAO,CAACD,EAAe,SAASE,CAAC,CAAC,EAC5EzC,GAAKuC,EAAe,KAAKvC,CAAG,CAClC,CAAC,EAEDuC,EAAe,KAAK,GAAGL,CAAY,EAGrCpB,EAAYyB,EAAgB,EAAK,CACnC,MAAY,CACVzB,EAAYoB,EAAc,EAAK,CACjC,CACF,KAAO,CACL,IAAMQ,EAAgB3C,EAAQ,KAAKC,GAAOO,EAASP,CAAG,IAAML,EAAM,OAAS,CAACK,EAAI,aAAa,aAAa,CAAC,EAC3G,GAAI0C,EACF5B,EAAY4B,EAAe,EAAK,UACvB,CAAC/C,EAAM,MAAO,CAKvB,IAAMgD,EAAiB5C,EAAQ,KAAKC,GAAO,CAACA,EAAI,aAAa,aAAa,CAAC,EACvE2C,GAAgB7B,EAAY6B,EAAgB,EAAK,CACvD,CACF,CAEA,IAAMC,EAAuBC,GAAU,CACrC,IAAMC,EAAgBrD,EAAQ,aAAa,aAAa,IAAM,QAE9D,GAAI,CAAC,CAAC,YAAa,UAAW,QAAS,OAAQ,MAAO,QAAQ,EAAE,SAASoD,EAAM,GAAG,EAChF,OAGF,GAAI,CAACC,EAAe,CACdD,EAAM,MAAQ,SAAWA,EAAM,MAAQ,WACzCA,EAAM,eAAe,EACrBtD,EAAQ,MAAM,GAEhB,MACF,CAIA,GAFAsD,EAAM,eAAe,EAEjBA,EAAM,MAAQ,SAAU,CAC1BxB,EAAa,EACb,MACF,CAEA,GAAIwB,EAAM,MAAQ,QAAS,CACzB,GAAI3C,EAAc,GAAI,CACpB,IAAMkB,EAASrB,EAAQG,CAAW,EAC9BC,GACFqB,EAAoBJ,CAAM,EACtBd,GACFe,EAAa,IAGX1B,EAAM,QAAUY,EAASa,CAAM,GACjCN,EAAYM,CAAM,EAEpBC,EAAa,EAEjB,CACA,MACF,CAEA,GAAIpB,EAAe,SAAW,EAAG,OAEjC,IAAM8C,EAAsB7C,EAAc,GAAKD,EAAe,QAAQF,EAAQG,CAAW,CAAC,EAAI,GAC1F8C,EAAmBD,EAEvB,OAAQF,EAAM,IAAK,CACjB,IAAK,YACCE,EAAsB9C,EAAe,OAAS,IAChD+C,EAAmBD,EAAsB,GAE3C,MACF,IAAK,UACCA,EAAsB,EACxBC,EAAmBD,EAAsB,EAChCA,IAAwB,KACjCC,EAAmB,GAErB,MACF,IAAK,OACHA,EAAmB,EACnB,MACF,IAAK,MACHA,EAAmB/C,EAAe,OAAS,EAC3C,KACJ,CAEA,GAAI+C,IAAqBD,EAAqB,CAC5C,IAAME,EAAkBhD,EAAe+C,CAAgB,EACvDvC,EAAgBV,EAAQ,QAAQkD,CAAe,CAAC,EAChDA,EAAgB,eAAe,CAAE,MAAO,UAAW,SAAU,QAAS,CAAC,CACzE,CACF,EAEAvD,EAAQ,iBAAiB,YAAcmD,GAAU,CAC/C,IAAMzB,EAASyB,EAAM,OAAO,QAAQ,iBAAiB,EACrD,GAAIzB,GAAUnB,EAAe,SAASmB,CAAM,EAAG,CAC7C,IAAMV,EAAQX,EAAQ,QAAQqB,CAAM,EAChCV,IAAUR,GACZO,EAAgBC,CAAK,CAEzB,CACF,CAAC,EAEDhB,EAAQ,iBAAiB,aAAc,IAAM,CAC3C,IAAMwD,EAAiBxD,EAAQ,cAAc,uCAAuC,EAElFe,EADEyC,EACcnD,EAAQ,QAAQmD,CAAc,EAE9B,EAF+B,CAInD,CAAC,EAED3D,EAAQ,iBAAiB,UAAWqD,CAAmB,EACnDhD,GACFA,EAAO,iBAAiB,UAAWgD,CAAmB,EAGxD,IAAMO,EAAc,IAAM,CACxB,SAAS,cAAc,IAAI,YAAY,mBAAoB,CACzD,OAAQ,CAAE,OAAQ7D,CAAgB,CACpC,CAAC,CAAC,EAEEM,IACEgB,EAAc,EAChBnB,EAAQ,iBAAiB,gBAAiB,IAAM,CAC9CG,EAAO,MAAM,CACf,EAAG,CAAE,KAAM,EAAK,CAAC,EAEjBA,EAAO,MAAM,GAIjBH,EAAQ,aAAa,cAAe,OAAO,EAC3CF,EAAQ,aAAa,gBAAiB,MAAM,EAE5C,IAAM2D,EAAiBxD,EAAQ,cAAc,uCAAuC,EAChFwD,IACFzC,EAAgBV,EAAQ,QAAQmD,CAAc,CAAC,EAC/CA,EAAe,eAAe,CAAE,MAAO,SAAU,CAAC,EAEtD,EAEA3D,EAAQ,iBAAiB,QAAS,IAAM,CACnBA,EAAQ,aAAa,eAAe,IAAM,OAE3D8B,EAAa,EAEb8B,EAAY,CAEhB,CAAC,EAEDzD,EAAQ,iBAAiB,QAAUmD,GAAU,CAC3C,IAAMO,EAAgBP,EAAM,OAAO,QAAQ,iBAAiB,EAC5D,GAAI,CAACO,EAAe,OAEpB,IAAMhC,EAASrB,EAAQ,KAAKC,GAAOA,IAAQoD,CAAa,EACnDhC,IAEDjB,GACFqB,EAAoBJ,CAAM,EACtBd,EACFe,EAAa,GAEbZ,EAAgBV,EAAQ,QAAQqB,CAAM,CAAC,EACnCxB,EACFA,EAAO,MAAM,EAEbL,EAAQ,MAAM,KAIdI,EAAM,QAAUY,EAASa,CAAM,GACjCN,EAAYM,CAAM,EAEpBC,EAAa,GAEjB,CAAC,EAED,SAAS,iBAAiB,QAAUwB,GAAU,CACvCvD,EAAgB,SAASuD,EAAM,MAAM,GACxCxB,EAAa,EAAK,CAEtB,CAAC,EAED,SAAS,iBAAiB,mBAAqBwB,GAAU,CACnDA,EAAM,OAAO,SAAWvD,GAC1B+B,EAAa,EAAK,CAEtB,CAAC,EAED/B,EAAgB,iBAAiB,2BAA4BkB,CAAc,EAE3Ef,EAAQ,aAAa,cAAe,MAAM,EAG1C,OAAO,eAAeH,EAAiB,QAAS,CAC9C,IAAK,IACCa,EACKJ,EAAQ,OAAOC,GAAOI,EAAgB,IAAIJ,CAAG,CAAC,EAAE,IAAIO,CAAQ,EAE5DZ,EAAM,MAGjB,IAAM6C,GAAQ,CACZ,GAAIrC,EAAY,CACd,IAAMkD,EAAS,MAAM,QAAQb,CAAG,EAAIA,EAAOA,GAAO,KAAO,CAACA,CAAG,EAAI,CAAC,EAC5DtB,EAAO,CAAC,EACdmC,EAAO,QAAQf,GAAK,CAClB,IAAMtC,EAAMD,EAAQ,KAAK0C,GAAKlC,EAASkC,CAAC,IAAMH,GAAK,CAACpB,EAAK,SAASuB,CAAC,CAAC,EAChEzC,GAAKkB,EAAK,KAAKlB,CAAG,CACxB,CAAC,EACDc,EAAYI,CAAI,CAClB,KAAO,CACL,IAAME,EAASrB,EAAQ,KAAKC,GAAOO,EAASP,CAAG,IAAMwC,CAAG,EACpDpB,IACFN,EAAYM,CAAM,EAClBC,EAAa,EAEjB,CACF,CACF,CAAC,EAED/B,EAAgB,OAASmC,EACzBnC,EAAgB,cAAgBmC,EAC5BtB,IACFb,EAAgB,SAAWoC,EAC3BpC,EAAgB,OAASqC,EACzBrC,EAAgB,UAAY,IAAMwB,EAAYf,CAAO,EACrDT,EAAgB,WAAa,IAAMwB,EAAY,CAAC,CAAC,GAEnDxB,EAAgB,QAAQ,kBAAoB,GAC5CA,EAAgB,cAAc,IAAI,YAAY,sBAAsB,CAAC,CACvE,EAEI,OAAO,UACT,OAAO,SAAS,SAAS,SAAU,4CAA6CD,CAAU,CAE9F,GAAG,GCzcF,IAAM,CACL,IAAMiE,EAAYC,GAAkB,CAClC,IAAMC,EAAUD,EAAc,cAAc,kBAAkB,EAC9D,GAAI,CAACC,EAAS,OAEd,IAAMC,EAAO,MAAM,KAAKD,EAAQ,iBAAiB,cAAc,CAAC,EAC1DE,EAASD,EAAK,IAAIE,GAAO,SAAS,eAAeA,EAAI,aAAa,eAAe,CAAC,CAAC,EAAE,OAAO,OAAO,EAEnGC,EAAaC,GAAgB,CACjCJ,EAAK,QAAQ,CAACE,EAAKG,IAAU,CAC3BH,EAAI,aAAa,gBAAiB,OAAO,EACzCA,EAAI,aAAa,WAAY,IAAI,EAC7BD,EAAOI,CAAK,IAAGJ,EAAOI,CAAK,EAAE,OAAS,GAC5C,CAAC,EAEDD,EAAY,aAAa,gBAAiB,MAAM,EAChDA,EAAY,aAAa,WAAY,GAAG,EACxC,IAAME,EAAc,SAAS,eAAeF,EAAY,aAAa,eAAe,CAAC,EACjFE,IAAaA,EAAY,OAAS,GACxC,EAEAP,EAAQ,iBAAiB,QAAUQ,GAAU,CAC3C,IAAMC,EAAaD,EAAM,OAAO,QAAQ,cAAc,EAClDC,GAAYL,EAAUK,CAAU,CACtC,CAAC,EAEDT,EAAQ,iBAAiB,UAAYQ,GAAU,CAC7C,IAAME,EAAaF,EAAM,OACzB,GAAI,CAACP,EAAK,SAASS,CAAU,EAAG,OAEhC,IAAIC,EACEC,EAAeX,EAAK,QAAQS,CAAU,EAE5C,OAAQF,EAAM,IAAK,CACjB,IAAK,aACHG,EAAUV,GAAMW,EAAe,GAAKX,EAAK,MAAM,EAC/C,MACF,IAAK,YACHU,EAAUV,GAAMW,EAAe,EAAIX,EAAK,QAAUA,EAAK,MAAM,EAC7D,MACF,IAAK,OACHU,EAAUV,EAAK,CAAC,EAChB,MACF,IAAK,MACHU,EAAUV,EAAKA,EAAK,OAAS,CAAC,EAC9B,MACF,QACE,MACJ,CAEAO,EAAM,eAAe,EACrBJ,EAAUO,CAAO,EACjBA,EAAQ,MAAM,CAChB,CAAC,EAEDZ,EAAc,QAAQ,gBAAkB,GACxCA,EAAc,cAAc,IAAI,YAAY,sBAAsB,CAAC,CACrE,EAEI,OAAO,UACT,OAAO,SAAS,SAAS,OAAQ,qCAAsCD,CAAQ,CAEnF,GAAG,EC8aH,IAAIe,EAAKA,GAAM,IAAI,UAAW,CAG7B,KAAK,SAAW,QAQhB,KAAK,UAAY,CAEhB,aAAc,GAEd,aAAc,GAEd,QAAS,GAET,KAAM,UAEN,OAAQ,OAER,OAAQ,OAER,MAAO,QAEP,OAAQ,KAER,UAAW,KAEX,SAAU,GAEV,SAAU,GAEV,YAAa,IAEb,MAAO,GAEP,WAAY,GAEZ,gBAAiB,2CAClB,EAIA,KAAK,KAAO,CAAC,EAEb,KAAK,SAAW,KAEhB,KAAK,aAAe,KAEpB,KAAK,WAAa,KAElB,KAAK,YAAc,KAEnB,KAAK,eAAiB,IAAI,IAE1B,KAAK,eAAiB,KAEtB,KAAK,aAAe,GAEpB,KAAK,YAAc,CAAC,EAEpB,KAAK,OAAS,KAEd,KAAK,aAAe,GAEpB,KAAK,WAAa,KASlB,KAAK,KAAO,SAASC,EAAQ,CAI5B,GAHAD,EAAG,KAAO,OAAO,OAAO,CAAC,EAAGA,EAAG,UAAWC,GAAU,CAAC,CAAC,EAEtDD,EAAG,KAAK,WAAa,KACjBA,EAAG,KAAK,MAAO,CAClB,IAAIE,EAAMF,EAAG,KAAK,MAAM,YAAY,GAAG,EACnCE,IAAQ,KACXF,EAAG,KAAK,WAAaA,EAAG,KAAK,MAAM,UAAUE,EAAM,CAAC,EACpDF,EAAG,KAAK,MAAQA,EAAG,KAAK,MAAM,UAAU,EAAGE,CAAG,EAEhD,CAEI,CAACF,EAAG,QAAU,OAAO,OAAO,UAAc,KAAe,OAAO,OAAO,UAAU,OAAU,aAC9FA,EAAG,OAAS,SAASG,EAAQC,EAAMC,EAAM,CACxC,OAAO,UAAU,MAAMF,EAAQC,EAAMC,CAAI,CAC1C,GAKD,QADIC,EAAkB,SAAS,iBAAiB,aAAa,EACpDC,EAAI,EAAGA,EAAID,EAAgB,OAAQC,IAC3CP,EAAG,YAAYM,EAAgBC,CAAC,EAAE,aAAa,KAAK,CAAC,EAAI,GAErDP,EAAG,eACP,SAAS,iBAAiB,QAASA,EAAG,QAAQ,EAC9C,SAAS,iBAAiB,SAAUA,EAAG,SAAS,EAChD,SAAS,iBAAiB,YAAaA,EAAG,YAAY,EACtD,SAAS,iBAAiB,WAAYA,EAAG,WAAW,EACpD,SAAS,iBAAiB,QAASA,EAAG,QAAQ,EAC9C,OAAO,iBAAiB,WAAYA,EAAG,WAAW,EAClD,OAAO,iBAAiB,eAAgBA,EAAG,eAAe,EAC1DA,EAAG,aAAe,IAGnB,OAAO,QAAQ,aAAa,CAAC,GAAI,GAAM,IAAK,SAAS,SAAW,SAAS,MAAM,EAAG,EAAE,EAEhF,SAAS,MACZA,EAAG,cAAc,SAAS,IAAI,EAK3B,SAAS,aAAe,WAC3B,SAAS,iBAAiB,mBAAoB,UAAW,CACxDA,EAAG,cAAc,SAAS,IAAI,CAC/B,CAAC,EAGFA,EAAG,MAAM,UAAW,CAAC,IAAK,SAAS,SAAW,SAAS,MAAM,CAAC,CAC/D,EAQA,KAAK,KAAO,SAASQ,EAAKH,EAAM,CAC/B,IAAII,EAAM,OAAO,OAAO,CAAC,EAAGT,EAAG,KAAMK,GAAQ,CAAC,CAAC,EAC/CL,EAAG,UAAUA,EAAG,YAAYQ,CAAG,GAAKA,EAAKC,CAAG,CAC7C,EAKA,KAAK,WAAa,UAAW,CAC5B,OAAQT,EAAG,QACZ,EAKA,KAAK,eAAiB,UAAW,CAChC,OAAQA,EAAG,YACZ,EAMA,KAAK,eAAiB,SAASU,EAAK,CACnCV,EAAG,aAAe,CAAC,CAACU,CACrB,EAOA,KAAK,SAAW,SAASC,EAAI,CAC5BX,EAAG,OAASW,CACb,EAUA,KAAK,MAAQ,SAASC,EAAIC,EAAM,CAC/B,OAAID,EAAG,aAAa,MAAQC,CAAI,EACvBD,EAAG,aAAa,MAAQC,CAAI,EACjCD,EAAG,aAAa,WAAaC,CAAI,EAC5BD,EAAG,aAAa,WAAaC,CAAI,EAClC,IACT,EASA,KAAK,UAAY,SAASD,EAAIC,EAAMC,EAAU,CAC7C,IAAIC,EAAIf,EAAG,MAAMY,EAAIC,CAAI,EACzB,OAAIE,IAAM,KACDD,EACLC,IAAM,IAAMA,IAAM,OACb,GACLA,IAAM,QACD,GACDD,CACT,EAUA,KAAK,eAAiB,SAASE,EAAUC,EAAU,CAClD,MAAI,CAACD,GAAYA,EAAS,QAAQ,GAAG,IAAM,IAAM,CAACC,EACzCD,GACJC,EAAS,KACbA,EAAS,GAAK,MAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,GACjDD,EAAS,QAAQ,KAAM,IAAMC,EAAS,EAAE,EACjD,EAWA,KAAK,YAAc,SAAST,EAAK,CAEhC,GAAI,CAACA,GAAOA,EAAI,OAAO,CAAC,IAAM,IAC7B,OAAQ,KAET,GAAIA,EAAI,OAAO,CAAC,IAAM,KAAOA,EAAI,OAAO,CAAC,IAAM,IAC9C,OAAQA,EAET,GAAI,CACH,IAAIU,EAAS,IAAI,IAAIV,EAAK,SAAS,OAAO,EAC1C,GAAIU,EAAO,SAAW,OAAO,SAAS,OACrC,OAAQA,EAAO,SAAWA,EAAO,OAASA,EAAO,IACnD,MAAW,CAAC,CACZ,OAAQ,IACT,EAUA,KAAK,eAAiB,SAASN,EAAI,CAgBlC,GAdIZ,EAAG,MAAMY,EAAI,UAAU,IAAM,QAAUZ,EAAG,MAAMY,EAAI,UAAU,IAAM,IAEpEA,EAAG,aAAa,IAAI,IAAM,SAAWA,EAAG,aAAa,SAAS,IAAM,SAGpEA,EAAG,aAAa,QAAQ,GAGxBA,EAAG,aAAa,UAAU,GAG1BA,EAAG,UAAY,KAAOA,EAAG,aAAa,SAAS,GAG/CA,EAAG,UAAY,QAAUA,EAAG,aAAa,UAAU,EACtD,MAAQ,GAET,GAAIA,EAAG,aAAa,IAAI,IAAM,QAAUA,EAAG,aAAa,SAAS,IAAM,OACtE,MAAQ,GAET,IAAIO,EAAQnB,EAAG,MAAMY,EAAI,KAAK,EAC9B,GAAIO,IAAU,KACb,OAAQnB,EAAG,YAAYmB,CAAK,IAAM,KAEnC,IAAIX,EAAMI,EAAG,aAAa,MAAM,GAAKA,EAAG,aAAa,QAAQ,GAAK,GAClE,OAAQZ,EAAG,YAAYQ,CAAG,IAAM,IACjC,EASA,KAAK,SAAW,SAASI,EAAI,CAC5B,IAAIH,EAAM,OAAO,OAAO,CAAC,EAAGT,EAAG,IAAI,EAC/Be,EAOJ,IANKA,EAAIf,EAAG,MAAMY,EAAI,MAAM,KAAO,OAClCH,EAAI,KAAOM,IACPA,EAAIf,EAAG,MAAMY,EAAI,QAAQ,KAAO,OACpCH,EAAI,OAASM,IACTA,EAAIf,EAAG,MAAMY,EAAI,QAAQ,KAAO,OACpCH,EAAI,OAASM,IACTA,EAAIf,EAAG,MAAMY,EAAI,OAAO,KAAO,KAAM,CACzCH,EAAI,MAAQM,EACZN,EAAI,WAAa,KACjB,IAAIP,EAAMa,EAAE,YAAY,GAAG,EACvBb,IAAQ,KACXO,EAAI,WAAaM,EAAE,UAAUb,EAAM,CAAC,EACpCO,EAAI,MAAQM,EAAE,UAAU,EAAGb,CAAG,EAEhC,CACA,OAAKa,EAAIf,EAAG,MAAMY,EAAI,KAAK,KAAO,OACjCH,EAAI,KAAOM,IACPA,EAAIf,EAAG,MAAMY,EAAI,QAAQ,KAAO,OACpCH,EAAI,UAAYM,GACjBN,EAAI,QAAUT,EAAG,UAAUY,EAAI,UAAWH,EAAI,OAAO,EACrDA,EAAI,OAAST,EAAG,UAAUY,EAAI,SAAUH,EAAI,MAAM,EAClDA,EAAI,MAAQT,EAAG,UAAUY,EAAI,QAASH,EAAI,KAAK,EAC/CA,EAAI,WAAaT,EAAG,UAAUY,EAAI,aAAcH,EAAI,UAAU,GAEzDM,EAAIf,EAAG,MAAMY,EAAI,QAAQ,KAAO,OACpCH,EAAI,OAASM,EAAE,YAAY,GAC5BN,EAAI,QAAUT,EAAG,MAAMY,EAAI,SAAS,EACpCH,EAAI,aAAeT,EAAG,UAAUY,EAAI,gBAAiB,EAAK,EAEtDH,EAAI,OAAS,WAAaA,EAAI,OAAS,UAAYA,EAAI,OAAS,UAC/DT,EAAG,MAAMY,EAAI,SAAS,IAAM,OAC/BH,EAAI,QAAU,IACXT,EAAG,MAAMY,EAAI,QAAQ,IAAM,MAAQH,EAAI,SAAW,OACrDA,EAAI,OAAS,KAEPA,CACT,EAUA,KAAK,SAAW,SAAS,EAAG,CAE3BT,EAAG,WAAa,EAAE,OAAO,QAAQ,mDAAmD,EACpF,IAAIY,EAAK,EAAE,OAAO,QAAQ,4BAA4B,EACtD,GAAI,GAACA,GAAM,CAACZ,EAAG,eAAeY,CAAE,IAG5BZ,EAAG,YAAYY,CAAE,IAAM,SAGvB,EAAAA,EAAG,UAAY,KAAO,CAACZ,EAAG,KAAK,eAG/B,IAAE,SAAW,EAAE,SAAW,EAAE,UAAY,EAAE,QAE9C,KAAIS,EAAMT,EAAG,SAASY,CAAE,EACpBJ,EAAMR,EAAG,YAAYS,EAAI,MAAQG,EAAG,aAAa,MAAM,CAAC,EAC5D,GAAKJ,IAEL,EAAE,eAAe,EACjBC,EAAI,eAAiBG,EAEhBH,EAAI,SACRA,EAAI,OAAS,OAEV,EAAAA,EAAI,SAAW,CAAC,OAAO,QAAQA,EAAI,OAAO,IAG9C,IAAIT,EAAG,aAAc,CACpB,GAAI,CAAC,OAAO,QAAQS,EAAI,eAAe,EACtC,OACDT,EAAG,eAAe,EAAK,CACxB,CAOA,GALIS,EAAI,SAAW,OACdT,EAAG,MAAMY,EAAI,SAAS,IAAM,OAC/BH,EAAI,QAAU,IAGZA,EAAI,SAAW,MAAO,CACzBT,EAAG,SAASQ,EAAKI,EAAIH,CAAG,EACxB,MACD,CACAT,EAAG,UAAUQ,EAAKC,CAAG,GACtB,EAUA,KAAK,UAAY,SAAS,EAAG,CAC5B,IAAIW,EAAO,EAAE,OAAO,QAAQ,MAAM,EAClC,GAAI,GAACA,GAAQ,CAACpB,EAAG,KAAK,cAAgB,CAACA,EAAG,eAAeoB,CAAI,IAGzDpB,EAAG,YAAYoB,CAAI,IAAM,UAGxBA,EAAK,eAAe,EAGzB,KAAIC,EAAYrB,EAAG,MAAMoB,EAAM,UAAU,EACzC,GAAI,EAAAC,GAAa,OAAO,OAAOA,CAAS,GAAM,YACzC,CAAC,OAAOA,CAAS,EAAED,CAAI,GAG5B,KAAIX,EAAMT,EAAG,SAASoB,CAAI,EAEtBE,EAASb,EAAI,SAAWW,EAAK,aAAa,QAAQ,GAAK,OAAO,YAAY,EAC9EX,EAAI,OAASa,EACb,IAAId,EAAMR,EAAG,YAAYS,EAAI,MAAQW,EAAK,aAAa,QAAQ,CAAC,EAChE,GAAKZ,EAEL,CAAAC,EAAI,eAAiBW,EACrB,EAAE,eAAe,EACjB,IAAIG,EAAW,IAAI,SAASH,CAAI,EAC5BI,EAAY,EAAE,WAAaxB,EAAG,WAIlC,GAHIwB,GAAaA,EAAU,OAASJ,GAAQI,EAAU,MACrDD,EAAS,OAAOC,EAAU,KAAMA,EAAU,OAAS,EAAE,EAElDF,IAAW,MAAO,CACrB,IAAIG,EAAK,IAAI,gBAAgBF,CAAQ,EAAE,SAAS,EAChDf,EAAMA,EAAM,IAAMiB,CACnB,MACChB,EAAI,SAAYW,EAAK,UAAY,sBAChBG,EACA,IAAI,gBAAgBA,CAAQ,EAEzCvB,EAAG,MAAMoB,EAAM,SAAS,IAAM,OACjCX,EAAI,QAAU,IACXA,EAAI,SAAW,MAAQA,EAAI,OAAS,UACvCA,EAAI,OAAS,IAGfT,EAAG,eAAe,EAAK,EACvBA,EAAG,UAAUQ,EAAKC,CAAG,IACtB,EAOA,KAAK,SAAW,SAAS,EAAG,CAC3B,IAAIW,EAAO,EAAE,OAAO,QAAQ,mDAAmD,EAC3EA,GACHpB,EAAG,eAAe,EAAI,CACxB,EAQA,KAAK,aAAe,SAAS,EAAG,CAC/B,GAAKA,EAAG,KAAK,SAEb,KAAIY,EAAK,EAAE,OAAO,QAAQ,4BAA4B,EACtD,GAAI,GAACA,GAAM,CAACZ,EAAG,eAAeY,CAAE,IAG5BZ,EAAG,YAAYY,CAAE,IAAM,QAG3B,KAAIU,EAAStB,EAAG,MAAMY,EAAI,QAAQ,EAClC,GAAI,EAAAU,GAAUA,EAAO,YAAY,IAAM,QAEnCtB,EAAG,UAAUY,EAAI,WAAY,EAAI,IAAM,GAE3C,KAAIJ,EAAMR,EAAG,YAAYA,EAAG,MAAMY,EAAI,KAAK,GAAKA,EAAG,aAAa,MAAM,CAAC,EACvE,GAAKJ,EAGL,KAAIkB,EAAW1B,EAAG,eAAe,IAAIQ,CAAG,EACpCkB,GAAa,KAAK,IAAI,EAAIA,EAAS,GAAM1B,EAAG,KAAK,aAGjDQ,IAAQ,SAAS,SAAW,SAAS,SAGzC,aAAaR,EAAG,cAAc,EAE9BA,EAAG,eAAiB,WAAW,UAAW,CACzCA,EAAG,eAAiB,KAEpB,IAAI2B,EAAS3B,EAAG,eAAe,IAAIQ,CAAG,EACtC,GAAI,EAAAmB,GAAW,KAAK,IAAI,EAAIA,EAAO,GAAM3B,EAAG,KAAK,aAGjD,KAAI4B,EAAW5B,EAAG,KAAK,UAAYA,EAAG,KAAK,UAAYQ,EAAMA,EACzDqB,EAAU,MAAMD,EAAU,CAC7B,QAAS,CAAC,mBAAoB,iBAAkB,gBAAiB,GAAG,EACpE,SAAU,KACX,CAAC,EACA,KAAK,SAASE,EAAG,CAAE,OAAQA,EAAE,GAAKA,EAAE,KAAK,EAAI,IAAO,CAAC,EACrD,MAAM,UAAW,CAAE,OAAQ,IAAO,CAAC,EACpC9B,EAAG,eAAe,IAAIQ,EAAK,CAAC,QAASqB,EAAS,GAAI,KAAK,IAAI,CAAC,CAAC,EAC9D,EAAG,EAAE,MACN,EAOA,KAAK,YAAc,SAAS,EAAG,CAC1B7B,EAAG,iBACN,aAAaA,EAAG,cAAc,EAC9BA,EAAG,eAAiB,KAEtB,EAQA,KAAK,YAAc,SAAS,EAAG,CAC9B,IAAI+B,EAAQ,EAAE,MACd,GAAI,GAACA,GAAS,CAACA,EAAM,IAErB,KAAItB,EAAM,OAAO,OAAO,CAAC,EAAGT,EAAG,IAAI,EACnCS,EAAI,QAAU,GACdA,EAAI,OAAS,GACbA,EAAI,UAAY,GAChBA,EAAI,eAAiBsB,EAAM,UAAY,OAAY,CAAC,EAAGA,EAAM,QAAS,EAAGA,EAAM,OAAO,EAAI,KAC1F/B,EAAG,UAAU+B,EAAM,IAAKtB,CAAG,EAC5B,EAMA,KAAK,gBAAkB,SAAS,EAAG,CAC9BT,EAAG,eACN,EAAE,eAAe,EACjB,EAAE,YAAcA,EAAG,KAAK,gBAE1B,EAUA,KAAK,YAAc,SAASY,EAAI,CAE/B,IAAI,EAAIZ,EAAG,MAAMY,EAAI,SAAS,EAC9B,OAAI,IAGJ,EAAIA,EAAG,QACH,IAAM,OACD,SACL,IAAM,SAAW,IAAM,YAAc,IAAM,SACtC,SACD,QACT,EASA,KAAK,UAAY,SAASD,EAAIqB,EAAO,CACpC,IAAIC,EAAQ,KACZ,OAAO,UAAW,CACjB,aAAaA,CAAK,EAClBA,EAAQ,WAAWtB,EAAIqB,CAAK,CAC7B,CACD,EAQA,KAAK,eAAiB,SAASpB,EAAI,CAClC,GAAKZ,EAAG,eAAeY,CAAE,EAEzB,KAAIH,EAAMT,EAAG,SAASY,CAAE,EACpBJ,EAAMR,EAAG,YAAYS,EAAI,MAAQG,EAAG,aAAa,MAAM,GAAKA,EAAG,aAAa,QAAQ,CAAC,EACzF,GAAKJ,EAEL,CAAAC,EAAI,eAAiBG,EAErBH,EAAI,SAAW,GAEfA,EAAI,WAAa,GAEZA,EAAI,SACRA,EAAI,OAAS,OAEVT,EAAG,MAAMY,EAAI,SAAS,IAAM,OAC/BH,EAAI,QAAU,IACXT,EAAG,MAAMY,EAAI,QAAQ,IAAM,MAAQH,EAAI,SAAW,OACrDA,EAAI,OAAS,IAEd,IAAIyB,EAAItB,EAAG,QACX,GAAIsB,IAAM,SAAWA,IAAM,YAAcA,IAAM,SAAU,CACxD,IAAId,EAAOR,EAAG,QAAQ,MAAM,EAC5B,GAAIQ,EACH,GAAIX,EAAI,SAAW,MAAO,CACzB,IAAIc,EAAW,IAAI,SAASH,CAAI,EAC5BK,EAAK,IAAI,gBAAgBF,CAAQ,EAAE,SAAS,EAChDf,EAAMA,EAAI,MAAM,GAAG,EAAE,CAAC,EAAI,IAAMiB,CACjC,MACChB,EAAI,SAAYW,EAAK,UAAY,sBAChB,IAAI,SAASA,CAAI,EACjB,IAAI,gBAAgB,IAAI,SAASA,CAAI,CAAC,OAE9CR,EAAG,MACTH,EAAI,SAAW,QAClBD,EAAMA,EAAI,MAAM,GAAG,EAAE,CAAC,EAAI,IAAM,mBAAmBI,EAAG,IAAI,EAAI,IAAM,mBAAmBA,EAAG,KAAK,EAGlG,CAEA,GAAIH,EAAI,SAAW,MAAO,CACzBT,EAAG,SAASQ,EAAKI,EAAIH,CAAG,EACxB,MACD,CACAT,EAAG,UAAUQ,EAAKC,CAAG,GACtB,EASA,KAAK,cAAgB,SAAS0B,EAAW,CACxC,IAAIC,EAAMD,EAAU,iBAAiB,0DAA0D,EAE/F,GAAIA,EAAU,SAAWA,EAAU,QAAQ,0DAA0D,EAAG,CAEvG,QADIE,EAAM,CAACF,CAAS,EACXG,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC/BD,EAAI,KAAKD,EAAIE,CAAC,CAAC,EAChBF,EAAMC,CACP,CACA,QAAS,EAAI,EAAG,EAAID,EAAI,OAAQ,IAAK,CACpC,IAAIxB,EAAKwB,EAAI,CAAC,EACd,GAAI,CAAAxB,EAAG,UAEP,KAAI2B,EAAUvC,EAAG,YAAYY,CAAE,EAE/B,GAAI,EAAA2B,IAAY,SAAWA,IAAY,UAGvC,KAAI/B,EAAMR,EAAG,MAAMY,EAAI,KAAK,GAAKA,EAAG,aAAa,MAAM,GAAKA,EAAG,aAAa,QAAQ,EACpF,GAAKJ,EAEL,CAAAI,EAAG,UAAY,GACf,IAAI4B,EAAa,SAASxC,EAAG,MAAMY,EAAI,UAAU,EAAG,EAAE,GAAK,EACvD6B,EAAW,SAASzC,EAAG,MAAMY,EAAI,QAAQ,EAAG,EAAE,GAAK,EAEnD8B,GAAW,SAASC,EAAU,CACjC,OAAO,UAAW,CAAE3C,EAAG,eAAe2C,CAAQ,CAAG,CAClD,GAAG/B,CAAE,EAkBL,GAhBI4B,EAAa,IAChBE,EAAU1C,EAAG,UAAU0C,EAASF,CAAU,GAEvCC,EAAW,IACdC,GAAW,SAASC,EAAUhC,EAAIiC,EAAI,CACrC,IAAIC,EAAU,GACd,OAAO,UAAW,CACjBlC,EAAG,EACEkC,IACJA,EAAU,GACVF,EAAS,aAAe,YAAYhC,EAAIiC,CAAE,EAE5C,CACD,GAAGhC,EAAI8B,EAASD,CAAQ,GAGrBF,IAAY,SACf3B,EAAG,iBAAiB,QAAS8B,CAAO,UAC1BH,IAAY,OAAQ,CAE9B,IAAIO,GAAgB,SAASnC,EAAI,CAChC,IAAIoC,EAAY,EAChB,OAAO,UAAW,CACjB,IAAIC,EAAM,KAAK,IAAI,EACfA,EAAMD,EAAY,KAEtBA,EAAYC,EACZrC,EAAG,EACJ,CACD,GAAG+B,CAAO,EACV9B,EAAG,iBAAiB,SAAUkC,CAAY,EAC1ClC,EAAG,iBAAiB,OAAQkC,CAAY,CACzC,MAAWP,IAAY,QACtB3B,EAAG,iBAAiB,QAAS8B,CAAO,EAC1BH,IAAY,QACtBG,EAAQ,IAEV,CACD,EAOA,KAAK,iBAAmB,SAASP,EAAW,CAE3C,QADIC,EAAMD,EAAU,iBAAmBA,EAAU,iBAAiB,GAAG,EAAI,CAAC,EACjE5B,EAAI,EAAGA,EAAI6B,EAAI,OAAQ7B,IAC3B6B,EAAI7B,CAAC,EAAE,eACV,cAAc6B,EAAI7B,CAAC,EAAE,YAAY,EACjC6B,EAAI7B,CAAC,EAAE,aAAe,MAEnB6B,EAAI7B,CAAC,EAAE,UACV6B,EAAI7B,CAAC,EAAE,QAAQ,MAAM,EACrB6B,EAAI7B,CAAC,EAAE,QAAU,MAElB6B,EAAI7B,CAAC,EAAE,UAAY,GAGhB4B,EAAU,eACb,cAAcA,EAAU,YAAY,EACpCA,EAAU,aAAe,MAEtBA,EAAU,UACbA,EAAU,QAAQ,MAAM,EACxBA,EAAU,QAAU,MAErBA,EAAU,UAAY,EACvB,EAYA,KAAK,SAAW,SAAS3B,EAAKI,EAAIH,EAAK,CAElCG,EAAG,SACNA,EAAG,QAAQ,MAAM,EAClB,IAAIgB,EAAWnB,EAAI,UAAYA,EAAI,UAAYD,EAAMA,EACjDyC,EAAS,IAAI,YAAYrB,CAAQ,EACrChB,EAAG,QAAUqC,EACbA,EAAO,UAAY,SAASC,EAAG,CAC9B,IAAIC,EAAS,CAAC,IAAK3C,EAAK,KAAM0C,EAAE,KAAM,OAAQzC,CAAG,EAC5CT,EAAG,MAAM,mBAAoBmD,CAAM,IAEpC1C,EAAI,OAAS,QAChBT,EAAG,aAAamD,EAAO,KAAM1C,CAAG,EAEhCT,EAAG,YAAYmD,EAAO,KAAM1C,CAAG,EAEhCT,EAAG,MAAM,kBAAmB,CAAC,IAAKQ,EAAK,SAAUA,EAAK,KAAMC,EAAI,IAAI,CAAC,EACtE,EACAwC,EAAO,QAAU,UAAW,CAC3BjD,EAAG,MAAM,iBAAkB,CAAC,IAAKQ,EAAK,SAAUoB,EAAU,MAAO,IAAI,MAAM,sBAAsB,CAAC,CAAC,CACpG,CACD,EAUA,KAAK,UAAY,eAAepB,EAAKC,EAAK,CACzC,IAAImB,EAAWnB,EAAI,UAAYA,EAAI,UAAYD,EAAMA,EAKrD,GAHI,CAACC,EAAI,UAAY,CAACA,EAAI,WACzBT,EAAG,YAAY,EAEZ,EAACA,EAAG,MAAM,kBAAmB,CAAC,IAAKQ,EAAK,SAAUoB,EAAU,OAAQnB,EAAK,cAAeA,EAAI,gBAAkB,IAAI,CAAC,EAIvH,KAAI2C,EACA3C,EAAI,SACP2C,EAAY,IAAI,iBAEZpD,EAAG,YACNA,EAAG,WAAW,MAAM,EACrBoD,EAAYpD,EAAG,WAAa,IAAI,iBAE5BS,EAAI,UACRT,EAAG,cAAc,EAClB,GAAI,CACH,IAAII,EAAO,KACPiD,EAAO,KACPC,EAAW9C,EAMXc,EAASb,EAAI,QAAU,MACvBkB,EAAS3B,EAAG,eAAe,IAAIQ,CAAG,EACtC,GAAIc,IAAW,OAASK,GAAUA,EAAO,SAAY,KAAK,IAAI,EAAIA,EAAO,GAAM3B,EAAG,KAAK,cACtFI,EAAO,MAAMuB,EAAO,QAChByB,EAAU,OAAO,SACpB,OAEF,GAAI,CAAChD,EAAM,CAEV,IAAImD,EAAY,CACf,OAAQH,EAAU,OAClB,QAAS,CACR,mBAAoB,iBACpB,YAAa3C,EAAI,IAClB,CACD,EAOA,GANIa,IAAW,QACdiC,EAAU,QAAQ,aAAa,EAAIA,EAAU,OAASjC,EAAO,YAAY,EACrEb,EAAI,WACP8C,EAAU,KAAO9C,EAAI,WAEvB4C,EAAO,MAAM,MAAMzB,EAAU2B,CAAS,EAClC,CAACF,EAAK,GAAI,CACbrD,EAAG,MAAM,iBAAkB,CAAC,IAAKQ,EAAK,SAAUoB,EAAU,OAAQyB,EAAK,OAAQ,SAAUA,CAAI,CAAC,EAC9F,MACD,CACIA,EAAK,aACRC,EAAW,IAAI,IAAID,EAAK,GAAG,EAAE,SAAW,IAAI,IAAIA,EAAK,GAAG,EAAE,QAC3DjD,EAAO,MAAMiD,EAAK,KAAK,CACxB,CAMI,CAAC5C,EAAI,UAAYa,IAAW,OAC/BtB,EAAG,eAAe,IAAIQ,EAAK,CAAC,QAAS,QAAQ,QAAQJ,CAAI,EAAG,GAAI,KAAK,IAAI,CAAC,CAAC,EAE5E,IAAI+C,EAAS,CAAC,IAAK3C,EAAK,SAAU8C,EAAU,KAAMlD,EAAM,OAAQK,CAAG,EACnE,GAAI,CAACT,EAAG,MAAM,mBAAoBmD,CAAM,EACvC,OAEG1C,EAAI,OAAS,QAChBA,EAAI,YAAcA,EAAI,cAEtBA,EAAI,YAAcA,EAAI,QAClB4C,GAAQA,EAAK,aAChB5C,EAAI,YAAc,KAKpB,IAAI+C,EAAa,UAAW,CAO3B,GALAxD,EAAG,aAAeA,EAAG,SACrBA,EAAG,SAAWsD,EACV7C,EAAI,aACP,OAAO,QAAQ,UAAU,CAAC,GAAI,GAAM,IAAK6C,CAAQ,EAAG,GAAIA,CAAQ,EAE7D7C,EAAI,OAAS,QAChB,GAAIA,EAAI,eAEP,OAAO,SAASA,EAAI,eAAe,EAAGA,EAAI,eAAe,CAAC,MACpD,CACN,IAAIgD,EAAehD,EAAI,SAAW,KAAOA,EAAI,OAAS,GACtD,GAAIgD,EAAc,CACjB,IAAIC,EAAUlD,EAAI,QAAQ,GAAG,EAC7B,GAAIkD,IAAY,GAAI,CACnB,IAAIC,EAAS,SAAS,eAAenD,EAAI,UAAUkD,EAAU,CAAC,CAAC,EAC3DC,GACHA,EAAO,eAAe,CAAC,SAAU,QAAQ,CAAC,CAC5C,MACC,OAAO,SAAS,EAAG,CAAC,CAEtB,CACD,CAGD3D,EAAG,eAAe,EAAK,EAEvBA,EAAG,MAAM,kBAAmB,CAAC,IAAKQ,EAAK,SAAU8C,EAAU,KAAM7C,EAAI,IAAI,CAAC,CAC3E,EAEImD,EACAnD,EAAI,OAAS,QAChBmD,EAAW,UAAW,CAAE5D,EAAG,aAAamD,EAAO,KAAM1C,CAAG,CAAG,EAE3DmD,EAAW,UAAW,CAAE5D,EAAG,YAAYmD,EAAO,KAAM1C,CAAG,CAAG,EAMvDA,EAAI,YAAc,SAAS,oBAC9B,SAAS,oBAAoBmD,CAAQ,EAAE,mBAAmB,KAAKJ,CAAU,GAEzEI,EAAS,EACTJ,EAAW,EAEb,OAASK,EAAK,CACb,GAAIA,EAAI,OAAS,aAChB,OACD7D,EAAG,MAAM,iBAAkB,CAAC,IAAKQ,EAAK,SAAUoB,EAAU,MAAOiC,CAAG,CAAC,CACtE,QAAE,CACIpD,EAAI,UACRT,EAAG,cAAc,CACnB,EACD,EAUA,KAAK,YAAc,SAASI,EAAMK,EAAK,CACtC,IAAIqD,EAAM,IAAI,UAAU,EAAE,gBAAgB1D,EAAM,WAAW,EAEvD2D,EAAa,KACbtD,EAAI,SACPsD,EAAaD,EAAI,cAAcrD,EAAI,MAAM,GACrCsD,IACJA,EAAaD,EAAI,MAElB,IAAIE,EAAiBhE,EAAG,eAAeS,EAAI,OAAQA,EAAI,cAAc,EACjEwD,EAAa,SAAS,cAAcD,CAAc,EACtD,GAAI,CAACC,EAAY,CAChB,QAAQ,KAAK,4BAA2BD,EAAiB,cAAc,EACvE,MACD,CAEAhE,EAAG,iBAAiBiE,CAAU,EAE9BjE,EAAG,WAAWS,EAAI,KAAMwD,EAAYF,EAAYtD,CAAG,EAE/CA,EAAI,aACPT,EAAG,aAAa8D,EAAKrD,CAAG,EAEzBT,EAAG,WAAW8D,CAAG,EAEjB,IAAI3B,EAAY,SAAS,cAAc6B,CAAc,GAAK,SAAS,KACnEhE,EAAG,YAAYmC,CAAS,EAExBnC,EAAG,cAAcmC,CAAS,CAC3B,EAWA,KAAK,aAAe,SAAS/B,EAAMK,EAAK,CAKvC,QAJIqD,EAAM,IAAI,UAAU,EAAE,gBAAgB1D,EAAM,WAAW,EAEvD8D,EAAYJ,EAAI,iBAAiB,2CAA2C,EAC5EK,EAAmB,CAAC,EACf5D,EAAI,EAAGA,EAAI2D,EAAU,OAAQ3D,IAAK,CAC1C,IAAI6D,EAAOF,EAAU3D,CAAC,EAClB8D,EAAYD,EAAK,aAAa,iBAAiB,GAAKA,EAAK,aAAa,sBAAsB,EAChGC,EAAYrE,EAAG,eAAeqE,EAAW5D,EAAI,cAAc,EAC3D,IAAI6D,EAAOF,EAAK,aAAa,eAAe,GAAKA,EAAK,aAAa,oBAAoB,GAAK,UAExFH,EAAa,SAAS,cAAcI,CAAS,EACjD,GAAI,CAACJ,EAAY,CAChB,QAAQ,KAAK,0BAAyBI,EAAY,cAAc,EAChE,QACD,CAEArE,EAAG,iBAAiBiE,CAAU,EAE9BjE,EAAG,WAAWsE,EAAML,EAAYG,EAAM3D,CAAG,EAErC6D,IAAS,WAIZtE,EAAG,YAAYoE,CAAI,EACnBD,EAAiB,KAAKE,CAAS,EAEjC,CAEA,QAAS/B,EAAI,EAAGA,EAAI6B,EAAiB,OAAQ7B,IAAK,CACjD,IAAIiC,EAAU,SAAS,cAAcJ,EAAiB7B,CAAC,CAAC,EACpDiC,GACHvE,EAAG,cAAcuE,CAAO,CAC1B,CACD,EAYA,KAAK,WAAa,SAASD,EAAML,EAAYF,EAAYtD,EAAK,CAC7D,IAAI+D,EAAW/D,EAAI,OAAST,EAAG,OAC/B,OAAQsE,EAAM,CACb,IAAK,SACAE,EACHxE,EAAG,OAAOiE,EAAYF,EAAW,UAAW,CAAC,WAAY,WAAW,CAAC,EAErEE,EAAW,UAAYF,EAAW,UAEnC,MACD,IAAK,UACJE,EAAW,QAAQF,CAAU,EAC7B,MACD,IAAK,SACJE,EAAW,OAAOF,CAAU,EAC5B,MACD,IAAK,SACJE,EAAW,OAAOF,CAAU,EAC5B,MACD,IAAK,QACJE,EAAW,MAAMF,CAAU,EAC3B,MACD,IAAK,SACJE,EAAW,OAAO,EAClB,MACD,IAAK,OACJ,MAED,QAEKA,EAAW,UAAY,QAAUF,EAAW,UAAY,OACvDS,EACHxE,EAAG,OAAOiE,EAAYF,EAAW,UAAW,CAAC,WAAY,WAAW,CAAC,EAErEE,EAAW,UAAYF,EAAW,UAG/BS,EACHxE,EAAG,OAAOiE,EAAYF,EAAW,UAAW,CAAC,WAAY,WAAW,CAAC,EAErEE,EAAW,YAAYF,CAAU,EAGnC,KACF,CACD,EAUA,KAAK,aAAe,SAASD,EAAKrD,EAAK,CACtC,GAAKA,EAAI,MAET,KAAIG,EAAKkD,EAAI,cAAcrD,EAAI,KAAK,EACpC,GAAKG,EAEL,KAAI6D,EAAOhE,EAAI,WAAaG,EAAG,aAAaH,EAAI,UAAU,EAAIG,EAAG,YAC7D6D,IACH,SAAS,MAAQA,IACnB,EAQA,KAAK,WAAa,SAASX,EAAK,CAM/B,QALI9C,EAAW,wCACX0D,EAAS,SAAS,KAAK,iBAAiB1D,CAAQ,EAChD2D,EAASb,EAAI,KAAK,iBAAiB9C,CAAQ,EAE3C4D,EAAU,IAAI,IACTrE,EAAI,EAAGA,EAAImE,EAAO,OAAQnE,IAClCqE,EAAQ,IAAI5E,EAAG,OAAO0E,EAAOnE,CAAC,CAAC,CAAC,EAEjC,QAASA,EAAI,EAAGA,EAAIoE,EAAO,OAAQpE,IAClC,GAAI,CAAAqE,EAAQ,IAAI5E,EAAG,OAAO2E,EAAOpE,CAAC,CAAC,CAAC,EAEpC,GAAIoE,EAAOpE,CAAC,EAAE,QAAQ,YAAY,IAAM,SAAU,CAGjD,QADIsE,EAAI,SAAS,cAAc,QAAQ,EAC9BvC,EAAI,EAAGA,EAAIqC,EAAOpE,CAAC,EAAE,WAAW,OAAQ+B,IAChDuC,EAAE,aAAaF,EAAOpE,CAAC,EAAE,WAAW+B,CAAC,EAAE,KAAMqC,EAAOpE,CAAC,EAAE,WAAW+B,CAAC,EAAE,KAAK,EAC3EuC,EAAE,YAAcF,EAAOpE,CAAC,EAAE,YAEtBsE,EAAE,aAAa,KAAK,IACvB7E,EAAG,YAAY6E,EAAE,aAAa,KAAK,CAAC,EAAI,IACzC,SAAS,KAAK,YAAYA,CAAC,CAC5B,MACC,SAAS,KAAK,YAAYF,EAAOpE,CAAC,EAAE,UAAU,EAAI,CAAC,CAGtD,EAMA,KAAK,OAAS,SAASK,EAAI,CAC1B,IAAIkE,EAAMlE,EAAG,QAAQ,YAAY,EACjC,OAAIkE,IAAQ,OACH,QAAUlE,EAAG,aAAa,MAAM,EACrCkE,IAAQ,QACH,SAAWlE,EAAG,YAAY,UAAU,EAAG,GAAG,EAC/CkE,IAAQ,SACH,WAAalE,EAAG,aAAa,KAAK,GAAKA,EAAG,YAAY,UAAU,EAAG,GAAG,GACvEA,EAAG,SACZ,EAUA,KAAK,YAAc,SAASuB,EAAW,CAEtC,QADI4C,EAAU5C,EAAU,iBAAiB,QAAQ,EACxC5B,EAAI,EAAGA,EAAIwE,EAAQ,OAAQxE,IAAK,CACxC,IAAIyE,EAAMD,EAAQxE,CAAC,EAEnB,GAAI,EAAAP,EAAG,MAAMgF,EAAK,UAAU,IAAM,QAAUhF,EAAG,MAAMgF,EAAK,UAAU,IAAM,IAG1E,IAAIA,EAAI,aAAa,KAAK,EAAG,CAC5B,IAAIC,EAAMD,EAAI,aAAa,KAAK,EAChC,GAAIhF,EAAG,YAAYiF,CAAG,EACrB,SACDjF,EAAG,YAAYiF,CAAG,EAAI,EACvB,CAGA,QADIJ,EAAI,SAAS,cAAc,QAAQ,EAC9BvC,EAAI,EAAGA,EAAI0C,EAAI,WAAW,OAAQ1C,IAC1CuC,EAAE,aAAaG,EAAI,WAAW1C,CAAC,EAAE,KAAM0C,EAAI,WAAW1C,CAAC,EAAE,KAAK,EAC/DuC,EAAE,YAAcG,EAAI,YACpBA,EAAI,WAAW,aAAaH,EAAGG,CAAG,EACnC,CACD,EAQA,KAAK,cAAgB,UAAW,CAC1BhF,EAAG,KAAK,WAERA,EAAG,cACPA,EAAG,YAAc,SAAS,cAAc,KAAK,EAC7CA,EAAG,YAAY,GAAK,cACpBA,EAAG,YAAY,MAAM,QAAU,0GAEhC,SAAS,KAAK,YAAYA,EAAG,WAAW,EACxCA,EAAG,YAAY,YACfA,EAAG,YAAY,MAAM,MAAQ,MAC9B,EAKA,KAAK,cAAgB,UAAW,CAC1BA,EAAG,cAERA,EAAG,YAAY,MAAM,MAAQ,OAC7B,WAAW,UAAW,CAChBA,EAAG,cAERA,EAAG,YAAY,MAAM,WAAa,OAClCA,EAAG,YAAY,MAAM,MAAQ,IAC7BA,EAAG,YAAY,YACfA,EAAG,YAAY,MAAM,WAAa,iBAClCA,EAAG,YAAY,OAAO,EACvB,EAAG,GAAG,EACP,EAOA,KAAK,YAAc,UAAW,CAC7B,IAAI+B,EAAQ,OAAO,QAAQ,MACvBA,GAASA,EAAM,KAClBA,EAAM,QAAU,OAAO,QACvBA,EAAM,QAAU,OAAO,QACvB,OAAO,QAAQ,aAAaA,EAAO,EAAE,EAEvC,EAUA,KAAK,MAAQ,SAASlB,EAAMsC,EAAQ,CACnCA,EAASA,GAAU,CAAC,EACpBA,EAAO,QAAUnD,EAAG,SACpBmD,EAAO,YAAcnD,EAAG,aACxB,IAAIkF,EAAK,IAAI,YAAYrE,EAAM,CAC9B,QAAS,GACT,WAAY,GACZ,OAAQsC,CACT,CAAC,EACD,OAAQ,SAAS,cAAc+B,CAAE,CAClC,CACD,EAEA,OAAO,GAAKlF,GCzrDX,UAAY,CACX,aAMA,IAAImF,EAAc,GAKlB,SAASC,GAAa,CACpB,IAAMC,EAAS,SAAS,cAAc,cAAc,EAChDA,GAAUA,EAAO,QAAQ,cAAgB,SAC3CF,EAAcE,EAAO,QAAQ,YAAY,YAAY,IAAM,OAE/D,CASA,SAASC,EAAiBC,EAAIC,EAAIC,EAAQC,EAAgB,CACxD,IAAMC,GAAmBD,EAAiB,IAAM,KAAK,GAAM,IAC3D,MAAO,CACL,EAAGH,EAAKE,EAAS,KAAK,IAAIE,CAAc,EACxC,EAAGH,EAAKC,EAAS,KAAK,IAAIE,CAAc,CAC1C,CACF,CAKA,SAASC,EAAYL,EAAIC,EAAIK,EAAaC,EAAaC,EAAYC,EAAU,CAC3E,IAAMC,EAAaX,EAAiBC,EAAIC,EAAIK,EAAaE,CAAU,EAC7DG,EAAWZ,EAAiBC,EAAIC,EAAIK,EAAaG,CAAQ,EACzDG,EAAab,EAAiBC,EAAIC,EAAIM,EAAaC,CAAU,EAC7DK,EAAWd,EAAiBC,EAAIC,EAAIM,EAAaE,CAAQ,EAEzDK,EAAeL,EAAWD,EAAa,IAAM,EAAI,EAEvD,MAAO,CACL,IACAE,EAAW,EACXA,EAAW,EACX,IACAJ,EACAA,EACA,EACAQ,EACA,EACAH,EAAS,EACTA,EAAS,EACT,IACAE,EAAS,EACTA,EAAS,EACT,IACAN,EACAA,EACA,EACAO,EACA,EACAF,EAAW,EACXA,EAAW,EACX,GACF,EAAE,KAAK,GAAG,CACZ,CAMA,SAASG,EAASC,EAAO,CACvB,OAAOA,EAAM,SAAS,EAAE,QAAQ,wBAAyB,GAAG,CAC9D,CAMA,SAASC,EAAaD,EAAOE,EAAS,KAAM,CAC1C,OAAItB,EACK,iCAEFmB,EAAS,KAAK,MAAMC,CAAK,CAAC,EAAIE,CACvC,CAMA,SAASC,EAAcH,EAAO,CAC5B,OAAIpB,EACK,qBAELoB,GAAS,KACQA,EAAQ,KAAS,QAAQ,CAAC,EAC5B,QAAQ,OAAQ,EAAE,EAAI,IAC9BA,GAAS,IACX,KAAK,MAAMA,EAAQ,GAAI,EAAI,IAE7B,OAAO,KAAK,MAAMA,CAAK,CAAC,CACjC,CAUA,SAASI,EAAeC,EAAW,CACjC,IAAMC,EAAMD,EAAU,cAAc,KAAK,EACzC,GAAI,CAACC,EAAK,OAGV,IAAIC,EACJ,GAAI,CACFA,EAAO,KAAK,MAAMF,EAAU,QAAQ,UAAY,IAAI,CACtD,OAASG,EAAG,CACV,QAAQ,MAAM,0BAA2BA,CAAC,EAC1C,MACF,CAEA,GAAI,CAACD,EAAK,OAAQ,OAGlB,IAAMvB,EAAK,GACLC,EAAK,GACLK,EAAc,GACdC,EAAc,GAGdkB,EAAQF,EAAK,OAAO,CAACG,EAAKC,IAASD,EAAMC,EAAK,MAAO,CAAC,EAC5D,GAAIF,IAAU,EAAG,OAGjBH,EAAI,iBAAiB,MAAM,EAAE,QAASM,GAAOA,EAAG,OAAO,CAAC,EAGxD,IAAIC,EAAe,EAEnBN,EAAK,QAASI,GAAS,CACrB,IAAMG,EAAaH,EAAK,MAAQF,EAC1BM,EAAYD,EAAa,IAG/B,GAAIC,EAAY,GAAK,OAErB,IAAMvB,EAAaqB,EACbpB,EAAWoB,EAAeE,EAE1BC,EAAO,SAAS,gBACpB,6BACA,MACF,EACAA,EAAK,aACH,IACA3B,EAAYL,EAAIC,EAAIK,EAAaC,EAAaC,EAAYC,CAAQ,CACpE,EACAuB,EAAK,aAAa,QAAS,qBAAqBL,EAAK,OAAS,CAAC,GAAG,EAClEK,EAAK,aACH,QACA,oDACF,EAGA,IAAMC,EAAQ,SAAS,gBACrB,6BACA,OACF,EACMC,EAAM,KAAK,MAAMJ,EAAa,GAAG,EACvCG,EAAM,YAAc,GAAGN,EAAK,KAAK,KAAKV,EAAaU,EAAK,KAAK,CAAC,KAAKO,CAAG,KACtEF,EAAK,YAAYC,CAAK,EAEtBX,EAAI,YAAYU,CAAI,EAEpBH,EAAepB,CACjB,CAAC,EAGD,IAAM0B,EAAcd,EAAU,cAAc,qBAAqB,EACjE,GAAIc,EAAa,CACf,IAAMC,EAAW,WAAWD,EAAY,QAAQ,WAAW,EACtD,MAAMC,CAAQ,EAERxC,IACTuC,EAAY,YAAc,sBAF1BA,EAAY,YAAchB,EAAciB,CAAQ,CAIpD,CACF,CAUA,SAASC,EAAehB,EAAW,CACjC,IAAMiB,EAAgBjB,EAAU,cAAc,aAAa,EACrDkB,EAAkBlB,EAAU,cAAc,eAAe,EACzDmB,EAAanB,EAAU,cAAc,cAAc,EACzD,GAAI,CAACiB,EAAe,OAGpB,IAAIf,EACJ,GAAI,CACFA,EAAO,KAAK,MAAMF,EAAU,QAAQ,QAAU,IAAI,CACpD,OAASG,EAAG,CACV,QAAQ,MAAM,0BAA2BA,CAAC,EAC1C,MACF,CAGA,IAAMiB,EAAW,KAAK,IAAI,GAAGlB,EAAK,IAAKI,GAASA,EAAK,KAAK,EAAG,CAAC,EAG9D,GAAI,CAACJ,EAAK,QAAUkB,IAAa,EAAG,CAClCH,EAAc,UAAY,GACtBC,IAAiBA,EAAgB,UAAY,IAC7CC,IACFA,EAAW,UAAU,OAAO,QAAQ,EACpCA,EAAW,UAAU,IAAI,MAAM,GAEjC,MACF,CAGIA,IACFA,EAAW,UAAU,IAAI,QAAQ,EACjCA,EAAW,UAAU,OAAO,MAAM,GAIpC,IAAME,EAAcnB,EAAK,OAAS,EAGlCe,EAAc,UAAY,GACtBC,IAAiBA,EAAgB,UAAY,IAGjD,IAAII,EAAY,KAEhBpB,EAAK,QAAQ,CAACI,EAAMiB,IAAU,CAC5B,IAAMC,EAAUlB,EAAK,MAAQc,EAAY,IACnCK,EAAWF,IAAUF,EAGvBK,EAAa,GACjB,GAAIJ,IAAc,MAAQA,EAAY,EAAG,CACvC,IAAMT,GAAQP,EAAK,MAAQgB,GAAaA,EAAa,IACrDI,EAAab,GAAO,EAAI,IAAI,KAAK,MAAMA,CAAG,CAAC,IAAM,GAAG,KAAK,MAAMA,CAAG,CAAC,GACrE,CAGA,IAAMc,EAAM,SAAS,cAAc,KAAK,EAcxC,GAbAA,EAAI,UAAY,2EACdF,EACI,iCACA,qDACN,GACAE,EAAI,MAAM,OAAS,GAAGH,CAAM,IAC5BG,EAAI,aACF,eACA,GAAGrB,EAAK,KAAK,WAAMV,EAAaU,EAAK,KAAK,CAAC,EAC7C,EACAqB,EAAI,aAAa,YAAa,KAAK,EAG/BD,GAAc,CAACnD,EAAa,CAC9B,IAAMqD,EAAa,SAAS,cAAc,MAAM,EAChDA,EAAW,UAAY,gFACrBH,EAAW,0BAA4B,uBACzC,GACAG,EAAW,YAAcF,EACzBC,EAAI,YAAYC,CAAU,CAC5B,CAKA,GAHAX,EAAc,YAAYU,CAAG,EAGzBT,EAAiB,CACnB,IAAMW,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,YAAcvB,EAAK,MACzBY,EAAgB,YAAYW,CAAK,CACnC,CAEAP,EAAYhB,EAAK,KACnB,CAAC,CACH,CASA,SAASwB,GAAa,CACpBtD,EAAW,EAGX,SAAS,iBAAiB,oBAAoB,EAAE,QAAQuB,CAAc,EAGtE,SAAS,iBAAiB,oBAAoB,EAAE,QAAQiB,CAAc,CACxE,CAGI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoBc,CAAU,EAExDA,EAAW,EAIb,OAAO,WAAaA,EAKpB,SAASC,GAAiB,CACxB,OAAO,MAAM,KAAK,SAAS,iBAAiB,cAAc,CAAC,EACxD,IAAKxB,GAAOA,EAAG,QAAQ,UAAYA,EAAG,QAAQ,QAAU,EAAE,EAC1D,KAAK,GAAG,CACb,CAEA,IAAIyB,EAAgBD,EAAe,EACnC,IAAI,iBAAiB,IAAM,CACzB,IAAME,EAAYF,EAAe,EAC7BE,GAAaA,IAAcD,IAC7BA,EAAgBC,EAChBH,EAAW,EAEf,CAAC,EAAE,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CAC9D,GAAG,EC3VH,SAASI,GAAsBC,EAAO,SAAU,CAC9C,IAAMC,EAAc,SAAS,eAAe,qBAAqB,EACjE,GAAI,CAACA,EAAa,OAElB,IAAMC,EAAoB,KAAK,MAAMD,EAAY,WAAW,EAE5D,SAASE,EAAsBC,EAAY,CACzC,GAAI,CAACA,GAAc,CAACF,EAAkBE,CAAU,EAAG,OAAO,KAC1D,IAAMC,EAAUH,EAAkBE,CAAU,EAC5C,OAAOC,EAAQ,OAAS,EAAIA,EAAQ,CAAC,EAAI,IAC3C,CAEA,SAASC,EAAaC,EAAQC,EAAOC,EAAO,CAC1C,IAAMC,EAAUH,EAAO,cAAc,kBAAkB,EACvD,GAAI,CAACG,EAAS,OAEd,IAAIC,EAASD,EAAQ,cAAc,+BAA+BF,CAAK,IAAI,EACtEG,IACHA,EAAS,SAAS,cAAc,KAAK,EACrCA,EAAO,KAAO,SACdA,EAAO,UAAY,iBACnBA,EAAO,QAAQ,MAAQH,EACvBG,EAAO,YAAcF,EACrBC,EAAQ,YAAYC,CAAM,EAC1BJ,EAAO,cAAc,IAAI,YAAY,0BAA0B,CAAC,EAEpE,CAEA,SAASK,EAAYL,EAAQM,EAAO,CAClCA,EAAM,MAAQ,GACdN,EAAO,iBAAiB,iBAAiB,EAAE,QAASI,GAAW,CAC7DA,EAAO,gBAAgB,eAAe,CACxC,CAAC,EACD,IAAMF,EAAQF,EAAO,cAAc,wBAAwB,EACvDE,IAAOA,EAAM,YAAc,eACjC,CAEA,SAASK,EAAiBC,EAAgB,CACxC,IAAMC,EACJD,EAAe,QAAQ,gCAAgC,GAAK,SACxDE,EAAeD,EAAM,cAAc,6BAA6B,EAChEE,EAAcF,EAAM,cACxB,0CACF,EAEA,GAAI,CAACC,GAAgB,CAACC,EAAa,OAEnC,IAAMC,EAAShB,EAAsBY,EAAe,KAAK,EACzD,GAAI,CAACI,EAAQ,CACXP,EAAYK,EAAcC,CAAW,EACrC,MACF,CAEA,IAAME,EAAW,OAAOD,EAAO,EAAE,EACjCb,EAAaW,EAAcG,EAAUD,EAAO,IAAI,EAChDD,EAAY,MAAQE,EACpBH,EAAa,MAAQG,CACvB,CAEApB,EAAK,iBAAiB,+BAA+B,EAAE,QAASO,GAAW,CACrEA,EAAO,QAAQ,wBACnBA,EAAO,QAAQ,sBAAwB,OACvCA,EAAO,iBAAiB,SAAU,IAAMO,EAAiBP,CAAM,CAAC,EAClE,CAAC,CACH,CAEA,SAAS,iBAAiB,mBAAoB,IAAMR,GAAsB,CAAC,EAC3E,SAAS,iBAAiB,kBAAmB,IAAMA,GAAsB,CAAC,EAC1E,SAAS,iBAAiB,gCAAkCsB,GAAU,CACpEtB,GAAsBsB,EAAM,QAAU,QAAQ,CAChD,CAAC,ECvDM,IAAMC,GAAN,KAAkB,CACvB,YAAYC,EAAS,CAAC,EAAG,CACvB,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,WAAaA,EAAO,YAAc,YACvC,KAAK,QAAUA,EAAO,SAAW,iBACjC,KAAK,YAAcA,EAAO,aAAe,aACzC,KAAK,SAAWA,EAAO,WAAa,IAAM,CAAC,GAE3C,KAAK,UAAY,KAAK,UAAU,KAAK,IAAI,EACzC,KAAK,UAAY,GAEjB,SAAS,iBAAiB,SAAU,KAAK,SAAS,EAClD,KAAK,OAAO,CACd,CAEA,UAAUC,EAAG,CAEX,GAAI,MAAK,UAET,IAAIA,EAAE,OAAO,QAAQ,KAAK,gBAAgB,EAAG,CAC3C,KAAK,OAAO,EACZ,MACF,CACIA,EAAE,OAAO,IAAMA,EAAE,OAAO,KAAO,KAAK,aACtC,KAAK,gBAAgBA,EAAE,OAAO,OAAO,EAEzC,CAEA,gBAAgBC,EAAS,CAGvB,KAAK,UAAY,GACjB,IAAMC,EAAM,SAAS,iBAAiB,KAAK,gBAAgB,EAC3D,QAASC,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAC9BD,EAAIC,CAAC,EAAE,QAAUF,EAEnB,KAAK,UAAY,GACjB,KAAK,OAAO,CACd,CAEA,OAAQ,CACN,KAAK,UAAY,GACjB,IAAMC,EAAM,SAAS,iBAAiB,KAAK,gBAAgB,EAC3D,QAASC,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAC9BD,EAAIC,CAAC,EAAE,QAAU,GAEnB,IAAMC,EAAK,SAAS,eAAe,KAAK,WAAW,EAC/CA,IAAIA,EAAG,QAAU,IACrB,KAAK,UAAY,GACjB,KAAK,OAAO,CACd,CAEA,aAAc,CACZ,IAAMF,EAAM,SAAS,iBAAiB,KAAK,iBAAmB,UAAU,EACxE,MAAO,CACL,MAAOA,EAAI,OACX,IAAK,MAAM,KAAKA,CAAG,EAAE,IAAIG,GAAMA,EAAG,KAAK,EACvC,MAAO,SAAS,iBAAiB,KAAK,gBAAgB,EAAE,MAC1D,CACF,CAEA,QAAS,CACP,GAAM,CAAE,MAAAC,EAAO,IAAAC,EAAK,MAAAC,CAAM,EAAI,KAAK,YAAY,EAGzCC,EAAM,SAAS,eAAe,KAAK,UAAU,EAC/CA,GACFA,EAAI,UAAU,OAAO,SAAUH,IAAU,CAAC,EAI5C,IAAMI,EAAU,SAAS,eAAe,KAAK,OAAO,EAChDA,IAASA,EAAQ,YAAcJ,GAGnC,IAAMF,EAAK,SAAS,eAAe,KAAK,WAAW,EAC/CA,IACFA,EAAG,QAAUE,IAAUE,GAASA,EAAQ,EACxCJ,EAAG,cAAgBE,EAAQ,GAAKA,EAAQE,GAG1C,KAAK,SAASF,EAAOC,CAAG,CAC1B,CAEA,SAAU,CACR,SAAS,oBAAoB,SAAU,KAAK,SAAS,CACvD,CACF,EAEA,OAAO,YAAcT,ICxGpB,UAAY,CACX,aAEA,SAASa,EAAWC,EAAM,CACxB,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAcD,EACXC,EAAI,SACb,CAEA,SAASC,EAAUC,EAAW,CAC5B,IAAMC,EAAWD,EAAU,QAAQ,aAC7BE,EAAaD,EAAW,SAAS,eAAeA,CAAQ,EAAI,KAClE,GAAI,CAACC,EAAY,MAAO,CAAC,EAEzB,GAAI,CACF,OAAO,KAAK,MAAMA,EAAW,WAAW,GAAK,CAAC,CAChD,MAAQ,CACN,MAAO,CAAC,CACV,CACF,CAEA,SAASC,EAAcH,EAAW,CAChC,GAAIA,EAAU,QAAQ,YAAa,OACnCA,EAAU,QAAQ,YAAc,OAEhC,IAAMI,EAAcJ,EAAU,cAAc,mBAAmB,EACzDK,EAAgBL,EAAU,cAAc,uBAAuB,EAC/DM,EAAYN,EAAU,cAAc,wBAAwB,EAClE,GAAI,CAACI,GAAe,CAACC,GAAiB,CAACC,EAAW,OAElDF,EAAY,MAAQ,KAAK,UAAUL,EAAUC,CAAS,CAAC,EAEvD,SAASO,GAAU,CACjB,GAAI,CACF,OAAO,KAAK,MAAMH,EAAY,KAAK,GAAK,CAAC,CAC3C,MAAQ,CACN,MAAO,CAAC,CACV,CACF,CAEA,SAASI,EAAQC,EAAM,CACrBL,EAAY,MAAQ,KAAK,UAAUK,CAAI,EACvCC,EAAW,CACb,CAEA,SAASC,EAAOC,EAAK,CACnB,IAAMC,EAAaD,EAAI,KAAK,EAC5B,GAAI,CAACC,EAAY,OACjB,IAAMJ,EAAOF,EAAQ,EACfO,EAAMD,EAAW,YAAY,EAC/BJ,EAAK,KAAMM,GAAMA,EAAE,YAAY,IAAMD,CAAG,GAC5CN,EAAQ,CAAC,GAAGC,EAAMI,CAAU,CAAC,CAC/B,CAEA,SAASG,EAAUJ,EAAK,CACtBJ,EAAQD,EAAQ,EAAE,OAAQU,GAAYA,IAAYL,CAAG,CAAC,CACxD,CAEA,SAASF,GAAa,CACpB,IAAMD,EAAOF,EAAQ,EACrBF,EAAc,iBAAiB,YAAY,EAAE,QAASa,GAAOA,EAAG,OAAO,CAAC,EAExET,EAAK,QAASG,GAAQ,CACpB,IAAMO,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UACH,qEACFA,EAAK,QAAQ,IAAM,GACnBA,EAAK,UAAY;AAAA,gCACOvB,EAAWgB,CAAG,CAAC;AAAA;AAAA;AAAA,uCAGRhB,EAAWgB,CAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,UAM9CO,EAAK,cAAc,QAAQ,EAAE,iBAAiB,QAAS,IAAMH,EAAUJ,CAAG,CAAC,EAC3EP,EAAc,aAAac,EAAMb,CAAS,CAC5C,CAAC,EAEDA,EAAU,YAAcG,EAAK,OAAS,GAAK,qBAC7C,CAEAH,EAAU,iBAAiB,UAAYc,GAAU,CAC/C,GAAIA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,IACzCA,EAAM,eAAe,EACrBT,EAAOL,EAAU,KAAK,EACtBA,EAAU,MAAQ,WACTc,EAAM,MAAQ,aAAe,CAACd,EAAU,MAAO,CACxD,IAAMG,EAAOF,EAAQ,EACjBE,EAAK,QAAQO,EAAUP,EAAKA,EAAK,OAAS,CAAC,CAAC,CAClD,CACF,CAAC,EAEDH,EAAU,iBAAiB,OAAQ,IAAM,CAClCA,EAAU,MAAM,KAAK,IAC1BK,EAAOL,EAAU,KAAK,EACtBA,EAAU,MAAQ,GACpB,CAAC,EAEDA,EAAU,iBAAiB,QAAUc,GAAU,CAC7CA,EAAM,eAAe,EACrBA,EAAM,cACH,QAAQ,MAAM,EACd,MAAM,GAAG,EACT,QAASR,GAAQD,EAAOC,CAAG,CAAC,CACjC,CAAC,EAEDZ,EAAU,iBAAiB,cAAgBoB,GAAUJ,EAAUI,EAAM,MAAM,CAAC,CAC9E,CAEA,OAAO,cAAgB,OAAO,eAAiB,CAAC,EAChD,OAAO,cAAc,cAAgB,CAACC,EAAO,WAAa,CACxDA,EAAK,iBAAiB,mBAAmB,EAAE,QAAQlB,CAAa,CAClE,CACF,GAAG,GCpHF,UAAY,CACX,aAEA,SAASmB,EAAWC,EAAM,CACxB,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAcD,EACXC,EAAI,SACb,CAEA,SAASC,EAAgBC,EAAW,CAClC,GAAIA,EAAU,QAAQ,YAAa,OACnCA,EAAU,QAAQ,YAAc,OAEhC,IAAMC,EAAwBD,EAAU,cAAc,sBAAsB,EACtEE,EAAiBF,EAAU,cAAc,wBAAwB,EACjEG,EAAcH,EAAU,cAAc,qBAAqB,EAC3DI,EAAWJ,EAAU,cAAc,iBAAiB,EACpDK,EAAmBL,EAAU,cAAc,gBAAgB,EAC3DM,EAAeN,EAAU,cAAc,cAAc,EAC3D,GACE,CAACC,GACD,CAACC,GACD,CAACC,GACD,CAACC,GACD,CAACC,GACD,CAACC,EAED,OAGF,IAAMC,EACJN,EAAsB,cAAc,OAAO,GAAG,MAAQD,EAAU,QAAQ,UACpEQ,EAAa,MAAM,KAAKH,EAAiB,iBAAiB,eAAe,CAAC,EAAE,IAC/EI,IAAY,CACX,MAAOA,EAAO,QAAQ,MACtB,MAAOA,EAAO,QAAQ,KACxB,EACF,EAEA,SAASC,GAAoB,CAC3B,OAAO,MAAM,KAAKT,EAAsB,iBAAiB,OAAO,CAAC,EAAE,IAChEU,GAAUA,EAAM,KACnB,CACF,CAEA,SAASC,GAAoB,CAC3BT,EAAY,YAAcO,EAAkB,EAAE,OAAS,GAAK,eAC9D,CAEA,SAASG,EAAgBC,EAAO,CAChB,MAAM,KAAKb,EAAsB,iBAAiB,OAAO,CAAC,EAAE,KACvEc,GAAcA,EAAU,QAAUD,CACrC,GACO,OAAO,EAED,MAAM,KAAKZ,EAAe,iBAAiB,aAAa,CAAC,EAAE,KACrEa,GAAcA,EAAU,QAAQ,QAAUD,CAC7C,GACM,OAAO,EAEbE,EAAe,EACfJ,EAAkB,CACpB,CAEA,SAASK,EAAaH,EAAOI,EAAO,CAClC,GAAIR,EAAkB,EAAE,SAASI,CAAK,EAAG,OAEzC,IAAMH,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,SACbA,EAAM,KAAOJ,EACbI,EAAM,MAAQG,EACdb,EAAsB,YAAYU,CAAK,EAEvC,IAAMQ,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UAAY,qEACjBA,EAAK,QAAQ,KAAO,GACpBA,EAAK,QAAQ,MAAQL,EACrBK,EAAK,UAAY;AAAA,gBACPvB,EAAWsB,CAAK,CAAC;AAAA;AAAA;AAAA;AAAA,qCAIItB,EAAWsB,CAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,QAMhDC,EACG,cAAc,oBAAoB,EAClC,iBAAiB,QAAUC,GAAU,CACpCA,EAAM,gBAAgB,EACtBP,EAAgBC,CAAK,CACvB,CAAC,EACHZ,EAAe,aAAaiB,EAAMhB,CAAW,EAE7Ca,EAAe,EACfJ,EAAkB,CACpB,CAEA,SAASI,GAAiB,CACxB,IAAMK,EAAQlB,EAAY,MAAM,YAAY,EAAE,KAAK,EAC7CmB,EAAWZ,EAAkB,EAC7Ba,EAAWf,EAAW,OACzBgB,GACC,CAACF,EAAS,SAASE,EAAO,KAAK,IAC9B,CAACH,GAASG,EAAO,MAAM,YAAY,EAAE,SAASH,CAAK,EACxD,EAEAhB,EAAiB,UAAY,GAC7BkB,EAAS,QAASC,GAAW,CAC3B,IAAMf,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,4DACnBA,EAAO,QAAQ,OAAS,GACxBA,EAAO,QAAQ,MAAQe,EAAO,MAC9Bf,EAAO,QAAQ,MAAQe,EAAO,MAC9Bf,EAAO,SAAW,GAClBA,EAAO,YAAce,EAAO,MAC5Bf,EAAO,iBAAiB,QAAUW,GAAU,CAC1CA,EAAM,gBAAgB,EACtBH,EAAaO,EAAO,MAAOA,EAAO,KAAK,EACvCrB,EAAY,MAAQ,GACpBA,EAAY,MAAM,EAClBsB,EAAa,CACf,CAAC,EACDpB,EAAiB,YAAYI,CAAM,CACrC,CAAC,EAEDH,EAAa,UAAU,OAAO,SAAUiB,EAAS,OAAS,CAAC,CAC7D,CAEA,SAASE,GAAe,CACtBT,EAAe,EACfZ,EAAS,UAAU,OAAO,QAAQ,EAClCJ,EAAU,MAAM,SAAW,UAC7B,CAEA,SAAS0B,GAAe,CACtBtB,EAAS,UAAU,IAAI,QAAQ,CACjC,CAEAD,EAAY,iBAAiB,QAASsB,CAAY,EAClDtB,EAAY,iBAAiB,QAASa,CAAc,EAEpDd,EAAe,iBAAiB,QAAUkB,GAAU,CAC7CA,EAAM,OAAO,QAAQ,oBAAoB,GAAGK,EAAa,CAChE,CAAC,EAEDvB,EAAe,iBAAiB,oBAAoB,EAAE,QAASyB,GAAW,CACxEA,EAAO,iBAAiB,QAAUP,GAAU,CAC1CA,EAAM,gBAAgB,EACtB,IAAMD,EAAOQ,EAAO,QAAQ,aAAa,EACrCR,GAAMN,EAAgBM,EAAK,QAAQ,KAAK,CAC9C,CAAC,CACH,CAAC,EAEDhB,EAAY,iBAAiB,UAAYiB,GAAU,CACjD,GAAIA,EAAM,MAAQ,aAAe,CAACjB,EAAY,MAAO,CACnD,IAAMyB,EAAQ1B,EAAe,iBAAiB,aAAa,EACvD0B,EAAM,QAAQf,EAAgBe,EAAMA,EAAM,OAAS,CAAC,EAAE,QAAQ,KAAK,CACzE,MAAWR,EAAM,MAAQ,UACvBM,EAAa,EACbvB,EAAY,KAAK,GACRiB,EAAM,MAAQ,cACvBA,EAAM,eAAe,EACrBf,EAAiB,cAAc,eAAe,GAAG,MAAM,EAE3D,CAAC,EAED,SAAS,iBAAiB,QAAUe,GAAU,CACvCpB,EAAU,SAASoB,EAAM,MAAM,GAAGM,EAAa,CACtD,CAAC,EAEDrB,EAAiB,iBAAiB,UAAYe,GAAU,CACtD,IAAMS,EAAU,MAAM,KAAKxB,EAAiB,iBAAiB,eAAe,CAAC,EACvEyB,EAAQD,EAAQ,QAAQ,SAAS,aAAa,EAEhDT,EAAM,MAAQ,aAChBA,EAAM,eAAe,EACrBS,EAAQC,EAAQ,CAAC,GAAG,MAAM,GACjBV,EAAM,MAAQ,WACvBA,EAAM,eAAe,EACjBU,IAAU,EAAG3B,EAAY,MAAM,EAC9B0B,EAAQC,EAAQ,CAAC,GAAG,MAAM,GACtBV,EAAM,MAAQ,SACvBA,EAAM,eAAe,EACrB,SAAS,cAAc,MAAM,GACpBA,EAAM,MAAQ,WACvBM,EAAa,EACbvB,EAAY,MAAM,EAEtB,CAAC,CACH,CAEA,OAAO,cAAgB,OAAO,eAAiB,CAAC,EAChD,OAAO,cAAc,gBAAkB,CAAC4B,EAAO,WAAa,CAC1DA,EAAK,iBAAiB,qBAAqB,EAAE,QAAQhC,CAAe,CACtE,CACF,GAAG,GCtMF,UAAY,CACX,aAEA,OAAO,cAAgB,OAAO,eAAiB,CAAC,EAChD,OAAO,cAAc,KAAO,CAACiC,EAAO,WAAa,CAC/C,OAAO,cAAc,gBAAgBA,CAAI,EACzC,OAAO,cAAc,kBAAkBA,CAAI,CAC7C,EAEA,SAAS,iBAAiB,mBAAoB,IAAM,CAClD,OAAO,cAAc,KAAK,CAC5B,CAAC,EAED,SAAS,iBAAiB,gCAAkCC,GAAU,CACpE,OAAO,cAAc,KAAKA,EAAM,QAAU,QAAQ,CACpD,CAAC,CACH,GAAG,GChBF,IAAM,CACL,IAAMC,EAAS,IAAI,QAEbC,EAAcC,GAAY,CAC9B,IAAMC,EAAUD,EAAQ,cAAc,kBAAkB,EACxD,OAAOA,EAAQ,aAAa,eAAe,IAAM,QAC5CA,EAAQ,QAAQ,WAAa,QAC7BC,GAAS,aAAa,eAAe,IAAM,MAClD,EAEMC,EAAcC,GAASA,EAAK,aAAa,eAAe,EAExDC,EAAgB,CAACD,EAAME,IAAkB,CACzCH,EAAWC,CAAI,GAAK,CAACE,EAAc,MACvCF,EAAK,iBAAiB,wBAAwB,EAAE,QAASH,GAAY,CAC/DA,IAAYK,IAAeL,EAAQ,KAAO,GAChD,CAAC,CACH,EAEMM,EAAiBH,GAAS,CAC9B,GAAIA,EAAK,QAAQ,qBAAsB,OAEvC,IAAMI,EAAeC,GAAU,CAE7B,IAAMR,EADUQ,EAAM,OAAO,QAAQ,SAAS,GACrB,QAAQ,SAAS,EACtC,CAACR,GAAWA,EAAQ,gBAAkBG,GAAQ,CAACJ,EAAWC,CAAO,GACrEQ,EAAM,eAAe,CACvB,EAEMC,EAAiBD,GAAU,CAC/B,GAAIA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,IAAK,OAEhD,IAAMR,EADUQ,EAAM,OAAO,QAAQ,SAAS,GACrB,QAAQ,SAAS,EACtC,CAACR,GAAWA,EAAQ,gBAAkBG,GAAQ,CAACJ,EAAWC,CAAO,GACrEQ,EAAM,eAAe,CACvB,EAEME,EAAgBF,GAAU,CAC9B,IAAMR,EAAUQ,EAAM,OACtB,GAAIR,EAAQ,gBAAkBG,EAC9B,IAAIJ,EAAWC,CAAO,EAAG,CACvBA,EAAQ,KAAO,GACf,MACF,CACAI,EAAcD,EAAMH,CAAO,EAC7B,EAEAG,EAAK,iBAAiB,QAASI,CAAW,EAC1CJ,EAAK,iBAAiB,UAAWM,CAAa,EAC9CN,EAAK,iBAAiB,SAAUO,EAAc,EAAI,EAClDP,EAAK,iBAAiB,wBAAwB,EAAE,QAASH,GAAYI,EAAcD,EAAMH,CAAO,CAAC,EAEjGF,EAAO,IAAIK,EAAM,CAAE,YAAAI,EAAa,aAAAG,CAAa,CAAC,EAC9CP,EAAK,SAAW,IAAM,CACpBA,EAAK,oBAAoB,QAASI,CAAW,EAC7CJ,EAAK,oBAAoB,UAAWM,CAAa,EACjDN,EAAK,oBAAoB,SAAUO,EAAc,EAAI,EACrDZ,EAAO,OAAOK,CAAI,CACpB,EAEAA,EAAK,QAAQ,qBAAuB,OACpCA,EAAK,cAAc,IAAI,YAAY,sBAAsB,CAAC,CAC5D,EAEI,OAAO,UACT,OAAO,SAAS,SAAS,YAAa,+CAAgDG,CAAa,CAEvG,GAAG,ECnEH,IAAMK,GAAG,CAAC,EAAEA,GAAG,IAAI,SAAS,EAAE,CAAC,OAAO,eAAe,EAAE,OAAO,YAAY,CAAC,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAEC,EAAE,SAASC,EAAEC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG,SAAS,IAAI,WAAW,GAAG,YAAY,GAAG,qBAAqB,QAAQ,eAAe,GAAG,aAAa,GAAG,yBAAyB,GAAG,aAAa,GAAG,aAAa,GAAG,YAAY,EAAE,cAAc,GAAG,YAAY,CAAC,OAAO,WAAW,OAAO,EAAE,eAAe,CAAC,EAAE,aAAa,OAAO,GAAGA,CAAC,CAAC,CAAC,SAAS,EAAEA,EAAE,CAAC,OAAOA,EAAE,EAAEA,CAAC,EAAE,CAAC,CAAC,SAASC,EAAED,EAAE,CAACF,EAAEE,CAAC,CAAC,SAASE,GAAG,CAAC,OAAOJ,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAEE,EAAEG,EAAE,CAAC,EAAEH,CAAC,EAAEG,CAAC,CAAC,SAAS,EAAEH,EAAE,CAAC,EAAEA,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAASI,EAAEJ,EAAE,CAAC,IAAIG,EAAE,OAAO,iBAAiBH,CAAC,EAAE,MAAM,CAACG,EAAE,SAASA,EAAE,UAAUA,EAAE,SAAS,EAAE,KAAKH,GAAGA,IAAI,QAAQA,IAAI,QAAQ,CAAC,CAAC,SAAS,EAAEA,EAAEG,EAAEL,EAAEC,EAAE,CAAC,OAAOC,GAAGD,EAAE,GAAG,EAAED,EAAE,EAAEE,EAAEA,EAAEG,EAAE,CAACL,EAAE,GAAG,EAAEE,GAAGA,EAAE,GAAG,GAAGG,CAAC,CAAC,SAASE,EAAEL,EAAE,CAAC,IAAIG,EAAE,qNAAqN,OAAOH,EAAE,QAAQA,GAAG,CAAC,IAAIF,EAAEE,EAAE,QAAQG,CAAC,EAAEJ,EAAE,MAAM,KAAKC,EAAE,iBAAiBG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAGL,EAAE,CAACE,CAAC,EAAE,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAC,EAAE,OAAOC,GAAG,iBAAiBA,CAAC,EAAE,gBAAgB,QAAQM,EAAEN,CAAC,CAAC,CAAC,CAAC,SAASO,EAAEP,EAAE,CAAC,GAAG,CAACA,GAAGQ,EAAER,CAAC,EAAE,OAAO,IAAIG,EAAE,EAAE,cAAc,EAAEL,EAAEE,EAAE,aAAa,OAAO,YAAYA,EAAE,eAAe,CAAC,SAAS,CAACG,GAAGM,EAAET,CAAC,EAAE,OAAO,SAAS,OAAO,SAAS,MAAMF,EAAE,QAAQ,QAAQ,CAAC,CAAC,CAAC,SAASW,EAAET,EAAE,CAAC,GAAG,CAACA,GAAG,CAACA,EAAE,cAAc,OAAO,IAAIG,EAAEH,EAAE,cAAc,OAAOG,EAAE,aAAaA,EAAE,YAAY,CAAC,SAASK,EAAER,EAAE,CAAC,IAAIG,EAAEH,EAAE,sBAAsB,EAAE,OAAOG,EAAE,KAAK,GAAGA,EAAE,MAAM,GAAGA,EAAE,SAAS,OAAO,aAAa,SAAS,gBAAgB,eAAeA,EAAE,QAAQ,OAAO,YAAY,SAAS,gBAAgB,YAAY,CAAC,SAASG,EAAEN,EAAE,CAAC,MAAM,CAAC,EAAEA,EAAE,aAAaA,EAAE,cAAcA,EAAE,eAAe,EAAE,OAAO,CAAC,IAAIU,EAAE,CAAC,EAAE,SAASC,EAAEX,EAAEG,EAAE,CAACO,EAAEV,CAAC,EAAEG,CAAC,CAAC,SAAS,EAAEH,EAAE,CAAC,OAAOA,EAAEU,EAAEV,CAAC,EAAEU,CAAC,CAAC,SAASE,GAAG,CAACF,EAAE,CAAC,CAAC,CAAC,SAASG,EAAEb,EAAEG,EAAEL,EAAEC,EAAE,CAAC,IAAIe,EAAE,EAAE,uBAAuB,EAAEb,EAAEa,GAAGhB,EAAE,sBAAsB,EAAEI,EAAEH,EAAE,sBAAsB,EAAEe,EAAE,CAAC,EAAE,EAAEd,EAAEC,EAAE,EAAEC,EAAE,EAAED,EAAE,EAAEE,CAAC,EAAE,EAAE,EAAEH,EAAEC,EAAE,EAAEC,EAAE,EAAED,EAAE,EAAEE,CAAC,EAAE,MAAM,EAAEH,EAAEC,EAAE,MAAMC,EAAE,MAAMD,EAAE,MAAME,CAAC,EAAE,OAAO,EAAEH,EAAEC,EAAE,OAAOC,EAAE,OAAOD,EAAE,OAAOE,CAAC,CAAC,EAAEY,EAAED,CAAC,EAAEH,EAAE,wBAAwBG,CAAC,CAAC,CAAC,SAASE,EAAEhB,EAAE,CAAC,GAAG,CAACA,EAAE,OAAO,IAAIG,EAAEH,EAAE,sBAAsB,EAAEF,EAAE,CAAC,EAAEK,EAAE,EAAE,EAAEA,EAAE,EAAE,MAAMA,EAAE,MAAM,OAAOA,EAAE,MAAM,EAAEQ,EAAE,wBAAwBb,CAAC,EAAEiB,EAAEjB,CAAC,CAAC,CAAC,SAASmB,GAAG,CAAC,IAAIjB,EAAE,EAAE,uBAAuB,EAAEG,EAAE,EAAE,cAAc,EAAE,GAAG,CAACH,EAAE,OAAO,GAAG,CAACG,EAAE,CAAC,QAAQ,KAAK,qBAAqB,EAAE,MAAM,CAAC,IAAIL,EAAE,OAAO,WAAWC,EAAE,OAAO,YAAYI,EAAE,aAAa,UAAU,OAAOL,CAAC,IAAIC,CAAC,EAAE,CAAC,CAAC,SAASmB,EAAElB,EAAE,CAAC,IAAIG,EAAEgB,EAAEnB,CAAC,EAAE,SAAS,KAAK,YAAYG,CAAC,EAAEiB,GAAEjB,EAAEH,GAAG,CAACA,EAAE,OAAO,UAAU,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAEW,EAAE,eAAeR,CAAC,CAAC,CAAC,SAASY,EAAEf,EAAE,CAAC,IAAIG,EAAE,EAAE,cAAc,EAAE,GAAG,CAACA,EAAE,CAACe,EAAElB,CAAC,EAAE,MAAM,CAAC,IAAIF,EAAEK,EAAE,kBAAkB,GAAGL,GAAG,UAAU,OAAO,MAAM,MAAM,oCAAoC,EAAEA,EAAE,aAAa,IAAIuB,EAAErB,CAAC,CAAC,CAAC,CAAC,SAASmB,EAAEnB,EAAE,CAAC,IAAIG,EAAE,OAAO,WAAWL,EAAE,OAAO,YAAYC,EAAE,SAAS,gBAAgB,6BAA6B,KAAK,EAAEA,EAAE,UAAU,IAAI,iBAAiB,yBAAyB,EAAEA,EAAE,aAAa,UAAU,OAAOI,CAAC,IAAIL,CAAC,EAAE,EAAEC,EAAE,aAAa,WAAW,UAAU,EAAEA,EAAE,aAAa,aAAa,8BAA8B,EAAEA,EAAE,aAAa,UAAU,KAAK,EAAEA,EAAE,aAAa,sBAAsB,gBAAgB,EAAEA,EAAE,MAAM,SAAS,UAAUA,EAAE,MAAM,SAAS,UAAUA,EAAE,MAAM,eAAe,QAAQA,EAAE,MAAM,iBAAiB,IAAIA,EAAE,MAAM,OAAO,QAAQA,EAAE,MAAM,SAAS,QAAQA,EAAE,MAAM,IAAI,IAAIA,EAAE,MAAM,KAAK,IAAIA,EAAE,MAAM,MAAM,OAAOA,EAAE,MAAM,OAAO,OAAO,IAAIE,EAAE,SAAS,gBAAgB,6BAA6B,MAAM,EAAE,OAAOA,EAAE,aAAa,IAAIoB,EAAErB,CAAC,CAAC,EAAEC,EAAE,MAAM,KAAK,EAAE,cAAc,GAAG,aAAaA,EAAE,MAAM,QAAQ,GAAG,EAAE,gBAAgB,CAAC,GAAGA,EAAE,MAAM,cAAc,OAAOA,EAAE,MAAM,OAAO,OAAOF,EAAE,YAAYE,CAAC,EAAEF,CAAC,CAAC,SAASsB,EAAErB,EAAE,CAAC,IAAIG,EAAE,OAAO,WAAWL,EAAE,OAAO,YAAYC,EAAE,EAAE,cAAc,GAAG,EAAEE,EAAE,EAAE,aAAa,GAAG,EAAEC,EAAEF,EAAE,MAAMD,EAAE,EAAEuB,EAAEtB,EAAE,OAAOD,EAAE,EAAEwB,EAAE,KAAK,IAAItB,EAAEC,EAAE,EAAEoB,EAAE,CAAC,EAAEE,EAAE,KAAK,MAAM,KAAK,IAAID,EAAE,CAAC,CAAC,EAAEE,EAAEzB,EAAE,EAAED,EAAEyB,EAAEpB,EAAEJ,EAAE,EAAED,EAAE2B,GAAExB,EAAEsB,EAAE,EAAEnB,EAAEiB,EAAEE,EAAE,EAAE,MAAM,IAAIrB,CAAC,YAAYL,CAAC,IAAIK,CAAC,IAAIL,CAAC,IAAIK,CAAC;AAAA,OACzzHsB,CAAC,IAAIrB,CAAC,KAAKsB,EAAC,KAAKF,CAAC,IAAIA,CAAC,UAAUA,CAAC,IAAIA,CAAC,KAAKnB,CAAC,KAAKmB,CAAC,IAAIA,CAAC,WAAWA,CAAC,IAAIA,CAAC,MAAME,EAAC,KAAKF,CAAC,IAAIA,CAAC,WAAWA,CAAC,KAAKA,CAAC,MAAMnB,CAAC,KAAKmB,CAAC,IAAIA,CAAC,UAAUA,CAAC,KAAKA,CAAC,IAAI,CAAC,SAASG,GAAG,CAAC,IAAI3B,EAAE,EAAE,cAAc,EAAEA,IAAI4B,GAAE5B,CAAC,EAAEA,EAAE,OAAO,EAAE,CAAC,SAAS6B,GAAG,CAAC,IAAI7B,EAAE,EAAE,SAAS,EAAE,GAAG,CAACA,GAAG,QAAQ,OAAO,IAAIG,EAAEH,EAAE,QAAQ,sBAAsB,EAAEF,EAAE,EAAE,cAAc,GAAG,EAAEC,EAAE,EAAE,eAAe,GAAG,EAAE,MAAM,CAAC,MAAMI,EAAE,MAAML,EAAEC,EAAE,OAAOI,EAAE,OAAOL,EAAEC,EAAE,UAAUI,EAAE,MAAM,WAAWA,EAAE,MAAM,CAAC,CAAC,SAAS2B,EAAE9B,EAAEG,EAAE,CAAC,GAAG,CAAC,kBAAkBL,EAAE,kBAAkBC,EAAE,eAAee,EAAE,uBAAuBb,CAAC,EAAEE,EAAE,OAAOH,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAIF,EAAE,IAAIgB,EAAE,OAAO,YAAYf,EAAE,WAAWE,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAED,IAAI,MAAM,KAAK,IAAI,KAAK,IAAIF,EAAE,IAAIC,GAAG,WAAWD,EAAE,OAAOgB,EAAE,OAAO,YAAYf,GAAG,WAAWE,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAED,IAAI,SAAS,KAAK,IAAI,KAAK,IAAIF,EAAE,IAAIA,EAAE,OAAO,EAAEC,GAAG,WAAW,EAAE,OAAO,YAAYA,GAAG,WAAWE,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS8B,EAAE/B,EAAEG,EAAE,CAAC,GAAG,CAAC,kBAAkBL,EAAE,kBAAkBC,EAAE,eAAee,EAAE,uBAAuBb,CAAC,EAAEE,EAAE,OAAOH,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAIF,EAAE,KAAKgB,EAAE,OAAO,WAAWf,EAAE,UAAUE,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAED,IAAI,MAAM,KAAK,IAAI,KAAK,IAAIF,EAAE,KAAKC,GAAG,UAAUD,EAAE,MAAMgB,EAAE,OAAO,WAAWf,GAAG,UAAUE,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAED,IAAI,SAAS,KAAK,IAAI,KAAK,IAAIF,EAAE,KAAKA,EAAE,MAAM,EAAEC,GAAG,UAAU,EAAE,OAAO,WAAWA,GAAG,UAAUE,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS+B,EAAEhC,EAAEG,EAAE,CAAC,IAAIL,EAAE,EAAE,SAAS,EAAE,GAAG,CAACA,EAAE,OAAO,GAAG,CAAC,MAAMC,EAAE,QAAQ,KAAKE,EAAE,QAAQ,EAAEE,GAAG,SAAS,CAAC,EAAED,EAAEH,EAAEuB,EAAEtB,EAAE,KAAK,uBAAuB,OAAOC,EAAEsB,EAAE,EAAE,cAAc,GAAG,EAAEC,EAAEK,EAAE,EAAEJ,EAAE3B,EAAE,MAAM,sBAAsB,EAAEM,EAAEJ,EAAE,sBAAsB,EAAE0B,GAAEtB,EAAE,IAAIoB,EAAE,OAAOnB,EAAEqB,IAAG,EAAEnB,EAAE,OAAO,aAAaH,EAAE,OAAOoB,EAAE,QAAQf,EAAEF,GAAG,EAAEC,GAAEJ,EAAE,KAAKoB,EAAE,MAAMlB,GAAEE,IAAG,EAAEE,EAAE,OAAO,YAAYN,EAAE,MAAMoB,EAAE,OAAOb,EAAED,GAAG,EAAEE,GAAE,CAACP,GAAG,CAACI,GAAG,CAACH,IAAG,CAACK,EAAEE,GAAES,EAAE,GAAGA,IAAI,OAAOjB,EAAEM,EAAEL,GAAEG,EAAE,GAAGa,IAAI,UAAUb,EAAEE,EAAEL,GAAED,EAAE,GAAGiB,IAAI,QAAQhB,GAAEK,EAAEN,EAAEI,EAAE,GAAGa,IAAI,SAASX,IAAIL,GAAED,EAAEI,EAAE,IAAIa,IAAI,OAAO,CAAC,IAAItB,GAAE,OAAO,WAAW,EAAEwB,EAAE,UAAU,EAAErB,GAAE,OAAO,YAAY,EAAEqB,EAAE,WAAW,EAAE1B,EAAE,QAAQ,MAAM,KAAK,GAAGE,EAAC,KAAKF,EAAE,QAAQ,MAAM,MAAM,OAAOA,EAAE,QAAQ,MAAM,IAAI,GAAGK,EAAC,KAAKL,EAAE,QAAQ,MAAM,OAAO,MAAM,SAASc,GAAE,CAAC,IAAIZ,GAAE,OAAO,WAAW,EAAEwB,GAAG,UAAU,EAAE1B,EAAE,QAAQ,MAAM,KAAK,GAAGE,EAAC,KAAKF,EAAE,QAAQ,MAAM,MAAM,OAAOA,EAAE,QAAQ,MAAM,OAAO,OAAOA,EAAE,QAAQ,MAAM,IAAI,MAAM,SAASQ,GAAE,CAAC,IAAIN,GAAE,KAAK,IAAIQ,GAAE,OAAO,WAAWgB,GAAG,UAAUC,EAAE,KAAK,EAAEtB,GAAE2B,EAAE5B,EAAE,CAAC,kBAAkBE,EAAE,kBAAkBoB,EAAE,eAAeD,EAAE,uBAAuBE,CAAC,CAAC,EAAE3B,EAAE,QAAQ,MAAM,KAAK,GAAGE,EAAC,KAAKF,EAAE,QAAQ,MAAM,IAAI,GAAGK,EAAC,KAAKL,EAAE,QAAQ,MAAM,OAAO,OAAOA,EAAE,QAAQ,MAAM,MAAM,OAAOe,GAAE,MAAM,SAASF,EAAE,CAAC,IAAIX,GAAE,KAAK,IAAIU,EAAE,OAAO,WAAWc,GAAG,UAAUC,EAAE,KAAK,EAAEtB,GAAE2B,EAAE5B,EAAE,CAAC,kBAAkBE,EAAE,kBAAkBoB,EAAE,eAAeD,EAAE,uBAAuBE,CAAC,CAAC,EAAE3B,EAAE,QAAQ,MAAM,MAAM,GAAGE,EAAC,KAAKF,EAAE,QAAQ,MAAM,IAAI,GAAGK,EAAC,KAAKL,EAAE,QAAQ,MAAM,OAAO,OAAOA,EAAE,QAAQ,MAAM,KAAK,OAAOe,GAAE,OAAO,SAASR,EAAE,CAAC,IAAIL,GAAE,KAAK,IAAI0B,GAAE,OAAO,YAAYF,EAAE,WAAWC,EAAE,KAAK,EAAEtB,GAAE4B,EAAE7B,EAAE,CAAC,kBAAkBE,EAAE,kBAAkBoB,EAAE,eAAeD,EAAE,uBAAuBE,CAAC,CAAC,EAAE3B,EAAE,QAAQ,MAAM,IAAI,GAAGE,EAAC,KAAKF,EAAE,QAAQ,MAAM,KAAK,GAAGK,EAAC,KAAKL,EAAE,QAAQ,MAAM,OAAO,OAAOA,EAAE,QAAQ,MAAM,MAAM,OAAOe,GAAE,KAAK,SAASJ,EAAE,CAAC,IAAIT,GAAE,KAAK,IAAIO,EAAE,OAAO,YAAYiB,GAAG,WAAWC,EAAE,KAAK,EAAEtB,GAAE4B,EAAE7B,EAAE,CAAC,kBAAkBE,EAAE,kBAAkBoB,EAAE,eAAeD,EAAE,uBAAuBE,CAAC,CAAC,EAAE3B,EAAE,QAAQ,MAAM,KAAK,GAAGK,EAAC,KAAKL,EAAE,QAAQ,MAAM,OAAO,GAAGE,EAAC,KAAKF,EAAE,QAAQ,MAAM,IAAI,OAAOA,EAAE,QAAQ,MAAM,MAAM,OAAOe,GAAE,QAAQ,CAACoB,GAAErB,GAAE,OAAOC,GAAEX,EAAEF,CAAC,EAAE,CAAC,GAAGF,EAAE,QAAQ,SAAS,EAAE,OAAOE,IAAGA,GAAE,WAAW,sBAAsB,GAAGA,GAAE,WAAW,uBAAuB,CAAC,EAAE,QAAQA,IAAGF,EAAE,QAAQ,UAAU,OAAOE,EAAC,CAAC,EAAEF,EAAE,QAAQ,UAAU,IAAI,uBAAuBe,EAAC,EAAE,EAAEf,EAAE,QAAQ,UAAU,IAAI,wBAAwBI,CAAC,EAAE,CAAC,CAAC,IAAIgC,EAAE,GAAGC,EAAE,GAAG,SAASC,GAAEpC,EAAEG,EAAEL,EAAEC,EAAEe,EAAE,CAAC,IAAIb,EAAEF,EAAED,EAAE,OAAOE,GAAGF,GAAGK,GAAGJ,EAAEe,IAAI,QAAQ,GAAGA,IAAI,MAAMb,EAAEkC,EAAED,EAAE,EAAEjC,EAAE,GAAG,KAAK,IAAI,KAAK,IAAID,EAAEF,CAAC,EAAEC,CAAC,EAAE,KAAK,IAAI,KAAK,IAAII,EAAEL,CAAC,EAAEC,CAAC,GAAG,EAAED,CAAC,CAAC,SAASuC,GAAErC,EAAEG,EAAE,CAAC,IAAIL,EAAEqC,EAAEpC,EAAEI,EAAEgC,EAAED,EAAE,GAAGnC,EAAED,EAAE,OAAO,KAAK,IAAI,GAAGK,EAAE+B,GAAG,CAAC,EAAE,IAAIpB,EAAEd,EAAEkC,EAAE,EAAE,OAAO,KAAK,IAAI,KAAK,IAAIpB,EAAEhB,CAAC,EAAEC,CAAC,CAAC,CAAC,SAASuC,GAAEtC,EAAEG,EAAEL,EAAE,CAAC,OAAOE,IAAI,QAAQA,IAAI,QAAQG,EAAE,OAAOL,EAAE,KAAKK,EAAE,IAAIL,EAAE,OAAOE,EAAEG,EAAE,QAAQL,EAAE,IAAI,SAAS,MAAMK,EAAE,MAAML,EAAE,MAAMK,EAAE,KAAKL,EAAE,MAAME,EAAEG,EAAE,OAAOL,EAAE,KAAK,QAAQ,MAAM,CAAC,SAASmC,GAAEjC,EAAEG,EAAEL,EAAE,CAAC,IAAIC,EAAE,EAAE,SAAS,EAAE,GAAG,CAACA,EAAE,OAAO,IAAIe,EAAEf,EAAE,MAAM,GAAGe,EAAE,UAAU,uBAAuBA,EAAE,MAAM,IAAI,GAAGA,EAAE,MAAM,MAAM,GAAGA,EAAE,MAAM,OAAO,GAAGA,EAAE,MAAM,KAAK,GAAGd,IAAI,OAAO,CAACc,EAAE,UAAU,IAAI,2BAA2B,EAAE,MAAM,CAAC,IAAIb,EAAEH,EAAE,sBAAsB,EAAEI,EAAEH,EAAE,QAAQ,sBAAsB,EAAEuB,EAAEgB,GAAEtC,EAAEC,EAAEC,CAAC,EAAE,GAAGY,EAAE,UAAU,IAAI,6BAA6BQ,CAAC,EAAE,EAAEA,IAAI,QAAQA,IAAI,QAAQ,CAAC,IAAItB,EAAEoC,GAAEnC,EAAE,IAAIA,EAAE,OAAOC,EAAE,IAAIA,EAAE,OAAOC,CAAC,EAAEW,EAAE,MAAM,IAAI,GAAGuB,GAAErC,EAAEE,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,IAAIF,EAAEoC,GAAEnC,EAAE,KAAKA,EAAE,MAAMC,EAAE,KAAKA,EAAE,MAAMC,CAAC,EAAEW,EAAE,MAAM,KAAK,GAAGuB,GAAErC,EAAEE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,SAASqC,IAAG,CAAC,IAAIvC,EAAE,SAAS,eAAe,sBAAsB,EAAE,GAAGA,EAAE,OAAOA,EAAE,IAAIG,EAAE,SAAS,cAAc,KAAK,EAAE,OAAOA,EAAE,GAAG,uBAAuBA,EAAE,MAAM,MAAM,IAAIA,EAAE,MAAM,OAAO,IAAIA,EAAE,MAAM,cAAc,OAAOA,EAAE,MAAM,QAAQ,IAAIA,EAAE,MAAM,SAAS,QAAQA,EAAE,MAAM,IAAI,MAAMA,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,YAAYA,CAAC,EAAEA,CAAC,CAAC,SAASqC,GAAExC,EAAE,CAAC,GAAG,CAAC,QAAQG,CAAC,EAAEH,EAAEF,EAAE,OAAOK,GAAG,WAAWA,EAAE,EAAE,OAAOA,GAAG,SAAS,SAAS,cAAcA,CAAC,EAAEA,EAAEL,IAAIA,EAAEyC,GAAE,GAAGE,GAAE3C,EAAEE,CAAC,CAAC,CAAC,SAAS0C,IAAG,CAAC,IAAI1C,EAAE,EAAE,iBAAiB,EAAEG,EAAE,EAAE,cAAc,EAAEH,IAAIgB,EAAEhB,CAAC,EAAEiB,EAAE,EAAEe,EAAEhC,EAAEG,CAAC,EAAE,CAAC,SAASsC,GAAEzC,EAAEG,EAAE,CAAC,IAAIL,EAAE,EAAE,UAAU,GAAG,IAAIC,EAAE,KAAK,IAAI,EAAEE,EAAE,EAAE,cAAc,EAAEqB,EAAE,EAAE,iBAAiB,GAAGtB,EAAEuB,EAAE,CAACD,GAAGA,IAAItB,EAAEwB,EAAExB,EAAE,KAAK,uBAAuByB,EAAEH,EAAE,KAAK,uBAAuBI,EAAE,EAAE,SAAS,EAAErB,EAAEF,EAAE,oBAAoB,EAAE,oBAAoB,EAAEM,GAAEN,GAAG,eAAe,EAAE,eAAe,EAAEK,EAAEP,GAAG,cAAc,EAAE,cAAc,EAAEK,EAAE,EAAE,EAAEI,EAAE,EAAE,EAAE,CAACa,GAAGf,GAAGA,EAAEiB,EAAE,OAAOH,EAAErB,EAAE,CAAC,OAAOK,EAAE,MAAMI,EAAE,OAAOR,EAAE,CAAC,CAAC,EAAEG,GAAGA,EAAEmB,EAAE,OAAOxB,EAAEG,EAAE,CAAC,OAAOG,EAAE,MAAMI,EAAE,OAAOR,EAAE,CAAC,CAAC,EAAE,IAAIU,GAAE,CAACW,GAAGG,EAAET,GAAE,GAAG0B,GAAG,EAAEhC,EAAE,eAAeV,CAAC,EAAEU,EAAE,kBAAkBW,CAAC,EAAEX,EAAE,aAAaR,CAAC,EAAEQ,EAAE,gBAAgBX,CAAC,EAAE,IAAIkB,EAAE,IAAI,CAAC,GAAG,EAAE,sBAAsB,IAAIA,EAAE,OAAO,IAAIK,GAAE,KAAK,IAAI,EAAExB,EAAE0B,GAAE3B,EAAEyB,IAAGzB,EAAE,EAAEK,EAAE,SAASsB,IAAG,CAACR,IAAGL,KAAIgC,GAAE5C,EAAEG,CAAC,EAAEc,GAAE,IAAI,EAAE,SAAS,GAAGM,GAAEzB,EAAEe,EAAEU,GAAEzB,EAAEwB,EAAEtB,CAAC,GAAGgB,EAAEhB,CAAC,EAAES,IAAGA,GAAEe,EAAE,OAAOxB,EAAEG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAES,EAAE,uBAAuB,MAAM,EAAEA,EAAE,iBAAiBV,CAAC,EAAEU,EAAE,oBAAoBW,CAAC,EAAEX,EAAE,eAAeR,CAAC,EAAEQ,EAAE,kBAAkBX,CAAC,GAAG,OAAO,sBAAsBkB,CAAC,CAAC,EAAEP,EAAE,uBAAuBO,CAAC,EAAE,OAAO,sBAAsBA,CAAC,EAAEX,EAAEP,CAAC,EAAE,CAACY,IAAGT,EAAE,SAASyC,GAAE5C,EAAEG,CAAC,EAAE,SAAS,iBAAiB,+BAA+B,EAAE,QAAQH,IAAG,CAACA,GAAE,UAAU,OAAO,+BAA+B,wCAAwC,CAAC,CAAC,EAAEsB,EAAE,UAAU,OAAO,wBAAwB,uBAAuB,EAAEA,EAAE,gBAAgB,eAAe,EAAEA,EAAE,gBAAgB,eAAe,EAAEA,EAAE,gBAAgB,eAAe,GAAGnB,EAAE,0BAA0B,EAAE,0BAA0B,IAAIH,EAAE,UAAU,IAAI,uBAAuB,EAAE,IAAIe,EAAEf,EAAE,cAAce,GAAGA,IAAI,SAAS,OAAOA,EAAE,UAAU,IAAI,8BAA8B,EAAEX,EAAEW,CAAC,GAAGA,EAAE,UAAU,IAAI,wCAAwC,GAAGf,EAAE,UAAU,IAAI,uBAAuB,EAAEA,EAAE,aAAa,gBAAgB,QAAQ,EAAEA,EAAE,aAAa,gBAAgB,MAAM,EAAEA,EAAE,aAAa,gBAAgB,wBAAwB,CAAC,CAAC,SAAS6C,IAAG,CAAC,SAAS,eAAe,sBAAsB,GAAG,OAAO,EAAE,SAAS,iBAAiB,wBAAwB,EAAE,QAAQ7C,GAAG,CAAC,IAAIG,EAAEH,EAAE,cAAcG,GAAGA,IAAI,SAAS,MAAMA,EAAE,UAAU,OAAO,+BAA+B,wCAAwC,EAAEH,EAAE,UAAU,OAAO,wBAAwB,uBAAuB,EAAEA,EAAE,gBAAgB,eAAe,EAAEA,EAAE,gBAAgB,eAAe,EAAEA,EAAE,gBAAgB,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS8C,IAAG,CAAC,IAAI9C,EAAE,EAAE,iBAAiB,EAAEA,GAAG,OAAO,qBAAqBA,CAAC,EAAEW,EAAE,kBAAkB,OAAO,sBAAsB+B,EAAC,CAAC,CAAC,CAAC,SAASK,GAAE/C,EAAE,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,EAAEA,EAAE,MAAM,OAAOA,EAAE,UAAU,GAAG,OAAO,IAAIG,EAAE,EAAE,iBAAiB,EAAEL,EAAE,EAAE,SAAS,GAAG,QAAQC,EAAEM,EAAE,CAAC,GAAGP,EAAE,CAACA,CAAC,EAAE,CAAC,EAAE,GAAGK,EAAE,CAACA,CAAC,EAAE,CAAC,CAAC,CAAC,EAAEW,EAAEf,EAAE,CAAC,EAAEE,EAAEF,EAAEA,EAAE,OAAO,CAAC,EAAEC,EAAE,eAAe,EAAEA,EAAE,UAAUD,EAAEA,EAAE,QAAQ,SAAS,aAAa,EAAE,CAAC,GAAGE,IAAI,MAAM,GAAGF,EAAEA,EAAE,QAAQ,SAAS,aAAa,EAAE,CAAC,GAAGe,IAAI,MAAM,CAAC,CAAC,SAASkC,GAAEhD,EAAE,EAAE,EAAE,sBAAsB,GAAG,MAAMA,EAAE,MAAM,SAAS,EAAE,aAAa,EAAEA,EAAE,MAAM,aAAa,EAAE,iBAAiB,EAAEA,EAAE,MAAM,aAAa,EAAE,gBAAgB,EAAE,CAAC,IAAIiD,GAAE,CAAC,cAAc,YAAY,YAAY,UAAU,OAAO,EAAEC,GAAE,IAAI,QAAQ,SAAS9B,GAAEpB,EAAEG,EAAEL,EAAE,CAAC8B,GAAE5B,CAAC,EAAE,IAAID,EAAEA,GAAG,CAAC,IAAIe,EAAEf,EAAE,OAAOC,EAAE,SAASc,CAAC,KAAK,CAAChB,GAAGA,EAAEgB,CAAC,KAAKf,EAAE,eAAe,EAAEA,EAAE,gBAAgB,EAAEA,EAAE,yBAAyB,GAAGA,EAAE,OAAO,SAASI,IAAIJ,CAAC,EAAE,EAAE,QAAQC,KAAKiD,GAAE,SAAS,iBAAiBjD,EAAED,EAAE,EAAE,EAAEmD,GAAE,IAAIlD,EAAED,CAAC,CAAC,CAAC,SAAS6B,GAAE5B,EAAE,CAAC,IAAIG,EAAE+C,GAAE,IAAIlD,CAAC,EAAE,GAAGG,EAAE,CAAC,QAAQH,KAAKiD,GAAE,SAAS,oBAAoBjD,EAAEG,EAAE,EAAE,EAAE+C,GAAE,OAAOlD,CAAC,CAAC,CAAC,CAAC,SAASmD,IAAG,CAAC,OAAO,iBAAiB,QAAQH,GAAE,EAAE,EAAE,OAAO,iBAAiB,UAAUD,GAAE,EAAE,EAAE,OAAO,iBAAiB,SAASD,EAAC,EAAE,OAAO,iBAAiB,SAASA,EAAC,CAAC,CAAC,SAASM,IAAI,CAAC,OAAO,oBAAoB,QAAQJ,EAAC,EAAE,OAAO,oBAAoB,UAAUD,EAAC,EAAE,OAAO,oBAAoB,SAASD,EAAC,EAAE,OAAO,oBAAoB,SAASA,EAAC,CAAC,CAAC,SAASH,IAAI,CAAC,IAAI3C,EAAE,EAAE,SAAS,EAAEA,IAAIA,EAAE,QAAQ,MAAM,QAAQ,OAAO,CAAC,SAAS4C,GAAE5C,EAAEG,EAAE,CAAC,IAAIL,EAAE,EAAE,SAAS,EAAEA,IAAI8B,GAAE9B,EAAE,OAAO,EAAEA,EAAE,QAAQ,OAAO,GAAGA,EAAEuD,GAAG,EAAE,SAAS,KAAK,YAAYvD,EAAE,OAAO,EAAE,GAAG,CAAC,MAAMC,EAAE,YAAYE,EAAE,YAAYqB,EAAE,eAAeC,EAAE,aAAaE,EAAE,YAAYrB,EAAE,EAAE,aAAa,GAAG,OAAO,YAAYsB,EAAE,EAAE,aAAa,GAAG,WAAW,aAAajB,EAAE,EAAE,cAAc,GAAG,sBAAsB,EAAEN,EAAE,SAAS,CAAC,EAAEL,EAAE,WAAW,UAAUM,EAAEN,EAAE,eAAe,UAAU4B,EAAE5B,EAAE,SAAS,UAAUW,EAAE,IAAID,GAAE,EAAE,OAAO,GAAG,CAAC,EAAEF,EAAE,EAAE,aAAa,EAAEI,EAAEJ,IAAI,QAAQA,IAAIE,GAAE,OAAO,EAAEE,GAAGZ,EAAE,WAAW,UAAU,IAAI,yBAAyB,EAAEC,GAAGD,EAAE,MAAM,UAAUC,EAAED,EAAE,MAAM,MAAM,QAAQ,SAASA,EAAE,MAAM,MAAM,QAAQ,OAAOG,GAAGH,EAAE,YAAY,UAAUG,EAAEH,EAAE,YAAY,MAAM,QAAQ,SAASA,EAAE,YAAY,MAAM,QAAQ,OAAO,IAAIc,EAAEU,GAAG,EAAE,aAAa,EAAET,GAAEY,GAAG,EAAE,cAAc,GAAG,GAAGT,GAAEJ,GAAG,SAAS,MAAM,GAAGA,GAAG,SAAS,UAAU,GAAGC,GAAEf,EAAE,YAAY,MAAM,QAAQc,EAAE,SAAS,OAAO,EAAE,QAAQ,OAAOI,IAAGlB,EAAE,OAAO,MAAM,QAAQ,OAAOA,EAAE,SAAS,MAAM,QAAQe,GAAE,QAAQ,OAAOf,EAAE,WAAW,MAAM,QAAQc,EAAE,SAAS,MAAM,EAAE,QAAQ,OAAOd,EAAE,eAAe,MAAM,QAAQc,EAAE,SAAS,UAAU,EAAE,QAAQ,QAAQd,EAAE,OAAO,MAAM,QAAQ,OAAO,IAAImB,EAAEM,GAAG,EAAE,gBAAgB,GAAG,CAAC,EAAEN,GAAG,SAAS,MAAM,IAAInB,EAAE,WAAW,SAAS,GAAGA,EAAE,WAAW,UAAU,IAAI,6BAA6B,GAAGmB,GAAG,SAAS,UAAU,IAAInB,EAAE,eAAe,SAAS,GAAGA,EAAE,eAAe,UAAU,IAAI,6BAA6B,GAAGmB,GAAG,SAAS,OAAO,IAAInB,EAAE,YAAY,SAAS,GAAGA,EAAE,YAAY,UAAU,IAAI,6BAA6B,GAAG,IAAIoB,EAAEpB,EAAE,QAAQoB,EAAE,MAAM,QAAQ,QAAQA,EAAE,MAAM,KAAK,GAAGA,EAAE,MAAM,IAAI,GAAGA,EAAE,MAAM,OAAO,GAAGA,EAAE,MAAM,MAAM,GAAGA,EAAE,GAAG,yBAAyBA,EAAE,aAAa,OAAO,QAAQ,EAAEA,EAAE,aAAa,kBAAkB,sBAAsB,EAAEA,EAAE,aAAa,mBAAmB,4BAA4B,EAAE,IAAIH,GAAEjB,EAAE,MAAMiB,GAAE,UAAU,uBAAuBG,EAAE,UAAU,kBAAkBf,EAAE,SAAS,cAAc,EAAE,cAAc,GAAG,EAAE,GAAG,KAAK,EAAEiB,GAAEtB,EAAE,QAAQA,IAAG,CAAC,IAAIC,GAAED,GAAE,OAAOG,GAAEE,EAAE,SAAS,aAAa,EAAE,aAAa,EAAEmB,GAAEnB,EAAE,SAAS,aAAa,EAAE,aAAa,EAAEoB,GAAEpB,EAAE,SAAS,cAAc,EAAE,cAAc,EAAEsB,GAAEtB,EAAE,SAAS,aAAa,EAAE,aAAa,EAAE,GAAGJ,GAAE,QAAQ,0BAA0B,EAAE,OAAOW,GAAGe,GAAEA,GAAEzB,EAAEG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAED,GAAEA,GAAED,EAAEG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,GAAGH,GAAE,QAAQ,0BAA0B,EAAE,OAAOuB,GAAEA,GAAEtB,EAAEG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,GAAGH,GAAE,QAAQ,2BAA2B,EAAE,OAAOwB,GAAEA,GAAEvB,EAAEG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,EAAEF,IAAGF,GAAG,YAAY,SAASE,EAAC,GAAGF,GAAG,MAAM,SAASE,EAAC,EAAE,GAAG,CAAC,CAACA,GAAE,QAAQ,+EAA+E,CAAC,EAAEW,EAAE,UAAUb,CAAC,EAAE,IAAIqB,GAAEhB,EAAE,SAAS,iBAAiB,EAAE,iBAAiB,EAAEgB,IAAGA,GAAErB,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOI,EAAE,CAAC,CAAC,EAAE8B,EAAEhC,EAAEG,CAAC,EAAEI,EAAEW,CAAC,EAAE,IAAIG,GAAEhB,EAAE,CAACa,EAAE,GAAGlB,EAAE,UAAU,SAAS,sBAAsB,EAAE,CAAC,EAAE,CAACA,CAAC,CAAC,CAAC,EAAEqB,GAAE,OAAO,GAAGA,GAAE,CAAC,EAAE,MAAM,CAAC,CAAC,SAASgC,IAAI,CAAC,IAAIrD,EAAE,SAAS,cAAc,KAAK,EAAEA,EAAE,UAAU,IAAI,gBAAgB,EAAE,IAAIG,EAAE,SAAS,cAAc,KAAK,EAAEA,EAAE,UAAU,IAAI,sBAAsB,EAAE,IAAIL,EAAE,SAAS,cAAc,QAAQ,EAAEA,EAAE,GAAG,uBAAuBA,EAAE,UAAU,IAAI,sBAAsB,EAAEA,EAAE,MAAM,QAAQ,OAAOA,EAAE,UAAU,gBAAgB,IAAIC,EAAE,SAAS,cAAc,KAAK,EAAEA,EAAE,GAAG,6BAA6BA,EAAE,UAAU,IAAI,4BAA4B,EAAEA,EAAE,MAAM,QAAQ,OAAOA,EAAE,UAAU,8BAA8B,IAAIe,EAAE,SAAS,cAAc,QAAQ,EAAEA,EAAE,KAAK,SAASA,EAAE,UAAU,IAAI,0BAA0B,EAAEA,EAAE,aAAa,aAAa,OAAO,EAAEA,EAAE,UAAU,UAAU,IAAIb,EAAE,SAAS,cAAc,QAAQ,EAAEA,EAAE,UAAU,IAAI,uBAAuB,EAAE,IAAIC,EAAE,SAAS,cAAc,MAAM,EAAEA,EAAE,UAAU,IAAI,8BAA8B,EAAEA,EAAE,UAAU,GAAG,IAAIoB,EAAE,SAAS,cAAc,MAAM,EAAEA,EAAE,UAAU,IAAI,gCAAgC,EAAE,IAAIC,EAAE,SAAS,cAAc,QAAQ,EAAEA,EAAE,KAAK,SAASA,EAAE,UAAU,IAAI,0BAA0B,2BAA2B,EAAEA,EAAE,UAAU,WAAW,IAAIC,EAAE,SAAS,cAAc,QAAQ,EAAE,OAAOA,EAAE,KAAK,SAASA,EAAE,UAAU,IAAI,0BAA0B,2BAA2B,EAAEA,EAAE,UAAU,OAAOF,EAAE,YAAYC,CAAC,EAAED,EAAE,YAAYE,CAAC,EAAEvB,EAAE,YAAYC,CAAC,EAAED,EAAE,YAAYqB,CAAC,EAAEtB,EAAE,YAAYc,CAAC,EAAEd,EAAE,YAAYG,CAAC,EAAEH,EAAE,YAAYF,CAAC,EAAEE,EAAE,YAAYD,CAAC,EAAEC,EAAE,YAAYC,CAAC,EAAE,CAAC,QAAQD,EAAE,MAAMG,EAAE,MAAML,EAAE,YAAYC,EAAE,OAAOE,EAAE,eAAesB,EAAE,WAAWC,EAAE,YAAYV,EAAE,cAAcQ,EAAE,SAASpB,CAAC,CAAC,CAAC,SAASoD,IAAI,CAAC,IAAItD,EAAE,EAAE,SAAS,EAAEA,IAAI4B,GAAE5B,EAAE,OAAO,EAAEA,EAAE,QAAQ,eAAe,YAAYA,EAAE,OAAO,EAAE,CAAC,SAASuD,GAAGvD,EAAE,CAAC,EAAE,CAACD,EAAEC,CAAC,EAAE,SAASG,GAAG,CAAC,EAAE,YAAY,GAAGK,EAAE,CAAC,CAAC,SAASV,GAAG,CAAC,IAAIE,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,YAAY,GAAGA,IAAI,QAAQ,CAACQ,EAAE,EAAE,MAAM,CAAC,GAAG,OAAOR,GAAG,WAAW,CAAC,IAAIG,EAAE,EAAE,cAAc,EAAEH,EAAE,EAAE,iBAAiB,EAAEG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAGF,IAAI,WAAW,CAAC,IAAIA,EAAE,EAAE,YAAY,EAAEG,EAAE,EAAE,eAAe,EAAEL,GAAE,EAAE,OAAO,GAAG,CAAC,EAAEC,GAAE,EAAE,aAAa,IAAID,GAAE,OAAO,EAAEG,EAAED,GAAG,SAAS,aAAa,EAAE,aAAa,EAAE,GAAGD,IAAGE,EAAE,CAACA,EAAEE,EAAEH,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,IAAIqB,EAAEvB,GAAG,SAAS,aAAa,EAAE,aAAa,EAAE,GAAGuB,EAAE,CAACA,EAAEpB,EAAEH,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOE,EAAE,CAAC,CAAC,EAAE,MAAM,CAACoB,EAAE,CAAC,CAAC,CAAC,SAASA,GAAG,CAAC,IAAItB,EAAE,EAAE,aAAa,EAAEG,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,GAAGH,IAAI,OAAO,OAAO,IAAIF,EAAEE,EAAE,EAAEG,EAAEL,CAAC,EAAEW,EAAEX,CAAC,EAAEU,EAAE,CAAC,CAAC,SAASgB,GAAG,CAAC,IAAIxB,EAAE,EAAE,aAAa,EAAEG,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,GAAGH,IAAI,OAAO,OAAO,IAAIF,EAAEE,EAAE,EAAEG,EAAEL,CAAC,EAAEW,EAAEX,CAAC,EAAEU,EAAE,CAAC,CAAC,SAASJ,EAAEJ,EAAE,EAAE,EAAE,OAAO,GAAG,CAAC,GAAGA,CAAC,EAAES,EAAET,CAAC,EAAEQ,EAAE,CAAC,CAAC,SAASkB,GAAG,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,IAAI1B,EAAE,EAAE,aAAa,EAAEG,EAAE,EAAE,cAAc,EAAEL,EAAE,EAAE,iBAAiB,EAAE,GAAGE,IAAI,QAAQG,IAAI,QAAQ,EAAE,EAAE,OAAO,GAAG,CAAC,GAAGH,EAAE,CAAC,EAAE,OAAO,IAAID,GAAEI,EAAE,SAAS,aAAa,EAAE,aAAa,EAAE,GAAGJ,GAAE,OAAOA,GAAED,EAAEK,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAEsB,EAAE,CAAC,CAAC,SAASnB,GAAG,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,IAAIL,EAAE,EAAE,aAAa,EAAEG,EAAE,EAAE,cAAc,EAAEL,EAAE,EAAE,iBAAiB,EAAE,GAAGE,IAAI,QAAQG,IAAI,OAAO,OAAO,IAAIJ,GAAEC,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,OAAO,EAAEC,GAAEE,EAAE,SAAS,aAAa,EAAE,aAAa,EAAE,GAAGJ,IAAGE,GAAE,OAAOA,GAAEH,EAAEK,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAE,IAAIqB,EAAEpB,EAAE,SAAS,aAAa,EAAE,aAAa,EAAE,GAAGoB,EAAE,OAAOA,EAAEzB,EAAEK,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOD,EAAE,CAAC,CAAC,EAAEoB,EAAE,CAAC,CAAC,SAASf,GAAG,CAAC,EAAE,eAAe,IAAII,EAAE,gBAAgB,EAAE,EAAE,SAAS,KAAK,UAAU,IAAI,gBAAgB,EAAE,SAAS,EAAE,cAAc,eAAe,EAAE,EAAE,aAAa,GAAG,SAAS,KAAK,UAAU,IAAI,kBAAkB,EAAE,SAAS,KAAK,MAAM,YAAY,8BAA8B,GAAG,EAAE,UAAU,GAAG,GAAG,IAAI,EAAEwC,GAAE,EAAE,EAAE,eAAerD,CAAC,EAAE,EAAE,cAAcK,CAAC,EAAE,EAAE,aAAaA,CAAC,EAAE,EAAE,iBAAiBuB,CAAC,EAAE,EAAE,kBAAkBrB,CAAC,EAAE,CAAC,SAASI,EAAET,EAAE,EAAE,CAAC,IAAIG,EAAE,EAAE,OAAO,EAAE,GAAG,CAACA,EAAE,CAAC,QAAQ,MAAM,2BAA2B,EAAEK,EAAE,EAAE,MAAM,CAAC,GAAG,CAACL,EAAEH,CAAC,EAAE,CAACQ,EAAE,EAAE,MAAM,CAACG,EAAE,sBAAsB,SAAS,aAAa,EAAEA,EAAE,cAAcX,CAAC,EAAE,IAAIF,EAAEK,EAAEH,CAAC,EAAED,GAAEI,EAAEH,EAAE,CAAC,EAAEC,GAAEE,EAAEH,EAAE,CAAC,EAAEE,EAAEJ,EAAE,SAAS,aAAa,EAAE,aAAa,GAAG,OAAOwB,EAAE,EAAE,YAAY,EAAEC,GAAEzB,EAAE,SAAS,eAAe,OAAO,EAAE,cAAc,EAAEA,EAAE,SAAS,aAAa0B,IAAG1B,EAAE,SAAS,cAAc,EAAE,cAAc,GAAG,4BAA4B,QAAQ,cAAc,GAAGE,EAAE,CAAC,EAAE,EAAE,QAAQ,YAAY,GAAGG,EAAE,MAAM,EAAE,EAAEsB,GAAE3B,EAAE,SAAS,aAAa,EAAE,aAAa,EAAEM,GAAE,CAAC,OAAO,WAAW,GAAGkB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAOtB,IAAG,CAACyB,IAAG,QAAQA,GAAE,SAASzB,EAAC,CAAC,EAAE0B,GAAE5B,EAAE,SAAS,aAAa,EAAE,aAAa,EAAEO,GAAEP,EAAE,SAAS,aAAa,EAAE,aAAa,EAAES,GAAET,EAAE,SAAS,cAAc,EAAE,cAAc,EAAE0C,GAAE,CAAC,GAAG1C,EAAE,QAAQ,CAAC,YAAYM,GAAE,YAAYL,GAAE,OAAOG,EAAE,eAAe,CAAC,GAAGD,GAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,aAAasB,GAAE,YAAYG,KAAI,IAAI,CAAC3B,GAAEU,EAAET,EAAE,CAAC,EAAEQ,EAAE,CAAC,GAAG,YAAYH,KAAI,IAAI,CAACI,EAAET,EAAE,CAAC,CAAC,GAAG,aAAaO,KAAI,IAAI,CAACC,EAAE,CAAC,GAAG,GAAGV,GAAG,SAAS,CAAC,EAAE,aAAa0B,EAAC,CAAC,CAAC,CAAC,CAAC,SAAShB,EAAER,EAAE,GAAG,CAAC,IAAIG,EAAE,EAAE,iBAAiB,EAAEL,EAAE,EAAE,cAAc,EAAEC,GAAE,EAAE,qBAAqB,EAAEE,GAAE,EAAE,kBAAkB,EAAE,GAAGD,GAAGC,GAAE,CAACA,GAAE,CAACE,GAAGA,GAAG,KAAK,uBAAuB,OAAOA,EAAEL,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAOI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,IAAIoB,EAAExB,GAAG,cAAc,EAAE,cAAc,EAAEyB,EAAE,EAAE,aAAa,EAAE,SAAS,KAAK,UAAU,OAAO,gBAAgB,cAAc,gBAAgB,kBAAkB,EAAE,SAAS,KAAK,MAAM,eAAe,6BAA6B,EAAE6B,GAAG,EAAEE,GAAG,EAAET,GAAE,EAAElB,EAAE,EAAE,EAAE,EAAE,IAAIH,GAAE,EAAE,EAAE,GAAGZ,EAAE,EAAET,GAAGL,EAAE,CAAC,IAAIE,GAAEG,EAAE,KAAK,uBAAuBmB,GAAGA,EAAEtB,GAAE,OAAOG,EAAEL,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM0B,GAAE,OAAOtB,EAAE,CAAC,CAAC,EAAEqB,GAAGA,EAAEvB,GAAE,OAAOG,EAAEL,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM0B,GAAE,OAAOtB,EAAE,CAAC,CAAC,CAAC,CAACH,IAAGA,GAAE,MAAM,CAAC,CAAC,IAAIO,GAAE,CAAC,SAAS,IAAI,EAAE,eAAe,GAAG,GAAG,QAAQwC,GAAE,MAAM,CAAC9C,EAAE,IAAI,CAACO,EAAE,EAAEE,EAAET,CAAC,CAAC,EAAE,UAAUD,EAAE,SAASC,GAAG,CAACY,EAAE,EAAEb,EAAE,CAAC,GAAG,EAAE,EAAE,MAAMC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,aAAa,EAAE,YAAY,IAAI,EAAE,aAAa,IAAI,EAAE,WAAW,IAAI,CAAC,IAAIA,EAAE,EAAE,OAAO,GAAG,CAAC,EAAEG,EAAE,EAAE,aAAa,EAAE,OAAOA,IAAI,QAAQA,IAAIH,EAAE,OAAO,CAAC,EAAE,cAAc,IAAI,EAAE,YAAY,EAAE,iBAAiB,IAAI,EAAE,eAAe,EAAE,mBAAmB,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,IAAI,EAAE,cAAc,EAAE,YAAY,IAAI,CAAC,IAAIA,EAAE,EAAE,OAAO,GAAG,CAAC,EAAEG,EAAE,EAAE,aAAa,EAAE,OAAOA,IAAI,OAAO,OAAOH,EAAEG,EAAE,CAAC,CAAC,EAAE,SAASmB,EAAE,aAAaE,EAAE,OAAOpB,EAAE,YAAY,IAAI,CAAC,IAAIJ,EAAE,EAAE,OAAO,GAAG,CAAC,EAAEG,EAAE,EAAE,aAAa,EAAE,OAAOA,IAAI,QAAQ,CAAC,CAACH,EAAEG,EAAE,CAAC,CAAC,EAAE,gBAAgB,IAAI,CAAC,IAAIH,EAAE,EAAE,OAAO,GAAG,CAAC,EAAEG,EAAE,EAAE,aAAa,EAAE,OAAOA,IAAI,QAAQ,CAAC,CAACH,EAAEG,EAAE,CAAC,CAAC,EAAE,UAAUH,GAAG,CAACO,EAAE,EAAEiC,GAAE,CAAC,GAAGxC,EAAE,QAAQA,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,GAAGA,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,IAAI,CAACQ,EAAE,EAAE,CAAC,CAAC,EAAE,OAAOP,EAAEK,EAAC,EAAEA,EAAC,CAAC,OAAO,EAAE,OAAOiD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAS,IAAMC,GAAO3D,GAAG,GAAG,OCChxiB,IAAM4D,GAAc,yBAMpB,SAASC,IAAe,CACtB,GAAI,CACF,OAAO,KAAK,MAAM,aAAa,QAAQD,EAAW,CAAC,GAAK,CAAC,CAC3D,MAAQ,CACN,MAAO,CAAC,CACV,CACF,CAEA,SAASE,GAAaC,EAAO,CAC3B,GAAI,CACF,aAAa,QAAQH,GAAa,KAAK,UAAUG,CAAK,CAAC,CACzD,MAAQ,CAER,CACF,CAMA,IAAMC,GAAa,CACjB,cAAcC,EAAM,CAClB,IAAMC,EAAYL,GAAa,EAC/BK,EAAUD,CAAI,EAAI,GAClBH,GAAaI,CAAS,CACxB,EAEA,YAAYD,EAAM,CAChB,MAAO,CAAC,CAACJ,GAAa,EAAEI,CAAI,CAC9B,EAEA,UAAW,CACTH,GAAa,CAAC,CAAC,CACjB,EAEA,MAAMG,EAAM,CACV,IAAMC,EAAYL,GAAa,EAC/B,OAAOK,EAAUD,CAAI,EACrBH,GAAaI,CAAS,CACxB,EAEA,MAAMD,EAAME,EAAU,CAAC,EAAG,CACxB,IAAMC,EAAaC,GAAMJ,CAAI,EAC7B,GAAI,CAACG,EAAY,CACf,QAAQ,KAAK,6BAA6BH,CAAI,GAAG,EACjD,MACF,CAEA,IAAMK,EAAQ,OAAOF,EAAW,OAAU,WACtCA,EAAW,MAAM,EACjBA,EAAW,MAELG,GAAO,CACf,aAAc,GACd,YAAa,CAAC,OAAQ,WAAY,OAAO,EACzC,YAAa,aACb,YAAa,UACb,YAAa,kBACb,aAAc,SACd,aAAc,0BACd,GAAGH,EAAW,QACd,MAAAE,EACA,YAAa,IAAM,CACjB,KAAK,cAAcL,CAAI,EACnBG,EAAW,YAAYA,EAAW,WAAW,EAC7CD,EAAQ,YAAYA,EAAQ,WAAW,CAC7C,CACF,CAAC,EAEC,MAAM,CACV,EAEA,aAAaF,EAAM,CACjB,GAAI,CAAE,eAAe,QAAQ,oBAAqBA,CAAI,CAAG,MAAQ,CAAC,CACpE,EAEA,WAAY,CACV,GAAI,OAAO,sBAAuB,OAElC,IAAIO,EACJ,GAAI,CACFA,EAAc,eAAe,QAAQ,mBAAmB,EACpDA,GAAa,eAAe,WAAW,mBAAmB,CAChE,MAAQ,CAAC,CAET,GAAIA,EAAa,CACf,KAAK,MAAMA,CAAW,EACtB,WAAW,IAAM,KAAK,MAAMA,CAAW,EAAG,GAAG,EAC7C,MACF,CAGA,IAAMC,EAAO,OAAO,SAAS,SAC7B,OAAW,CAACC,EAASC,CAAQ,IAAK,OAAO,QAAQC,EAAa,EAC5D,GAAIH,EAAK,WAAWC,CAAO,GAAKD,IAASC,EAAS,CAChCL,GAAMM,CAAQ,GACjB,WAAa,CAAC,KAAK,YAAYA,CAAQ,GAClD,WAAW,IAAM,KAAK,MAAMA,CAAQ,EAAG,GAAG,EAE5C,MACF,CAEJ,CAEF,EAMMC,GAAgB,CACpB,cAAe,UACf,sBAAuB,kBACzB,EAMA,SAASC,GAAKC,EAASC,EAAOC,EAAaC,EAAO,SAAUC,EAAO,CAAC,EAAG,CACrE,MAAO,CAAE,QAAAJ,EAAS,QAAS,CAAE,MAAAC,EAAO,YAAAC,EAAa,KAAAC,EAAM,GAAGC,CAAK,CAAE,CACnE,CAMA,IAAMb,GAAQ,CAGZ,QAAS,CACP,UAAW,GACX,MAAO,CACL,CACE,QAAS,CACP,MAAO,mCACP,YACE,wFACF,KAAM,SACN,MAAO,QACT,CACF,EACAQ,GACE,aACA,aACA,uGACA,QACF,EACAA,GACE,qCACA,uBACA,uHACA,QACF,EACA,CACE,QAAS,CACP,MAAO,qBACP,YACE,sSAIF,KAAM,MACN,MAAO,QACT,CACF,EACA,CACE,QAAS,CACP,MAAO,0BACP,YACE,8EACF,KAAM,SACN,MAAO,SACP,YAAa,IAAM,CACjB,OAAO,SAAS,KAAO,qBACzB,CACF,CACF,CACF,CACF,EAGA,mBAAoB,CAClB,UAAW,GACX,YAAa,CACX,OAAO,SAAS,KAAO,QACzB,EACA,MAAO,CACL,CACE,QAAS,CACP,MAAO,wBACP,YACE,sGACF,KAAM,SACN,MAAO,QACT,CACF,EACAA,GACE,0CACA,wBACA,gHACA,QACF,EACAA,GACE,0CACA,oBACA,iEACA,QACF,EACA,CACE,QAAS,CACP,MAAO,2BACP,YACE,qKACF,KAAM,MACN,MAAO,QACT,CACF,EACA,CACE,QAAS,CACP,MAAO,mBACP,YACE,0HACF,KAAM,MACN,MAAO,QACT,CACF,EACAA,GACE,4BACA,cACA,iDACA,KACF,EACA,CACE,QAAS,CACP,MAAO,kBACP,YACE,mXACF,KAAM,SACN,MAAO,QACT,CACF,CACF,CACF,EAGA,SAAU,CACR,MAAO,IAAM,CACX,CACE,QAAS,CACP,MAAO,cACP,YACE,4IACF,KAAM,SACN,MAAO,QACT,CACF,EACAA,GACE,4BACA,iBACA,wEACA,MACF,CACF,CACF,EAGA,UAAW,CACT,MAAO,CACL,CACE,QAAS,CACP,MAAO,gDACP,YACE,2JACF,KAAM,SACN,MAAO,QACT,CACF,EACAA,GACE,6BACA,0BACA,4IACA,MACF,CACF,CACF,EAGA,WAAY,CACV,MAAO,CACL,CACE,QAAS,CACP,MAAO,sBACP,YACE,qKACF,KAAM,SACN,MAAO,QACT,CACF,EACA,CACE,QAAS,CACP,MAAO,cACP,YACE,qJACF,KAAM,MACN,MAAO,QACT,CACF,EACA,CACE,QAAS,CACP,MAAO,gBACP,YACE,mJACF,KAAM,MACN,MAAO,QACT,CACF,CACF,CACF,EAGA,SAAU,CACR,MAAO,CACL,CACE,QAAS,CACP,MAAO,WACP,YACE,wJACF,KAAM,SACN,MAAO,QACT,CACF,CACF,CACF,EAGA,QAAS,CACP,MAAO,CACL,CACE,QAAS,CACP,MAAO,UACP,YACE,yJACF,KAAM,SACN,MAAO,QACT,CACF,EACAA,GACE,2BACA,iBACA,sGACA,MACF,CACF,CACF,EAGA,WAAY,CACV,MAAO,CACL,CACE,QAAS,CACP,MAAO,gBACP,YACE,mFACF,KAAM,SACN,MAAO,QACT,CACF,EACA,CACE,QAAS,CACP,MAAO,8BACP,YACE,2SAEF,KAAM,MACN,MAAO,SACP,YAAa,IAAM,CACjB,OAAO,SAAS,KAAO,yBACzB,CACF,CACF,CACF,CACF,EAGA,QAAS,CACP,MAAO,CACL,CACE,QAAS,CACP,MAAO,UACP,YACE,iJACF,KAAM,SACN,MAAO,QACT,CACF,EACA,CACE,QAAS,CACP,MAAO,0BACP,YACE,iJACF,KAAM,MACN,MAAO,QACT,CACF,CACF,CACF,CACF,EAMA,OAAO,WAAab,GAEpB,SAAS,iBAAiB,mBAAoB,IAAMA,GAAW,UAAU,CAAC,EAC1E,SAAS,iBAAiB,kBAAmB,IAAMA,GAAW,UAAU,CAAC,GCxZxE,IAAM,CACL,IAAImB,EAAS,OAAO,UAAY,CAAC,EACjC,OAAO,OAAO,SAEd,IAAMC,EAAS,IAAM,CACnB,QAASC,EAAI,EAAGA,EAAIF,EAAO,OAAQE,IAAK,CACtC,IAAMC,EAAIH,EAAOE,CAAC,EACd,OAAOC,EAAE,IAAI,GAAG,OAAOA,EAAE,IAAI,EAAE,QAAQ,EAC3CA,EAAE,OAAO,iBAAmBA,EAAE,SAC9B,OAAOA,EAAE,IAAI,EAAI,IAAI,OAAO,YAAYA,EAAE,MAAM,CAClD,CACF,EAEA,OAAO,mBAAqB,CAACC,EAAMC,EAAUC,IAAW,CACtDN,EAASA,EAAO,OAAOG,GAAKA,EAAE,OAASC,CAAI,EAC3CJ,EAAO,KAAK,CAAE,KAAAI,EAAM,SAAAC,EAAU,OAAAC,CAAO,CAAC,EACtCL,EAAO,CACT,EAEAA,EAAO,EAIP,SAAS,iBAAiB,mBAAoB,IAAM,CAClD,QAASC,EAAI,EAAGA,EAAIF,EAAO,OAAQE,IAAK,CACtC,IAAMC,EAAIH,EAAOE,CAAC,EACd,OAAOC,EAAE,IAAI,GAAG,OAAOA,EAAE,IAAI,EAAE,QAAQ,CAC7C,CACAH,EAAS,CAAC,CACZ,CAAC,CACH,GAAG,GAQF,UAAY,CACX,aAEA,SAASO,GAAsB,CAC7B,SAAS,iBAAiB,UAAYC,GAAU,CAC9C,GAAI,GAAGA,EAAM,SAAWA,EAAM,UAAYA,EAAM,MAAQ,KAAM,OAC9DA,EAAM,eAAe,EACrB,IAAMC,EAAS,SAAS,eAAe,iBAAiB,EACnDA,IACLA,EAAO,KAAOA,EAAO,MAAM,EAAIA,EAAO,UAAU,EAClD,CAAC,CACH,CAEA,SAASC,GAAa,CACpB,GAAI,CACF,IAAMC,EAAS,aAAa,QAAQ,WAAW,EACzCC,EAAOD,EACTA,IAAW,OACX,WAAW,8BAA8B,EAAE,QAC/C,SAAS,gBAAgB,UAAU,OAAO,OAAQC,CAAI,CACxD,MAAY,CACZ,CAEA,IAAMC,EAASD,GAAS,CACtB,SAAS,gBAAgB,UAAU,OAAO,OAAQA,CAAI,EACtD,GAAI,CACF,aAAa,QAAQ,YAAaA,EAAO,OAAS,OAAO,CAC3D,MAAY,CACZ,CACF,EAEA,SAAS,iBAAiB,iBAAmBJ,GAAU,CACrD,IAAMM,EAAON,EAAM,QAAQ,KAC3BK,EACEC,IAAS,OACL,GACAA,IAAS,QACP,GACA,CAAC,SAAS,gBAAgB,UAAU,SAAS,MAAM,CAC3D,CACF,CAAC,CACH,CAEA,SAASC,GAAU,CACZ,OAAO,KAER,OAAO,wBAEX,OAAO,GAAG,KAAK,CACb,OAAQ,aACR,OAAQ,YACV,CAAC,EAED,SAAS,iBAAiB,kBAAmB,IAAM,CACjD,OAAO,aAAa,EACpB,OAAO,eAAe,KAAK,CAC7B,CAAC,EAED,SAAS,iBAAiB,iBAAmBP,GAAU,CACrD,IAAMQ,EAAMR,EAAM,QAAQ,KAAOA,EAAM,QAAQ,SAAW,OAAO,SAAS,KAC1E,OAAO,SAAS,OAAOQ,CAAG,CAC5B,CAAC,GACH,CAEAN,EAAW,EACXH,EAAoB,EAEpB,SAAS,iBAAiB,mBAAoB,IAAM,CAClDQ,EAAQ,EACR,OAAO,eAAe,KAAK,CAC7B,CAAC,CACH,GAAG",
  "names": ["lol", "be", "DSP", "At", "et", "re", "p", "J", "R", "wt", "Mt", "tt", "nt", "ve", "obj", "fn", "val", "pathToObj", "result", "paths", "path", "keys", "acc", "key", "rt", "queuedEffects", "batchDepth", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "flush", "dispatch", "stopPeeking", "r", "Rt", "n", "url", "s", "Ee", "i", "N", "Y", "xt", "se", "He", "o", "a", "ke", "st", "Ge", "De", "it", "Se", "K", "Ie", "O", "P", "Nt", "X", "F", "_", "Te", "yn", "ot", "je", "bn", "T", "ct", "_t", "Ft", "Lt", "Ot", "Pt", "Ht", "kt", "at", "Dt", "vn", "qe", "$e", "En", "oe", "ie", "Ve", "f", "u", "g", "I", "It", "S", "Ct", "G", "ee", "ue", "$t", "qt", "Be", "Tn", "Vt", "_e", "pe", "Gt", "H", "z", "lt", "Sn", "Ae", "e", "actionPlugins", "value", "Re", "escaped", "ft", "Wt", "Jt", "DSS", "counter", "match", "escapeRe", "v", "expr", "Me", "Ue", "ut", "we", "jt", "m", "signalName", "part", "k", "Cn", "W", "el", "args", "evt", "error", "xe", "Bt", "err", "root", "action", "Kt", "An", "zt", "We", "pt", "startPeeking", "filtered", "updateLeaves", "masked", "Rn", "filter", "oldValue", "selector", "contentType", "include", "openWhenHidden", "requestCancellation", "retry", "retryInterval", "retryMaxCount", "controller", "cleanups", "name", "Mn", "cleanupFn", "initialHeaders", "Ln", "headers", "req", "method", "wn", "response", "dispatchFetch", "type", "argsRawLines", "line", "w", "y", "A", "M", "Nn", "d", "h", "Ut", "V", "Qt", "dt", "Le", "le", "L", "q", "B", "j", "Q", "ae", "On", "Z", "b", "x", "C", "D", "fe", "E", "RETRYING", "Zt", "onRetry", "res", "newMessage", "fetchEventSource", "inputOnOpen", "inputFetch", "retryScaler", "rest", "resolve", "reject", "onVisibilityChange", "create", "he", "dispose", "retryTimer", "inputSignal", "fetch", "curRequestController", "onopen", "dispatchType", "responseOverrides", "argNames", "kebab", "mt", "argsRaw", "status", "isErrorStatus", "isNoContentStatus", "gt", "Pn", "Fn", "_n", "dispatchNonSSE", "Hn", "script", "scriptAttributesHeader", "getBytes", "getLines", "getMessages", "id", "baseRetryInterval", "onmessage", "onclose", "kn", "Yt", "curRequestSignal", "onerror", "retryMaxWaitMs", "retries", "RETRIES_FAILED", "componentRegistry", "observer", "registerComponent", "name", "selector", "initFunction", "initComponent", "element", "componentName", "component", "error", "initAllComponents", "init", "initNewComponents", "node", "startObserver", "mutations", "mutation", "stopObserver", "reinitComponent", "flag", "el", "reinitAll", "initDropdownMenu", "dropdownMenuComponent", "trigger", "popover", "menu", "missing", "menuItems", "activeIndex", "closePopover", "focusOnTrigger", "setActiveItem", "openPopover", "initialSelection", "rect", "side", "align", "item", "index", "activeItem", "event", "isExpanded", "nextIndex", "menuItem", "initCommand", "container", "input", "menu", "hintEl", "missing", "allMenuItems", "menuItems", "visibleMenuItems", "activeIndex", "remoteController", "remoteTimeout", "transactionMode", "parseTimeout", "parseController", "charCountSinceLastParse", "parsePreviewEl", "exitTransactionMode", "removeParsePreview", "item", "enterTransactionMode", "clearRemoteResults", "setActiveItem", "el", "showParseLoading", "refreshMenuItems", "scheduleParse", "text", "parseUrl", "url", "response", "data", "renderParseResult", "error", "p", "iconMap", "badge", "lines", "accountLine", "side", "resolved", "label", "labelPart", "escHtml", "namePart", "src", "dst", "hintHtml", "detailHtml", "mi", "s", "d", "renderRemoteResults", "results", "query", "separator", "groups", "result", "groupName", "items", "group", "headingId", "heading", "title", "subtitle", "scheduleRemoteSearch", "searchUrl", "index", "activeItem", "filterMenuItems", "searchTerm", "itemText", "matchesKeyword", "keyword", "matches", "handleKeyNavigation", "event", "currentVisibleIndex", "nextVisibleIndex", "newActiveItem", "menuItem", "clickedItem", "dialog", "initSelect", "selectComponent", "trigger", "selectedLabel", "popover", "listbox", "input", "filter", "missing", "allOptions", "options", "opt", "visibleOptions", "activeIndex", "isMultiple", "selectedOptions", "placeholder", "closeOnSelect", "getValue", "refreshOptions", "setActiveOption", "index", "activeOption", "hasTransition", "style", "updateValue", "optionOrOptions", "triggerEvent", "value", "opts", "selected", "option", "closePopover", "focusOnTrigger", "resetFilter", "toggleMultipleValue", "select", "deselect", "toggle", "filterOptions", "searchTerm", "optionText", "matchesKeyword", "keyword", "matches", "ariaSelected", "parsed", "validValues", "initialValues", "v", "initialOptions", "val", "o", "initialOption", "fallbackOption", "handleKeyNavigation", "event", "isPopoverOpen", "currentVisibleIndex", "nextVisibleIndex", "newActiveOption", "selectedOption", "openPopover", "clickedOption", "values", "initTabs", "tabsComponent", "tablist", "tabs", "panels", "tab", "selectTab", "tabToSelect", "index", "activePanel", "event", "clickedTab", "currentTab", "nextTab", "currentIndex", "mu", "params", "pos", "target", "html", "opts", "existingScripts", "i", "url", "cfg", "val", "fn", "el", "name", "fallback", "v", "selector", "sourceEl", "parsed", "muUrl", "form", "validator", "method", "formData", "submitter", "qs", "existing", "cached", "fetchUrl", "promise", "r", "state", "delay", "timer", "t", "container", "els", "tmp", "j", "trigger", "debounceMs", "repeatMs", "handler", "targetEl", "ms", "started", "dedupHandler", "lastFired", "now", "source", "e", "detail", "abortCtrl", "resp", "finalUrl", "fetchOpts", "postRender", "shouldScroll", "hashIdx", "anchor", "applyDom", "err", "doc", "sourceNode", "resolvedTarget", "targetNode", "fragments", "patchedSelectors", "frag", "targetSel", "mode", "patched", "useMorph", "text", "oldEls", "newEls", "oldKeys", "s", "tag", "scripts", "old", "src", "ev", "privacyMode", "loadConfig", "script", "polarToCartesian", "cx", "cy", "radius", "angleInDegrees", "angleInRadians", "describeArc", "outerRadius", "innerRadius", "startAngle", "endAngle", "outerStart", "outerEnd", "innerStart", "innerEnd", "largeArcFlag", "intcomma", "value", "formatAmount", "suffix", "formatCompact", "renderPieChart", "container", "svg", "data", "e", "total", "sum", "item", "el", "currentAngle", "percentage", "angleSize", "path", "title", "pct", "centerValue", "rawValue", "renderBarChart", "barsContainer", "labelsContainer", "emptyState", "maxValue", "activeIndex", "prevValue", "index", "height", "isActive", "changeText", "bar", "changeSpan", "label", "initCharts", "chartSignature", "lastSignature", "signature", "setupBudgetAutoSelect", "root", "dataElement", "budgetsByCategory", "findBudgetForCategory", "categoryId", "budgets", "ensureOption", "select", "value", "label", "listbox", "option", "clearBudget", "input", "autoSelectBudget", "categorySelect", "scope", "budgetSelect", "budgetInput", "budget", "budgetId", "event", "BatchSelect", "config", "e", "checked", "cbs", "i", "sa", "cb", "count", "ids", "total", "bar", "countEl", "escapeHtml", "text", "div", "parseTags", "container", "scriptId", "dataScript", "initTagsInput", "hiddenInput", "tagsContainer", "textInput", "getTags", "setTags", "tags", "renderTags", "addTag", "tag", "normalized", "key", "t", "removeTag", "current", "el", "span", "event", "root", "escapeHtml", "text", "div", "initMultiSelect", "container", "hiddenInputsContainer", "pillsContainer", "searchInput", "dropdown", "resultsContainer", "emptyMessage", "fieldName", "allChoices", "option", "getSelectedValues", "input", "updatePlaceholder", "removeSelection", "value", "candidate", "updateDropdown", "addSelection", "label", "pill", "event", "query", "selected", "filtered", "choice", "showDropdown", "hideDropdown", "button", "pills", "options", "index", "root", "root", "event", "states", "isDisabled", "details", "summary", "isMultiple", "root", "closeSiblings", "activeDetails", "initAccordion", "handleClick", "event", "handleKeydown", "handleToggle", "_d", "n", "r", "e", "a", "o", "t", "d", "p", "_", "m", "g", "h", "v", "y", "x", "S", "i", "E", "C", "w", "T", "D", "X", "O", "s", "c", "l", "u", "f", "k", "Z", "A", "j", "M", "N", "z", "P", "F", "I", "L", "R", "B", "V", "U", "H", "te", "$", "W", "G", "K", "q", "J", "Y", "Q", "ee", "ne", "re", "ie", "driver", "STORAGE_KEY", "getCompleted", "setCompleted", "tours", "BillowTour", "name", "completed", "options", "tourConfig", "TOURS", "steps", "driver", "pendingTour", "path", "pattern", "tourName", "PAGE_TOUR_MAP", "step", "element", "title", "description", "side", "opts", "_queue", "_drain", "i", "q", "name", "selector", "config", "setupCommandPalette", "event", "dialog", "setupTheme", "stored", "dark", "apply", "mode", "setupMu", "url"]
}
