{"version":3,"file":"chat-list.mjs","sources":["../../../pro-components/chat/chat-list/chat-list.tsx"],"sourcesContent":["import { defineComponent, computed, provide, ref, onMounted, onUnmounted } from 'vue';\nimport { ClearIcon, ArrowDownIcon } from 'tdesign-icons-vue-next';\nimport { useConfig } from 'tdesign-vue-next/es/config-provider/hooks';\nimport { isArray, throttle, debounce } from 'lodash-es';\n\nimport props from './props';\nimport { Divider, Popconfirm, Button } from 'tdesign-vue-next';\nimport { usePrefixClass, useTNodeJSX } from '@tdesign/shared-hooks';\nimport ChatMessage from '../chat-message';\nimport { TdChatItemMeta, ScrollToBottomParams } from '../type';\n\nconst handleScrollToBottom = (target: HTMLDivElement, behavior?: 'auto' | 'smooth') => {\n  const currentScrollHeight = target.scrollHeight;\n  const currentClientHeight = target.clientHeight;\n\n  const innerBehavior = behavior ?? 'auto';\n  if (innerBehavior === 'auto') {\n    target.scrollTop = currentScrollHeight - currentClientHeight;\n  } else {\n    const startScrollTop = target.scrollTop;\n    const endScrollTop = currentScrollHeight - currentClientHeight;\n    const duration = 300;\n    const step = (endScrollTop - startScrollTop) / duration;\n    let startTime: number | undefined;\n    // 平滑地修改scrollTop值\n    const animateScroll = (time: number) => {\n      if (!startTime) {\n        startTime = time;\n      }\n      const elapsed = time - startTime;\n      const top = Math.min(endScrollTop, startScrollTop + elapsed * step);\n      target.scrollTop = top;\n      if (top < endScrollTop) {\n        requestAnimationFrame(animateScroll);\n      }\n    };\n\n    requestAnimationFrame(animateScroll);\n  }\n};\n\nexport default defineComponent({\n  name: 'TChatList',\n  props,\n  emits: ['clear', 'scroll'],\n  setup(props, { emit, expose }) {\n    const COMPONENT_NAME = usePrefixClass('chat');\n    const { globalConfig } = useConfig('chat');\n    const renderTNodeJSX = useTNodeJSX();\n    provide('textLoading', props.textLoading);\n    provide('animation', props.animation);\n    provide('reverse', props.reverse);\n    const classes = computed(() => {\n      return [\n        COMPONENT_NAME.value,\n        {\n          [`${COMPONENT_NAME.value}--normal`]: props.layout === 'both',\n        },\n      ];\n    });\n    // 默认反转布局\n    const listClasses = computed(() => {\n      return [\n        `${COMPONENT_NAME.value}__list`,\n        {\n          [`${COMPONENT_NAME.value}__list--reverse`]: props.reverse,\n        },\n      ];\n    });\n    const renderBody = () => {\n      /**\n       * 1. 两种方式获取要渲染的 list\n       *  a. props 传 data\n       *  b. slots t-chat-item\n       * a 优先级更高\n       */\n      const data = renderTNodeJSX('data');\n      if (isArray(data) && data.length > 0) {\n        // 根据layout来设置placement，both时仅对user、assistant设置placement，其他值使用默认left\n        const setPlacement = (item: TdChatItemMeta) => {\n          if (props.layout === 'both') {\n            if (item.role === 'assistant') return 'left';\n            if (item.role === 'user') return 'right';\n            return 'left'; // 其他role使用默认值\n          }\n          return 'left';\n        };\n        return data.map((item: TdChatItemMeta, index: number) => (\n          <ChatMessage\n            avatar={item.avatar}\n            name={item.name}\n            role={item.role}\n            status={\n              item.status || (props.textLoading && (props.reverse ? index === 0 : index === data.length - 1))\n                ? 'pending'\n                : null\n            }\n            content={item.content}\n            datetime={item.datetime}\n            animation={props.animation}\n            placement={setPlacement(item)}\n            v-slots={{\n              actionbar: () =>\n                renderTNodeJSX('actionbar', {\n                  params: { item, index },\n                }) ||\n                renderTNodeJSX('actions', {\n                  params: { item, index },\n                }),\n              name: () => renderTNodeJSX('name', { params: { item, index } }),\n              avatar: () => renderTNodeJSX('avatar', { params: { item, index } }),\n              datetime: () => renderTNodeJSX('datetime', { params: { item, index } }),\n              header: () => renderTNodeJSX('header', { params: { item, index } }),\n              content: () => renderTNodeJSX('content', { params: { item, index } }),\n            }}\n          />\n        ));\n      } else {\n        return renderTNodeJSX('default');\n      }\n    };\n    const clearConfirm = (context: { e: MouseEvent }) => {\n      emit('clear', context);\n    };\n    const defaultClearHistory = (\n      <Popconfirm content={globalConfig.value.confirmClearHistory} onConfirm={clearConfirm}>\n        <Divider class=\"clear-btn\">\n          <ClearIcon size=\"14px\" />\n          <span class=\"clear-btn-text\">{globalConfig.value.clearHistoryBtnText}</span>\n        </Divider>\n      </Popconfirm>\n    );\n    const showFooter = computed(() => renderTNodeJSX('footer'));\n    const listRef = ref<HTMLDivElement>();\n    const innerRef = ref<HTMLDivElement>();\n    // 回到底部按钮显示\n    const scrollButtonVisible = ref(false);\n    /** 检测并显示滚到底部按钮（阈值 140px，debounce 70ms） */\n    const checkAndShowScrollButton = debounce(() => {\n      // 关闭时不显示按钮也不计算\n      if (!props.showScrollButton) {\n        scrollButtonVisible.value = false;\n        return;\n      }\n      const list = listRef.value;\n      if (!list) return;\n      if (!props.reverse) {\n        if (list && list.scrollHeight - list.clientHeight - list.scrollTop > 0) {\n          scrollButtonVisible.value = true;\n        } else {\n          scrollButtonVisible.value = false;\n        }\n      } else {\n        scrollButtonVisible.value = list.scrollTop < 0;\n      }\n    }, 70);\n    // 自动滚动相关状态\n    const scrollTopTmp = ref(0);\n    const scrollHeightTmp = ref(0);\n    const preventAutoScroll = ref(false);\n    const isAutoScrollEnabled = ref(false);\n    const observer = ref<ResizeObserver | null>(null);\n\n    // 滚动到底部\n    const scrollToBottom = (data?: ScrollToBottomParams) => {\n      if (!listRef.value) return;\n      const behavior = data?.behavior ?? 'auto';\n      handleScrollToBottom(listRef.value, behavior);\n    };\n\n    /** 触发自动滚动 */\n    const handleAutoScroll = throttle(() => {\n      const { autoScroll, defaultScrollTo, reverse } = props;\n      if (!autoScroll || !isAutoScrollEnabled.value || reverse) {\n        return;\n      }\n\n      if (!listRef.value) return;\n\n      if (defaultScrollTo === 'top') {\n        listRef.value.scrollTo({\n          top: 0,\n          behavior: 'auto',\n        });\n      } else {\n        scrollToBottom({\n          behavior: 'auto',\n        });\n      }\n    }, 50);\n\n    /** 检测自动滚动是否触发 */\n    const checkAutoScroll = throttle(() => {\n      if (!listRef.value || props.reverse) return;\n      const { scrollTop, scrollHeight, clientHeight } = listRef.value;\n      const { defaultScrollTo } = props;\n\n      // 判断上滚：总高度未变更 && 滚动diff大于阈值\n      const scrollDiff = scrollTopTmp.value - scrollTop;\n      const upScroll = scrollHeight === scrollHeightTmp.value && scrollDiff >= 10 ? true : false;\n      // 用户主动上滚，取消自动滚动，标记为手动阻止\n      if (upScroll) {\n        isAutoScrollEnabled.value = false;\n        preventAutoScroll.value = true;\n      } else {\n        const threshold = 50;\n        let isNearTarget = false;\n\n        if (defaultScrollTo === 'top') {\n          // 滚动到顶部模式：检查是否接近顶部\n          isNearTarget = scrollTop <= threshold;\n        } else {\n          // 滚动到底部模式：检查是否接近底部\n          isNearTarget = scrollHeight - (scrollTop + clientHeight) <= threshold;\n        }\n\n        // 如果手动阻止，必须滚动至目标位置阈值内才可恢复自动滚动\n        if (preventAutoScroll.value) {\n          if (isNearTarget) {\n            isAutoScrollEnabled.value = true;\n            preventAutoScroll.value = false;\n          }\n          // 未手动阻止，可触发自动滚动\n        } else {\n          isAutoScrollEnabled.value = true;\n        }\n      }\n      scrollTopTmp.value = scrollTop;\n    }, 60);\n\n    const handleScroll = (e: Event) => {\n      checkAutoScroll();\n      // 使用防抖检测是否显示“回到底部”按钮（距离底部超过阈值显示）\n      checkAndShowScrollButton();\n      emit('scroll', {\n        e,\n      });\n    };\n\n    // 初始化自动滚动\n    onMounted(() => {\n      const { defaultScrollTo } = props;\n      defaultScrollTo === 'bottom' && !props.reverse && (isAutoScrollEnabled.value = true);\n\n      const list = listRef.value;\n      const inner = innerRef.value;\n\n      // 初始化“回到底部”按钮显示状态\n      checkAndShowScrollButton();\n      if (list) {\n        observer.value = new ResizeObserver(() => {\n          // 高度变化，触发滚动校验\n          if (list?.scrollHeight !== scrollHeightTmp.value) {\n            handleAutoScroll();\n          }\n          scrollHeightTmp.value = list?.scrollHeight || 0;\n        });\n        if (inner) {\n          observer.value?.observe(inner);\n        }\n      }\n    });\n\n    onUnmounted(() => {\n      observer.value?.disconnect();\n    });\n\n    // 平滑回到底部\n    const backBottom = () => {\n      scrollToBottom({ behavior: 'smooth' });\n    };\n\n    expose({\n      scrollToBottom,\n    });\n\n    // clearHistory为true时，清空历史记录显示\n    // return里的props是响应式\n    // 倒序渲染不影响清空历史的位置\n    return () => (\n      <div class={classes.value}>\n        <div class={listClasses.value} ref={listRef} onScroll={handleScroll}>\n          {props.reverse && <div class=\"place-holder\"></div>}\n          {props.reverse && props.clearHistory && renderTNodeJSX('clearHistory', defaultClearHistory)}\n          {props.reverse ? renderBody() : <div ref={innerRef}>{renderBody()}</div>}\n          {!props.reverse && props.clearHistory && renderTNodeJSX('clearHistory', defaultClearHistory)}\n        </div>\n        {showFooter.value && <div class={`${COMPONENT_NAME.value}__footer`}>{showFooter.value}</div>}\n        {props.showScrollButton && scrollButtonVisible.value && (\n          <Button variant=\"text\" class={`${COMPONENT_NAME.value}__to-bottom`} onClick={backBottom}>\n            <div class={`${COMPONENT_NAME.value}__to-bottom-inner`}>\n              <ArrowDownIcon />\n            </div>\n          </Button>\n        )}\n      </div>\n    );\n  },\n});\n"],"names":["handleScrollToBottom","target","behavior","currentScrollHeight","scrollHeight","currentClientHeight","clientHeight","innerBehavior","scrollTop","startScrollTop","endScrollTop","duration","step","startTime","animateScroll","time","elapsed","top","Math","min","requestAnimationFrame","defineComponent","name","props","emits","setup","emit","_ref","expose","COMPONENT_NAME","usePrefixClass","_useConfig","useConfig","globalConfig","renderTNodeJSX","useTNodeJSX","provide","textLoading","animation","reverse","classes","computed","value","_defineProperty","concat","layout","listClasses","renderBody","data","isArray","length","setPlacement","item","role","map","index","avatar","status","content","datetime","actionbar","params","header","clearConfirm","context","defaultClearHistory","_createVNode","Popconfirm","confirmClearHistory","_default","Divider","ClearIcon","clearHistoryBtnText","showFooter","listRef","ref","innerRef","scrollButtonVisible","checkAndShowScrollButton","debounce","showScrollButton","list","scrollTopTmp","scrollHeightTmp","preventAutoScroll","isAutoScrollEnabled","observer","scrollToBottom","_data$behavior","handleAutoScroll","throttle","autoScroll","defaultScrollTo","scrollTo","checkAutoScroll","_listRef$value","scrollDiff","upScroll","threshold","isNearTarget","handleScroll","e","onMounted","inner","ResizeObserver","_observer$value","observe","onUnmounted","_observer$value2","disconnect","backBottom","clearHistory","Button","ArrowDownIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAWA,IAAMA,oBAAA,GAAuB,SAAvBA,oBAAAA,CAAwBC,MAAA,EAAwBC,QAAiC,EAAA;AACrF,EAAA,IAAMC,sBAAsBF,MAAO,CAAAG,YAAA,CAAA;AACnC,EAAA,IAAMC,sBAAsBJ,MAAO,CAAAK,YAAA,CAAA;EAEnC,IAAMC,gBAAgBL,QAAY,KAAA,IAAA,IAAZA,QAAY,KAAZA,KAAAA,CAAAA,GAAAA,QAAY,GAAA,MAAA,CAAA;EAClC,IAAIK,kBAAkB,MAAQ,EAAA;AAC5BN,IAAAA,MAAA,CAAOO,YAAYL,mBAAsB,GAAAE,mBAAA,CAAA;AAC3C,GAAO,MAAA;AACL,IAAA,IAAMI,iBAAiBR,MAAO,CAAAO,SAAA,CAAA;AAC9B,IAAA,IAAME,eAAeP,mBAAsB,GAAAE,mBAAA,CAAA;IAC3C,IAAMM,QAAW,GAAA,GAAA,CAAA;AACX,IAAA,IAAAC,IAAA,GAAA,CAAQF,eAAeD,cAAkB,IAAAE,QAAA,CAAA;AAC3C,IAAA,IAAAE,SAAA,CAAA;AAEE,IAAA,IAAAC,cAAA,GAAgB,SAAhBA,aAAAA,CAAiBC,IAAiB,EAAA;MACtC,IAAI,CAACF,SAAW,EAAA;AACFA,QAAAA,SAAA,GAAAE,IAAA,CAAA;AACd,OAAA;AACA,MAAA,IAAMC,UAAUD,IAAO,GAAAF,SAAA,CAAA;AACvB,MAAA,IAAMI,MAAMC,IAAK,CAAAC,GAAA,CAAIT,YAAc,EAAAD,cAAA,GAAiBO,UAAUJ,IAAI,CAAA,CAAA;MAClEX,MAAA,CAAOO,SAAY,GAAAS,GAAA,CAAA;MACnB,IAAIA,MAAMP,YAAc,EAAA;QACtBU,qBAAA,CAAsBN,cAAa,CAAA,CAAA;AACrC,OAAA;KACF,CAAA;IAEAM,qBAAA,CAAsBN,cAAa,CAAA,CAAA;AACrC,GAAA;AACF,CAAA,CAAA;AAEA,gBAAeO,eAAgB,CAAA;AAC7BC,EAAAA,IAAM,EAAA,WAAA;AACNC,EAAAA,KAAA,EAAAA,KAAA;AACAC,EAAAA,KAAA,EAAO,CAAC,OAAA,EAAS,QAAQ,CAAA;AACzBC,EAAAA,KAAMF,WAANE,KAAMF,CAAAA,MAAAA,EAAAA,IAAAA,EAAyB;AAAA,IAAA,IAAhBG,IAAA,GAAAC,IAAA,CAAAD,IAAA;MAAME,cAAAA;AACb,IAAA,IAAAC,cAAA,GAAiBC,eAAe,MAAM,CAAA,CAAA;AAC5C,IAAA,IAAAC,UAAA,GAAyBC,SAAA,CAAU,MAAM,CAAA;MAAjCC,YAAA,GAAAF,UAAA,CAAAE,YAAA,CAAA;AACR,IAAA,IAAMC,iBAAiBC,WAAY,EAAA,CAAA;AAC3BC,IAAAA,OAAA,CAAA,aAAA,EAAeb,OAAMc,WAAW,CAAA,CAAA;AAChCD,IAAAA,OAAA,CAAA,WAAA,EAAab,OAAMe,SAAS,CAAA,CAAA;AAC5BF,IAAAA,OAAA,CAAA,SAAA,EAAWb,OAAMgB,OAAO,CAAA,CAAA;AAC1B,IAAA,IAAAC,OAAA,GAAUC,SAAS,YAAM;AACtB,MAAA,OAAA,CACLZ,cAAe,CAAAa,KAAA,EAAAC,eAAA,QAAAC,MAAA,CAETf,cAAe,CAAAa,KAAA,EAAkBnB,UAAAA,CAAAA,EAAAA,OAAMsB,MAAW,KAAA,MAAA,CAE1D,CAAA,CAAA;AACF,KAAC,CAAA,CAAA;AAEK,IAAA,IAAAC,WAAA,GAAcL,SAAS,YAAM;AAC1B,MAAA,OAAA,IAAAG,MAAA,CACFf,cAAe,CAAAa,KAAA,aAAAC,eAAA,CAAA,EAAA,EAAA,EAAA,CAAAC,MAAA,CAEZf,cAAe,CAAAa,KAAA,sBAAyBnB,MAAM,CAAAgB,OAAA,CAEtD,CAAA,CAAA;AACF,KAAC,CAAA,CAAA;AACD,IAAA,IAAMQ,aAAa,SAAbA,aAAmB;AAOjB,MAAA,IAAAC,IAAA,GAAOd,eAAe,MAAM,CAAA,CAAA;MAClC,IAAIe,OAAQ,CAAAD,IAAI,CAAK,IAAAA,IAAA,CAAKE,SAAS,CAAG,EAAA;AAE9B,QAAA,IAAAC,YAAA,GAAe,SAAfA,YAAAA,CAAgBC,IAAyB,EAAA;AACzC7B,UAAAA,IAAAA,MAAAA,CAAMsB,WAAW,MAAQ,EAAA;AAC3B,YAAA,IAAIO,KAAKC,IAAS,KAAA,WAAA,EAAoB,OAAA,MAAA,CAAA;AACtC,YAAA,IAAID,KAAKC,IAAS,KAAA,MAAA,EAAe,OAAA,OAAA,CAAA;AAC1B,YAAA,OAAA,MAAA,CAAA;AACT,WAAA;AACO,UAAA,OAAA,MAAA,CAAA;SACT,CAAA;AACO,QAAA,OAAAL,IAAA,CAAKM,IAAI,UAACF,IAAA,EAAsBG;;oBAE3BH,EAAAA,IAAK,CAAAI,MAAA;YAAA,MACPJ,EAAAA,IAAK,CAAA9B,IAAA;YAAA,MACL8B,EAAAA,IAAK,CAAAC,IAAA;YAAA,QAETD,EAAAA,IAAK,CAAAK,MAAA,IAAWlC,OAAMc,WAAgBd,KAAAA,MAAAA,CAAMgB,UAAUgB,KAAU,KAAA,CAAA,GAAIA,UAAUP,IAAK,CAAAE,MAAA,GAAS,KACxF,SACA,GAAA,IAAA;YAAA,SAEGE,EAAAA,IAAK,CAAAM,OAAA;YAAA,UACJN,EAAAA,IAAK,CAAAO,QAAA;YAAA,WACJpC,EAAAA,MAAM,CAAAe,SAAA;YAAA,WACNa,EAAAA,YAAa,CAAAC,IAAI,CAAA;WACnB,EAAA;YACPQ,SAAA,EAAW,SAAXA,SAAAA,GAAA;cAAA,OACE1B,cAAA,CAAe,WAAa,EAAA;AAC1B2B,gBAAAA,MAAA,EAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AACxB,eAAC,CACD,IAAArB,cAAA,CAAe,SAAW,EAAA;AACxB2B,gBAAAA,MAAA,EAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AACxB,eAAC,CAAA,CAAA;AAAA,aAAA;YACHjC,IAAA,EAAM,SAANA,IAAAA,GAAA;cAAA,OAAYY,cAAA,CAAe,MAAQ,EAAA;AAAE2B,gBAAAA,QAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AAAE,eAAC,CAAA,CAAA;AAAA,aAAA;YAC9DC,MAAA,EAAQ,SAARA,MAAAA,GAAA;cAAA,OAActB,cAAA,CAAe,QAAU,EAAA;AAAE2B,gBAAAA,QAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AAAE,eAAC,CAAA,CAAA;AAAA,aAAA;YAClEI,QAAA,EAAU,SAAVA,QAAAA,GAAA;cAAA,OAAgBzB,cAAA,CAAe,UAAY,EAAA;AAAE2B,gBAAAA,QAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AAAE,eAAC,CAAA,CAAA;AAAA,aAAA;YACtEO,MAAA,EAAQ,SAARA,MAAAA,GAAA;cAAA,OAAc5B,cAAA,CAAe,QAAU,EAAA;AAAE2B,gBAAAA,QAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AAAE,eAAC,CAAA,CAAA;AAAA,aAAA;YAClEG,OAAA,EAAS,SAATA,OAAAA,GAAA;cAAA,OAAexB,cAAA,CAAe,SAAW,EAAA;AAAE2B,gBAAAA,QAAQ;AAAET,kBAAAA,IAAA,EAAAA,IAAA;AAAMG,kBAAAA,KAAM,EAANA,KAAAA;AAAM,iBAAA;AAAE,eAAC,CAAA,CAAA;AAAA,aAAA;;SAGzE,CAAA,CAAA;AACH,OAAO,MAAA;QACL,OAAOrB,eAAe,SAAS,CAAA,CAAA;AACjC,OAAA;KACF,CAAA;AACM,IAAA,IAAA6B,YAAA,GAAe,SAAfA,YAAAA,CAAgBC,OAA+B,EAAA;AACnDtC,MAAAA,IAAA,CAAK,SAASsC,OAAO,CAAA,CAAA;KACvB,CAAA;AACM,IAAA,IAAAC,mBAAA,GAAAC,WAAA,CAAAC,UAAA,EAAA;AAAA,MAAA,SAAA,EACiBlC,YAAA,CAAaS,KAAM,CAAA0B,mBAAA;MAAA,WAAgCL,EAAAA,YAAAA;AAAA,KAAA,EAAA;AAAA,MAAA,SAAA,EAAA,SAAAM,QAAA,GAAA;QAAA,OAAAH,CAAAA,WAAA,CAAAI,OAAA,EAAA;AAAA,UAAA,OAAA,EAAA,WAAA;AAAA,SAAA,EAAA;AAAA,UAAA,SAAA,EAAA,SAAAD,QAAA,GAAA;YAAA,OAAAH,CAAAA,WAAA,CAAAK,SAAA,EAAA;AAAA,cAAA,MAAA,EAAA,MAAA;AAAA,aAAA,EAAA,IAAA,CAAA,EAAAL,WAAA,CAAA,MAAA,EAAA;AAAA,cAAA,OAAA,EAAA,gBAAA;AAAA,aAAA,EAAA,CAGtCjC,YAAa,CAAAS,KAAA,CAAM8B;;;;KAHpD,CAAA,CAAA;IAOH,IAAMC,UAAa,GAAAhC,QAAA,CAAS,YAAA;MAAA,OAAMP,cAAA,CAAe,QAAQ,CAAC,CAAA;KAAA,CAAA,CAAA;AAC1D,IAAA,IAAMwC,UAAUC,GAAoB,EAAA,CAAA;AACpC,IAAA,IAAMC,WAAWD,GAAoB,EAAA,CAAA;AAE/B,IAAA,IAAAE,mBAAA,GAAsBF,IAAI,KAAK,CAAA,CAAA;AAE/B,IAAA,IAAAG,wBAAA,GAA2BC,SAAS,YAAM;AAE1C,MAAA,IAAA,CAACxD,OAAMyD,gBAAkB,EAAA;QAC3BH,mBAAA,CAAoBnC,KAAQ,GAAA,KAAA,CAAA;AAC5B,QAAA,OAAA;AACF,OAAA;AACA,MAAA,IAAMuC,OAAOP,OAAQ,CAAAhC,KAAA,CAAA;MACrB,IAAI,CAACuC,IAAA,EAAM,OAAA;AACP,MAAA,IAAA,CAAC1D,OAAMgB,OAAS,EAAA;AAClB,QAAA,IAAI0C,QAAQA,IAAK,CAAA7E,YAAA,GAAe6E,KAAK3E,YAAe,GAAA2E,IAAA,CAAKzE,YAAY,CAAG,EAAA;UACtEqE,mBAAA,CAAoBnC,KAAQ,GAAA,IAAA,CAAA;AAC9B,SAAO,MAAA;UACLmC,mBAAA,CAAoBnC,KAAQ,GAAA,KAAA,CAAA;AAC9B,SAAA;AACF,OAAO,MAAA;AACemC,QAAAA,mBAAA,CAAAnC,KAAA,GAAQuC,KAAKzE,SAAY,GAAA,CAAA,CAAA;AAC/C,OAAA;OACC,EAAE,CAAA,CAAA;AAEC,IAAA,IAAA0E,YAAA,GAAeP,IAAI,CAAC,CAAA,CAAA;AACpB,IAAA,IAAAQ,eAAA,GAAkBR,IAAI,CAAC,CAAA,CAAA;AACvB,IAAA,IAAAS,iBAAA,GAAoBT,IAAI,KAAK,CAAA,CAAA;AAC7B,IAAA,IAAAU,mBAAA,GAAsBV,IAAI,KAAK,CAAA,CAAA;AAC/B,IAAA,IAAAW,QAAA,GAAWX,IAA2B,IAAI,CAAA,CAAA;AAG1C,IAAA,IAAAY,cAAA,GAAiB,SAAjBA,cAAAA,CAAkBvC,IAAgC,EAAA;AAAA,MAAA,IAAAwC,cAAA,CAAA;AACtD,MAAA,IAAI,CAACd,OAAQ,CAAAhC,KAAA,EAAO,OAAA;AACd,MAAA,IAAAxC,QAAA,GAAAsF,CAAAA,cAAA,GAAWxC,iBAAAA,2BAAAA,KAAM9C,QAAY,MAAAsF,IAAAA,IAAAA,cAAA,KAAAA,KAAAA,CAAAA,GAAAA,cAAA,GAAA,MAAA,CAAA;AACdxF,MAAAA,oBAAA,CAAA0E,OAAA,CAAQhC,OAAOxC,QAAQ,CAAA,CAAA;KAC9C,CAAA;AAGM,IAAA,IAAAuF,gBAAA,GAAmBC,SAAS,YAAM;AACtC,MAAA,IAAQC,UAAA,GAAyCpE,MAAAA,CAAzCoE,UAAA;QAAYC,eAAiB,GAAYrE,MAAAA,CAA7BqE,eAAiB;QAAArD,OAAA,GAAYhB,MAAAA,CAAZgB,OAAA,CAAA;MACrC,IAAI,CAACoD,UAAA,IAAc,CAACN,mBAAA,CAAoB3C,SAASH,OAAS,EAAA;AACxD,QAAA,OAAA;AACF,OAAA;AAEA,MAAA,IAAI,CAACmC,OAAQ,CAAAhC,KAAA,EAAO,OAAA;MAEpB,IAAIkD,oBAAoB,KAAO,EAAA;AAC7BlB,QAAAA,OAAA,CAAQhC,MAAMmD,QAAS,CAAA;AACrB5E,UAAAA,GAAK,EAAA,CAAA;AACLf,UAAAA,QAAU,EAAA,MAAA;AACZ,SAAC,CAAA,CAAA;AACH,OAAO,MAAA;AACUqF,QAAAA,cAAA,CAAA;AACbrF,UAAAA,QAAU,EAAA,MAAA;AACZ,SAAC,CAAA,CAAA;AACH,OAAA;OACC,EAAE,CAAA,CAAA;AAGC,IAAA,IAAA4F,eAAA,GAAkBJ,SAAS,YAAM;MACjC,IAAA,CAAChB,OAAQ,CAAAhC,KAAA,IAASnB,MAAM,CAAAgB,OAAA,EAAS,OAAA;AACrC,MAAA,IAAAwD,cAAA,GAAkDrB,OAAQ,CAAAhC,KAAA;QAAlDlC,SAAA,GAAAuF,cAAA,CAAAvF,SAAA;QAAWJ,YAAc,GAAA2F,cAAA,CAAd3F,YAAc;QAAAE,YAAA,GAAAyF,cAAA,CAAAzF,YAAA,CAAA;AAC3B,MAAA,IAAEsF,kBAAoBrE,MAAAA,CAApBqE;AAGF,MAAA,IAAAI,UAAA,GAAad,aAAaxC,KAAQ,GAAAlC,SAAA,CAAA;AACxC,MAAA,IAAMyF,WAAW7F,YAAiB,KAAA+E,eAAA,CAAgBzC,KAAS,IAAAsD,UAAA,IAAc,KAAK,IAAO,GAAA,KAAA,CAAA;AAErF,MAAA,IAAIC,QAAU,EAAA;QACZZ,mBAAA,CAAoB3C,KAAQ,GAAA,KAAA,CAAA;QAC5B0C,iBAAA,CAAkB1C,KAAQ,GAAA,IAAA,CAAA;AAC5B,OAAO,MAAA;QACL,IAAMwD,SAAY,GAAA,EAAA,CAAA;QAClB,IAAIC,YAAe,GAAA,KAAA,CAAA;QAEnB,IAAIP,oBAAoB,KAAO,EAAA;UAE7BO,YAAA,GAAe3F,SAAa,IAAA0F,SAAA,CAAA;AAC9B,SAAO,MAAA;UAEUC,YAAA,GAAA/F,YAAA,IAAgBI,YAAYF,YAAiB,CAAA,IAAA4F,SAAA,CAAA;AAC9D,SAAA;QAGA,IAAId,kBAAkB1C,KAAO,EAAA;AAC3B,UAAA,IAAIyD,YAAc,EAAA;YAChBd,mBAAA,CAAoB3C,KAAQ,GAAA,IAAA,CAAA;YAC5B0C,iBAAA,CAAkB1C,KAAQ,GAAA,KAAA,CAAA;AAC5B,WAAA;AAEF,SAAO,MAAA;UACL2C,mBAAA,CAAoB3C,KAAQ,GAAA,IAAA,CAAA;AAC9B,SAAA;AACF,OAAA;MACAwC,YAAA,CAAaxC,KAAQ,GAAAlC,SAAA,CAAA;OACpB,EAAE,CAAA,CAAA;AAEC,IAAA,IAAA4F,YAAA,GAAe,SAAfA,YAAAA,CAAgBC,CAAa,EAAA;AACjBP,MAAAA,eAAA,EAAA,CAAA;AAEShB,MAAAA,wBAAA,EAAA,CAAA;MACzBpD,IAAA,CAAK,QAAU,EAAA;AACb2E,QAAAA,CAAA,EAAAA,CAAAA;AACF,OAAC,CAAA,CAAA;KACH,CAAA;AAGAC,IAAAA,SAAA,CAAU,YAAM;AACR,MAAA,IAAEV,kBAAoBrE,MAAAA,CAApBqE;AACRA,MAAAA,eAAA,KAAoB,QAAY,IAAA,CAACrE,MAAM,CAAAgB,OAAA,KAAY8C,oBAAoB3C,KAAQ,GAAA,IAAA,CAAA,CAAA;AAE/E,MAAA,IAAMuC,OAAOP,OAAQ,CAAAhC,KAAA,CAAA;AACrB,MAAA,IAAM6D,QAAQ3B,QAAS,CAAAlC,KAAA,CAAA;AAGEoC,MAAAA,wBAAA,EAAA,CAAA;AACzB,MAAA,IAAIG,IAAM,EAAA;AACCK,QAAAA,QAAA,CAAA5C,KAAA,GAAQ,IAAI8D,cAAA,CAAe,YAAM;AAEpC,UAAA,IAAA,CAAAvB,IAAA,KAAAA,IAAAA,IAAAA,IAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAA,CAAM7E,YAAiB,MAAA+E,eAAA,CAAgBzC,KAAO,EAAA;AAC/B+C,YAAAA,gBAAA,EAAA,CAAA;AACnB,WAAA;AACgBN,UAAAA,eAAA,CAAAzC,KAAA,GAAQ,CAAAuC,iBAAAA,2BAAAA,KAAM7E,YAAgB,KAAA,CAAA,CAAA;AAChD,SAAC,CAAA,CAAA;AACD,QAAA,IAAImG,KAAO,EAAA;AAAA,UAAA,IAAAE,eAAA,CAAA;AACA,UAAA,CAAAA,eAAA,GAAAnB,QAAA,CAAA5C,KAAA,MAAA,IAAA,IAAA+D,eAAA,KAAA,KAAA,CAAA,IAAAA,eAAA,CAAOC,QAAQH,KAAK,CAAA,CAAA;AAC/B,SAAA;AACF,OAAA;AACF,KAAC,CAAA,CAAA;AAEDI,IAAAA,WAAA,CAAY,YAAM;AAAA,MAAA,IAAAC,gBAAA,CAAA;AAChB,MAAA,CAAAA,gBAAA,GAAAtB,QAAA,CAAS5C,kDAATkE,gBAAA,CAAgBC,UAAW,EAAA,CAAA;AAC7B,KAAC,CAAA,CAAA;AAGD,IAAA,IAAMC,aAAa,SAAbA,aAAmB;AACRvB,MAAAA,cAAA,CAAA;AAAErF,QAAAA,QAAU,EAAA,QAAA;AAAS,OAAC,CAAA,CAAA;KACvC,CAAA;AAEO0B,IAAAA,MAAA,CAAA;AACL2D,MAAAA,cAAA,EAAAA,cAAAA;AACF,KAAC,CAAA,CAAA;IAKD,OAAO,YAAA;AAAA,MAAA,OAAArB,WAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EACO1B,OAAQ,CAAAE,KAAAA;AAAA,OAAA,EAAA,CAAAwB,WAAA,CAAA,KAAA,EAAA;QAAA,OACNpB,EAAAA,YAAYJ,KAAO;AAAA,QAAA,KAAA,EAAKgC;kBAAmB0B,EAAAA,YAAAA;AAAA,OAAA,EAAA,CACpD7E,MAAM,CAAAgB,OAAA,IAAA2B,WAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAAA,cAAA;OAAqC,EAAA,IAAA,CAAA,EAC3C3C,OAAMgB,OAAWhB,IAAAA,MAAAA,CAAMwF,YAAgB,IAAA7E,cAAA,CAAe,gBAAgB+B,mBAAmB,CAAA,EACzF1C,MAAAA,CAAMgB,OAAU,GAAAQ,UAAA,EAAe,GAAAmB,WAAA,CAAA,KAAA,EAAA;QAAA,KAAUU,EAAAA,QAAAA;OAAW7B,EAAAA,CAAAA,UAAW,EAAA,CAA/B,CAAA,EAChC,CAACxB,MAAM,CAAAgB,OAAA,IAAWhB,OAAMwF,YAAgB,IAAA7E,cAAA,CAAe,gBAAgB+B,mBAAmB,CAAA,CAAA,CAAA,EAE5FQ,UAAA,CAAW/B,KAAS,IAAAwB,WAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAAA,EAAA,CAAAtB,MAAA,CAAef,cAAe,CAAAa,KAAA,EAAA,UAAA,CAAA;AAAA,OAAA,EAAA,CAAkB+B,UAAW,CAAA/B,KAAA,CAAA,CAA1D,EACrBnB,MAAAA,CAAMyD,gBAAoB,IAAAH,mBAAA,CAAoBnC,KAC7C,IAAAwB,WAAA,CAAA8C,MAAA,EAAA;AAAA,QAAA,SAAA,EAAA,MAAA;AAAA,QAAA,OAAA,EAAA,EAAA,CAAApE,MAAA,CAAiCf,cAAe,CAAAa,KAAA,EAAA,aAAA,CAAA;QAAA,SAA6BoE,EAAAA,UAAAA;AAC3E,OAAA,EAAA;AAAA,QAAA,SAAA,EAAA,SAAAzC,QAAA,GAAA;AAAA,UAAA,OAAA,CAAAH,WAAA,CAAA,KAAA,EAAA;AAAA,YAAA,OAAA,EAAA,EAAA,CAAAtB,MAAA,CAAef,cAAA,CAAea,KAC5B,EAAA,mBAAA,CAAA;WAAAwB,EAAAA,CAAAA,WAAA,CAAA+C,aAAA,EAAA,IAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,SAAA;OAFH,CAAA,CAAA,CAAA,CAAA;KATJ,CAAA;AAiBL,GAAA;AACF,CAAC,CAAA;;;;"}