{"version":3,"file":"autocomplete.mjs","sources":["../../src/mustache/fromMustacheTemplate.ts","../../node_modules/@nosto/nosto-js/dist/settings-DN0V2st5.js","../../node_modules/@nosto/nosto-js/dist/index.es.js","../../src/lib/client.ts","../../node_modules/@nosto/search-js/dist/index.es-XNBESE3P.js","../../node_modules/@nosto/search-js/dist/storage-B97DRj5i.js","../../node_modules/@nosto/search-js/dist/search-D1jQPG6P.js","../../src/lib/search.ts","../../src/lib/config.ts","../../node_modules/@nosto/search-js/dist/disableNativeAutocomplete-Bkta_WR2.js","../../src/lib/dropdown.ts","../../src/utils/promise.ts","../../src/utils/state.ts","../../src/utils/dom.ts","../../src/utils/ga.ts","../../src/utils/debounce.ts","../../src/utils/history.ts","../../src/lib/autocomplete.ts","../../node_modules/@nosto/search-js/dist/currencies/currencies.es.js","../../src/lib/components.ts","../../src/mustache/NostoAutocomplete.ts"],"sourcesContent":["import { DefaultState } from \"../utils/state\"\nimport Mustache from \"mustache\"\n\nexport { default as defaultMustacheTemplate } from \"./autocomplete.mustache\"\n\nexport type Options = {\n  /**\n   * Mustache helpers to extend template functionality.\n   */\n  helpers?: object\n}\n\n/**\n * Render a Mustache template into a container\n *\n * @param template Mustache template\n * @param options Options object.\n * @returns Render function\n * @group Autocomplete\n * @category Mustache\n/**\n * @example\n * ```js\n * import { fromMustacheTemplate } from \"@nosto/autocomplete/mustache\";\n *\n * const render = fromMustacheTemplate(`\n *   <div>\n *      <h1>{{title}}</h1>\n *     <ul>\n *      {{#products}}\n *       <li>{{name}}</li>\n *     {{/products}}\n *    </ul>\n *   </div>\n *   `, {\n *    helpers: {\n *     toJson: function () {\n *      return JSON.stringify(this)\n *    }});\n *\n * render(document.getElementById(\"container\"), {\n *   title: \"My Title\",\n *   products: [\n *     { name: \"Product 1\" },\n *     { name: \"Product 2\" },\n *     { name: \"Product 3\" }\n *   ]\n * });\n * ```\n */\nexport function fromMustacheTemplate<State extends object = DefaultState>(template: string, options?: Options) {\n  if (Mustache === undefined) {\n    throw new Error(\"Mustache is not defined. Please include the Mustache dependency or library in your page.\")\n  }\n\n  const { helpers } = options || {}\n\n  return (container: HTMLElement, state: State) => {\n    container.innerHTML = Mustache.render(template, {\n      ...state,\n      imagePlaceholder: \"https://cdn.nosto.com/nosto/9/mock\",\n      toJson: function () {\n        return JSON.stringify(this)\n      },\n      showListPrice: function () {\n        return this.listPrice !== this.price\n      },\n      ...helpers\n    })\n\n    return Promise.resolve()\n  }\n}\n","function o() {\n  window.nostojs = window.nostojs ?? function(n) {\n    (window.nostojs.q = window.nostojs.q ?? []).push(n);\n  };\n}\nasync function s(n) {\n  return window.nostojs(n);\n}\nlet t = null;\ntypeof window < \"u\" && (o(), s((n) => {\n  t = n.internal.getSettings();\n}));\nfunction i() {\n  return t;\n}\nfunction e(n) {\n  t = n;\n}\nexport {\n  i as g,\n  o as i,\n  s as n,\n  e as s\n};\n","import { i as g } from \"./settings-DN0V2st5.js\";\nimport { g as x, n as L } from \"./settings-DN0V2st5.js\";\nfunction b() {\n  return typeof window.nosto < \"u\";\n}\nfunction k() {\n  return window.nosto;\n}\nconst f = {\n  production: \"https://connect.nosto.com/\",\n  staging: \"https://connect.staging.nosto.com/\",\n  local: \"https://connect.nosto.com/\"\n};\nfunction u(o) {\n  return f[o ?? \"production\"];\n}\nfunction h({ merchantId: o, env: n, options: e, shopifyInternational: a, scriptLoader: s }) {\n  const t = document.querySelector(\"script[nosto-language], script[nosto-market-id]\"), r = String(a?.marketId || \"\"), i = a?.language || \"\", l = t?.getAttribute(\"nosto-language\") !== i || t?.getAttribute(\"nosto-market-id\") !== r;\n  if (!t || l) {\n    const d = document.querySelector(\"#nosto-sandbox\");\n    t?.parentNode?.removeChild(t), d?.parentNode?.removeChild(d);\n    const c = new URL(\"/script/shopify/market/nosto.js\", u(n));\n    c.searchParams.append(\"merchant\", o), c.searchParams.append(\"market\", r), c.searchParams.append(\"locale\", i.toLowerCase());\n    const m = {\n      ...e?.attributes,\n      \"nosto-language\": i,\n      \"nosto-market-id\": r\n    };\n    return (s ?? p)(c.toString(), { ...e, attributes: m });\n  }\n  return Promise.resolve();\n}\nfunction y(o) {\n  if (o.shopifyInternational)\n    return h(o);\n  const { merchantId: n, env: e, options: a, scriptLoader: s } = o, t = s ?? p, r = new URL(`/include/${n}`, u(e));\n  return t(r.toString(), a);\n}\nfunction p(o, n) {\n  return new Promise((a, s) => {\n    const t = document.createElement(\"script\");\n    t.src = o, t.async = !0, t.type = \"text/javascript\", t.onload = () => a(), t.onerror = () => s(), Object.entries(n?.attributes ?? {}).forEach(([r, i]) => t.setAttribute(r, i)), n?.position === \"head\" ? document.head.appendChild(t) : document.body.appendChild(t);\n  });\n}\nasync function C(o, n, e) {\n  if (!window.Nosto?.addSkuToCart)\n    throw new Error(\"Nosto addSkuToCart function is not available\");\n  await window.Nosto.addSkuToCart(o, n, e);\n}\ntypeof window < \"u\" && g();\nexport {\n  C as addSkuToCart,\n  k as getNostoWindow,\n  x as getSettings,\n  y as init,\n  g as initNostoStub,\n  b as isNostoLoaded,\n  L as nostojs\n};\n","import { nostojs } from \"@nosto/nosto-js\"\nimport { SearchHit } from \"@nosto/nosto-js/client\"\n\nexport function recordSearchClick(hit: SearchHit) {\n  nostojs(api => api.recordSearchClick(\"autocomplete\", hit))\n}\n\nexport function recordSearchSubmit(query: string) {\n  nostojs(api => api.recordSearchSubmit(query))\n}\n","function n() {\n  window.nostojs = window.nostojs ?? function(o) {\n    (window.nostojs.q = window.nostojs.q ?? []).push(o);\n  };\n}\nasync function s(o) {\n  return window.nostojs(o);\n}\nlet t = null;\ntypeof window < \"u\" && (n(), s((o) => {\n  t = o.internal.getSettings();\n}));\nfunction d() {\n  return t;\n}\nasync function u(o, i, w) {\n  if (!window.Nosto?.addSkuToCart)\n    throw new Error(\"Nosto addSkuToCart function is not available\");\n  await window.Nosto.addSkuToCart(o, i, w);\n}\ntypeof window < \"u\" && n();\nexport {\n  u as C,\n  d as i,\n  s\n};\n","import { s as I } from \"./index.es-XNBESE3P.js\";\nfunction c(e) {\n  return String(e) === \"[object Object]\";\n}\nfunction g(e) {\n  if (!c(e))\n    return !1;\n  const t = e.constructor;\n  if (t === void 0)\n    return !0;\n  const r = t.prototype;\n  return !(!c(r) || !r.hasOwnProperty(\"isPrototypeOf\"));\n}\nfunction u(e, t) {\n  if (e === t)\n    return !0;\n  if (e instanceof Date && t instanceof Date)\n    return e.getTime() === t.getTime();\n  if (Array.isArray(e) && Array.isArray(t))\n    return e.length !== t.length ? !1 : e.every((r, n) => u(r, t[n]));\n  if (g(e) && g(t)) {\n    const r = Object.entries(e);\n    return r.length !== Object.keys(t).length ? !1 : r.every(([n, S]) => u(S, t[n]));\n  }\n  return !1;\n}\nfunction f() {\n  const e = /* @__PURE__ */ new Map();\n  return {\n    getItem(t) {\n      return e.get(t) ?? null;\n    },\n    setItem(t, r) {\n      e.set(t, r);\n    },\n    removeItem(t) {\n      e.delete(t);\n    },\n    clear() {\n      e.clear();\n    },\n    key(t) {\n      return Array.from(e.keys())[t] ?? null;\n    },\n    get length() {\n      return e.size;\n    }\n  };\n}\nfunction a(e) {\n  return (...t) => {\n    I((r) => {\n      (r.internal.context.mode.isPreview() ? console[e] : r.internal.logger[e])(...t);\n    });\n  };\n}\nconst i = {\n  debug: a(\"debug\"),\n  info: a(\"info\"),\n  warn: a(\"warn\"),\n  error: a(\"error\")\n};\nfunction l(e, t, r) {\n  try {\n    const n = JSON.stringify(t);\n    r.setItem(e, n);\n  } catch (n) {\n    i.warn(n);\n  }\n}\nfunction m(e, t) {\n  try {\n    const r = t.getItem(e);\n    if (r)\n      return JSON.parse(r);\n  } catch (r) {\n    i.warn(r);\n  }\n}\nfunction y(e, t) {\n  try {\n    t.removeItem(e);\n  } catch (r) {\n    i.warn(r);\n  }\n}\nlet o, s;\ntry {\n  o = window.localStorage, s = window.sessionStorage;\n} catch (e) {\n  i.warn(e), o = f(), s = f();\n}\nfunction h(e, t) {\n  l(e, t, o);\n}\nfunction d(e, t) {\n  l(e, t, s);\n}\nfunction p(e) {\n  return m(e, o);\n}\nfunction O(e) {\n  return m(e, s);\n}\nfunction v(e) {\n  y(e, o);\n}\nfunction j(e) {\n  y(e, s);\n}\nexport {\n  O as a,\n  g as b,\n  j as c,\n  d,\n  p as g,\n  u as i,\n  i as l,\n  v as r,\n  h as s\n};\n","import { s as m } from \"./index.es-XNBESE3P.js\";\nimport { d as g, a as y, i as l, l as S } from \"./storage-B97DRj5i.js\";\nasync function C(t, { hitDecorators: e, ...n }, s) {\n  const r = await s(t, n);\n  if (!r.products?.hits?.length || !e?.length)\n    return r;\n  const c = (o) => e.reduce((i, a) => a(i), o);\n  return {\n    ...r,\n    products: {\n      ...r.products,\n      hits: r.products.hits.map(c)\n    }\n  };\n}\nconst h = \"nosto:search-js:cache\", R = 60 * 1e3;\nfunction b(t, e) {\n  g(h, { query: t, result: e, created: Date.now() });\n}\nfunction k(t) {\n  const e = y(h);\n  if (!e || !T(e))\n    return null;\n  const n = d(e.query);\n  return !l(d(t), n) || Date.now() - e.created > R ? null : e.result;\n}\nfunction d(t) {\n  const e = {\n    ...t,\n    time: void 0,\n    products: {\n      ...t.products,\n      size: void 0\n    }\n  };\n  return JSON.parse(JSON.stringify(e));\n}\nfunction T(t) {\n  return typeof t == \"object\" && t !== null && \"query\" in t && \"result\" in t && \"created\" in t;\n}\nasync function z(t, { usePersistentCache: e, ...n }, s) {\n  if (!e)\n    return s(t, n);\n  const r = await E(t, n, s);\n  return b(t, r), r;\n}\nasync function E(t, e, n) {\n  const { from: s = 0, size: r = 0 } = t.products || {}, c = k(t);\n  if (!c)\n    return await n(t, e);\n  const o = c?.products?.size ?? 0, i = c?.products?.hits ?? [];\n  if (r === o)\n    return c;\n  if (r < o)\n    return {\n      ...c,\n      products: {\n        ...c.products,\n        size: r,\n        hits: i.slice(0, r),\n        total: c.products?.total || 0\n      }\n    };\n  const a = r - i.length, p = s > 0 ? s + 1 : r - a, w = {\n    ...t,\n    products: {\n      ...t.products,\n      from: p,\n      size: a\n    }\n  }, f = await n(w, e);\n  return {\n    ...c,\n    products: {\n      ...c.products,\n      size: r,\n      hits: [...c.products?.hits || [], ...f.products?.hits || []],\n      total: f.products?.total || 0\n    }\n  };\n}\nconst N = 3e4, u = /* @__PURE__ */ new Map();\nfunction W(t, e) {\n  const n = u.get(t);\n  if (!n) return;\n  const s = Date.now() - n.created > N, r = l(e, n.query);\n  if (s || !r) {\n    u.delete(t);\n    return;\n  }\n  return n.result;\n}\nfunction _(t, e, n) {\n  u.set(t, {\n    query: e,\n    result: n,\n    created: Date.now()\n  });\n}\nasync function D(t, e, n) {\n  if (!e.useMemoryCache)\n    return n(t, e);\n  const s = JSON.stringify(t), r = W(s, t);\n  if (r) return r;\n  const c = await n(t, e);\n  return _(s, t, c), c;\n}\nasync function M(t, e, n) {\n  if (!e.redirect)\n    return n(t, e);\n  const s = await n(t, e);\n  if (s.keywords?.hits?.length) {\n    const r = s.keywords.hits.find((c) => c.keyword === t.query && c._redirect);\n    r && r._redirect && (window.location.href = r._redirect);\n  }\n  return s;\n}\nfunction O(t) {\n  return new Promise((e) => setTimeout(e, t));\n}\nasync function j(t, { maxRetries: e = 0, retryInterval: n = 0, ...s }, r) {\n  let c = 0;\n  for (; ; )\n    try {\n      return await r(t, s);\n    } catch (o) {\n      if (c >= e)\n        throw o;\n      if (!J(o))\n        throw S.info(\"Skipping retry logic for\", o), o;\n      c++, await O(n);\n    }\n}\nfunction J(t) {\n  return !t || typeof t != \"object\" ? !1 : !(\"status\" in t) || V(t.status);\n}\nfunction V(t) {\n  return typeof t == \"number\" && (t < 400 || t >= 500);\n}\nasync function K(t, e = {}) {\n  const n = await new Promise(m);\n  return x(\n    n.search,\n    j,\n    M,\n    D,\n    z,\n    C\n  )(t, e);\n}\nfunction x(t, ...e) {\n  return e.reduce((n, s) => (r, c) => s(r, c, n), t);\n}\nexport {\n  K as s\n};\n","import type { SearchQuery } from \"@nosto/nosto-js/client\"\nimport { search as searchFn, SearchOptions } from \"@nosto/search-js\"\n\nconst defaultProductFields = [\n  \"productId\",\n  \"url\",\n  \"name\",\n  \"imageUrl\",\n  \"imageHash\",\n  \"thumbUrl\",\n  \"description\",\n  \"brand\",\n  \"variantId\",\n  \"availability\",\n  \"price\",\n  \"priceText\",\n  \"categoryIds\",\n  \"categories\",\n  \"customFields.key\",\n  \"customFields.value\",\n  \"priceCurrencyCode\",\n  \"datePublished\",\n  \"listPrice\",\n  \"unitPricingBaseMeasure\",\n  \"unitPricingUnit\",\n  \"unitPricingMeasure\",\n  \"googleCategory\",\n  \"gtin\",\n  \"ageGroup\",\n  \"gender\",\n  \"condition\",\n  \"alternateImageUrls\",\n  \"ratingValue\",\n  \"reviewCount\",\n  \"inventoryLevel\",\n  \"skus.id\",\n  \"skus.name\",\n  \"skus.price\",\n  \"skus.listPrice\",\n  \"skus.priceText\",\n  \"skus.url\",\n  \"skus.imageUrl\",\n  \"skus.inventoryLevel\",\n  \"skus.customFields.key\",\n  \"skus.customFields.value\",\n  \"skus.availability\",\n  \"pid\",\n  \"onDiscount\",\n  \"extra.key\",\n  \"extra.value\",\n  \"saleable\",\n  \"available\",\n  \"tags1\",\n  \"tags2\",\n  \"tags3\"\n]\n\n/**\n *\n * @param query Query object.\n * @param options Options object.\n * @returns Promise of search response.\n * @group Autocomplete\n * @category Core\n * @example\n * ```js\n * import { search } from \"@nosto/autocomplete\"\n *\n * search({\n *     query: \"shoes\",\n *     products: {\n *       fields: [\"name\", \"price\"],\n *       facets: [\"brand\", \"category\"],\n *       size: 10,\n *       from: 0,\n *     }\n * }).then((state) => {\n *    console.log(state.response)\n * })\n * ```\n */\nexport async function search(query: SearchQuery, options: SearchOptions = {}) {\n  const fields = query.products?.fields ?? defaultProductFields\n  const facets = query.products?.facets ?? [\"*\"]\n  const size = query.products?.size ?? 20\n  const from = query.products?.from ?? 0\n\n  const response = await searchFn(\n    {\n      ...query,\n      products: {\n        ...query.products,\n        fields,\n        facets,\n        size,\n        from\n      }\n    },\n    options\n  )\n\n  return { query, response }\n}\n","import type { SearchQuery } from \"@nosto/nosto-js/client\"\nimport { SearchAutocompleteOptions } from \"./autocomplete\"\nimport { search } from \"./search\"\nimport { HitDecorator } from \"@nosto/search-js\"\n\n/**\n * @group Autocomplete\n * @category Core\n */\nexport interface GoogleAnalyticsConfig {\n  /**\n   * Path of search page\n   * @default \"/search\"\n   */\n  serpPath?: string\n  /**\n   * Search query url parameter name\n   * @default \"query\"\n   */\n  queryParamName?: string\n  /**\n   * Enable Google Analytics\n   * @default true\n   */\n  enabled?: boolean\n}\n\nexport type Selector = string | Element\n\n/**\n * @group Autocomplete\n * @category Core\n */\nexport interface AutocompleteConfig<State> {\n  /**\n   * The input element to attach the autocomplete to\n   */\n  inputSelector: Selector\n  /**\n   * The dropdown element to attach the autocomplete to\n   */\n  dropdownSelector: Selector | ((input: HTMLInputElement) => Selector)\n  /**\n   * The function to use to render the dropdown\n   */\n  render: (container: HTMLElement, state: State) => void | PromiseLike<void>\n  /**\n   * Minimum length of the query before searching\n   */\n  minQueryLength?: number\n  /**\n   * The function to use to fetch the search state\n   */\n  fetch: SearchQuery | ((input: string) => PromiseLike<State>)\n  /**\n   * The function to use to submit the search\n   */\n  submit?: (query: string, config: AutocompleteConfig<State>, options?: SearchAutocompleteOptions) => void\n  /**\n   * Enable history\n   */\n  historyEnabled?: boolean\n  /**\n   * Max number of history items to show\n   */\n  historySize?: number\n  /**\n   * Enable Nosto Analytics\n   */\n  nostoAnalytics?: boolean\n  /**\n   * Google Analytics configuration. Set to `false` to disable.\n   */\n  googleAnalytics?: GoogleAnalyticsConfig | boolean\n  /**\n   * Decorate each search hit before rendering\n   *\n   * @example\n   * ```ts\n   * import { priceDecorator } from \"@nosto/autocomplete\"\n   *\n   * autocomplete({\n   *   hitDecorators: [\n   *     priceDecorator({ defaultCurrency: \"USD\" })\n   *   ]\n   * })\n   * ```\n   */\n  hitDecorators?: HitDecorator[]\n  /**\n   * Whether to submit the form natively or not\n   */\n  nativeSubmit?: boolean\n  /**\n   * A function to call when the user clicks on a search hit to use custom routing\n   * @example\n   * ```ts\n   * autocomplete({\n   *  routingHandler: (url) => {\n   *    location.href = url\n   *  }\n   * })\n   * ```\n   */\n  routingHandler?: (url: string) => void\n}\n\nexport const defaultGaConfig = {\n  serpPath: \"/search\",\n  queryParamName: \"query\",\n  enabled: true\n}\n\nexport function getDefaultConfig<State>() {\n  return {\n    minQueryLength: 2,\n    historyEnabled: true,\n    historySize: 5,\n    hitDecorators: [],\n    nostoAnalytics: true,\n    googleAnalytics: defaultGaConfig,\n    routingHandler: url => {\n      location.href = url\n    },\n    nativeSubmit: false,\n    submit: (query, config, options) => {\n      if (query.length >= (config.minQueryLength ?? getDefaultConfig<State>().minQueryLength)) {\n        search(\n          {\n            query\n          },\n          {\n            redirect: true,\n            track: config.nostoAnalytics ? \"serp\" : undefined,\n            hitDecorators: config.hitDecorators,\n            ...options\n          }\n        )\n      }\n    }\n  } satisfies Partial<AutocompleteConfig<State>>\n}\n","function y(f, { onClick: d, onFocus: r, onInput: v, onKeyDown: u, onSubmit: l }, { form: c = f.form ?? void 0, nativeSubmit: p } = {}) {\n  const o = [];\n  function i(e, s, a) {\n    e.addEventListener(s, a), o.push(() => e.removeEventListener(s, a));\n  }\n  return (u || l) && i(f, \"keydown\", (e) => {\n    const s = u?.(f.value, e.key);\n    u && (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") ? e.preventDefault() : l && e.key === \"Enter\" && (f.value !== \"\" && !e.repeat && !s && l(f.value), p || e.preventDefault());\n  }), l && c && (i(c, \"submit\", (e) => {\n    p || e.preventDefault(), l(f.value);\n  }), c.querySelectorAll(\"[type=submit]\").forEach((e) => {\n    i(e, \"click\", (s) => {\n      p || s.preventDefault(), l(f.value);\n    });\n  })), d && i(f, \"click\", () => d(f.value)), r && i(f, \"focus\", () => r(f.value)), v && i(f, \"input\", () => v(f.value)), {\n    destroy() {\n      o.forEach((e) => e());\n    }\n  };\n}\nfunction k(f) {\n  f.setAttribute(\"autocomplete\", \"off\");\n}\nexport {\n  y as b,\n  k as d\n};\n","import { logger } from \"@nosto/search-js/utils\"\nimport { SearchAutocompleteOptions } from \"./autocomplete\"\n\ntype OnClickBindings<State> = {\n  [key: string]: (obj: { data: string | undefined; el: HTMLElement; update: (state: State) => void }) => unknown\n}\n\nexport function createDropdown<State>(\n  container: HTMLElement,\n  initialState: PromiseLike<State>,\n  render: (container: HTMLElement, state: State) => void | PromiseLike<void>,\n  submit: (inputValue: string, options?: SearchAutocompleteOptions) => unknown,\n  updateInput: (inputValue: string) => void,\n  routingHandler: (url: string) => void,\n  onClickBindings?: OnClickBindings<State>\n) {\n  let elements: HTMLElement[] = []\n  let unbindCallbacks: Array<() => void> = []\n\n  let isEmpty: boolean = true\n  let selectedIndex: number = -1\n\n  function handleElementSubmit(el: HTMLElement): void {\n    const hit = el?.dataset?.nsHit\n\n    if (hit) {\n      const parsedHit = parseHit(hit)\n      hide()\n\n      if (parsedHit?.item) {\n        submit(parsedHit.item)\n        return\n      }\n\n      if (parsedHit?.keyword) {\n        submit(parsedHit.keyword, {\n          redirect: !!parsedHit?._redirect,\n          isKeyword: true\n        })\n\n        if (parsedHit?._redirect) {\n          routingHandler(parsedHit._redirect)\n        }\n        return\n      }\n\n      if (parsedHit?.url) {\n        routingHandler(parsedHit.url)\n      }\n    }\n  }\n\n  function loadElements() {\n    isEmpty = !container.innerHTML.trim()\n\n    if (!isEmpty) {\n      elements = Array.from<HTMLElement>(container.querySelectorAll(\"[data-ns-hit]\")).map(el => {\n        bindElementSubmit(el)\n        return el\n      })\n    }\n  }\n\n  function bindDataCallbacks() {\n    Object.entries(onClickBindings ?? {}).map(([key, callback]) => {\n      // Convert camelCase to kebab-case\n      const dataKey = `[data-ns-${key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}]`\n\n      Array.from<HTMLElement>(container.querySelectorAll(dataKey)).map(el => {\n        const data = el?.dataset?.[`ns${key.charAt(0).toUpperCase() + key.slice(1)}`]\n        const onClick = () => {\n          callback({\n            data,\n            el,\n            update\n          })\n        }\n\n        el.addEventListener(\"click\", onClick)\n        unbindCallbacks.push(() => {\n          el.removeEventListener(\"click\", onClick)\n        })\n      })\n    })\n  }\n\n  function bindElementSubmit(el: HTMLElement) {\n    const onSubmit = () => {\n      handleElementSubmit(el)\n    }\n\n    el.addEventListener(\"click\", onSubmit)\n    unbindCallbacks.push(() => {\n      el.removeEventListener(\"click\", onSubmit)\n    })\n  }\n\n  function highlight(index: number, prevIndex?: number) {\n    if (typeof prevIndex === \"number\" && elements[prevIndex]) {\n      elements[prevIndex].classList.remove(\"selected\")\n    }\n\n    if (typeof index === \"number\" && elements[index]) {\n      elements[index]?.classList.add(\"selected\")\n\n      const hit = elements[index]?.dataset?.nsHit\n\n      if (hit) {\n        const parsedHit = parseHit(hit)\n\n        if (parsedHit.item) {\n          updateInput(parsedHit.item)\n          return\n        }\n\n        if (parsedHit.keyword) {\n          updateInput(parsedHit.keyword)\n          return\n        }\n      }\n    }\n  }\n\n  function dispose() {\n    resetHighlight()\n    elements = []\n    unbindCallbacks.forEach(v => v())\n    unbindCallbacks = []\n  }\n\n  async function update(state: State) {\n    dispose()\n    await render(container, state)\n\n    // Without setTimeout React does not have committed DOM changes yet, so we don't have the correct elements.\n    setTimeout(() => {\n      loadElements()\n      bindDataCallbacks()\n      show()\n    }, 0)\n  }\n\n  function hide() {\n    resetHighlight()\n    container.style.display = \"none\"\n  }\n\n  function show() {\n    if (!isEmpty) {\n      container.style.display = \"\"\n    } else {\n      hide()\n    }\n  }\n\n  function clear() {\n    dispose()\n    isEmpty = true\n    hide()\n  }\n\n  function isOpen() {\n    return container.style.display !== \"none\"\n  }\n\n  function goDown() {\n    let prevIndex = selectedIndex\n\n    if (selectedIndex === elements.length - 1) {\n      selectedIndex = 0\n    } else {\n      prevIndex = selectedIndex++\n    }\n\n    highlight(selectedIndex, prevIndex)\n  }\n\n  function goUp() {\n    if (hasHighlight()) {\n      let prevIndex = selectedIndex\n\n      if (selectedIndex === 0) {\n        selectedIndex = elements.length - 1\n      } else {\n        prevIndex = selectedIndex--\n      }\n\n      highlight(selectedIndex, prevIndex)\n    } else {\n      selectedIndex = elements.length - 1\n      highlight(selectedIndex)\n    }\n  }\n\n  function handleSubmit() {\n    if (isOpen() && hasHighlight() && elements[selectedIndex]) {\n      handleElementSubmit(elements[selectedIndex])\n    }\n  }\n\n  function hasHighlight() {\n    return selectedIndex > -1\n  }\n\n  function getHighlight() {\n    return elements[selectedIndex]\n  }\n\n  function resetHighlight() {\n    if (hasHighlight()) {\n      elements[selectedIndex]?.classList.remove(\"selected\")\n      selectedIndex = -1\n    }\n  }\n\n  function destroy() {\n    dispose()\n    isEmpty = true\n    container.innerHTML = \"\"\n  }\n\n  async function init() {\n    const state = await Promise.resolve(initialState)\n    await Promise.resolve(render(container, state))\n\n    // Without setTimeout React does not have committed DOM changes yet, so we don't have the correct elements.\n    setTimeout(() => {\n      loadElements()\n      bindDataCallbacks()\n      hide()\n    }, 0)\n  }\n  init()\n\n  return {\n    update,\n    clear,\n    isOpen,\n    goDown,\n    goUp,\n    handleSubmit,\n    destroy,\n    show,\n    hide,\n    resetHighlight,\n    hasHighlight,\n    getHighlight,\n    container\n  }\n}\n\nexport type Dropdown<T> = ReturnType<typeof createDropdown<T>>\n\ninterface Hit {\n  item?: string\n  keyword?: string\n  url?: string\n  _redirect?: string\n}\n\nexport function parseHit(hit: string): Hit {\n  try {\n    const parsedHit: Hit | undefined | null = JSON.parse(hit)\n    return parsedHit ?? {}\n  } catch (error) {\n    logger.warn(\"Could not parse hit\", error)\n    return {}\n  }\n}\n","export type Cancellable<T> = { promise: PromiseLike<T>; cancel: () => void }\n\nexport class CancellableError extends Error {}\n\nexport function makeCancellable<T>(promise: PromiseLike<T>): Cancellable<T> {\n  let hasCanceled_ = false\n\n  const wrappedPromise = new Promise<T>((resolve, reject) => {\n    // eslint-disable-next-line promise/prefer-await-to-then\n    return promise.then(\n      val => (hasCanceled_ ? reject(new CancellableError(\"cancelled promise\")) : resolve(val)),\n      error => (hasCanceled_ ? reject(new CancellableError(\"cancelled promise\")) : reject(error))\n    )\n  })\n\n  return {\n    promise: wrappedPromise,\n    cancel() {\n      hasCanceled_ = true\n    }\n  }\n}\n","import { AutocompleteConfig } from \"../lib/config\"\nimport { History } from \"./history\"\nimport { Cancellable, makeCancellable } from \"./promise\"\nimport { search } from \"../lib/search\"\nimport { SearchAutocompleteOptions } from \"../lib/autocomplete\"\nimport type { InputSearchQuery, SearchResult } from \"@nosto/nosto-js/client\"\n\n/**\n * @group Autocomplete\n * @category Core\n */\nexport interface DefaultState {\n  /**\n   * The current search query object.\n   */\n  query?: InputSearchQuery\n  /**\n   * The current search response.\n   */\n  response?: SearchResult\n  /**\n   * The history items.\n   */\n  history?: { item: string }[]\n}\n\nexport type StateActions<State> = {\n  updateState(inputValue?: string): PromiseLike<State>\n  addHistoryItem(item: string): PromiseLike<State>\n  removeHistoryItem(item: string): PromiseLike<State>\n  clearHistory(): PromiseLike<State>\n}\n\nexport function getStateActions<State>({\n  config,\n  history,\n  input\n}: {\n  config: Required<AutocompleteConfig<State>>\n  history?: History\n  input: HTMLInputElement\n}): StateActions<State> {\n  let cancellable: Cancellable<State> | undefined\n\n  const fetchState = (\n    value: string,\n    config: AutocompleteConfig<State>,\n    options?: SearchAutocompleteOptions\n  ): PromiseLike<State> => {\n    if (typeof config.fetch === \"function\") {\n      return config.fetch(value)\n    } else {\n      // @ts-expect-error type mismatch\n      return search(\n        {\n          query: value,\n          ...config.fetch\n        },\n        {\n          track: config.nostoAnalytics ? \"autocomplete\" : undefined,\n          redirect: false,\n          hitDecorators: config.hitDecorators,\n          ...options\n        }\n      )\n    }\n  }\n\n  function getHistoryState(query: string): PromiseLike<State> {\n    // @ts-expect-error type mismatch\n    return Promise.resolve({\n      query: {\n        query\n      },\n      history: history?.getItems()\n    })\n  }\n\n  function updateState(inputValue?: string, options?: SearchAutocompleteOptions): PromiseLike<State> {\n    cancellable?.cancel()\n\n    if (inputValue && inputValue.length >= config.minQueryLength) {\n      cancellable = makeCancellable(fetchState(inputValue, config, options))\n      return cancellable.promise\n    } else if (history) {\n      return getHistoryState(inputValue ?? \"\")\n    }\n\n    return (\n      // @ts-expect-error type mismatch\n      cancellable?.promise ?? Promise.resolve<State>({})\n    )\n  }\n\n  function addHistoryItem(item: string): PromiseLike<State> {\n    if (history) {\n      history.add(item)\n    }\n    return getHistoryState(input.value)\n  }\n\n  function removeHistoryItem(item: string): PromiseLike<State> {\n    if (history) {\n      history.remove(item)\n    }\n    return getHistoryState(input.value)\n  }\n\n  function clearHistory(): PromiseLike<State> {\n    if (history) {\n      history.clear()\n    }\n    return getHistoryState(input.value)\n  }\n\n  return {\n    updateState,\n    addHistoryItem,\n    removeHistoryItem,\n    clearHistory\n  }\n}\n","type Selector = string | Element\n\nexport function findAll<T extends Element>(selector: Selector, filterType?: { new (): T }): T[] {\n  const elements = typeof selector === \"string\" ? Array.from(document.querySelectorAll(selector)) : [selector]\n  return elements.filter((v): v is T => (filterType ? v instanceof filterType : true))\n}\n\nexport async function DOMReady(): Promise<void> {\n  return new Promise(resolve => {\n    if (document.readyState !== \"loading\") {\n      resolve()\n    } else {\n      window.addEventListener(\"DOMContentLoaded\", () => {\n        resolve()\n      })\n    }\n  })\n}\n\nexport function parents(target: Selector, selector?: string): Element[] {\n  let parentList: Element[] = []\n  findAll(target).forEach(element => {\n    const parent = element.parentNode\n    if (parent !== document && parent instanceof Element) {\n      parentList.push(parent)\n      parentList = parentList.concat(parents(parent))\n    }\n  })\n  return parentList.filter(element => selector === undefined || matches(element, selector))\n}\n\nexport function matches(target: Selector, selector: string): boolean {\n  const matchesFunc =\n    Element.prototype.matches ||\n    // @ts-expect-error proprietary method\n    Element.prototype.msMatchesSelector ||\n    Element.prototype.webkitMatchesSelector\n  return findAll(target).some(element => matchesFunc.call(element, selector))\n}\n\nexport function bindClickOutside([element, input]: Array<HTMLElement>, callback: () => void) {\n  const onClick = (event: MouseEvent) => {\n    const target = event.target\n\n    if (target instanceof HTMLElement && element) {\n      if (target !== element && target !== input && !parents(target).includes(element)) {\n        callback()\n      }\n    }\n  }\n\n  document.addEventListener(\"click\", onClick)\n\n  return {\n    destroy: () => {\n      document.removeEventListener(\"click\", onClick)\n    }\n  }\n}\n","import { logger } from \"@nosto/search-js/utils\"\nimport { AutocompleteConfig, defaultGaConfig } from \"../lib/config\"\n\nconst localStorageKey = \"nosto:autocomplete:gaEvent\"\n\nexport function trackGaPageView(options?: { delay?: boolean; title?: string; location?: string }) {\n  const { delay = false, title = document.title, location = window.location.href } = options || {}\n\n  if (delay) {\n    saveToLocalStorage(title, location)\n  } else {\n    if (\"gtag\" in window && typeof window.gtag === \"function\") {\n      const accounts =\n        \"google_tag_manager\" in window && typeof window.google_tag_manager === \"object\"\n          ? Object.keys(window.google_tag_manager || []).filter(e => {\n              return e.substring(0, 2) == \"G-\"\n            })\n          : []\n\n      if (accounts.length > 1) {\n        for (let i = 0; i < accounts.length; i++) {\n          window.gtag(\"event\", \"page_view\", {\n            page_title: title,\n            page_location: location,\n            send_to: accounts[i]\n          })\n        }\n      } else {\n        window.gtag(\"event\", \"page_view\", {\n          page_title: title,\n          page_location: location\n        })\n      }\n    }\n    if (\n      \"ga\" in window &&\n      typeof window.ga === \"function\" &&\n      \"getAll\" in window.ga &&\n      typeof window.ga.getAll === \"function\"\n    ) {\n      try {\n        const url = new URL(location)\n        const trackers = window.ga!.getAll()\n        if (trackers?.length > 0) {\n          trackers[0]?.send(\"pageview\", url.pathname + url.search)\n        }\n      } catch (error) {\n        logger.warn(\"Could not send pageview to GA\", error)\n      }\n    }\n  }\n}\n\nexport const isGaEnabled = <State>(config: AutocompleteConfig<State>) =>\n  typeof config.googleAnalytics === \"boolean\"\n    ? config.googleAnalytics\n    : typeof config.googleAnalytics === \"object\" && config.googleAnalytics.enabled\n\nexport const getGaTrackUrl = <State>(value: string | undefined, config: AutocompleteConfig<State>) => {\n  const gaConfig = isGaEnabled(config)\n    ? typeof config.googleAnalytics === \"boolean\"\n      ? defaultGaConfig\n      : {\n          ...defaultGaConfig,\n          ...config.googleAnalytics\n        }\n    : undefined\n\n  if (value && gaConfig) {\n    try {\n      return new URL(\n        `${gaConfig?.serpPath || location.pathname}?${`${encodeURIComponent(\n          gaConfig.queryParamName\n        )}=${encodeURIComponent(value).replace(/%20/g, \"+\")}`}`,\n        window.location.origin\n      ).toString()\n    } catch (error) {\n      logger.warn(\"Could not create track url\", error)\n      return undefined\n    }\n  }\n}\n\nfunction saveToLocalStorage(title: string, location: string): void {\n  localStorage.setItem(localStorageKey, JSON.stringify({ title, location }))\n}\n\ninterface Event {\n  title: string\n  location: string\n}\n\nexport function consumeLocalStorageEvent() {\n  const eventString = localStorage.getItem(localStorageKey)\n  if (typeof eventString === \"string\") {\n    localStorage.removeItem(localStorageKey)\n    try {\n      const event: Event = JSON.parse(eventString)\n      trackGaPageView(event)\n    } catch (e) {\n      logger.warn(\"Could not consume pageView\", e)\n    }\n  }\n}\n","export default function (delay: number) {\n  let timeoutId: ReturnType<typeof setTimeout> | undefined\n  let leadingExecuted = false\n\n  return (callback: () => void) => {\n    if (!leadingExecuted) {\n      callback()\n      leadingExecuted = true\n    } else {\n      if (timeoutId) {\n        clearTimeout(timeoutId)\n      }\n      timeoutId = setTimeout(async () => {\n        await callback()\n        leadingExecuted = false\n      }, delay)\n    }\n  }\n}\n","import { logger } from \"@nosto/search-js/utils\"\nimport { DefaultState } from \"./state\"\n\ntype Items = NonNullable<DefaultState[\"history\"]>\n\nexport function createHistory(size: number) {\n  const localStorageKey = \"nosto:autocomplete:history\"\n  let items = get()\n\n  function get(): Items {\n    try {\n      return JSON.parse(localStorage.getItem(localStorageKey) ?? \"[]\") ?? []\n    } catch (err) {\n      logger.error(\"Could not get history items.\", err)\n      return []\n    }\n  }\n\n  function set(data: Items) {\n    try {\n      localStorage.setItem(localStorageKey, JSON.stringify(data))\n    } catch (err) {\n      logger.error(\"Could not set history items.\", err)\n    }\n  }\n\n  function add(item: string) {\n    set((items = [{ item }, ...(items?.filter(v => v.item !== item) || [])].slice(0, size)))\n  }\n\n  function clear() {\n    set((items = []))\n  }\n\n  function remove(item: string) {\n    set((items = items.filter(v => v.item !== item)))\n  }\n\n  function getItems() {\n    return items\n  }\n\n  return {\n    add,\n    clear,\n    remove,\n    getItems\n  }\n}\n\nexport type History = ReturnType<typeof createHistory>\n","import { recordSearchClick, recordSearchSubmit } from \"./client\"\nimport { AutocompleteConfig, getDefaultConfig } from \"./config\"\nimport { Dropdown, createDropdown, parseHit } from \"./dropdown\"\nimport { DefaultState, StateActions, getStateActions } from \"../utils/state\"\nimport { bindClickOutside, findAll } from \"../utils/dom\"\nimport { consumeLocalStorageEvent, getGaTrackUrl, isGaEnabled, trackGaPageView } from \"../utils/ga\"\nimport createDebouncer from \"../utils/debounce\"\nimport { createHistory } from \"../utils/history\"\nimport { bindInput, disableNativeAutocomplete } from \"@nosto/search-js/utils\"\nimport type { SearchOptions } from \"@nosto/nosto-js/client\"\nimport { logger } from \"@nosto/search-js/utils\"\n\nexport type AutocompleteInstance = {\n  /**\n   * Open the dropdown.\n   */\n  open(): void\n  /**\n   * Close the dropdown.\n   */\n  close(): void\n  /**\n   * Destroy the autocomplete instance.\n   */\n  destroy(): void\n}\n\nexport type SearchAutocompleteOptions = Pick<SearchOptions, \"isKeyword\" | \"redirect\">\n\n/**\n * @param config Autocomplete configuration.\n * @returns Autocomplete instance.\n * @group Autocomplete\n * @category Core\n * @example\n * ```js\n * import { autocomplete } from '@nosto/autocomplete';\n *\n * // Basic usage\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: (container, state) => {\n *     container.innerHTML = `\n *        <div>\n *         <h1>${state.query}</h1>\n *        <ul>\n *        ${state.response.products\n *          .map((product) => `<li>${product.name}</li>`)\n *          .join('')}\n *       </ul>\n *     </div>\n *    `;\n *   },\n *   fetch: {\n *     products: {\n *       fields: ['name', 'url', 'imageUrl', 'price', 'listPrice', 'brand'],\n *       size: 5\n *     },\n *     keywords: {\n *       size: 5,\n *       fields: ['keyword', '_highlight.keyword'],\n *       highlight: {\n *         preTag: `<strong>`,\n *         postTag: '</strong>'\n *       }\n *     }\n *   }\n * });\n *\n * // Liquid template.\n * import { autocomplete, fromRemoteLiquidTemplate, fromLiquidTemplate, defaultLiquidTemplate } from '@nosto/autocomplete/liquid';\n *\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: fromRemoteLiquidTemplate('autocomplete.liquid'),\n *   // Or:\n *   render: window.nostoAutocomplete.fromLiquidTemplate(defaultLiquidTemplate),\n *   ...\n * });\n *\n * // Mustache template.\n * import { autocomplete, fromRemoteMustacheTemplate, fromMustacheTemplate, defaultMustacheTemplate } from '@nosto/autocomplete/mustache';\n *\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: fromRemoteMustacheTemplate('autocomplete.mustache'),\n *   // Or:\n *   render: fromMustacheTemplate(defaultMustacheTemplate),\n *   ...\n * });\n *\n * // React example.\n * import { autocomplete, Autocomplete } from '@nosto/autocomplete/react';\n * import ReactDOM from 'react-dom';\n *\n * let reactRoot;\n *\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: function (container, state) {\n *     if (!reactRoot) {\n *       reactRoot = ReactDOM.createRoot(container);\n *     }\n *     reactRoot.render(<Autocomplete {...state} />);\n *   },\n *   ...\n * });\n * ```\n */\nexport function autocomplete<State = DefaultState>(config: AutocompleteConfig<State>): AutocompleteInstance {\n  const fullConfig = {\n    ...getDefaultConfig<State>(),\n    ...config\n  } satisfies AutocompleteConfig<State>\n\n  const history = fullConfig.historyEnabled ? createHistory(fullConfig.historySize) : undefined\n\n  const debounce = createDebouncer(300)\n\n  if (isGaEnabled(config)) {\n    setTimeout(consumeLocalStorageEvent, 1000)\n  }\n\n  const dropdowns = findAll(config.inputSelector, HTMLInputElement).map(inputElement => {\n    const actions = getStateActions({\n      config: fullConfig,\n      history,\n      input: inputElement\n    })\n\n    const dropdown = createInputDropdown({\n      input: inputElement,\n      config: fullConfig,\n      actions\n    })\n\n    if (!dropdown) {\n      return\n    }\n\n    disableNativeAutocomplete(inputElement)\n\n    const input = bindInput(\n      inputElement,\n      {\n        onInput: async value => {\n          debounce(async () => {\n            const state = await actions.updateState(value)\n            dropdown.update(state)\n          })\n        },\n        onClick() {\n          dropdown.resetHighlight()\n        },\n        onFocus() {\n          dropdown.show()\n        },\n        onSubmit() {\n          if (dropdown.isOpen() && dropdown.hasHighlight()) {\n            const data = dropdown.getHighlight()?.dataset?.nsHit\n            if (data) {\n              trackClick({\n                config: fullConfig,\n                data,\n                query: inputElement.value\n              })\n            }\n            dropdown.handleSubmit()\n          } else {\n            submitWithContext({\n              actions,\n              config: fullConfig\n            })(inputElement.value)\n          }\n        },\n        onKeyDown(_, key) {\n          if (key === \"Escape\") {\n            dropdown.hide()\n          } else if (key === \"ArrowDown\") {\n            if (dropdown.isOpen()) {\n              dropdown.goDown()\n            } else {\n              dropdown.show()\n            }\n          } else if (key === \"ArrowUp\") {\n            if (dropdown.isOpen()) {\n              dropdown.goUp()\n            }\n          }\n        }\n      },\n      {\n        nativeSubmit: fullConfig.nativeSubmit\n      }\n    )\n\n    const clickOutside = bindClickOutside([dropdown.container, inputElement], () => {\n      dropdown.hide()\n    })\n\n    return {\n      open() {\n        dropdown.show()\n      },\n      close() {\n        dropdown.hide()\n      },\n      destroy() {\n        input.destroy()\n        clickOutside.destroy()\n        dropdown.destroy()\n      }\n    }\n  })\n\n  return {\n    destroy() {\n      dropdowns.forEach(dropdown => dropdown?.destroy())\n    },\n    open() {\n      dropdowns.forEach(dropdown => dropdown?.open())\n    },\n    close() {\n      dropdowns.forEach(dropdown => dropdown?.close())\n    }\n  }\n}\n\nfunction createInputDropdown<State>({\n  input,\n  config,\n  actions\n}: {\n  input: HTMLInputElement\n  config: AutocompleteConfig<State>\n  actions: StateActions<State>\n}): Dropdown<State> | undefined {\n  const dropdownElements =\n    typeof config.dropdownSelector === \"function\"\n      ? findAll(config.dropdownSelector(input), HTMLElement)\n      : findAll(config.dropdownSelector, HTMLElement)\n\n  if (dropdownElements.length === 0) {\n    logger.error(`No dropdown element found for input ${input}`)\n    return\n  } else if (dropdownElements.length > 1) {\n    logger.error(`Multiple dropdown elements found for input ${input}, using the first element`)\n  }\n\n  const dropdownElement = dropdownElements[0]\n\n  return createDropdown<State>(\n    dropdownElement,\n    actions.updateState(input.value),\n    config.render,\n    submitWithContext({\n      actions,\n      config\n    }),\n    value => (input.value = value),\n    config.routingHandler!,\n    {\n      removeHistory: async function ({ data, update }) {\n        if (data === \"all\") {\n          const state = await actions.clearHistory()\n          return update(state)\n        } else if (data) {\n          const state = await actions.removeHistoryItem(data)\n          return update(state)\n        }\n      },\n      hit: function ({ data }) {\n        if (data) {\n          trackClick({ config, data, query: input.value })\n        }\n      }\n    }\n  )\n}\n\nasync function trackClick<State>({\n  config,\n  data,\n  query\n}: {\n  config: AutocompleteConfig<State>\n  data: string\n  query: string\n}) {\n  if (!config.googleAnalytics && !config.nostoAnalytics) {\n    return\n  }\n\n  const parsedHit = parseHit(data)\n\n  if (config.nostoAnalytics) {\n    if (parsedHit) {\n      // @ts-expect-error type mismatch\n      recordSearchClick(parsedHit)\n    }\n  }\n\n  if (isGaEnabled(config)) {\n    if (parsedHit._redirect) {\n      trackGaPageView({\n        delay: true,\n        location: getGaTrackUrl(parsedHit.keyword, config)\n      })\n    }\n\n    if (parsedHit.url) {\n      trackGaPageView({\n        delay: true,\n        location: getGaTrackUrl(query, config)\n      })\n    }\n  }\n}\n\nfunction submitWithContext<State>(context: { config: AutocompleteConfig<State>; actions: StateActions<State> }) {\n  return async (value: string, options?: SearchAutocompleteOptions) => {\n    const { config, actions } = context\n    const { redirect = false } = options ?? {}\n\n    if (value.length > 0) {\n      if (config.historyEnabled) {\n        actions.addHistoryItem(value)\n      }\n\n      if (config.nostoAnalytics) {\n        recordSearchSubmit(value)\n      }\n\n      if (isGaEnabled(config)) {\n        trackGaPageView({\n          delay: true,\n          location: getGaTrackUrl(value, config)\n        })\n      }\n\n      if (!redirect && typeof config?.submit === \"function\") {\n        config.submit(value, config, options)\n      }\n    }\n  }\n}\n","import { s as y } from \"../index.es-XNBESE3P.js\";\nconst g = {\n  defaultCurrency: \"EUR\",\n  defaultLocale: \"en-US\",\n  /** @hidden  */\n  currencySettings: {}\n}, p = {\n  EUR: \"de-DE\",\n  GBP: \"en-GB\",\n  USD: \"en-US\",\n  AUD: \"en-AU\",\n  CAD: \"en-CA\",\n  //India, Afghanistan, Bangladesh, Bhutan, Myanmar, Nepal, and Pakistan uses lakhs and crores notation\n  INR: \"en-IN\",\n  AFN: \"en-IN\",\n  BDT: \"en-IN\",\n  BTN: \"en-IN\",\n  MMK: \"en-IN\",\n  NPR: \"en-IN\",\n  PKR: \"en-IN\"\n};\nfunction d(u = {}) {\n  const i = {\n    ...g,\n    ...u\n  };\n  u.currencySettings || y((t) => {\n    i.currencySettings = t.internal.getSettings().currencySettings ?? {};\n  });\n  function s(t, e) {\n    const { defaultCurrency: n, currencySettings: r, defaultLocale: o } = i, a = e ?? n, f = p[a] ?? o;\n    if (a in r) {\n      const c = r[a], l = new Intl.NumberFormat(f, {\n        useGrouping: !!c.groupingSeparator,\n        minimumFractionDigits: c.decimalPlaces,\n        maximumFractionDigits: c.decimalPlaces\n      }).formatToParts(t).map((m) => m.type === \"group\" ? c.groupingSeparator : m.type === \"decimal\" ? c.decimalCharacter : m.value).join(\"\");\n      return c?.currencyBeforeAmount ? `${c.currencyToken}${l}` : `${l}${c?.currencyToken}`;\n    }\n    return new Intl.NumberFormat(f, {\n      style: \"currency\",\n      currency: a\n    }).format(t);\n  }\n  return {\n    formatCurrency: s\n  };\n}\nfunction S(u) {\n  const { formatCurrency: i } = d(u);\n  function s(e, n) {\n    const r = {};\n    return e.price !== void 0 && (r.priceText = i(e.price, n)), e.listPrice !== void 0 && (r.listPriceText = i(e.listPrice, n)), Object.assign({}, e, r);\n  }\n  function t(e) {\n    return e.price !== void 0 || e.listPrice !== void 0;\n  }\n  return function(n) {\n    if (!t(n))\n      return n;\n    const r = s(n, n.priceCurrencyCode);\n    return r.skus && r.skus.some(t) && (r.skus = r.skus.map((o) => t(o) ? s(o, n.priceCurrencyCode) : o)), r;\n  };\n}\nexport {\n  d as getCurrencyFormatting,\n  S as priceDecorator\n};\n","import { autocomplete } from \"./autocomplete\"\nimport type { AutocompleteConfig } from \"./config\"\nimport type { DefaultState } from \"../index\"\n\ntype TemplateProps = {\n  handler: (template: string) => AutocompleteConfig<DefaultState>[\"render\"]\n  defaultTemplate: string\n}\n\nexport async function initAutocomplete(element: HTMLElement, { handler, defaultTemplate }: TemplateProps) {\n  const templateContent = element.querySelector<HTMLScriptElement>(\"script[autocomplete-template]\")?.textContent\n\n  const config = getConfigFromScript(element)\n  if (!Object.keys(config).length) {\n    throw new Error(\"NostoAutocomplete: Missing required config.\")\n  }\n  return autocomplete({\n    ...config,\n    nativeSubmit: true,\n    render: handler(templateContent ?? defaultTemplate),\n    submit(value) {\n      element.querySelector<HTMLInputElement>(config.inputSelector)!.value = value\n      element.querySelector(\"form\")?.submit()\n    }\n  })\n}\n\nfunction getConfigFromScript(element: HTMLElement) {\n  const config = element.querySelector(\"script[autocomplete-config]\")\n  return config ? JSON.parse(config.textContent!) : {}\n}\n","import { initAutocomplete } from \"../lib/components\"\nimport { fromMustacheTemplate, defaultMustacheTemplate } from \"./fromMustacheTemplate\"\n\n/**\n * Nosto Autocomplete Web Component using Mustache templates.\n *\n * This component integrates the Nosto Autocomplete functionality with Mustache templating.\n * It fetches the configuration from a script tag, compiles the Mustache template,\n * and initializes the autocomplete with the compiled template as the render function.\n * If a custom template isn't passed, the component will use the default Liquid template.\n *\n * @example\n * ```html\n * <nosto-autocomplete>\n *   <form>\n *     <input type=\"text\" id=\"input\" />\n *     <div id=\"results\"></div>\n *   </form>\n *   <script autocomplete-config type=\"application/json\">\n *     {\n *       \"inputSelector\": \"#input\",\n *       \"dropdownSelector\": \"#results\",\n *       \"fetch\": {\n *         \"products\": {\n *           \"fields\": [\"name\", \"url\", \"imageUrl\", \"price\", \"listPrice\", \"brand\"],\n *           \"size\": 5\n *         },\n *         \"keywords\": {\n *           \"size\": 5,\n *           \"fields\": [\"keyword\", \"_highlight.keyword\"]\n *         }\n *       }\n *     }\n *   </script>\n *   <script type=\"text/x-mustache-template\" autocomplete-template>\n *     <h1>{{query}}</h1>\n *     <ul>\n *       {{#products}}\n *         <li>{{name}}</li>\n *       {{/products}}\n *     </ul>\n *   </script>\n * </nosto-autocomplete>\n * ```\n */\nexport class NostoAutocomplete extends HTMLElement {\n  async connectedCallback() {\n    return initAutocomplete(this, {\n      handler: fromMustacheTemplate,\n      defaultTemplate: defaultMustacheTemplate\n    })\n  }\n}\n\ncustomElements.define(\"nosto-autocomplete\", NostoAutocomplete)\n"],"names":["fromMustacheTemplate","template","options","Mustache","helpers","container","state","o","n","s","g","recordSearchClick","hit","nostojs","api","recordSearchSubmit","query","c","r","u","S","f","a","I","i","l","m","d","O","C","t","e","h","R","b","k","y","T","z","E","p","w","N","W","_","D","M","j","J","V","K","x","defaultProductFields","search","fields","facets","size","from","response","searchFn","defaultGaConfig","getDefaultConfig","url","config","v","createDropdown","initialState","render","submit","updateInput","routingHandler","onClickBindings","elements","unbindCallbacks","isEmpty","selectedIndex","handleElementSubmit","el","parsedHit","parseHit","hide","loadElements","bindElementSubmit","bindDataCallbacks","key","callback","dataKey","data","onClick","update","onSubmit","highlight","index","prevIndex","dispose","resetHighlight","show","clear","isOpen","goDown","goUp","hasHighlight","handleSubmit","getHighlight","destroy","init","error","logger","CancellableError","makeCancellable","promise","hasCanceled_","resolve","reject","val","getStateActions","history","input","cancellable","fetchState","value","getHistoryState","updateState","inputValue","addHistoryItem","item","removeHistoryItem","clearHistory","findAll","selector","filterType","parents","target","parentList","element","parent","bindClickOutside","event","localStorageKey","trackGaPageView","delay","title","location","saveToLocalStorage","accounts","trackers","isGaEnabled","getGaTrackUrl","gaConfig","consumeLocalStorageEvent","eventString","timeoutId","leadingExecuted","createHistory","items","get","err","set","add","remove","getItems","autocomplete","fullConfig","debounce","createDebouncer","dropdowns","inputElement","actions","dropdown","createInputDropdown","disableNativeAutocomplete","bindInput","trackClick","submitWithContext","clickOutside","dropdownElements","dropdownElement","context","redirect","initAutocomplete","handler","defaultTemplate","templateContent","getConfigFromScript","NostoAutocomplete","defaultMustacheTemplate"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDO,SAASA,EAA0DC,GAAkBC,GAAmB;AAC7G,MAAIC,MAAa;AACf,UAAM,IAAI,MAAM,0FAA0F;AAG5G,QAAM,EAAE,SAAAC,EAAAA,IAAYF,KAAW,CAAA;AAE/B,SAAO,CAACG,GAAwBC,OAC9BD,EAAU,YAAYF,EAAS,OAAOF,GAAU;AAAA,IAC9C,GAAGK;AAAAA,IACH,kBAAkB;AAAA,IAClB,QAAQ,WAAY;AAClB,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B;AAAA,IACA,eAAe,WAAY;AACzB,aAAO,KAAK,cAAc,KAAK;AAAA,IACjC;AAAA,IACA,GAAGF;AAAAA,EAAA,CACJ,GAEM,QAAQ;AAEnB;ACxEA,SAASG,IAAI;AACX,SAAO,UAAU,OAAO,WAAW,SAASC,GAAG;AAC7C,KAAC,OAAO,QAAQ,IAAI,OAAO,QAAQ,KAAK,CAAA,GAAI,KAAKA,CAAC;AAAA,EACpD;AACF;AACA,eAAeC,EAAED,GAAG;AAClB,SAAO,OAAO,QAAQA,CAAC;AACzB;AAEA,OAAO,SAAS,QAAQD,EAAC,GAAIE,EAAE,CAACD,MAAM;AAChC,EAAAA,EAAE,SAAS,YAAW;AAC5B,CAAC,ICsCD,OAAO,SAAS,OAAOE,EAAC;AC9CjB,SAASC,GAAkBC,GAAgB;AAChDC,EAAAA,EAAQ,CAAAC,MAAOA,EAAI,kBAAkB,gBAAgBF,CAAG,CAAC;AAC3D;AAEO,SAASG,GAAmBC,GAAe;AAChDH,EAAAA,EAAQ,CAAAC,MAAOA,EAAI,mBAAmBE,CAAK,CAAC;AAC9C;ACTA,SAASR,IAAI;AACX,SAAO,UAAU,OAAO,WAAW,SAASD,GAAG;AAC7C,KAAC,OAAO,QAAQ,IAAI,OAAO,QAAQ,KAAK,CAAA,GAAI,KAAKA,CAAC;AAAA,EACpD;AACF;AACA,eAAeE,EAAEF,GAAG;AAClB,SAAO,OAAO,QAAQA,CAAC;AACzB;AAEA,OAAO,SAAS,QAAQC,EAAC,GAAIC,EAAE,CAACF,MAAM;AAChC,EAAAA,EAAE,SAAS,YAAW;AAC5B,CAAC,IASD,OAAO,SAAS,OAAOC,EAAC;ACnBxB,SAASS,EAAE,GAAG;AACZ,SAAO,OAAO,CAAC,MAAM;AACvB;AACA,SAASP,EAAE,GAAG;AACZ,MAAI,CAACO,EAAE,CAAC;AACN,WAAO;AACT,QAAM,IAAI,EAAE;AACZ,MAAI,MAAM;AACR,WAAO;AACT,QAAMC,IAAI,EAAE;AACZ,SAAO,EAAE,CAACD,EAAEC,CAAC,KAAK,CAACA,EAAE,eAAe,eAAe;AACrD;AACA,SAASC,EAAE,GAAG,GAAG;AACf,MAAI,MAAM;AACR,WAAO;AACT,MAAI,aAAa,QAAQ,aAAa;AACpC,WAAO,EAAE,cAAc,EAAE,QAAO;AAClC,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC;AACrC,WAAO,EAAE,WAAW,EAAE,SAAS,KAAK,EAAE,MAAM,CAACD,GAAGV,MAAMW,EAAED,GAAG,EAAEV,CAAC,CAAC,CAAC;AAClE,MAAIE,EAAE,CAAC,KAAKA,EAAE,CAAC,GAAG;AAChB,UAAMQ,IAAI,OAAO,QAAQ,CAAC;AAC1B,WAAOA,EAAE,WAAW,OAAO,KAAK,CAAC,EAAE,SAAS,KAAKA,EAAE,MAAM,CAAC,CAACV,GAAGY,CAAC,MAAMD,EAAEC,GAAG,EAAEZ,CAAC,CAAC,CAAC;AAAA,EACjF;AACA,SAAO;AACT;AACA,SAASa,IAAI;AACX,QAAM,IAAoB,oBAAI,IAAG;AACjC,SAAO;AAAA,IACL,QAAQ,GAAG;AACT,aAAO,EAAE,IAAI,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,QAAQ,GAAGH,GAAG;AACZ,QAAE,IAAI,GAAGA,CAAC;AAAA,IACZ;AAAA,IACA,WAAW,GAAG;AACZ,QAAE,OAAO,CAAC;AAAA,IACZ;AAAA,IACA,QAAQ;AACN,QAAE,MAAK;AAAA,IACT;AAAA,IACA,IAAI,GAAG;AACL,aAAO,MAAM,KAAK,EAAE,KAAI,CAAE,EAAE,CAAC,KAAK;AAAA,IACpC;AAAA,IACA,IAAI,SAAS;AACX,aAAO,EAAE;AAAA,IACX;AAAA,EACJ;AACA;AACA,SAASI,EAAE,GAAG;AACZ,SAAO,IAAI,MAAM;AACfC,IAAAA,EAAE,CAACL,MAAM;AACP,OAACA,EAAE,SAAS,QAAQ,KAAK,UAAS,IAAK,QAAQ,CAAC,IAAIA,EAAE,SAAS,OAAO,CAAC,GAAG,GAAG,CAAC;AAAA,IAChF,CAAC;AAAA,EACH;AACF;AACA,MAAMM,IAAI;AAAA,EACR,OAAOF,EAAE,OAAO;AAAA,EAChB,MAAMA,EAAE,MAAM;AAAA,EACd,MAAMA,EAAE,MAAM;AAAA,EACd,OAAOA,EAAE,OAAO;AAClB;AACA,SAASG,GAAE,GAAG,GAAGP,GAAG;AAClB,MAAI;AACF,UAAMV,IAAI,KAAK,UAAU,CAAC;AAC1B,IAAAU,EAAE,QAAQ,GAAGV,CAAC;AAAA,EAChB,SAASA,GAAG;AACV,IAAAgB,EAAE,KAAKhB,CAAC;AAAA,EACV;AACF;AACA,SAASkB,GAAE,GAAG,GAAG;AACf,MAAI;AACF,UAAMR,IAAI,EAAE,QAAQ,CAAC;AACrB,QAAIA;AACF,aAAO,KAAK,MAAMA,CAAC;AAAA,EACvB,SAASA,GAAG;AACV,IAAAM,EAAE,KAAKN,CAAC;AAAA,EACV;AACF;AAQA,IAAIX,GAAGE;AACP,IAAI;AACF,EAAAF,IAAI,OAAO,cAAcE,IAAI,OAAO;AACtC,SAAS,GAAG;AACV,EAAAe,EAAE,KAAK,CAAC,GAAGjB,IAAIc,EAAC,GAAIZ,IAAIY,EAAC;AAC3B;AAIA,SAASM,GAAE,GAAG,GAAG;AACfF,EAAAA,GAAE,GAAG,GAAGhB,CAAC;AACX;AAIA,SAASmB,GAAE,GAAG;AACZ,SAAOF,GAAE,GAAGjB,CAAC;AACf;ACrGA,eAAeoB,GAAEC,GAAG,EAAE,eAAeC,GAAG,GAAG,EAAC,GAAItB,GAAG;AACjD,QAAMS,IAAI,MAAMT,EAAEqB,GAAG,CAAC;AACtB,MAAI,CAACZ,EAAE,UAAU,MAAM,UAAU,CAACa,GAAG;AACnC,WAAOb;AACT,QAAMD,IAAI,CAACV,MAAMwB,EAAE,OAAO,CAACP,GAAGF,MAAMA,EAAEE,CAAC,GAAGjB,CAAC;AAC3C,SAAO;AAAA,IACL,GAAGW;AAAA,IACH,UAAU;AAAA,MACR,GAAGA,EAAE;AAAA,MACL,MAAMA,EAAE,SAAS,KAAK,IAAID,CAAC;AAAA,IACjC;AAAA,EACA;AACA;AACA,MAAMe,IAAI,yBAAyBC,KAAI,KAAK;AAC5C,SAASC,GAAEJ,GAAGC,GAAG;AACfrB,EAAAA,GAAEsB,GAAG,EAAE,OAAOF,GAAG,QAAQC,GAAG,SAAS,KAAK,IAAG,GAAI;AACnD;AACA,SAASI,GAAEL,GAAG;AACZ,QAAMC,IAAIK,GAAEJ,CAAC;AACb,MAAI,CAACD,KAAK,CAACM,GAAEN,CAAC;AACZ,WAAO;AACT,QAAM,IAAIJ,EAAEI,EAAE,KAAK;AACnB,SAAO,CAACN,EAAEE,EAAEG,CAAC,GAAG,CAAC,KAAK,KAAK,IAAG,IAAKC,EAAE,UAAUE,KAAI,OAAOF,EAAE;AAC9D;AACA,SAASJ,EAAEG,GAAG;AACZ,QAAMC,IAAI;AAAA,IACR,GAAGD;AAAA,IACH,MAAM;AAAA,IACN,UAAU;AAAA,MACR,GAAGA,EAAE;AAAA,MACL,MAAM;AAAA,IACZ;AAAA,EACA;AACE,SAAO,KAAK,MAAM,KAAK,UAAUC,CAAC,CAAC;AACrC;AACA,SAASM,GAAEP,GAAG;AACZ,SAAO,OAAOA,KAAK,YAAYA,MAAM,QAAQ,WAAWA,KAAK,YAAYA,KAAK,aAAaA;AAC7F;AACA,eAAeQ,GAAER,GAAG,EAAE,oBAAoBC,GAAG,GAAG,EAAC,GAAItB,GAAG;AACtD,MAAI,CAACsB;AACH,WAAOtB,EAAEqB,GAAG,CAAC;AACf,QAAMZ,IAAI,MAAMqB,GAAET,GAAG,GAAGrB,CAAC;AACzB,SAAOyB,GAAEJ,GAAGZ,CAAC,GAAGA;AAClB;AACA,eAAeqB,GAAET,GAAGC,GAAG,GAAG;AACxB,QAAM,EAAE,MAAMtB,IAAI,GAAG,MAAMS,IAAI,MAAMY,EAAE,YAAY,CAAA,GAAIb,IAAIkB,GAAEL,CAAC;AAC9D,MAAI,CAACb;AACH,WAAO,MAAM,EAAEa,GAAGC,CAAC;AACrB,QAAMxB,IAAIU,GAAG,UAAU,QAAQ,GAAGO,IAAIP,GAAG,UAAU,QAAQ,CAAA;AAC3D,MAAIC,MAAMX;AACR,WAAOU;AACT,MAAIC,IAAIX;AACN,WAAO;AAAA,MACL,GAAGU;AAAA,MACH,UAAU;AAAA,QACR,GAAGA,EAAE;AAAA,QACL,MAAMC;AAAA,QACN,MAAMM,EAAE,MAAM,GAAGN,CAAC;AAAA,QAClB,OAAOD,EAAE,UAAU,SAAS;AAAA,MACpC;AAAA,IACA;AACE,QAAMK,IAAIJ,IAAIM,EAAE,QAAQgB,IAAI/B,IAAI,IAAIA,IAAI,IAAIS,IAAII,GAAGmB,IAAI;AAAA,IACrD,GAAGX;AAAA,IACH,UAAU;AAAA,MACR,GAAGA,EAAE;AAAA,MACL,MAAMU;AAAA,MACN,MAAMlB;AAAA,IACZ;AAAA,EACA,GAAKD,IAAI,MAAM,EAAEoB,GAAGV,CAAC;AACnB,SAAO;AAAA,IACL,GAAGd;AAAA,IACH,UAAU;AAAA,MACR,GAAGA,EAAE;AAAA,MACL,MAAMC;AAAA,MACN,MAAM,CAAC,GAAGD,EAAE,UAAU,QAAQ,IAAI,GAAGI,EAAE,UAAU,QAAQ,EAAE;AAAA,MAC3D,OAAOA,EAAE,UAAU,SAAS;AAAA,IAClC;AAAA,EACA;AACA;AACA,MAAMqB,KAAI,KAAKvB,IAAoB,oBAAI,IAAG;AAC1C,SAASwB,GAAEb,GAAGC,GAAG;AACf,QAAM,IAAIZ,EAAE,IAAIW,CAAC;AACjB,MAAI,CAAC,EAAG;AACR,QAAMrB,IAAI,KAAK,IAAG,IAAK,EAAE,UAAUiC,IAAGxB,IAAIO,EAAEM,GAAG,EAAE,KAAK;AACtD,MAAItB,KAAK,CAACS,GAAG;AACX,IAAAC,EAAE,OAAOW,CAAC;AACV;AAAA,EACF;AACA,SAAO,EAAE;AACX;AACA,SAASc,GAAEd,GAAGC,GAAG,GAAG;AAClB,EAAAZ,EAAE,IAAIW,GAAG;AAAA,IACP,OAAOC;AAAA,IACP,QAAQ;AAAA,IACR,SAAS,KAAK,IAAG;AAAA,EACrB,CAAG;AACH;AACA,eAAec,GAAEf,GAAGC,GAAG,GAAG;AACxB,MAAI,CAACA,EAAE;AACL,WAAO,EAAED,GAAGC,CAAC;AACf,QAAMtB,IAAI,KAAK,UAAUqB,CAAC,GAAGZ,IAAIyB,GAAElC,GAAGqB,CAAC;AACvC,MAAIZ,EAAG,QAAOA;AACd,QAAMD,IAAI,MAAM,EAAEa,GAAGC,CAAC;AACtB,SAAOa,GAAEnC,GAAGqB,GAAGb,CAAC,GAAGA;AACrB;AACA,eAAe6B,GAAEhB,GAAGC,GAAG,GAAG;AACxB,MAAI,CAACA,EAAE;AACL,WAAO,EAAED,GAAGC,CAAC;AACf,QAAMtB,IAAI,MAAM,EAAEqB,GAAGC,CAAC;AACtB,MAAItB,EAAE,UAAU,MAAM,QAAQ;AAC5B,UAAMS,IAAIT,EAAE,SAAS,KAAK,KAAK,CAACQ,MAAMA,EAAE,YAAYa,EAAE,SAASb,EAAE,SAAS;AAC1E,IAAAC,KAAKA,EAAE,cAAc,OAAO,SAAS,OAAOA,EAAE;AAAA,EAChD;AACA,SAAOT;AACT;AACA,SAASmB,GAAEE,GAAG;AACZ,SAAO,IAAI,QAAQ,CAACC,MAAM,WAAWA,GAAGD,CAAC,CAAC;AAC5C;AACA,eAAeiB,GAAEjB,GAAG,EAAE,YAAYC,IAAI,GAAG,eAAe,IAAI,GAAG,GAAGtB,EAAC,GAAIS,GAAG;AACxE,MAAID,IAAI;AACR;AACE,QAAI;AACF,aAAO,MAAMC,EAAEY,GAAGrB,CAAC;AAAA,IACrB,SAASF,GAAG;AACV,UAAIU,KAAKc;AACP,cAAMxB;AACR,UAAI,CAACyC,GAAEzC,CAAC;AACN,cAAMa,EAAE,KAAK,4BAA4Bb,CAAC,GAAGA;AAC/C,MAAAU,KAAK,MAAMW,GAAE,CAAC;AAAA,IAChB;AACJ;AACA,SAASoB,GAAElB,GAAG;AACZ,SAAO,CAACA,KAAK,OAAOA,KAAK,WAAW,KAAK,EAAE,YAAYA,MAAMmB,GAAEnB,EAAE,MAAM;AACzE;AACA,SAASmB,GAAEnB,GAAG;AACZ,SAAO,OAAOA,KAAK,aAAaA,IAAI,OAAOA,KAAK;AAClD;AACA,eAAeoB,GAAEpB,GAAGC,IAAI,IAAI;AAC1B,QAAM,IAAI,MAAM,IAAI,QAAQL,CAAC;AAC7B,SAAOyB;AAAA,IACL,EAAE;AAAA,IACFJ;AAAA,IACAD;AAAA,IACAD;AAAA,IACAP;AAAA,IACAT;AAAA,EACJ,EAAIC,GAAGC,CAAC;AACR;AACA,SAASoB,GAAErB,MAAMC,GAAG;AAClB,SAAOA,EAAE,OAAO,CAAC,GAAGtB,MAAM,CAACS,GAAGD,MAAMR,EAAES,GAAGD,GAAG,CAAC,GAAGa,CAAC;AACnD;ACrJA,MAAMsB,KAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BA,eAAsBC,EAAOrC,GAAoBd,IAAyB,IAAI;AAC5E,QAAMoD,IAAStC,EAAM,UAAU,UAAUoC,IACnCG,IAASvC,EAAM,UAAU,UAAU,CAAC,GAAG,GACvCwC,IAAOxC,EAAM,UAAU,QAAQ,IAC/ByC,IAAOzC,EAAM,UAAU,QAAQ,GAE/B0C,IAAW,MAAMC;AAAAA,IACrB;AAAA,MACE,GAAG3C;AAAAA,MACH,UAAU;AAAA,QACR,GAAGA,EAAM;AAAA,QACT,QAAAsC;AAAAA,QACA,QAAAC;AAAAA,QACA,MAAAC;AAAAA,QACA,MAAAC;AAAAA,MAAA;AAAA,IACF;AAAA,IAEFvD;AAAAA,EAAA;AAGF,SAAO,EAAE,OAAAc,GAAO,UAAA0C,EAAAA;AAClB;ACKO,MAAME,IAAkB;AAAA,EAC7B,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,SAAS;AACX;AAEO,SAASC,IAA0B;AACxC,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,eAAe,CAAA;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiBD;AAAA,IACjB,gBAAgB,CAAAE,MAAO;AACrB,eAAS,OAAOA;AAAAA,IAClB;AAAA,IACA,cAAc;AAAA,IACd,QAAQ,CAAC9C,GAAO+C,GAAQ7D,MAAY;AAC9Bc,QAAM,WAAW+C,EAAO,kBAAkBF,EAAA,EAA0B,mBACtER;AAAAA,QACE;AAAA,UACE,OAAArC;AAAAA,QAAA;AAAA,QAEF;AAAA,UACE,UAAU;AAAA,UACV,OAAO+C,EAAO,iBAAiB,SAAS;AAAA,UACxC,eAAeA,EAAO;AAAA,UACtB,GAAG7D;AAAAA,QAAA;AAAA,MACL;AAAA,IAGN;AAAA,EAAA;AAEJ;AC7IA,SAASkC,GAAEf,GAAG,EAAE,SAASM,GAAG,SAAST,GAAG,SAAS8C,GAAG,WAAW7C,GAAG,UAAUM,KAAK,EAAE,MAAMR,IAAII,EAAE,QAAQ,QAAQ,cAAcmB,EAAC,IAAK,IAAI;AACrI,QAAMjC,IAAI,CAAA;AACV,WAASiB,EAAEO,GAAGtB,GAAGa,GAAG;AAClB,IAAAS,EAAE,iBAAiBtB,GAAGa,CAAC,GAAGf,EAAE,KAAK,MAAMwB,EAAE,oBAAoBtB,GAAGa,CAAC,CAAC;AAAA,EACpE;AACA,UAAQH,KAAKM,MAAMD,EAAEH,GAAG,WAAW,CAACU,MAAM;AACxC,UAAMtB,IAAIU,IAAIE,EAAE,OAAOU,EAAE,GAAG;AAC5B,IAAAZ,MAAMY,EAAE,QAAQ,eAAeA,EAAE,QAAQ,aAAaA,EAAE,eAAc,IAAKN,KAAKM,EAAE,QAAQ,YAAYV,EAAE,UAAU,MAAM,CAACU,EAAE,UAAU,CAACtB,KAAKgB,EAAEJ,EAAE,KAAK,GAAGmB,KAAKT,EAAE,eAAc;AAAA,EAC9K,CAAC,GAAGN,KAAKR,MAAMO,EAAEP,GAAG,UAAU,CAACc,MAAM;AACnC,IAAAS,KAAKT,EAAE,eAAc,GAAIN,EAAEJ,EAAE,KAAK;AAAA,EACpC,CAAC,GAAGJ,EAAE,iBAAiB,eAAe,EAAE,QAAQ,CAACc,MAAM;AACrD,IAAAP,EAAEO,GAAG,SAAS,CAACtB,MAAM;AACnB,MAAA+B,KAAK/B,EAAE,eAAc,GAAIgB,EAAEJ,EAAE,KAAK;AAAA,IACpC,CAAC;AAAA,EACH,CAAC,IAAIM,KAAKH,EAAEH,GAAG,SAAS,MAAMM,EAAEN,EAAE,KAAK,CAAC,GAAGH,KAAKM,EAAEH,GAAG,SAAS,MAAMH,EAAEG,EAAE,KAAK,CAAC,GAAG2C,KAAKxC,EAAEH,GAAG,SAAS,MAAM2C,EAAE3C,EAAE,KAAK,CAAC,GAAG;AAAA,IACrH,UAAU;AACR,MAAAd,EAAE,QAAQ,CAACwB,MAAMA,EAAC,CAAE;AAAA,IACtB;AAAA,EACJ;AACA;AACA,SAASI,GAAEd,GAAG;AACZ,EAAAA,EAAE,aAAa,gBAAgB,KAAK;AACtC;ACfO,SAAS4C,GACd5D,GACA6D,GACAC,GACAC,GACAC,GACAC,GACAC,GACA;AACA,MAAIC,IAA0B,CAAA,GAC1BC,IAAqC,CAAA,GAErCC,IAAmB,IACnBC,IAAwB;AAE5B,WAASC,EAAoBC,GAAuB;AAClD,UAAMjE,IAAMiE,GAAI,SAAS;AAEzB,QAAIjE,GAAK;AACP,YAAMkE,IAAYC,EAASnE,CAAG;AAG9B,UAFAoE,EAAAA,GAEIF,GAAW,MAAM;AACnBV,QAAAA,EAAOU,EAAU,IAAI;AACrB;AAAA,MACF;AAEA,UAAIA,GAAW,SAAS;AACtBV,QAAAA,EAAOU,EAAU,SAAS;AAAA,UACxB,UAAU,CAAC,CAACA,GAAW;AAAA,UACvB,WAAW;AAAA,QAAA,CACZ,GAEGA,GAAW,aACbR,EAAeQ,EAAU,SAAS;AAEpC;AAAA,MACF;AAEIA,MAAAA,GAAW,OACbR,EAAeQ,EAAU,GAAG;AAAA,IAEhC;AAAA,EACF;AAEA,WAASG,IAAe;AACtBP,IAAAA,IAAU,CAACrE,EAAU,UAAU,QAE1BqE,MACHF,IAAW,MAAM,KAAkBnE,EAAU,iBAAiB,eAAe,CAAC,EAAE,IAAI,CAAAwE,OAClFK,GAAkBL,CAAE,GACbA,EACR;AAAA,EAEL;AAEA,WAASM,IAAoB;AAC3B,WAAO,QAAQZ,KAAmB,CAAA,CAAE,EAAE,IAAI,CAAC,CAACa,GAAKC,CAAQ,MAAM;AAE7D,YAAMC,IAAU,YAAYF,EAAI,QAAQ,YAAY,KAAK,EAAE,aAAa;AAExE,YAAM,KAAkB/E,EAAU,iBAAiBiF,CAAO,CAAC,EAAE,IAAI,CAAAT,MAAM;AACrE,cAAMU,KAAOV,GAAI,UAAU,KAAKO,EAAI,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAI,MAAM,CAAC,CAAC,EAAE,GACtEI,IAAU,MAAM;AACpBH,UAAAA,EAAS;AAAA,YACP,MAAAE;AAAAA,YACA,IAAAV;AAAAA,YACA,QAAAY;AAAAA,UAAA,CACD;AAAA,QACH;AAEAZ,QAAAA,EAAG,iBAAiB,SAASW,CAAO,GACpCf,EAAgB,KAAK,MAAM;AACzBI,UAAAA,EAAG,oBAAoB,SAASW,CAAO;AAAA,QACzC,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,WAASN,GAAkBL,GAAiB;AAC1C,UAAMa,IAAW,MAAM;AACrBd,MAAAA,EAAoBC,CAAE;AAAA,IACxB;AAEAA,IAAAA,EAAG,iBAAiB,SAASa,CAAQ,GACrCjB,EAAgB,KAAK,MAAM;AACzBI,MAAAA,EAAG,oBAAoB,SAASa,CAAQ;AAAA,IAC1C,CAAC;AAAA,EACH;AAEA,WAASC,EAAUC,GAAeC,GAAoB;AAKpD,QAJI,OAAOA,KAAc,YAAYrB,EAASqB,CAAS,KACrDrB,EAASqB,CAAS,EAAE,UAAU,OAAO,UAAU,GAG7C,OAAOD,KAAU,YAAYpB,EAASoB,CAAK,GAAG;AAChDpB,MAAAA,EAASoB,CAAK,GAAG,UAAU,IAAI,UAAU;AAEzC,YAAMhF,IAAM4D,EAASoB,CAAK,GAAG,SAAS;AAEtC,UAAIhF,GAAK;AACP,cAAMkE,IAAYC,EAASnE,CAAG;AAE9B,YAAIkE,EAAU,MAAM;AAClBT,UAAAA,EAAYS,EAAU,IAAI;AAC1B;AAAA,QACF;AAEA,YAAIA,EAAU,SAAS;AACrBT,UAAAA,EAAYS,EAAU,OAAO;AAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAASgB,IAAU;AACjBC,IAAAA,KACAvB,IAAW,CAAA,GACXC,EAAgB,QAAQ,CAAAT,MAAKA,EAAAA,CAAG,GAChCS,IAAkB,CAAA;AAAA,EACpB;AAEA,iBAAegB,EAAOnF,GAAc;AAClCwF,IAAAA,EAAAA,GACA,MAAM3B,EAAO9D,GAAWC,CAAK,GAG7B,WAAW,MAAM;AACf2E,MAAAA,EAAAA,GACAE,EAAAA,GACAa,EAAAA;AAAAA,IACF,GAAG,CAAC;AAAA,EACN;AAEA,WAAShB,IAAO;AACde,IAAAA,KACA1F,EAAU,MAAM,UAAU;AAAA,EAC5B;AAEA,WAAS2F,IAAO;AACTtB,IAAAA,IAGHM,EAAAA,IAFA3E,EAAU,MAAM,UAAU;AAAA,EAI9B;AAEA,WAAS4F,KAAQ;AACfH,IAAAA,KACApB,IAAU,IACVM,EAAAA;AAAAA,EACF;AAEA,WAASkB,IAAS;AAChB,WAAO7F,EAAU,MAAM,YAAY;AAAA,EACrC;AAEA,WAAS8F,KAAS;AAChB,QAAIN,IAAYlB;AAEZA,IAAAA,MAAkBH,EAAS,SAAS,IACtCG,IAAgB,IAEhBkB,IAAYlB,KAGdgB,EAAUhB,GAAekB,CAAS;AAAA,EACpC;AAEA,WAASO,KAAO;AACd,QAAIC,KAAgB;AAClB,UAAIR,IAAYlB;AAEZA,MAAAA,MAAkB,IACpBA,IAAgBH,EAAS,SAAS,IAElCqB,IAAYlB,KAGdgB,EAAUhB,GAAekB,CAAS;AAAA,IACpC;AACElB,MAAAA,IAAgBH,EAAS,SAAS,GAClCmB,EAAUhB,CAAa;AAAA,EAE3B;AAEA,WAAS2B,KAAe;AAClBJ,IAAAA,EAAAA,KAAYG,EAAAA,KAAkB7B,EAASG,CAAa,KACtDC,EAAoBJ,EAASG,CAAa,CAAC;AAAA,EAE/C;AAEA,WAAS0B,IAAe;AACtB,WAAO1B,IAAgB;AAAA,EACzB;AAEA,WAAS4B,KAAe;AACtB,WAAO/B,EAASG,CAAa;AAAA,EAC/B;AAEA,WAASoB,IAAiB;AACpBM,IAAAA,EAAAA,MACF7B,EAASG,CAAa,GAAG,UAAU,OAAO,UAAU,GACpDA,IAAgB;AAAA,EAEpB;AAEA,WAAS6B,KAAU;AACjBV,IAAAA,EAAAA,GACApB,IAAU,IACVrE,EAAU,YAAY;AAAA,EACxB;AAEA,iBAAeoG,KAAO;AACpB,UAAMnG,IAAQ,MAAM,QAAQ,QAAQ4D,CAAY;AAChD,UAAM,QAAQ,QAAQC,EAAO9D,GAAWC,CAAK,CAAC,GAG9C,WAAW,MAAM;AACf2E,MAAAA,EAAAA,GACAE,EAAAA,GACAH,EAAAA;AAAAA,IACF,GAAG,CAAC;AAAA,EACN;AACA,SAAAyB,MAEO;AAAA,IACL,QAAAhB;AAAAA,IACA,OAAAQ;AAAAA,IACA,QAAAC;AAAAA,IACA,QAAAC;AAAAA,IACA,MAAAC;AAAAA,IACA,cAAAE;AAAAA,IACA,SAAAE;AAAAA,IACA,MAAAR;AAAAA,IACA,MAAAhB;AAAAA,IACA,gBAAAe;AAAAA,IACA,cAAAM;AAAAA,IACA,cAAAE;AAAAA,IACA,WAAAlG;AAAAA,EAAA;AAEJ;AAWO,SAAS0E,EAASnE,GAAkB;AACzC,MAAI;AAEF,WAD0C,KAAK,MAAMA,CAAG,KACpC,CAAA;AAAA,EACtB,SAAS8F,GAAO;AACd,WAAAC,EAAO,KAAK,uBAAuBD,CAAK,GACjC,CAAA;AAAA,EACT;AACF;AC1QO,MAAME,WAAyB,MAAM;AAAC;AAEtC,SAASC,GAAmBC,GAAyC;AAC1E,MAAIC,IAAe;AAUnB,SAAO;AAAA,IACL,SATqB,IAAI,QAAW,CAACC,GAASC,MAEvCH,EAAQ;AAAA,MACb,CAAAI,MAAQH,IAAeE,EAAO,IAAIL,GAAiB,mBAAmB,CAAC,IAAII,EAAQE,CAAG;AAAA,MACtF,CAAAR,MAAyBO,EAAfF,IAAsB,IAAIH,GAAiB,mBAAmB,IAAYF,CAAX;AAAA,IAAA,CAE5E;AAAA,IAIC,SAAS;AACPK,MAAAA,IAAe;AAAA,IACjB;AAAA,EAAA;AAEJ;ACYO,SAASI,GAAuB;AAAA,EACrC,QAAApD;AAAAA,EACA,SAAAqD;AAAAA,EACA,OAAAC;AACF,GAIwB;AACtB,MAAIC;AAEJ,QAAMC,IAAa,CACjBC,GACAzD,GACA7D,MAEI,OAAO6D,EAAO,SAAU,aACnBA,EAAO,MAAMyD,CAAK,IAGlBnE;AAAAA,IACL;AAAA,MACE,OAAOmE;AAAAA,MACP,GAAGzD,EAAO;AAAA,IAAA;AAAA,IAEZ;AAAA,MACE,OAAOA,EAAO,iBAAiB,iBAAiB;AAAA,MAChD,UAAU;AAAA,MACV,eAAeA,EAAO;AAAA,MACtB,GAAG7D;AAAAA,IAAA;AAAA,EACL;AAKN,WAASuH,EAAgBzG,GAAmC;AAE1D,WAAO,QAAQ,QAAQ;AAAA,MACrB,OAAO;AAAA,QACL,OAAAA;AAAAA,MAAA;AAAA,MAEF,SAASoG,GAAS,SAAA;AAAA,IAAS,CAC5B;AAAA,EACH;AAEA,WAASM,EAAYC,GAAqBzH,GAAyD;AAGjG,WAFAoH,GAAa,UAETK,KAAcA,EAAW,UAAU5D,EAAO,kBAC5CuD,IAAcT,GAAgBU,EAAWI,GAAY5D,GAAQ7D,CAAO,CAAC,GAC9DoH,EAAY,WACVF,IACFK,EAAgBE,KAAc,EAAE;AAAA;AAAA,MAKvCL,GAAa,WAAW,QAAQ,QAAe,CAAA,CAAE;AAAA;AAAA,EAErD;AAEA,WAASM,EAAeC,GAAkC;AACxD,WAAIT,KACFA,EAAQ,IAAIS,CAAI,GAEXJ,EAAgBJ,EAAM,KAAK;AAAA,EACpC;AAEA,WAASS,EAAkBD,GAAkC;AAC3D,WAAIT,KACFA,EAAQ,OAAOS,CAAI,GAEdJ,EAAgBJ,EAAM,KAAK;AAAA,EACpC;AAEA,WAASU,IAAmC;AAC1C,WAAIX,KACFA,EAAQ,MAAA,GAEHK,EAAgBJ,EAAM,KAAK;AAAA,EACpC;AAEA,SAAO;AAAA,IACL,aAAAK;AAAAA,IACA,gBAAAE;AAAAA,IACA,mBAAAE;AAAAA,IACA,cAAAC;AAAAA,EAAA;AAEJ;ACvHO,SAASC,EAA2BC,GAAoBC,GAAiC;AAE9F,UADiB,OAAOD,KAAa,WAAW,MAAM,KAAK,SAAS,iBAAiBA,CAAQ,CAAC,IAAI,CAACA,CAAQ,GAC3F,OAAO,CAACjE,MAAekE,IAAalE,aAAakE,IAAa,EAAK;AACrF;AAcO,SAASC,GAAQC,GAAkBH,GAA8B;AACtE,MAAII,IAAwB,CAAA;AAC5B,SAAAL,EAAQI,CAAM,EAAE,QAAQ,CAAAE,MAAW;AACjC,UAAMC,IAASD,EAAQ;AACnBC,IAAAA,MAAW,YAAYA,aAAkB,YAC3CF,EAAW,KAAKE,CAAM,GACtBF,IAAaA,EAAW,OAAOF,GAAQI,CAAM,CAAC;AAAA,EAElD,CAAC,GACMF,EAAW,OAAO,CAAAC,MAAWL,MAAa,MAAuC;AAC1F;AAWO,SAASO,GAAiB,CAACF,GAASjB,CAAK,GAAuBhC,GAAsB;AAC3F,QAAMG,IAAU,CAACiD,MAAsB;AACrC,UAAML,IAASK,EAAM;AAEjBL,IAAAA,aAAkB,eAAeE,KAC/BF,MAAWE,KAAWF,MAAWf,KAAS,CAACc,GAAQC,CAAM,EAAE,SAASE,CAAO,KAC7EjD,EAAAA;AAAAA,EAGN;AAEA,SAAA,SAAS,iBAAiB,SAASG,CAAO,GAEnC;AAAA,IACL,SAAS,MAAM;AACb,eAAS,oBAAoB,SAASA,CAAO;AAAA,IAC/C;AAAA,EAAA;AAEJ;ACvDA,MAAMkD,IAAkB;AAEjB,SAASC,EAAgBzI,GAAkE;AAChG,QAAM,EAAE,OAAA0I,IAAQ,IAAO,OAAAC,IAAQ,SAAS,OAAO,UAAAC,IAAW,OAAO,SAAS,KAAA,IAAS5I,KAAW,CAAA;AAE9F,MAAI0I;AACFG,IAAAA,GAAmBF,GAAOC,CAAQ;AAAA,OAC7B;AACL,QAAI,UAAU,UAAU,OAAO,OAAO,QAAS,YAAY;AACzD,YAAME,IACJ,wBAAwB,UAAU,OAAO,OAAO,sBAAuB,WACnE,OAAO,KAAK,OAAO,sBAAsB,CAAA,CAAE,EAAE,OAAO,CAAAjH,MAC3CA,EAAE,UAAU,GAAG,CAAC,KAAK,IAC7B,IACD,CAAA;AAEN,UAAIiH,EAAS,SAAS;AACpB,iBAASxH,IAAI,GAAGA,IAAIwH,EAAS,QAAQxH;AACnC,iBAAO,KAAK,SAAS,aAAa;AAAA,YAChC,YAAYqH;AAAAA,YACZ,eAAeC;AAAAA,YACf,SAASE,EAASxH,CAAC;AAAA,UAAA,CACpB;AAAA;AAGH,eAAO,KAAK,SAAS,aAAa;AAAA,UAChC,YAAYqH;AAAAA,UACZ,eAAeC;AAAAA,QAAA,CAChB;AAAA,IAEL;AACA,QACE,QAAQ,UACR,OAAO,OAAO,MAAO,cACrB,YAAY,OAAO,MACnB,OAAO,OAAO,GAAG,UAAW;AAE5B,UAAI;AACF,cAAMhF,IAAM,IAAI,IAAIgF,CAAQ,GACtBG,IAAW,OAAO,GAAI,OAAA;AACxBA,QAAAA,GAAU,SAAS,KACrBA,EAAS,CAAC,GAAG,KAAK,YAAYnF,EAAI,WAAWA,EAAI,MAAM;AAAA,MAE3D,SAAS4C,GAAO;AACdC,QAAAA,EAAO,KAAK,iCAAiCD,CAAK;AAAA,MACpD;AAAA,EAEJ;AACF;AAEO,MAAMwC,IAAc,CAAQnF,MACjC,OAAOA,EAAO,mBAAoB,YAC9BA,EAAO,kBACP,OAAOA,EAAO,mBAAoB,YAAYA,EAAO,gBAAgB,SAE9DoF,IAAgB,CAAQ3B,GAA2BzD,MAAsC;AACpG,QAAMqF,IAAWF,EAAYnF,CAAM,IAC/B,OAAOA,EAAO,mBAAoB,YAChCH,IACA;AAAA,IACE,GAAGA;AAAAA,IACH,GAAGG,EAAO;AAAA,EAAA,IAEd;AAEJ,MAAIyD,KAAS4B;AACX,QAAI;AACF,aAAO,IAAI;AAAA,QACT,GAAGA,GAAU,YAAY,SAAS,QAAQ,IAAI,GAAG;AAAA,UAC/CA,EAAS;AAAA,QAAA,CACV,IAAI,mBAAmB5B,CAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,EAAE;AAAA,QACrD,OAAO,SAAS;AAAA,MAAA,EAChB,SAAA;AAAA,IACJ,SAASd,GAAO;AACdC,MAAAA,EAAO,KAAK,8BAA8BD,CAAK;AAC/C;AAAA,IACF;AAEJ;AAEA,SAASqC,GAAmBF,GAAeC,GAAwB;AACjE,eAAa,QAAQJ,GAAiB,KAAK,UAAU,EAAE,OAAAG,GAAO,UAAAC,EAAAA,CAAU,CAAC;AAC3E;AAOO,SAASO,KAA2B;AACzC,QAAMC,IAAc,aAAa,QAAQZ,CAAe;AACxD,MAAI,OAAOY,KAAgB,UAAU;AACnC,iBAAa,WAAWZ,CAAe;AACvC,QAAI;AACF,YAAMD,IAAe,KAAK,MAAMa,CAAW;AAC3C,MAAAX,EAAgBF,CAAK;AAAA,IACvB,SAAS1G,GAAG;AACV4E,MAAAA,EAAO,KAAK,8BAA8B5E,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;ACvGA,SAAAH,GAAyBgH,GAAe;AACtC,MAAIW,GACAC,IAAkB;AAEtB,SAAO,CAACnE,MAAyB;AAC1BmE,IAAAA,KAICD,KACF,aAAaA,CAAS,GAExBA,IAAY,WAAW,YAAY;AACjC,YAAMlE,EAAAA,GACNmE,IAAkB;AAAA,IACpB,GAAGZ,CAAK,MATRvD,EAAAA,GACAmE,IAAkB;AAAA,EAUtB;AACF;ACbO,SAASC,GAAcjG,GAAc;AAC1C,QAAMkF,IAAkB;AACxB,MAAIgB,IAAQC,EAAAA;AAEZ,WAASA,IAAa;AACpB,QAAI;AACF,aAAO,KAAK,MAAM,aAAa,QAAQjB,CAAe,KAAK,IAAI,KAAK,CAAA;AAAA,IACtE,SAASkB,GAAK;AACZ,aAAAjD,EAAO,MAAM,gCAAgCiD,CAAG,GACzC,CAAA;AAAA,IACT;AAAA,EACF;AAEA,WAASC,EAAItE,GAAa;AACxB,QAAI;AACF,mBAAa,QAAQmD,GAAiB,KAAK,UAAUnD,CAAI,CAAC;AAAA,IAC5D,SAASqE,GAAK;AACZjD,MAAAA,EAAO,MAAM,gCAAgCiD,CAAG;AAAA,IAClD;AAAA,EACF;AAEA,WAASE,EAAIjC,GAAc;AACzBgC,MAAKH,IAAQ,CAAC,EAAE,MAAA7B,KAAQ,GAAI6B,GAAO,OAAO,CAAA1F,MAAKA,EAAE,SAAS6D,CAAI,KAAK,CAAA,CAAG,EAAE,MAAM,GAAGrE,CAAI,CAAE;AAAA,EACzF;AAEA,WAASyC,IAAQ;AACf4D,MAAKH,IAAQ,EAAG;AAAA,EAClB;AAEA,WAASK,EAAOlC,GAAc;AAC5BgC,MAAKH,IAAQA,EAAM,OAAO,CAAA1F,MAAKA,EAAE,SAAS6D,CAAI,CAAE;AAAA,EAClD;AAEA,WAASmC,IAAW;AAClB,WAAON;AAAAA,EACT;AAEA,SAAO;AAAA,IACL,KAAAI;AAAAA,IACA,OAAA7D;AAAAA,IACA,QAAA8D;AAAAA,IACA,UAAAC;AAAAA,EAAA;AAEJ;ACiEO,SAASC,GAAmClG,GAAyD;AAC1G,QAAMmG,IAAa;AAAA,IACjB,GAAGrG,EAAAA;AAAAA,IACH,GAAGE;AAAAA,EAAA,GAGCqD,IAAU8C,EAAW,iBAAiBT,GAAcS,EAAW,WAAW,IAAI,QAE9EC,IAAWC,GAAgB,GAAG;AAEhClB,EAAAA,EAAYnF,CAAM,KACpB,WAAWsF,IAA0B,GAAI;AAG3C,QAAMgB,IAAYrC,EAAQjE,EAAO,eAAe,gBAAgB,EAAE,IAAI,CAAAuG,MAAgB;AACpF,UAAMC,IAAUpD,GAAgB;AAAA,MAC9B,QAAQ+C;AAAAA,MACR,SAAA9C;AAAAA,MACA,OAAOkD;AAAAA,IAAA,CACR,GAEKE,IAAWC,GAAoB;AAAA,MACnC,OAAOH;AAAAA,MACP,QAAQJ;AAAAA,MACR,SAAAK;AAAAA,IAAA,CACD;AAED,QAAI,CAACC;AACH;AAGFE,IAAAA,GAA0BJ,CAAY;AAEtC,UAAMjD,IAAQsD;AAAAA,MACZL;AAAAA,MACA;AAAA,QACE,SAAS,OAAM9C,MAAS;AACtB2C,UAAAA,EAAS,YAAY;AACnB,kBAAM7J,IAAQ,MAAMiK,EAAQ,YAAY/C,CAAK;AAC7CgD,YAAAA,EAAS,OAAOlK,CAAK;AAAA,UACvB,CAAC;AAAA,QACH;AAAA,QACA,UAAU;AACRkK,UAAAA,EAAS,eAAA;AAAA,QACX;AAAA,QACA,UAAU;AACRA,UAAAA,EAAS,KAAA;AAAA,QACX;AAAA,QACA,WAAW;AACT,cAAIA,EAAS,OAAA,KAAYA,EAAS,gBAAgB;AAChD,kBAAMjF,IAAOiF,EAAS,aAAA,GAAgB,SAAS;AAC3CjF,YAAAA,KACFqF,GAAW;AAAA,cACT,QAAQV;AAAAA,cACR,MAAA3E;AAAAA,cACA,OAAO+E,EAAa;AAAA,YAAA,CACrB,GAEHE,EAAS,aAAA;AAAA,UACX;AACEK,YAAAA,GAAkB;AAAA,cAChB,SAAAN;AAAAA,cACA,QAAQL;AAAAA,YAAA,CACT,EAAEI,EAAa,KAAK;AAAA,QAEzB;AAAA,QACA,UAAU1H,GAAGwC,GAAK;AACZA,gBAAQ,WACVoF,EAAS,KAAA,IACApF,MAAQ,cACboF,EAAS,OAAA,IACXA,EAAS,WAETA,EAAS,SAEFpF,MAAQ,aACboF,EAAS,OAAA,KACXA,EAAS,KAAA;AAAA,QAGf;AAAA,MAAA;AAAA,MAEF;AAAA,QACE,cAAcN,EAAW;AAAA,MAAA;AAAA,IAC3B,GAGIY,IAAetC,GAAiB,CAACgC,EAAS,WAAWF,CAAY,GAAG,MAAM;AAC9EE,MAAAA,EAAS,KAAA;AAAA,IACX,CAAC;AAED,WAAO;AAAA,MACL,OAAO;AACLA,QAAAA,EAAS,KAAA;AAAA,MACX;AAAA,MACA,QAAQ;AACNA,QAAAA,EAAS,KAAA;AAAA,MACX;AAAA,MACA,UAAU;AACRnD,QAAAA,EAAM,QAAA,GACNyD,EAAa,QAAA,GACbN,EAAS,QAAA;AAAA,MACX;AAAA,IAAA;AAAA,EAEJ,CAAC;AAED,SAAO;AAAA,IACL,UAAU;AACRH,MAAAA,EAAU,QAAQ,CAAAG,MAAYA,GAAU,SAAS;AAAA,IACnD;AAAA,IACA,OAAO;AACLH,MAAAA,EAAU,QAAQ,CAAAG,MAAYA,GAAU,MAAM;AAAA,IAChD;AAAA,IACA,QAAQ;AACNH,MAAAA,EAAU,QAAQ,CAAAG,MAAYA,GAAU,OAAO;AAAA,IACjD;AAAA,EAAA;AAEJ;AAEA,SAASC,GAA2B;AAAA,EAClC,OAAApD;AAAAA,EACA,QAAAtD;AAAAA,EACA,SAAAwG;AACF,GAIgC;AAC9B,QAAMQ,IACJ,OAAOhH,EAAO,oBAAqB,aAC/BiE,EAAQjE,EAAO,iBAAiBsD,CAAK,GAAG,WAAW,IACnDW,EAAQjE,EAAO,kBAAkB,WAAW;AAElD,MAAIgH,EAAiB,WAAW,GAAG;AACjCpE,IAAAA,EAAO,MAAM,uCAAuCU,CAAK,EAAE;AAC3D;AAAA,EACF,MAAW0D,CAAAA,EAAiB,SAAS,KACnCpE,EAAO,MAAM,8CAA8CU,CAAK,2BAA2B;AAG7F,QAAM2D,IAAkBD,EAAiB,CAAC;AAE1C,SAAO9G;AAAAA,IACL+G;AAAAA,IACAT,EAAQ,YAAYlD,EAAM,KAAK;AAAA,IAC/BtD,EAAO;AAAA,IACP8G,GAAkB;AAAA,MAChB,SAAAN;AAAAA,MACA,QAAAxG;AAAAA,IAAA,CACD;AAAA,IACD,CAAAyD,MAAUH,EAAM,QAAQG;AAAAA,IACxBzD,EAAO;AAAA,IACP;AAAA,MACE,eAAe,eAAgB,EAAE,MAAAwB,GAAM,QAAAE,KAAU;AAC/C,YAAIF,MAAS,OAAO;AAClB,gBAAMjF,IAAQ,MAAMiK,EAAQ,aAAA;AAC5B,iBAAO9E,EAAOnF,CAAK;AAAA,QACrB,WAAWiF,GAAM;AACf,gBAAMjF,IAAQ,MAAMiK,EAAQ,kBAAkBhF,CAAI;AAClD,iBAAOE,EAAOnF,CAAK;AAAA,QACrB;AAAA,MACF;AAAA,MACA,KAAK,SAAU,EAAE,MAAAiF,KAAQ;AACnBA,QAAAA,KACFqF,GAAW,EAAE,QAAA7G,GAAQ,MAAAwB,GAAM,OAAO8B,EAAM,OAAO;AAAA,MAEnD;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,eAAeuD,GAAkB;AAAA,EAC/B,QAAA7G;AAAAA,EACA,MAAAwB;AAAAA,EACA,OAAAvE;AACF,GAIG;AACD,MAAI,CAAC+C,EAAO,mBAAmB,CAACA,EAAO;AACrC;AAGF,QAAMe,IAAYC,EAASQ,CAAI;AAE3BxB,EAAAA,EAAO,kBACLe,KAEFnE,GAAkBmE,CAAS,GAI3BoE,EAAYnF,CAAM,MAChBe,EAAU,aACZ6D,EAAgB;AAAA,IACd,OAAO;AAAA,IACP,UAAUQ,EAAcrE,EAAU,SAASf,CAAM;AAAA,EAAA,CAClD,GAGCe,EAAU,OACZ6D,EAAgB;AAAA,IACd,OAAO;AAAA,IACP,UAAUQ,EAAcnI,GAAO+C,CAAM;AAAA,EAAA,CACtC;AAGP;AAEA,SAAS8G,GAAyBI,GAA8E;AAC9G,SAAO,OAAOzD,GAAetH,MAAwC;AACnE,UAAM,EAAE,QAAA6D,GAAQ,SAAAwG,EAAAA,IAAYU,GACtB,EAAE,UAAAC,IAAW,GAAA,IAAUhL,KAAW,CAAA;AAEpCsH,IAAAA,EAAM,SAAS,MACbzD,EAAO,kBACTwG,EAAQ,eAAe/C,CAAK,GAG1BzD,EAAO,kBACThD,GAAmByG,CAAK,GAGtB0B,EAAYnF,CAAM,KACpB4E,EAAgB;AAAA,MACd,OAAO;AAAA,MACP,UAAUQ,EAAc3B,GAAOzD,CAAM;AAAA,IAAA,CACtC,GAGC,CAACmH,KAAY,OAAOnH,GAAQ,UAAW,cACzCA,EAAO,OAAOyD,GAAOzD,GAAQ7D,CAAO;AAAA,EAG1C;AACF;AC5VA,MAAMQ,KAAI;AAAA,EACR,iBAAiB;AAAA,EACjB,eAAe;AAAA;AAAA,EAEf,kBAAkB,CAAA;AACpB,GAAG8B,KAAI;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA;AAAA,EAEL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AACA,SAASb,GAAER,IAAI,IAAI;AACjB,QAAMK,IAAI;AAAA,IACR,GAAGd;AAAA,IACH,GAAGS;AAAA,EACP;AACE,EAAAA,EAAE,oBAAoBiB,EAAE,CAACN,MAAM;AAC7B,IAAAN,EAAE,mBAAmBM,EAAE,SAAS,YAAW,EAAG,oBAAoB,CAAA;AAAA,EACpE,CAAC;AACD,WAASrB,EAAEqB,GAAGC,GAAG;AACf,UAAM,EAAE,iBAAiBvB,GAAG,kBAAkBU,GAAG,eAAeX,EAAC,IAAKiB,GAAGF,IAAIS,KAAKvB,GAAGa,IAAImB,GAAElB,CAAC,KAAKf;AACjG,QAAIe,KAAKJ,GAAG;AACV,YAAMD,IAAIC,EAAEI,CAAC,GAAG,IAAI,IAAI,KAAK,aAAaD,GAAG;AAAA,QAC3C,aAAa,CAAC,CAACJ,EAAE;AAAA,QACjB,uBAAuBA,EAAE;AAAA,QACzB,uBAAuBA,EAAE;AAAA,MACjC,CAAO,EAAE,cAAca,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,UAAUb,EAAE,oBAAoB,EAAE,SAAS,YAAYA,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE;AACtI,aAAOA,GAAG,uBAAuB,GAAGA,EAAE,aAAa,GAAG,CAAC,KAAK,GAAG,CAAC,GAAGA,GAAG,aAAa;AAAA,IACrF;AACA,WAAO,IAAI,KAAK,aAAaI,GAAG;AAAA,MAC9B,OAAO;AAAA,MACP,UAAUC;AAAA,IAChB,CAAK,EAAE,OAAOQ,CAAC;AAAA,EACb;AACA,SAAO;AAAA,IACL,gBAAgBrB;AAAA,EACpB;AACA;AACA,SAASW,GAAED,GAAG;AACZ,QAAM,EAAE,gBAAgBK,MAAMG,GAAER,CAAC;AACjC,WAASV,EAAEsB,GAAGvB,GAAG;AACf,UAAMU,IAAI,CAAA;AACV,WAAOa,EAAE,UAAU,WAAWb,EAAE,YAAYM,EAAEO,EAAE,OAAOvB,CAAC,IAAIuB,EAAE,cAAc,WAAWb,EAAE,gBAAgBM,EAAEO,EAAE,WAAWvB,CAAC,IAAI,OAAO,OAAO,IAAIuB,GAAGb,CAAC;AAAA,EACrJ;AACA,WAASY,EAAEC,GAAG;AACZ,WAAOA,EAAE,UAAU,UAAUA,EAAE,cAAc;AAAA,EAC/C;AACA,SAAO,SAASvB,GAAG;AACjB,QAAI,CAACsB,EAAEtB,CAAC;AACN,aAAOA;AACT,UAAMU,IAAIT,EAAED,GAAGA,EAAE,iBAAiB;AAClC,WAAOU,EAAE,QAAQA,EAAE,KAAK,KAAKY,CAAC,MAAMZ,EAAE,OAAOA,EAAE,KAAK,IAAI,CAACX,MAAMuB,EAAEvB,CAAC,IAAIE,EAAEF,GAAGC,EAAE,iBAAiB,IAAID,CAAC,IAAIW;AAAA,EACzG;AACF;ACtDA,eAAsBiK,GAAiB7C,GAAsB,EAAE,SAAA8C,GAAS,iBAAAC,KAAkC;AACxG,QAAMC,IAAkBhD,EAAQ,cAAiC,+BAA+B,GAAG,aAE7FvE,IAASwH,GAAoBjD,CAAO;AAC1C,MAAI,CAAC,OAAO,KAAKvE,CAAM,EAAE;AACvB,UAAM,IAAI,MAAM,6CAA6C;AAE/D,SAAOkG,GAAa;AAAA,IAClB,GAAGlG;AAAAA,IACH,cAAc;AAAA,IACd,QAAQqH,EAAQE,KAAmBD,CAAe;AAAA,IAClD,OAAO7D,GAAO;AACZc,MAAAA,EAAQ,cAAgCvE,EAAO,aAAa,EAAG,QAAQyD,GACvEc,EAAQ,cAAc,MAAM,GAAG,OAAA;AAAA,IACjC;AAAA,EAAA,CACD;AACH;AAEA,SAASiD,GAAoBjD,GAAsB;AACjD,QAAMvE,IAASuE,EAAQ,cAAc,6BAA6B;AAClE,SAAOvE,IAAS,KAAK,MAAMA,EAAO,WAAY,IAAI,CAAA;AACpD;ACeO,MAAMyH,WAA0B,YAAY;AAAA,EACjD,MAAM,oBAAoB;AACxB,WAAOL,GAAiB,MAAM;AAAA,MAC5B,SAASnL;AAAAA,MACT,iBAAiByL;AAAAA,IAAA,CAClB;AAAA,EACH;AACF;AAEA,eAAe,OAAO,sBAAsBD,EAAiB;","x_google_ignoreList":[1,2,4,5,6,9,18]}