{"version":3,"file":"main.VMfV0f.js","sources":["theme-34/virtual:theme","theme-34/discourse/components/toc-heading.gjs","theme-34/discourse/components/toc-large-buttons.gjs","theme-34/discourse/components/toc-mini-buttons.gjs","theme-34/discourse/components/toc-contents.gjs","theme-34/discourse/components/toc-mini.gjs","theme-34/discourse/components/toc-toggle.gjs","theme-34/discourse/components/toc-timeline.gjs","theme-34/discourse/connectors/below-docs-topic/d-toc-wrapper.gjs","theme-34/discourse/connectors/topic-navigation/d-toc-wrapper.gjs","theme-34/discourse/initializers/disco-toc-composer.js","theme-34/discourse/initializers/init-toc-mini.js","theme-34/discourse/initializers/init-toc-toggle.js","theme-34/discourse/services/toc-processor.js","theme-34/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(34);\n\nexport function themePrefix(key) {\n  return `theme_translations.34.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { concat } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { headerOffset } from \"discourse/lib/offset-calculator\";\nimport { slugify } from \"discourse/lib/utilities\";\n\nconst SCROLL_BUFFER = 25;\n\nexport default class TocHeading extends Component {\n  @service tocProcessor;\n\n  get isActive() {\n    return this.args.activeHeadingId === this.args.item.id;\n  }\n\n  get isAncestorActive() {\n    return this.args.activeAncestorIds?.includes(this.args.item.id);\n  }\n\n  get classNames() {\n    const baseClass = \"d-toc-item\";\n    const typeClass = this.args.item.tagName\n      ? ` d-toc-${this.args.item.tagName}`\n      : \"\";\n    let activeClass = \"\";\n    if (this.isActive) {\n      activeClass = \" direct-active active\";\n    } else if (this.isAncestorActive) {\n      activeClass = \" active\";\n    }\n    return `${baseClass}${typeClass}${activeClass}`;\n  }\n\n  @action\n  handleTocLinkClick(event) {\n    event.preventDefault();\n\n    const targetId = event.target.href?.split(\"#\").pop();\n    if (!targetId) {\n      return;\n    }\n\n    const targetElement =\n      document.querySelector(`a[name=\"${targetId}\"]`) ||\n      document.getElementById(targetId);\n    if (targetElement) {\n      const headerOffsetValue = headerOffset();\n      const elementPosition =\n        targetElement.getBoundingClientRect().top + window.pageYOffset;\n      const offsetPosition =\n        elementPosition - headerOffsetValue - SCROLL_BUFFER;\n\n      window.scrollTo({ top: offsetPosition, behavior: \"smooth\" });\n\n      // hide TOC overlay when navigating to link\n      this.tocProcessor.setOverlayVisible(false);\n    }\n  }\n\n  <template>\n    <li class={{this.classNames}}>\n      <a\n        href=\"#{{@item.id}}\"\n        {{on \"click\" this.handleTocLinkClick}}\n        data-d-toc={{concat \"toc-\" @item.tagName \"-\" (slugify @item.text)}}\n      >\n        {{@item.text}}\n      </a>\n      {{#if @item.subItems}}\n        <ul class=\"d-toc-sublevel\">\n          {{#each @item.subItems as |subItem|}}\n            <TocHeading\n              @item={{subItem}}\n              @activeHeadingId={{@activeHeadingId}}\n              @activeAncestorIds={{@activeAncestorIds}}\n            />\n          {{/each}}\n        </ul>\n      {{/if}}\n    </li>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class TocLargeButtons extends Component {\n  @service tocProcessor;\n\n  @action\n  callJumpToEnd() {\n    this.tocProcessor.jumpToEnd(this.args.renderTimeline, this.args.postID);\n  }\n\n  <template>\n    <div class=\"d-toc-footer-icons\">\n      <DButton\n        @action={{this.callJumpToEnd}}\n        @icon=\"downward\"\n        @translatedLabel={{i18n (themePrefix \"jump_bottom\")}}\n        class=\"btn btn-transparent scroll-to-bottom\"\n      />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\n\nexport default class TocMiniButtons extends Component {\n  @service tocProcessor;\n\n  @action\n  callCloseOverlay() {\n    this.tocProcessor.setOverlayVisible(false);\n  }\n\n  @action\n  callJumpToEnd() {\n    this.tocProcessor.jumpToEnd(this.args.renderTimeline, this.args.postID);\n  }\n\n  <template>\n    <div class=\"d-toc-icons\">\n      <DButton\n        @action={{this.callJumpToEnd}}\n        @icon=\"downward\"\n        class=\"btn btn-transparent scroll-to-bottom\"\n      />\n      <DButton\n        @action={{this.closeOverlay}}\n        @icon=\"xmark\"\n        class=\"btn btn-transparent d-toc-close\"\n      />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport didUpdate from \"@ember/render-modifiers/modifiers/did-update\";\nimport { service } from \"@ember/service\";\nimport { debounce } from \"discourse/lib/decorators\";\nimport { headerOffset } from \"discourse/lib/offset-calculator\";\nimport TocHeading from \"../components/toc-heading\";\nimport TocLargeButtons from \"../components/toc-large-buttons\";\nimport TocMiniButtons from \"../components/toc-mini-buttons\";\n\nconst POSITION_BUFFER = 150;\nconst SCROLL_DEBOUNCE = 50;\nconst RESIZE_DEBOUNCE = 200;\n\nexport default class TocContents extends Component {\n  @service tocProcessor;\n  @service appEvents;\n\n  @tracked activeHeadingId = null;\n  @tracked headingPositions = [];\n  @tracked activeAncestorIds = [];\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    window.removeEventListener(\"scroll\", this.updateActiveHeadingOnScroll);\n    window.removeEventListener(\"resize\", this.calculateHeadingPositions);\n    this.appEvents.off(\n      \"topic:current-post-changed\",\n      this.calculateHeadingPositions\n    );\n  }\n\n  get mappedToc() {\n    return this.mappedTocStructure(this.args.tocStructure);\n  }\n\n  @action\n  setup() {\n    this.listenForScroll();\n    this.listenForPostChange();\n    this.listenForResize();\n    this.updateHeadingPositions();\n    this.updateActiveHeadingOnScroll(); // manual on setup so active class is added\n  }\n\n  @action\n  listenForScroll() {\n    window.addEventListener(\"scroll\", this.updateActiveHeadingOnScroll);\n  }\n\n  @action\n  listenForResize() {\n    //  due to text reflow positions will change after significant resize\n    window.addEventListener(\"resize\", this.calculateHeadingPositions);\n  }\n\n  @action\n  listenForPostChange() {\n    this.appEvents.on(\n      \"topic:current-post-changed\",\n      this.calculateHeadingPositions\n    );\n  }\n\n  @debounce(RESIZE_DEBOUNCE)\n  calculateHeadingPositions() {\n    this.updateHeadingPositions();\n  }\n\n  @action\n  updateHeadingPositions() {\n    // get the heading positions, so we know when to activate the TOC item on scroll\n    const postElement = document.querySelector(\n      `[data-post-id=\"${this.args.postID}\"]`\n    );\n\n    if (!postElement) {\n      return;\n    }\n\n    const headings = postElement.querySelectorAll(\"h1, h2, h3, h4, h5\");\n    if (!headings.length) {\n      return;\n    }\n\n    const sameIdCount = new Map();\n    const mappedToc = this.mappedToc;\n    this.headingPositions = Array.from(headings)\n      .map((heading) => {\n        const id = this.tocProcessor.getIdFromHeading(\n          this.args.postID,\n          heading,\n          sameIdCount\n        );\n        return mappedToc[id]\n          ? {\n              id,\n              position:\n                heading.getBoundingClientRect().top +\n                window.scrollY -\n                headerOffset() -\n                POSITION_BUFFER,\n            }\n          : null;\n      })\n      .filter((item) => item !== null);\n  }\n\n  @debounce(SCROLL_DEBOUNCE)\n  updateActiveHeadingOnScroll() {\n    const scrollPosition = window.pageYOffset - headerOffset();\n\n    // binary search to find the active item\n    let activeIndex = 0;\n    let low = 0;\n    let high = this.headingPositions.length - 1;\n    while (low <= high) {\n      let mid = Math.floor((low + high) / 2);\n      let heading = this.headingPositions[mid];\n\n      if (scrollPosition >= heading.position) {\n        low = mid + 1;\n        activeIndex = mid;\n      } else {\n        high = mid - 1;\n      }\n    }\n\n    const activeHeading =\n      this.mappedToc[this.headingPositions[activeIndex]?.id];\n\n    this.activeHeadingId = activeHeading?.id;\n    this.activeAncestorIds = [];\n    let ancestor = activeHeading;\n    while (ancestor && ancestor.parent) {\n      this.activeAncestorIds.push(ancestor.parent.id);\n      ancestor = ancestor.parent;\n    }\n  }\n\n  mappedTocStructure(tocStructure, map = null) {\n    map ??= {};\n    for (const item of tocStructure) {\n      map[item.id] = item;\n      if (item.subItems) {\n        this.mappedTocStructure(item.subItems, map);\n      }\n    }\n    return map;\n  }\n\n  <template>\n    {{#unless @renderTimeline}}\n      <TocMiniButtons @renderTimeline={{@renderTimeline}} @postID={{@postID}} />\n    {{/unless}}\n    <div\n      id=\"d-toc\"\n      {{didInsert this.setup}}\n      {{didUpdate this.updateHeadingPositions @postID}}\n    >\n\n      {{#each @tocStructure as |heading|}}\n        <ul class=\"d-toc-heading\">\n          <TocHeading\n            @item={{heading}}\n            @activeHeadingId={{this.activeHeadingId}}\n            @activeAncestorIds={{this.activeAncestorIds}}\n            @renderTimeline={{@renderTimeline}}\n          />\n        </ul>\n      {{/each}}\n\n      {{#if @renderTimeline}}\n        <TocLargeButtons\n          @postID={{@postID}}\n          @renderTimeline={{@renderTimeline}}\n        />\n      {{/if}}\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\n\nexport default class TocMini extends Component {\n  @service tocProcessor;\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.removeClickOutsideListener();\n  }\n\n  @action\n  clickOutside() {\n    this.tocProcessor.setOverlayVisible(false);\n    this.removeClickOutsideListener();\n  }\n\n  @action\n  addClickOutsideListener() {\n    document.addEventListener(\"click\", this.clickOutside);\n  }\n\n  @action\n  toggleTOCOverlay() {\n    this.tocProcessor.toggleOverlay();\n    if (this.tocProcessor.isOverlayVisible) {\n      this.addClickOutsideListener();\n    } else {\n      this.removeClickOutsideListener();\n    }\n  }\n\n  @action\n  removeClickOutsideListener() {\n    document.removeEventListener(\"click\", this.clickOutside);\n  }\n\n  <template>\n    {{#if this.tocProcessor.hasTOC}}\n      <span class=\"d-toc-mini\">\n        <DButton\n          class=\"d-toc-mini__button\"\n          @icon=\"bars-staggered\"\n          @action={{this.toggleTOCOverlay}}\n        />\n      </span>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class TocToggle extends Component {\n  @service tocProcessor;\n\n  get shouldShow() {\n    // docs and topics with 1 post don't need a toggle\n    if (this.tocProcessor.isDocs || this.args.topic?.posts_count === 1) {\n      return false;\n    }\n\n    return this.tocProcessor.hasTOC;\n  }\n\n  get toggleLabel() {\n    return this.tocProcessor.isTocVisible\n      ? \"toggle_toc.show_timeline\"\n      : \"toggle_toc.show_toc\";\n  }\n\n  get toggleIcon() {\n    return this.tocProcessor.isTocVisible ? \"timeline\" : \"bars-staggered\";\n  }\n\n  <template>\n    {{#if this.shouldShow}}\n      <DButton\n        @action={{this.tocProcessor.toggleTocVisibility}}\n        @icon={{this.toggleIcon}}\n        @translatedLabel={{i18n (themePrefix this.toggleLabel)}}\n        class=\"btn btn-default timeline-toggle\"\n      />\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport didUpdate from \"@ember/render-modifiers/modifiers/did-update\";\nimport { service } from \"@ember/service\";\nimport bodyClass from \"discourse/helpers/body-class\";\nimport TocContents from \"../components/toc-contents\";\nimport TocToggle from \"../components/toc-toggle\";\n\nexport default class TocTimeline extends Component {\n  @service tocProcessor;\n\n  get shouldRenderToc() {\n    if (!this.tocProcessor.hasTOC) {\n      return false;\n    }\n\n    // should always show on docs routes\n    if (this.tocProcessor.isDocs) {\n      return true;\n    }\n\n    if (this.args.renderTimeline) {\n      // single post topics might not have a timeline\n      // so we should ignore state\n      if (this.args.topic?.posts_count === 1) {\n        return true;\n      }\n\n      // timeline state controlled by localStorage\n      return this.tocProcessor.isTocVisible;\n    } else {\n      // progress state controlled by overlay state\n      return this.tocProcessor.isOverlayVisible;\n    }\n  }\n\n  get isTopicProgress() {\n    return (\n      !this.args.renderTimeline ||\n      (this.args.renderTimeline && this.args.topicProgressExpanded)\n    );\n  }\n\n  @action\n  callCheckPostforTOC() {\n    this.tocProcessor.checkPostforTOC(this.args.topic);\n  }\n\n  @action\n  handleTimelineUpdate() {\n    if (this.args.renderTimeline) {\n      this.tocProcessor.setOverlayVisible(false);\n    }\n  }\n\n  <template>\n    <div\n      {{didInsert this.callCheckPostforTOC}}\n      {{didUpdate this.callCheckPostforTOC @topic.currentPost}}\n      {{didUpdate this.handleTimelineUpdate @renderTimeline}}\n      class=\"d-toc-main\"\n    >\n      {{bodyClass \"d-toc-installed\"}}\n      {{#if this.shouldRenderToc}}\n        {{#unless this.isTopicProgress}}\n          {{bodyClass \"d-toc-active\"}}\n        {{/unless}}\n        <TocContents\n          @postContent={{this.tocProcessor.postContent}}\n          @postID={{this.tocProcessor.postID}}\n          @tocStructure={{this.tocProcessor.tocStructure}}\n          @renderTimeline={{@renderTimeline}}\n        />\n        {{#if @renderTimeline}}\n          <TocToggle @topic={{@topic}} />\n        {{/if}}\n      {{/if}}\n    </div>\n  </template>\n}\n","/* eslint-disable ember/no-classic-components, ember/require-tagless-components */\nimport Component from \"@ember/component\";\nimport { classNames, tagName } from \"@ember-decorators/component\";\nimport TocTimeline from \"../../components/toc-timeline\";\n\n@tagName(\"div\")\n@classNames(\"below-docs-topic-outlet\", \"d-toc-wrapper\")\nexport default class DTocWrapper extends Component {\n  <template>\n    <TocTimeline @topic={{@outletArgs.topic}} @renderTimeline={{true}} />\n  </template>\n}\n","/* eslint-disable ember/no-classic-components, ember/require-tagless-components */\nimport Component from \"@ember/component\";\nimport { classNames, tagName } from \"@ember-decorators/component\";\nimport TocTimeline from \"../../components/toc-timeline\";\n\n@tagName(\"div\")\n@classNames(\"topic-navigation-outlet\", \"d-toc-wrapper\")\nexport default class DTocWrapper extends Component {\n  <template>\n    <TocTimeline\n      @topic={{@outletArgs.topic}}\n      @renderTimeline={{@outletArgs.renderTimeline}}\n      @topicProgressExpanded={{@outletArgs.topicProgressExpanded}}\n    />\n  </template>\n}\n","import { withPluginApi } from \"discourse/lib/plugin-api\";\nimport I18n from \"discourse-i18n\";\n\nexport default {\n  name: \"disco-toc-composer\",\n\n  initialize() {\n    withPluginApi((api) => {\n      const currentUser = api.getCurrentUser();\n      if (!currentUser) {\n        return;\n      }\n\n      const minimumTL = settings.minimum_trust_level_to_create_TOC;\n\n      if (currentUser.trust_level >= minimumTL || currentUser.staff) {\n        if (!I18n.translations[I18n.currentLocale()].js.composer) {\n          I18n.translations[I18n.currentLocale()].js.composer = {};\n        }\n        I18n.translations[I18n.currentLocale()].js.composer.contains_dtoc = \" \";\n\n        api.addComposerToolbarPopupMenuOption({\n          action: (toolbarEvent) => {\n            toolbarEvent.applySurround(\n              `<div data-theme-toc=\"true\">`,\n              `</div>`,\n              \"contains_dtoc\"\n            );\n          },\n          icon: \"align-left\",\n          label: themePrefix(\"insert_table_of_contents\"),\n          condition: (composer) => {\n            return (\n              settings.enable_TOC_for_replies || composer.model.topicFirstPost\n            );\n          },\n        });\n\n        if (settings.enable_TOC_for_replies) {\n          document.body.classList.add(\"toc-for-replies-enabled\");\n        }\n      }\n    });\n  },\n};\n","import { apiInitializer } from \"discourse/lib/api\";\nimport TocMini from \"../components/toc-mini\";\n\nexport default apiInitializer((api) => {\n  api.renderInOutlet(\"before-topic-progress\", TocMini);\n});\n","import { apiInitializer } from \"discourse/lib/api\";\nimport TocToggle from \"../components/toc-toggle\";\n\nexport default apiInitializer((api) => {\n  api.renderInOutlet(\"timeline-footer-controls-after\", TocToggle);\n});\n","import { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport Service, { service } from \"@ember/service\";\nimport { slugify } from \"discourse/lib/utilities\";\n\nexport default class TocProcessor extends Service {\n  @service router;\n\n  @tracked hasTOC = false;\n  @tracked postContent = null;\n  @tracked postID = null;\n  @tracked tocStructure = null;\n  @tracked isTocVisible = localStorage.getItem(\"tocVisibility\") !== \"false\";\n  @tracked isOverlayVisible = false;\n  @tracked isDocs = false;\n\n  @action\n  toggleTocVisibility() {\n    this.isTocVisible = !this.isTocVisible;\n    localStorage.setItem(\"tocVisibility\", this.isTocVisible);\n  }\n\n  setOverlayVisible(visible) {\n    this.isOverlayVisible = visible;\n    const tocWrapper = document.querySelector(\".d-toc-wrapper\");\n    if (tocWrapper) {\n      tocWrapper.classList.toggle(\"overlay\", visible);\n    }\n  }\n\n  toggleOverlay() {\n    this.setOverlayVisible(!this.isOverlayVisible);\n  }\n\n  checkPostforTOC(topic) {\n    this.hasTOC = false;\n    if (\n      this.isValidTopic(topic) &&\n      this.shouldDisplayToc(this.getCurrentPost(topic))\n    ) {\n      const content = this.getCurrentPost(topic).cooked;\n      if (this.containsTocMarkup(content) || this.autoTOC(topic)) {\n        this.processPostContent(content, this.getCurrentPost(topic).id);\n      }\n    }\n    this.setOverlayVisible(false);\n  }\n\n  isValidTopic(topic) {\n    return !!topic;\n  }\n\n  getCurrentPost(topic) {\n    const docs = this.router?.currentRouteName?.includes(\"docs\");\n\n    if (docs) {\n      this.isDocs = true;\n      return topic.post_stream.posts[0];\n    }\n\n    this.isDocs = false;\n    return topic.postStream?.posts?.find(\n      (post) => post.post_number === topic.currentPost\n    );\n  }\n\n  shouldDisplayToc(post) {\n    return settings.enable_TOC_for_replies || post.post_number === 1;\n  }\n\n  containsTocMarkup(content) {\n    return content.includes(`<div data-theme-toc=\"true\">`);\n  }\n\n  processPostContent(content, postId) {\n    // no headings, no parsing\n    if (this.containsHeadings(content)) {\n      const parsedPost = new DOMParser().parseFromString(content, \"text/html\");\n\n      // Find headings that are either:\n      // 1. Direct descendants of body (to avoid picking up headings in quotes)\n      // 2. Inside wrap blocks (which are used for email filtering with [wrap=no-email])\n      const selector =\n        \"body > :is(h1, h2, h3, h4, h5), body > :is(.wrap, .d-wrap) :is(h1, h2, h3, h4, h5)\";\n\n      const allHeadings = parsedPost.querySelectorAll(selector);\n\n      // Convert NodeList to Array and sort by document order\n      const headings = Array.from(allHeadings).sort((a, b) => {\n        // eslint-disable-next-line no-bitwise\n        return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING\n          ? -1\n          : 1;\n      });\n\n      if (headings.length < settings.TOC_min_heading) {\n        this.setOverlayVisible(false);\n        return;\n      }\n\n      this.populateTocData(postId, content, headings);\n    } else {\n      this.setOverlayVisible(false);\n    }\n  }\n\n  containsHeadings(content) {\n    return [\"<h1\", \"<h2\", \"<h3\", \"<h4\", \"<h5\"].some((tag) =>\n      content.includes(tag)\n    );\n  }\n\n  populateTocData(postId, content, headings) {\n    this.hasTOC = true;\n    this.postID = postId;\n    this.postContent = content;\n    this.tocStructure = this.generateTocStructure(headings);\n  }\n\n  autoTOC(topic) {\n    // check topic for categories or tags from settings\n    const autoCategories = settings.auto_TOC_categories\n      ? settings.auto_TOC_categories.split(\"|\").map((id) => parseInt(id, 10))\n      : [];\n\n    const autoTags = settings.auto_TOC_tags\n      ? settings.auto_TOC_tags.split(\"|\")\n      : [];\n\n    if ((!autoCategories.length && !autoTags.length) || !topic) {\n      return false;\n    }\n\n    const topicCategory = topic.category_id;\n    const topicTags = (topic.tags || []).map((t) =>\n      typeof t === \"string\" ? t : t.name\n    );\n\n    const hasMatchingTags = autoTags.some((tag) => topicTags.includes(tag));\n    const hasMatchingCategory = autoCategories.includes(topicCategory);\n\n    // only apply autoTOC on first post\n    // the docs plugin only shows the first post, and does not have topic.currentPost defined\n    return (\n      (hasMatchingTags || hasMatchingCategory) &&\n      (topic.currentPost === 1 || topic.currentPost === undefined)\n    );\n  }\n\n  /**\n   * @param {number} postId\n   * @param {HTMLHeadingElement} heading\n   * @param {Map<string, number>} sameIdCount\n   */\n  getIdFromHeading(postId, heading, sameIdCount) {\n    const anchor = heading.querySelector(\"a.anchor\");\n    if (anchor) {\n      return anchor.name;\n    }\n    const lowerTagName = heading.tagName.toLowerCase();\n    const text = heading.textContent.trim();\n    let slug = `${slugify(text)}`;\n    if (sameIdCount.has(slug)) {\n      sameIdCount.set(slug, sameIdCount.get(slug) + 1);\n      slug = `${slug}-${sameIdCount.get(slug)}`;\n    } else {\n      sameIdCount.set(slug, 1);\n    }\n    const res = `p-${postId}-toc-${lowerTagName}-${slug}`;\n    heading.id = res;\n    return res;\n  }\n\n  generateTocStructure(headings) {\n    let root = { subItems: [], level: 0 };\n    let ancestors = [root];\n\n    const sameIdCount = new Map();\n\n    headings.forEach((heading) => {\n      const level = parseInt(heading.tagName[1], 10);\n      const text = heading.textContent.trim();\n      const lowerTagName = heading.tagName.toLowerCase();\n\n      const id = this.getIdFromHeading(this.postID, heading, sameIdCount);\n\n      // Remove irrelevant ancestors\n      while (ancestors[ancestors.length - 1].level >= level) {\n        ancestors.pop();\n      }\n\n      let headingData = {\n        id,\n        tagName: lowerTagName,\n        text,\n        subItems: [],\n        level,\n        parent: ancestors.length > 1 ? ancestors[ancestors.length - 1] : null,\n      };\n\n      ancestors[ancestors.length - 1].subItems.push(headingData);\n      ancestors.push(headingData);\n    });\n\n    return root.subItems;\n  }\n\n  jumpToEnd(renderTimeline, postID) {\n    let buffer = 150;\n    const postContainer = document.querySelector(`[data-post-id=\"${postID}\"]`);\n\n    if (!renderTimeline) {\n      this.setOverlayVisible(false);\n    }\n\n    if (postContainer) {\n      // if the topic map is present, we don't want to scroll past it\n      // so the post controls are still visible\n      const topicMapHeight =\n        postContainer.querySelector(`.topic-map`)?.offsetHeight || 0;\n\n      if (\n        postContainer.parentElement?.nextElementSibling?.querySelector(\n          \"div[data-theme-toc]\"\n        )\n      ) {\n        // but if the next post also has a toc, just jump to it\n        buffer = 30 - topicMapHeight;\n      }\n\n      const offsetPosition =\n        postContainer.getBoundingClientRect().bottom +\n        window.scrollY -\n        buffer -\n        topicMapHeight;\n\n      window.scrollTo({ top: offsetPosition, behavior: \"smooth\" });\n    }\n  }\n}\n","import * as Mod1 from \"./discourse/components/toc-contents\";\nimport * as Mod2 from \"./discourse/components/toc-heading\";\nimport * as Mod3 from \"./discourse/components/toc-large-buttons\";\nimport * as Mod4 from \"./discourse/components/toc-mini-buttons\";\nimport * as Mod5 from \"./discourse/components/toc-mini\";\nimport * as Mod6 from \"./discourse/components/toc-timeline\";\nimport * as Mod7 from \"./discourse/components/toc-toggle\";\nimport * as Mod8 from \"./discourse/connectors/below-docs-topic/d-toc-wrapper.gjs\";\nimport * as Mod9 from \"./discourse/connectors/topic-navigation/d-toc-wrapper.gjs\";\nimport * as Mod10 from \"./discourse/initializers/disco-toc-composer\";\nimport * as Mod11 from \"./discourse/initializers/init-toc-mini\";\nimport * as Mod12 from \"./discourse/initializers/init-toc-toggle\";\nimport * as Mod13 from \"./discourse/services/toc-processor\";\nconst compatModules = {\n  \"discourse/components/toc-contents\": Mod1,\n  \"discourse/components/toc-heading\": Mod2,\n  \"discourse/components/toc-large-buttons\": Mod3,\n  \"discourse/components/toc-mini-buttons\": Mod4,\n  \"discourse/components/toc-mini\": Mod5,\n  \"discourse/components/toc-timeline\": Mod6,\n  \"discourse/components/toc-toggle\": Mod7,\n  \"discourse/connectors/below-docs-topic/d-toc-wrapper\": Mod8,\n  \"discourse/connectors/topic-navigation/d-toc-wrapper\": Mod9,\n  \"discourse/initializers/disco-toc-composer\": Mod10,\n  \"discourse/initializers/init-toc-mini\": Mod11,\n  \"discourse/initializers/init-toc-toggle\": Mod12,\n  \"discourse/services/toc-processor\": Mod13,\n};\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","TocHeading","Component","dt7948","g","this","prototype","service","tocProcessor","i","isActive","args","activeHeadingId","item","id","isAncestorActive","activeAncestorIds","includes","classNames","typeClass","tagName","activeClass","handleTocLinkClick","event","preventDefault","targetId","target","href","split","pop","targetElement","document","querySelector","getElementById","headerOffsetValue","headerOffset","offsetPosition","getBoundingClientRect","top","window","pageYOffset","scrollTo","behavior","setOverlayVisible","n","action","setComponentTemplate","createTemplateFactory","block","moduleName","scope","concat","slugify","on","isStrictMode","TocLargeButtons","callJumpToEnd","jumpToEnd","renderTimeline","postID","DButton","i18n","TocMiniButtons","callCloseOverlay","TocContents","appEvents","tracked","headingPositions","willDestroy","super","arguments","removeEventListener","updateActiveHeadingOnScroll","calculateHeadingPositions","off","mappedToc","mappedTocStructure","tocStructure","setup","listenForScroll","listenForPostChange","listenForResize","updateHeadingPositions","addEventListener","debounce","postElement","headings","querySelectorAll","length","sameIdCount","Map","Array","from","map","heading","getIdFromHeading","position","scrollY","filter","scrollPosition","activeIndex","low","high","mid","Math","floor","activeHeading","ancestor","parent","push","subItems","didInsert","didUpdate","TocMini","removeClickOutsideListener","clickOutside","addClickOutsideListener","toggleTOCOverlay","toggleOverlay","isOverlayVisible","TocToggle","shouldShow","isDocs","topic","posts_count","hasTOC","toggleLabel","isTocVisible","toggleIcon","TocTimeline","shouldRenderToc","isTopicProgress","topicProgressExpanded","callCheckPostforTOC","checkPostforTOC","handleTimelineUpdate","bodyClass","DTocWrapper","c","discoTocComposer","name","initialize","withPluginApi","api","currentUser","getCurrentUser","minimumTL","minimum_trust_level_to_create_TOC","trust_level","staff","I18n","translations","currentLocale","js","composer","contains_dtoc","addComposerToolbarPopupMenuOption","toolbarEvent","applySurround","icon","label","condition","enable_TOC_for_replies","model","topicFirstPost","body","classList","add","initTocMini","apiInitializer","renderInOutlet","initTocToggle","TocProcessor","Service","router","postContent","localStorage","getItem","toggleTocVisibility","setItem","visible","tocWrapper","toggle","isValidTopic","shouldDisplayToc","getCurrentPost","content","cooked","containsTocMarkup","autoTOC","processPostContent","docs","currentRouteName","post_stream","posts","postStream","find","post","post_number","currentPost","postId","containsHeadings","selector","allHeadings","DOMParser","parseFromString","sort","a","b","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","TOC_min_heading","populateTocData","some","tag","generateTocStructure","autoCategories","auto_TOC_categories","parseInt","autoTags","auto_TOC_tags","topicCategory","category_id","topicTags","tags","t","hasMatchingTags","hasMatchingCategory","undefined","anchor","lowerTagName","toLowerCase","text","textContent","trim","slug","has","set","get","res","root","level","ancestors","forEach","headingData","buffer","postContainer","topicMapHeight","offsetHeight","parentElement","nextElementSibling","bottom","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Mod10","Mod11","Mod12"],"mappings":"84CAEaA,EAAWC,EAAkB;AAEnC,SAASC,EAAYC,GAC1B,MAAO,yBAAyBA,GAClC,CCIe,MAAMC,UAAmBC,SAAAC,OAAAC,EAAAC,KAAAC,0BACrCC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAED,YAAIK,GACF,OAAOL,KAAKM,KAAKC,kBAAoBP,KAAKM,KAAKE,KAAKC,EACtD,CAEA,oBAAIC,GACF,OAAOV,KAAKM,KAAKK,mBAAmBC,SAASZ,KAAKM,KAAKE,KAAKC,GAC9D,CAEA,cAAII,GACF,MACMC,EAAYd,KAAKM,KAAKE,KAAKO,QAC7B,UAAUf,KAAKM,KAAKE,KAAKO,UACzB;AACJ,IAAIC,EAAc;AAMlB,OALIhB,KAAKK,SACPW,EAAc,wBACLhB,KAAKU,mBACdM,EAAc,WAET,aAAeF,IAAYE,GACpC,CAGAC,kBAAAA,CAAmBC,GACjBA,EAAMC;AAEN,MAAMC,EAAWF,EAAMG,OAAOC,MAAMC,MAAM,KAAKC;AAC/C,IAAKJ,EACH;AAGF,MAAMK,EACJC,SAASC,cAAc,WAAWP,QAClCM,SAASE,eAAeR;AAC1B,GAAIK,EAAe,CACjB,MAAMI,EAAoBC,IAGpBC,EADJN,EAAcO,wBAAwBC,IAAMC,OAAOC,YAEjCN,EA5CJ;AA8ChBK,OAAOE,SAAS,CAAEH,IAAKF,EAAgBM,SAAU,WAGjDrC,KAAKG,aAAamC,mBAAkB,EACtC,CACF,QAAAxC,OAAAyC,EAAAvC,KAAAC,gCAxBCuC,GAAA,QA0BDC,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,wuBAAAC,WAAA,4BAAAC,MAAAA,KAAAC,EAAAC,EAAAC,EAAApD,GAAAqD,cAAA,IAqBAjD,KAAU;AC5EG,MAAMkD,UAAwBrD,SAAAC,OAAAC,EAAAC,KAAAC,0BAC1CC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAGDmD,aAAAA,GACEnD,KAAKG,aAAaiD,UAAUpD,KAAKM,KAAK+C,eAAgBrD,KAAKM,KAAKgD,OAClE,QAAAxD,OAAAyC,EAAAvC,KAAAC,2BAHCuC,GAAA,QAKDC,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,kRAAAC,WAAA,4BAAAC,MAAAA,IAAA,CAAAU,EAAAC,EAAA9D,GAAAuD,cAAA,IASAjD,KAAU;AClBG,MAAMyD,UAAuB5D,SAAAC,OAAAC,EAAAC,KAAAC,0BACzCC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAGD0D,gBAAAA,GACE1D,KAAKG,aAAamC,mBAAkB,EACtC,QAAAxC,OAAAyC,EAAAvC,KAAAC,8BAHCuC,GAAA,CAMDW,aAAAA,GACEnD,KAAKG,aAAaiD,UAAUpD,KAAKM,KAAK+C,eAAgBrD,KAAKM,KAAKgD,OAClE,QAAAxD,OAAAyC,EAAAvC,KAAAC,2BAHCuC,GAAA,QAKDC,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,mUAAAC,WAAA,4BAAAC,MAAAA,KAAAU,GAAAN,cAAA,IAaAjD,KAAU;ACfG,MAAM2D,UAAoB9D,SAAAC,OAAAC,EAAAC,KAAAC,0BACtCC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,uBACAC,GAAA,CAAA0D,QAAA9D,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,6BAEA4D,GAAA,WAAA,OAA0B,IAAA,EAAA,CAAAtD,QAAAT,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,8BAC1B4D,GAAA,WAAA,MAA2B,EAAE,EAAA,CAAAC,QAAAhE,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,+BAC7B4D,GAAA,WAAA,MAA4B,EAAE,EAAA,CAAAlD,QAAAb,OAAAM,EAAAJ,KAAA;AAE/B+D,WAAAA,GACEC,MAAMD,eAAeE,WACrB/B,OAAOgC,oBAAoB,SAAUlE,KAAKmE,6BAC1CjC,OAAOgC,oBAAoB,SAAUlE,KAAKoE,2BAC1CpE,KAAK4D,UAAUS,IACb,6BACArE,KAAKoE,0BAET,CAEA,aAAIE,GACF,OAAOtE,KAAKuE,mBAAmBvE,KAAKM,KAAKkE,aAC3C,CAGAC,KAAAA,GACEzE,KAAK0E,kBACL1E,KAAK2E,sBACL3E,KAAK4E,kBACL5E,KAAK6E,yBACL7E,KAAKmE,6BACP,QAAArE,OAAAyC,EAAAvC,KAAAC,mBAPCuC,GAAA,CAUDkC,eAAAA,GACExC,OAAO4C,iBAAiB,SAAU9E,KAAKmE,4BACzC,QAAArE,OAAAyC,EAAAvC,KAAAC,6BAHCuC,GAAA,CAMDoC,eAAAA,GAEE1C,OAAO4C,iBAAiB,SAAU9E,KAAKoE,0BACzC,QAAAtE,OAAAyC,EAAAvC,KAAAC,6BAJCuC,GAAA,CAODmC,mBAAAA,GACE3E,KAAK4D,UAAUZ,GACb,6BACAhD,KAAKoE,0BAET,QAAAtE,OAAAyC,EAAAvC,KAAAC,iCANCuC,GAAA,CASD4B,yBAAAA,GACEpE,KAAK6E,wBACP,QAAA/E,OAAAyC,EAAAvC,KAAAC,uCAHC8E,EApDqB,MAoDZ,CAMVF,sBAAAA,GAEE,MAAMG,EAActD,SAASC,cAC3B,kBAAkB3B,KAAKM,KAAKgD;AAG9B,IAAK0B,EACH;AAGF,MAAMC,EAAWD,EAAYE,iBAAiB;AAC9C,IAAKD,EAASE,OACZ;AAGF,MAAMC,EAAc,IAAIC,IAClBf,EAAYtE,KAAKsE;AACvBtE,KAAK8D,iBAAmBwB,MAAMC,KAAKN,GAChCO,IAAKC,IACJ,MAAMhF,EAAKT,KAAKG,aAAauF,iBAC3B1F,KAAKM,KAAKgD,OACVmC,EACAL;AAEF,OAAOd,EAAU7D,GACb,CACEA,KACAkF,SACEF,EAAQzD,wBAAwBC,IAChCC,OAAO0D,QACP9D,IA1FQ,KA6FZ,OAEL+D,OAAQrF,GAAkB,OAATA,EACtB,QAAAV,OAAAyC,EAAAvC,KAAAC,oCArCCuC,GAAA,CAwCD2B,2BAAAA,GACE,MAAM2B,EAAiB5D,OAAOC,YAAcL;AAG5C,IAAIiE,EAAc,EACdC,EAAM,EACNC,EAAOjG,KAAK8D,iBAAiBqB,OAAS;AAC1C,KAAOa,GAAOC,GAAM,CAClB,IAAIC,EAAMC,KAAKC,OAAOJ,EAAMC,GAAQ;AAGhCH,GAFU9F,KAAK8D,iBAAiBoC,GAENP,UAC5BK,EAAME,EAAM,EACZH,EAAcG,GAEdD,EAAOC,EAAM,CAEjB,CAEA,MAAMG,EACJrG,KAAKsE,UAAUtE,KAAK8D,iBAAiBiC,IAActF;AAErDT,KAAKO,gBAAkB8F,GAAe5F,GACtCT,KAAKW,kBAAoB;AACzB,IAAI2F,EAAWD;AACf,KAAOC,GAAYA,EAASC,QAC1BvG,KAAKW,kBAAkB6F,KAAKF,EAASC,OAAO9F,IAC5C6F,EAAWA,EAASC,MAExB,QAAAzG,OAAAyC,EAAAvC,KAAAC,yCA9BC8E,EAjGqB,KAiGZ,CAgCVR,kBAAAA,CAAmBC,EAAcgB,EAAM,MACrCA,IAAQ,CAAA;AACR,IAAK,MAAMhF,KAAQgE,EACjBgB,EAAIhF,EAAKC,IAAMD,EACXA,EAAKiG,UACPzG,KAAKuE,mBAAmB/D,EAAKiG,SAAUjB;AAG3C,OAAOA,CACT,QAEA/C,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,qyBAAAC,WAAA,4BAAAC,MAAAA,IAAA,CAAAY,EAAAiD,EAAAC,EAAA/G,EAAAsD,GAAAD,cAAA,IA4BAjD,KAAU;AChLG,MAAM4G,UAAgB/G,SAAAC,OAAAC,EAAAC,KAAAC,0BAClCC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAED+D,WAAAA,GACEC,MAAMD,eAAeE,WACrBjE,KAAK6G,4BACP,CAGAC,YAAAA,GACE9G,KAAKG,aAAamC,mBAAkB,GACpCtC,KAAK6G,4BACP,QAAA/G,OAAAyC,EAAAvC,KAAAC,0BAJCuC,GAAA,CAODuE,uBAAAA,GACErF,SAASoD,iBAAiB,QAAS9E,KAAK8G,aAC1C,QAAAhH,OAAAyC,EAAAvC,KAAAC,qCAHCuC,GAAA,CAMDwE,gBAAAA,GACEhH,KAAKG,aAAa8G,gBACdjH,KAAKG,aAAa+G,iBACpBlH,KAAK+G,0BAEL/G,KAAK6G,4BAET,QAAA/G,OAAAyC,EAAAvC,KAAAC,8BARCuC,GAAA,CAWDqE,0BAAAA,GACEnF,SAASwC,oBAAoB,QAASlE,KAAK8G,aAC7C,QAAAhH,OAAAyC,EAAAvC,KAAAC,wCAHCuC,GAAA,QAKDC,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,uQAAAC,WAAA,4BAAAC,MAAAA,KAAAU,GAAAN,cAAA,IAUAjD,KAAU;AC5CG,MAAMmH,UAAkBtH,SAAAC,OAAAC,EAAAC,KAAAC,0BACpCC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAED,cAAIoH,GAEF,OAAIpH,KAAKG,aAAakH,QAA2C,IAAjCrH,KAAKM,KAAKgH,OAAOC,aAI1CvH,KAAKG,aAAaqH,MAC3B,CAEA,eAAIC,GACF,OAAOzH,KAAKG,aAAauH,aACrB,2BACA,qBACN,CAEA,cAAIC,GACF,OAAO3H,KAAKG,aAAauH,aAAe,WAAa,gBACvD,QAEAjF,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,iTAAAC,WAAA,4BAAAC,MAAAA,IAAA,CAAAU,EAAAC,EAAA9D,GAAAuD,cAAA,IASAjD,KAAU;AC3BG,MAAM4H,UAAoB/H,SAAAC,OAAAC,EAAAC,KAAAC,0BACtCC,GAAA,CAAAC,QAAAL,OAAAM,EAAAJ,KAAA;AAED,mBAAI6H,GACF,QAAK7H,KAAKG,aAAaqH,WAKnBxH,KAAKG,aAAakH,SAIlBrH,KAAKM,KAAK+C,eAGyB,IAAjCrD,KAAKM,KAAKgH,OAAOC,aAKdvH,KAAKG,aAAauH,aAGlB1H,KAAKG,aAAa+G,kBAE7B,CAEA,mBAAIY,GACF,OACG9H,KAAKM,KAAK+C,gBACVrD,KAAKM,KAAK+C,gBAAkBrD,KAAKM,KAAKyH,qBAE3C,CAGAC,mBAAAA,GACEhI,KAAKG,aAAa8H,gBAAgBjI,KAAKM,KAAKgH,MAC9C,QAAAxH,OAAAyC,EAAAvC,KAAAC,iCAHCuC,GAAA,CAMD0F,oBAAAA,GACMlI,KAAKM,KAAK+C,gBACZrD,KAAKG,aAAamC,mBAAkB,EAExC,QAAAxC,OAAAyC,EAAAvC,KAAAC,kCALCuC,GAAA,QAODC,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,6xBAAAC,WAAA,4BAAAC,MAAAA,IAAA,CAAA6D,EAAAC,EAAAwB,EAAAxE,EAAAwD,GAAAlE,cAAA,IAuBAjD,KAAU;AC5E4C,MAInCoI,EAAAtI,OAAAuI,EAAA,cAAoBxI,SACvC4C,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,qGAAAC,WAAA,4BAAAC,MAAAA,KAAA+E,GAAA3E,cAAA,IAEAjD,KAAU,GACZ,CALCa,EAAW,0BAA2B,iBADtCE,EAAQ;;ACF+C,MAInCqH,EAAAtI,OAAAuI,EAAA,cAAoBxI,SACvC4C,EAAAC,EAAA,CAAAjC,GAAA,KAAAkC,MAAA,oLAAAC,WAAA,4BAAAC,MAAAA,KAAA+E,GAAA3E,cAAA,IAMAjD,KAAU,GACZ,CATCa,EAAW,0BAA2B,iBADtCE,EAAQ;gDCFTuH,EAAe,CACbC,KAAM,qBAENC,UAAAA,GACEC,EAAeC,IACb,MAAMC,EAAcD,EAAIE;AACxB,IAAKD,EACH;AAGF,MAAME,EAAYrJ,EAASsJ,mCAEvBH,EAAYI,aAAeF,GAAaF,EAAYK,SACjDC,EAAKC,aAAaD,EAAKE,iBAAiBC,GAAGC,WAC9CJ,EAAKC,aAAaD,EAAKE,iBAAiBC,GAAGC,SAAW,CAAA,GAExDJ,EAAKC,aAAaD,EAAKE,iBAAiBC,GAAGC,SAASC,cAAgB,IAEpEZ,EAAIa,kCAAkC,CACpC/G,OAASgH,IACPA,EAAaC,cACX,8BACA,SACA,kBAGJC,KAAM,aACNC,MAAOjK,EAAY,4BACnBkK,UAAYP,GAER7J,EAASqK,wBAA0BR,EAASS,MAAMC,iBAKpDvK,EAASqK,wBACXnI,SAASsI,KAAKC,UAAUC,IAAI,6BAIpC,+CCxCFC,EAAeC,EAAgB1B,IAC7BA,EAAI2B,eAAe,wBAAyBzD,iDCD9C0D,EAAeF,EAAgB1B,IAC7BA,EAAI2B,eAAe,iCAAkClD;ACCxC,MAAMoD,UAAqBC,SAAQ1K,OAAAC,EAAAC,KAAAC,oBAC/CC,GAAO,CAAAuK,QAAA3K,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,oBAEP4D,GAAO,WAAA,OAAU,CAAK,EAAA,CAAA2D,QAAA1H,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,yBACtB4D,GAAO,WAAA,OAAe,IAAI,EAAA,CAAA6G,QAAA5K,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,oBAC1B4D,GAAO,WAAA,OAAU,IAAI,EAAA,CAAAP,QAAAxD,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,0BACrB4D,GAAO,WAAA,OAAgB,IAAI,EAAA,CAAAW,QAAA1E,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,0BAC3B4D,GAAO,WAAA,MAA0D,UAA1C8G,aAAaC,QAAQ,gBAA4B,EAAA,CAAAlD,QAAA5H,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,8BACxE4D,GAAO,WAAA,OAAoB,CAAK,EAAA,CAAAqD,QAAApH,OAAAM,EAAAJ,KAAA;OAAAF,OAAAC,EAAAC,KAAAC,oBAChC4D,GAAO,WAAA,OAAU,CAAK,EAAA,CAAAwD,QAAAvH,OAAAM,EAAAJ,KAAA;AAGvB6K,mBAAAA,GACE7K,KAAK0H,cAAgB1H,KAAK0H,aAC1BiD,aAAaG,QAAQ,gBAAiB9K,KAAK0H,aAC7C,QAAC5H,OAAAyC,EAAAvC,KAAAC,iCAJAuC,GAAM,CAMPF,iBAAAA,CAAkByI,GAChB/K,KAAKkH,iBAAmB6D;AACxB,MAAMC,EAAatJ,SAASC,cAAc;AACtCqJ,GACFA,EAAWf,UAAUgB,OAAO,UAAWF,EAE3C,CAEA9D,aAAAA,GACEjH,KAAKsC,mBAAmBtC,KAAKkH,iBAC/B,CAEAe,eAAAA,CAAgBX,GAEd,GADAtH,KAAKwH,QAAS,EAEZxH,KAAKkL,aAAa5D,IAClBtH,KAAKmL,iBAAiBnL,KAAKoL,eAAe9D,IAC1C,CACA,MAAM+D,EAAUrL,KAAKoL,eAAe9D,GAAOgE,QACvCtL,KAAKuL,kBAAkBF,IAAYrL,KAAKwL,QAAQlE,KAClDtH,KAAKyL,mBAAmBJ,EAASrL,KAAKoL,eAAe9D,GAAO7G,GAEhE,CACAT,KAAKsC,mBAAkB,EACzB,CAEA4I,YAAAA,CAAa5D,GACX,QAASA,CACX,CAEA8D,cAAAA,CAAe9D,GACb,MAAMoE,EAAO1L,KAAKyK,QAAQkB,kBAAkB/K,SAAS;AAErD,OAAI8K,GACF1L,KAAKqH,QAAS,EACPC,EAAMsE,YAAYC,MAAM,KAGjC7L,KAAKqH,QAAS,EACPC,EAAMwE,YAAYD,OAAOE,KAC7BC,GAASA,EAAKC,cAAgB3E,EAAM4E,aAEzC,CAEAf,gBAAAA,CAAiBa,GACf,OAAOxM,EAASqK,wBAA+C,IAArBmC,EAAKC,WACjD,CAEAV,iBAAAA,CAAkBF,GAChB,OAAOA,EAAQzK,SAAS,8BAC1B,CAEA6K,kBAAAA,CAAmBJ,EAASc,GAE1B,GAAInM,KAAKoM,iBAAiBf,GAAU,CAClC,MAKMgB,EACJ,qFAEIC,GARa,IAAIC,WAAYC,gBAAgBnB,EAAS,aAQ7BnG,iBAAiBmH,GAG1CpH,EAAWK,MAAMC,KAAK+G,GAAaG,KAAK,CAACC,EAAGC,IAEzCD,EAAEE,wBAAwBD,GAAKE,KAAKC,6BACvC,EACA;AAGN,GAAI7H,EAASE,OAAS3F,EAASuN,gBAE7B,YADA/M,KAAKsC,mBAAkB;AAIzBtC,KAAKgN,gBAAgBb,EAAQd,EAASpG,EACxC,MACEjF,KAAKsC,mBAAkB,EAE3B,CAEA8J,gBAAAA,CAAiBf,GACf,MAAO,CAAC,MAAO,MAAO,MAAO,MAAO,OAAO4B,KAAMC,GAC/C7B,EAAQzK,SAASsM,GAErB,CAEAF,eAAAA,CAAgBb,EAAQd,EAASpG,GAC/BjF,KAAKwH,QAAS,EACdxH,KAAKsD,OAAS6I,EACdnM,KAAK0K,YAAcW,EACnBrL,KAAKwE,aAAexE,KAAKmN,qBAAqBlI,EAChD,CAEAuG,OAAAA,CAAQlE,GAEN,MAAM8F,EAAiB5N,EAAS6N,oBAC5B7N,EAAS6N,oBAAoB9L,MAAM,KAAKiE,IAAK/E,GAAO6M,SAAS7M,EAAI,KACjE,GAEE8M,EAAW/N,EAASgO,cACtBhO,EAASgO,cAAcjM,MAAM,KAC7B;AAEJ,IAAM6L,EAAejI,SAAWoI,EAASpI,SAAYmC,EACnD,OAAO;AAGT,MAAMmG,EAAgBnG,EAAMoG,YACtBC,GAAarG,EAAMsG,MAAQ,IAAIpI,IAAKqI,GAC3B,iBAANA,EAAiBA,EAAIA,EAAEtF,MAG1BuF,EAAkBP,EAASN,KAAMC,GAAQS,EAAU/M,SAASsM,IAC5Da,EAAsBX,EAAexM,SAAS6M;AAIpD,OACGK,GAAmBC,KACG,IAAtBzG,EAAM4E,kBAA2C8B,IAAtB1G,EAAM4E,YAEtC,CAOAxG,gBAAAA,CAAiByG,EAAQ1G,EAASL,GAChC,MAAM6I,EAASxI,EAAQ9D,cAAc;AACrC,GAAIsM,EACF,OAAOA,EAAO1F;AAEhB,MAAM2F,EAAezI,EAAQ1E,QAAQoN,cAC/BC,EAAO3I,EAAQ4I,YAAYC;AACjC,IAAIC,EAAO,GAAGxL,EAAQqL;AAClBhJ,EAAYoJ,IAAID,IAClBnJ,EAAYqJ,IAAIF,EAAMnJ,EAAYsJ,IAAIH,GAAQ,GAC9CA,EAAO,GAAGA,KAAQnJ,EAAYsJ,IAAIH,MAElCnJ,EAAYqJ,IAAIF,EAAM;AAExB,MAAMI,EAAM,KAAKxC,SAAc+B,KAAgBK;AAE/C,OADA9I,EAAQhF,GAAKkO,EACNA,CACT,CAEAxB,oBAAAA,CAAqBlI,GACnB,IAAI2J,EAAO,CAAEnI,SAAU,GAAIoI,MAAO,GAC9BC,EAAY,CAACF;AAEjB,MAAMxJ,EAAc,IAAIC;AA2BxB,OAzBAJ,EAAS8J,QAAStJ,IAChB,MAAMoJ,EAAQvB,SAAS7H,EAAQ1E,QAAQ,GAAI,IACrCqN,EAAO3I,EAAQ4I,YAAYC,OAC3BJ,EAAezI,EAAQ1E,QAAQoN,cAE/B1N,EAAKT,KAAK0F,iBAAiB1F,KAAKsD,OAAQmC,EAASL;AAGvD,KAAO0J,EAAUA,EAAU3J,OAAS,GAAG0J,OAASA,GAC9CC,EAAUtN;AAGZ,IAAIwN,EAAc,CAChBvO,KACAM,QAASmN,EACTE,OACA3H,SAAU,GACVoI,QACAtI,OAAQuI,EAAU3J,OAAS,EAAI2J,EAAUA,EAAU3J,OAAS,GAAK;AAGnE2J,EAAUA,EAAU3J,OAAS,GAAGsB,SAASD,KAAKwI,GAC9CF,EAAUtI,KAAKwI,KAGVJ,EAAKnI,QACd,CAEArD,SAAAA,CAAUC,EAAgBC,GACxB,IAAI2L,EAAS;AACb,MAAMC,EAAgBxN,SAASC,cAAc,kBAAkB2B;AAM/D,GAJKD,GACHrD,KAAKsC,mBAAkB,GAGrB4M,EAAe,CAGjB,MAAMC,EACJD,EAAcvN,cAAc,eAAeyN,cAAgB;AAG3DF,EAAcG,eAAeC,oBAAoB3N,cAC/C,yBAIFsN,EAAS,GAAKE;AAGhB,MAAMpN,EACJmN,EAAclN,wBAAwBuN,OACtCrN,OAAO0D,QACPqJ,EACAE;AAEFjN,OAAOE,SAAS,CAAEH,IAAKF,EAAgBM,SAAU,UACnD,CACF,ECjOG,MAACmN,EAAgB,CACpB,oCAAqCC,EACrC,mCAAoCC,EACpC,yCAA0CC,EAC1C,wCAAyCC,EACzC,gCAAiCC,EACjC,oCAAqCC,EACrC,kCAAmCC,EACnC,sDAAuDC,EACvD,sDAAuDC,EACvD,4CAA6CC,EAC7C,uCAAwCC,EACxC,yCAA0CC,EAC1C;"}