{"version":3,"file":"anchor.vue2.mjs","sources":["../../../components/anchor/anchor.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { AnchorLink } from '@/components/anchor-link'\r\nimport { Renderer } from '@/components/renderer'\r\n\r\nimport {\r\n  getCurrentInstance,\r\n  isVNode,\r\n  nextTick,\r\n  onBeforeUnmount,\r\n  onMounted,\r\n  provide,\r\n  reactive,\r\n  ref,\r\n  watch,\r\n} from 'vue'\r\n\r\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\r\nimport { proxyExposed } from '@vexip-ui/hooks'\r\nimport { isClient, isElement } from '@vexip-ui/utils'\r\nimport { anchorProps } from './props'\r\nimport { animateScrollTo } from './helper'\r\nimport { ANCHOR_STATE } from './symbol'\r\n\r\nimport type { ComponentInternalInstance } from 'vue'\r\nimport type { NativeScrollExposed } from '@/components/native-scroll'\r\nimport type { Scroll } from '@/components/scroll'\r\nimport type { AnchorLinkState, AnchorSlots, AnchorState } from './symbol'\r\n\r\ntype ScrollType = NativeScrollExposed & InstanceType<typeof Scroll>\r\n\r\ndefineOptions({ name: 'Anchor' })\r\n\r\nconst nh = useNameHelper('anchor')\r\n\r\nconst _props = defineProps(anchorProps)\r\nconst props = useProps('anchor', _props, {\r\n  active: {\r\n    default: '',\r\n    static: true,\r\n  },\r\n  viewer: {\r\n    default: null,\r\n    static: true,\r\n  },\r\n  offset: 8,\r\n  marker: false,\r\n  scrollDuration: 500,\r\n  markerTransition: () => nh.ns('fade'),\r\n  options: {\r\n    default: () => [],\r\n    static: true,\r\n  },\r\n  bindHash: false,\r\n  forceActive: false,\r\n  slots: () => ({}),\r\n})\r\n\r\nconst emit = defineEmits(['update:active'])\r\n\r\ndefineSlots<AnchorSlots>()\r\n\r\nconst currentActive = ref(props.active)\r\nconst animating = ref(false)\r\nconst markerTop = ref(0)\r\nconst linkStates = new Set<AnchorLinkState>()\r\n\r\nconst wrapper = ref<HTMLElement>()\r\n\r\nlet timer: ReturnType<typeof setTimeout>\r\n\r\nlet isRawViewer = false\r\nlet container: Window | HTMLElement | null = null\r\nlet scroller: ScrollType | null = null\r\nlet prevScrollTop = 0\r\n\r\nif (isClient && !currentActive.value && props.bindHash) {\r\n  currentActive.value = decodeURIComponent(location.hash)\r\n}\r\n\r\nprovide<AnchorState>(\r\n  ANCHOR_STATE,\r\n  reactive({\r\n    currentActive,\r\n    increaseLink,\r\n    decreaseLink,\r\n    handleActive,\r\n  }),\r\n)\r\n\r\nwatch(\r\n  () => props.active,\r\n  value => {\r\n    currentActive.value = value\r\n  },\r\n)\r\nwatch(() => props.viewer, updateContainer)\r\n\r\nonMounted(() => {\r\n  updateContainer()\r\n  computeMarkerPosition()\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n  removeListener()\r\n  clearTimeout(timer)\r\n})\r\n\r\nfunction increaseLink(state: AnchorLinkState) {\r\n  linkStates.add(state)\r\n  state.active = currentActive.value === state.to\r\n}\r\n\r\nfunction decreaseLink(state: AnchorLinkState) {\r\n  linkStates.delete(state)\r\n}\r\n\r\nconst instance = getCurrentInstance()!\r\n\r\nfunction updateContainer() {\r\n  removeListener()\r\n  isClient &&\r\n    nextTick(() => {\r\n      const viewer: unknown = props.viewer\r\n\r\n      prevScrollTop = 0\r\n\r\n      let _container: Window | Node | ComponentInternalInstance | null = null\r\n      let refName = 'scroll'\r\n\r\n      if (typeof viewer === 'string') {\r\n        if (viewer.startsWith('ref:')) {\r\n          refName = viewer.substring(4)\r\n          refName = refName || 'scroll'\r\n        } else if (['window', 'document', 'html'].includes(viewer)) {\r\n          _container = window\r\n        } else if (viewer === 'body') {\r\n          _container = document.body\r\n        } else if (viewer === 'root') {\r\n          _container = instance.root\r\n        } else {\r\n          _container = document.querySelector(viewer)\r\n        }\r\n      } else if (typeof viewer === 'function') {\r\n        _container = viewer()\r\n      } else if (isElement(viewer)) {\r\n        _container = viewer\r\n      }\r\n\r\n      if (_container === window || isElement(_container)) {\r\n        isRawViewer = true\r\n      } else {\r\n        isRawViewer = false\r\n        // container = this.$parent\r\n      }\r\n\r\n      if (!isRawViewer) {\r\n        // ComponentInternalInstance\r\n        _container = _container as ComponentInternalInstance\r\n        _container = isVNode(_container?.vnode) ? _container : instance.parent\r\n\r\n        while (_container) {\r\n          const name = _container.type?.name\r\n\r\n          if (name === 'Scroll' || name === 'NativeScroll') {\r\n            scroller = proxyExposed({ component: _container } as any)\r\n\r\n            break\r\n          }\r\n\r\n          const refTemp = _container.refs?.[refName]\r\n\r\n          if (refTemp) {\r\n            if (isElement(refTemp)) {\r\n              isRawViewer = true\r\n              container = refTemp as HTMLElement\r\n            } else {\r\n              scroller = refTemp as ScrollType\r\n            }\r\n\r\n            break\r\n          }\r\n\r\n          _container = _container.parent\r\n        }\r\n\r\n        if (scroller) {\r\n          scroller.addScrollListener(handleContainerScroll)\r\n          container = scroller.$el\r\n        } else if (!container) {\r\n          isRawViewer = true\r\n          container = instance.parent?.proxy?.$el as HTMLElement\r\n        }\r\n\r\n        if (isRawViewer && container) {\r\n          container.addEventListener('scroll', handleContainerScroll)\r\n        }\r\n      } else {\r\n        container = _container as HTMLElement\r\n        container.addEventListener('scroll', handleContainerScroll)\r\n      }\r\n    })\r\n}\r\n\r\nfunction getContainerEl() {\r\n  if (!container) return null\r\n\r\n  return container === window ? document.documentElement : (container as HTMLElement)\r\n}\r\n\r\nfunction computeCurrentLink(scrollTop: number) {\r\n  if (!linkStates.size || !container) return\r\n\r\n  const containerTop = getContainerEl()!.offsetTop\r\n  const offsetList: { link: string, offset: number }[] = []\r\n\r\n  let offset = scrollTop + props.offset\r\n\r\n  if (isRawViewer) {\r\n    offset += containerTop\r\n  }\r\n\r\n  linkStates.forEach(state => {\r\n    const id = state.to\r\n\r\n    if (!id.startsWith('#')) return\r\n\r\n    const element = document.querySelector(id) as HTMLElement | null\r\n\r\n    if (element) {\r\n      offsetList.push({\r\n        link: id,\r\n        offset: element.offsetTop,\r\n      })\r\n    }\r\n  })\r\n\r\n  offsetList.sort((prev, next) => prev.offset - next.offset)\r\n  offsetList.push({\r\n    link: '',\r\n    offset: Infinity,\r\n  })\r\n\r\n  let currentLink = ''\r\n\r\n  for (let i = 0, len = offsetList.length - 1; i < len; ++i) {\r\n    const current = offsetList[i]\r\n    const next = offsetList[i + 1]\r\n\r\n    if (current.offset <= offset && next.offset > offset) {\r\n      currentLink = current.link\r\n\r\n      break\r\n    }\r\n  }\r\n\r\n  prevScrollTop = scrollTop\r\n\r\n  if (currentActive.value !== currentLink) {\r\n    currentActive.value = currentLink\r\n    emit('update:active', currentLink)\r\n    emitEvent(props.onChange, currentLink)\r\n  }\r\n}\r\n\r\nfunction handleContainerScroll(event: Event) {\r\n  if (animating.value) return\r\n\r\n  const scrollTop = isRawViewer\r\n    ? (\r\n      (event.target === window || event.target === document\r\n        ? document.documentElement\r\n        : event.target) as HTMLElement\r\n    ).scrollTop\r\n    : (event as MouseEvent).clientY\r\n\r\n  computeCurrentLink(scrollTop)\r\n  computeMarkerPosition()\r\n}\r\n\r\nfunction removeListener() {\r\n  if (scroller) {\r\n    scroller.removeScrollListener(handleContainerScroll)\r\n    scroller = null\r\n  }\r\n\r\n  if (container) {\r\n    container.removeEventListener('scroll', handleContainerScroll)\r\n  }\r\n}\r\n\r\nfunction handleActive(link: string) {\r\n  if (\r\n    (!props.forceActive && link === currentActive.value) ||\r\n    !link.startsWith('#') ||\r\n    link.length < 2\r\n  ) {\r\n    return\r\n  }\r\n\r\n  const element = document.querySelector(link) as HTMLElement | null\r\n\r\n  if (!element) return\r\n\r\n  clearTimeout(timer)\r\n\r\n  animating.value = true\r\n\r\n  const elementTop = element.offsetTop\r\n  const duration = Math.max(props.scrollDuration, 0)\r\n\r\n  if (isRawViewer && container) {\r\n    const containerEl = getContainerEl()!\r\n    // const from = containerEl.scrollTop\r\n    const to = Math.min(\r\n      elementTop - containerEl.offsetTop - props.offset,\r\n      containerEl.scrollHeight - containerEl.clientHeight,\r\n    )\r\n\r\n    animateScrollTo(containerEl, prevScrollTop, to, duration, () => {\r\n      timer = setTimeout(() => {\r\n        animating.value = false\r\n      }, 10)\r\n    })\r\n    computeCurrentLink(to)\r\n    computeMarkerPosition()\r\n  } else if (scroller) {\r\n    const [min, max] = scroller.getYScrollLimit()\r\n    const clientY = Math.max(Math.min(elementTop - props.offset, max), min)\r\n\r\n    scroller.scrollTo(0, clientY, duration).then(() => {\r\n      timer = setTimeout(() => {\r\n        animating.value = false\r\n      }, duration + 10)\r\n    })\r\n\r\n    computeCurrentLink(clientY)\r\n    computeMarkerPosition()\r\n  } else {\r\n    animating.value = false\r\n  }\r\n\r\n  if (isClient && props.bindHash && location) {\r\n    location.hash = encodeURIComponent(currentActive.value.replace(/^#/, ''))\r\n  }\r\n}\r\n\r\nfunction computeMarkerPosition() {\r\n  const currentLink = Array.from(linkStates).find(\r\n    state => state.to && state.to === currentActive.value,\r\n  )\r\n\r\n  if (currentLink?.el) {\r\n    const linkRect = currentLink.el.getBoundingClientRect()\r\n    const wrapperTop = wrapper.value?.getBoundingClientRect().top ?? 0\r\n\r\n    markerTop.value = linkRect.top - wrapperTop + linkRect.height / 2 + 0.5\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    ref=\"wrapper\"\r\n    :class=\"{\r\n      [nh.b()]: true,\r\n      [nh.bs('vars')]: true,\r\n      [nh.bm('inherit')]: props.inherit,\r\n      [nh.bm('no-marker')]: !props.marker\r\n    }\"\r\n  >\r\n    <ul :class=\"nh.be('list')\">\r\n      <slot>\r\n        <Renderer :renderer=\"props.slots.default\">\r\n          <AnchorLink\r\n            v-for=\"link in props.options\"\r\n            :key=\"link.to\"\r\n            :to=\"link.to\"\r\n            :title=\"link.title\"\r\n            :children=\"link.children\"\r\n          >\r\n            {{ link.label }}\r\n          </AnchorLink>\r\n        </Renderer>\r\n      </slot>\r\n    </ul>\r\n    <Transition appear :name=\"props.markerTransition\">\r\n      <div\r\n        v-if=\"props.marker && currentActive\"\r\n        :class=\"nh.be('marker')\"\r\n        :style=\"{ top: `${markerTop}px` }\"\r\n      >\r\n        <slot name=\"marker\">\r\n          <Renderer :renderer=\"props.slots.marker\">\r\n            <div :class=\"nh.be('pointer')\"></div>\r\n          </Renderer>\r\n        </slot>\r\n      </div>\r\n    </Transition>\r\n  </div>\r\n</template>\r\n"],"names":["nh","useNameHelper","props","useProps","__props","emit","__emit","currentActive","ref","animating","markerTop","linkStates","wrapper","timer","isRawViewer","container","scroller","prevScrollTop","isClient","provide","ANCHOR_STATE","reactive","increaseLink","decreaseLink","handleActive","watch","value","updateContainer","onMounted","computeMarkerPosition","onBeforeUnmount","removeListener","state","instance","getCurrentInstance","nextTick","viewer","_container","refName","isElement","handleContainerScroll","isVNode","name","_a","proxyExposed","refTemp","_b","_d","_c","getContainerEl","computeCurrentLink","scrollTop","containerTop","offsetList","offset","id","element","prev","next","currentLink","len","current","emitEvent","event","link","elementTop","duration","containerEl","to","animateScrollTo","min","max","clientY","linkRect","wrapperTop","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_ctx","_createVNode","Renderer","_openBlock","_Fragment","_renderList","_createBlock","AnchorLink","_createTextVNode","_toDisplayString","_Transition"],"mappings":";;;;;;;;;;;;;;;;;AAgCM,UAAAA,IAAKC,GAAc,QAAQ,GAG3BC,IAAQC,GAAS,UADRC,GAC0B;AAAA,MACvC,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,kBAAkB,MAAMJ,EAAG,GAAG,MAAM;AAAA,MACpC,SAAS;AAAA,QACP,SAAS,MAAM,CAAC;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO,OAAO,CAAC;AAAA,IAAA,CAChB,GAEKK,IAAOC,GAIPC,IAAgBC,EAAIN,EAAM,MAAM,GAChCO,IAAYD,EAAI,EAAK,GACrBE,IAAYF,EAAI,CAAC,GACjBG,wBAAiB,IAAqB,GAEtCC,IAAUJ,EAAiB;AAE7B,QAAAK,GAEAC,IAAc,IACdC,IAAyC,MACzCC,IAA8B,MAC9BC,IAAgB;AAEpB,IAAIC,KAAY,CAACX,EAAc,SAASL,EAAM,aAC9BK,EAAA,QAAQ,mBAAmB,SAAS,IAAI,IAGxDY;AAAA,MACEC;AAAA,MACAC,EAAS;AAAA,QACP,eAAAd;AAAA,QACA,cAAAe;AAAA,QACA,cAAAC;AAAA,QACA,cAAAC;AAAA,MACD,CAAA;AAAA,IACH,GAEAC;AAAA,MACE,MAAMvB,EAAM;AAAA,MACZ,CAASwB,MAAA;AACP,QAAAnB,EAAc,QAAQmB;AAAA,MAAA;AAAA,IAE1B,GACMD,EAAA,MAAMvB,EAAM,QAAQyB,CAAe,GAEzCC,EAAU,MAAM;AACE,MAAAD,EAAA,GACME,EAAA;AAAA,IAAA,CACvB,GAEDC,EAAgB,MAAM;AACL,MAAAC,EAAA,GACf,aAAalB,CAAK;AAAA,IAAA,CACnB;AAED,aAASS,EAAaU,GAAwB;AAC5C,MAAArB,EAAW,IAAIqB,CAAK,GACdA,EAAA,SAASzB,EAAc,UAAUyB,EAAM;AAAA,IAAA;AAG/C,aAAST,EAAaS,GAAwB;AAC5C,MAAArB,EAAW,OAAOqB,CAAK;AAAA,IAAA;AAGzB,UAAMC,IAAWC,EAAmB;AAEpC,aAASP,IAAkB;AACV,MAAAI,EAAA,GACfb,KACEiB,EAAS,MAAM;;AACb,cAAMC,IAAkBlC,EAAM;AAEd,QAAAe,IAAA;AAEhB,YAAIoB,IAA+D,MAC/DC,IAAU;AA4Bd,YA1BI,OAAOF,KAAW,WAChBA,EAAO,WAAW,MAAM,KAChBE,IAAAF,EAAO,UAAU,CAAC,GAC5BE,IAAUA,KAAW,YACZ,CAAC,UAAU,YAAY,MAAM,EAAE,SAASF,CAAM,IAC1CC,IAAA,SACJD,MAAW,SACpBC,IAAa,SAAS,OACbD,MAAW,SACpBC,IAAaJ,EAAS,OAETI,IAAA,SAAS,cAAcD,CAAM,IAEnC,OAAOA,KAAW,aAC3BC,IAAaD,EAAO,IACXG,EAAUH,CAAM,MACZC,IAAAD,IAGXC,MAAe,UAAUE,EAAUF,CAAU,IACjCvB,IAAA,KAEAA,IAAA,IAIXA;AA0CS,UAAAC,IAAAsB,GACFtB,EAAA,iBAAiB,UAAUyB,CAAqB;AAAA,aA3C1C;AAKhB,eAHaH,IAAAA,GACbA,IAAaI,GAAQJ,KAAA,gBAAAA,EAAY,KAAK,IAAIA,IAAaJ,EAAS,QAEzDI,KAAY;AACX,kBAAAK,KAAOC,IAAAN,EAAW,SAAX,gBAAAM,EAAiB;AAE1B,gBAAAD,MAAS,YAAYA,MAAS,gBAAgB;AAChD,cAAA1B,IAAW4B,GAAa,EAAE,WAAWP,EAAA,CAAmB;AAExD;AAAA,YAAA;AAGI,kBAAAQ,KAAUC,IAAAT,EAAW,SAAX,gBAAAS,EAAkBR;AAElC,gBAAIO,GAAS;AACP,cAAAN,EAAUM,CAAO,KACL/B,IAAA,IACFC,IAAA8B,KAED7B,IAAA6B;AAGb;AAAA,YAAA;AAGF,YAAAR,IAAaA,EAAW;AAAA,UAAA;AAG1B,UAAIrB,KACFA,EAAS,kBAAkBwB,CAAqB,GAChDzB,IAAYC,EAAS,OACXD,MACID,IAAA,IACFC,KAAAgC,KAAAC,IAAAf,EAAS,WAAT,gBAAAe,EAAiB,UAAjB,gBAAAD,EAAwB,MAGlCjC,KAAeC,KACPA,EAAA,iBAAiB,UAAUyB,CAAqB;AAAA,QAC5D;AAAA,MAIF,CACD;AAAA,IAAA;AAGL,aAASS,IAAiB;AACpB,aAAClC,IAEEA,MAAc,SAAS,SAAS,kBAAmBA,IAFnC;AAAA,IAEmC;AAG5D,aAASmC,EAAmBC,GAAmB;AAC7C,UAAI,CAACxC,EAAW,QAAQ,CAACI,EAAW;AAE9B,YAAAqC,IAAeH,IAAkB,WACjCI,IAAiD,CAAC;AAEpD,UAAAC,IAASH,IAAYjD,EAAM;AAE/B,MAAIY,MACQwC,KAAAF,IAGZzC,EAAW,QAAQ,CAASqB,MAAA;AAC1B,cAAMuB,IAAKvB,EAAM;AAEjB,YAAI,CAACuB,EAAG,WAAW,GAAG,EAAG;AAEnB,cAAAC,IAAU,SAAS,cAAcD,CAAE;AAEzC,QAAIC,KACFH,EAAW,KAAK;AAAA,UACd,MAAME;AAAA,UACN,QAAQC,EAAQ;AAAA,QAAA,CACjB;AAAA,MACH,CACD,GAEDH,EAAW,KAAK,CAACI,GAAMC,MAASD,EAAK,SAASC,EAAK,MAAM,GACzDL,EAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,QAAQ;AAAA,MAAA,CACT;AAED,UAAIM,IAAc;AAET,eAAA,IAAI,GAAGC,IAAMP,EAAW,SAAS,GAAG,IAAIO,GAAK,EAAE,GAAG;AACnD,cAAAC,IAAUR,EAAW,CAAC,GACtBK,IAAOL,EAAW,IAAI,CAAC;AAE7B,YAAIQ,EAAQ,UAAUP,KAAUI,EAAK,SAASJ,GAAQ;AACpD,UAAAK,IAAcE,EAAQ;AAEtB;AAAA,QAAA;AAAA,MACF;AAGc,MAAA5C,IAAAkC,GAEZ5C,EAAc,UAAUoD,MAC1BpD,EAAc,QAAQoD,GACtBtD,EAAK,iBAAiBsD,CAAW,GACvBG,GAAA5D,EAAM,UAAUyD,CAAW;AAAA,IACvC;AAGF,aAASnB,EAAsBuB,GAAc;AAC3C,UAAItD,EAAU,MAAO;AAErB,YAAM0C,IAAYrC,KAEbiD,EAAM,WAAW,UAAUA,EAAM,WAAW,WACzC,SAAS,kBACTA,EAAM,QACV,YACCA,EAAqB;AAE1B,MAAAb,EAAmBC,CAAS,GACNtB,EAAA;AAAA,IAAA;AAGxB,aAASE,IAAiB;AACxB,MAAIf,MACFA,EAAS,qBAAqBwB,CAAqB,GACxCxB,IAAA,OAGTD,KACQA,EAAA,oBAAoB,UAAUyB,CAAqB;AAAA,IAC/D;AAGF,aAAShB,EAAawC,GAAc;AAClC,UACG,CAAC9D,EAAM,eAAe8D,MAASzD,EAAc,SAC9C,CAACyD,EAAK,WAAW,GAAG,KACpBA,EAAK,SAAS;AAEd;AAGI,YAAAR,IAAU,SAAS,cAAcQ,CAAI;AAE3C,UAAI,CAACR,EAAS;AAEd,mBAAa3C,CAAK,GAElBJ,EAAU,QAAQ;AAElB,YAAMwD,IAAaT,EAAQ,WACrBU,IAAW,KAAK,IAAIhE,EAAM,gBAAgB,CAAC;AAEjD,UAAIY,KAAeC,GAAW;AAC5B,cAAMoD,IAAclB,EAAe,GAE7BmB,IAAK,KAAK;AAAA,UACdH,IAAaE,EAAY,YAAYjE,EAAM;AAAA,UAC3CiE,EAAY,eAAeA,EAAY;AAAA,QACzC;AAEA,QAAAE,GAAgBF,GAAalD,GAAemD,GAAIF,GAAU,MAAM;AAC9D,UAAArD,IAAQ,WAAW,MAAM;AACvB,YAAAJ,EAAU,QAAQ;AAAA,aACjB,EAAE;AAAA,QAAA,CACN,GACDyC,EAAmBkB,CAAE,GACCvC,EAAA;AAAA,iBACbb,GAAU;AACnB,cAAM,CAACsD,GAAKC,CAAG,IAAIvD,EAAS,gBAAgB,GACtCwD,IAAU,KAAK,IAAI,KAAK,IAAIP,IAAa/D,EAAM,QAAQqE,CAAG,GAAGD,CAAG;AAEtE,QAAAtD,EAAS,SAAS,GAAGwD,GAASN,CAAQ,EAAE,KAAK,MAAM;AACjD,UAAArD,IAAQ,WAAW,MAAM;AACvB,YAAAJ,EAAU,QAAQ;AAAA,UAAA,GACjByD,IAAW,EAAE;AAAA,QAAA,CACjB,GAEDhB,EAAmBsB,CAAO,GACJ3C,EAAA;AAAA,MAAA;AAEtB,QAAApB,EAAU,QAAQ;AAGhB,MAAAS,KAAYhB,EAAM,YAAY,aAChC,SAAS,OAAO,mBAAmBK,EAAc,MAAM,QAAQ,MAAM,EAAE,CAAC;AAAA,IAC1E;AAGF,aAASsB,IAAwB;;AAC/B,YAAM8B,IAAc,MAAM,KAAKhD,CAAU,EAAE;AAAA,QACzC,CAASqB,MAAAA,EAAM,MAAMA,EAAM,OAAOzB,EAAc;AAAA,MAClD;AAEA,UAAIoD,KAAA,QAAAA,EAAa,IAAI;AACb,cAAAc,IAAWd,EAAY,GAAG,sBAAsB,GAChDe,MAAa/B,IAAA/B,EAAQ,UAAR,gBAAA+B,EAAe,wBAAwB,QAAO;AAEjE,QAAAjC,EAAU,QAAQ+D,EAAS,MAAMC,IAAaD,EAAS,SAAS,IAAI;AAAA,MAAA;AAAA,IACtE;2BAKAE,EAqCM,OAAA;AAAA,eApCA;AAAA,MAAJ,KAAI/D;AAAA,MACH,OAAKgE,EAAA;AAAA,QAAY,CAAAC,EAAA7E,CAAA,EAAG,EAAC,CAAA,GAAA;AAAA,QAAmB,CAAA6E,EAAA7E,CAAA,EAAG,GAAE,MAAA,CAAA,GAAA;AAAA,QAAyB,CAAA6E,EAAA7E,CAAA,EAAG,GAAgB,SAAA,CAAA,GAAA6E,EAAA3E,CAAA,EAAM;AAAA,QAAiB,CAAA2E,EAAA7E,CAAA,EAAG,GAAmB,WAAA,CAAA,GAAA,CAAA6E,EAAA3E,CAAA,EAAM;AAAA;;MAO7I4E,EAcK,MAAA;AAAA,QAdA,OAAKF,EAAEC,EAAE7E,CAAA,EAAC,GAAE,MAAA,CAAA;AAAA,MAAA;QACf+E,EAYOC,yBAZP,MAYO;AAAA,UAXLC,EAUWJ,EAAAK,CAAA,GAAA;AAAA,YAVA,UAAUL,EAAA3E,CAAA,EAAM,MAAM;AAAA,UAAA;uBAE7B,MAA6B;AAAA,eAD/BiF,EAAA,EAAA,GAAAR,EAQaS,IAPI,MAAAC,GAAAR,EAAA3E,CAAA,EAAM,UAAd8D,YADTsB,GAQaT,EAAAU,EAAA,GAAA;AAAA,gBANV,KAAKvB,EAAK;AAAA,gBACV,IAAIA,EAAK;AAAA,gBACT,OAAOA,EAAK;AAAA,gBACZ,UAAUA,EAAK;AAAA,cAAA;2BAEhB,MAAgB;AAAA,kBAAbwB,GAAAC,GAAAzB,EAAK,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;;;MAKrBiB,EAYaS,IAAA;AAAA,QAZD,QAAA;AAAA,QAAQ,MAAMb,EAAK3E,CAAA,EAAC;AAAA,MAAA;mBAC9B,MAUM;AAAA,UATE2E,EAAK3E,CAAA,EAAC,UAAUK,EAAa,cADrCoE,EAUM,OAAA;AAAA;YARH,OAAKC,EAAEC,EAAE7E,CAAA,EAAC,GAAE,QAAA,CAAA;AAAA,YACZ,oBAAiBU,EAAS,KAAA,KAAA,CAAA;AAAA,UAAA;YAE3BqE,EAIOC,wBAJP,MAIO;AAAA,cAHLC,EAEWJ,EAAAK,CAAA,GAAA;AAAA,gBAFA,UAAUL,EAAA3E,CAAA,EAAM,MAAM;AAAA,cAAA;2BAC/B,MAAqC;AAAA,kBAArC4E,EAAqC,OAAA;AAAA,oBAA/B,OAAKF,EAAEC,EAAE7E,CAAA,EAAC,GAAE,SAAA,CAAA;AAAA;;;;;;;;;;;;"}