{"version":3,"file":"tg-map.cjs","sources":["../src/utils/vue-utils.ts","../src/components/map-mixin.ts","../src/components/TgMap.vue","../src/components/TgMapWidget.vue","../src/components/controls/TgCustomControl.vue","../src/components/controls/TgMapTypeControl.vue","../src/components/controls/TgScaleControl.vue","../src/utils/hooks.ts","../src/components/map-hooks.ts","../src/components/controls/TgStreetViewControl.vue","../src/components/controls/TgZoomControl.vue","../src/components/extra/TgHeatmap.vue","../src/components/extra/TgMarkerClusterer.vue","../src/components/layers/TgTrafficLayer.vue","../src/components/overlays/TgCircle.vue","../src/components/overlays/TgElementOverlay.vue","../src/components/overlays/TgMarker.vue","../src/components/overlays/TgInfoBox.vue","../src/components/overlays/TgInfoWindow.vue","../src/components/overlays/TgLabel.vue","../src/components/overlays/TgPolygon.vue","../src/components/overlays/TgPolyline.vue","../src/components/overlays/TgRectangle.vue","../src/utils/lifecycle-log.ts","../src/components/index.ts"],"sourcesContent":["import { noop } from 'tg-commons'\nimport { Strings, type AbstractConstructor, type EventCallback, type KeysMatching, type StringEnumLike, type StringEnumValue, type Thing } from 'tg-map-core'\nimport {\n  computed,\n  createCommentVNode,\n  type Component,\n  type ComponentOptions,\n  type ComponentPublicInstance,\n  type ComputedRef,\n  type Prop,\n  type PropType,\n  type Ref,\n  type RendererElement,\n  type RendererNode,\n  type Slots,\n  type VNode,\n  type WritableComputedOptions,\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  type reactive,\n} from 'vue'\n/** 组件选项中的hook名 */\nexport type VueHookName = ExcludeSubtype<\n  KeysMatching<OmitStartsWith<RemoveIndex<ComponentOptions>, '_'>, { (): void } | undefined>,\n  'serverPrefetch' | 'emits' | 'computed' | 'extends' | 'methods' | 'call' | undefined\n>\n\nexport type VueHookFunction = (this: ComponentPublicInstance) => void\n\n/**\n * 模仿Vue的计算属性的写法\n * @see ComputedOptions\n */\nexport type Property<T> = T | { (): T } | { get(): T, set?(value: T): void }\n\n/**\n * ## Vue2\n * 和typed()联合使用, 写成: `props: typed<Props<Options>>({...})`, 可以将`Options`作为属性的类型声明,\n * ### 注意\n * 1. 对于`Options`中可选的属性, 漏了VSCode不会报错...要小心\n * 2. `...`中理论上来说只要写Vue的纯js式的类型验证信息(Boolean/Number/String/Object/...)就行了, 并且还有ts的类型检查\n * 3. 对于`Options`中可选的`boolean`属性, 若将类型验证信息写为`Boolean`时, 该属性的默认值并不是`undefined`而是`false`, 这和它的类型声明(`boolean | undefined`)不匹配, 推荐写成`optionalProp(Boolean)`\n * 4. 因为存在上述特殊情况, 推荐使用{@link requiredProp},{@link optionalProp}等快捷方法写类型验证信息, 方法的传入参数直接写Vue的纯js式的类型验证信息, 就行了\n *\n * ## Vue3\n * 需要用`props: {...} satisfies Props<Options>`替代`typed()`, 防止{@link NotNullProp}被Vue看成必选的属性\n * */\nexport type Props<T> = {\n  // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n  [K in keyof T]-?: T[K] extends {} ? NotNullProp<T[K]> : Prop<Exclude<T[K], undefined>>\n}\n/** 表示一个非空的Prop, `required`为true 或者 设置了`default`的{@link Prop}, 才是非空的Prop */\ntype NotNullProp<T = any, D = T> = { type: PropType<T> } & ({ required: true } | { default: D | (() => D) })\n\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue: E[keyof E]): { type: PropType<StringEnumValue<E>>, default: E[keyof E] }\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E): { type: PropType<StringEnumValue<E>> }\n/**\n * 注意: 由于使用了`Object.values(enumObject)`来获取所有枚举值\n * - 若enumObject为数字枚举, 获取出来的值会同时包含枚举名和枚举值, 故不支持\n * - 若enumObject同时是命名空间名, 获取出来的值会包含命名空间上的方法, 应当避免\n *\n * @param enumObject 枚举对象\n * @param defaultValue 默认值\n * @see https://frontendsociety.com/using-a-typescript-interfaces-and-types-as-a-prop-type-in-vuejs-508ab3f83480\n * */\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue?: E[keyof E]): Prop<StringEnumValue<E>> {\n  return {\n    type: String as any,\n    default: defaultValue,\n    validator: (value: E[keyof E]) => Object.values(enumObject).includes(value),\n  }\n}\n\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue: T): { type: PropType<T[][number]>, default: T }\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[]): { type: PropType<T[][number]> }\n/** 使用方法重载, 声明`是否提供defaultValue`和`返回值是否可undefined`的关系_(:3」∠)_ */\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue?: T): Prop<T[][number]> {\n  return {\n    type: String as any,\n    default: defaultValue,\n    validator: (value: T) => values.includes(value),\n  }\n}\n\nexport function requiredProp<T>(type: PropType<T>): { type: PropType<T>, required: true } {\n  return {\n    type: type,\n    required: true,\n  }\n}\n\nexport function optionalProp<T>(type: PropType<T>, defaultValue: T | (() => T)): { type: PropType<T>, default: T }\nexport function optionalProp<T>(type: PropType<T>): { type: PropType<T> }\nexport function optionalProp<T>(type: PropType<T>, defaultValue?: T | (() => T)): Prop<T> {\n  return {\n    type: type,\n    default: defaultValue,\n  }\n}\n\n/**\n * 保存在this上的属性\n * @param defaultValues 属性的默认值\n *\n * @deprecated Vue3中已经不支持`cache: false`的计算属性, 使用setup中返回普通的值替代\n */\nexport function computedSaveOnThis<T>(defaultValues: { [K in keyof T]: T[K] }): { [K in keyof T]: WritableComputedOptions<T[K]> } {\n  const accessors: any = {}\n  Object.entries(defaultValues).forEach(([key, defaultValue]) => {\n    const name = `__${key}`\n    accessors[key] = {\n      get() {\n        const value = this[name]\n        return value === undefined ? defaultValue : value\n      },\n      set(value: any) {\n        this[name] = value\n      },\n      // Vue3已经不支持该属性\n      // cache: false\n    }\n  })\n  return accessors\n}\n\n// 这个对象是可以共享的~~\nconst sharedPropertyDefinition: PropertyDescriptor = {\n  enumerable: true,\n  configurable: true,\n  get: noop,\n  set: noop,\n}\n\n/**\n * 模仿Vue的计算属性的写法, 将方法转换成属性\n * @deprecated 在Vue2时用来将provide的方法转换成属性, 方便使用, Vue3中不生效, 故废弃\n */\nexport function createPropertyObject(obj: any): any {\n  Object.keys(obj).forEach(key => {\n    const value = obj[key]\n    let redefined = false\n    if (typeof value === 'function') {\n      sharedPropertyDefinition.get = value\n      sharedPropertyDefinition.set = noop\n      redefined = true\n    } else if (typeof value === 'object' && typeof value.get === 'function') {\n      sharedPropertyDefinition.get = value.get\n      sharedPropertyDefinition.set = value.set\n      redefined = true\n    }\n    if (redefined) {\n      obj[key] = Object.defineProperty(obj, key, sharedPropertyDefinition)\n    }\n  })\n  return obj\n}\n\n/**\n * 相比{@link createPropertyObject}增加类型信息\n * @see createPropertyObject\n * @deprecated Vue3中没用\n * */\nexport function createPropertyObjectTyped<T>(obj: { [K in keyof T]: Property<T[K]> }): T {\n  return createPropertyObject(obj)\n}\n\n/**\n * 创建空节点\n *\n * Vue2中使用`this._e()`创建空节点: https://github.com/vuejs/vue/blob/b6247fc9d7442c50d60ccf366a7cb183a4d02129/src/core/instance/render-helpers/index.js#L28\n *\n * Vue3中等价的实现是{@link createCommentVNode}: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/compat/instance.ts#L162\n */\nexport function createEmptyVNode(): VNode {\n  return createCommentVNode()\n}\n/**\n * @see https://github.com/vuejs/vue/blob/43b98fe25151b0b6bacd36f3ee27c5d61add5fdb/packages/weex-vue-framework/factory.js/#L2906\n * */\nexport function callHook(vm: ComponentPublicInstance, hookName: VueHookName) {\n  // $options中的每个hook函数被合并成一个数组了\n  const hooks: Array<VueHookFunction> | undefined = (vm.$options as any)[hookName]\n  if (!hooks) {\n    return\n  }\n  for (const hook of hooks) {\n    hook.call(vm)\n  }\n}\n\n/**\n * {@link import('./mapped-types.ts').safeAsComponent}\n * @deprecated Vue3已经不能遍历子组件的实例了, 所以这个方法目前没用\n */\nexport function findByComponentType<T extends Component & AbstractConstructor>(\n  arr: ComponentPublicInstance[],\n  component: T,\n): InstanceType<T> | undefined {\n  for (const item of arr) {\n    // TO-DO: 2023/03/16 ipcjs 有没有更好的判断组件实例的方式?\n    //                      => 目前没找到\n    if (item.$options.name === component.name) {\n      return item as InstanceType<T>\n    }\n  }\n  return undefined\n}\n\n/**\n * 通过构造slots内容的方式, 提取出slots中对应{@link component}的VNode, {@link VNode.props}就是当前给组件设置的属性值\n *\n * 注意, 该方法并无法获取到{@link component}的实例\n *\n * @see https://stackoverflow.com/questions/64154002/vue-3-how-to-get-information-about-children\n */\nexport function extractVNodeFromSlotsByComponent<Props>(slots: Slots, component: ComponentOptions<Props>) {\n  if (!slots.default) return undefined\n\n  const nodeList = slots.default()\n  for (const node of nodeList) {\n    if ((node?.type as Component).name === component.name) {\n      return node as VNode<RendererNode, RendererElement, Props>\n    }\n  }\n  return undefined\n}\n\n/**\n * Vue3中 class/style/未声明的事件/未声明的属性 都会集合到`this.$attrs`中\n * 默认情况下(`inheritAttrs`为true), 将被透传给组件的根节点\n *\n * 而Vue2, `this.$attrs`值包含 未声明的属性, 所有事件放到了`this.$listeners`中\n *\n * 这里模仿Vue2的行为, 从{@link attrs}中拆分出未声明的事件, 方便将他们透传给地图的对象\n * 同时若传入{@link props}, 也会从它里面拆分出 声明的事件类型的属性\n *\n * ## 如何给事件添加类型信息\n *\n * - 声明在`emits`中的事件, 会给emit方法添加类型信息, 但没办法在运行时判断是否有被设置\n * - 声明在`props`中的事件, 不会.................. , 但可以通过读取`this.$props`判断是否被设置\n *\n * 所有我们最终选择用{@link EventProps}在`props`中声明事件, 同时用{@link EventEmits}在`emits`上声明事件的类型,\n * 达到既有类型信息, 又能判断是否存在的效果, 写法如下:\n * ```\n * {\n *   props: {...} satisfies EventProps<TgMapEmits>,\n *   emits: undefined as any as EventEmits<TgMapEmits>,\n * }\n * ```\n *\n * ## 参考\n * - https://cn.vuejs.org/guide/components/attrs.html#disabling-attribute-inheritance\n * - https://v3-migration.vuejs.org/zh/breaking-changes/listeners-removed.html\n * - https://eslint.vuejs.org/rules/require-explicit-emits.html#options\n */\nexport function splitAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n  const listeners: Record<string, unknown> = {}\n  const binds: Record<string, unknown> = {}\n  const listenerProps: Record<string, unknown> = {}\n  Object.keys(attrs).forEach(key => {\n    if (key.startsWith('on')) {\n      listeners[Strings.pascal2kebab(key.substring(2))] = attrs[key]\n    } else {\n      binds[key] = attrs[key]\n    }\n  })\n  if (props) {\n    Object.keys(props).forEach(key => {\n      if (key.startsWith('on')) {\n        listenerProps[Strings.pascal2kebab(key.substring(2))] = props[key]\n      }\n    })\n  }\n  return {\n    /** class/style/未声明的属性 等 */\n    binds,\n    /** 未声明的事件 */\n    listeners,\n    /** 声明在`props`中的事件 */\n    listenerProps,\n  }\n}\n\n/** 响应式的{@link splitAttrs} */\nexport function useSplittedAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n  return computed(() => splitAttrs(attrs, props))\n}\n\n/**\n * 事件类型的属性\n * @see splitAttrs\n * */\nexport type EventProps<Emits> = Emits extends string\n  // 转换 简单的String Union, 类型使用Function, 是为了简便, 省得写详细的类型信息\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  ? { [K in Emits as `on${Capitalize<K>}`]: Prop<Function> }\n  // 转换 事件名=>事件类型的映射\n  : {\n      [K in keyof Emits as K extends string ? `on${Capitalize<K>}` : never]: Prop<EventCallback<Emits[K]>>\n    }\n\n/**\n * 用来声明事件的类型信息\n * @see splitAttrs\n *  */\nexport type EventEmits<T> = {\n  [K in keyof T]: (event: T[K]) => boolean\n}\n\n/** 给事件类型的属性标注类型 */\nexport function eventProp<E = any>(): Prop<EventCallback<E>> {\n  return Function as PropType<EventCallback<E>>\n}\n\nexport const useEventLogMethods = () => {\n  let prevType: Thing | undefined\n  let prevTime: number | undefined\n  /**\n     * @event 一般来说传{@link Tg.Event}对象, 但传其他对象也不会报错\n     */\n  function eventLog(event: Thing | null | undefined) {\n    console.log(event)\n    prevType = event && (event as any).type\n    prevTime = Date.now()\n  }\n  /** @see eventLog */\n  function eventLogLess(this: any, event: Thing | null | undefined) {\n    if ((event && (event as any).type) !== prevType || Date.now() - (prevTime ?? 0) > 1000) {\n      eventLog(event)\n    }\n  }\n  return { eventLog, eventLogLess }\n}\n\n/**\n * 值可能是Ref的对象\n * 可以用来给{@link reactive}的参数做类型约束\n * */\nexport type MaybeWrapRefs<T> = {\n  [P in keyof T]: Ref<T[P]> | T[P] | ComputedRef<T[P]>\n}\n\n/** 判断{@link instance}是否是{@link component}的实例 */\nexport function isComponentByType<C extends Component & AbstractConstructor>(\n  instance: ComponentPublicInstance | null,\n  component: C,\n): instance is InstanceType<C> {\n  // TODO: 2023/03/15 ipcjs 看有没有其他更好的方式判断组件类型\n  return instance?.$options.name === component.name\n}\n\n/** 安全转换组件类型, 若不能转换会返回`undefined` */\nexport function safeAsComponent<C extends Component & AbstractConstructor>(\n  instance: ComponentPublicInstance | null,\n  component: C,\n): InstanceType<C> | undefined {\n  return isComponentByType(instance, component) ? instance : undefined\n}\n\n/**\n * 查找[startInstance, endComponent)之间的第一个类型为{@link component}的父组件\n * @param component 查找的组件\n * @param startInstance 查找的开始实例, 包含\n * @param endComponent 查找的终止组件, 不包含\n * @returns\n */\nexport function findAncestorComponentByType<C extends Component & AbstractConstructor>(\n  component: C,\n  startInstance: ComponentPublicInstance | null,\n  endComponent?: Component & AbstractConstructor,\n): InstanceType<C> | undefined {\n  let instance = startInstance\n  while (instance) {\n    if (isComponentByType(instance, component)) {\n      return instance\n    } else if (endComponent && isComponentByType(instance, endComponent)) {\n      return undefined\n    } else {\n      instance = instance.$parent\n    }\n  }\n  return undefined\n}\n","import type { BaseMap } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { callHook, createEmptyVNode } from '../utils/vue-utils'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { useTgMapInner } from './map-hooks'\n\nexport const MIXIN_MAP_NAME = '$map'\nexport const MIXIN_HOOK_CREATE = 'onCreate'\nexport const MIXIN_HOOK_DESTROY = 'onDestroy'\n\ndeclare module 'vue' {\n  interface ComponentCustomProperties {\n    /** 混合了MapMixin的Vue才会有该属性 */\n    [MIXIN_MAP_NAME]: BaseMap,\n    /** 混合了MapMixin的Vue才会有该属性, 会依次调用onDestroy + onCreate, 你应该在这两个hook中分别实现 移除 和 创建并添加 覆盖物的逻辑 */\n    recreate: () => void,\n  }\n\n  interface ComponentCustomOptions {\n    [MIXIN_HOOK_CREATE]?(): void\n    [MIXIN_HOOK_DESTROY]?(): void\n  }\n}\n\n/** @deprecated 使用{@link useTgMapInner}替代 */\nconst MapMixin = defineComponent({\n  inject: [MIXIN_MAP_NAME],\n  mounted() {\n    // children先执行, parent后执行\n    // parent中可以读取到this.$children, 参见: TgMarkerClusterer\n    callHook(this, MIXIN_HOOK_CREATE)\n  },\n  beforeUnmount() {\n    // parent先执行, children后执行\n    callHook(this, MIXIN_HOOK_DESTROY)\n  },\n  methods: {\n    recreate() {\n      callHook(this, MIXIN_HOOK_DESTROY)\n      callHook(this, MIXIN_HOOK_CREATE)\n    },\n  },\n  render() {\n    return createEmptyVNode()\n  },\n})\n\nexport default MapMixin\n","<template>\n  <div class=\"tg-map\" v-bind=\"attrs.binds\">\n    <div\n      ref=\"map\"\n      :class=\"{\n        'tg-map__map': true,\n        [`tg-map__map--hide-logo-${type}`]: hideLogo\n      }\"\n    ></div>\n    <div v-if=\"false\" style=\"position:absolute;right:0px;top:0px;\">\n      props:{{ propsJson }}\n    </div>\n    <template v-if=\"map\">\n      <slot></slot>\n    </template>\n    <slot name=\"overlay\"></slot>\n  </div>\n</template>\n<script lang=\"ts\">\nimport { typed } from 'tg-commons'\nimport { bindEvents, BuildInMapTypeId, GestureHandlingOptions, InfoWindowModeValues, LatLng, loadCachedMap, MapType, Objects, TgMapFactory, TgMapType, unwrapStringEnumValue, type AbstractMap, type AbstractMapEventMap, type BaseMap, type MapOptions, type MapStyle, type StringEnumValue, type WrapStringEnumValue } from 'tg-map-core'\nimport { computed, defineComponent, markRaw, watch, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, stringEnumProp, stringUnionPropFromValues, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../utils/vue-utils'\nimport { MIXIN_MAP_NAME } from './map-mixin'\n\ntype TgMapEmits = {\n  load: AbstractMap,\n  error: any,\n  'update:center': LatLng,\n  'update:current-center': LatLng,\n  'update:zoom': number,\n  'update:map-type': MapType,\n  'update:map-type-id': string,\n  'update:last-center': LatLng,\n}\n\nexport const tgMapProps = {\n  /** type没做响应式, 但外部可以把type作为tg-map的key, 让type修改时完全重建tg-map */\n  type: stringEnumProp(TgMapType, TgMapType.google),\n  /**\n   * 当对该属性使用双向绑定时, 改变center将触发update:center又反过来触发center改变, 最终导致无限循环...\n   * 当前通过setCenter()时判断center是否有改变来避免该问题, 但为了避免可能存在的问题, 另外设计了如下机制:\n   * - :center-sync-delay=\"300\": 延时同步center, 防止center的值更新过快\n   * - :current-center.sync=\"currentCenter\": 实时获取center的值\n   * - :last-center.sync=\"center\": 获取tg-map销毁时的最后的center的值, 使用这种方式可以做到type切换时保留中心点位置\n   * @see AbstractMapEventMap.center-changed\n   */\n  center: requiredProp(LatLng),\n  /**\n   * 同步center的延时\n   * @default 300\n   * @see center\n   */\n  centerSyncDelay: optionalProp(Number, 300),\n  /**\n   * 仅用来获取center的值, 需要设置center的值请使用`center`属性\n   * @see center\n   * @deprecated 用的太少, 故maptalks未实现该属性, 要实时获取中心点, 请将{@link centerSyncDelay}设为0\n   */\n  currentCenter: optionalProp(LatLng),\n  /**\n   * 仅用于获取tg-map销毁时的最后的center的值\n   * @see center\n   * @deprecated 用的太少, 故maptalks未实现该属性\n   */\n  lastCenter: optionalProp(LatLng),\n  zoom: requiredProp(Number),\n  /**\n   * 该属性不会响应式更新, 要让它立即生效, 请参考{@link file://./../views/map/InfoDemo.vue#L3}\n   * @see MapOptions.infoWindowMode\n   */\n  infoWindowMode: stringUnionPropFromValues(InfoWindowModeValues),\n  gestureHandling: stringEnumProp(GestureHandlingOptions),\n  fractionalZoom: optionalProp(Boolean),\n  minZoom: optionalProp(Number),\n  maxZoom: optionalProp(Number),\n  mapStyle: optionalProp(Object as PropType<MapStyle>),\n  mapTypeId: stringEnumProp(BuildInMapTypeId),\n  /** 地图类型对象, 优先级比mapTypeId高 */\n  mapType: optionalProp(Object),\n  hideLogo: optionalProp(Boolean),\n  onLoad: eventProp(),\n  'onUpdate:center': eventProp(),\n  'onUpdate:current-center': eventProp(),\n  'onUpdate:last-center': eventProp(),\n  'onUpdate:map-type': eventProp(),\n  'onUpdate:map-type-id': eventProp(),\n  'onUpdate:zoom': eventProp(),\n  onError: eventProp(),\n} satisfies Props<WrapStringEnumValue<Omit<MapOptions, 'buildInMapTypeId'>, {\n  gestureHandling: typeof GestureHandlingOptions,\n}> & {\n  type: StringEnumValue<typeof TgMapType>,\n  currentCenter?: LatLng,\n  lastCenter?: LatLng,\n  centerSyncDelay: number,\n  mapTypeId?: StringEnumValue<typeof BuildInMapTypeId>,\n  mapType?: MapType\n  hideLogo?: boolean\n}> & EventProps<TgMapEmits>\n\nexport type TgMapEventEmits = EventEmits<AbstractMapEventMap & TgMapEmits>\n\nexport default defineComponent({\n  name: 'tg-map',\n  provide() {\n    return {\n      [MIXIN_MAP_NAME]: computed(() => this.map),\n    }\n  },\n  inheritAttrs: false,\n  props: tgMapProps,\n  /** 声明事件的类型信息, 详见: {@link splitAttrs} */\n  emits: undefined as any as TgMapEventEmits,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      centerSyncTimeoutId: undefined as TimeoutId | undefined,\n    }\n  },\n  data() {\n    return {\n      map: typed<BaseMap>(),\n      isDestroyed: false,\n    }\n  },\n  computed: {\n    propsJson() {\n      return Objects.toJsonSafely(this.$props)\n    },\n  },\n  watch: {\n    gestureHandling(value?: StringEnumValue<typeof GestureHandlingOptions>) {\n      if (value) {\n        this.map?.setGestureHandling(unwrapStringEnumValue(value, GestureHandlingOptions))\n      }\n    },\n    minZoom(value) {\n      this.map?.setMinZoom(value)\n    },\n    maxZoom(value) {\n      this.map?.setMaxZoom(value)\n    },\n    mapStyle(value?: MapStyle) {\n      this.map?.setMapStyle(value)\n    },\n    mapTypeId(value?: StringEnumValue<typeof BuildInMapTypeId>) {\n      if (value) {\n        this.map?.setBuildInMapTypeId(unwrapStringEnumValue(value, BuildInMapTypeId))\n      }\n    },\n    mapType(value?: MapType) {\n      this.map?.setMapType(value ?? MapType.NORMAL)\n    },\n    hideLogo(value?: boolean) {\n      this.map?.setHideLogo(value ?? false)\n    },\n    fractionalZoom(value?: boolean) {\n      this.map?.setFractionalZoom(value ?? false)\n    },\n  },\n  async mounted() {\n    // type的值需要局部化, 防止外部修改\n    const type = unwrapStringEnumValue(this.type, TgMapType)\n    try {\n      await loadCachedMap(type)\n    } catch (e) {\n      this.$emit('error', e)\n      return\n    }\n    if (this.isDestroyed) {\n      console.warn(`tg-map(type=${type})已销毁, 不需要继续执行`)\n      return\n    }\n    // options不要直接传this, 因为createMap方法内部会修改options...\n    const map = TgMapFactory.createMap(type, this.$refs.map as HTMLElement, /* options: */{\n      center: this.center,\n      zoom: this.zoom,\n      infoWindowMode: this.infoWindowMode,\n      gestureHandling: unwrapStringEnumValue(this.gestureHandling, GestureHandlingOptions),\n      minZoom: this.minZoom,\n      maxZoom: this.maxZoom,\n      mapStyle: this.mapStyle,\n      buildInMapTypeId: unwrapStringEnumValue(this.mapTypeId, BuildInMapTypeId),\n      hideLogo: this.hideLogo,\n      fractionalZoom: this.fractionalZoom,\n    })\n    // map是复杂对象, 不需要转换成响应式对象\n    this.map = markRaw(map)\n    if (this.mapType) {\n      map.setMapType(this.mapType)\n    }\n\n    // 未声明ready事件, 所以需要从attrs.listeners中查找是否存在\n    if ('ready' in this.attrs.listeners) {\n      console.error('地图载入完成的事件已经从ready改为了load, 请手动修改')\n    }\n    bindEvents(this.attrs.listeners, map, this.$emit, /* excludes: */['load'])\n    // 需要先发送load(载入完成)事件, 保证外部能够获取到map对象\n    this.$emit('load', map)\n\n    // Baidu地图的setZoom/Center是区分顺序的, 若同时修改它们, 必须先setZoom再setCenter, 否则中心点会出现偏移\n    // Google地图没这个问题\n    // 为了规避该问题, 同时监听它们两个, 并按顺序执行set方法\n    watch([\n      () => this.zoom,\n      () => this.center, //\n    ], ([zoom, center], [oldZoom, oldCenter]) => {\n      if (zoom !== oldZoom) {\n        import.meta.env.DEV && console.debug('<tg-map> setZoom', center)\n        map.setZoom(zoom)\n      }\n      if (center !== oldCenter) {\n        const currentCenter = map.getCenter()\n        if (!currentCenter.equals(center)) {\n          import.meta.env.DEV && console.debug('<tg-map> setCenter', center)\n          map.setCenter(center)\n        }\n      }\n    })\n\n    // 处理v-model(双向绑定)\n    if (this.attrs.listenerProps['update:center']) {\n      const updateCenter = () => this.$emit('update:center', map.getCenter())\n      map.addEventListener('center-changed', () => {\n        if (this.centerSyncDelay > 0) {\n          clearTimeout(this.centerSyncTimeoutId)\n          this.centerSyncTimeoutId = setTimeout(updateCenter, this.centerSyncDelay)\n        } else {\n          updateCenter()\n        }\n      })\n    }\n    if (this.attrs.listenerProps['update:current-center']) {\n      // 初始值也得emit出去\n      this.$emit('update:current-center', this.center)\n      map.addEventListener('center-changed', () => {\n        this.$emit('update:current-center', map.getCenter())\n      })\n    }\n    if (this.attrs.listenerProps['update:zoom']) {\n      map.addEventListener('zoom-changed', () => {\n        this.$emit('update:zoom', map.getZoom())\n      })\n    }\n    const isUpdateMapType = this.attrs.listenerProps['update:map-type']\n    const isUpdateMapTypeId = this.attrs.listenerProps['update:map-type-id']\n    if (isUpdateMapType || isUpdateMapTypeId) {\n      map.addEventListener('map-type-changed', () => {\n        const mapType = map.getMapType()\n        isUpdateMapType && this.$emit('update:map-type', mapType)\n        isUpdateMapTypeId && this.$emit('update:map-type-id', mapType.id)\n      })\n    }\n  },\n  unmounted() {\n    this.isDestroyed = true\n    if (this.map) {\n      if (this.attrs.listenerProps['update:last-center']) {\n        this.$emit('update:last-center', this.map.getCenter())\n      }\n      if (this.attrs.listenerProps['update:center']) {\n        clearTimeout(this.centerSyncTimeoutId)\n        // 最终的值一定要更新出去, 保证切换地图时center的位置能够保持\n        this.$emit('update:center', this.map.getCenter())\n      }\n    }\n  },\n  methods: {\n  },\n})\n</script>\n\n<style lang=\"scss\">\n.tg-map {\n  height: 100%;\n  position: relative;\n\n  &__map {\n    width: 100%;\n    height: 100%;\n\n    &--hide-logo-google {\n      .gm-style {\n        // 隐藏logo\n        a[target=\"_blank\"]:has(>div>img) {\n          display: none !important;\n        }\n\n        // 隐藏右下角的Keyboard shortcuts/Terms of Use等\n        &>div:last-child>div:last-child>div {\n          display: none;\n        }\n      }\n    }\n\n    &--hide-logo-baidu {\n      // 隐藏logo\n      div.anchorBL>a[target=\"_blank\"]>img {\n        display: none;\n      }\n\n      // 隐藏左下角的版权信息\n      div.BMap_cpyCtrl {\n        display: none;\n      }\n    }\n  }\n}\n</style>\n","<template>\n  <div :class=\"$options.name\" :style=\"{ left: dimen(left), top: dimen(topValue), right: dimen(right), bottom: dimen(bottom) }\">\n    <slot></slot>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { dimen } from 'tg-map-core'\nimport { defineComponent } from 'vue'\n/** TgMap上的Widget, 只是对绝对布局进行简单的封装 */\nexport default defineComponent({\n  name: 'tg-map-widget',\n  props: {\n    left: {\n      type: [Number, String],\n      default: null,\n    },\n    top: {\n      type: [Number, String],\n      default: null,\n    },\n    right: {\n      type: [Number, String],\n      default: null,\n    },\n    bottom: {\n      type: [Number, String],\n      default: null,\n    },\n  },\n  computed: {\n    topValue() {\n      // 防止默认看不到组件\n      return this.top == null && this.bottom == null ? 0 : this.top\n    },\n  },\n  methods: {\n    dimen,\n  },\n})\n</script>\n<style lang=\"scss\">\n.tg-map-widget {\n  position: absolute;\n}\n</style>\n","<template>\n  <div :class=\"$options.name\">\n    <slot />\n  </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, CustomControl, type StringEnumValue, unwrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { type Props, safeAsComponent, stringEnumProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMap from '../TgMap.vue'\n\nexport default defineComponent({\n  name: 'tg-custom-control',\n  mixins: [MapMixin],\n  props: {\n    position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n  } satisfies Props<{\n    position: StringEnumValue<typeof ControlPosition>\n  }>,\n  setup() {\n    return {\n      control: lateinit<CustomControl>(),\n    }\n  },\n  watch: {\n    position() {\n      this.recreate()\n    },\n  },\n  onCreate() {\n    if (!safeAsComponent(this.$parent, TgMap)) {\n      console.warn('请将tg-custom-control放到tg-map中')\n    }\n    const { $el } = this\n    const C = class extends CustomControl {\n      onCreateElement() {\n        return $el as HTMLElement\n      }\n    }\n    this.control = new C(unwrapStringEnumValue(this.position, ControlPosition))\n    this.$map.addCustomControl(this.control)\n  },\n  onDestroy() {\n    this.$map.removeCustomControl(this.control)\n  },\n})\n</script>\n<style lang=\"scss\">\n// 当作为tg-map的直接child时不显示\n.tg-map > .tg-custom-control {\n  display: none;\n}\n</style>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, type MapTypeControl, type MapTypeControlOptions, MapTypeControlType, unwrapStringEnumValue, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { optionalProp, type Props, stringEnumProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\nexport default defineComponent({\n  name: 'tg-map-type-control',\n  mixins: [MapMixin],\n  props: {\n    position: stringEnumProp(ControlPosition, ControlPosition.TOP_LEFT),\n    type: stringEnumProp(MapTypeControlType),\n    mapTypes: optionalProp(Array as any),\n  } satisfies Props<WrapStringEnumValue<MapTypeControlOptions, {\n    position: typeof ControlPosition,\n    type: typeof MapTypeControlType\n  }>>,\n  setup() {\n    return {\n      control: lateinit<MapTypeControl>(),\n    }\n  },\n  watch: {\n    position(value) {\n      this.control.setPosition(value)\n    },\n    type() {\n      this.recreate()\n    },\n    mapTypes: {\n      handler() {\n        this.recreate()\n      },\n      deep: true,\n    },\n  },\n  onCreate() {\n    this.control = this.$map.createMapTypeControl(unwrapStringEnumValue(this))\n    this.$map.addControl(this.control)\n  },\n  onDestroy() {\n    this.$map.removeControl(this.control)\n  },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, type ScaleControl, type ScaleControlOptions, type WrapStringEnumValue, unwrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { type Props, stringEnumProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nexport default defineComponent({\n  name: 'tg-scale-control',\n  mixins: [MapMixin],\n  props: {\n    position: stringEnumProp(ControlPosition, ControlPosition.BOTTOM_RIGHT),\n  } satisfies Props<WrapStringEnumValue<ScaleControlOptions, {\n    position: typeof ControlPosition\n  }>>,\n  setup() {\n    return {\n      control: lateinit<ScaleControl>(),\n    }\n  },\n  watch: {\n    position(value) {\n      this.control.setPosition(value)\n    },\n  },\n  onCreate() {\n    this.control = this.$map.createScaleControl(unwrapStringEnumValue(this))\n    this.$map.addControl(this.control)\n  },\n  onDestroy() {\n    this.$map.removeControl(this.control)\n  },\n})\n\n</script>\n","import { path } from 'tg-commons'\nimport { customRef, getCurrentInstance, toRaw, watch } from 'vue'\n\n/** 获取当前组件的名字 */\nexport function useComponentName(): string | undefined {\n  const type = getCurrentInstance()?.type\n  let name = type?.name ?? type?.__name\n  if (!name) {\n    const file = type?.__file\n    if (file) {\n      name = path.basename(file, '.vue')\n    }\n  }\n  return name\n}\n\n/**\n * 将v-model转换成Ref变量, 并防止递归调用\n */\nexport function useLocalModel<P extends object, K extends keyof P & string, Name extends string>(\n  props: P,\n  key: K,\n  emit: (name: Name, ...args: any[]) => void,\n) {\n  return customRef<P[K]>((track, trigger) => {\n    let local = props[key]\n    watch(() => props[key], (v) => {\n      if (local === toRaw(v)) {\n        // 防止emit出去的值, 被设置回来\n        return\n      }\n      local = v\n      trigger()\n    })\n\n    return {\n      get: () => {\n        track()\n        return local\n      },\n      set: (v) => {\n        local = v\n        emit(`update:${key}` as Name, v)\n      },\n    }\n  })\n}\n","import { throwError } from 'tg-commons'\nimport type { AbstractMap } from 'tg-map-core'\nimport { inject, onBeforeUnmount, onMounted, type Ref } from 'vue'\nimport { useComponentName } from '../utils/hooks'\nimport { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\n/** 作为Vue3下, `MapMixin`的替代 */\nexport function useTgMapInner<MAP extends AbstractMap = AbstractMap>() {\n  const mapRef = inject<Ref<MAP | undefined>>(MIXIN_MAP_NAME)\n  let onCreate: VoidFunction | undefined\n  let onDestroy: VoidFunction | undefined\n  if (mapRef == null) throwError(`<${useComponentName() || 'unknown'}>必须作为<tg-map>的子代组件`)\n\n  return {\n    mapRef,\n    /** 读取map对象, 只要放在<tg-map>里面的组件(除#overlay插槽外)都能够立即读取到map对象 */\n    get map() {\n      return mapRef.value ?? throwError('map尚未初始化')\n    },\n    /** 地图元素创建回调 */\n    [MIXIN_HOOK_CREATE](hook: VoidFunction) {\n      onMounted(hook)\n      if (onCreate) throwError(`${MIXIN_HOOK_CREATE}只能调用一次`)\n      onCreate = hook\n    },\n    /** 地图元素销毁回调 */\n    [MIXIN_HOOK_DESTROY](hook: VoidFunction) {\n      onBeforeUnmount(hook)\n      if (onDestroy) throwError(`${MIXIN_HOOK_DESTROY}只能调用一次`)\n      onDestroy = hook\n    },\n    /** 重新创建地图元素 */\n    recreate() {\n      onDestroy?.()\n      onCreate?.()\n    },\n  }\n}\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, unwrapStringEnumValue, type BaseMap, type StreetViewControl, type StreetViewControlOptions, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent, watch } from 'vue'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n/**\n * 街景控件, 当前只有google支持\n * */\nexport default defineComponent({\n  name: 'tg-street-view-control',\n  props: {\n    position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n  } satisfies Props<WrapStringEnumValue<StreetViewControlOptions, {\n    position: typeof ControlPosition,\n  }>>,\n  setup(props) {\n    let control = lateinit<StreetViewControl>()\n\n    const { map, onCreate, onDestroy } = useTgMapInner<BaseMap>()\n\n    onCreate(() => {\n      control = map.createStreetViewControl(unwrapStringEnumValue(props))\n      map.addControl(control)\n    })\n\n    onDestroy(() => {\n      map.removeControl(control)\n    })\n\n    watch(() => props.position, (value) => {\n      control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n    })\n    return createEmptyVNode\n  },\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, unwrapStringEnumValue, type BaseMap, type WrapStringEnumValue, type ZoomControl, type ZoomControlOptions } from 'tg-map-core'\nimport { defineComponent, watch } from 'vue'\nimport { createEmptyVNode, optionalProp, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n\nexport default defineComponent({\n  name: 'tg-zoom-control',\n  props: {\n    position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n    showZoomLevel: optionalProp(Boolean),\n  } satisfies Props<WrapStringEnumValue<ZoomControlOptions, {\n    position: typeof ControlPosition,\n  }>>,\n  setup(props) {\n    let control = lateinit<ZoomControl>()\n\n    const { map, onCreate, onDestroy } = useTgMapInner<BaseMap>()\n\n    onCreate(() => {\n      control = map.createZoomControl(unwrapStringEnumValue(props))\n      map.addControl(control)\n    })\n\n    onDestroy(() => {\n      map.removeControl(control)\n    })\n\n    watch(() => props.position, (value) => {\n      control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n    })\n    watch(() => props.showZoomLevel, (value) => {\n      control.setShowZoomLevel(value ?? true)\n    })\n    return createEmptyVNode\n  },\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { BaseMap, Heatmap, type HeatmapOptions } from 'tg-map-core'\nimport { defineComponent, watch } from 'vue'\nimport { createEmptyVNode, optionalProp, requiredProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n\nexport default defineComponent({\n  name: 'tg-heatmap',\n  props: {\n    maxIntensity: optionalProp(Number),\n    gradient: optionalProp(Object),\n    opacity: optionalProp(Number),\n    radius: optionalProp(Number),\n    data: requiredProp(Array as any),\n  } satisfies Props<HeatmapOptions>,\n  setup(props) {\n    const { map, onCreate, onDestroy } = useTgMapInner<BaseMap>()\n    let heatmap = lateinit<Heatmap>()\n\n    onCreate(() => {\n      heatmap = map.createHeatmap(props)\n    })\n    onDestroy(() => {\n      heatmap.remove()\n    })\n\n    watch(() => props.data, (v) => heatmap.setData(v))\n    watch(\n      [() => props.maxIntensity, () => props.gradient, () => props.opacity, () => props.radius],\n      () => heatmap.setOptions(props),\n    )\n\n    return createEmptyVNode\n  },\n})\n</script>\n","<template>\n  <div :class=\"$options.name\">\n    <slot />\n  </div>\n</template>\n<script lang=\"ts\">\nimport { Arrays, lateinit, typed } from 'tg-commons'\nimport type { MarkerClusterer, MarkerClustererOptions, MarkerOverlay } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { type Props, optionalProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nconst TgMarkerClusterer = defineComponent({\n  name: 'tg-marker-clusterer',\n  mixins: [MapMixin],\n  // markers从this.$children中读取, 故需要省略(Omit)\n  props: {\n    gridSize: optionalProp(Number),\n    maxZoom: optionalProp(Number),\n    minClusterSize: optionalProp(Number),\n    averageCenter: optionalProp(Boolean),\n    styles: optionalProp(Array as any),\n    stylesIndexCalculator: optionalProp(Function as any),\n    zIndex: optionalProp(Number),\n  } satisfies Props<Omit<MarkerClustererOptions, 'markers'>>,\n  setup() {\n    return {\n      clusterer: lateinit<MarkerClusterer>(),\n      markers: typed<MarkerOverlay[]>([]),\n      pendingMarkers: typed<MarkerOverlay[]>([]),\n    }\n  },\n  watch: {\n    gridSize() {\n      this.recreate()\n    },\n    maxZoom() {\n      this.recreate()\n    },\n    minClusterSize() {\n      this.recreate()\n    },\n    averageCenter() {\n      this.recreate()\n    },\n    styles: {\n      handler() {\n        this.recreate()\n      },\n      deep: true,\n    },\n    stylesIndexCalculator() {\n      this.recreate()\n    },\n    zIndex() {\n      this.recreate()\n    },\n  },\n  onCreate() {\n    // console.log('TgMarkerClusterer.onCreate', this.markers)\n    this.clusterer = this.$map.createMarkerClusterer(this)\n  },\n  onDestroy() {\n    this.clusterer.clearMarkers(true)\n    // 清空等待添加的markers\n    this.pendingMarkers = []\n  },\n  methods: {\n    /** TgMarker有可能在该组件未初始化之前调用, 需要通过该方法判断 */\n    isInitiated(): boolean {\n      return this.clusterer != null\n    },\n    performAddMarkers() {\n      this.clusterer.addMarkers(this.pendingMarkers)\n      this.pendingMarkers = []\n    },\n    onAddMarker(marker: MarkerOverlay) {\n      this.markers.push(marker)\n      if (this.isInitiated()) {\n        if (!this.pendingMarkers.length) {\n          this.$nextTick(this.performAddMarkers)\n        }\n        this.pendingMarkers.push(marker)\n      }\n    },\n    onRemoveMarker(marker: MarkerOverlay) {\n      if (this.isInitiated()) {\n        if (!Arrays.remove(this.pendingMarkers, marker)) {\n          this.clusterer.removeMarker(marker)\n        }\n      }\n      Arrays.remove(this.markers, marker)\n    },\n  },\n})\n/** TgMarkerClusterer作为构造器, 创建的Vue实例类型 */\ntype TgMarkerClusterer = InstanceType<typeof TgMarkerClusterer>\nexport default TgMarkerClusterer\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { TrafficLayer } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport MapMixin from '../map-mixin'\nexport default defineComponent({\n  name: 'tg-traffic-layer',\n  mixins: [MapMixin],\n  // 请直接使用v-if来控制它的显隐\n  // 没有属性时, 写`{}`类型推断会有问题, 故注释掉\n  // props: {} satisfies Props<{}>,\n  setup() {\n    return {\n      layer: lateinit<TrafficLayer>(),\n    }\n  },\n  watch: {\n\n  },\n  onCreate() {\n    this.layer = new TrafficLayer()\n    this.$map.addLayer(this.layer)\n  },\n  onDestroy() {\n    this.$map.removeLayer(this.layer)\n  },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, type CircleEventMap, type CircleOptions, type CircleOverlay } from 'tg-map-core'\nimport { defineComponent, toRaw } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgCircleEmits = {\n  'update:center': LatLng,\n  'update:radius': number,\n}\nexport default defineComponent({\n  name: 'tg-circle',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: {\n    center: requiredProp(LatLng),\n    radius: requiredProp(Number),\n    clickable: optionalProp(Boolean),\n    editable: optionalProp(Boolean),\n    strokeColor: optionalProp(String),\n    strokeOpacity: optionalProp(Number),\n    strokeWeight: optionalProp(Number),\n    visible: optionalProp(Boolean),\n    zIndex: optionalProp(Number),\n    fillColor: optionalProp(String),\n    fillOpacity: optionalProp(Number),\n    'onUpdate:center': eventProp(),\n    'onUpdate:radius': eventProp(),\n  } satisfies Props<CircleOptions> & EventProps<TgCircleEmits>,\n  emits: undefined as any as EventEmits<CircleEventMap & TgCircleEmits>,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      overlay: lateinit<CircleOverlay>(),\n      emittedRadius: undefined as number | undefined,\n      emittedCenter: undefined as LatLng | undefined,\n    }\n  },\n  watch: {\n    center(value) {\n      if (this.emittedCenter != null) {\n        const center = this.emittedCenter\n        this.emittedCenter = undefined\n        if (center === toRaw(value)) {\n          // 防止emit出的center被设置回来\n          return\n        }\n      }\n      this.overlay.setCenter(value)\n    },\n    radius(value) {\n      if (this.emittedRadius != null) {\n        const radius = this.emittedRadius\n        this.emittedRadius = undefined\n        if (radius === value) {\n          // 防止emit出的radius被设置回来\n          return\n        }\n      }\n      this.overlay.setRadius(value)\n    },\n    clickable() {\n      this.recreate()\n    },\n    editable(value) {\n      this.overlay.setEditable(value)\n    },\n    strokeColor(value) {\n      this.overlay.setStrokeColor(value)\n    },\n    strokeOpacity(value) {\n      this.overlay.setStrokeOpacity(value)\n    },\n    strokeWeight(value) {\n      this.overlay.setStrokeWeight(value)\n    },\n    fillColor(value) {\n      this.overlay.setFillColor(value)\n    },\n    fillOpacity(value) {\n      this.overlay.setFillOpacity(value)\n    },\n    visible(value) {\n      this.overlay.setVisible(value)\n    },\n    zIndex(value) {\n      this.overlay.setZIndex(value)\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createCircle(this)\n    this.$map.addOverlay(this.overlay)\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n    if (this.attrs.listenerProps['update:center']) {\n      this.overlay.addEventListener('center-changed', () => {\n        this.$emit('update:center', this.emittedCenter = this.overlay.getCenter())\n      })\n    }\n    if (this.attrs.listenerProps['update:radius']) {\n      this.overlay.addEventListener('radius-changed', () => {\n        this.$emit('update:radius', this.emittedRadius = this.overlay.getRadius())\n      })\n    }\n  },\n  onDestroy() {\n    this.$map.removeOverlay(this.overlay)\n  },\n})\n</script>\n","<template>\n  <div :class=\"$options.name\" v-bind=\"$attrs\">\n    <slot />\n  </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ElementOverlay, LatLng, MapPane, unwrapStringEnumValue, type BaseMap, type ElementOverlayOptions, type OverlayProjection, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { requiredProp, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\n/** ElementOverlay的简单实现 */\nclass SimpleElementOverlay extends ElementOverlay {\n  constructor(\n    map: BaseMap,\n    options: ElementOverlayOptions,\n    public content: HTMLElement,\n    private position: LatLng,\n  ) {\n    super(map, options)\n  }\n  protected onCreate(): HTMLElement {\n    return this.content\n  }\n  protected onDraw(projection: OverlayProjection): void {\n    const point = projection.fromLatLngToOverlayPoint(this.position)\n    this.content.style.left = point.x + 'px'\n    this.content.style.top = point.y + 'px'\n  }\n  setPosition(position: LatLng) {\n    this.position = position\n    this.draw()\n  }\n}\n\nconst TgElementOverlay = defineComponent({\n  name: 'tg-element-overlay',\n  mixins: [MapMixin],\n  props: {\n    mapPane: stringEnumProp(MapPane, MapPane.overlayMouseTarget),\n    position: requiredProp(LatLng),\n  } satisfies Props<WrapStringEnumValue<ElementOverlayOptions, {\n    mapPane: typeof MapPane,\n  }> & { position: LatLng }>,\n  setup() {\n    return {\n      overlay: lateinit<SimpleElementOverlay>(),\n    }\n  },\n  watch: {\n    position(value) {\n      this.overlay.setPosition(value)\n    },\n    mapPane() {\n      this.recreate()\n    },\n  },\n  methods: {\n    content(): HTMLElement {\n      return this.$el as HTMLElement\n    },\n  },\n  onCreate() {\n    this.overlay = new SimpleElementOverlay(this.$map, unwrapStringEnumValue(this), this.content(), this.position)\n    this.$map.addElementOverlay(this.overlay)\n  },\n  onDestroy() {\n    this.$map.removeElementOverlay(this.overlay)\n  },\n})\ntype TgElementOverlay = InstanceType<typeof TgElementOverlay>\nexport default TgElementOverlay\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-element-overlay {\n  display: none;\n}\n.tg-map__map .tg-element-overlay {\n  display: block;\n}\n</style>\n","<template>\n  <slot></slot>\n</template>\n<script lang=\"ts\">\nimport { deepEqual, lateinit, typed } from 'tg-commons'\nimport { BaiduMarker, bindEvents, LatLng, type MarkerEventMap, type MarkerLabel, type MarkerOptions, type MarkerOverlay, type UnionIcon } from 'tg-map-core'\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { callHook, eventProp, optionalProp, requiredProp, safeAsComponent, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport TgMarkerClusterer from '../extra/TgMarkerClusterer.vue'\nimport MapMixin, { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY } from '../map-mixin'\nimport type TgInfoBox from './TgInfoBox.vue'\nimport type TgInfoWindow from './TgInfoWindow.vue'\nimport type TgLabel from './TgLabel.vue'\n\ntype TgMarkerEmits = {\n  'update:position': LatLng,\n}\n\nexport type TgMarkerEventEmits = EventEmits<MarkerEventMap & TgMarkerEmits>\n\nexport const tgMarkerProps = {\n  position: requiredProp(LatLng),\n  title: optionalProp(String),\n  label: optionalProp(Object as PropType<MarkerLabel>),\n  icon: optionalProp(Object as PropType<UnionIcon>),\n  clickable: optionalProp(Boolean),\n  draggable: optionalProp(Boolean),\n  crossOnDrag: optionalProp(Boolean),\n  cursor: optionalProp(String),\n  zIndex: optionalProp(Number),\n  visible: optionalProp(Boolean),\n  normalizePositionForBaidu: optionalProp(Boolean),\n  /**\n     * 是否自动添加到TgMarkerClusterer中去\n     * @default true\n     */\n  autoAddToClusterer: optionalProp(Boolean, true),\n  'onUpdate:position': eventProp(),\n} satisfies Props<MarkerOptions & {\n  autoAddToClusterer?: boolean\n}> & EventProps<TgMarkerEmits>\n\nconst TgMarker = defineComponent({\n  name: 'tg-marker',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: tgMarkerProps,\n  emits: undefined as any as TgMarkerEventEmits,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      marker: lateinit<MarkerOverlay>(),\n      labelOverlay: typed<TgLabel>(),\n      info: typed<TgInfo>(),\n      emittedPosition: undefined as LatLng | undefined,\n      autoAddToClustererWhenCreate: props.autoAddToClusterer,\n    }\n  },\n  watch: {\n    position(value: LatLng) {\n      if (this.emittedPosition != null) {\n        const position = this.emittedPosition\n        this.emittedPosition = undefined\n        if (position === toRaw(value)) {\n          // 防止emit出的值被设置回来\n          return\n        }\n      }\n      this.marker.setPosition(value)\n    },\n    title(value: string) {\n      this.marker.setTitle(value)\n    },\n    label(value?: MarkerLabel, oldValue?: MarkerLabel) {\n      if (deepEqual(value, oldValue)) {\n        // MarkerLabel是对象, 并且大部分时候都是直接在模板里面创建的, 很多时候创建的是内容相同的对象, 此时不需要更新\n        return\n      }\n      if (value) {\n        this.marker.setLabel(value)\n      } else {\n        this.recreate()\n      }\n    },\n    icon(value?: UnionIcon) {\n      if (value) {\n        // {@macro hot_reload_prop_change_before_on_create}\n        this.marker?.setIcon(value)\n      } else {\n        this.recreate()\n      }\n    },\n    clickable(value: boolean) {\n      if (this.marker instanceof BaiduMarker) {\n        this.recreate() // baidu不支持setClickable(), 故只能recreate()\n      } else {\n        this.marker.setClickable(value)\n      }\n    },\n    draggable(value: boolean) {\n      this.marker.setDraggable(value)\n    },\n    crossOnDrag() {\n      this.recreate()\n    },\n    cursor() {\n      this.recreate()\n    },\n    zIndex(value?: number) {\n      if (this.marker instanceof BaiduMarker) {\n        this.recreate() // 当前版本, baidu调用setZIndex()无效\n      } else {\n        this.marker.setZIndex(value)\n      }\n    },\n    visible(value: boolean) {\n      this.marker.setVisible(value)\n    },\n    normalizePositionForBaidu() {\n      this.recreate()\n    },\n    autoAddToClusterer() {\n      this.recreate()\n    },\n  },\n  onCreate() {\n    // 结构化类型, this包含MarkerOptions的所有属性, 故可以直接传进去\n    this.marker = this.$map.createMarker(this)\n    if (this.labelOverlay) {\n      this.marker.attachLabelOverlay(this.labelOverlay.overlay)\n    }\n\n    if (this.$clusterer() && this.autoAddToClusterer) {\n      this.$clusterer()!.onAddMarker(this.marker)\n    } else {\n      this.$map.addOverlay(this.marker)\n    }\n    // 保存创建时autoAddToClusterer的值, 销毁时需要使用它\n    this.autoAddToClustererWhenCreate = this.autoAddToClusterer\n\n    // baidu, 只有marker被添加到地图之后, 才能在它上面打开infoWindow\n    // infoBox似乎没有这个限制, 但目前不区分infoWindow和infoBox, 故统一放在这里处理\n    if (this.info) {\n      this.info.show && this.info.overlay.open(this.marker)\n    }\n\n    bindEvents(this.attrs.listeners, this.marker, this.$emit)\n\n    if (this.attrs.listenerProps['update:position']) {\n      this.marker.addEventListener('dragend', (event) => {\n        this.$emit('update:position', this.emittedPosition = event.position)\n      })\n    }\n  },\n  onDestroy() {\n    if (this.$clusterer() && this.autoAddToClustererWhenCreate) {\n      this.$clusterer()!.onRemoveMarker(this.marker)\n    } else {\n      this.$map.removeOverlay(this.marker)\n    }\n  },\n  methods: {\n    recreate() {\n      // 重写recreate, 销毁时关闭info和labelOverlay, 保证断开他们和老的marker的关联\n      callHook(this as any, MIXIN_HOOK_DESTROY)\n      this.labelOverlay && this.marker.attachLabelOverlay(undefined)\n      this.info && this.info.overlay.close()\n      callHook(this as any, MIXIN_HOOK_CREATE)\n    },\n    $clusterer(): TgMarkerClusterer | undefined {\n      return safeAsComponent(this.$parent, TgMarkerClusterer)\n    },\n    onAddLabel(label: TgLabel) {\n      this.labelOverlay = label\n      // onAdd方法可能在创建this.marker前调用, 需要判断下\n      if (this.marker) {\n        this.marker.attachLabelOverlay(label.overlay)\n      }\n    },\n    onRemoveLabel(_label: TgLabel) {\n      this.marker.attachLabelOverlay(undefined)\n      this.labelOverlay = undefined\n    },\n    onAddInfo(info: TgInfo) {\n      this.info = info\n      // @see {@link onAddLabel}\n      if (this.marker) {\n        info.show && info.overlay.open(this.marker)\n      }\n    },\n    onRemoveInfo(info: TgInfo) {\n      info.overlay.close()\n      this.info = undefined\n    },\n    onInfoShowChanged(info: TgInfo, isShow: boolean) {\n      isShow ? info.overlay.open(this.marker) : info.overlay.close()\n    },\n  },\n})\ntype TgMarker = InstanceType<typeof TgMarker>\nexport default TgMarker\n\nexport type TgInfo = TgInfoWindow | TgInfoBox\n\nexport type TgMarkerPublicInstance = {\n  marker: MarkerOverlay\n\n  onAddInfo(info: TgInfo): void\n  onRemoveInfo(info: TgInfo): void\n  onInfoShowChanged(info: TgInfo, isShow: boolean): void\n\n  onAddLabel(label: TgLabel): void\n  onRemoveLabel(label: TgLabel): void\n}\n</script>\n","<template>\n  <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n    <slot />\n  </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, GoogleMap, LatLng, wrapComponentElementForGoogle, type InfoBoxOptions, type InfoBoxOverlay, type MarkerOverlay } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { eventProp, findAncestorComponentByType, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\ntype TgInfoBoxEmits = {\n  'update:show': boolean\n}\nconst TgInfoBox = defineComponent({\n  name: 'tg-info-box',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: {\n    show: requiredProp(Boolean),\n    position: optionalProp(LatLng),\n    offset: optionalProp(Object),\n    maxWidth: optionalProp(Number),\n    borderClass: optionalProp(String),\n    zIndex: optionalProp(Number),\n    disableAutoPan: optionalProp(Boolean),\n    'onUpdate:show': eventProp(),\n  } satisfies Props<Omit<InfoBoxOptions, 'content'> & {\n    show: boolean\n  }> & EventProps<TgInfoBoxEmits>,\n  emits: undefined as any as EventEmits<TgInfoBoxEmits>,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      overlay: lateinit<InfoBoxOverlay>(),\n    }\n  },\n  watch: {\n    show(isShow: boolean) {\n      if (this.$marker()) {\n        this.$marker()!.onInfoShowChanged(this, isShow)\n      } else {\n        isShow ? this.overlay.open() : this.overlay.close()\n      }\n    },\n    position(value) {\n      this.overlay.setPosition(value)\n    },\n    offset() {\n      this.recreate()\n    },\n    maxWidth(value) {\n      this.overlay.setMaxWidth(value)\n    },\n    borderClass() {\n      this.recreate()\n    },\n    zIndex(value) {\n      this.overlay.setZIndex(value)\n    },\n    disableAutoPan() {\n      this.recreate()\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createInfoBox(this.getOptions())\n    if (this.$marker()) {\n      this.$marker()!.onAddInfo(this)\n    } else {\n      this.show && this.overlay.open()\n    }\n\n    if (this.attrs.listenerProps['update:show']) {\n      this.overlay.addEventListener('closeclick', () => {\n        this.$emit('update:show', false)\n      })\n    }\n\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n  },\n  onDestroy() {\n    if (this.$marker()) {\n      this.$marker()!.onRemoveInfo(this)\n    } else {\n      this.overlay.close()\n    }\n  },\n  methods: {\n    getOptions(): InfoBoxOptions {\n      return {\n        content: this.content(),\n        position: this.position,\n        offset: this.offset,\n        zIndex: this.zIndex,\n        maxWidth: this.maxWidth,\n        borderClass: this.borderClass,\n        disableAutoPan: this.disableAutoPan,\n      }\n    },\n    content(): HTMLElement {\n      if (this.$map instanceof GoogleMap) {\n        return wrapComponentElementForGoogle(this.$el, 'google-info-container')\n      }\n      return this.$el as HTMLElement\n    },\n    $marker(): TgMarkerPublicInstance | undefined {\n      return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n    },\n    open(marker?: MarkerOverlay) {\n      this.overlay.open(marker)\n    },\n    close() {\n      this.overlay.close()\n    },\n  },\n})\ntype TgInfoBox = Omit<InstanceType<typeof TgInfoBox>, '$options'>\nexport default TgInfoBox\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-info-box {\n  display: none;\n}\n\n.tg-map__map .tg-info-box {\n  display: block;\n}\n</style>\n","<template>\n  <div v-show=\"show\" :class=\"$options.name\" v-bind=\"attrs.binds\">\n    <slot />\n  </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, GoogleMap, LatLng, wrapComponentElementForGoogle, type InfoWindowEventMap, type InfoWindowOptions, type InfoWindowOverlay } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { eventProp, findAncestorComponentByType, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\n\ntype TgInfoWindowEmits = {\n  'update:show': boolean\n}\nconst TgInfoWindow = defineComponent({\n  name: 'tg-info-window',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: {\n    show: requiredProp(Boolean),\n    position: optionalProp(LatLng),\n    maxWidth: optionalProp(Number),\n    offset: optionalProp(Object),\n    disableAutoPan: optionalProp(Boolean),\n    'onUpdate:show': eventProp(),\n  } satisfies Props<Omit<InfoWindowOptions, 'content'> & { show: boolean }> & EventProps<TgInfoWindowEmits>,\n  emits: undefined as any as EventEmits<InfoWindowEventMap & TgInfoWindowEmits>,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      overlay: lateinit<InfoWindowOverlay>(),\n    }\n  },\n  watch: {\n    show(isShow: boolean) {\n      if (this.$marker()) {\n        this.$marker()!.onInfoShowChanged(this, isShow)\n      } else {\n        isShow ? this.overlay.open() : this.overlay.close()\n      }\n    },\n    position(value) {\n      this.overlay.setPosition(value)\n    },\n    maxWidth() {\n      this.recreate()\n    },\n    offset() {\n      this.recreate()\n    },\n    disableAutoPan() {\n      this.recreate()\n    },\n  },\n  methods: {\n    content(): HTMLElement {\n      if (this.$map instanceof GoogleMap) {\n        return wrapComponentElementForGoogle(this.$el, 'google-info-container')\n      }\n      return this.$el as HTMLElement\n    },\n    $marker(): TgMarkerPublicInstance | undefined {\n      return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n    },\n    getOptions(): InfoWindowOptions {\n      return {\n        content: this.content(),\n        position: this.position,\n        maxWidth: this.maxWidth,\n        offset: this.offset,\n        disableAutoPan: this.disableAutoPan,\n      }\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createInfoWindow(this.getOptions())\n    if (this.$marker()) {\n      this.$marker()!.onAddInfo(this)\n    } else {\n      this.show && this.overlay.open()\n    }\n\n    // 监听open/close\n    this.overlay.addEventListener('open', () => {\n      this.$emit('update:show', true)\n    })\n    this.overlay.addEventListener('close', () => {\n      this.$emit('update:show', false)\n    })\n\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n  },\n  onDestroy() {\n    if (this.$marker()) {\n      this.$marker()!.onRemoveInfo(this)\n    } else {\n      this.overlay.close()\n    }\n  },\n})\ntype TgInfoWindow = Omit<InstanceType<typeof TgInfoWindow>, '$options'>\nexport default TgInfoWindow\n</script>\n","<template>\n  <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n    <slot />\n  </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, MapPane, unwrapStringEnumValue, type LabelEventMap, type LabelOptions, type LabelOverlay, type Marker, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { findAncestorComponentByType, optionalProp, stringEnumProp, useSplittedAttrs, type EventEmits, type Props } from '../../utils/vue-utils'\nimport TgMap from '../TgMap.vue'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\n\nconst TgLabel = defineComponent({\n  name: 'tg-label',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: {\n    position: optionalProp(LatLng),\n    offset: optionalProp(Object),\n    zIndex: optionalProp(Number),\n    mapPane: stringEnumProp(MapPane),\n  } satisfies Props<WrapStringEnumValue<\n    Omit<LabelOptions, 'content'>,\n    { mapPane: typeof MapPane }\n  >>,\n  emits: undefined as any as EventEmits<LabelEventMap>,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs),\n      overlay: lateinit<LabelOverlay>(),\n    }\n  },\n  watch: {\n    position(value) {\n      this.overlay.setPosition(value)\n    },\n    offset(value) {\n      // {@template hot_reload_prop_change_before_on_create}\n      // 热重载时, this.overlay可能为空...故添加判空\n      // 可能的原因是因为offset在模板中写成了纯对象表达式, 热重载重新渲染时, 会创建不同的对象, 导致触发change, 而change的触发发生在beforeMount之后, mounted/onCreate之前...\n      // {@endtemplate}\n      this.overlay?.setOffset(value)\n    },\n    zIndex(value) {\n      this.overlay.setZIndex(value)\n    },\n    visible(value) {\n      this.overlay.setVisible(value)\n    },\n    mapPane() {\n      this.recreate()\n    },\n  },\n  methods: {\n    content(): HTMLElement {\n      return this.$el as HTMLElement\n    },\n    marker(): Marker | undefined {\n      return this.$marker()?.marker\n    },\n    $marker(): TgMarkerPublicInstance | undefined {\n      return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n    },\n    getOptions(): LabelOptions {\n      return {\n        content: this.content(),\n        position: this.position,\n        offset: this.offset,\n        zIndex: this.zIndex,\n        mapPane: unwrapStringEnumValue(this.mapPane, MapPane),\n      }\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createLabel(this.getOptions())\n    // 若父节点为marker, 则交由marker管理\n    if (this.$marker()) {\n      this.$marker()!.onAddLabel(this)\n    } else {\n      this.$map.addOverlay(this.overlay)\n    }\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n  },\n  onDestroy() {\n    if (this.$marker()) {\n      this.$marker()!.onRemoveLabel(this)\n    } else {\n      this.$map.removeOverlay(this.overlay)\n    }\n  },\n})\ntype TgLabel = Omit<InstanceType<typeof TgLabel>, '$options'>\nexport default TgLabel\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-label {\n  display: none;\n}\n.tg-map__map .tg-label {\n  display: block;\n}\n</style>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, type LatLng, type PolygonEventMap, type PolygonOptions, type PolygonOverlay } from 'tg-map-core'\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\ntype TgPolygonEmits = {\n  'update:paths': LatLng[][],\n}\n\nexport const tgPolygonProps = {\n  paths: requiredProp(Array as PropType<LatLng[][]>),\n  clickable: optionalProp(Boolean),\n  editable: optionalProp(Boolean),\n  strokeColor: optionalProp(String),\n  strokeOpacity: optionalProp(Number),\n  strokeWeight: optionalProp(Number),\n  visible: optionalProp(Boolean),\n  zIndex: optionalProp(Number),\n  fillColor: optionalProp(String),\n  fillOpacity: optionalProp(Number),\n  'onUpdate:paths': eventProp(),\n} satisfies Props<PolygonOptions> & EventProps<TgPolygonEmits>\n\nexport type TgPolygonEventEmits = EventEmits<PolygonEventMap & TgPolygonEmits>\n\nexport default defineComponent({\n  name: 'tg-polygon',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: tgPolygonProps,\n  emits: undefined as any as TgPolygonEventEmits,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      overlay: lateinit<PolygonOverlay>(),\n      emittedPaths: undefined as LatLng[][] | undefined,\n    }\n  },\n  watch: {\n    paths: {\n      handler(value: LatLng[][]) {\n        if (this.emittedPaths != null) {\n          const paths = this.emittedPaths\n          this.emittedPaths = undefined\n          // 由于paths数组绝大多数时候长度都是1, 故这里可以浅层比较它\n          if (paths.length === value.length && paths.every((v, i) => v === toRaw(value[i]))) {\n            // 防止emit出的paths被设置回来\n            return\n          }\n        }\n        this.overlay.setPaths(value)\n      },\n      deep: true,\n    },\n    clickable() {\n      this.recreate()\n    },\n    editable(value) {\n      this.overlay.setEditable(value)\n    },\n    strokeColor(value) {\n      this.overlay.setStrokeColor(value)\n    },\n    strokeOpacity(value) {\n      this.overlay.setStrokeOpacity(value)\n    },\n    strokeWeight(value) {\n      this.overlay.setStrokeWeight(value)\n    },\n    fillColor(value) {\n      this.overlay.setFillColor(value)\n    },\n    fillOpacity(value) {\n      this.overlay.setFillOpacity(value)\n    },\n    visible(value) {\n      this.overlay.setVisible(value)\n    },\n    zIndex(value) {\n      this.overlay.setZIndex(value)\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createPolygon(this)\n    this.$map.addOverlay(this.overlay)\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n    if (this.attrs.listenerProps['update:paths']) {\n      this.overlay.addEventListener('paths-edited', () => {\n        this.$emit('update:paths', this.emittedPaths = this.overlay.getPaths())\n      })\n    }\n  },\n  onDestroy() {\n    this.$map.removeOverlay(this.overlay)\n  },\n\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, type IconSequence, type PolylineEventMap, type PolylineOptions, type PolylineOverlay } from 'tg-map-core'\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\ntype TgPolylineEmits = {\n  'update:path': LatLng[],\n}\nexport default defineComponent({\n  name: 'tg-polyline',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: {\n    path: requiredProp(Array as PropType<LatLng[]>),\n    icons: optionalProp(Array as PropType<IconSequence[]>),\n    clickable: optionalProp(Boolean),\n    editable: optionalProp(Boolean),\n    strokeColor: optionalProp(String),\n    strokeOpacity: optionalProp(Number),\n    strokeWeight: optionalProp(Number),\n    visible: optionalProp(Boolean),\n    zIndex: optionalProp(Number),\n    'onUpdate:path': eventProp(),\n  } satisfies Props<PolylineOptions> & EventProps<TgPolylineEmits>,\n  emits: undefined as any as EventEmits<PolylineEventMap & TgPolylineEmits>,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      overlay: lateinit<PolylineOverlay>(),\n      emittedPath: undefined as LatLng[] | undefined,\n    }\n  },\n  watch: {\n    path: {\n      handler(value) {\n        if (this.emittedPath != null) {\n          const path = this.emittedPath\n          this.emittedPath = undefined\n          if (path === toRaw(value)) {\n            // 防止emit出的path又被设置回去, 导致Google地图移动点后的撤销功能无效\n            return\n          }\n        }\n        this.overlay.setPath(value)\n      },\n      deep: true,\n    },\n    icons: {\n      handler() {\n        this.recreate()\n      },\n      deep: true,\n    },\n    clickable() {\n      this.recreate()\n    },\n    editable(value) {\n      this.overlay.setEditable(value)\n    },\n    strokeColor(value) {\n      this.overlay.setStrokeColor(value)\n    },\n    strokeOpacity(value) {\n      this.overlay.setStrokeOpacity(value)\n    },\n    strokeWeight(value) {\n      this.overlay.setStrokeWeight(value)\n    },\n    visible(value) {\n      this.overlay.setVisible(value)\n    },\n    zIndex(value) {\n      this.overlay.setZIndex(value)\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createPolyline(this)\n    this.$map.addOverlay(this.overlay)\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n\n    if (this.attrs.listenerProps['update:path']) {\n      this.overlay.addEventListener('path-edited', () => {\n        this.$emit('update:path', this.emittedPath = this.overlay.getPath())\n      })\n    }\n  },\n  onDestroy() {\n    this.overlay.remove()\n  },\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, type LatLngBounds, type RectangleEventMap, type RectangleOptions, type RectangleOverlay } from 'tg-map-core'\nimport { defineComponent, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgRectangleEmits = {\n  'update:bounds': LatLngBounds,\n}\nexport default defineComponent({\n  name: 'tg-rectangle',\n  mixins: [MapMixin],\n  inheritAttrs: false,\n  props: {\n    bounds: requiredProp(Object as PropType<LatLngBounds>),\n    clickable: optionalProp(Boolean),\n    editable: optionalProp(Boolean),\n    strokeColor: optionalProp(String),\n    strokeOpacity: optionalProp(Number),\n    strokeWeight: optionalProp(Number),\n    visible: optionalProp(Boolean),\n    zIndex: optionalProp(Number),\n    fillColor: optionalProp(String),\n    fillOpacity: optionalProp(Number),\n    'onUpdate:bounds': eventProp(),\n  } satisfies Props<RectangleOptions> & EventProps<TgRectangleEmits>,\n  emits: undefined as any as EventEmits<RectangleEventMap & TgRectangleEmits>,\n  setup(props, { attrs }) {\n    return {\n      attrs: useSplittedAttrs(attrs, props),\n      overlay: lateinit<RectangleOverlay>(),\n      emittedBounds: undefined as LatLngBounds | undefined,\n    }\n  },\n  watch: {\n    bounds(value: LatLngBounds) {\n      if (this.emittedBounds != null) {\n        const bounds = this.emittedBounds\n        this.emittedBounds = undefined\n        // bounds很大可能会被重新创建, 故需要严格比较相等\n        if (bounds.equals(value)) {\n          // 防止emit出的值又被设置回来\n          return\n        }\n      }\n      this.overlay.setBounds(value)\n    },\n    clickable() {\n      this.recreate()\n    },\n    editable(value) {\n      this.overlay.setEditable(value)\n    },\n    strokeColor(value) {\n      this.overlay.setStrokeColor(value)\n    },\n    strokeOpacity(value) {\n      this.overlay.setStrokeOpacity(value)\n    },\n    strokeWeight(value) {\n      this.overlay.setStrokeWeight(value)\n    },\n    fillColor(value) {\n      this.overlay.setFillColor(value)\n    },\n    fillOpacity(value) {\n      this.overlay.setFillOpacity(value)\n    },\n    visible(value) {\n      this.overlay.setVisible(value)\n    },\n    zIndex(value) {\n      this.overlay.setZIndex(value)\n    },\n  },\n  onCreate() {\n    this.overlay = this.$map.createRectangle(this)\n    this.$map.addOverlay(this.overlay)\n    bindEvents(this.attrs.listeners, this.overlay, this.$emit)\n    if (this.attrs.listenerProps['update:bounds']) {\n      this.overlay.addEventListener('bounds-changed', () => {\n        this.$emit('update:bounds', this.emittedBounds = this.overlay.getBounds())\n      })\n    }\n  },\n  onDestroy() {\n    this.$map.removeOverlay(this.overlay)\n  },\n\n})\n</script>\n","import { noop } from 'tg-commons'\nimport { defineComponent, type App } from 'vue'\nimport { useComponentName } from './hooks'\nimport type { VueHookName } from './vue-utils'\n\nconst DEFAULT_EXCLUDE_HOOK_NAMES: VueHookName[] = ['beforeUpdate', 'updated']\n\nexport interface LifecycleLogOptions {\n  /** @default /^[A-Z]/ 匹配大写字母开头的组件名 */\n  nameRegex?: RegExp\n  /** @default true 开启log */\n  enable?: boolean,\n  /** @default 除 updated, beforeUpdate 外的所有hook */\n  hookNames?: VueHookName[]\n}\n\nconst LifecycleLogPlugin = {\n  install(app: App, options: LifecycleLogOptions = {}) {\n    if (options.enable !== false) {\n      const lifecycleLogMixin = defineComponent({\n        beforeCreate() {\n          const componentName = useComponentName() ?? ''\n          const matched = (options.nameRegex || /^[A-Z]/).test(componentName)\n          // eslint-disable-next-line @typescript-eslint/naming-convention\n          const __life = matched\n            ? (hookName: VueHookName) => {\n                if (options.hookNames) {\n                  if (options.hookNames.includes(hookName)) {\n                    console.debug('[lifecycle]', componentName, hookName)\n                  }\n                } else if (!DEFAULT_EXCLUDE_HOOK_NAMES.includes(hookName)) {\n                  console.debug('[lifecycle]', componentName, hookName)\n                }\n              }\n            : noop\n          // `beforeCreate`触发在data/props/methods等组件状态初始化之前, 所以若`__life`方法直接在methods中实现, 在这里是调用不到的(\n          __life('beforeCreate')\n          ; (this as any).__life_impl = __life\n        },\n        created() {\n          this.__life('created')\n        },\n        beforeMount() {\n          this.__life('beforeMount')\n        },\n        mounted() {\n          this.__life('mounted')\n        },\n        beforeUpdate() {\n          this.__life('beforeUpdate')\n        },\n        updated() {\n          this.__life('updated')\n        },\n        beforeUnmount() {\n          this.__life('beforeUnmount')\n        },\n        unmounted() {\n          this.__life('unmounted')\n        },\n        methods: {\n          __life(hookName: VueHookName) {\n            (this as any).__life_impl(hookName)\n          },\n        },\n        onCreate() {\n          this.__life('onCreate')\n        },\n        onDestroy() {\n          this.__life('onDestroy')\n        },\n      })\n      app.mixin(lifecycleLogMixin as any)\n    }\n  },\n}\nexport default LifecycleLogPlugin\n","import { throwError } from 'tg-commons'\nimport { type PartialTgMapConfig, setTgMapConfig } from 'tg-map-core'\nimport 'tg-map-core/dist/tg-map-core.css'\nimport type { App, Component } from 'vue'\n\nimport MapMixin, { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\nconst TgMapPlugin = {\n  install(app: App, config?: PartialTgMapConfig) {\n    setTgMapConfig(config)\n    // Vue3中提倡在需要用的地方导入组件, 对tree-shrink更友好\n    if (import.meta.env.VITE_FALSE) {\n      // 注册所有Tg开头的Vue\n      // ## webpack:\n      // const views = require.context('./', true, /Tg.*\\.vue$/)\n      // ## vite:\n      const views = import.meta.glob('./**/Tg*.vue', { eager: true, import: 'default' })\n      Object.keys(views).forEach(key => {\n        const TgVue = views[key] as Component\n        app.component(TgVue.name ?? throwError(`Tg开头的组件必须设置name: ${key}`), TgVue)\n      })\n    }\n\n    const strategies = app.config.optionMergeStrategies\n    // Vue3中必须自己写合并策略: https://github.com/vuejs/core/issues/861\n    strategies[MIXIN_HOOK_CREATE] = strategies[MIXIN_HOOK_DESTROY] = (to, from) => {\n      // 依照Vue2的风格, 将方法合并成数组\n      // 参考:\n      // - Vue3兼容模式: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/componentOptions.ts#L1065\n      // - Vue2: https://github.com/vuejs/vue/blob/a9ca2d85193e435e668ba25ace481bfb176b0c6e/src/core/util/options.ts#L154\n      return to\n        ? [...new Set([].concat(to as any, from as any))]\n        : Array.isArray(from)\n          ? from\n          : [from]\n    }\n  },\n}\n\n/* 导出变量, 外部应该只使用从这里导出的变量 */\nexport default TgMapPlugin\n// 导出map和utils目录\nexport * from 'tg-map-core'\nexport { default as LifecycleLogPlugin, type LifecycleLogOptions } from '../utils/lifecycle-log'\nexport * from '../utils/vue-utils'\n// 导出vue文件\nexport { default as TgCustomControl } from './controls/TgCustomControl.vue'\nexport { default as TgMapTypeControl } from './controls/TgMapTypeControl.vue'\nexport { default as TgScaleControl } from './controls/TgScaleControl.vue'\nexport { default as TgStreetViewControl } from './controls/TgStreetViewControl.vue'\nexport { default as TgZoomControl } from './controls/TgZoomControl.vue'\nexport { default as TgHeatmap } from './extra/TgHeatmap.vue'\nexport { default as TgMarkerClusterer } from './extra/TgMarkerClusterer.vue'\nexport { default as TgTrafficLayer } from './layers/TgTrafficLayer.vue'\nexport * from './map-hooks'\nexport { default as TgCircle } from './overlays/TgCircle.vue'\nexport { default as TgElementOverlay } from './overlays/TgElementOverlay.vue'\nexport { default as TgInfoBox } from './overlays/TgInfoBox.vue'\nexport { default as TgInfoWindow } from './overlays/TgInfoWindow.vue'\nexport { default as TgLabel } from './overlays/TgLabel.vue'\nexport { default as TgMarker } from './overlays/TgMarker.vue'\nexport { default as TgPolygon } from './overlays/TgPolygon.vue'\nexport { default as TgPolyline } from './overlays/TgPolyline.vue'\nexport { default as TgRectangle } from './overlays/TgRectangle.vue'\nexport { default as TgMap } from './TgMap.vue'\nexport { default as TgMapWidget } from './TgMapWidget.vue'\nexport {\n  MapMixin, MIXIN_HOOK_CREATE,\n  MIXIN_HOOK_DESTROY,\n  MIXIN_MAP_NAME,\n}\n// END\n"],"names":["stringEnumProp","enumObject","defaultValue","value","stringUnionPropFromValues","values","requiredProp","type","optionalProp","computedSaveOnThis","defaultValues","accessors","key","name","sharedPropertyDefinition","noop","createPropertyObject","obj","redefined","createPropertyObjectTyped","createEmptyVNode","createCommentVNode","callHook","vm","hookName","hooks","hook","findByComponentType","arr","component","item","extractVNodeFromSlotsByComponent","slots","nodeList","node","splitAttrs","attrs","props","listeners","binds","listenerProps","Strings","useSplittedAttrs","computed","eventProp","useEventLogMethods","prevType","prevTime","eventLog","event","eventLogLess","isComponentByType","instance","safeAsComponent","findAncestorComponentByType","startInstance","endComponent","MIXIN_MAP_NAME","MIXIN_HOOK_CREATE","MIXIN_HOOK_DESTROY","MapMixin","defineComponent","tgMapProps","TgMapType","LatLng","InfoWindowModeValues","GestureHandlingOptions","BuildInMapTypeId","_sfc_main$c","typed","Objects","_a","unwrapStringEnumValue","MapType","loadCachedMap","e","map","TgMapFactory","markRaw","bindEvents","watch","zoom","center","oldZoom","oldCenter","updateCenter","isUpdateMapType","isUpdateMapTypeId","mapType","_openBlock","_createElementBlock","_mergeProps","_ctx","_createElementVNode","_normalizeClass","_createCommentVNode","_renderSlot","_sfc_main$b","dimen","_normalizeStyle","_sfc_main$a","ControlPosition","lateinit","TgMap","$el","C","CustomControl","_sfc_main$9","MapTypeControlType","_sfc_main$8","useComponentName","getCurrentInstance","file","path","useTgMapInner","mapRef","inject","onCreate","onDestroy","throwError","onMounted","onBeforeUnmount","_sfc_main$7","control","_sfc_main$6","_sfc_main$5","heatmap","v","TgMarkerClusterer","marker","Arrays","_sfc_main$4","TrafficLayer","_sfc_main$3","toRaw","radius","SimpleElementOverlay","ElementOverlay","options","content","position","projection","point","TgElementOverlay","MapPane","tgMarkerProps","TgMarker","oldValue","deepEqual","BaiduMarker","label","_label","info","isShow","TgInfoBox","GoogleMap","wrapComponentElementForGoogle","TgInfoWindow","_withDirectives","TgLabel","tgPolygonProps","_sfc_main$2","paths","i","_sfc_main$1","_sfc_main","bounds","DEFAULT_EXCLUDE_HOOK_NAMES","LifecycleLogPlugin","app","lifecycleLogMixin","componentName","__life","TgMapPlugin","config","setTgMapConfig","strategies","to","from"],"mappings":"gOAgEgB,SAAAA,EAAyCC,EAAeC,EAAqD,CACpH,MAAA,CACL,KAAM,OACN,QAASA,EACT,UAAYC,GAAsB,OAAO,OAAOF,CAAU,EAAE,SAASE,CAAK,CAC5E,CACF,CAKgB,SAAAC,EAA4CC,EAAsBH,EAAqC,CAC9G,MAAA,CACL,KAAM,OACN,QAASA,EACT,UAAYC,GAAaE,EAAO,SAASF,CAAK,CAChD,CACF,CAEO,SAASG,EAAgBC,EAA0D,CACjF,MAAA,CACL,KAAAA,EACA,SAAU,EACZ,CACF,CAIgB,SAAAC,EAAgBD,EAAmBL,EAAuC,CACjF,MAAA,CACL,KAAAK,EACA,QAASL,CACX,CACF,CAQO,SAASO,EAAsBC,EAA4F,CAChI,MAAMC,EAAiB,CAAC,EACjB,cAAA,QAAQD,CAAa,EAAE,QAAQ,CAAC,CAACE,EAAKV,CAAY,IAAM,CACvD,MAAAW,EAAO,KAAKD,CAAG,GACrBD,EAAUC,CAAG,EAAI,CACf,KAAM,CACE,MAAAT,EAAQ,KAAKU,CAAI,EAChB,OAAAV,IAAU,OAAYD,EAAeC,CAC9C,EACA,IAAIA,EAAY,CACd,KAAKU,CAAI,EAAIV,CAAA,CAIjB,CAAA,CACD,EACMQ,CACT,CAGA,MAAMG,EAA+C,CACnD,WAAY,GACZ,aAAc,GACd,IAAKC,EAAA,KACL,IAAKA,EAAAA,IACP,EAMO,SAASC,EAAqBC,EAAe,CAClD,cAAO,KAAKA,CAAG,EAAE,QAAeL,GAAA,CACxB,MAAAT,EAAQc,EAAIL,CAAG,EACrB,IAAIM,EAAY,GACZ,OAAOf,GAAU,YACnBW,EAAyB,IAAMX,EAC/BW,EAAyB,IAAMC,EAAA,KACnBG,EAAA,IACH,OAAOf,GAAU,UAAY,OAAOA,EAAM,KAAQ,aAC3DW,EAAyB,IAAMX,EAAM,IACrCW,EAAyB,IAAMX,EAAM,IACzBe,EAAA,IAEVA,IACFD,EAAIL,CAAG,EAAI,OAAO,eAAeK,EAAKL,EAAKE,CAAwB,EACrE,CACD,EACMG,CACT,CAOO,SAASE,EAA6BF,EAA4C,CACvF,OAAOD,EAAqBC,CAAG,CACjC,CASO,SAASG,GAA0B,CACxC,OAAOC,qBAAmB,CAC5B,CAIgB,SAAAC,EAASC,EAA6BC,EAAuB,CAErE,MAAAC,EAA6CF,EAAG,SAAiBC,CAAQ,EAC/E,GAAKC,EAGL,UAAWC,KAAQD,EACjBC,EAAK,KAAKH,CAAE,CAEhB,CAMgB,SAAAI,EACdC,EACAC,EAC6B,CAC7B,UAAWC,KAAQF,EAGjB,GAAIE,EAAK,SAAS,OAASD,EAAU,KAC5B,OAAAC,CAIb,CASgB,SAAAC,EAAwCC,EAAcH,EAAoC,CACpG,GAAA,CAACG,EAAM,QAAgB,OAErB,MAAAC,EAAWD,EAAM,QAAQ,EAC/B,UAAWE,KAAQD,EACjB,IAAKC,GAAA,YAAAA,EAAM,MAAmB,OAASL,EAAU,KACxC,OAAAK,CAIb,CA8BgB,SAAAC,EAAWC,EAAgCC,EAAiC,CAC1F,MAAMC,EAAqC,CAAC,EACtCC,EAAiC,CAAC,EAClCC,EAAyC,CAAC,EAChD,cAAO,KAAKJ,CAAK,EAAE,QAAexB,GAAA,CAC5BA,EAAI,WAAW,IAAI,EACX0B,EAAAG,EAAAA,QAAQ,aAAa7B,EAAI,UAAU,CAAC,CAAC,CAAC,EAAIwB,EAAMxB,CAAG,EAEvD2B,EAAA3B,CAAG,EAAIwB,EAAMxB,CAAG,CACxB,CACD,EACGyB,GACF,OAAO,KAAKA,CAAK,EAAE,QAAezB,GAAA,CAC5BA,EAAI,WAAW,IAAI,IACP4B,EAAAC,EAAAA,QAAQ,aAAa7B,EAAI,UAAU,CAAC,CAAC,CAAC,EAAIyB,EAAMzB,CAAG,EACnE,CACD,EAEI,CAEL,MAAA2B,EAEA,UAAAD,EAEA,cAAAE,CACF,CACF,CAGgB,SAAAE,EAAiBN,EAAgCC,EAAiC,CAChG,OAAOM,EAAS,SAAA,IAAMR,EAAWC,EAAOC,CAAK,CAAC,CAChD,CAwBO,SAASO,GAA6C,CACpD,OAAA,QACT,CAEO,MAAMC,EAAqB,IAAM,CAClC,IAAAC,EACAC,EAIJ,SAASC,EAASC,EAAiC,CACjD,QAAQ,IAAIA,CAAK,EACjBH,EAAWG,GAAUA,EAAc,KACnCF,EAAW,KAAK,IAAI,CAAA,CAGtB,SAASG,EAAwBD,EAAiC,GAC3DA,GAAUA,EAAc,QAAUH,GAAY,KAAK,OAASC,GAAY,GAAK,MAChFC,EAASC,CAAK,CAChB,CAEK,MAAA,CAAE,SAAAD,EAAU,aAAAE,CAAa,CAClC,EAWgB,SAAAC,EACdC,EACAvB,EAC6B,CAEtB,OAAAuB,GAAA,YAAAA,EAAU,SAAS,QAASvB,EAAU,IAC/C,CAGgB,SAAAwB,EACdD,EACAvB,EAC6B,CAC7B,OAAOsB,EAAkBC,EAAUvB,CAAS,EAAIuB,EAAW,MAC7D,CASgB,SAAAE,EACdzB,EACA0B,EACAC,EAC6B,CAC7B,IAAIJ,EAAWG,EACf,KAAOH,GAAU,CACX,GAAAD,EAAkBC,EAAUvB,CAAS,EAChC,OAAAuB,EACE,GAAAI,GAAgBL,EAAkBC,EAAUI,CAAY,EAC1D,OAEPJ,EAAWA,EAAS,OACtB,CAGJ,CCvXO,MAAMK,EAAiB,OACjBC,EAAoB,WACpBC,EAAqB,YAiB5BC,EAAWC,EAAAA,gBAAgB,CAC/B,OAAQ,CAACJ,CAAc,EACvB,SAAU,CAGRnC,EAAS,KAAMoC,CAAiB,CAClC,EACA,eAAgB,CAEdpC,EAAS,KAAMqC,CAAkB,CACnC,EACA,QAAS,CACP,UAAW,CACTrC,EAAS,KAAMqC,CAAkB,EACjCrC,EAAS,KAAMoC,CAAiB,CAAA,CAEpC,EACA,QAAS,CACP,OAAOtC,EAAiB,CAAA,CAE5B,CAAC,ECTY0C,EAAa,CAExB,KAAM9D,EAAe+D,YAAWA,EAAAA,UAAU,MAAM,EAShD,OAAQzD,EAAa0D,QAAM,EAM3B,gBAAiBxD,EAAa,OAAQ,GAAG,EAMzC,cAAeA,EAAawD,QAAM,EAMlC,WAAYxD,EAAawD,QAAM,EAC/B,KAAM1D,EAAa,MAAM,EAKzB,eAAgBF,EAA0B6D,sBAAoB,EAC9D,gBAAiBjE,EAAekE,wBAAsB,EACtD,eAAgB1D,EAAa,OAAO,EACpC,QAASA,EAAa,MAAM,EAC5B,QAASA,EAAa,MAAM,EAC5B,SAAUA,EAAa,MAA4B,EACnD,UAAWR,EAAemE,kBAAgB,EAE1C,QAAS3D,EAAa,MAAM,EAC5B,SAAUA,EAAa,OAAO,EAC9B,OAAQoC,EAAU,EAClB,kBAAmBA,EAAU,EAC7B,0BAA2BA,EAAU,EACrC,uBAAwBA,EAAU,EAClC,oBAAqBA,EAAU,EAC/B,uBAAwBA,EAAU,EAClC,gBAAiBA,EAAU,EAC3B,QAASA,EAAU,CACrB,EAcAwB,EAAeP,kBAAgB,CAC7B,KAAM,SACN,SAAU,CACD,MAAA,CACL,CAACJ,CAAc,EAAGd,EAAAA,SAAS,IAAM,KAAK,GAAG,CAC3C,CACF,EACA,aAAc,GACd,MAAOmB,EAEP,MAAO,OACP,MAAMzB,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,oBAAqB,MACvB,CACF,EACA,MAAO,CACE,MAAA,CACL,IAAKgC,EAAAA,MAAe,EACpB,YAAa,EACf,CACF,EACA,SAAU,CACR,WAAY,CACH,OAAAC,UAAQ,aAAa,KAAK,MAAM,CAAA,CAE3C,EACA,MAAO,CACL,gBAAgBnE,EAAwD,OAClEA,KACFoE,EAAA,KAAK,MAAL,MAAAA,EAAU,mBAAmBC,EAAsB,sBAAArE,EAAO+D,EAAsB,sBAAA,GAEpF,EACA,QAAQ/D,EAAO,QACRoE,EAAA,KAAA,MAAA,MAAAA,EAAK,WAAWpE,EACvB,EACA,QAAQA,EAAO,QACRoE,EAAA,KAAA,MAAA,MAAAA,EAAK,WAAWpE,EACvB,EACA,SAASA,EAAkB,QACpBoE,EAAA,KAAA,MAAA,MAAAA,EAAK,YAAYpE,EACxB,EACA,UAAUA,EAAkD,OACtDA,KACFoE,EAAA,KAAK,MAAL,MAAAA,EAAU,oBAAoBC,EAAsB,sBAAArE,EAAOgE,EAAgB,gBAAA,GAE/E,EACA,QAAQhE,EAAiB,QACvBoE,EAAA,KAAK,MAAL,MAAAA,EAAU,WAAWpE,GAASsE,EAAAA,QAAQ,OACxC,EACA,SAAStE,EAAiB,QACnBoE,EAAA,KAAA,MAAA,MAAAA,EAAK,YAAYpE,GAAS,GACjC,EACA,eAAeA,EAAiB,QACzBoE,EAAA,KAAA,MAAA,MAAAA,EAAK,kBAAkBpE,GAAS,GAAK,CAE9C,EACA,MAAM,SAAU,CAEd,MAAMI,EAAOiE,EAAA,sBAAsB,KAAK,KAAMT,EAAAA,SAAS,EACnD,GAAA,CACF,MAAMW,EAAAA,cAAcnE,CAAI,QACjBoE,EAAG,CACL,KAAA,MAAM,QAASA,CAAC,EACrB,MAAA,CAEF,GAAI,KAAK,YAAa,CACZ,QAAA,KAAK,eAAepE,CAAI,eAAe,EAC/C,MAAA,CAGF,MAAMqE,EAAMC,EAAAA,aAAa,UAAUtE,EAAM,KAAK,MAAM,IAAkC,CACpF,OAAQ,KAAK,OACb,KAAM,KAAK,KACX,eAAgB,KAAK,eACrB,gBAAiBiE,EAAA,sBAAsB,KAAK,gBAAiBN,EAAAA,sBAAsB,EACnF,QAAS,KAAK,QACd,QAAS,KAAK,QACd,SAAU,KAAK,SACf,iBAAkBM,EAAA,sBAAsB,KAAK,UAAWL,EAAAA,gBAAgB,EACxE,SAAU,KAAK,SACf,eAAgB,KAAK,cAAA,CACtB,EAoCD,GAlCK,KAAA,IAAMW,UAAQF,CAAG,EAClB,KAAK,SACHA,EAAA,WAAW,KAAK,OAAO,EAIzB,UAAW,KAAK,MAAM,WACxB,QAAQ,MAAM,iCAAiC,EAEjDG,EAAA,WAAW,KAAK,MAAM,UAAWH,EAAK,KAAK,MAAsB,CAAC,MAAM,CAAC,EAEpE,KAAA,MAAM,OAAQA,CAAG,EAKhBI,QAAA,CACJ,IAAM,KAAK,KACX,IAAM,KAAK,MAAA,EACV,CAAC,CAACC,EAAMC,CAAM,EAAG,CAACC,EAASC,CAAS,IAAM,CACvCH,IAASE,GAEXP,EAAI,QAAQK,CAAI,EAEdC,IAAWE,IACSR,EAAI,UAAU,EACjB,OAAOM,CAAM,GAE9BN,EAAI,UAAUM,CAAM,EAExB,CACD,EAGG,KAAK,MAAM,cAAc,eAAe,EAAG,CAC7C,MAAMG,EAAe,IAAM,KAAK,MAAM,gBAAiBT,EAAI,WAAW,EAClEA,EAAA,iBAAiB,iBAAkB,IAAM,CACvC,KAAK,gBAAkB,GACzB,aAAa,KAAK,mBAAmB,EACrC,KAAK,oBAAsB,WAAWS,EAAc,KAAK,eAAe,GAE3DA,EAAA,CACf,CACD,CAAA,CAEC,KAAK,MAAM,cAAc,uBAAuB,IAE7C,KAAA,MAAM,wBAAyB,KAAK,MAAM,EAC3CT,EAAA,iBAAiB,iBAAkB,IAAM,CAC3C,KAAK,MAAM,wBAAyBA,EAAI,UAAA,CAAW,CAAA,CACpD,GAEC,KAAK,MAAM,cAAc,aAAa,GACpCA,EAAA,iBAAiB,eAAgB,IAAM,CACzC,KAAK,MAAM,cAAeA,EAAI,QAAA,CAAS,CAAA,CACxC,EAEH,MAAMU,EAAkB,KAAK,MAAM,cAAc,iBAAiB,EAC5DC,EAAoB,KAAK,MAAM,cAAc,oBAAoB,GACnED,GAAmBC,IACjBX,EAAA,iBAAiB,mBAAoB,IAAM,CACvC,MAAAY,EAAUZ,EAAI,WAAW,EACZU,GAAA,KAAK,MAAM,kBAAmBE,CAAO,EACxDD,GAAqB,KAAK,MAAM,qBAAsBC,EAAQ,EAAE,CAAA,CACjE,CAEL,EACA,WAAY,CACV,KAAK,YAAc,GACf,KAAK,MACH,KAAK,MAAM,cAAc,oBAAoB,GAC/C,KAAK,MAAM,qBAAsB,KAAK,IAAI,WAAW,EAEnD,KAAK,MAAM,cAAc,eAAe,IAC1C,aAAa,KAAK,mBAAmB,EAErC,KAAK,MAAM,gBAAiB,KAAK,IAAI,WAAW,GAGtD,EACA,QAAS,CAAA,CAEX,CAAC,+FA7QC,OAAAC,YAAA,EAAAC,qBAeM,MAfNC,EAAAA,WAeM,CAfD,MAAM,UAAiBC,QAAM,KAAK,EAAA,CACrCC,EAAAA,mBAMO,MAAA,CALL,IAAI,MACH,MAAKC,EAAAA,eAAA,CAAA,cAAA,GAAoE,CAAA,0BAAAF,EAAA,IAAI,EAAK,EAAAA,EAAA,QAAA,CAAA,WAMjEG,EAAA,mBAAA,GAAA,EAAA,EAEJH,EAAA,IACdI,EAAAA,WAAaJ,EAAA,OAAA,UAAA,CAAA,IAAA,CAAA,CAAA,EAAAG,qBAAA,GAAA,EAAA,EAEfC,aAA4BJ,EAAA,OAAA,SAAA,CAAA,EAAA,EAAA,8BCLhCK,EAAepC,kBAAgB,CAC7B,KAAM,gBACN,MAAO,CACL,KAAM,CACJ,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IACX,EACA,IAAK,CACH,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IACX,EACA,MAAO,CACL,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IACX,EACA,OAAQ,CACN,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IAAA,CAEb,EACA,SAAU,CACR,UAAW,CAET,OAAO,KAAK,KAAO,MAAQ,KAAK,QAAU,KAAO,EAAI,KAAK,GAAA,CAE9D,EACA,QAAS,CACPqC,MAAAA,EAAAA,KAAA,CAEJ,CAAC,+CAtCCR,EAEM,mBAAA,MAAA,CAFA,MAAKI,EAAE,eAAAF,EAAA,SAAS,IAAI,EAAG,MAAKO,EAAA,eAAA,CAAA,KAAUP,EAAM,MAAAA,EAAA,IAAI,EAAQ,IAAAA,EAAA,MAAMA,EAAQ,QAAA,EAAA,MAAUA,EAAM,MAAAA,EAAA,KAAK,EAAW,OAAAA,EAAA,MAAMA,EAAM,MAAA,CAAA,CAAA,CAAA,EAAA,CACtHI,aAAaJ,EAAA,OAAA,SAAA,CAAA,EAAA,CAAA,8BCWjBQ,EAAevC,kBAAgB,CAC7B,KAAM,oBACN,OAAQ,CAACD,CAAQ,EACjB,MAAO,CACL,SAAU5D,EAAeqG,kBAAiBA,EAAAA,gBAAgB,YAAY,CACxE,EAGA,OAAQ,CACC,MAAA,CACL,QAASC,EAAwB,SAAA,CACnC,CACF,EACA,MAAO,CACL,UAAW,CACT,KAAK,SAAS,CAAA,CAElB,EACA,UAAW,CACJjD,EAAgB,KAAK,QAASkD,CAAK,GACtC,QAAQ,KAAK,8BAA8B,EAEvC,KAAA,CAAE,IAAAC,GAAQ,KACVC,EAAI,cAAcC,eAAc,CACpC,iBAAkB,CACT,OAAAF,CAAA,CAEX,EACA,KAAK,QAAU,IAAIC,EAAEjC,wBAAsB,KAAK,SAAU6B,EAAAA,eAAe,CAAC,EACrE,KAAA,KAAK,iBAAiB,KAAK,OAAO,CACzC,EACA,WAAY,CACL,KAAA,KAAK,oBAAoB,KAAK,OAAO,CAAA,CAE9C,CAAC,+CA9CCX,EAEM,mBAAA,MAAA,CAFA,MAAKI,EAAE,eAAAF,EAAA,SAAS,IAAI,CAAA,EAAA,CACxBI,aAAQJ,EAAA,OAAA,SAAA,CAAA,EAAA,CAAA,8BCKZe,EAAe9C,kBAAgB,CAC7B,KAAM,sBACN,OAAQ,CAACD,CAAQ,EACjB,MAAO,CACL,SAAU5D,EAAeqG,kBAAiBA,EAAAA,gBAAgB,QAAQ,EAClE,KAAMrG,EAAe4G,oBAAkB,EACvC,SAAUpG,EAAa,KAAY,CACrC,EAIA,OAAQ,CACC,MAAA,CACL,QAAS8F,EAAyB,SAAA,CACpC,CACF,EACA,MAAO,CACL,SAASnG,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,MAAO,CACL,KAAK,SAAS,CAChB,EACA,SAAU,CACR,SAAU,CACR,KAAK,SAAS,CAChB,EACA,KAAM,EAAA,CAEV,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,qBAAqBqE,EAAAA,sBAAsB,IAAI,CAAC,EACpE,KAAA,KAAK,WAAW,KAAK,OAAO,CACnC,EACA,WAAY,CACL,KAAA,KAAK,cAAc,KAAK,OAAO,CAAA,CAExC,CAAC,ECtCDqC,EAAehD,kBAAgB,CAC7B,KAAM,mBACN,OAAQ,CAACD,CAAQ,EACjB,MAAO,CACL,SAAU5D,EAAeqG,kBAAiBA,EAAAA,gBAAgB,YAAY,CACxE,EAGA,OAAQ,CACC,MAAA,CACL,QAASC,EAAuB,SAAA,CAClC,CACF,EACA,MAAO,CACL,SAASnG,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAAA,CAElC,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,mBAAmBqE,EAAAA,sBAAsB,IAAI,CAAC,EAClE,KAAA,KAAK,WAAW,KAAK,OAAO,CACnC,EACA,WAAY,CACL,KAAA,KAAK,cAAc,KAAK,OAAO,CAAA,CAExC,CAAC,EC3BM,SAASsC,GAAuC,OAC/C,MAAAvG,GAAOwG,EAAAA,yBAAAA,YAAAA,EAAsB,KAC/B,IAAAlG,GAAON,GAAA,YAAAA,EAAM,QAAQA,GAAA,YAAAA,EAAM,QAC/B,GAAI,CAACM,EAAM,CACT,MAAMmG,EAAOzG,GAAA,YAAAA,EAAM,OACfyG,IACKnG,EAAAoG,EAAA,KAAK,SAASD,EAAM,MAAM,EACnC,CAEK,OAAAnG,CACT,CCPO,SAASqG,GAAuD,CAC/D,MAAAC,EAASC,SAA6B3D,CAAc,EACtD,IAAA4D,EACAC,EACJ,OAAIH,GAAU,MAAMI,aAAW,IAAIT,EAAiB,GAAK,SAAS,oBAAoB,EAE/E,CACL,OAAAK,EAEA,IAAI,KAAM,CACD,OAAAA,EAAO,OAASI,EAAA,WAAW,UAAU,CAC9C,EAEA,CAAC7D,CAAiB,EAAEhC,EAAoB,CACtC8F,EAAAA,UAAU9F,CAAI,EACV2F,GAAUE,EAAA,WAAW,GAAG7D,CAAiB,QAAQ,EAC1C2D,EAAA3F,CACb,EAEA,CAACiC,CAAkB,EAAEjC,EAAoB,CACvC+F,EAAAA,gBAAgB/F,CAAI,EAChB4F,GAAWC,EAAA,WAAW,GAAG5D,CAAkB,QAAQ,EAC3C2D,EAAA5F,CACd,EAEA,UAAW,CACG4F,GAAA,MAAAA,IACDD,GAAA,MAAAA,GAAA,CAEf,CACF,CC5BA,MAAAK,EAAe7D,kBAAgB,CAC7B,KAAM,yBACN,MAAO,CACL,SAAU7D,EAAeqG,kBAAiBA,EAAAA,gBAAgB,YAAY,CACxE,EAGA,MAAMhE,EAAO,CACX,IAAIsF,EAAUrB,EAAAA,SAA4B,EAE1C,KAAM,CAAE,IAAA1B,EAAK,SAAAyC,EAAU,UAAAC,CAAA,EAAcJ,EAAuB,EAE5D,OAAAG,EAAS,IAAM,CACbM,EAAU/C,EAAI,wBAAwBJ,EAAsB,sBAAAnC,CAAK,CAAC,EAClEuC,EAAI,WAAW+C,CAAO,CAAA,CACvB,EAEDL,EAAU,IAAM,CACd1C,EAAI,cAAc+C,CAAO,CAAA,CAC1B,EAED3C,EAAAA,MAAM,IAAM3C,EAAM,SAAWlC,GAAU,CACrCwH,EAAQ,YAAYnD,EAAAA,sBAAsBrE,EAAOkG,EAAe,eAAA,CAAC,CAAA,CAClE,EACMjF,CAAA,CAEX,CAAC,EC5BDwG,EAAe/D,kBAAgB,CAC7B,KAAM,kBACN,MAAO,CACL,SAAU7D,EAAeqG,kBAAiBA,EAAAA,gBAAgB,YAAY,EACtE,cAAe7F,EAAa,OAAO,CACrC,EAGA,MAAM6B,EAAO,CACX,IAAIsF,EAAUrB,EAAAA,SAAsB,EAEpC,KAAM,CAAE,IAAA1B,EAAK,SAAAyC,EAAU,UAAAC,CAAA,EAAcJ,EAAuB,EAE5D,OAAAG,EAAS,IAAM,CACbM,EAAU/C,EAAI,kBAAkBJ,EAAsB,sBAAAnC,CAAK,CAAC,EAC5DuC,EAAI,WAAW+C,CAAO,CAAA,CACvB,EAEDL,EAAU,IAAM,CACd1C,EAAI,cAAc+C,CAAO,CAAA,CAC1B,EAED3C,EAAAA,MAAM,IAAM3C,EAAM,SAAWlC,GAAU,CACrCwH,EAAQ,YAAYnD,EAAAA,sBAAsBrE,EAAOkG,EAAe,eAAA,CAAC,CAAA,CAClE,EACDrB,EAAAA,MAAM,IAAM3C,EAAM,cAAgBlC,GAAU,CAClCwH,EAAA,iBAAiBxH,GAAS,EAAI,CAAA,CACvC,EACMiB,CAAA,CAEX,CAAC,EC9BDyG,EAAehE,kBAAgB,CAC7B,KAAM,aACN,MAAO,CACL,aAAcrD,EAAa,MAAM,EACjC,SAAUA,EAAa,MAAM,EAC7B,QAASA,EAAa,MAAM,EAC5B,OAAQA,EAAa,MAAM,EAC3B,KAAMF,EAAa,KAAY,CACjC,EACA,MAAM+B,EAAO,CACX,KAAM,CAAE,IAAAuC,EAAK,SAAAyC,EAAU,UAAAC,CAAA,EAAcJ,EAAuB,EAC5D,IAAIY,EAAUxB,EAAAA,SAAkB,EAEhC,OAAAe,EAAS,IAAM,CACHS,EAAAlD,EAAI,cAAcvC,CAAK,CAAA,CAClC,EACDiF,EAAU,IAAM,CACdQ,EAAQ,OAAO,CAAA,CAChB,EAEK9C,QAAA,IAAM3C,EAAM,KAAO0F,GAAMD,EAAQ,QAAQC,CAAC,CAAC,EACjD/C,EAAA,MACE,CAAC,IAAM3C,EAAM,aAAc,IAAMA,EAAM,SAAU,IAAMA,EAAM,QAAS,IAAMA,EAAM,MAAM,EACxF,IAAMyF,EAAQ,WAAWzF,CAAK,CAChC,EAEOjB,CAAA,CAEX,CAAC,ECxBK4G,GAAoBnE,EAAAA,gBAAgB,CACxC,KAAM,sBACN,OAAQ,CAACD,CAAQ,EAEjB,MAAO,CACL,SAAUpD,EAAa,MAAM,EAC7B,QAASA,EAAa,MAAM,EAC5B,eAAgBA,EAAa,MAAM,EACnC,cAAeA,EAAa,OAAO,EACnC,OAAQA,EAAa,KAAY,EACjC,sBAAuBA,EAAa,QAAe,EACnD,OAAQA,EAAa,MAAM,CAC7B,EACA,OAAQ,CACC,MAAA,CACL,UAAW8F,EAAAA,SAA0B,EACrC,QAASjC,EAAuB,MAAA,EAAE,EAClC,eAAgBA,EAAuB,MAAA,CAAE,CAAA,CAC3C,CACF,EACA,MAAO,CACL,UAAW,CACT,KAAK,SAAS,CAChB,EACA,SAAU,CACR,KAAK,SAAS,CAChB,EACA,gBAAiB,CACf,KAAK,SAAS,CAChB,EACA,eAAgB,CACd,KAAK,SAAS,CAChB,EACA,OAAQ,CACN,SAAU,CACR,KAAK,SAAS,CAChB,EACA,KAAM,EACR,EACA,uBAAwB,CACtB,KAAK,SAAS,CAChB,EACA,QAAS,CACP,KAAK,SAAS,CAAA,CAElB,EACA,UAAW,CAET,KAAK,UAAY,KAAK,KAAK,sBAAsB,IAAI,CACvD,EACA,WAAY,CACL,KAAA,UAAU,aAAa,EAAI,EAEhC,KAAK,eAAiB,CAAC,CACzB,EACA,QAAS,CAEP,aAAuB,CACrB,OAAO,KAAK,WAAa,IAC3B,EACA,mBAAoB,CACb,KAAA,UAAU,WAAW,KAAK,cAAc,EAC7C,KAAK,eAAiB,CAAC,CACzB,EACA,YAAY4D,EAAuB,CAC5B,KAAA,QAAQ,KAAKA,CAAM,EACpB,KAAK,gBACF,KAAK,eAAe,QAClB,KAAA,UAAU,KAAK,iBAAiB,EAElC,KAAA,eAAe,KAAKA,CAAM,EAEnC,EACA,eAAeA,EAAuB,CAChC,KAAK,gBACFC,EAAO,OAAA,OAAO,KAAK,eAAgBD,CAAM,GACvC,KAAA,UAAU,aAAaA,CAAM,GAG/BC,EAAAA,OAAA,OAAO,KAAK,QAASD,CAAM,CAAA,CACpC,CAEJ,CAAC,gDA5FCvC,EAEM,mBAAA,MAAA,CAFA,MAAKI,EAAE,eAAAF,EAAA,SAAS,IAAI,CAAA,EAAA,CACxBI,aAAQJ,EAAA,OAAA,SAAA,CAAA,EAAA,CAAA,gCCGZuC,GAAetE,kBAAgB,CAC7B,KAAM,mBACN,OAAQ,CAACD,CAAQ,EAIjB,OAAQ,CACC,MAAA,CACL,MAAO0C,EAAuB,SAAA,CAChC,CACF,EACA,MAAO,CAEP,EACA,UAAW,CACJ,KAAA,MAAQ,IAAI8B,eACZ,KAAA,KAAK,SAAS,KAAK,KAAK,CAC/B,EACA,WAAY,CACL,KAAA,KAAK,YAAY,KAAK,KAAK,CAAA,CAEpC,CAAC,EChBDC,GAAexE,kBAAgB,CAC7B,KAAM,YACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAO,CACL,OAAQtD,EAAa0D,QAAM,EAC3B,OAAQ1D,EAAa,MAAM,EAC3B,UAAWE,EAAa,OAAO,EAC/B,SAAUA,EAAa,OAAO,EAC9B,YAAaA,EAAa,MAAM,EAChC,cAAeA,EAAa,MAAM,EAClC,aAAcA,EAAa,MAAM,EACjC,QAASA,EAAa,OAAO,EAC7B,OAAQA,EAAa,MAAM,EAC3B,UAAWA,EAAa,MAAM,EAC9B,YAAaA,EAAa,MAAM,EAChC,kBAAmBoC,EAAU,EAC7B,kBAAmBA,EAAU,CAC/B,EACA,MAAO,OACP,MAAMP,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,QAASiE,EAAAA,SAAwB,EACjC,cAAe,OACf,cAAe,MACjB,CACF,EACA,MAAO,CACL,OAAOnG,EAAO,CACR,GAAA,KAAK,eAAiB,KAAM,CAC9B,MAAM+E,EAAS,KAAK,cAEhB,GADJ,KAAK,cAAgB,OACjBA,IAAWoD,QAAMnI,CAAK,EAExB,MACF,CAEG,KAAA,QAAQ,UAAUA,CAAK,CAC9B,EACA,OAAOA,EAAO,CACR,GAAA,KAAK,eAAiB,KAAM,CAC9B,MAAMoI,EAAS,KAAK,cAEpB,GADA,KAAK,cAAgB,OACjBA,IAAWpI,EAEb,MACF,CAEG,KAAA,QAAQ,UAAUA,CAAK,CAC9B,EACA,WAAY,CACV,KAAK,SAAS,CAChB,EACA,SAASA,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,cAAcA,EAAO,CACd,KAAA,QAAQ,iBAAiBA,CAAK,CACrC,EACA,aAAaA,EAAO,CACb,KAAA,QAAQ,gBAAgBA,CAAK,CACpC,EACA,UAAUA,EAAO,CACV,KAAA,QAAQ,aAAaA,CAAK,CACjC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,QAAQA,EAAO,CACR,KAAA,QAAQ,WAAWA,CAAK,CAC/B,EACA,OAAOA,EAAO,CACP,KAAA,QAAQ,UAAUA,CAAK,CAAA,CAEhC,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,aAAa,IAAI,EACrC,KAAA,KAAK,WAAW,KAAK,OAAO,EACjC4E,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,EACrD,KAAK,MAAM,cAAc,eAAe,GACrC,KAAA,QAAQ,iBAAiB,iBAAkB,IAAM,CACpD,KAAK,MAAM,gBAAiB,KAAK,cAAgB,KAAK,QAAQ,WAAW,CAAA,CAC1E,EAEC,KAAK,MAAM,cAAc,eAAe,GACrC,KAAA,QAAQ,iBAAiB,iBAAkB,IAAM,CACpD,KAAK,MAAM,gBAAiB,KAAK,cAAgB,KAAK,QAAQ,WAAW,CAAA,CAC1E,CAEL,EACA,WAAY,CACL,KAAA,KAAK,cAAc,KAAK,OAAO,CAAA,CAExC,CAAC,EC9FD,MAAMyD,WAA6BC,EAAAA,cAAe,CAChD,YACE7D,EACA8D,EACOC,EACCC,EACR,CACA,MAAMhE,EAAK8D,CAAO,EAHX,KAAA,QAAAC,EACC,KAAA,SAAAC,CAAA,CAIA,UAAwB,CAChC,OAAO,KAAK,OAAA,CAEJ,OAAOC,EAAqC,CACpD,MAAMC,EAAQD,EAAW,yBAAyB,KAAK,QAAQ,EAC/D,KAAK,QAAQ,MAAM,KAAOC,EAAM,EAAI,KACpC,KAAK,QAAQ,MAAM,IAAMA,EAAM,EAAI,IAAA,CAErC,YAAYF,EAAkB,CAC5B,KAAK,SAAWA,EAChB,KAAK,KAAK,CAAA,CAEd,CAEA,MAAMG,GAAmBlF,EAAAA,gBAAgB,CACvC,KAAM,qBACN,OAAQ,CAACD,CAAQ,EACjB,MAAO,CACL,QAAS5D,EAAegJ,UAASA,EAAAA,QAAQ,kBAAkB,EAC3D,SAAU1I,EAAa0D,EAAM,MAAA,CAC/B,EAGA,OAAQ,CACC,MAAA,CACL,QAASsC,EAA+B,SAAA,CAC1C,CACF,EACA,MAAO,CACL,SAASnG,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,SAAU,CACR,KAAK,SAAS,CAAA,CAElB,EACA,QAAS,CACP,SAAuB,CACrB,OAAO,KAAK,GAAA,CAEhB,EACA,UAAW,CACT,KAAK,QAAU,IAAIqI,GAAqB,KAAK,KAAMhE,EAAAA,sBAAsB,IAAI,EAAG,KAAK,UAAW,KAAK,QAAQ,EACxG,KAAA,KAAK,kBAAkB,KAAK,OAAO,CAC1C,EACA,WAAY,CACL,KAAA,KAAK,qBAAqB,KAAK,OAAO,CAAA,CAE/C,CAAC,2BArEC,OAAAiB,YAAA,EAAAC,qBAEM,MAFNC,EAAAA,WAEM,CAFA,MAAOC,EAAS,SAAA,IAAA,EAAcA,EAAM,MAAA,EAAA,CACxCI,aAAQJ,EAAA,OAAA,SAAA,CAAA,EAAA,EAAA,iCCkBCqD,GAAgB,CAC3B,SAAU3I,EAAa0D,QAAM,EAC7B,MAAOxD,EAAa,MAAM,EAC1B,MAAOA,EAAa,MAA+B,EACnD,KAAMA,EAAa,MAA6B,EAChD,UAAWA,EAAa,OAAO,EAC/B,UAAWA,EAAa,OAAO,EAC/B,YAAaA,EAAa,OAAO,EACjC,OAAQA,EAAa,MAAM,EAC3B,OAAQA,EAAa,MAAM,EAC3B,QAASA,EAAa,OAAO,EAC7B,0BAA2BA,EAAa,OAAO,EAK/C,mBAAoBA,EAAa,QAAS,EAAI,EAC9C,oBAAqBoC,EAAU,CACjC,EAIMsG,GAAWrF,EAAAA,gBAAgB,CAC/B,KAAM,YACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAOqF,GACP,MAAO,OACP,MAAM5G,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,OAAQiE,EAAAA,SAAwB,EAChC,aAAcjC,EAAAA,MAAe,EAC7B,KAAMA,EAAAA,MAAc,EACpB,gBAAiB,OACjB,6BAA8BhC,EAAM,kBACtC,CACF,EACA,MAAO,CACL,SAASlC,EAAe,CAClB,GAAA,KAAK,iBAAmB,KAAM,CAChC,MAAMyI,EAAW,KAAK,gBAElB,GADJ,KAAK,gBAAkB,OACnBA,IAAaN,QAAMnI,CAAK,EAE1B,MACF,CAEG,KAAA,OAAO,YAAYA,CAAK,CAC/B,EACA,MAAMA,EAAe,CACd,KAAA,OAAO,SAASA,CAAK,CAC5B,EACA,MAAMA,EAAqBgJ,EAAwB,CAC7CC,EAAA,UAAUjJ,EAAOgJ,CAAQ,IAIzBhJ,EACG,KAAA,OAAO,SAASA,CAAK,EAE1B,KAAK,SAAS,EAElB,EACA,KAAKA,EAAmB,OAClBA,GAEGoE,EAAA,KAAA,SAAA,MAAAA,EAAQ,QAAQpE,GAErB,KAAK,SAAS,CAElB,EACA,UAAUA,EAAgB,CACpB,KAAK,kBAAkBkJ,cACzB,KAAK,SAAS,EAET,KAAA,OAAO,aAAalJ,CAAK,CAElC,EACA,UAAUA,EAAgB,CACnB,KAAA,OAAO,aAAaA,CAAK,CAChC,EACA,aAAc,CACZ,KAAK,SAAS,CAChB,EACA,QAAS,CACP,KAAK,SAAS,CAChB,EACA,OAAOA,EAAgB,CACjB,KAAK,kBAAkBkJ,cACzB,KAAK,SAAS,EAET,KAAA,OAAO,UAAUlJ,CAAK,CAE/B,EACA,QAAQA,EAAgB,CACjB,KAAA,OAAO,WAAWA,CAAK,CAC9B,EACA,2BAA4B,CAC1B,KAAK,SAAS,CAChB,EACA,oBAAqB,CACnB,KAAK,SAAS,CAAA,CAElB,EACA,UAAW,CAET,KAAK,OAAS,KAAK,KAAK,aAAa,IAAI,EACrC,KAAK,cACP,KAAK,OAAO,mBAAmB,KAAK,aAAa,OAAO,EAGtD,KAAK,cAAgB,KAAK,mBAC5B,KAAK,WAAW,EAAG,YAAY,KAAK,MAAM,EAErC,KAAA,KAAK,WAAW,KAAK,MAAM,EAGlC,KAAK,6BAA+B,KAAK,mBAIrC,KAAK,MACP,KAAK,KAAK,MAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,EAGtD4E,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,OAAQ,KAAK,KAAK,EAEpD,KAAK,MAAM,cAAc,iBAAiB,GAC5C,KAAK,OAAO,iBAAiB,UAAY9B,GAAU,CACjD,KAAK,MAAM,kBAAmB,KAAK,gBAAkBA,EAAM,QAAQ,CAAA,CACpE,CAEL,EACA,WAAY,CACN,KAAK,cAAgB,KAAK,6BAC5B,KAAK,WAAW,EAAG,eAAe,KAAK,MAAM,EAExC,KAAA,KAAK,cAAc,KAAK,MAAM,CAEvC,EACA,QAAS,CACP,UAAW,CAET3B,EAAS,KAAaqC,CAAkB,EACxC,KAAK,cAAgB,KAAK,OAAO,mBAAmB,MAAS,EAC7D,KAAK,MAAQ,KAAK,KAAK,QAAQ,MAAM,EACrCrC,EAAS,KAAaoC,CAAiB,CACzC,EACA,YAA4C,CACnC,OAAAL,EAAgB,KAAK,QAAS2E,CAAiB,CACxD,EACA,WAAWsB,EAAgB,CACzB,KAAK,aAAeA,EAEhB,KAAK,QACF,KAAA,OAAO,mBAAmBA,EAAM,OAAO,CAEhD,EACA,cAAcC,EAAiB,CACxB,KAAA,OAAO,mBAAmB,MAAS,EACxC,KAAK,aAAe,MACtB,EACA,UAAUC,EAAc,CACtB,KAAK,KAAOA,EAER,KAAK,QACPA,EAAK,MAAQA,EAAK,QAAQ,KAAK,KAAK,MAAM,CAE9C,EACA,aAAaA,EAAc,CACzBA,EAAK,QAAQ,MAAM,EACnB,KAAK,KAAO,MACd,EACA,kBAAkBA,EAAcC,EAAiB,CACtCA,EAAAD,EAAK,QAAQ,KAAK,KAAK,MAAM,EAAIA,EAAK,QAAQ,MAAM,CAAA,CAC/D,CAEJ,CAAC,kCArMCxD,aAAaJ,EAAA,OAAA,SAAA,gCCeT8D,GAAY7F,EAAAA,gBAAgB,CAChC,KAAM,cACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAO,CACL,KAAMtD,EAAa,OAAO,EAC1B,SAAUE,EAAawD,QAAM,EAC7B,OAAQxD,EAAa,MAAM,EAC3B,SAAUA,EAAa,MAAM,EAC7B,YAAaA,EAAa,MAAM,EAChC,OAAQA,EAAa,MAAM,EAC3B,eAAgBA,EAAa,OAAO,EACpC,gBAAiBoC,EAAU,CAC7B,EAGA,MAAO,OACP,MAAMP,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,QAASiE,EAAyB,SAAA,CACpC,CACF,EACA,MAAO,CACL,KAAKmD,EAAiB,CAChB,KAAK,UACP,KAAK,QAAQ,EAAG,kBAAkB,KAAMA,CAAM,EAE9CA,EAAS,KAAK,QAAQ,KAAS,EAAA,KAAK,QAAQ,MAAM,CAEtD,EACA,SAAStJ,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,QAAS,CACP,KAAK,SAAS,CAChB,EACA,SAASA,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,aAAc,CACZ,KAAK,SAAS,CAChB,EACA,OAAOA,EAAO,CACP,KAAA,QAAQ,UAAUA,CAAK,CAC9B,EACA,gBAAiB,CACf,KAAK,SAAS,CAAA,CAElB,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,cAAc,KAAK,YAAY,EACpD,KAAK,UACF,KAAA,QAAA,EAAW,UAAU,IAAI,EAEzB,KAAA,MAAQ,KAAK,QAAQ,KAAK,EAG7B,KAAK,MAAM,cAAc,aAAa,GACnC,KAAA,QAAQ,iBAAiB,aAAc,IAAM,CAC3C,KAAA,MAAM,cAAe,EAAK,CAAA,CAChC,EAGH4E,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,CAC3D,EACA,WAAY,CACN,KAAK,UACF,KAAA,QAAA,EAAW,aAAa,IAAI,EAEjC,KAAK,QAAQ,MAAM,CAEvB,EACA,QAAS,CACP,YAA6B,CACpB,MAAA,CACL,QAAS,KAAK,QAAQ,EACtB,SAAU,KAAK,SACf,OAAQ,KAAK,OACb,OAAQ,KAAK,OACb,SAAU,KAAK,SACf,YAAa,KAAK,YAClB,eAAgB,KAAK,cACvB,CACF,EACA,SAAuB,CACjB,OAAA,KAAK,gBAAgB4E,YAChBC,gCAA8B,KAAK,IAAK,uBAAuB,EAEjE,KAAK,GACd,EACA,SAA8C,CAC5C,OAAOtG,EAA4B4F,EAAU,KAAK,QAAS3C,CAAK,CAClE,EACA,KAAK0B,EAAwB,CACtB,KAAA,QAAQ,KAAKA,CAAM,CAC1B,EACA,OAAQ,CACN,KAAK,QAAQ,MAAM,CAAA,CACrB,CAEJ,CAAC,2BApHC,OAAAxC,YAAA,EAAAC,qBAEM,MAFNC,EAAAA,WAEM,CAFA,MAAOC,EAAS,SAAA,IAAA,EAAcA,QAAM,KAAK,EAAA,CAC7CI,aAAQJ,EAAA,OAAA,SAAA,CAAA,EAAA,EAAA,iCCeNiE,GAAehG,EAAAA,gBAAgB,CACnC,KAAM,iBACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAO,CACL,KAAMtD,EAAa,OAAO,EAC1B,SAAUE,EAAawD,QAAM,EAC7B,SAAUxD,EAAa,MAAM,EAC7B,OAAQA,EAAa,MAAM,EAC3B,eAAgBA,EAAa,OAAO,EACpC,gBAAiBoC,EAAU,CAC7B,EACA,MAAO,OACP,MAAMP,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,QAASiE,EAA4B,SAAA,CACvC,CACF,EACA,MAAO,CACL,KAAKmD,EAAiB,CAChB,KAAK,UACP,KAAK,QAAQ,EAAG,kBAAkB,KAAMA,CAAM,EAE9CA,EAAS,KAAK,QAAQ,KAAS,EAAA,KAAK,QAAQ,MAAM,CAEtD,EACA,SAAStJ,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,UAAW,CACT,KAAK,SAAS,CAChB,EACA,QAAS,CACP,KAAK,SAAS,CAChB,EACA,gBAAiB,CACf,KAAK,SAAS,CAAA,CAElB,EACA,QAAS,CACP,SAAuB,CACjB,OAAA,KAAK,gBAAgBwJ,YAChBC,gCAA8B,KAAK,IAAK,uBAAuB,EAEjE,KAAK,GACd,EACA,SAA8C,CAC5C,OAAOtG,EAA4B4F,EAAU,KAAK,QAAS3C,CAAK,CAClE,EACA,YAAgC,CACvB,MAAA,CACL,QAAS,KAAK,QAAQ,EACtB,SAAU,KAAK,SACf,SAAU,KAAK,SACf,OAAQ,KAAK,OACb,eAAgB,KAAK,cACvB,CAAA,CAEJ,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,iBAAiB,KAAK,YAAY,EACvD,KAAK,UACF,KAAA,QAAA,EAAW,UAAU,IAAI,EAEzB,KAAA,MAAQ,KAAK,QAAQ,KAAK,EAI5B,KAAA,QAAQ,iBAAiB,OAAQ,IAAM,CACrC,KAAA,MAAM,cAAe,EAAI,CAAA,CAC/B,EACI,KAAA,QAAQ,iBAAiB,QAAS,IAAM,CACtC,KAAA,MAAM,cAAe,EAAK,CAAA,CAChC,EAEDxB,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,CAC3D,EACA,WAAY,CACN,KAAK,UACF,KAAA,QAAA,EAAW,aAAa,IAAI,EAEjC,KAAK,QAAQ,MAAM,CACrB,CAEJ,CAAC,2BArGC,OAAA+E,EAAA,gBAAArE,EAAA,UAAA,EAAAC,EAAAA,mBAEM,MAFNC,EAAAA,WAEM,CAFc,MAAOC,EAAS,SAAA,IAAA,EAAcA,QAAM,KAAK,EAAA,CAC3DI,aAAQJ,EAAA,OAAA,SAAA,CAAA,EAAA,EAAA,GAAA,UADGA,EAAI,IAAA,CAAA,CAAA,iCCabmE,GAAUlG,EAAAA,gBAAgB,CAC9B,KAAM,WACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAO,CACL,SAAUpD,EAAawD,QAAM,EAC7B,OAAQxD,EAAa,MAAM,EAC3B,OAAQA,EAAa,MAAM,EAC3B,QAASR,EAAegJ,EAAO,OAAA,CACjC,EAIA,MAAO,OACP,MAAM3G,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,CAAK,EAC7B,QAASkE,EAAuB,SAAA,CAClC,CACF,EACA,MAAO,CACL,SAASnG,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,OAAOA,EAAO,QAKPoE,EAAA,KAAA,UAAA,MAAAA,EAAS,UAAUpE,EAC1B,EACA,OAAOA,EAAO,CACP,KAAA,QAAQ,UAAUA,CAAK,CAC9B,EACA,QAAQA,EAAO,CACR,KAAA,QAAQ,WAAWA,CAAK,CAC/B,EACA,SAAU,CACR,KAAK,SAAS,CAAA,CAElB,EACA,QAAS,CACP,SAAuB,CACrB,OAAO,KAAK,GACd,EACA,QAA6B,OACpB,OAAAoE,EAAA,KAAK,YAAL,YAAAA,EAAgB,MACzB,EACA,SAA8C,CAC5C,OAAOjB,EAA4B4F,EAAU,KAAK,QAAS3C,CAAK,CAClE,EACA,YAA2B,CAClB,MAAA,CACL,QAAS,KAAK,QAAQ,EACtB,SAAU,KAAK,SACf,OAAQ,KAAK,OACb,OAAQ,KAAK,OACb,QAAS/B,EAAA,sBAAsB,KAAK,QAASwE,EAAO,OAAA,CACtD,CAAA,CAEJ,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,YAAY,KAAK,YAAY,EAElD,KAAK,UACF,KAAA,QAAA,EAAW,WAAW,IAAI,EAE1B,KAAA,KAAK,WAAW,KAAK,OAAO,EAEnCjE,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,CAC3D,EACA,WAAY,CACN,KAAK,UACF,KAAA,QAAA,EAAW,cAAc,IAAI,EAE7B,KAAA,KAAK,cAAc,KAAK,OAAO,CACtC,CAEJ,CAAC,2BA3FC,OAAAU,YAAA,EAAAC,qBAEM,MAFNC,EAAAA,WAEM,CAFA,MAAOC,EAAS,SAAA,IAAA,EAAcA,QAAM,KAAK,EAAA,CAC7CI,aAAQJ,EAAA,OAAA,SAAA,CAAA,EAAA,EAAA,iCCSCoE,GAAiB,CAC5B,MAAO1J,EAAa,KAA6B,EACjD,UAAWE,EAAa,OAAO,EAC/B,SAAUA,EAAa,OAAO,EAC9B,YAAaA,EAAa,MAAM,EAChC,cAAeA,EAAa,MAAM,EAClC,aAAcA,EAAa,MAAM,EACjC,QAASA,EAAa,OAAO,EAC7B,OAAQA,EAAa,MAAM,EAC3B,UAAWA,EAAa,MAAM,EAC9B,YAAaA,EAAa,MAAM,EAChC,iBAAkBoC,EAAU,CAC9B,EAIAqH,GAAepG,kBAAgB,CAC7B,KAAM,aACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAOoG,GACP,MAAO,OACP,MAAM3H,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,QAASiE,EAAAA,SAAyB,EAClC,aAAc,MAChB,CACF,EACA,MAAO,CACL,MAAO,CACL,QAAQnG,EAAmB,CACrB,GAAA,KAAK,cAAgB,KAAM,CAC7B,MAAM+J,EAAQ,KAAK,aAGnB,GAFA,KAAK,aAAe,OAEhBA,EAAM,SAAW/J,EAAM,QAAU+J,EAAM,MAAM,CAACnC,EAAGoC,IAAMpC,IAAMO,EAAM,MAAAnI,EAAMgK,CAAC,CAAC,CAAC,EAE9E,MACF,CAEG,KAAA,QAAQ,SAAShK,CAAK,CAC7B,EACA,KAAM,EACR,EACA,WAAY,CACV,KAAK,SAAS,CAChB,EACA,SAASA,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,cAAcA,EAAO,CACd,KAAA,QAAQ,iBAAiBA,CAAK,CACrC,EACA,aAAaA,EAAO,CACb,KAAA,QAAQ,gBAAgBA,CAAK,CACpC,EACA,UAAUA,EAAO,CACV,KAAA,QAAQ,aAAaA,CAAK,CACjC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,QAAQA,EAAO,CACR,KAAA,QAAQ,WAAWA,CAAK,CAC/B,EACA,OAAOA,EAAO,CACP,KAAA,QAAQ,UAAUA,CAAK,CAAA,CAEhC,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,cAAc,IAAI,EACtC,KAAA,KAAK,WAAW,KAAK,OAAO,EACjC4E,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,EACrD,KAAK,MAAM,cAAc,cAAc,GACpC,KAAA,QAAQ,iBAAiB,eAAgB,IAAM,CAClD,KAAK,MAAM,eAAgB,KAAK,aAAe,KAAK,QAAQ,UAAU,CAAA,CACvE,CAEL,EACA,WAAY,CACL,KAAA,KAAK,cAAc,KAAK,OAAO,CAAA,CAGxC,CAAC,ECxFDqF,GAAevG,kBAAgB,CAC7B,KAAM,cACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAO,CACL,KAAMtD,EAAa,KAA2B,EAC9C,MAAOE,EAAa,KAAiC,EACrD,UAAWA,EAAa,OAAO,EAC/B,SAAUA,EAAa,OAAO,EAC9B,YAAaA,EAAa,MAAM,EAChC,cAAeA,EAAa,MAAM,EAClC,aAAcA,EAAa,MAAM,EACjC,QAASA,EAAa,OAAO,EAC7B,OAAQA,EAAa,MAAM,EAC3B,gBAAiBoC,EAAU,CAC7B,EACA,MAAO,OACP,MAAMP,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,QAASiE,EAAAA,SAA0B,EACnC,YAAa,MACf,CACF,EACA,MAAO,CACL,KAAM,CACJ,QAAQnG,EAAO,CACT,GAAA,KAAK,aAAe,KAAM,CAC5B,MAAM8G,EAAO,KAAK,YAEd,GADJ,KAAK,YAAc,OACfA,IAASqB,QAAMnI,CAAK,EAEtB,MACF,CAEG,KAAA,QAAQ,QAAQA,CAAK,CAC5B,EACA,KAAM,EACR,EACA,MAAO,CACL,SAAU,CACR,KAAK,SAAS,CAChB,EACA,KAAM,EACR,EACA,WAAY,CACV,KAAK,SAAS,CAChB,EACA,SAASA,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,cAAcA,EAAO,CACd,KAAA,QAAQ,iBAAiBA,CAAK,CACrC,EACA,aAAaA,EAAO,CACb,KAAA,QAAQ,gBAAgBA,CAAK,CACpC,EACA,QAAQA,EAAO,CACR,KAAA,QAAQ,WAAWA,CAAK,CAC/B,EACA,OAAOA,EAAO,CACP,KAAA,QAAQ,UAAUA,CAAK,CAAA,CAEhC,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,eAAe,IAAI,EACvC,KAAA,KAAK,WAAW,KAAK,OAAO,EACjC4E,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,EAErD,KAAK,MAAM,cAAc,aAAa,GACnC,KAAA,QAAQ,iBAAiB,cAAe,IAAM,CACjD,KAAK,MAAM,cAAe,KAAK,YAAc,KAAK,QAAQ,SAAS,CAAA,CACpE,CAEL,EACA,WAAY,CACV,KAAK,QAAQ,OAAO,CAAA,CAExB,CAAC,EClFDsF,GAAexG,kBAAgB,CAC7B,KAAM,eACN,OAAQ,CAACD,CAAQ,EACjB,aAAc,GACd,MAAO,CACL,OAAQtD,EAAa,MAAgC,EACrD,UAAWE,EAAa,OAAO,EAC/B,SAAUA,EAAa,OAAO,EAC9B,YAAaA,EAAa,MAAM,EAChC,cAAeA,EAAa,MAAM,EAClC,aAAcA,EAAa,MAAM,EACjC,QAASA,EAAa,OAAO,EAC7B,OAAQA,EAAa,MAAM,EAC3B,UAAWA,EAAa,MAAM,EAC9B,YAAaA,EAAa,MAAM,EAChC,kBAAmBoC,EAAU,CAC/B,EACA,MAAO,OACP,MAAMP,EAAO,CAAE,MAAAD,GAAS,CACf,MAAA,CACL,MAAOM,EAAiBN,EAAOC,CAAK,EACpC,QAASiE,EAAAA,SAA2B,EACpC,cAAe,MACjB,CACF,EACA,MAAO,CACL,OAAOnG,EAAqB,CACtB,GAAA,KAAK,eAAiB,KAAM,CAC9B,MAAMmK,EAAS,KAAK,cAGhB,GAFJ,KAAK,cAAgB,OAEjBA,EAAO,OAAOnK,CAAK,EAErB,MACF,CAEG,KAAA,QAAQ,UAAUA,CAAK,CAC9B,EACA,WAAY,CACV,KAAK,SAAS,CAChB,EACA,SAASA,EAAO,CACT,KAAA,QAAQ,YAAYA,CAAK,CAChC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,cAAcA,EAAO,CACd,KAAA,QAAQ,iBAAiBA,CAAK,CACrC,EACA,aAAaA,EAAO,CACb,KAAA,QAAQ,gBAAgBA,CAAK,CACpC,EACA,UAAUA,EAAO,CACV,KAAA,QAAQ,aAAaA,CAAK,CACjC,EACA,YAAYA,EAAO,CACZ,KAAA,QAAQ,eAAeA,CAAK,CACnC,EACA,QAAQA,EAAO,CACR,KAAA,QAAQ,WAAWA,CAAK,CAC/B,EACA,OAAOA,EAAO,CACP,KAAA,QAAQ,UAAUA,CAAK,CAAA,CAEhC,EACA,UAAW,CACT,KAAK,QAAU,KAAK,KAAK,gBAAgB,IAAI,EACxC,KAAA,KAAK,WAAW,KAAK,OAAO,EACjC4E,EAAA,WAAW,KAAK,MAAM,UAAW,KAAK,QAAS,KAAK,KAAK,EACrD,KAAK,MAAM,cAAc,eAAe,GACrC,KAAA,QAAQ,iBAAiB,iBAAkB,IAAM,CACpD,KAAK,MAAM,gBAAiB,KAAK,cAAgB,KAAK,QAAQ,WAAW,CAAA,CAC1E,CAEL,EACA,WAAY,CACL,KAAA,KAAK,cAAc,KAAK,OAAO,CAAA,CAGxC,CAAC,ECpFKwF,GAA4C,CAAC,eAAgB,SAAS,EAWtEC,GAAqB,CACzB,QAAQC,EAAU/B,EAA+B,GAAI,CAC/C,GAAAA,EAAQ,SAAW,GAAO,CAC5B,MAAMgC,EAAoB7G,EAAAA,gBAAgB,CACxC,cAAe,CACP,MAAA8G,EAAgB7D,KAAsB,GAGtC8D,GAFWlC,EAAQ,WAAa,UAAU,KAAKiC,CAAa,EAG7DnJ,GAA0B,CACrBkH,EAAQ,UACNA,EAAQ,UAAU,SAASlH,CAAQ,GAC7B,QAAA,MAAM,cAAemJ,EAAenJ,CAAQ,EAE5C+I,GAA2B,SAAS/I,CAAQ,GAC9C,QAAA,MAAM,cAAemJ,EAAenJ,CAAQ,CACtD,EAEFT,EAAA,KAEJ6J,EAAO,cAAc,EAClB,KAAa,YAAcA,CAChC,EACA,SAAU,CACR,KAAK,OAAO,SAAS,CACvB,EACA,aAAc,CACZ,KAAK,OAAO,aAAa,CAC3B,EACA,SAAU,CACR,KAAK,OAAO,SAAS,CACvB,EACA,cAAe,CACb,KAAK,OAAO,cAAc,CAC5B,EACA,SAAU,CACR,KAAK,OAAO,SAAS,CACvB,EACA,eAAgB,CACd,KAAK,OAAO,eAAe,CAC7B,EACA,WAAY,CACV,KAAK,OAAO,WAAW,CACzB,EACA,QAAS,CACP,OAAOpJ,EAAuB,CAC3B,KAAa,YAAYA,CAAQ,CAAA,CAEtC,EACA,UAAW,CACT,KAAK,OAAO,UAAU,CACxB,EACA,WAAY,CACV,KAAK,OAAO,WAAW,CAAA,CACzB,CACD,EACDiJ,EAAI,MAAMC,CAAwB,CAAA,CACpC,CAEJ,ECpEMG,GAAc,CAClB,QAAQJ,EAAUK,EAA6B,CAC7CC,EAAAA,eAAeD,CAAM,EAcf,MAAAE,EAAaP,EAAI,OAAO,sBAE9BO,EAAWtH,CAAiB,EAAIsH,EAAWrH,CAAkB,EAAI,CAACsH,EAAIC,IAK7DD,EACH,CAAC,GAAG,IAAI,IAAI,GAAG,OAAOA,EAAWC,CAAW,CAAC,CAAC,EAC9C,MAAM,QAAQA,CAAI,EAChBA,EACA,CAACA,CAAI,CACb,CAEJ"}