tdesign-mobile-vue
Version:
tdesign-mobile-vue
1 lines • 55.6 kB
Source Map (JSON)
{"version":3,"file":"tree-store.mjs","sources":["../../../../src/_common/js/tree-v1/tree-store.ts"],"sourcesContent":["import { camelCase, difference, isArray, isFunction, isNumber, isPlainObject, isString } from 'lodash-es';\nimport mitt from 'mitt';\n\nimport { TreeNode } from './tree-node';\nimport { pathToKey } from './tree-node-model';\n\nimport type {\n TreeNodeValue,\n TypeIdMap,\n TypeRelatedNodesOptions,\n TypeTargetNode,\n TypeTimer,\n TypeTreeEventState,\n TypeTreeFilter,\n TypeTreeFilterOptions,\n TypeTreeItem,\n TypeTreeNodeData,\n TypeTreeStoreOptions,\n} from './types';\n\n// 构建一个树的数据模型\n// 基本设计思想:写入时更新,减少读取消耗,以减少未来实现虚拟滚动所需的计算量\n// 任何一次数据写入,会触发相应节点的状态更新\n// public 方法,在 ui 组件中有可能在使用,会保障其输入输出实现\n// private 方法,可能会改动其输入输出\n\n/**\n * tree 数据模型\n * @class TreeStore\n * @param {object} options tree 组件选项\n * @param {string} [options.prefix=\"t\"] tree 组件内部属性前缀\n * @param {object} options.keys 取值映射对象,部分属性按照其 key/value 来取 treeNode 属性值\n * @param {string} [options.keys.label=\"label\"] 从 data 种取 label 值时读取的属性名称\n * @param {string} [options.keys.value=\"value\"] 从 data 种取 value 值时读取的属性名称\n * @param {string} [options.keys.children=\"children\"] 从 data 种取 children 值时读取的属性名称\n * @param {boolean} [options.expandAll=false] 初始化节点时,是否自动展开\n * @param {number} [options.expandLevel=0] 初始化节点时,自动展开的级别\n * @param {boolean} [options.expandMutex=false] 展开时,是否使用手风琴模式\n * @param {boolean} [options.expandParent=false] 展开节点时,是否自动展开父节点\n * @param {boolean} [options.activable=false] 是否可以激活节点\n * @param {boolean} [options.activeMultiple=false] 激活节点是否使用多选模式\n * @param {boolean} [options.checkable=false] 节点是否可选中\n * @param {boolean} [options.checkStrictly=false] 节点选中是否使用严格模式\n * @param {boolean} [options.disabled=false] 节点是否禁用\n * @param {boolean} [options.draggable=false] 节点是否可拖动\n * @param {function} [options.load=null] 节点延迟加载函数\n * @param {boolean} [options.lazy=false] 节点是否使用延迟加载模式\n * @param {string} [options.valueMode=\"onlyLeaf\"] 节点选中取值模式\n * @param {function} [options.filter=null] 节点过滤函数\n * @param {function} [options.onLoad=null] 节点延迟加载完成时的回调函数\n * @param {function} [options.onReflow=null] 节点触发回流后的回调\n * @param {function} [options.onUpdate=null] 节点触发更新后的后调\n * @param {boolean} [options.allowFoldNodeOnFilter=false] 过滤时,是否允许折叠节点\n */\nexport class TreeStore {\n // 根节点集合\n public children: TreeNode[];\n\n // 所有节点集合\n public nodes: TreeNode[];\n\n // 所有节点映射\n public nodeMap: Map<TreeNodeValue, TreeNode>;\n\n // 节点 私有 ID 映射\n public privateMap: Map<string, TreeNode>;\n\n // 配置选项\n public config: TypeTreeStoreOptions;\n\n // 活动节点集合\n public activedMap: TypeIdMap;\n\n // 数据被更新的节点集合\n public updatedMap: TypeIdMap;\n\n // 选中节点集合\n public checkedMap: TypeIdMap;\n\n // 设置半选集合\n public indeterminateMap: TypeIdMap;\n\n // 展开节点的集合\n public expandedMap: TypeIdMap;\n\n // 符合过滤条件的节点的集合\n public filterMap: TypeIdMap;\n\n // 数据更新计时器\n public updateTimer: TypeTimer;\n\n // 识别是否需要重排\n public shouldReflow: boolean;\n\n // 存在过滤器标志\n public hasFilter: boolean;\n\n // 树节点过滤器\n public prevFilter: TypeTreeFilter;\n\n // 事件派发器\n public emitter: ReturnType<typeof mitt>;\n\n public constructor(options: TypeTreeStoreOptions) {\n const config: TypeTreeStoreOptions = {\n prefix: 't',\n keys: {},\n expandAll: false,\n expandLevel: 0,\n expandMutex: false,\n expandParent: false,\n activable: false,\n activeMultiple: false,\n checkable: false,\n checkStrictly: false,\n disabled: false,\n draggable: false,\n load: null,\n lazy: false,\n valueMode: 'onlyLeaf',\n filter: null,\n // 每次搜索条件变更,重置展开状态,路径节点展开,显示命中节点\n // allowFoldNodeOnFilter 为 true 时,搜索条件不变的情况下,允许折叠路径节点\n // 默认状态,allowFoldNodeOnFilter 为 false 时,路径节点无法折叠\n allowFoldNodeOnFilter: false,\n onLoad: null,\n onReflow: null,\n onUpdate: null,\n ...options,\n };\n this.config = config;\n this.nodes = [];\n this.children = [];\n this.nodeMap = new Map();\n this.privateMap = new Map();\n this.activedMap = new Map();\n this.expandedMap = new Map();\n this.checkedMap = new Map();\n this.updatedMap = new Map();\n this.indeterminateMap = new Map();\n this.filterMap = new Map();\n this.prevFilter = null;\n // 这个计时器确保频繁的 update 事件被归纳为1次完整数据更新后的触发\n this.updateTimer = null;\n // 在子节点增删改查时,将此属性设置为 true,来触发视图更新\n this.shouldReflow = false;\n // 这个标志会被大量用到\n this.hasFilter = isFunction(config.filter);\n this.emitter = mitt();\n }\n\n /**\n * 配置选项\n * @param {object} options tree 组件选项\n * @return void\n */\n public setConfig(options: TypeTreeStoreOptions) {\n const { config } = this;\n let hasChanged = false;\n Object.keys(options).forEach((key: keyof TypeTreeStoreOptions) => {\n const val = options[key];\n if (val !== config[key]) {\n hasChanged = true;\n // @ts-ignore\n // TODO: https://github.com/microsoft/TypeScript/issues/32693\n config[key] = val;\n }\n });\n this.hasFilter = isFunction(config.filter);\n if (hasChanged) {\n // 在 td-tree 的 render 方法中调用 setConfig\n // 这样减少了 watch 属性\n // 仅在属性变更后刷新状态\n // 这样可以避免触发渲染死循环\n this.refreshState();\n }\n }\n\n /**\n * 获取根节点列表\n * @return TreeNode[] 根节点对象数组\n */\n public getChildren(): TreeNode[] {\n return this.children;\n }\n\n /**\n * 获取指定节点对象\n * @param {string|number|TreeNode|Array} item 获取节点对象的条件,可以是节点 value,也可以是节点本身,也可以是路径数组\n * @return TreeNode 节点对象,如果判断树中没有符合条件的节点,返回 null\n */\n public getNode(item: TypeTargetNode | TreeNodeValue[]): TreeNode {\n let node = null;\n const { allowDuplicateValue } = this.config;\n if (isArray(item) && allowDuplicateValue) {\n const pathKey = pathToKey(item);\n node = this.nodeMap.get(pathKey);\n } else if (isString(item) || isNumber(item)) {\n node = this.nodeMap.get(item);\n } else if (item instanceof TreeNode) {\n const nodeKey = item.getNodeMapKey();\n node = this.nodeMap.get(nodeKey);\n }\n if (!node) node = null;\n return node;\n }\n\n /**\n * 获取节点在总节点列表中的位置\n * @param {TreeNode} node 节点对象\n * @return number 节点在总节点列表中的位置序号\n */\n public getIndex(node: TreeNode): number {\n return this.nodes.indexOf(node);\n }\n\n /**\n * 获取指定节点的父节点\n * @param {string} value 节点值\n * @return TreeNode 节点对象\n */\n public getParent(value: TypeTargetNode): TreeNode {\n let parent = null;\n const node = this.getNode(value);\n if (node) {\n parent = node.getParent();\n }\n return parent;\n }\n\n /**\n * 获取指定节点的所有父节点\n * @param {string} value 节点值\n * @return TreeNode[] 父节点数组\n */\n public getParents(value: TypeTargetNode): TreeNode[] {\n const node = this.getNode(value);\n let parents: TreeNode[] = [];\n if (node) {\n parents = node.getParents();\n }\n return parents;\n }\n\n /**\n * 获取指定节点在其所在 children 中的位置\n * @param {string} value 节点值\n * @return number 节点在 children 中的位置序号\n */\n public getNodeIndex(value: TypeTargetNode): number {\n const node = this.getNode(value);\n let index = -1;\n if (node) {\n index = node.getIndex();\n }\n return index;\n }\n\n /**\n * 获取所有符合条件的节点,按回流排序后的顺序给出\n * 以这些字段作为示例:\n * - value: 节点值(ID)\n * - TreeNode: 节点实例\n * - level: 节点层级\n * - filter: 节点过滤函数\n * 支持下列使用方式\n * - getNodes() 获取所有节点\n * - getNodes(value) 获取节点值对应的目标节点下,包含自己在内的所有子节点\n * - getNodes(TreeNode) 获取目标节点下,包含自己在内的所有子节点\n * - getNodes(value, { level: 2 }) 获取目标节点下,层级在 2 以内的子节点\n * - getNodes(value, { filter: node => (!node.checked) }) 获取目标节点下,未选中的节点\n * - getNodes(value, { props: { actived: true } }) 获取目标节点下,已激活的节点\n * @param {string | TreeNode} [item] 节点值,节点对象\n * @param {object} [options] 节点过滤条件,可传递节点属性,过滤出属性一致的节点\n * @param {number} [options.level=Infinity] 节点层级\n * @param {function} [options.filter=null] 节点过滤条件函数\n * @param {object} [options.props] 节点属性对象,作为过滤条件\n * @return TreeNode[] 符合条件的节点数组\n */\n public getNodes(item?: TypeTargetNode, options?: TypeTreeFilterOptions): TreeNode[] {\n let nodes: TreeNode[] = [];\n let val: TreeNodeValue = '';\n if (isString(item) || isNumber(item)) {\n val = item;\n } else if (item instanceof TreeNode) {\n val = item.value;\n }\n if (!val) {\n nodes = this.nodes.slice(0);\n } else {\n const node = this.getNode(val);\n if (node) {\n nodes = node.walk();\n }\n }\n\n if (options) {\n const conf: TypeTreeFilterOptions = {\n filter: null,\n level: Infinity,\n ...options,\n };\n if (isNumber(conf.level) && conf.level !== Infinity) {\n nodes = nodes.filter((node) => node.level <= conf.level);\n }\n if (isFunction(conf.filter)) {\n nodes = nodes.filter((node) => {\n const nodeModel = node.getModel();\n return conf.filter(nodeModel);\n });\n }\n if (isPlainObject(conf.props)) {\n nodes = nodes.filter((node) => {\n const result = Object.keys(conf.props).every((key) => {\n // @ts-ignore\n // TODO: https://github.com/microsoft/TypeScript/issues/32693\n const propEqual = node[key] === conf.props[key];\n return propEqual;\n });\n return result;\n });\n }\n }\n return nodes;\n }\n\n /**\n * 添加新节点数据\n * @param {object[]} list 节点数据对象数组\n * @return void\n */\n public append(list: TypeTreeNodeData[]): void {\n list.forEach((item) => {\n const node = new TreeNode(this, item);\n this.children.push(node);\n });\n this.reflow();\n }\n\n /**\n * 清空当前树的数据,重新加载数据\n * @param {object[]} list 节点数据对象数组\n * @return void\n */\n public reload(list: TypeTreeNodeData[]): void {\n this.expandedMap.clear();\n this.checkedMap.clear();\n this.activedMap.clear();\n this.filterMap.clear();\n this.removeAll();\n this.append(list);\n }\n\n /**\n * 解析节点数据,适配多种节点类型\n * @param {string | TreeNode | object} para 树节点值,或者树节点,或者节点构造数据\n * @param {object | TreeNode} item 节点构造数据, 或者节点构造数据数组,或者树节点\n * @return spec 解析完成的数据结构\n * - {TreeNode} spec.node 目标树节点\n * - {object} spec.data 节点构造数据\n */\n private parseNodeData(para: TreeNodeValue | TreeNode | TypeTreeNodeData, item: TypeTreeNodeData | TreeNode) {\n let value: TreeNodeValue = '';\n let node = null;\n let data = null;\n\n if (isString(para) || isNumber(para)) {\n value = para;\n node = this.getNode(value);\n data = item;\n } else if (para instanceof TreeNode) {\n if (item) {\n node = para;\n data = item;\n } else {\n data = para;\n }\n } else {\n data = para;\n }\n const spec = {\n node,\n data,\n };\n return spec;\n }\n\n /**\n * 向指定节点追加节点或者数据\n * 以这些字段作为示例: item: 节点数据, TreeNode: 节点实例, value: 节点值(ID)\n * 支持下列使用方式\n * - appendNodes(item) 直接传递节点构造数据,新增节点\n * - appendNodes(TreeNode) 传递别的树的树节点,新增节点\n * - appendNodes(value, item) 以节点值查找指定节点,并新增节点构造数据\n * - appendNodes(value, TreeNode) 以节点值查找指定节点,并新增树节点\n * - appendNodes(TreeNode, item) 向指定节点新增节点构造数据\n * - appendNodes(TreeNode, TreeNode) 向指定节点新增树节点\n * @param {string | TreeNode | object} para 树节点值,或者树节点,或者节点构造数据\n * @param {object | TreeNode} [item] 节点构造数据, 或者节点构造数据数组,或者树节点\n * @return void\n */\n public appendNodes(para: TypeTargetNode | TypeTreeNodeData, item?: TypeTreeNodeData | TreeNode): void {\n const spec = this.parseNodeData(para, item);\n if (spec.data) {\n if (!spec.node) {\n // 在根节点插入\n if (spec.data instanceof TreeNode) {\n spec.data.appendTo(this);\n } else if (Array.isArray(spec.data)) {\n this.append(spec.data);\n } else {\n this.append([spec.data]);\n }\n } else {\n // 插入到目标节点之下\n if (spec.data instanceof TreeNode) {\n spec.data.appendTo(this, spec.node);\n } else if (isArray(spec.data)) {\n spec.node.append(spec.data);\n } else {\n spec.node.append([spec.data]);\n }\n spec.node.updateRelated();\n }\n }\n }\n\n /**\n * 在目标节点之前插入节点\n * @param {string | TreeNode} value 节点值,或者树节点\n * @param {object | TreeNode} item 节点构造数据, 或者树节点\n * @return void\n */\n public insertBefore(value: TypeTargetNode, item: TypeTreeItem): void {\n const node = this.getNode(value);\n if (node) {\n node.insertBefore(item);\n }\n }\n\n /**\n * 在目标节点之后插入节点\n * @param {string | TreeNode} value 节点值,或者树节点\n * @param {object | TreeNode} item 节点构造数据, 或者树节点\n * @return void\n */\n public insertAfter(value: TypeTargetNode, item: TypeTreeItem): void {\n const node = this.getNode(value);\n if (node) {\n node.insertAfter(item);\n }\n }\n\n /**\n * 更新树结构\n * - 清空 nodes 数组,然后遍历所有根节点重新插入 node\n * - 这个操作将会为树结构数据提供一个一纬数组索引\n * @return void\n */\n public refreshNodes(): void {\n const { children, nodes } = this;\n nodes.length = 0;\n children.forEach((node) => {\n const list = node.walk();\n Array.prototype.push.apply(nodes, list);\n });\n }\n\n /**\n * 更新所有树节点状态\n * @return void\n */\n public refreshState(): void {\n const { nodeMap } = this;\n // 树在初始化未回流时,nodes 数组为空\n // 所以遍历 nodeMap 确保初始化阶段 refreshState 方法也可以触发全部节点的更新\n nodeMap.forEach((node) => {\n node.update();\n node.updateChecked('refresh');\n });\n }\n\n /**\n * 标记节点重排\n * - 应该仅在树节点增删改查时调用\n * - 节点重排会在延时后触发 refreshNodes 方法的调用\n * @param {TreeNode} [node] 触发重排的树节点\n * @return void\n */\n public reflow(node?: TreeNode): void {\n this.shouldReflow = true;\n this.updated(node);\n }\n\n /**\n * 触发更新事件\n * - 节点属性变更时调用\n * - 统一延时后,处理需要在其他节点状态更新后再处理的逻辑,减少这类逻辑的重复调用开销\n * - 统一延时后,派发事件,通知树已更新完毕,以及回流完毕,触发 vue 视图渲染操作\n * @param {TreeNode} [node] 触发更新的树节点\n * @return void\n */\n public updated(node?: TreeNode): void {\n if (node?.value) {\n this.updatedMap.set(node.value, true);\n }\n if (this.updateTimer) return;\n this.updateTimer = setTimeout(() => {\n clearTimeout(this.updateTimer);\n this.updateTimer = null;\n\n // 检查节点是否需要回流,重排数组\n if (this.shouldReflow) {\n this.refreshNodes();\n this.emit('reflow');\n }\n\n // 检查节点是否有被过滤,锁定路径节点\n // 在此之前要遍历节点生成一个经过排序的节点数组\n // 以便于优化锁定检查算法\n this.lockFilterPathNodes();\n\n const updatedList = Array.from(this.updatedMap.keys());\n if (updatedList.length > 0) {\n // 统计需要更新状态的节点,派发更新事件\n const updatedNodes = updatedList.map((value) => this.getNode(value));\n this.emit('update', {\n nodes: updatedNodes,\n map: this.updatedMap,\n });\n } else if (this.shouldReflow) {\n // 单纯的回流不需要更新节点状态\n // 但需要触发更新事件\n // 实际业务中,这个逻辑几乎无法触发,节点操作必然引发 update\n // 这里代码仅仅用于边界兜底\n this.emit('update', {\n nodes: [],\n map: this.updatedMap,\n });\n }\n\n // 每次回流检查完毕,还原检查状态\n this.shouldReflow = false;\n this.updatedMap.clear();\n });\n }\n\n /**\n * 获取激活节点集合\n * @param {Map} [map] 预设激活节点 map, 用于受控操作时预先获取结果而不直接操作节点状态\n * @return string[] 激活节点值数组\n */\n public getActived(map?: TypeIdMap): TreeNodeValue[] {\n const activedMap = map || this.activedMap;\n return Array.from(activedMap.keys());\n }\n\n /**\n * 获取指定范围的激活节点\n * - 范围是目标节点在内所有子节点\n * @param {string | TreeNode} [item] 目标节点值,或者目标节点本身\n * @return TreeNode[] 激活节点数组\n */\n public getActivedNodes(item?: TypeTargetNode): TreeNode[] {\n let nodes = this.getNodes(item);\n nodes = nodes.filter((node) => node.isActived());\n return nodes;\n }\n\n /**\n * 替换激活态\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public replaceActived(list: TreeNodeValue[]): void {\n this.resetActived();\n this.setActived(list);\n }\n\n public replaceIndeterminate(list: TreeNodeValue[]): void {\n this.setIndeterminate(list);\n }\n\n public setIndeterminate(indeterminate: TreeNodeValue[]): void {\n indeterminate.forEach((val) => {\n this.indeterminateMap.set(val, true);\n const node = this.getNode(val);\n if (node) {\n node.setIndeterminate(true);\n node.update();\n }\n });\n }\n\n /**\n * 设置激活态\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public setActived(actived: TreeNodeValue[]): void {\n const { activeMultiple } = this.config;\n const list = actived.slice(0);\n if (!activeMultiple) {\n list.length = 1;\n }\n list.forEach((val) => {\n this.activedMap.set(val, true);\n const node = this.nodeMap.get(val);\n if (node) {\n node.update();\n }\n });\n }\n\n /**\n * 清空所有节点的激活状态\n * @return void\n */\n public resetActived(): void {\n const actived = this.getActived();\n this.activedMap.clear();\n const relatedNodes = this.getRelatedNodes(actived);\n relatedNodes.forEach((node) => {\n node.update();\n });\n }\n\n /**\n * 获取展开节点集合\n * @param {Map} [map] 预设展开节点 map, 用于受控操作时预先获取结果而不直接操作节点状态\n * @return void\n */\n public getExpanded(map?: TypeIdMap): TreeNodeValue[] {\n const expandedMap = map || this.expandedMap;\n return Array.from(expandedMap.keys());\n }\n\n /**\n * 替换展开节点\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public replaceExpanded(list: TreeNodeValue[]): void {\n const expanded = this.getExpanded();\n const added = difference(list, expanded);\n const removed = difference(expanded, list);\n this.setExpandedDirectly(removed, false);\n this.updateExpanded(removed);\n this.setExpanded(added);\n }\n\n /**\n * 批量设置展开节点\n * - 注意这个状态设置操作会忽略互斥属性\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public setExpanded(list: TreeNodeValue[]): void {\n this.setExpandedDirectly(list);\n this.updateExpanded(list);\n }\n\n /**\n * 直接设置节点展开状态\n * - 注意这个状态设置操作会忽略互斥属性\n * @param {string[]} list 目标节点值数组\n * @param {boolean} [expanded=true] 展开状态\n * @return void\n */\n public setExpandedDirectly(list: TreeNodeValue[], expanded = true): void {\n list.forEach((val) => {\n const node = this.nodeMap.get(val);\n if (!node?.isLeaf() && expanded) {\n this.expandedMap.set(val, true);\n } else {\n this.expandedMap.delete(val);\n }\n node?.afterExpanded();\n });\n }\n\n /**\n * 清除所有节点的展开状态\n * @return void\n */\n public resetExpanded(): void {\n const expanded = this.getExpanded();\n this.expandedMap.clear();\n this.updateExpanded(expanded);\n }\n\n /**\n * 更新展开节点相关节点的状态\n * - 节点展开状态变更后,上下游节点可能存在状态变更,统一纳入待更新队列\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public updateExpanded(list: TreeNodeValue[]): void {\n const relatedNodes = this.getRelatedNodes(list, {\n withParents: false,\n });\n relatedNodes.forEach((node) => {\n node.update();\n });\n }\n\n /**\n * 获取选中态节点值数组\n * @param {Map} [map] 预设选中节点 map, 用于受控操作时预先获取结果而不直接操作节点状态\n * @return string[] 选中态节点 value 数组\n */\n public getChecked(map?: TypeIdMap): TreeNodeValue[] {\n const { nodeMap, config } = this;\n const { valueMode, checkStrictly } = config;\n const list: TreeNodeValue[] = [];\n const checkedMap = map || this.checkedMap;\n nodeMap.forEach((node) => {\n // 判断未选中,直接忽略\n if (!node.isChecked(checkedMap)) return;\n const nodeKey = node.getNodeMapKey();\n if (valueMode === 'parentFirst' && !checkStrictly) {\n // valueMode 为 parentFirst\n // 仅取值父节点\n if (!node.parent || !node.parent.isChecked(checkedMap)) {\n list.push(nodeKey);\n }\n } else if (valueMode === 'onlyLeaf' && !checkStrictly) {\n // valueMode 为 onlyLeaf\n // 仅取值叶子节点\n if (node.isLeaf()) {\n list.push(nodeKey);\n }\n } else {\n // valueMode 为 all\n // 取值所有选中节点\n list.push(nodeKey);\n }\n });\n return list;\n }\n\n /**\n * 获取指定节点下的选中节点\n * @param {string | TreeNode} [item] 目标节点值,或者目标节点\n * @return TreeNode[] 选中节点数组\n */\n public getCheckedNodes(item?: TypeTargetNode): TreeNode[] {\n let nodes = this.getNodes(item);\n nodes = nodes.filter((node) => node.isChecked());\n return nodes;\n }\n\n /**\n * 替换选中态列表\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public replaceChecked(list: TreeNodeValue[]): void {\n this.resetChecked();\n this.setChecked(list);\n }\n\n /**\n * 批量设置选中态\n * @param {string[]} list 目标节点值数组\n * @return void\n */\n public setChecked(list: TreeNodeValue[]): void {\n const { checkStrictly, checkable } = this.config;\n if (!checkable) return;\n list.forEach((val: TreeNodeValue) => {\n const node = this.nodeMap.get(val);\n if (!node) return;\n if (checkStrictly) {\n this.checkedMap.set(node.getNodeMapKey(), true);\n node.updateChecked();\n } else {\n const childrenNodes = node.walk();\n childrenNodes.forEach((childNode) => {\n this.checkedMap.set(childNode.getNodeMapKey(), true);\n });\n }\n });\n if (!checkStrictly) {\n const checkedValues = this.getChecked();\n const relatedNodes = this.getRelatedNodes(checkedValues);\n relatedNodes.forEach((node) => {\n node.updateChecked();\n });\n }\n }\n\n /**\n * 清除所有节点选中态\n * @return void\n */\n public resetChecked(): void {\n const checked = this.getChecked();\n const relatedNodes = this.getRelatedNodes(checked);\n this.checkedMap.clear();\n relatedNodes.forEach((node) => {\n node.updateChecked();\n });\n }\n\n /**\n * 更新全部节点状态\n * @return void\n */\n public updateAll(): void {\n this.nodeMap.forEach((node) => {\n node.update();\n node.updateChecked('refresh');\n });\n }\n\n /**\n * 移除指定节点\n * @param {string} value 目标节点值\n * @return void\n */\n public remove(value?: TypeTargetNode): void {\n const node = this.getNode(value);\n if (node) {\n node.remove();\n }\n }\n\n /**\n * 移除所有节点\n * @return void\n */\n public removeAll(): void {\n const nodes = this.getNodes();\n nodes.forEach((node) => {\n node.remove();\n });\n }\n\n /**\n * 获取节点状态变化可能影响的关联节点\n * - 用于实现最小遍历集合\n * @param {string[]} list 目标节点值数组\n * @param {object} [options] 操作选项\n * @oaran {boolean} [options.reverse=false] 倒序排列遍历节点\n * @param {boolean} [options.withParents=true] 包含所有父节点\n * @return TreeNode[] 关联节点数组\n */\n public getRelatedNodes(list: TreeNodeValue[], options?: TypeRelatedNodesOptions): TreeNode[] {\n const conf = {\n // 默认倒序排列,从底层节点开始遍历\n reverse: false,\n // 默认遍历父节点\n withParents: true,\n ...options,\n };\n const map = new Map();\n list.forEach((value) => {\n if (map.get(value)) return;\n const node = this.nodeMap.get(value);\n if (node) {\n const parents = node.getParents().reverse();\n const children = node.walk();\n let related = [];\n if (conf.withParents) {\n related = parents.concat(children);\n } else {\n related = children;\n }\n // 用 map 实现节点去重\n related.forEach((relatedNode) => {\n map.set(relatedNode.getNodeMapKey(), relatedNode);\n });\n }\n });\n let relatedNodes = Array.from(map.values());\n if (conf.reverse) {\n relatedNodes = relatedNodes.reverse();\n }\n return relatedNodes;\n }\n\n /**\n * 触发绑定的事件\n * - store.emitter 可以绑定事件回调,用于多个组件共同监听事件\n * @param {string} name 事件名称\n * @param {Event} [state] 事件对象\n * @param {TreeNode} [state.node] 事件关联节点\n * @param {TreeNode[]} [state.nodes] 事件关联节点数组\n * @param {Map} [state.map] 事件关联节点映射\n * @param {object[]} [state.data] 事件关联节点数据\n * @return void\n */\n public emit(name: string, state?: TypeTreeEventState): void {\n const { config, emitter } = this;\n const methodName = camelCase(`on-${name}`);\n const method = config[methodName as keyof TypeTreeStoreOptions];\n if (isFunction(method)) {\n // @ts-ignore\n // TODO: 待移除\n method(state);\n }\n emitter.emit(name, state);\n }\n\n /**\n * 锁定过滤节点的路径节点\n * - 使得路径节点自动展开\n * @return void\n */\n private lockFilterPathNodes(): void {\n const { config } = this;\n const allNodes = this.getNodes();\n\n if (this.prevFilter) {\n // 过滤条件清空时,也需要清理锁定节点\n // 所在判断过滤条件是否存在之前,就要调用这里的清理逻辑\n // 不想在每次渲染时都做这个清空判断\n // 所以判断一下之前是否有进行过滤\n allNodes.forEach((node: TreeNode) => {\n // 先清空所有锁定状态\n if (node.vmIsLocked) {\n // lock 方法内部有状态计算\n // 所以要减少 lock 方法调用次数\n node.lock(false);\n }\n });\n }\n\n const currentFilter = config.filter;\n // 当前没有过滤器\n // 则无需处理锁定节点\n if (!currentFilter || !isFunction(currentFilter)) return;\n this.prevFilter = config.filter;\n\n // 全部节点要经过排序,才能使用这个遍历\n // 比起每个过滤节点调用 getParents 方法检查父节点状态\n // 复杂度 O(N*log(N)) => O(N)\n allNodes.reverse().forEach((node: TreeNode) => {\n // 数组颠倒后,等于是从每个节点的子节点开始判断\n // 想象为从展开树的最底部向上遍历\n const parent = node.getParent();\n if (!parent) return;\n if (node.vmIsRest || node.vmIsLocked) {\n // 当前节点被过滤条件命中\n // 或者当前节点被锁定\n // 则需要判定父节点状态\n if (!parent.vmIsLocked) {\n // 父节点已被锁定,则忽略动作\n // lock 方法有内置状态判断\n parent.lock(true);\n }\n }\n });\n }\n}\n\nexport default TreeStore;\n"],"names":["TreeStore","options","_classCallCheck","_defineProperty","config","_objectSpread","prefix","keys","expandAll","expandLevel","expandMutex","expandParent","activable","activeMultiple","checkable","checkStrictly","disabled","draggable","load","lazy","valueMode","filter","allowFoldNodeOnFilter","onLoad","onReflow","onUpdate","nodes","children","nodeMap","Map","privateMap","activedMap","expandedMap","checkedMap","updatedMap","indeterminateMap","filterMap","prevFilter","updateTimer","shouldReflow","hasFilter","isFunction","emitter","mitt","_createClass","key","value","setConfig","hasChanged","Object","forEach","val","refreshState","getChildren","getNode","item","node","allowDuplicateValue","isArray","pathKey","pathToKey","get","isString","isNumber","TreeNode","nodeKey","getNodeMapKey","getIndex","indexOf","getParent","parent","getParents","parents","getNodeIndex","index","getNodes","slice","walk","conf","level","Infinity","nodeModel","getModel","isPlainObject","props","result","every","propEqual","append","list","_this","push","reflow","reload","clear","removeAll","parseNodeData","para","data","spec","appendNodes","appendTo","Array","updateRelated","insertBefore","insertAfter","refreshNodes","length","prototype","apply","update","updateChecked","updated","_this2","set","setTimeout","clearTimeout","emit","lockFilterPathNodes","updatedList","from","updatedNodes","map","getActived","getActivedNodes","isActived","replaceActived","resetActived","setActived","replaceIndeterminate","setIndeterminate","indeterminate","_this3","actived","_this4","relatedNodes","getRelatedNodes","getExpanded","replaceExpanded","expanded","added","difference","removed","setExpandedDirectly","updateExpanded","setExpanded","_this5","arguments","undefined","isLeaf","delete","afterExpanded","resetExpanded","withParents","getChecked","isChecked","getCheckedNodes","replaceChecked","resetChecked","setChecked","_this6","_this$config","childrenNodes","childNode","checkedValues","checked","updateAll","remove","_this7","reverse","related","concat","relatedNode","values","name","state","methodName","camelCase","method","allNodes","vmIsLocked","lock","currentFilter","vmIsRest"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsDO,IAAMA,SAAU,gBAAA,YAAA;EAiDd,SAAAA,SAAAA,CAAYC,OAA+B,EAAA;AAAAC,IAAAA,eAAA,OAAAF,SAAA,CAAA,CAAA;IAAAG,eAAA,CAAA,IAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,QAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,aAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,aAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,eAAA,CAAA,IAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAChD,IAAMC,MAA+B,GAAAC,aAAA,CAAA;AACnCC,MAAAA,MAAQ,EAAA,GAAA;MACRC,MAAM,EAAC;AACPC,MAAAA,SAAW,EAAA,KAAA;AACXC,MAAAA,WAAa,EAAA,CAAA;AACbC,MAAAA,WAAa,EAAA,KAAA;AACbC,MAAAA,YAAc,EAAA,KAAA;AACdC,MAAAA,SAAW,EAAA,KAAA;AACXC,MAAAA,cAAgB,EAAA,KAAA;AAChBC,MAAAA,SAAW,EAAA,KAAA;AACXC,MAAAA,aAAe,EAAA,KAAA;AACfC,MAAAA,QAAU,EAAA,KAAA;AACVC,MAAAA,SAAW,EAAA,KAAA;AACXC,MAAAA,IAAM,EAAA,IAAA;AACNC,MAAAA,IAAM,EAAA,KAAA;AACNC,MAAAA,SAAW,EAAA,UAAA;AACXC,MAAAA,MAAQ,EAAA,IAAA;AAIRC,MAAAA,qBAAuB,EAAA,KAAA;AACvBC,MAAAA,MAAQ,EAAA,IAAA;AACRC,MAAAA,QAAU,EAAA,IAAA;AACVC,MAAAA,QAAU,EAAA,IAAA;AAAA,KAAA,EACPxB,OAAA,CACL,CAAA;IACA,IAAA,CAAKG,MAAS,GAAAA,MAAA,CAAA;IACd,IAAA,CAAKsB,QAAQ,EAAC,CAAA;IACd,IAAA,CAAKC,WAAW,EAAC,CAAA;AACZ,IAAA,IAAA,CAAAC,OAAA,sBAAcC,GAAI,EAAA,CAAA;AAClB,IAAA,IAAA,CAAAC,UAAA,sBAAiBD,GAAI,EAAA,CAAA;AACrB,IAAA,IAAA,CAAAE,UAAA,sBAAiBF,GAAI,EAAA,CAAA;AACrB,IAAA,IAAA,CAAAG,WAAA,sBAAkBH,GAAI,EAAA,CAAA;AACtB,IAAA,IAAA,CAAAI,UAAA,sBAAiBJ,GAAI,EAAA,CAAA;AACrB,IAAA,IAAA,CAAAK,UAAA,sBAAiBL,GAAI,EAAA,CAAA;AACrB,IAAA,IAAA,CAAAM,gBAAA,sBAAuBN,GAAI,EAAA,CAAA;AAC3B,IAAA,IAAA,CAAAO,SAAA,sBAAgBP,GAAI,EAAA,CAAA;IACzB,IAAA,CAAKQ,UAAa,GAAA,IAAA,CAAA;IAElB,IAAA,CAAKC,WAAc,GAAA,IAAA,CAAA;IAEnB,IAAA,CAAKC,YAAe,GAAA,KAAA,CAAA;IAEf,IAAA,CAAAC,SAAA,GAAYC,UAAW,CAAArC,MAAA,CAAOiB,MAAM,CAAA,CAAA;AACzC,IAAA,IAAA,CAAKqB,UAAUC,IAAK,EAAA,CAAA;AACtB,GAAA;EAAA,OAAAC,YAAA,CAAA5C,SAAA,EAAA,CAAA;IAAA6C,GAAA,EAAA,WAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAC,UAAU9C,OAA+B,EAAA;AACxC,MAAA,IAAEG,SAAW,IAAA,CAAXA;MACR,IAAI4C,UAAa,GAAA,KAAA,CAAA;MACjBC,MAAA,CAAO1C,IAAK,CAAAN,OAAO,CAAE,CAAAiD,OAAA,CAAQ,UAACL,GAAoC,EAAA;AAChE,QAAA,IAAMM,MAAMlD,OAAQ,CAAA4C,GAAA,CAAA,CAAA;AAChB,QAAA,IAAAM,GAAA,KAAQ/C,OAAOyC,GAAM,CAAA,EAAA;AACVG,UAAAA,UAAA,GAAA,IAAA,CAAA;AAGb5C,UAAAA,MAAA,CAAOyC,GAAO,CAAA,GAAAM,GAAA,CAAA;AAChB,SAAA;AACF,OAAC,CAAA,CAAA;MACI,IAAA,CAAAX,SAAA,GAAYC,UAAW,CAAArC,MAAA,CAAOiB,MAAM,CAAA,CAAA;AACzC,MAAA,IAAI2B,UAAY,EAAA;QAKd,IAAA,CAAKI,YAAa,EAAA,CAAA;AACpB,OAAA;AACF,KAAA;AAAA,GAAA,EAAA;IAAAP,GAAA,EAAA,aAAA;AAAAC,IAAAA,KAAA,EAMO,SAAAO,WAA0BA,GAAA;MAC/B,OAAO,IAAK,CAAA1B,QAAA,CAAA;AACd,KAAA;AAAA,GAAA,EAAA;IAAAkB,GAAA,EAAA,SAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAQ,QAAQC,IAAkD,EAAA;MAC/D,IAAIC,IAAO,GAAA,IAAA,CAAA;AACL,MAAA,IAAEC,mBAAoB,GAAI,IAAK,CAAArD,MAAA,CAA7BqD,mBAAoB,CAAA;AACxB,MAAA,IAAAC,OAAA,CAAQH,IAAI,CAAA,IAAKE,mBAAqB,EAAA;AAClC,QAAA,IAAAE,OAAA,GAAUC,UAAUL,IAAI,CAAA,CAAA;QACvBC,IAAA,GAAA,IAAA,CAAK5B,OAAQ,CAAAiC,GAAA,CAAIF,OAAO,CAAA,CAAA;iBACtBG,QAAS,CAAAP,IAAI,CAAK,IAAAQ,QAAA,CAASR,IAAI,CAAG,EAAA;QACpCC,IAAA,GAAA,IAAA,CAAK5B,OAAQ,CAAAiC,GAAA,CAAIN,IAAI,CAAA,CAAA;AAC9B,OAAA,MAAA,IAAWA,gBAAgBS,QAAU,EAAA;AAC7B,QAAA,IAAAC,OAAA,GAAUV,KAAKW,aAAc,EAAA,CAAA;QAC5BV,IAAA,GAAA,IAAA,CAAK5B,OAAQ,CAAAiC,GAAA,CAAII,OAAO,CAAA,CAAA;AACjC,OAAA;AACA,MAAA,IAAI,CAACT,IAAA,EAAaA,IAAA,GAAA,IAAA,CAAA;AACX,MAAA,OAAAA,IAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAX,GAAA,EAAA,UAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAqB,SAASX,IAAwB,EAAA;AAC/B,MAAA,OAAA,IAAA,CAAK9B,KAAM,CAAA0C,OAAA,CAAQZ,IAAI,CAAA,CAAA;AAChC,KAAA;AAAA,GAAA,EAAA;IAAAX,GAAA,EAAA,WAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAuB,UAAUvB,KAAiC,EAAA;MAChD,IAAIwB,MAAS,GAAA,IAAA,CAAA;AACP,MAAA,IAAAd,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQR,KAAK,CAAA,CAAA;AAC/B,MAAA,IAAIU,IAAM,EAAA;AACRc,QAAAA,MAAA,GAASd,KAAKa,SAAU,EAAA,CAAA;AAC1B,OAAA;AACO,MAAA,OAAAC,MAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAzB,GAAA,EAAA,YAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAyB,WAAWzB,KAAmC,EAAA;AAC7C,MAAA,IAAAU,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQR,KAAK,CAAA,CAAA;MAC/B,IAAI0B,UAAsB,EAAC,CAAA;AAC3B,MAAA,IAAIhB,IAAM,EAAA;AACRgB,QAAAA,OAAA,GAAUhB,KAAKe,UAAW,EAAA,CAAA;AAC5B,OAAA;AACO,MAAA,OAAAC,OAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAA3B,GAAA,EAAA,cAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA2B,aAAa3B,KAA+B,EAAA;AAC3C,MAAA,IAAAU,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQR,KAAK,CAAA,CAAA;MAC/B,IAAI4B,KAAQ,GAAA,CAAA,CAAA,CAAA;AACZ,MAAA,IAAIlB,IAAM,EAAA;AACRkB,QAAAA,KAAA,GAAQlB,KAAKW,QAAS,EAAA,CAAA;AACxB,OAAA;AACO,MAAA,OAAAO,KAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAA7B,GAAA,EAAA,UAAA;AAAAC,IAAAA,KAAA,EAuBO,SAAA6B,QAAAA,CAASpB,MAAuBtD,OAA6C,EAAA;MAClF,IAAIyB,QAAoB,EAAC,CAAA;MACzB,IAAIyB,GAAqB,GAAA,EAAA,CAAA;MACzB,IAAIW,QAAS,CAAAP,IAAI,CAAK,IAAAQ,QAAA,CAASR,IAAI,CAAG,EAAA;AAC9BJ,QAAAA,GAAA,GAAAI,IAAA,CAAA;AACR,OAAA,MAAA,IAAWA,gBAAgBS,QAAU,EAAA;QACnCb,GAAA,GAAMI,IAAK,CAAAT,KAAA,CAAA;AACb,OAAA;MACA,IAAI,CAACK,GAAK,EAAA;QACAzB,KAAA,GAAA,IAAA,CAAKA,KAAM,CAAAkD,KAAA,CAAM,CAAC,CAAA,CAAA;AAC5B,OAAO,MAAA;AACC,QAAA,IAAApB,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQH,GAAG,CAAA,CAAA;AAC7B,QAAA,IAAIK,IAAM,EAAA;AACR9B,UAAAA,KAAA,GAAQ8B,KAAKqB,IAAK,EAAA,CAAA;AACpB,SAAA;AACF,OAAA;AAEA,MAAA,IAAI5E,OAAS,EAAA;QACX,IAAM6E,IAA8B,GAAAzE,aAAA,CAAA;AAClCgB,UAAAA,MAAQ,EAAA,IAAA;AACR0D,UAAAA,KAAO,EAAAC,QAAAA;AAAA,SAAA,EACJ/E,OAAA,CACL,CAAA;AACA,QAAA,IAAI8D,SAASe,IAAK,CAAAC,KAAK,CAAK,IAAAD,IAAA,CAAKC,UAAUC,QAAU,EAAA;AACnDtD,UAAAA,KAAA,GAAQA,MAAML,MAAO,CAAA,UAACmC;mBAASA,IAAK,CAAAuB,KAAA,IAASD,KAAKC,KAAK,CAAA;WAAA,CAAA,CAAA;AACzD,SAAA;AACI,QAAA,IAAAtC,UAAA,CAAWqC,IAAK,CAAAzD,MAAM,CAAG,EAAA;AACnBK,UAAAA,KAAA,GAAAA,KAAA,CAAML,MAAO,CAAA,UAACmC,IAAS,EAAA;AACvB,YAAA,IAAAyB,SAAA,GAAYzB,KAAK0B,QAAS,EAAA,CAAA;AACzB,YAAA,OAAAJ,IAAA,CAAKzD,OAAO4D,SAAS,CAAA,CAAA;AAC9B,WAAC,CAAA,CAAA;AACH,SAAA;AACI,QAAA,IAAAE,aAAA,CAAcL,IAAK,CAAAM,KAAK,CAAG,EAAA;AACrB1D,UAAAA,KAAA,GAAAA,KAAA,CAAML,MAAO,CAAA,UAACmC,IAAS,EAAA;AACvB,YAAA,IAAA6B,MAAA,GAASpC,OAAO1C,IAAK,CAAAuE,IAAA,CAAKM,KAAK,CAAE,CAAAE,KAAA,CAAM,UAACzC,GAAQ,EAAA;AAGpD,cAAA,IAAM0C,SAAY,GAAA/B,IAAA,CAAKX,GAAS,CAAA,KAAAiC,IAAA,CAAKM,KAAM,CAAAvC,GAAA,CAAA,CAAA;AACpC,cAAA,OAAA0C,SAAA,CAAA;AACT,aAAC,CAAA,CAAA;AACM,YAAA,OAAAF,MAAA,CAAA;AACT,WAAC,CAAA,CAAA;AACH,SAAA;AACF,OAAA;AACO,MAAA,OAAA3D,KAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAmB,GAAA,EAAA,QAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA0C,OAAOC,IAAgC,EAAA;AAAA,MAAA,IAAAC,KAAA,GAAA,IAAA,CAAA;AACvCD,MAAAA,IAAA,CAAAvC,OAAA,CAAQ,UAACK,IAAS,EAAA;QACrB,IAAMC,IAAO,GAAA,IAAIQ,QAAS,CAAA0B,KAAA,EAAMnC,IAAI,CAAA,CAAA;AAC/BmC,QAAAA,KAAA,CAAA/D,QAAA,CAASgE,KAAKnC,IAAI,CAAA,CAAA;AACzB,OAAC,CAAA,CAAA;MACD,IAAA,CAAKoC,MAAO,EAAA,CAAA;AACd,KAAA;AAAA,GAAA,EAAA;IAAA/C,GAAA,EAAA,QAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA+C,OAAOJ,IAAgC,EAAA;AAC5C,MAAA,IAAA,CAAKzD,YAAY8D,KAAM,EAAA,CAAA;AACvB,MAAA,IAAA,CAAK7D,WAAW6D,KAAM,EAAA,CAAA;AACtB,MAAA,IAAA,CAAK/D,WAAW+D,KAAM,EAAA,CAAA;AACtB,MAAA,IAAA,CAAK1D,UAAU0D,KAAM,EAAA,CAAA;MACrB,IAAA,CAAKC,SAAU,EAAA,CAAA;AACf,MAAA,IAAA,CAAKP,OAAOC,IAAI,CAAA,CAAA;AAClB,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,eAAA;AAAAC,IAAAA,KAAA,EAUQ,SAAAkD,aAAAA,CAAcC,MAAmD1C,IAAmC,EAAA;MAC1G,IAAIT,KAAuB,GAAA,EAAA,CAAA;MAC3B,IAAIU,IAAO,GAAA,IAAA,CAAA;MACX,IAAI0C,IAAO,GAAA,IAAA,CAAA;MAEX,IAAIpC,QAAS,CAAAmC,IAAI,CAAK,IAAAlC,QAAA,CAASkC,IAAI,CAAG,EAAA;AAC5BnD,QAAAA,KAAA,GAAAmD,IAAA,CAAA;AACDzC,QAAAA,IAAA,GAAA,IAAA,CAAKF,QAAQR,KAAK,CAAA,CAAA;AAClBoD,QAAAA,IAAA,GAAA3C,IAAA,CAAA;AACT,OAAA,MAAA,IAAW0C,gBAAgBjC,QAAU,EAAA;AACnC,QAAA,IAAIT,IAAM,EAAA;AACDC,UAAAA,IAAA,GAAAyC,IAAA,CAAA;AACAC,UAAAA,IAAA,GAAA3C,IAAA,CAAA;AACT,SAAO,MAAA;AACE2C,UAAAA,IAAA,GAAAD,IAAA,CAAA;AACT,SAAA;AACF,OAAO,MAAA;AACEC,QAAAA,IAAA,GAAAD,IAAA,CAAA;AACT,OAAA;AACA,MAAA,IAAME,IAAO,GAAA;AACX3C,QAAAA,IAAA,EAAAA,IAAA;AACA0C,QAAAA,IAAA,EAAAA,IAAAA;OACF,CAAA;AACO,MAAA,OAAAC,IAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAtD,GAAA,EAAA,aAAA;AAAAC,IAAAA,KAAA,EAgBO,SAAAsD,WAAAA,CAAYH,MAAyC1C,IAA0C,EAAA;MACpG,IAAM4C,IAAO,GAAA,IAAA,CAAKH,aAAc,CAAAC,IAAA,EAAM1C,IAAI,CAAA,CAAA;MAC1C,IAAI4C,KAAKD,IAAM,EAAA;AACT,QAAA,IAAA,CAACC,KAAK3C,IAAM,EAAA;AAEV,UAAA,IAAA2C,IAAA,CAAKD,gBAAgBlC,QAAU,EAAA;AAC5BmC,YAAAA,IAAA,CAAAD,IAAA,CAAKG,SAAS,IAAI,CAAA,CAAA;WACd,MAAA,IAAAC,KAAA,CAAM5C,OAAQ,CAAAyC,IAAA,CAAKD,IAAI,CAAG,EAAA;AAC9B,YAAA,IAAA,CAAAV,MAAA,CAAOW,KAAKD,IAAI,CAAA,CAAA;AACvB,WAAO,MAAA;YACL,IAAA,CAAKV,MAAO,CAAA,CAACW,IAAK,CAAAD,IAAI,CAAC,CAAA,CAAA;AACzB,WAAA;AACF,SAAO,MAAA;AAED,UAAA,IAAAC,IAAA,CAAKD,gBAAgBlC,QAAU,EAAA;YACjCmC,IAAA,CAAKD,IAAK,CAAAG,QAAA,CAAS,IAAM,EAAAF,IAAA,CAAK3C,IAAI,CAAA,CAAA;WACzB,MAAA,IAAAE,OAAA,CAAQyC,IAAK,CAAAD,IAAI,CAAG,EAAA;YACxBC,IAAA,CAAA3C,IAAA,CAAKgC,MAAO,CAAAW,IAAA,CAAKD,IAAI,CAAA,CAAA;AAC5B,WAAO,MAAA;YACLC,IAAA,CAAK3C,IAAK,CAAAgC,MAAA,CAAO,CAACW,IAAA,CAAKD,IAAI,CAAC,CAAA,CAAA;AAC9B,WAAA;AACAC,UAAAA,IAAA,CAAK3C,KAAK+C,aAAc,EAAA,CAAA;AAC1B,SAAA;AACF,OAAA;AACF,KAAA;AAAA,GAAA,EAAA;IAAA1D,GAAA,EAAA,cAAA;AAAAC,IAAAA,KAAA,EAQO,SAAA0D,YAAAA,CAAa1D,OAAuBS,IAA0B,EAAA;AAC7D,MAAA,IAAAC,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQR,KAAK,CAAA,CAAA;AAC/B,MAAA,IAAIU,IAAM,EAAA;AACRA,QAAAA,IAAA,CAAKgD,aAAajD,IAAI,CAAA,CAAA;AACxB,OAAA;AACF,KAAA;AAAA,GAAA,EAAA;IAAAV,GAAA,EAAA,aAAA;AAAAC,IAAAA,KAAA,EAQO,SAAA2D,WAAAA,CAAY3D,OAAuBS,IAA0B,EAAA;AAC5D,MAAA,IAAAC,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQR,KAAK,CAAA,CAAA;AAC/B,MAAA,IAAIU,IAAM,EAAA;AACRA,QAAAA,IAAA,CAAKiD,YAAYlD,IAAI,CAAA,CAAA;AACvB,OAAA;AACF,KAAA;AAAA,GAAA,EAAA;IAAAV,GAAA,EAAA,cAAA;AAAAC,IAAAA,KAAA,EAQO,SAAA4D,YAAqBA,GAAA;AACpB,MAAA,IAAE/E,QAAU,GAAU,IAAA,CAApBA,QAAU;QAAAD,KAAA,GAAU,IAAA,CAAVA,KAAA,CAAA;MAClBA,KAAA,CAAMiF,MAAS,GAAA,CAAA,CAAA;AACNhF,MAAAA,QAAA,CAAAuB,OAAA,CAAQ,UAACM,IAAS,EAAA;AACnB,QAAA,IAAAiC,IAAA,GAAOjC,KAAKqB,IAAK,EAAA,CAAA;QACvByB,KAAA,CAAMM,SAAU,CAAAjB,IAAA,CAAKkB,KAAM,CAAAnF,KAAA,EAAO+D,IAAI,CAAA,CAAA;AACxC,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,cAAA;AAAAC,IAAAA,KAAA,EAMO,SAAAM,YAAqBA,GAAA;AACpB,MAAA,IAAExB,UAAY,IAAA,CAAZA;AAGAA,MAAAA,OAAA,CAAAsB,OAAA,CAAQ,UAACM,IAAS,EAAA;QACxBA,IAAA,CAAKsD,MAAO,EAAA,CAAA;AACZtD,QAAAA,IAAA,CAAKuD,cAAc,SAAS,CAAA,CAAA;AAC9B,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAlE,GAAA,EAAA,QAAA;AAAAC,IAAAA,KAAA,EASO,SAAA8C,OAAOpC,IAAuB,EAAA;MACnC,IAAA,CAAKjB,YAAe,GAAA,IAAA,CAAA;AACpB,MAAA,IAAA,CAAKyE,QAAQxD,IAAI,CAAA,CAAA;AACnB,KAAA;AAAA,GAAA,EAAA;IAAAX,GAAA,EAAA,SAAA;AAAAC,IAAAA,KAAA,EAUO,SAAAkE,QAAQxD,IAAuB,EAAA;AAAA,MAAA,IAAAyD,MAAA,GAAA,IAAA,CAAA;AACpC,MAAA,IAAIzD,SAAAA,IAAAA,IAAAA,mBAAAA,KAAMV,KAAO,EAAA;QACf,IAAA,CAAKZ,UAAW,CAAAgF,GAAA,CAAI1D,IAAK,CAAAV,KAAA,EAAO,IAAI,CAAA,CAAA;AACtC,OAAA;MACA,IAAI,IAAK,CAAAR,WAAA,EAAa,OAAA;AACjB,MAAA,IAAA,CAAAA,WAAA,GAAc6E,WAAW,YAAM;AAClCC,QAAAA,YAAA,CAAaH,OAAK3E,WAAW,CAAA,CAAA;QAC7B2E,MAAA,CAAK3E,WAAc,GAAA,IAAA,CAAA;QAGnB,IAAI2E,OAAK1E,YAAc,EAAA;UACrB0E,MAAA,CAAKP,YAAa,EAAA,CAAA;AAClBO,UAAAA,MAAA,CAAKI,KAAK,QAAQ,CAAA,CAAA;AACpB,SAAA;QAKAJ,MAAA,CAAKK,mBAAoB,EAAA,CAAA;AAEzB,QAAA,IAAMC,cAAcjB,KAAM,CAAAkB,IAAA,CAAKP,MAAK,CAAA/E,UAAA,CAAW3B,MAAM,CAAA,CAAA;AACjD,QAAA,IAAAgH,WAAA,CAAYZ,SAAS,CAAG,EAAA;AAEpB,UAAA,IAAAc,YAAA,GAAeF,YAAYG,GAAI,CAAA,UAAC5E;mBAAUmE,MAAK,CAAA3D,OAAA,CAAQR,KAAK,CAAC,CAAA;WAAA,CAAA,CAAA;AACnEmE,UAAAA,MAAA,CAAKI,KAAK,QAAU,EAAA;AAClB3F,YAAAA,KAAO,EAAA+F,YAAA;YACPC,KAAKT,MAAK,CAAA/E,UAAAA;AACZ,WAAC,CAAA,CAAA;AACH,SAAA,MAAA,IAAW+E,OAAK1E,YAAc,EAAA;AAK5B0E,UAAAA,MAAA,CAAKI,KAAK,QAAU,EAAA;AAClB3F,YAAAA,OAAO,EAAC;YACRgG,KAAKT,MAAK,CAAA/E,UAAAA;AACZ,WAAC,CAAA,CAAA;AACH,SAAA;QAGA+E,MAAA,CAAK1E,YAAe,GAAA,KAAA,CAAA;AACpB0E,QAAAA,MAAA,CAAK/E,WAAW4D,KAAM,EAAA,CAAA;AACxB,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAjD,GAAA,EAAA,YAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA6E,WAAWD,GAAkC,EAAA;AAC5C,MAAA,IAAA3F,UAAA,GAAa2F,OAAO,IAAK,CAAA3F,UAAA,CAAA;MAC/B,OAAOuE,KAAM,CAAAkB,IAAA,CAAKzF,UAAW,CAAAxB,IAAA,EAAM,CAAA,CAAA;AACrC,KAAA;AAAA,GAAA,EAAA;IAAAsC,GAAA,EAAA,iBAAA;AAAAC,IAAAA,KAAA,EAQO,SAAA8E,gBAAgBrE,IAAmC,EAAA;AACpD,MAAA,IAAA7B,KAAA,GAAQ,IAAK,CAAAiD,QAAA,CAASpB,IAAI,CAAA,CAAA;AAC9B7B,MAAAA,KAAA,GAAQA,MAAML,MAAO,CAAA,UAACmC,IAAS,EAAA;AAAA,QAAA,OAAAA,IAAA,CAAKqE,WAAW,CAAA;OAAA,CAAA,CAAA;AACxC,MAAA,OAAAnG,KAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAmB,GAAA,EAAA,gBAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAgF,eAAerC,IAA6B,EAAA;MACjD,IAAA,CAAKsC,YAAa,EAAA,CAAA;AAClB,MAAA,IAAA,CAAKC,WAAWvC,IAAI,CAAA,CAAA;AACtB,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,sBAAA;AAAAC,IAAAA,KAAA,EAEO,SAAAmF,qBAAqBxC,IAA6B,EAAA;AACvD,MAAA,IAAA,CAAKyC,iBAAiBzC,IAAI,CAAA,CAAA;AAC5B,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,kBAAA;AAAAC,IAAAA,KAAA,EAEO,SAAAoF,iBAAiBC,aAAsC,EAAA;AAAA,MAAA,IAAAC,MAAA,GAAA,IAAA,CAAA;AAC9CD,MAAAA,aAAA,CAAAjF,OAAA,CAAQ,UAACC,GAAQ,EAAA;QACxBiF,MAAA,CAAAjG,gBAAA,CAAiB+E,GAAI,CAAA/D,GAAA,EAAK,IAAI,CAAA,CAAA;AAC7B,QAAA,IAAAK,IAAA,GAAO4E,MAAK,CAAA9E,OAAA,CAAQH,GAAG,CAAA,CAAA;AAC7B,QAAA,IAAIK,IAAM,EAAA;AACRA,UAAAA,IAAA,CAAK0E,iBAAiB,IAAI,CAAA,CAAA;UAC1B1E,IAAA,CAAKsD,MAAO,EAAA,CAAA;AACd,SAAA;AACF,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAjE,GAAA,EAAA,YAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAkF,WAAWK,OAAgC,EAAA;AAAA,MAAA,IAAAC,MAAA,GAAA,IAAA,CAAA;AAC1C,MAAA,IAAEzH,cAAe,GAAI,IAAK,CAAAT,MAAA,CAAxBS,cAAe,CAAA;AACjB,MAAA,IAAA4E,IAAA,GAAO4C,OAAQ,CAAAzD,KAAA,CAAM,CAAC,CAAA,CAAA;MAC5B,IAAI,CAAC/D,cAAgB,EAAA;QACnB4E,IAAA,CAAKkB,MAAS,GAAA,CAAA,CAAA;AAChB,OAAA;AACKlB,MAAAA,IAAA,CAAAvC,OAAA,CAAQ,UAACC,GAAQ,EAAA;QACfmF,MAAA,CAAAvG,UAAA,CAAWmF,GAAI,CAAA/D,GAAA,EAAK,IAAI,CAAA,CAAA;QAC7B,IAAMK,IAAO,GAAA8E,MAAA,CAAK1G,OAAQ,CAAAiC,GAAA,CAAIV,GAAG,CAAA,CAAA;AACjC,QAAA,IAAIK,IAAM,EAAA;UACRA,IAAA,CAAKsD,MAAO,EAAA,CAAA;AACd,SAAA;AACF,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAjE,GAAA,EAAA,cAAA;AAAAC,IAAAA,KAAA,EAMO,SAAAiF,YAAqBA,GAAA;AACpB,MAAA,IAAAM,OAAA,GAAU,KAAKV,UAAW,EAAA,CAAA;AAChC,MAAA,IAAA,CAAK5F,WAAW+D,KAAM,EAAA,CAAA;AAChB,MAAA,IAAAyC,YAAA,GAAe,IAAK,CAAAC,eAAA,CAAgBH,OAAO,CAAA,CAAA;AACpCE,MAAAA,YAAA,CAAArF,OAAA,CAAQ,UAACM,IAAS,EAAA;QAC7BA,IAAA,CAAKsD,MAAO,EAAA,CAAA;AACd,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAjE,GAAA,EAAA,aAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA2F,YAAYf,GAAkC,EAAA;AAC7C,MAAA,IAAA1F,WAAA,GAAc0F,OAAO,IAAK,CAAA1F,WAAA,CAAA;MAChC,OAAOsE,KAAM,CAAAkB,IAAA,CAAKxF,WAAY,CAAAzB,IAAA,EAAM,CAAA,CAAA;AACtC,KAAA;AAAA,GAAA,EAAA;IAAAsC,GAAA,EAAA,iBAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA4F,gBAAgBjD,IAA6B,EAAA;AAC5C,MAAA,IAAAkD,QAAA,GAAW,KAAKF,WAAY,EAAA,CAAA;AAC5B,MAAA,IAAAG,KAAA,GAAQC,UAAW,CAAApD,IAAA,EAAMkD,QAAQ,CAAA,CAAA;AACjC,MAAA,IAAAG,OAAA,GAAUD,UAAW,CAAAF,QAAA,EAAUlD,IAAI,CAAA,CAAA;AACpC,MAAA,IAAA,CAAAsD,mBAAA,CAAoBD,SAAS,KAAK,CAAA,CAAA;AACvC,MAAA,IAAA,CAAKE,eAAeF,OAAO,CAAA,CAAA;AAC3B,MAAA,IAAA,CAAKG,YAAYL,KAAK,CAAA,CAAA;AACxB,KAAA;AAAA,GAAA,EAAA;IAAA/F,GAAA,EAAA,aAAA;AAAAC,IAAAA,KAAA,EAQO,SAAAmG,YAAYxD,IAA6B,EAAA;AAC9C,MAAA,IAAA,CAAKsD,oBAAoBtD,IAAI,CAAA,CAAA;AAC7B,MAAA,IAAA,CAAKuD,eAAevD,IAAI,CAAA,CAAA;AAC1B,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,qBAAA;AAAAC,IAAAA,KAAA,EASO,SAAAiG,mBAAAA,CAAoBtD,IAAuB,EAAuB;AAAA,MAAA,IAAAyD,MAAA,GAAA,IAAA,CAAA;AAAA,MAAA,IAAvBP,QAAA,GAAAQ,SAAA,CAAAxC,MAAA,GAAA,CAAA,IAAAwC,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAW,IAAY,CAAA;AAClE1D,MAAAA,IAAA,CAAAvC,OAAA,CAAQ,UAACC,GAAQ,EAAA;QACpB,IAAMK,IAAO,GAAA0F,MAAA,CAAKtH,OAAQ,CAAAiC,GAAA,CAAIV,GAAG,CAAA,CAAA;AACjC,QAAA,IAAI,EAACK,IAAA,KAAAA,IAAAA,IAAAA,IAAA,KAAAA,KAAAA,CAAAA,IAAAA,IAAA,CAAM6F,MAAO,EAAA,CAAKV,IAAAA,QAAU,EAAA;UAC1BO,MAAA,CAAAlH,WAAA,CAAYkF,GAAI,CAAA/D,GAAA,EAAK,IAAI,CAAA,CAAA;AAChC,SAAO,MAAA;AACA+F,UAAAA,MAAA,CAAAlH,WAAA,CAAYsH,OAAOnG,GAAG,CAAA,CAAA;AAC7B,SAAA;AACAK,QAAAA,IAAA,aAAAA,IAAA,KAAA,KAAA,CAAA,IAAAA,IAAA,CAAM+F,aAAc,EAAA,CAAA;AACtB,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAA1G,GAAA,EAAA,eAAA;AAAAC,IAAAA,KAAA,EAMO,SAAA0G,aAAsBA,GAAA;AACrB,MAAA,IAAAb,QAAA,GAAW,KAAKF,WAAY,EAAA,CAAA;AAClC,MAAA,IAAA,CAAKzG,YAAY8D,KAAM,EAAA,CAAA;AACvB,MAAA,IAAA,CAAKkD,eAAeL,QAAQ,CAAA,CAAA;AAC9B,KAAA;AAAA,GAAA,EAAA;IAAA9F,GAAA,EAAA,gBAAA;AAAAC,IAAAA,KAAA,EAQO,SAAAkG,eAAevD,IAA6B,EAAA;AAC3C,MAAA,IAAA8C,YAAA,GAAe,IAAK,CAAAC,eAAA,CAAgB/C,IAAM,EAAA;AAC9CgE,QAAAA,WAAa,EAAA,KAAA;AACf,OAAC,CAAA,CAAA;AACYlB,MAAAA,YAAA,CAAArF,OAAA,CAAQ,UAACM,IAAS,EAAA;QAC7BA,IAAA,CAAKsD,MAAO,EAAA,CAAA;AACd,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAjE,GAAA,EAAA,YAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA4G,WAAWhC,GAAkC,EAAA;AAC5C,MAAA,IAAE9F,OAAS,GAAW,IAAA,CAApBA,OAAS;QAAAxB,MAAA,GAAW,IAAA,CAAXA,MAAA,CAAA;AACX,MAAA,IAAEgB,SAAW,GAAkBhB,MAAA,CAA7BgB,SAAW;QAAAL,aAAA,GAAkBX,MAAA,CAAlBW,aAAA,CAAA;MACnB,IAAM0E,OAAwB,EAAC,CAAA;AACzB,MAAA,IAAAxD,UAAA,GAAayF,OAAO,IAAK,CAAAzF,UAAA,CAAA;AACvBL,MAAAA,OAAA,CAAAsB,OAAA,CAAQ,UAACM,IAAS,EAAA;AAEpB,QAAA,IAAA,CAACA,IAAK,CAAAmG,SAAA,CAAU1H,UAAU,CAAA,EAAG,OAAA;AAC3B,QAAA,IAAAgC,OAAA,GAAUT,KAAKU,aAAc,EAAA,CAAA;AAC/B,QAAA,IAAA9C,SAAA,KAAc,aAAiB,IAAA,CAACL,aAAe,EAAA;AAG7C,UAAA,IAAA,CAACyC,KAAKc,MAAU,IAAA,CAACd,KAAKc,MAAO,CAAAqF,SAAA,CAAU1H,UAAU,CAAG,EAAA;AACtDwD,YAAAA,IAAA,CAAKE,KAAK1B,OAAO,CAAA,CAAA;AACnB,WAAA;SACS,MAAA,IAAA7C,SAAA,KAAc,UAAc,IAAA,CAACL,aAAe,EAAA;AAGjD,UAAA,IAAAyC,IAAA,CAAK6F,QAAU,EAAA;AACjB5D,YAAAA,IAAA,CAAKE,KAAK1B,OAAO,CAAA,CAAA;AACnB,WAAA;AACF,SAAO,MAAA;AAGLwB,UAAAA,IAAA,CAAKE,KAAK1B,OAAO,CAAA,CAAA;AACnB,SAAA;AACF,OAAC,CAAA,CAAA;AACM,MAAA,OAAAwB,IAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,iBAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA8G,gBAAgBrG,IAAmC,EAAA;AACpD,MAAA,IAAA7B,KAAA,GAAQ,IAAK,CAAAiD,QAAA,CAASpB,IAAI,CAAA,CAAA;AAC9B7B,MAAAA,KAAA,GAAQA,MAAML,MAAO,CAAA,UAACmC,IAAS,EAAA;AAAA,QAAA,OAAAA,IAAA,CAAKmG,WAAW,CAAA;OAAA,CAAA,CAAA;AACxC,MAAA,OAAAjI,KAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAmB,GAAA,EAAA,gBAAA;AAAAC,IAAAA,KAAA,EAOO,SAAA+G,eAAepE,IAA6B,EAAA;MACjD,IAAA,CAAKqE,YAAa,EAAA,CAAA;AAClB,MAAA,IAAA,CAAKC,WAAWtE,IAAI,CAAA,CAAA;AACtB,KAAA;AAAA,GAAA,EAAA;IAAA5C,GAAA,EAAA,YAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAiH,WAAWtE,IAA6B,EAAA;AAAA,MAAA,IAAAuE,MAAA,GAAA,IAAA,CAAA;AAC7C,MAAA,IAAAC,YAAA,GAAqC,IAAK,CAAA7J,MAAA;QAAlCW,aAAA,GAAAkJ,YAAA,CAAAlJ,aAAA;QAAeD,SAAU,GAAAmJ,YAAA,CAAVnJ,SAAU,CAAA;MACjC,IAAI,CAACA,SAAA,EAAW,OAAA;AACX2E,MAAAA,IAAA,CAAAvC,OAAA,CAAQ,UAACC,GAAuB,EAAA;QACnC,IAAMK,IAAO,GAAAwG,MAAA,CAAKpI,OAAQ,CAAAiC,GAAA,CAAIV,GAAG,CAAA,CAAA;QACjC,IAAI,CAACK,IAAA,EAAM,OAAA;AACX,QAAA,IAAIzC,aAAe,EAAA;AACjBiJ,UAAAA,MAAA,CAAK/H,UAAW,CAAAiF,GAAA,CAAI1D,IAAK,CAAAU,aAAA,IAAiB,IAAI,CAAA,CAAA;UAC9CV,IAAA,CAAKuD,aAAc,EAAA,CAAA;AACrB,SAAO,MAAA;AACC,UAAA,IAAAmD,aAAA,GAAgB1G,KAAKqB,IAAK,EAAA,CAAA;AAClBqF,UAAAA,aAAA,CAAAhH,OAAA,CAAQ,UAACiH,SAAc,EAAA;AACnCH,YAAAA,MAAA,CAAK/H,UAAW,CAAAiF,GAAA,CAAIiD,SAAU,CAAAjG,aAAA,IAAiB,IAAI,CAAA,CAAA;AACrD,WAAC,CAAA,CAAA;AACH,SAAA;AACF,OAAC,CAAA,CAAA;MACD,IAAI,CAACnD,aAAe,EAAA;AACZ,QAAA,IAAAqJ,aAAA,GAAgB,KAAKV,UAAW,EAAA,CAAA;AAChC,QAAA,IAAAnB,YAAA,GAAe,IAAK,CAAAC,eAAA,CAAgB4B,aAAa,CAAA,CAAA;AAC1C7B,QAAAA,YAAA,CAAArF,OAAA,CAAQ,UAACM,IAAS,EAAA;UAC7BA,IAAA,CAAKuD,aAAc,EAAA,CAAA;AACrB,SAAC,CAAA,CAAA;AACH,OAAA;AACF,KAAA;AAAA,GAAA,EAAA;IAAAlE,GAAA,EAAA,cAAA;AAAAC,IAAAA,KAAA,EAMO,SAAAgH,YAAqBA,GAAA;AACpB,MAAA,IAAAO,OAAA,GAAU,KAAKX,UAAW,EAAA,CAAA;AAC1B,MAAA,IAAAnB,YAAA,GAAe,IAAK,CAAAC,eAAA,CAAgB6B,OAAO,CAAA,CAAA;AACjD,MAAA,IAAA,CAAKpI,WAAW6D,KAAM,EAAA,CAAA;AACTyC,MAAAA,YAAA,CAAArF,OAAA,CAAQ,UAACM,IAAS,EAAA;QAC7BA,IAAA,CAAKuD,aAAc,EAAA,CAAA;AACrB,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAlE,GAAA,EAAA,WAAA;AAAAC,IAAAA,KAAA,EAMO,SAAAwH,SAAkBA,GAAA;AAClB,MAAA,IAAA,CAAA1I,OAAA,CAAQsB,OAAQ,CAAA,UAACM,IAAS,EAAA;QAC7BA,IAAA,CAAKsD,MAAO,EAAA,CAAA;AACZtD,QAAAA,IAAA,CAAKuD,cAAc,SAAS,CAAA,CAAA;AAC9B,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAAlE,GAAA,EAAA,QAAA;AAAAC,IAAAA,KAAA,EAOO,SAAAyH,OAAOzH,KAA8B,EAAA;AACpC,MAAA,IAAAU,IAAA,GAAO,IAAK,CAAAF,OAAA,CAAQR,KAAK,CAAA,CAAA;AAC/B,MAAA,IAAIU,IAAM,EAAA;QACRA,IAAA,CAAK+G,MAAO,EAAA,CAAA;AACd,OAAA;AACF,KAAA;AAAA,GAAA,EAAA;IAAA1H,GAAA,EAAA,WAAA;AAAAC,IAAAA,KAAA,EAMO,SAAAiD,SAAkBA,GAAA;AACjB,MAAA,IAAArE,KAAA,GAAQ,KAAKiD,QAAS,EAAA,CAAA;AACtBjD,MAAAA,KAAA,CAAAwB,OAAA,CAAQ,UAACM,IAAS,EAAA;QACtBA,IAAA,CAAK+G,MAAO,EAAA,CAAA;AACd,OAAC,CAAA,CAAA;AACH,KAAA;AAAA,GAAA,EAAA;IAAA1H,GAAA,EAAA,iBAAA;AAAAC,IAAAA,KAAA,EAWO,SAAA0F,eAAAA,CAAgB/C,MAAuBxF,OAA+C,EAAA;AAAA,MAAA,IAAAuK,MAAA,GAAA,IAAA,CAAA;MAC3F,IAAM1F,IAAO,GAAAzE,aAAA,CAAA;AAEXoK,QAAAA,OAAS,EAAA,KAAA;AAEThB,QAAAA,WAAa,EAAA,IAAA;AAAA,OAAA,EACVxJ,OAAA,CACL,CAAA;AACM,MAAA,IAAAyH,GAAA,sBAAU7F,GAAI,EAAA,CAAA;AACf4D,MAAAA,IAAA,CAAAvC,OAAA,CAAQ,UAACJ,KAAU,EAAA;AAClB,QAAA,IAAA4E,GAAA,CAAI7D,IAAIf,KAAK,CAAA,EAAG,OAAA;QACpB,IAAMU,IAAO,GAAAgH,MAAA,CAAK5I,OAAQ,CAAAiC,GAAA,CAAIf,KAAK,CAAA,CAAA;AACnC,QAAA,IAAIU,IAAM,EAAA;UACR,IAAMgB,OAAU,GAAAhB,IAAA,CAAKe,UAAW,EAAA,CAAEkG,OAAQ,EAAA,CAAA;AACpC,UAAA,IAAA9I,QAAA,GAAW6B,KAAKqB,IAAK,EAAA,CAAA;UAC3B,IAAI6F,UAAU,EAAC,CAAA;UACf,IAAI5F,KAAK2E,WAAa,EAAA;AACViB,YAAAA,OAAA,GAAAlG,OAAA,CAAQmG,OAAOhJ,QAAQ,CAAA,CAAA;AACnC,WAAO,MAAA;AACK+I,YAAAA,OAAA,GAAA/I,QAAA,CAAA;AACZ,WAAA;AAEQ+I,UAAAA,OAAA,CAAAxH,OAAA,CAAQ,UAAC0H,WAAgB,EAAA;YAC/BlD,GAAA,CAAIR,GAAI,CAAA0D,WAAA,CAAY1G,aAAc,EAAA,EAAG0G,WAAW,CAAA,CAAA;AAClD,WAAC,CAAA,CAAA;AACH,SAAA;AACF,OAAC,CAAA,CAAA;MACD,IAAIrC,YAAe,GAAAjC,KAAA,CAAMkB,IAAK,CAAAE,GAAA,CAAImD,QAAQ,CAAA,CAAA;MAC1C,IAAI/F,KAAK2F,OAAS,EAAA;AAChBlC,QAAAA,YAAA,GAAeA,aAAakC,OAAQ,EAAA,CAAA;AACtC,OAAA;AACO,MAAA,OAAAlC,YAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAA1F,GAAA,EAAA,MAAA;AAAAC,IAAAA,KAAA,EAaO,SAAAuE,IAAAA,CAAKyD,MAAcC,KAAkC,EAAA;AACpD,MAAA,IAAE3K,MAAQ,GAAY,IAAA,CAApBA,MAAQ;QAAAsC,OAAA,GAAY,IAAA,CAAZA,OAAA,CAAA;MACV,IAAAsI,UAAA,GAAaC,SAAU,CAAA,KAAA,CAAAN,MAAA,CAAMG,IAAM,CAAA,CAAA,CAAA;AACzC,MAAA,IAAMI,SAAS9K,MAAO,CAAA4K,UAAA,CAAA,CAAA;AAClB,MAAA,IAAAvI,UAAA,CAAWyI,MAAM,CAAG,EAAA;QAGtBA,MAAA,CAAOH,KAAK,CAAA,CAAA;AACd,OAAA;AACQrI,MAAAA,OAAA,CAAA2E,IAAA,CAAKyD,MAAMC,KAAK,CAAA,CAAA;AAC1B,KAAA;AAAA,GAAA,EAAA;IAAAlI,GAAA,EAAA,qBAAA;AAAAC,IAAAA,KAAA,EAOQ,SAAAwE,mBAA4BA,GAAA;AAC5B,MAAA,IAAElH,SAAW,IAAA,CAAXA;AACF,MAAA,IAAA+K,QAAA,GAAW,KAAKxG,QAAS,EAAA,CAAA;MAE/B,IAAI,KAAKtC,UAAY,EAAA;AAKV8I,QAAAA,QAAA,CAAAjI,OAAA,CAAQ,UAACM,IAAmB,EAAA;UAEnC,IAAIA,KAAK4H,UAAY,EAAA;AAGnB5H,YAAAA,IAAA,CAAK6H,KAAK,KAAK,CAAA,CAAA;AACjB,WAAA;AACF,SAAC,CAAA,CAAA;AACH,OAAA;AAEA,MAAA,IAAMC,gBAAgBlL,MAAO,CAAAiB,MAAA,CAAA;MAG7B,IAAI,CAACiK,aAAA,IAAiB,CAAC7I,UAAA,CAAW6I,aAAa,CAAA,EAAG,OAAA;AAClD,MAAA,IAAA,CAAKjJ,aAAajC,MAAO,CAAAiB,MAAA,CAAA;MAKzB8J,QAAA,CAASV,OAAQ,EAAA,CAAEvH,OAAQ,CAAA,UAACM,IAAmB,EAAA;AAGvC,QAAA,IAAAc,MAAA,GAASd,KAAKa,SAAU,EAAA,CAAA;QAC9B,IAAI,CAACC,MAAA,EAAQ,OAAA;AACT,QAAA,IAAAd,IAAA,CAAK+H,QAAY,IAAA/H,IAAA,CAAK4H,UAAY,EAAA;AAIhC,UAAA,IAAA,CAAC9G,