react-toolkits 2.24.19 → 2.24.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +14 -0
- package/lib/chunk-3VI7KSDA.js +2 -0
- package/lib/{chunk-H5Y4DYUL.js.map → chunk-3VI7KSDA.js.map} +1 -1
- package/lib/chunk-3ZT3BOPJ.js +3 -0
- package/lib/chunk-3ZT3BOPJ.js.map +1 -0
- package/lib/{chunk-D75NVCYN.js → chunk-D5OM3OZU.js} +2 -2
- package/lib/{chunk-D75NVCYN.js.map → chunk-D5OM3OZU.js.map} +1 -1
- package/lib/chunk-F3OT6ENF.js +2 -0
- package/lib/{chunk-UPO7NB6O.js.map → chunk-F3OT6ENF.js.map} +1 -1
- package/lib/chunk-FD52RBG7.js +2 -0
- package/lib/{chunk-ZF7POJAA.js.map → chunk-FD52RBG7.js.map} +1 -1
- package/lib/{chunk-ST7VUWJ4.js → chunk-IWPBGSXS.js} +2 -2
- package/lib/{chunk-ST7VUWJ4.js.map → chunk-IWPBGSXS.js.map} +1 -1
- package/lib/chunk-S4LUEDFA.js +2 -0
- package/lib/{chunk-NNXVZIY2.js.map → chunk-S4LUEDFA.js.map} +1 -1
- package/lib/chunk-SMBHLRAO.js +2 -0
- package/lib/chunk-SMBHLRAO.js.map +1 -0
- package/lib/chunk-XX2BCZJU.js +2 -0
- package/lib/{chunk-MTRFNFEM.js.map → chunk-XX2BCZJU.js.map} +1 -1
- package/lib/{createMenuItem-SXFYDNCW.js → createMenuItem-5DDIEELO.js} +2 -2
- package/lib/{createMenuItem-SXFYDNCW.js.map → createMenuItem-5DDIEELO.js.map} +1 -1
- package/lib/index.css +1 -1
- package/lib/index.d.ts +9 -2
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/{menuItemList-NIBRDRTA.js → menuItemList-4ZLZ7HSG.js} +2 -2
- package/lib/{menuItemList-NIBRDRTA.js.map → menuItemList-4ZLZ7HSG.js.map} +1 -1
- package/lib/{roleDetail-7HEBW7IS.js → roleDetail-42BOHDFS.js} +2 -2
- package/lib/{roleDetail-7HEBW7IS.js.map → roleDetail-42BOHDFS.js.map} +1 -1
- package/lib/{roleList-WGLD3HXB.js → roleList-KWWO3IFL.js} +2 -2
- package/lib/{roleList-WGLD3HXB.js.map → roleList-KWWO3IFL.js.map} +1 -1
- package/lib/updateMenuItem-E5QMBR2S.js +2 -0
- package/lib/{updateMenuItem-TECCUD6Z.js.map → updateMenuItem-E5QMBR2S.js.map} +1 -1
- package/lib/userDetail-L7Q3C67K.js +2 -0
- package/lib/{userDetail-WGQJ7IC5.js.map → userDetail-L7Q3C67K.js.map} +1 -1
- package/lib/userList-IU4L5YRJ.js +2 -0
- package/lib/{userList-2S2FRAG6.js.map → userList-IU4L5YRJ.js.map} +1 -1
- package/locale/context.js +1 -7
- package/locale/context.js.map +1 -1
- package/locale/en_GB.js +1 -94
- package/locale/en_GB.js.map +1 -1
- package/locale/hooks.js +1 -18
- package/locale/hooks.js.map +1 -1
- package/locale/index.js +1 -2
- package/locale/ja_JP.js +1 -94
- package/locale/ja_JP.js.map +1 -1
- package/locale/ko_KR.js +1 -94
- package/locale/ko_KR.js.map +1 -1
- package/locale/zh_CN.js +1 -94
- package/locale/zh_CN.js.map +1 -1
- package/package.json +1 -1
- package/lib/chunk-7X2LW6EY.js +0 -73
- package/lib/chunk-7X2LW6EY.js.map +0 -1
- package/lib/chunk-DLTAWT6S.js +0 -2
- package/lib/chunk-DLTAWT6S.js.map +0 -1
- package/lib/chunk-E6L6VKSV.js +0 -227
- package/lib/chunk-E6L6VKSV.js.map +0 -1
- package/lib/chunk-ESCBNFWD.js +0 -498
- package/lib/chunk-ESCBNFWD.js.map +0 -1
- package/lib/chunk-FSXYUF4U.js +0 -276
- package/lib/chunk-FSXYUF4U.js.map +0 -1
- package/lib/chunk-H5Y4DYUL.js +0 -2
- package/lib/chunk-LXMQLSQY.js +0 -46
- package/lib/chunk-LXMQLSQY.js.map +0 -1
- package/lib/chunk-MTRFNFEM.js +0 -2
- package/lib/chunk-NNXVZIY2.js +0 -2
- package/lib/chunk-OH74GXG4.js +0 -570
- package/lib/chunk-OH74GXG4.js.map +0 -1
- package/lib/chunk-P25BHLH3.js +0 -3
- package/lib/chunk-P25BHLH3.js.map +0 -1
- package/lib/chunk-QACSRYJY.js +0 -147
- package/lib/chunk-QACSRYJY.js.map +0 -1
- package/lib/chunk-UPO7NB6O.js +0 -2
- package/lib/chunk-Z6PDWY44.js +0 -17
- package/lib/chunk-Z6PDWY44.js.map +0 -1
- package/lib/chunk-ZF7POJAA.js +0 -2
- package/lib/chunk-ZOHMJAAX.js +0 -120
- package/lib/chunk-ZOHMJAAX.js.map +0 -1
- package/lib/createMenuItem-CICLQWU6.js +0 -86
- package/lib/createMenuItem-CICLQWU6.js.map +0 -1
- package/lib/menuItemList-EHQSS4YZ.js +0 -132
- package/lib/menuItemList-EHQSS4YZ.js.map +0 -1
- package/lib/roleDetail-JCDOXKAM.js +0 -72
- package/lib/roleDetail-JCDOXKAM.js.map +0 -1
- package/lib/roleList-4C77ULPK.js +0 -161
- package/lib/roleList-4C77ULPK.js.map +0 -1
- package/lib/updateMenuItem-K62CKVXP.js +0 -109
- package/lib/updateMenuItem-K62CKVXP.js.map +0 -1
- package/lib/updateMenuItem-TECCUD6Z.js +0 -2
- package/lib/userDetail-WGQJ7IC5.js +0 -2
- package/lib/userDetail-WYN52ZJ2.js +0 -116
- package/lib/userDetail-WYN52ZJ2.js.map +0 -1
- package/lib/userList-2S2FRAG6.js +0 -2
- package/lib/userList-AMVG7RCE.js +0 -195
- package/lib/userList-AMVG7RCE.js.map +0 -1
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/infiniteList/stores.ts","../src/components/infiniteList/InfiniteList.tsx","../src/components/nav/stores.ts","../src/components/nav/utils.tsx","../src/components/nav/Nav.tsx","../src/components/requireGame/RequireGame.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/layout/GameSelect.tsx","../src/components/logo/Logo.tsx","../src/components/layout/LayoutHeader.tsx","../src/components/layout/Layout.tsx","../src/components/requireAuth/RequireAuth.tsx","../src/hooks/drawer/stores.ts","../src/hooks/drawer/drawer.tsx","../src/hooks/drawer/formDrawer.tsx","../src/modules/menu/index.tsx","../src/modules/permission/index.tsx","../src/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/hooks.ts","../src/pages/signIn/index.tsx"],"names":["DynamicTags","props","initialTags","addable","removable","addCallback","removeCallback","t","useTranslation","token","theme","tags","setTags","useState","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","useRef","editInputRef","useEffect","handleClose","removedTag","newTags","tag","showInput","handleInputChange","e","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","jsxs","Space","jsx","index","Input","Tag","PlusOutlined","DynamicTags_default","ExpandableParagraph","children","restProps","expanded","setExpanded","Typography","_","info","ExpandableParagraph_default","DEFAULT_PAYLOAD","createStore","create","devtools","subscribeWithSelector","set","get","id","url","queryKey","refetch","fetchNextPage","state","existingInstance","updatedInstance","newInstances","instance","payload","newPayload","isEqual","payloadChanged","currentPayload","error","store","useInfiniteListStore","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","SPIN_STYLE","identifierCounter","generateUniqueIdentifier","InternalInfiniteList","ref","internalProps","data","page","lastPage","allPages","_pageParam","pageData","identifier","code","buttonsAlign","showReset","refreshInterval","request","tableExtra","renderForm","afterSuccess","afterError","dataAdapter","initialPageParam","footer","form","tableProps","_form","Form","isValid","setIsValid","shouldPoll","action","ky","useKy","accessible","isChecking","useAuth","finalIdentifier","useMemo","subscribedPayload","s","formInstance","method","body","params","headers","cacheTime","staleTime","requestHeaders","hasNextPage","isFetchingNextPage","isFetching","useInfiniteQuery","pageParam","requestParams","requestBody","kyOptions","response","err","errorObj","failureCount","retryError","attemptIndex","dataSource","isLoadingMore","isReachingEnd","isEmpty","onConfirm","values","loadMore","onReset","useImperativeHandle","Spin","Result","renderFooter","Fragment","renderTableExtra","formRenderer","FilterFormWrapper_default","cloneElement","Table","Button","InfiniteList","forwardRef","InfiniteList_default","useNavStore","persist","keys","current","key","createJSONStorage","MemoizedLink","memo","to","Link","transformItems","items","result","i","rest","route","label","labelNode","flatItems","keypath","item","Nav","loading","location","useLocation","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","match","currentSelectedKeys","currentOpenKeys","missingKeys","k","Menu","Nav_default","Antd","RequireGame","permissionVersion","appId","isGlobal","useToolkitsStore","isLoading","useGames","Empty","RequireGame_default","UserDropdown","navigate","useNavigate","user","loginPath","clear","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","Text","GameSelect","filter","options","gameApiV2","setAppId","queryClient","useQueryClient","filteredData","selectOptions","handleChange","value","query","Select","GameSelect_default","Logo","logo_default","Logo_default","TRANSITION_EASING","LayoutHeader","title","subtitle","mainPagePath","collapsed","LayoutHeader_default","Header","Sider","Content","AntdLayout","Layout","isMenuLoading","headerExtra","gameSelectFilter","gameSelectOptions","hideGameSelect","colorBgContainer","colorBorder","navWidth","collapsible","toggleCollapsed","Divider","MenuUnfoldOutlined","MenuFoldOutlined","extra","Suspense","Layout_default","RequireAuth","config","redirectPath","RequireAuth_default","useDrawerStore","createVisibilityStore","useDrawer","content","afterOpen","afterClose","confirmText","cancelText","confirmButtonProps","cancelButtonProps","drawerProps","_id","generateId","show","hide","isOpen","cleanup","open","confirmLoading","setConfirmLoading","isRenderFunction","_show","useCallback","_hide","onClose","handleConfirm","drawerFooter","internalDrawer","Drawer","useFormDrawer","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","drawer","operation","showForm","initialValues","extraValues","MenuItemList","lazy","CreateMenuItem","UpdateMenuItem","menu_default","Routes","Route","UserList","UserDetail","RoleList","RoleDetail","permission_default","Navigate","NotFound","redirectUrl","notFound_default","Option","OperationLogList","columns","dayjs","Card","QueryList_default","operationLogList_default","withContext","clearUrlParams","param","useTicketLogin","setToken","queryParams","ticket","unregisteredFromUrl","isUnregistered","setIsUnregistered","useQuery","queryKeys","SignIn","dismissUnregistered","background_default","Alert","SSO_URL","signIn_default"],"mappings":"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","file":"index.js","sourcesContent":["import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, CSSProperties, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const { t } = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n const tagInputStyle: CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n style={tagInputStyle}\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n style={{ userSelect: 'none' }}\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n {t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import { Typography } from 'antd'\nimport type { ParagraphProps } from 'antd/es/typography/Paragraph'\nimport type { FC } from 'react'\nimport { useState } from 'react'\n\nexport type ExpandableParagraphProps = Omit<ParagraphProps, 'ellipsis' | 'className'>\n\nconst ExpandableParagraph: FC<ExpandableParagraphProps> = props => {\n const { children, ...restProps } = props\n const [expanded, setExpanded] = useState(false)\n\n return (\n <Typography.Paragraph\n {...restProps}\n className=\"mb-0\"\n ellipsis={{\n rows: 2,\n expandable: 'collapsible',\n expanded,\n onExpand: (_, info) => {\n setExpanded(info.expanded)\n },\n }}\n >\n {children}\n </Typography.Paragraph>\n )\n}\n\nexport default ExpandableParagraph\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { InfiniteListPayload } from './InfiniteList'\n\n// Infinite Query 更新函数类型\ntype InfiniteQueryRefetchFunction = () => void | Promise<unknown>\ntype InfiniteQueryFetchNextPageFunction = () => void | Promise<unknown>\n\n// InfiniteList 实例信息\ninterface InfiniteListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: InfiniteListPayload\n refetch: InfiniteQueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n// 简化的状态接口\ninterface InfiniteListState {\n // 实例管理\n instances: Map<string, InfiniteListInstance>\n\n // 核心方法\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: InfiniteQueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n ): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: InfiniteListPayload): void\n getPayload(id: string): InfiniteListPayload\n refetch(id: string, payload?: InfiniteListPayload): Promise<void>\n fetchNextPage(id: string): Promise<void>\n\n // 工具方法\n getInstance(id: string): InfiniteListInstance | undefined\n getAllInstances(): InfiniteListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<InfiniteListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch, fetchNextPage) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新函数\n if (existingInstance) {\n // 仅当引用发生变化时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch || existingInstance.fetchNextPage !== fetchNextPage) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n fetchNextPage,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: InfiniteListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n fetchNextPage,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n async fetchNextPage(id) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n // 调用 fetchNextPage 函数\n try {\n await instance.fetchNextPage()\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'infinite-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useInfiniteListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useInfiniteQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useInfiniteListStore } from './stores'\n\nexport interface InfiniteListPayload<Values = any> {\n page?: number\n filters?: Values\n}\n\nexport interface InfiniteListRequestConfig<Values = any> {\n url: string\n method?: 'GET' | 'POST'\n body?:\n | FormData\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => FormData | Record<string | number, any>)\n params?:\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => Record<string | number, any>)\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n // 缓存配置\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\nexport enum InfiniteListAction {\n Confirm,\n Reset,\n LoadMore,\n Init,\n}\n\nexport interface InfiniteListDataAdapter<Item = any, Values = any, Data = any> {\n items?: (data: Data[] | undefined, form: FormInstance<Values>) => Item[] | undefined\n hasMore?: (lastPage: Data | undefined, allPages: Data[]) => boolean\n nextPageParam?: (lastPage: Data | undefined, allPages: Data[], pageParam: any) => any\n}\n\nexport interface InfiniteListRef<Item = any, Values = any, Data = any> {\n data: Data[] | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n refetch: () => void\n fetchNextPage: () => void\n hasNextPage: boolean\n isFetchingNextPage: boolean\n}\n\nexport interface InfiniteListProps<Item, Values, Data>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选标识符,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n request: InfiniteListRequestConfig<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data[]) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: InfiniteListAction, form: FormInstance<Values>, data?: Data[]) => void\n afterError?: (error: Error, action: InfiniteListAction, form: FormInstance<Values>) => void\n dataAdapter?: InfiniteListDataAdapter<Item, Values, Data>\n initialPageParam?: any\n footer?: (data: Data[] | undefined) => ReactNode\n}\n\n// 常量定义(对齐 QueryList 行为)\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\nconst DEFAULT_STALE_TIME = 30 * 1000\n\nconst SPIN_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n}\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\nconst generateUniqueIdentifier = (): string => `infiniteList_${Date.now()}_${++identifierCounter}`\n\nconst InternalInfiniteList = <Item extends AnyObject, Values extends object | undefined = undefined, Data = any>(\n props: InfiniteListProps<Item, Values, Data>,\n ref: Ref<InfiniteListRef<Item, Values, Data>>,\n) => {\n const defaultDataAdapter: InfiniteListDataAdapter<Item, Values, Data> = {\n items: (data: Data[] | undefined) => {\n if (!data) return []\n return data.flatMap((page: any) => page?.list || page || [])\n },\n hasMore: (lastPage: Data | undefined): boolean => {\n if (!lastPage) return false\n const page = lastPage as any\n return page?.hasMore || page?.has_more || false\n },\n nextPageParam: (lastPage: Data | undefined, allPages: Data[], _pageParam: any): any => {\n const hasMore = (page: Data | undefined): boolean => {\n if (!page) return false\n const pageData = page as any\n return pageData?.hasMore || pageData?.has_more || false\n }\n return hasMore(lastPage) ? allPages.length : undefined\n },\n }\n\n const internalProps: InfiniteListProps<Item, Values, Data> & {\n refreshInterval: number\n initialPageParam: any\n } = {\n refreshInterval: 0,\n initialPageParam: 0,\n ...props,\n dataAdapter: {\n ...defaultDataAdapter,\n ...props.dataAdapter,\n },\n }\n\n const {\n identifier,\n code,\n buttonsAlign,\n showReset,\n refreshInterval,\n request,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n dataAdapter,\n initialPageParam,\n footer,\n form,\n ...tableProps\n } = internalProps\n const { t } = useTranslation()\n const [_form] = Form.useForm<Values>(form)\n const [isValid, setIsValid] = useState(false)\n const shouldPoll = useRef(false)\n const action = useRef(InfiniteListAction.Init)\n const ky = useKy()\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n // 生成或使用提供的 identifier\n const finalIdentifier = useMemo(() => identifier || generateUniqueIdentifier(), [identifier])\n\n // 订阅当前 identifier 的 payload,驱动 queryKey 与渲染\n const subscribedPayload = useInfiniteListStore(s => s.getPayload(finalIdentifier))\n\n // 获取当前表单值\n const formInstance = useMemo(() => _form, [_form])\n\n // 构建请求参数\n const {\n url,\n method = 'GET',\n body,\n params,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = request\n const requestHeaders = useMemo(\n () => (typeof headers === 'function' ? headers(formInstance) : headers),\n [headers, formInstance],\n )\n // 请求参数和 body 将在 queryFn 中动态构建,因为它们依赖于 pageParam\n\n // 构建查询键\n const queryKey = useMemo(() => {\n return ['infiniteList', url, finalIdentifier, accessible, isValid, subscribedPayload, requestHeaders]\n }, [url, finalIdentifier, accessible, isValid, subscribedPayload, requestHeaders])\n\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage, refetch, isFetching } = useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = initialPageParam }) => {\n try {\n const payload = subscribedPayload\n\n // 动态构建请求参数,包含 pageParam\n const requestParams = typeof params === 'function' ? params(payload, pageParam) : params\n const requestBody = typeof body === 'function' ? body(payload, pageParam) : body\n\n const kyOptions: KyOptions = {\n method: method as any,\n searchParams: requestParams,\n headers: requestHeaders,\n }\n\n if (requestBody) {\n if (requestBody instanceof FormData) {\n kyOptions.body = requestBody\n } else {\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, [response])\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n initialPageParam,\n getNextPageParam: (lastPage: Data, allPages: Data[]) => {\n return dataAdapter?.nextPageParam?.(lastPage, allPages, initialPageParam)\n },\n enabled: accessible && isValid,\n retry: (failureCount, retryError) => {\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n gcTime: cacheTime,\n staleTime,\n })\n\n // 在组件挂载时注册实例\n useEffect(() => {\n useInfiniteListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch, fetchNextPage)\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url, queryKey, refetch, fetchNextPage])\n\n const dataSource = dataAdapter?.items?.(data?.pages, formInstance)\n const isLoadingMore = isFetchingNextPage\n const isReachingEnd = !hasNextPage\n const isEmpty = !dataSource || dataSource.length === 0\n\n const onConfirm = async () => {\n action.current = InfiniteListAction.Confirm\n const values = await _form.getFieldsValue()\n\n try {\n await _form.validateFields()\n setIsValid(true)\n\n // 更新 store 中的 payload\n useInfiniteListStore.getState().refetch(finalIdentifier, { page: 0, filters: values })\n } catch {\n setIsValid(false)\n }\n }\n\n const loadMore = () => {\n action.current = InfiniteListAction.LoadMore\n fetchNextPage()\n }\n\n const onReset = async () => {\n action.current = InfiniteListAction.Reset\n try {\n _form.resetFields()\n const values = await _form.getFieldsValue()\n\n // 重置 store 中的 payload\n useInfiniteListStore.getState().updatePayload(finalIdentifier, { page: 0, filters: values })\n\n await _form.validateFields({ validateOnly: true })\n useInfiniteListStore.getState().refetch(finalIdentifier)\n } catch {\n // Handle validation error\n }\n }\n\n useEffect(() => {\n setTimeout(() => {\n if (accessible) {\n _form\n .validateFields({ validateOnly: true })\n .then(values => {\n setIsValid(true)\n\n // 初始化 store 中的 payload\n useInfiniteListStore.getState().updatePayload(finalIdentifier, { page: 0, filters: values })\n })\n .catch(() => {\n setIsValid(false)\n })\n }\n }, 300)\n }, [accessible, _form, finalIdentifier])\n\n useImperativeHandle(ref, () => ({\n data: data?.pages,\n dataSource,\n form: _form,\n refetch: () => useInfiniteListStore.getState().refetch(finalIdentifier),\n fetchNextPage: () => useInfiniteListStore.getState().fetchNextPage(finalIdentifier),\n hasNextPage: !!hasNextPage,\n isFetchingNextPage,\n }))\n\n if (isChecking) {\n return <Spin style={SPIN_STYLE} />\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data?.pages)}</> : undefined\n\n const renderTableExtra = () => {\n if (typeof tableExtra === 'function') {\n return tableExtra(formInstance, data?.pages)\n }\n return tableExtra\n }\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isFetching}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(_form) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={_form} />\n )\n\n return (\n <>\n {formRenderer}\n {renderTableExtra()}\n <div style={{ minHeight: '400px' }}>\n <Table {...tableProps} dataSource={dataSource} loading={isFetching} pagination={false} footer={renderFooter} />\n </div>\n {!isEmpty && (\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n )}\n </>\n )\n}\n\nconst InfiniteList = forwardRef(InternalInfiniteList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: InfiniteListProps<Item, Values, Data> & { ref?: Ref<InfiniteListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default InfiniteList\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n (set, get) => ({\n openKeys: [],\n setOpenKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (current.openKeys.length !== keys.length || !current.openKeys.every((key, index) => key === keys[index])) {\n set({ openKeys: keys })\n }\n },\n selectedKeys: [],\n setSelectedKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (\n current.selectedKeys.length !== keys.length ||\n !current.selectedKeys.every((key, index) => key === keys[index])\n ) {\n set({ selectedKeys: keys })\n }\n },\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n // 减少持久化频率,提升性能\n skipHydration: false,\n version: 1,\n },\n ),\n)\n","import type { ItemType, MenuDividerType } from 'antd/es/menu/interface'\nimport { memo } from 'react'\nimport { Link } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\n\nimport type { NavItem, NavMenuItemGroupType, NavMenuItemType, NavSubMenuType } from './types'\n\n// 优化 Link 组件,避免重复创建\nconst MemoizedLink = memo(({ to, children }: { to: string; children: React.ReactNode }) => (\n <Link to={to}>{children}</Link>\n))\n\nMemoizedLink.displayName = 'MemoizedLink'\n\n// 将自定义的菜单配置转换为 antd 的菜单配置,添加 react-router-dom Link 等。\nexport function transformItems(items?: NavItem[]) {\n const result: ItemType[] = []\n\n if (items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null || (items[i] as MenuDividerType).type === 'divider') {\n result[i] = items[i] as null | MenuDividerType\n } else if ((items[i] as NavSubMenuType | NavMenuItemGroupType).children) {\n const { children, ...rest } = items[i] as NavSubMenuType | NavMenuItemGroupType\n result[i] = {\n ...rest,\n children: transformItems(children),\n }\n } else {\n const { route, label, ...rest } = items[i] as NavMenuItemType\n const labelNode = route ? <MemoizedLink to={route}>{label}</MemoizedLink> : label\n\n result[i] = {\n ...rest,\n label: labelNode,\n }\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nexport function flatItems(\n items: NavItem[],\n result: Merge<NavMenuItemType, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n): Merge<NavMenuItemType, { keypath?: string[] }>[] {\n for (const item of items) {\n const children = (item as NavSubMenuType | NavMenuItemGroupType)?.children as NavItem[]\n\n if (Array.isArray(children)) {\n const keys =\n (item as NavMenuItemGroupType).type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, keys)\n } else if (item) {\n result.push({ ...(item as NavMenuItemType), keypath })\n }\n }\n\n return result\n}\n","import type { MenuProps } from 'antd'\nimport { Menu, Spin } from 'antd'\nimport { useEffect } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { useNavStore } from './stores'\nimport type { NavItem } from './types'\nimport { flatItems, transformItems } from './utils'\n\nexport interface NavProps {\n items?: NavItem[]\n theme?: MenuProps['theme']\n loading?: boolean\n}\n\nconst Nav = (props: NavProps) => {\n const { items = [], theme, loading } = props\n const location = useLocation()\n\n const flattenItems = flatItems(items)\n const internalItems = transformItems(items)\n\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n useEffect(() => {\n const match = flattenItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n\n // 使用 getState() 获取最新状态,避免将状态值作为 useEffect 依赖项,\n // 从而防止不必要的 Effect 执行循环\n const { selectedKeys: currentSelectedKeys, openKeys: currentOpenKeys } = useNavStore.getState()\n\n if (currentSelectedKeys[0] !== key) {\n setSelectedKeys([key])\n }\n\n // 只在 keypath 不在 openKeys 中时才添加,保留其他已展开的菜单\n const missingKeys = keypath.filter(k => !currentOpenKeys.includes(k))\n if (missingKeys.length > 0) {\n setOpenKeys([...currentOpenKeys, ...missingKeys])\n }\n }\n }, [flattenItems, location.pathname, setOpenKeys, setSelectedKeys])\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center\" style={{ height: 'calc(100vh - 64px)' }}>\n <Spin />\n </div>\n )\n }\n\n return (\n <Menu\n theme={theme}\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={setOpenKeys}\n />\n )\n}\n\nexport default Nav\n","import * as Antd from 'antd'\nimport { Empty } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Fragment } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionVersion } from '@/constants'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nconst { Spin } = Antd\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const { permissionVersion, appId, isGlobal } = useToolkitsStore(s => s)\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n if (isLoading) {\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 400,\n }}\n >\n <Spin />\n </div>\n )\n }\n\n if (permissionVersion === PermissionVersion.V1 || isGlobal) {\n return children\n }\n\n if (!appId) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n }\n\n return <Fragment key={appId}>{children}</Fragment>\n}\n\nexport default RequireGame\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC, KeyboardEvent } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nconst UserDropdown: FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { user, loginPath, clear } = useToolkitsStore()\n\n const handleSignOut = () => {\n clear()\n navigate(loginPath)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSignOut()\n }\n }\n\n const handleDropdownKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n icon: <LogoutOutlined />,\n label: (\n <a role=\"button\" tabIndex={0} onClick={handleSignOut} onKeyDown={handleKeyDown}>\n {t('UserDropdown.signOutText')}\n </a>\n ),\n },\n ]\n\n return (\n <div>\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n <a\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.preventDefault()\n }}\n onKeyDown={handleDropdownKeyDown}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserDropdown\n","import { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect, useMemo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nconst { Text } = Typography\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options } = props\n const { t } = useTranslation()\n const { gameApiV2, appId, setAppId } = useToolkitsStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n\n const filteredData = useMemo(\n () => data?.filter((item: Game) => filter?.(item as T) ?? true) as T[] | undefined,\n [data, filter],\n )\n\n const selectOptions = useMemo(\n () =>\n typeof options === 'function'\n ? options(filteredData)\n : filteredData?.map((item: T) => ({\n label: item.name,\n value: gameApiV2 ? item.game_id : item.id,\n })),\n [options, filteredData, gameApiV2],\n )\n\n // 切换游戏时清空 TanStack Query 缓存触发重新请求以更新视图。\n const handleChange = (value: string | number) => {\n // 标记除游戏列表外的所有缓存为过期,保留现有数据直到新数据加载完成\n queryClient.invalidateQueries({\n predicate: query => {\n const queryKey = query.queryKey\n return !queryKey.includes('/api/game/list') && !queryKey.includes('/api/usystem/game/all')\n },\n })\n setAppId(value)\n }\n\n useEffect(() => {\n // 数据还在加载中时,不要修改 appId\n if (isLoading) return\n\n if (selectOptions && selectOptions.length > 0) {\n const hasValidAppId = appId && selectOptions.some(item => String(item.value) === String(appId))\n\n // 只有当 appId 无效时才设置为第一个选项\n if (!hasValidAppId) {\n setAppId(selectOptions[0]?.value ?? undefined)\n }\n } else if (selectOptions === undefined || selectOptions.length === 0) {\n // 如果没有选项,则清空当前游戏 ID\n setAppId(undefined)\n }\n }, [selectOptions, isLoading])\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={appId as string | number | undefined}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n style={{ width: '250px' }}\n options={selectOptions}\n onChange={handleChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { DetailedHTMLProps, FC, ImgHTMLAttributes } from 'react'\n\nimport logoUrl from './logo.png'\n\nexport type LogoProps = Omit<DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, 'src' | 'alt'>\n\nconst Logo: FC<LogoProps> = props => {\n return <img src={logoUrl} alt=\"logo\" {...props} />\n}\n\nexport default Logo\n","import { memo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitsStore } from '../toolkitsProvider'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n}\n\nconst TRANSITION_EASING = 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)'\n\nconst LayoutHeader = memo<LayoutHeaderProps>(({ title, subtitle }) => {\n const { mainPagePath, collapsed } = useToolkitsStore()\n\n return (\n <div\n className=\"px-6 py-2 font-bold relative bg-gradient-to-r from-white to-gray-50/30\"\n style={{\n height: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n >\n <div className={`flex items-center w-full ${collapsed ? 'justify-center' : ''}`}>\n <Link\n to={mainPagePath}\n className=\"hover:opacity-80 transition-all duration-300 ease-out block rounded-lg p-1 hover:bg-white/50 hover:shadow-sm\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0.8 : 1,\n }}\n >\n <Logo\n width={36}\n style={{\n objectFit: 'contain',\n display: 'block',\n filter: 'drop-shadow(0 1px 1px rgba(0, 0, 0, 0.05))',\n transition: TRANSITION_EASING,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml-4 overflow-hidden min-w-0\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0 : 1,\n width: collapsed ? '0px' : 'auto',\n marginLeft: collapsed ? '0px' : '16px',\n transform: collapsed ? 'translateX(-8px)' : 'translateX(0)',\n }}\n >\n <Link\n to={mainPagePath}\n className=\"text-xl leading-tight hover:text-blue-600 transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block bg-gradient-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent hover:from-blue-600 hover:to-blue-500\"\n title={title}\n style={{\n letterSpacing: '0.02em',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n }}\n >\n {title}\n </Link>\n </div>\n )}\n </div>\n <div\n className=\"w-full mt-2 overflow-hidden\"\n style={{\n height: subtitle && !collapsed ? '20px' : '1px',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex items-center justify-center h-full w-full\">\n <div\n className=\"w-full border-t border-gray-200 absolute\"\n style={{\n opacity: !subtitle || collapsed ? 1 : 0,\n transition: TRANSITION_EASING,\n }}\n />\n {subtitle && (\n <div\n className=\"flex items-center w-full text-sm\"\n style={{\n opacity: collapsed ? 0 : 1,\n transform: collapsed ? 'translateY(-3px)' : 'translateY(0)',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex-1 border-t border-gray-200\"></div>\n <span className=\"px-3 text-gray-500 font-medium whitespace-nowrap\" title={subtitle}>\n {subtitle}\n </span>\n <div className=\"flex-1 border-t border-gray-200\"></div>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n})\n\nLayoutHeader.displayName = 'LayoutHeader'\n\nexport default LayoutHeader\n","import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'\nimport { Button, Divider, Layout as AntdLayout, Space, Spin, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\n\nimport type { NavItem } from '@/components/nav'\nimport { Nav } from '@/components/nav'\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { UserDropdown } from '@/components/userDropdown'\n\nimport type { GameSelectProps } from './GameSelect'\nimport GameSelect from './GameSelect'\nimport LayoutHeader from './LayoutHeader'\nimport type { Game } from './types'\n\nconst { Header, Sider, Content } = AntdLayout\n\ntype HeaderExtra = { key: Key; children: ReactNode }\n\nexport interface LayoutProps<T extends Game = Game> {\n title?: string\n subtitle?: string\n isMenuLoading?: boolean\n items?: NavItem[]\n gameSelectFilter?: GameSelectProps<T>['filter']\n gameSelectOptions?: GameSelectProps<T>['options']\n hideGameSelect?: boolean\n headerExtra?: {\n left?: HeaderExtra[]\n right?: HeaderExtra[]\n }\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const {\n isMenuLoading,\n items,\n headerExtra,\n children,\n gameSelectFilter,\n gameSelectOptions,\n title,\n subtitle,\n hideGameSelect,\n } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { navWidth, collapsible, collapsed, toggleCollapsed } = useToolkitsStore()\n\n return (\n <AntdLayout>\n <Sider\n collapsible={collapsible}\n theme=\"light\"\n trigger={null}\n collapsed={collapsed}\n width={navWidth}\n style={{\n height: '100vh',\n overflowX: 'hidden',\n overflowY: 'auto',\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }}\n >\n <LayoutHeader title={title} subtitle={subtitle} />\n <Nav items={items} loading={isMenuLoading} />\n </Sider>\n <AntdLayout>\n <Header\n style={{\n padding: '0 24px',\n background: colorBgContainer,\n }}\n >\n <div className=\"flex justify-between items-center h-full\">\n <Space size=\"small\" split={<Divider type=\"vertical\" />} className=\"mr-6\">\n {collapsible && (\n <Button\n type=\"text\"\n icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n style={{ fontSize: '16px' }}\n onClick={toggleCollapsed}\n />\n )}\n {!hideGameSelect && <GameSelect<T> filter={gameSelectFilter} options={gameSelectOptions} />}\n {headerExtra?.left?.map(extra => <span key={extra.key}>{extra.children}</span>)}\n </Space>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {headerExtra?.right?.map(extra => <span key={extra.key}>{extra.children}</span>)}\n <UserDropdown />\n </Space>\n </div>\n </Header>\n <Content\n style={{\n overflow: 'auto',\n padding: '24px 16px',\n maxHeight: 'calc(100vh - 64px)',\n }}\n >\n <Suspense\n fallback={\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '200px',\n }}\n />\n }\n >\n <RequireGame>{children}</RequireGame>\n </Suspense>\n </Content>\n </AntdLayout>\n </AntdLayout>\n )\n}\n\nexport default Layout\n","import { Button, Result, Spin } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: KyOptions\n /** 无权限时点击返回按钮跳转的路径,默认为首页 '/' */\n redirectPath?: string\n}\n\n/**\n * 授权保护组件\n * 根据权限码控制子组件的访问权限\n * - 有权限:渲染子组件\n * - 无权限:显示 403 无权限页面,可点击按钮返回指定路径\n * - 加载中:显示加载动画\n */\nconst RequireAuth: FC<PropsWithChildren<RequireAuthProps>> = props => {\n const { code, config, redirectPath = '/', children } = props\n const { data: accessible, isLoading } = useAuth(code, config)\n const { t } = useTranslation()\n const navigate = useNavigate()\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return (\n <Result\n status=\"403\"\n subTitle={t('global.noEntitlement')}\n extra={\n <Button type=\"primary\" onClick={() => navigate(redirectPath)}>\n {t('global.back')}\n </Button>\n }\n />\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireAuth\n","import { createVisibilityStore } from '@/utils'\n\nexport const useDrawerStore = createVisibilityStore()\n","import type { DrawerProps } from 'antd'\nimport { Button, Drawer } from 'antd'\nimport type { ComponentProps, ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useDrawerStore } from './stores'\n\nexport interface UseDrawerOperation {\n hide: () => void\n}\n\nexport interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {\n content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n footer?: ReactNode | null\n confirmText?: string\n cancelText?: string\n confirmButtonProps?: ComponentProps<typeof Button>\n cancelButtonProps?: ComponentProps<typeof Button>\n}\n\nexport function useDrawer(props: UseDrawerProps) {\n const {\n content,\n onConfirm,\n afterOpen,\n afterClose,\n footer,\n confirmText = '确认',\n cancelText = '取消',\n confirmButtonProps,\n cancelButtonProps,\n ...drawerProps\n } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useDrawerStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onClose: DrawerProps['onClose'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const handleConfirm = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } catch (error) {\n console.error('Drawer confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm])\n\n const drawerFooter: DrawerProps['footer'] =\n footer !== undefined ? (\n <>{footer}</>\n ) : (\n <div className=\"flex gap-4 mx-4\">\n <Button type=\"primary\" loading={confirmLoading} {...confirmButtonProps} onClick={handleConfirm}>\n {confirmText}\n </Button>\n <Button {...cancelButtonProps} onClick={onClose}>\n {cancelText}\n </Button>\n </div>\n )\n\n const internalDrawer = (\n <Drawer {...drawerProps} open={open} footer={drawerFooter} onClose={onClose}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Drawer>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n confirmLoading,\n drawer: internalDrawer,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useDrawer, type UseDrawerOperation, type UseDrawerProps } from './drawer'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormDrawerReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n drawer: ReactNode\n}\n\nexport function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormDrawerProps<Values, ExtraValues>,\n): UseFormDrawerReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...drawerProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, drawer } = useDrawer({\n ...drawerProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? <>{content(internalExtraValues, operation)}</> : <>{content}</>}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n drawer,\n }\n}\n","import { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\nexport default (\n <Routes>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </Routes>\n)\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nconst UserList = lazy(() => import('./pages/userList'))\nconst UserDetail = lazy(() => import('./pages/userDetail'))\nconst RoleList = lazy(() => import('./pages/roleList'))\nconst RoleDetail = lazy(() => import('./pages/roleDetail'))\n\nexport default (\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"user/:id\" element={<UserDetail />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n)\n","import { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\n\ninterface NotFoundProps {\n redirectUrl?: string\n}\n\nconst NotFound: FC<NotFoundProps> = props => {\n const { redirectUrl } = props\n const navigate = useNavigate()\n const { t } = useTranslation()\n\n return (\n <div className=\"text-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n redirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(redirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Form, Input, Select } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\n\nimport { ExpandableParagraph } from '@/components/expandableParagraph'\nimport { QueryList } from '@/components/queryList'\nimport { withContext } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nimport type { OperationLogListItem } from './types'\n\nconst { Option } = Select\n\nconst OperationLogList: FC = () => {\n const { t } = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n width: 200,\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n { List: OperationLogListItem[]; Total: number }\n >\n identifier=\"operation-log-list\"\n rowKey=\"id\"\n code=\"300001\"\n columns={columns}\n tableLayout=\"fixed\"\n request={{\n url: '/api/usystem/log/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.Total,\n items: data?.List,\n })}\n renderForm={form => (\n <Form form={form} layout=\"inline\">\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear style={{ width: '100px' }}>\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default withContext(OperationLogList, { isGlobal: true })\n","import { useQuery } from '@tanstack/react-query'\nimport { useEffect, useState } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\n/**\n * 清除 URL 中的查询参数\n */\nfunction clearUrlParams(params: string[]) {\n const url = new URL(window.location.href)\n params.forEach(param => url.searchParams.delete(param))\n window.history.replaceState({}, '', url.toString())\n}\n\n/**\n * 处理登录页面的票据逻辑和未注册用户提示\n */\nexport function useTicketLogin() {\n const ky = useKy()\n const { setToken } = useToolkitsStore()\n\n const queryParams = new URLSearchParams(window.location.search)\n const ticket = queryParams.get('ticket')\n const unregisteredFromUrl = queryParams.get('unregistered') === 'true'\n\n // 初始化未注册状态\n const [isUnregistered, setIsUnregistered] = useState(unregisteredFromUrl)\n\n const { data, isLoading, error } = useQuery({\n queryKey: queryKeys.auth.ticketLogin(ticket),\n queryFn: () => ky.get<{ token: string }>('/api/usystem/user/login', { searchParams: { ticket: ticket! } }),\n enabled: !!ticket,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })\n\n useEffect(() => {\n if (data?.token) {\n setToken(data.token)\n // 登录成功后清除 ticket 和 unregistered 参数\n clearUrlParams(['ticket', 'unregistered'])\n }\n }, [data, setToken])\n\n const dismissUnregistered = () => {\n setIsUnregistered(false)\n if (unregisteredFromUrl) {\n clearUrlParams(['unregistered'])\n }\n }\n\n return {\n isLoading,\n error,\n isUnregistered,\n dismissUnregistered,\n }\n}\n","import { Alert, Button, Space, Spin, Typography } from 'antd'\nimport type { FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { SSO_URL } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport backgroundUrl from './background.svg'\nimport { useTicketLogin } from './hooks'\n\ninterface SignInProps {\n extra?: ReactNode\n title?: string\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title }) => {\n const { token, mainPagePath } = useToolkitsStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n if (isLoading) {\n return (\n <div className=\"w-screen h-screen flex justify-center items-center\">\n <Spin />\n </div>\n )\n }\n\n // 如果已经有 token 但没有 ticket(直接访问登录页),直接跳转\n if (token) {\n return <Navigate replace to={mainPagePath} />\n }\n\n return (\n <div className=\"w-screen h-screen relative overflow-hidden\">\n <div className=\"absolute top-16 right-16 z-10\">{extra}</div>\n <div className=\"absolute left-14 top-6 z-10\">\n <Space align=\"center\">\n <Logo width={48} />\n {title && <span className=\"text-2xl font-bold\">{title}</span>}\n </Space>\n </div>\n <div\n className=\"w-full h-full flex justify-center items-center bg-gradient-to-br from-blue-50/30 via-indigo-50/30 to-purple-50/30\"\n style={{ paddingRight: '500px' }}\n >\n <img\n src={backgroundUrl}\n alt=\"background\"\n className=\"max-w-full h-auto object-contain\"\n style={{ width: '83.333333%', maxWidth: '100%' }}\n />\n </div>\n <div\n className=\"fixed top-0 right-0 h-screen backdrop-blur-sm shadow-2xl\"\n style={{\n width: '500px',\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n borderLeft: '1px solid rgba(229, 231, 235, 0.5)',\n }}\n >\n <div className=\"flex justify-center items-center h-full\">\n <div className=\"px-36\" style={{ marginTop: '-10rem' }}>\n <div className=\"flex flex-col justify-center\">\n <div className=\"h-10 mb-4\">\n {isUnregistered && (\n <Alert\n banner\n closable\n message={t('SignIn.unregistered')}\n type=\"error\"\n onClose={dismissUnregistered}\n />\n )}\n </div>\n <div className=\"mb-4 text-center\">\n <Typography.Title level={2}>{t('SignIn.welcome')}</Typography.Title>\n </div>\n <div className=\"flex justify-center items-center\">\n <Button\n block\n type=\"primary\"\n size=\"large\"\n shape=\"round\"\n href={`${SSO_URL}/login?service=${window.location.href}`}\n target=\"_self\"\n >\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/infiniteList/stores.ts","../src/components/infiniteList/InfiniteList.tsx","../src/components/nav/stores.ts","../src/components/nav/utils.tsx","../src/components/nav/Nav.tsx","../src/components/requireGame/RequireGame.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/layout/GameSelect.tsx","../src/components/logo/Logo.tsx","../src/components/layout/LayoutHeader.tsx","../src/components/layout/Layout.tsx","../src/components/requireAuth/RequireAuth.tsx","../src/hooks/drawer/stores.ts","../src/hooks/drawer/drawer.tsx","../src/hooks/drawer/formDrawer.tsx","../src/modules/menu/index.tsx","../src/modules/permission/index.tsx","../src/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/hooks.ts","../src/pages/signIn/index.tsx"],"names":["DynamicTags","props","initialTags","addable","removable","addCallback","removeCallback","t","useTranslation","token","theme","tags","setTags","useState","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","useRef","editInputRef","useEffect","handleClose","removedTag","newTags","tag","showInput","handleInputChange","e","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","jsxs","Space","jsx","index","Input","Tag","PlusOutlined","DynamicTags_default","ExpandableParagraph","children","restProps","expanded","setExpanded","Typography","_","info","ExpandableParagraph_default","DEFAULT_PAYLOAD","createStore","create","devtools","subscribeWithSelector","set","get","id","url","queryKey","refetch","fetchNextPage","state","existingInstance","updatedInstance","newInstances","instance","payload","newPayload","isEqual","payloadChanged","currentPayload","error","store","useInfiniteListStore","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","SPIN_STYLE","identifierCounter","generateUniqueIdentifier","InternalInfiniteList","ref","internalProps","data","page","lastPage","allPages","_pageParam","pageData","identifier","code","buttonsAlign","showReset","refreshInterval","request","tableExtra","renderForm","afterSuccess","afterError","dataAdapter","initialPageParam","footer","form","tableProps","_form","Form","isValid","setIsValid","shouldPoll","action","ky","useKy","accessible","isChecking","useAuth","finalIdentifier","useMemo","subscribedPayload","s","formInstance","method","body","params","headers","cacheTime","staleTime","requestHeaders","hasNextPage","isFetchingNextPage","isFetching","useInfiniteQuery","pageParam","requestParams","requestBody","kyOptions","response","err","errorObj","failureCount","retryError","attemptIndex","dataSource","isLoadingMore","isReachingEnd","isEmpty","onConfirm","values","loadMore","onReset","useImperativeHandle","Spin","Result","renderFooter","Fragment","renderTableExtra","formRenderer","FilterFormWrapper_default","cloneElement","Table","Button","InfiniteList","forwardRef","InfiniteList_default","useNavStore","persist","keys","current","key","createJSONStorage","MemoizedLink","memo","to","Link","transformItems","items","result","i","rest","route","label","labelNode","flatItems","keypath","item","Nav","loading","location","useLocation","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","match","currentSelectedKeys","currentOpenKeys","missingKeys","k","Menu","Nav_default","LOADING_CONTAINER_STYLE","RequireGame","permissionVersion","appId","isGlobal","requireGame","useToolkitsStore","isLoading","useGames","Empty","RequireGame_default","UserDropdown","navigate","useNavigate","user","loginPath","clear","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","Text","GameSelect","filter","options","gameApiV2","setAppId","queryClient","useQueryClient","filteredData","selectOptions","handleChange","value","query","Select","GameSelect_default","Logo","logo_default","Logo_default","TRANSITION_EASING","LayoutHeader","title","subtitle","mainPagePath","collapsed","LayoutHeader_default","Header","Sider","Content","AntdLayout","HEADER_HEIGHT","CONTENT_PADDING","HEADER_PADDING","SPINNER_HEIGHT","Layout","isMenuLoading","headerExtra","gameSelectFilter","gameSelectOptions","hideGameSelect","colorBgContainer","colorBorder","navWidth","collapsible","toggleCollapsed","showGameSelect","siderStyle","headerStyle","contentStyle","spinnerStyle","Divider","MenuUnfoldOutlined","MenuFoldOutlined","extra","Suspense","Layout_default","RequireAuth","config","redirectPath","RequireAuth_default","useDrawerStore","createVisibilityStore","useDrawer","content","afterOpen","afterClose","confirmText","cancelText","confirmButtonProps","cancelButtonProps","drawerProps","_id","generateId","show","hide","isOpen","cleanup","open","confirmLoading","setConfirmLoading","isRenderFunction","_show","useCallback","_hide","onClose","handleConfirm","drawerFooter","internalDrawer","Drawer","useFormDrawer","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","drawer","operation","showForm","initialValues","extraValues","MenuItemList","lazy","CreateMenuItem","UpdateMenuItem","menu_default","Routes","Route","UserList","UserDetail","RoleList","RoleDetail","permission_default","Navigate","NotFound","redirectUrl","notFound_default","Option","OperationLogList","columns","dayjs","Card","QueryList_default","operationLogList_default","withContext","TICKET_PARAM","LOGIN_ENDPOINT","clearUrlParams","param","useTicketLogin","setToken","ticket","unregisteredFromUrl","UNREGISTERED_FLAG","TRUE","isUnregistered","setIsUnregistered","useQuery","queryKeys","SIDEBAR_WIDTH","LOGO_SIZE","TOP_OFFSET","SignIn","dismissUnregistered","ssoLoginUrl","SSO_URL","backgroundContainerStyle","sidebarStyle","contentWrapperStyle","background_default","Alert","signIn_default"],"mappings":"2iDAkBA,IAAMA,GAAoCC,CAAAA,EAAS,CACjD,GAAM,CAAE,YAAAC,CAAAA,CAAa,OAAA,CAAAC,CAAAA,CAAS,SAAA,CAAAC,CAAAA,CAAW,WAAA,CAAAC,CAAAA,CAAa,cAAA,CAAAC,CAAe,CAAA,CAAIL,CAAAA,CACnE,CAAE,CAAA,CAAAM,CAAE,CAAA,CAAIC,GAAAA,EAAe,CACvB,CAAE,MAAAC,CAAM,CAAA,CAAIC,KAAAA,CAAM,QAAA,EAAS,CAC3B,CAACC,CAAAA,CAAMC,CAAO,EAAIC,QAAAA,CAAmB,EAAE,CAAA,CACvC,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAIF,QAAAA,CAAS,KAAK,CAAA,CAChD,CAACG,CAAAA,CAAYC,CAAa,CAAA,CAAIJ,QAAAA,CAAS,EAAE,CAAA,CACzC,CAACK,CAAAA,CAAgBC,CAAiB,CAAA,CAAIN,QAAAA,CAAS,EAAE,CAAA,CACjD,CAACO,CAAAA,CAAgBC,CAAiB,EAAIR,QAAAA,CAAiB,EAAE,CAAA,CACzDS,CAAAA,CAAWC,MAAAA,CAAiB,IAAI,CAAA,CAChCC,CAAAA,CAAeD,OAAiB,IAAI,CAAA,CAE1CE,SAAAA,CAAU,IAAM,CACdb,CAAAA,CAAQV,CAAAA,EAAe,EAAE,EAC3B,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAEhBuB,SAAAA,CAAU,IAAM,CACVX,GACFQ,CAAAA,CAAS,OAAA,EAAS,KAAA,GAEtB,EAAG,CAACR,CAAY,CAAC,CAAA,CAEjBW,UAAU,IAAM,CACdD,CAAAA,CAAa,OAAA,EAAS,KAAA,GACxB,CAAA,CAAG,CAACR,CAAU,CAAC,CAAA,CAEf,IAAMU,CAAAA,CAAc,MAAOC,CAAAA,EAAuB,CAGhD,GAFgB,MAAMrB,IAAiBqB,CAAU,CAAA,CAEpC,CACX,IAAMC,CAAAA,CAAUjB,CAAAA,CAAK,MAAA,CAAOkB,CAAAA,EAAOA,IAAQF,CAAU,CAAA,CACrDf,CAAAA,CAAQgB,CAAO,EACjB,CACF,CAAA,CAEME,CAAAA,CAAY,IAAM,CACtBf,CAAAA,CAAgB,IAAI,EACtB,CAAA,CAEMgB,CAAAA,CAAqBC,CAAAA,EAAqC,CAC9Df,EAAce,CAAAA,CAAE,MAAA,CAAO,KAAK,EAC9B,EAEMC,CAAAA,CAAqB,SAAY,CACjCjB,CAAAA,EAAcL,EAAK,OAAA,CAAQK,CAAU,CAAA,GAAM,EAAA,EAC7B,MAAMX,CAAAA,GAAcW,CAAU,CAAA,EAG5CJ,EAAQ,CAAC,GAAGD,CAAAA,CAAMK,CAAU,CAAC,CAAA,CAIjCD,CAAAA,CAAgB,KAAK,CAAA,CACrBE,EAAc,EAAE,EAClB,CAAA,CAEMiB,CAAAA,CAAyBF,CAAAA,EAAqC,CAClEX,CAAAA,CAAkBW,CAAAA,CAAE,OAAO,KAAK,EAClC,CAAA,CAEMG,CAAAA,CAAyB,IAAM,CACnC,IAAMP,CAAAA,CAAU,CAAC,GAAGjB,CAAI,CAAA,CACxBiB,CAAAA,CAAQV,CAAc,CAAA,CAAIE,CAAAA,CAC1BR,CAAAA,CAAQgB,CAAO,EACfT,CAAAA,CAAkB,EAAE,CAAA,CACpBF,CAAAA,CAAc,EAAE,EAClB,CAAA,CAEMmB,CAAAA,CAA+B,CACnC,MAAO,EAAA,CACP,aAAA,CAAe,KACjB,CAAA,CAEMC,EAAAA,CAA8B,CAClC,UAAA,CAAY5B,CAAAA,CAAM,iBAClB,WAAA,CAAa,QACf,CAAA,CAEA,OACE6B,KAACC,KAAAA,CAAA,CAAM,IAAA,CAAI,IAAA,CAAC,KAAM,CAAC,CAAA,CAAG,CAAC,CAAA,CACrB,QAAA,CAAA,CAAAC,GAAAA,CAACD,KAAAA,CAAA,CAAM,KAAI,IAAA,CAAC,IAAA,CAAM,CAAC,CAAA,CAAG,CAAC,CAAA,CACpB,QAAA,CAAA5B,CAAAA,CAAK,GAAA,CAAI,CAACkB,CAAAA,CAAKY,CAAAA,GACVvB,CAAAA,GAAmBuB,CAAAA,CAEnBD,GAAAA,CAACE,KAAAA,CAAA,CACC,GAAA,CAAKlB,EAEL,IAAA,CAAK,OAAA,CACL,KAAA,CAAOY,CAAAA,CACP,MAAOhB,CAAAA,CACP,QAAA,CAAUc,CAAAA,CACV,MAAA,CAAQC,EACR,YAAA,CAAcA,CAAAA,CAAAA,CANTN,CAOP,CAAA,CAKFW,GAAAA,CAACG,GAAAA,CAAA,CAEC,QAAA,CAAUvC,EACV,KAAA,CAAO,CAAE,UAAA,CAAY,MAAO,CAAA,CAC5B,OAAA,CAAS,MAAM4B,CAAAA,EAAK,CAClBA,CAAAA,CAAE,cAAA,EAAe,CACjB,MAAMN,CAAAA,CAAYG,CAAG,EACvB,CAAA,CAEA,SAAAW,GAAAA,CAAC,MAAA,CAAA,CACC,aAAA,CAAeR,CAAAA,EAAK,CACdS,CAAAA,GAAU,CAAA,GACZtB,CAAAA,CAAkBsB,CAAK,EACvBpB,CAAAA,CAAkBQ,CAAG,CAAA,CACrBG,CAAAA,CAAE,cAAA,EAAe,EAErB,CAAA,CAEC,QAAA,CAAAH,EACH,CAAA,CAAA,CAlBKA,CAmBP,CAEH,CAAA,CACH,EACC1B,CAAAA,GACEW,CAAAA,CACC0B,GAAAA,CAACE,KAAAA,CAAA,CACC,GAAA,CAAKpB,CAAAA,CACL,IAAA,CAAK,MAAA,CACL,IAAA,CAAK,OAAA,CACL,KAAA,CAAOc,CAAAA,CACP,MAAOpB,CAAAA,CACP,QAAA,CAAUe,CAAAA,CACV,MAAA,CAAQE,EACR,YAAA,CAAcA,CAAAA,CAChB,CAAA,CAEAK,IAAAA,CAACK,IAAA,CAAI,KAAA,CAAON,EAAAA,CAAc,OAAA,CAASP,CAAAA,CACjC,QAAA,CAAA,CAAAU,GAAAA,CAACI,YAAAA,CAAA,EAAa,CAAA,CAAE,MAAA,CACTrC,CAAAA,CAAE,YAAY,GACvB,CAAA,CAAA,CAAA,CAEN,CAEJ,CAAA,CAEOsC,EAAAA,CAAQ7C,GC3Jf,IAAM8C,EAAAA,CAAoD7C,GAAS,CACjE,GAAM,CAAE,QAAA,CAAA8C,EAAU,GAAGC,CAAU,CAAA,CAAI/C,CAAAA,CAC7B,CAACgD,CAAAA,CAAUC,CAAW,CAAA,CAAIrC,SAAS,KAAK,CAAA,CAE9C,OACE2B,GAAAA,CAACW,WAAW,SAAA,CAAX,CACE,GAAGH,CAAAA,CACJ,UAAU,MAAA,CACV,QAAA,CAAU,CACR,IAAA,CAAM,CAAA,CACN,UAAA,CAAY,aAAA,CACZ,QAAA,CAAAC,EACA,QAAA,CAAU,CAACG,CAAAA,CAAGC,CAAAA,GAAS,CACrBH,CAAAA,CAAYG,CAAAA,CAAK,QAAQ,EAC3B,CACF,CAAA,CAEC,QAAA,CAAAN,CAAAA,CACH,CAEJ,CAAA,CAEOO,EAAAA,CAAQR,GCgBf,IAAMS,EAAAA,CAAuC,MAAA,CAAO,OAAO,CACzD,IAAA,CAAM,CAAA,CAEN,OAAA,CAAS,MAAA,CAAO,MAAA,CAAO,EAAE,CAC3B,CAAC,CAAA,CAGKC,EAAAA,CAAc,IAClBC,QAA0B,CACxBC,QAAAA,CACEC,qBAAAA,CAAsB,CAACC,EAAKC,CAAAA,IAAS,CACnC,SAAA,CAAW,IAAI,GAAA,CAEf,gBAAA,CAAiBC,CAAAA,CAAIC,CAAAA,CAAKC,EAAUC,CAAAA,CAASC,CAAAA,CAAe,CAC1DN,CAAAA,CAAIO,GAAS,CACX,IAAMC,CAAAA,CAAmBD,CAAAA,CAAM,UAAU,GAAA,CAAIL,CAAE,CAAA,CAG/C,GAAIM,CAAAA,CAAkB,CAEpB,GAAIA,CAAAA,CAAiB,UAAYH,CAAAA,EAAWG,CAAAA,CAAiB,aAAA,GAAkBF,CAAAA,CAAe,CAC5F,IAAMG,CAAAA,CAAkB,CACtB,GAAGD,EACH,OAAA,CAAAH,CAAAA,CACA,aAAA,CAAAC,CACF,CAAA,CACMI,CAAAA,CAAe,IAAI,GAAA,CAAIH,EAAM,SAAS,CAAA,CAC5C,OAAAG,CAAAA,CAAa,IAAIR,CAAAA,CAAIO,CAAe,CAAA,CAC7B,CAAE,UAAWC,CAAa,CACnC,CACA,OAAOH,CACT,CAGA,IAAMI,CAAAA,CAAiC,CACrC,EAAA,CAAAT,CAAAA,CACA,GAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,OAAA,CAAST,EAAAA,CACT,OAAA,CAAAU,EACA,aAAA,CAAAC,CACF,CAAA,CAEMI,CAAAA,CAAe,IAAI,GAAA,CAAIH,CAAAA,CAAM,SAAS,EAC5C,OAAAG,CAAAA,CAAa,GAAA,CAAIR,CAAAA,CAAIS,CAAQ,CAAA,CAEtB,CAAE,SAAA,CAAWD,CAAa,CACnC,CAAC,EACH,CAAA,CAEA,kBAAA,CAAmBR,CAAAA,CAAI,CACrBF,CAAAA,CAAIO,GAAS,CACX,IAAMG,CAAAA,CAAe,IAAI,IAAIH,CAAAA,CAAM,SAAS,CAAA,CAG5C,OAFgBG,EAAa,MAAA,CAAOR,CAAE,CAAA,CAG7B,CAAE,SAAA,CAAWQ,CAAa,CAAA,CAE5BH,CACT,CAAC,EACH,CAAA,CAEA,aAAA,CAAcL,CAAAA,CAAIU,EAAS,CACzBZ,CAAAA,CAAIO,CAAAA,EAAS,CACX,IAAMI,CAAAA,CAAWJ,CAAAA,CAAM,SAAA,CAAU,GAAA,CAAIL,CAAE,CAAA,CACvC,GAAI,CAACS,EAAU,OAAOJ,CAAAA,CAEtB,IAAMM,CAAAA,CAAa,CAAE,GAAGF,CAAAA,CAAS,OAAA,CAAS,GAAGC,CAAQ,CAAA,CAGrD,GAAI,CAACE,OAAAA,CAAQH,CAAAA,CAAS,OAAA,CAASE,CAAU,CAAA,CAAG,CAC1C,IAAMJ,CAAAA,CAAkB,CACtB,GAAGE,EACH,OAAA,CAASE,CACX,CAAA,CAEMH,CAAAA,CAAe,IAAI,GAAA,CAAIH,CAAAA,CAAM,SAAS,CAAA,CAC5C,OAAAG,CAAAA,CAAa,GAAA,CAAIR,CAAAA,CAAIO,CAAe,CAAA,CAE7B,CAAE,SAAA,CAAWC,CAAa,CACnC,CAEA,OAAOH,CACT,CAAC,EACH,CAAA,CAEA,UAAA,CAAWL,CAAAA,CAAI,CAEb,OADiBD,CAAAA,EAAI,CAAE,SAAA,CAAU,IAAIC,CAAE,CAAA,EACtB,OAAA,EAAWP,EAC9B,EAEA,MAAM,OAAA,CAAQO,CAAAA,CAAIU,CAAAA,CAAS,CACzB,IAAMD,CAAAA,CAAWV,CAAAA,EAAI,CAAE,SAAA,CAAU,GAAA,CAAIC,CAAE,CAAA,CACvC,GAAI,CAACS,CAAAA,CAAU,CACb,OAAA,CAAQ,KAAK,CAAA,+BAAA,EAAkCT,CAAE,CAAA,WAAA,CAAa,CAAA,CAC9D,MACF,CAEA,IAAIa,CAAAA,CAAiB,KAAA,CAGrB,GAAIH,CAAAA,CAAS,CACX,IAAMI,EAAiBL,CAAAA,CAAS,OAAA,CAC1BE,CAAAA,CAAa,CAAE,GAAGG,CAAAA,CAAgB,GAAGJ,CAAQ,CAAA,CAG9CE,QAAQE,CAAAA,CAAgBH,CAAU,CAAA,GACrCZ,CAAAA,EAAI,CAAE,aAAA,CAAcC,CAAAA,CAAIU,CAAO,EAC/BG,CAAAA,CAAiB,IAAA,EAErB,CAGA,GAAI,CAAAA,CAAAA,CAKJ,GAAI,CACF,MAAMJ,EAAS,OAAA,GACjB,CAAA,MAASM,CAAAA,CAAO,CACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yCAAA,EAA4Cf,CAAE,CAAA,EAAA,CAAA,CAAMe,CAAK,CAAA,CACjEA,CACR,CACF,CAAA,CAEA,MAAM,aAAA,CAAcf,CAAAA,CAAI,CACtB,IAAMS,CAAAA,CAAWV,CAAAA,EAAI,CAAE,SAAA,CAAU,GAAA,CAAIC,CAAE,CAAA,CACvC,GAAI,CAACS,CAAAA,CAAU,CACb,OAAA,CAAQ,KAAK,CAAA,+BAAA,EAAkCT,CAAE,CAAA,WAAA,CAAa,CAAA,CAC9D,MACF,CAGA,GAAI,CACF,MAAMS,CAAAA,CAAS,aAAA,GACjB,CAAA,MAASM,EAAO,CACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qDAAA,EAAwDf,CAAE,CAAA,EAAA,CAAA,CAAMe,CAAK,CAAA,CAC7EA,CACR,CACF,CAAA,CAEA,WAAA,CAAYf,CAAAA,CAAI,CACd,OAAOD,CAAAA,EAAI,CAAE,SAAA,CAAU,IAAIC,CAAE,CAC/B,CAAA,CAEA,eAAA,EAAkB,CAChB,OAAO,KAAA,CAAM,IAAA,CAAKD,CAAAA,GAAM,SAAA,CAAU,MAAA,EAAQ,CAC5C,CACF,CAAA,CAAE,CAAA,CACF,CACE,KAAM,qBACR,CACF,CACF,CAAA,CAGIiB,GAAQtB,EAAAA,EAAY,CAEbuB,CAAAA,CAAuBD,GC5HpC,IAAME,GAAqB,GAAA,CAAS,GAAA,CAC9BC,EAAAA,CAAqB,EAAA,CAAK,IAE1BC,EAAAA,CAAkC,CACtC,OAAA,CAAS,MAAA,CACT,eAAgB,QAAA,CAChB,UAAA,CAAY,QAAA,CACZ,MAAA,CAAQ,GACV,CAAA,CAGIC,EAAAA,CAAoB,CAAA,CAClBC,GAA2B,IAAc,CAAA,aAAA,EAAgB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,EAAED,EAAiB,GAE1FE,EAAAA,CAAuB,CAC3BpF,CAAAA,CACAqF,CAAAA,GACG,CAqBH,IAAMC,CAAAA,CAGF,CACF,gBAAiB,CAAA,CACjB,gBAAA,CAAkB,CAAA,CAClB,GAAGtF,EACH,WAAA,CAAa,CACX,GA5BoE,CACtE,MAAQuF,CAAAA,EACDA,CAAAA,CACEA,CAAAA,CAAK,OAAA,CAASC,CAAAA,EAAcA,CAAAA,EAAM,IAAA,EAAQA,CAAAA,EAAQ,EAAE,CAAA,CADzC,EAAC,CAGrB,QAAUC,CAAAA,EAAwC,CAChD,GAAI,CAACA,EAAU,OAAO,MAAA,CACtB,IAAMD,CAAAA,CAAOC,CAAAA,CACb,OAAOD,CAAAA,EAAM,OAAA,EAAWA,GAAM,QAAA,EAAY,KAC5C,CAAA,CACA,aAAA,CAAe,CAACC,CAAAA,CAA4BC,CAAAA,CAAkBC,CAAAA,GAAAA,CAC3CH,CAAAA,EAAoC,CACnD,GAAI,CAACA,CAAAA,CAAM,OAAO,MAAA,CAClB,IAAMI,CAAAA,CAAWJ,CAAAA,CACjB,OAAOI,CAAAA,EAAU,OAAA,EAAWA,CAAAA,EAAU,QAAA,EAAY,KACpD,CAAA,EACeH,CAAQ,CAAA,CAAIC,CAAAA,CAAS,OAAS,MAEjD,CAAA,CAWI,GAAG1F,CAAAA,CAAM,WACX,CACF,CAAA,CAEM,CACJ,WAAA6F,GAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,EACA,SAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,QAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,EACA,WAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,OAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CAAIrB,CAAAA,CACE,CAAE,CAAA,CAAAhF,CAAE,CAAA,CAAIC,GAAAA,EAAe,CACvB,CAACqG,CAAK,CAAA,CAAIC,IAAAA,CAAK,OAAA,CAAgBH,CAAI,CAAA,CACnC,CAACI,CAAAA,CAASC,CAAU,EAAInG,QAAAA,CAAS,KAAK,CAAA,CACtCoG,CAAAA,CAAa1F,MAAAA,CAAO,KAAK,CAAA,CACzB2F,CAAAA,CAAS3F,OAAO,CAAuB,CAAA,CACvC4F,CAAAA,CAAKC,CAAAA,GAEL,CAAE,IAAA,CAAMC,CAAAA,CAAY,SAAA,CAAWC,EAAW,CAAA,CAAIC,GAAAA,CAAQxB,CAAI,CAAA,CAG1DyB,CAAAA,CAAkBC,OAAAA,CAAQ,IAAM3B,GAAAA,EAAcV,IAAyB,CAAG,CAACU,GAAU,CAAC,EAGtF4B,CAAAA,CAAoB3C,CAAAA,CAAqB4C,CAAAA,EAAKA,CAAAA,CAAE,WAAWH,CAAe,CAAC,CAAA,CAG3EI,CAAAA,CAAeH,OAAAA,CAAQ,IAAMZ,CAAAA,CAAO,CAACA,CAAK,CAAC,CAAA,CAG3C,CACJ,GAAA,CAAA9C,EACA,MAAA,CAAA8D,EAAAA,CAAS,KAAA,CACT,IAAA,CAAAC,GACA,MAAA,CAAAC,EAAAA,CACA,OAAA,CAAAC,EAAAA,CACA,SAAA,CAAAC,EAAAA,CAAYjD,EAAAA,CACZ,SAAA,CAAAkD,GAAYjD,EACd,CAAA,CAAIkB,CAAAA,CACEgC,EAAAA,CAAiBV,QACrB,IAAO,OAAOO,EAAAA,EAAY,UAAA,CAAaA,GAAQJ,CAAY,CAAA,CAAII,EAAAA,CAC/D,CAACA,EAAAA,CAASJ,CAAY,CACxB,CAAA,CAIM5D,GAAWyD,OAAAA,CAAQ,IAChB,CAAC,cAAA,CAAgB1D,EAAKyD,CAAAA,CAAiBH,CAAAA,CAAYN,CAAAA,CAASW,CAAAA,CAAmBS,EAAc,CAAA,CACnG,CAACpE,CAAAA,CAAKyD,CAAAA,CAAiBH,CAAAA,CAAYN,CAAAA,CAASW,CAAAA,CAAmBS,EAAc,CAAC,CAAA,CAE3E,CAAE,IAAA,CAAA3C,EAAAA,CAAM,cAAAtB,EAAAA,CAAe,WAAA,CAAAkE,EAAAA,CAAa,kBAAA,CAAAC,GAAoB,OAAA,CAAApE,EAAAA,CAAS,UAAA,CAAAqE,EAAW,CAAA,CAAIC,gBAAAA,CAAiB,CACrG,QAAA,CAAAvE,GACA,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAwE,EAAY/B,CAAiB,CAAA,GAAM,CACnD,GAAI,CACF,IAAMjC,CAAAA,CAAUkD,CAAAA,CAGVe,CAAAA,CAAgB,OAAOV,EAAAA,EAAW,UAAA,CAAaA,EAAAA,CAAOvD,EAASgE,CAAS,CAAA,CAAIT,EAAAA,CAC5EW,CAAAA,CAAc,OAAOZ,EAAAA,EAAS,UAAA,CAAaA,EAAAA,CAAKtD,CAAAA,CAASgE,CAAS,CAAA,CAAIV,EAAAA,CAEtEa,CAAAA,CAAuB,CAC3B,MAAA,CAAQd,EAAAA,CACR,YAAA,CAAcY,CAAAA,CACd,QAASN,EACX,CAAA,CAEIO,CAAAA,GACEA,CAAAA,YAAuB,QAAA,CACzBC,CAAAA,CAAU,IAAA,CAAOD,CAAAA,CAEjBC,EAAU,IAAA,CAAOD,CAAAA,CAAAA,CAIrB,IAAME,CAAAA,CAAW,MAAMzB,CAAAA,CAAG,OAAA,CAAc,CAAE,IAAApD,CAAAA,CAAK,GAAG4E,CAAU,CAAC,EAC7D,OAAA1B,CAAAA,CAAW,OAAA,CAAU,CAAA,CAAA,CACrBX,IAAeY,CAAAA,CAAO,OAAA,CAASU,CAAAA,CAAc,CAACgB,CAAQ,CAAC,CAAA,CAChDA,CACT,OAASC,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CAAWD,aAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,OAAOA,CAAG,CAAC,CAAA,CACnE,MAAAtC,CAAAA,GAAauC,CAAAA,CAAU5B,CAAAA,CAAO,OAAA,CAASU,CAAY,CAAA,CAC7CkB,CACR,CACF,CAAA,CACA,iBAAArC,CAAAA,CACA,gBAAA,CAAkB,CAACf,CAAAA,CAAgBC,IAC1Ba,CAAAA,EAAa,aAAA,GAAgBd,CAAAA,CAAUC,CAAAA,CAAUc,CAAgB,CAAA,CAE1E,OAAA,CAASY,CAAAA,EAAcN,EACvB,KAAA,CAAO,CAACgC,CAAAA,CAAcC,CAAAA,GAChB,EAAAD,CAAAA,EAAgB,CAAA,EAChBC,CAAAA,EAAY,OAAA,EAAS,SAAS,KAAK,CAAA,CAAA,CAGzC,UAAA,CAAYC,CAAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAO,CAAA,EAAKA,EAAc,GAAK,CAAA,CACpE,oBAAA,CAAsB,KAAA,CACtB,gBAAiBhC,CAAAA,CAAW,OAAA,CAAUf,CAAAA,CAAkB,CAAA,CACxD,OAAQ+B,EAAAA,CACR,SAAA,CAAAC,EACF,CAAC,CAAA,CAGDzG,SAAAA,CAAU,KACRsD,CAAAA,CAAqB,UAAS,CAAE,gBAAA,CAAiByC,CAAAA,CAAiBzD,CAAAA,CAAKC,GAAUC,EAAAA,CAASC,EAAa,CAAA,CAChG,IAAM,CACXa,CAAAA,CAAqB,QAAA,EAAS,CAAE,kBAAA,CAAmByC,CAAe,EACpE,CAAA,CAAA,CACC,CAACA,EAAiBzD,CAAAA,CAAKC,EAAAA,CAAUC,EAAAA,CAASC,EAAa,CAAC,CAAA,CAE3D,IAAMgF,EAAAA,CAAa1C,CAAAA,EAAa,QAAQhB,EAAAA,EAAM,KAAA,CAAOoC,CAAY,CAAA,CAC3DuB,EAAAA,CAAgBd,EAAAA,CAChBe,EAAAA,CAAgB,CAAChB,GACjBiB,EAAAA,CAAU,CAACH,EAAAA,EAAcA,EAAAA,CAAW,SAAW,CAAA,CAE/CI,EAAAA,CAAY,SAAY,CAC5BpC,EAAO,OAAA,CAAU,CAAA,CACjB,IAAMqC,CAAAA,CAAS,MAAM1C,CAAAA,CAAM,cAAA,EAAe,CAE1C,GAAI,CACF,MAAMA,CAAAA,CAAM,cAAA,GACZG,CAAAA,CAAW,CAAA,CAAI,CAAA,CAGfjC,CAAAA,CAAqB,UAAS,CAAE,OAAA,CAAQyC,CAAAA,CAAiB,CAAE,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS+B,CAAO,CAAC,EACvF,CAAA,KAAQ,CACNvC,CAAAA,CAAW,KAAK,EAClB,CACF,CAAA,CAEMwC,EAAAA,CAAW,IAAM,CACrBtC,CAAAA,CAAO,OAAA,CAAU,CAAA,CACjBhD,EAAAA,GACF,CAAA,CAEMuF,EAAAA,CAAU,SAAY,CAC1BvC,CAAAA,CAAO,OAAA,CAAU,CAAA,CACjB,GAAI,CACFL,CAAAA,CAAM,WAAA,EAAY,CAClB,IAAM0C,CAAAA,CAAS,MAAM1C,CAAAA,CAAM,cAAA,EAAe,CAG1C9B,CAAAA,CAAqB,QAAA,EAAS,CAAE,cAAcyC,CAAAA,CAAiB,CAAE,IAAA,CAAM,CAAA,CAAG,QAAS+B,CAAO,CAAC,CAAA,CAE3F,MAAM1C,EAAM,cAAA,CAAe,CAAE,YAAA,CAAc,CAAA,CAAK,CAAC,CAAA,CACjD9B,CAAAA,CAAqB,QAAA,GAAW,OAAA,CAAQyC,CAAe,EACzD,CAAA,KAAQ,CAER,CACF,CAAA,CA8BA,GA5BA/F,SAAAA,CAAU,IAAM,CACd,UAAA,CAAW,IAAM,CACX4F,CAAAA,EACFR,CAAAA,CACG,cAAA,CAAe,CAAE,aAAc,IAAK,CAAC,CAAA,CACrC,IAAA,CAAK0C,GAAU,CACdvC,CAAAA,CAAW,IAAI,CAAA,CAGfjC,EAAqB,QAAA,EAAS,CAAE,aAAA,CAAcyC,CAAAA,CAAiB,CAAE,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS+B,CAAO,CAAC,EAC7F,CAAC,CAAA,CACA,MAAM,IAAM,CACXvC,CAAAA,CAAW,KAAK,EAClB,CAAC,EAEP,CAAA,CAAG,GAAG,EACR,CAAA,CAAG,CAACK,CAAAA,CAAYR,EAAOW,CAAe,CAAC,CAAA,CAEvCkC,mBAAAA,CAAoBpE,CAAAA,CAAK,KAAO,CAC9B,IAAA,CAAME,IAAM,KAAA,CACZ,UAAA,CAAA0D,EAAAA,CACA,IAAA,CAAMrC,CAAAA,CACN,OAAA,CAAS,IAAM9B,CAAAA,CAAqB,UAAS,CAAE,OAAA,CAAQyC,CAAe,CAAA,CACtE,cAAe,IAAMzC,CAAAA,CAAqB,QAAA,EAAS,CAAE,cAAcyC,CAAe,CAAA,CAClF,WAAA,CAAa,CAAC,CAACY,EAAAA,CACf,kBAAA,CAAAC,EACF,EAAE,CAAA,CAEEf,EAAAA,CACF,OAAO9E,GAAAA,CAACmH,KAAA,CAAK,KAAA,CAAOzE,EAAAA,CAAY,CAAA,CAGlC,GAAI,CAACmC,CAAAA,CACH,OAAO7E,GAAAA,CAACoH,MAAAA,CAAA,CAAO,MAAA,CAAQ,GAAA,CAAK,SAAUrJ,CAAAA,CAAE,sBAAsB,CAAA,CAAG,CAAA,CAGnE,IAAMsJ,EAAAA,CAA2CnD,CAAAA,CAAS,IAAMlE,GAAAA,CAAAsH,SAAA,CAAG,QAAA,CAAApD,CAAAA,CAAOlB,EAAAA,EAAM,KAAK,CAAA,CAAE,CAAA,CAAM,MAAA,CAEvFuE,GAAmB,IACnB,OAAO3D,CAAAA,EAAe,UAAA,CACjBA,EAAWwB,CAAAA,CAAcpC,EAAAA,EAAM,KAAK,CAAA,CAEtCY,EAGH4D,EAAAA,CACJ,OAAO3D,CAAAA,EAAe,UAAA,CACpB7D,GAAAA,CAACyH,GAAAA,CAAA,CACC,SAAA,CAAWhE,EACX,YAAA,CAAcD,CAAAA,CACd,YAAA,CAAcsC,EAAAA,CACd,QAASmB,EAAAA,CACT,SAAA,CAAWH,EAAAA,CAEV,QAAA,CAAAY,aAAa7D,CAAAA,CAAWQ,CAAK,CAAA,CAA6D,CACzF,OAAA,CAAU7E,CAAAA,EAA2B,CAC/BA,CAAAA,CAAE,MAAQ,OAAA,EACZsH,EAAAA,GAEJ,CACF,CAAC,CAAA,CACH,CAAA,CAGA9G,GAAAA,CAACsE,IAAAA,CAAA,CAAK,IAAA,CAAMD,CAAAA,CAAO,CAAA,CAGvB,OACEvE,IAAAA,CAAAwH,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAE,GACAD,EAAAA,EAAiB,CAClBvH,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CAAE,SAAA,CAAW,OAAQ,CAAA,CAC/B,SAAAA,GAAAA,CAAC2H,KAAAA,CAAA,CAAO,GAAGvD,CAAAA,CAAY,UAAA,CAAYsC,EAAAA,CAAY,OAAA,CAASZ,GAAY,UAAA,CAAY,KAAA,CAAO,MAAA,CAAQuB,EAAAA,CAAc,EAC/G,CAAA,CACC,CAACR,EAAAA,EACA7G,GAAAA,CAAC4H,OAAA,CACC,KAAA,CAAK,IAAA,CACL,OAAA,CAASjB,EAAAA,CACT,IAAA,CAAK,MAAA,CACL,QAAA,CAAS,SACT,QAAA,CAAUA,EAAAA,EAAiBC,EAAAA,CAC3B,OAAA,CAASI,GAER,QAAA,CACGjJ,CAAAA,CADH4I,EAAAA,CACK,0BAAA,CACFC,GACI,2BAAA,CACA,2BAHwB,CAAA,CAIlC,CAAA,CAAA,CAEJ,CAEJ,CAAA,CAEMiB,EAAAA,CAAeC,UAAAA,CAAWjF,EAAoB,CAAA,CAQ7CkF,EAAAA,CAAQF,GC3XR,IAAMG,EAAAA,CAAc/G,MAAAA,EAAiB,CAC1CgH,OAAAA,CACE,CAAC7G,CAAAA,CAAKC,CAAAA,IAAS,CACb,QAAA,CAAU,EAAC,CACX,WAAA,CAAa6G,CAAAA,EAAQ,CACnB,IAAMC,CAAAA,CAAU9G,CAAAA,EAAI,CAAA,CAEhB8G,CAAAA,CAAQ,QAAA,CAAS,MAAA,GAAWD,CAAAA,CAAK,MAAA,EAAU,CAACC,CAAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,CAACC,EAAKnI,CAAAA,GAAUmI,CAAAA,GAAQF,CAAAA,CAAKjI,CAAK,CAAC,CAAA,GACxGmB,CAAAA,CAAI,CAAE,QAAA,CAAU8G,CAAK,CAAC,EAE1B,CAAA,CACA,aAAc,EAAC,CACf,eAAA,CAAiBA,CAAAA,EAAQ,CACvB,IAAMC,CAAAA,CAAU9G,CAAAA,EAAI,CAAA,CAGlB8G,EAAQ,YAAA,CAAa,MAAA,GAAWD,CAAAA,CAAK,MAAA,EACrC,CAACC,CAAAA,CAAQ,YAAA,CAAa,KAAA,CAAM,CAACC,CAAAA,CAAKnI,CAAAA,GAAUmI,CAAAA,GAAQF,CAAAA,CAAKjI,CAAK,CAAC,CAAA,GAE/DmB,CAAAA,CAAI,CAAE,YAAA,CAAc8G,CAAK,CAAC,EAE9B,CACF,CAAA,CAAA,CACA,CACE,IAAA,CAAM,MACN,OAAA,CAASG,iBAAAA,CAAkB,IAAM,YAAY,EAC7C,UAAA,CAAY1G,CAAAA,GAAU,CACpB,QAAA,CAAUA,EAAM,QAAA,CAChB,YAAA,CAAcA,CAAAA,CAAM,YACtB,CAAA,CAAA,CAEA,aAAA,CAAe,KAAA,CACf,OAAA,CAAS,CACX,CACF,CACF,CAAA,CCrCA,IAAM2G,EAAAA,CAAeC,IAAAA,CAAK,CAAC,CAAE,EAAA,CAAAC,CAAAA,CAAI,QAAA,CAAAjI,CAAS,IACxCP,GAAAA,CAACyI,IAAAA,CAAA,CAAK,EAAA,CAAID,EAAK,QAAA,CAAAjI,CAAAA,CAAS,CACzB,CAAA,CAED+H,EAAAA,CAAa,WAAA,CAAc,cAAA,CAGpB,SAASI,GAAeC,CAAAA,CAAmB,CAChD,IAAMC,CAAAA,CAAqB,EAAC,CAE5B,GAAID,CAAAA,CACF,IAAA,IAASE,EAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAM,MAAA,CAAQE,CAAAA,EAAAA,CAChC,GAAIF,CAAAA,CAAME,CAAC,IAAM,IAAA,EAASF,CAAAA,CAAME,CAAC,CAAA,CAAsB,OAAS,SAAA,CAC9DD,CAAAA,CAAOC,CAAC,CAAA,CAAIF,EAAME,CAAC,CAAA,CAAA,KAAA,GACTF,CAAAA,CAAME,CAAC,CAAA,CAA4C,QAAA,CAAU,CACvE,GAAM,CAAE,QAAA,CAAAtI,CAAAA,CAAU,GAAGuI,CAAK,EAAIH,CAAAA,CAAME,CAAC,CAAA,CACrCD,CAAAA,CAAOC,CAAC,CAAA,CAAI,CACV,GAAGC,CAAAA,CACH,QAAA,CAAUJ,EAAAA,CAAenI,CAAQ,CACnC,EACF,CAAA,KAAO,CACL,GAAM,CAAE,MAAAwI,CAAAA,CAAO,KAAA,CAAAC,CAAAA,CAAO,GAAGF,CAAK,CAAA,CAAIH,CAAAA,CAAME,CAAC,CAAA,CACnCI,CAAAA,CAAYF,CAAAA,CAAQ/I,GAAAA,CAACsI,EAAAA,CAAA,CAAa,EAAA,CAAIS,CAAAA,CAAQ,QAAA,CAAAC,CAAAA,CAAM,EAAkBA,CAAAA,CAE5EJ,CAAAA,CAAOC,CAAC,CAAA,CAAI,CACV,GAAGC,CAAAA,CACH,KAAA,CAAOG,CACT,EACF,CAIJ,OAAOL,CACT,CAGO,SAASM,EAAAA,CACdP,CAAAA,CACAC,CAAAA,CAA2D,EAAC,CAC5DO,CAAAA,CAAoB,EAAC,CAC6B,CAClD,IAAA,IAAWC,CAAAA,IAAQT,CAAAA,CAAO,CACxB,IAAMpI,CAAAA,CAAY6I,CAAAA,EAAgD,QAAA,CAElE,GAAI,KAAA,CAAM,OAAA,CAAQ7I,CAAQ,CAAA,CAAG,CAC3B,IAAM2H,CAAAA,CACHkB,CAAAA,CAA8B,IAAA,GAAS,SAAWA,CAAAA,CAAM,GAAA,CAAM,CAAC,GAAGD,CAAAA,CAASC,CAAAA,CAAM,GAAa,CAAA,CAAID,EACrGD,EAAAA,CAAU3I,CAAAA,CAAUqI,CAAAA,CAAQV,CAAI,EAClC,CAAA,KAAWkB,CAAAA,EACTR,CAAAA,CAAO,IAAA,CAAK,CAAE,GAAIQ,CAAAA,CAA0B,OAAA,CAAAD,CAAQ,CAAC,EAEzD,CAEA,OAAOP,CACT,KC/CMS,EAAAA,CAAO5L,CAAAA,EAAoB,CAC/B,GAAM,CAAE,KAAA,CAAAkL,CAAAA,CAAQ,EAAC,CAAG,KAAA,CAAAzK,CAAAA,CAAO,OAAA,CAAAoL,CAAQ,EAAI7L,CAAAA,CACjC8L,CAAAA,CAAWC,WAAAA,EAAY,CAEvBC,EAAeP,EAAAA,CAAUP,CAAK,CAAA,CAC9Be,CAAAA,CAAgBhB,GAAeC,CAAK,CAAA,CAEpC,CAAE,QAAA,CAAAgB,CAAAA,CAAU,YAAA,CAAAC,CAAAA,CAAc,WAAA,CAAAC,EAAa,eAAA,CAAAC,CAAgB,CAAA,CAAI9B,EAAAA,GAyBjE,OAvBA/I,SAAAA,CAAU,IAAM,CACd,IAAM8K,CAAAA,CAAQN,CAAAA,CAAa,IAAA,CAAKL,CAAAA,EAAQG,CAAAA,CAAS,QAAA,GAAaH,CAAAA,CAAK,KAAK,EAExE,GAAIW,CAAAA,CAAO,CACT,IAAM3B,EAAM2B,CAAAA,CAAM,GAAA,CACZZ,CAAAA,CAAUY,CAAAA,CAAM,QAIhB,CAAE,YAAA,CAAcC,CAAAA,CAAqB,QAAA,CAAUC,CAAgB,CAAA,CAAIjC,EAAAA,CAAY,QAAA,GAEjFgC,CAAAA,CAAoB,CAAC,CAAA,GAAM5B,CAAAA,EAC7B0B,CAAAA,CAAgB,CAAC1B,CAAG,CAAC,EAIvB,IAAM8B,CAAAA,CAAcf,CAAAA,CAAQ,MAAA,CAAOgB,CAAAA,EAAK,CAACF,CAAAA,CAAgB,QAAA,CAASE,CAAC,CAAC,CAAA,CAChED,CAAAA,CAAY,MAAA,CAAS,GACvBL,CAAAA,CAAY,CAAC,GAAGI,CAAAA,CAAiB,GAAGC,CAAW,CAAC,EAEpD,CACF,CAAA,CAAG,CAACT,CAAAA,CAAcF,CAAAA,CAAS,SAAUM,CAAAA,CAAaC,CAAe,CAAC,CAAA,CAE9DR,EAEAtJ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CAAmC,MAAO,CAAE,MAAA,CAAQ,oBAAqB,CAAA,CACtF,QAAA,CAAAA,GAAAA,CAACmH,IAAAA,CAAA,EAAK,EACR,CAAA,CAKFnH,GAAAA,CAACoK,IAAAA,CAAA,CACC,MAAOlM,CAAAA,CACP,KAAA,CAAO,CAAE,WAAA,CAAa,MAAO,CAAA,CAC7B,KAAA,CAAOwL,CAAAA,CACP,IAAA,CAAK,QAAA,CACL,QAAA,CAAUC,CAAAA,CACV,YAAA,CAAcC,EACd,YAAA,CAAcC,CAAAA,CAChB,CAEJ,CAAA,CAEOQ,GAAQhB,OC1DTiB,EAAAA,CAAyC,CAC7C,OAAA,CAAS,MAAA,CACT,eAAgB,QAAA,CAChB,UAAA,CAAY,QAAA,CACZ,MAAA,CAAQ,GACV,CAAA,CAEMC,EAAAA,CAAqC,CAAC,CAAE,QAAA,CAAAhK,CAAS,CAAA,GAAM,CAC3D,GAAM,CAAE,iBAAA,CAAAiK,CAAAA,CAAmB,KAAA,CAAAC,EAAO,QAAA,CAAAC,CAAAA,CAAU,WAAA,CAAAC,CAAY,CAAA,CAAIC,CAAAA,EAAiB,CACvE,CAAE,UAAAC,CAAU,CAAA,CAAIC,CAAAA,EAAS,CACzB,CAAE,CAAA,CAAA/M,GAAE,CAAA,CAAIC,GAAAA,GAGd,OAAK2M,CAAAA,CAKDE,CAAAA,CAEA7K,GAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOsK,EAAAA,CACV,QAAA,CAAAtK,IAACmH,IAAAA,CAAA,EAAK,CAAA,CACR,CAAA,CAKAqD,IAAsB,IAAA,EAAwBE,CAAAA,CACzC1K,GAAAA,CAAAsH,QAAAA,CAAA,CAAG,QAAA,CAAA/G,CAAAA,CAAS,CAAA,CAIhBkK,CAAAA,CAKEzK,GAAAA,CAACsH,UAAAA,CAAA,CAAsB,QAAA,CAAA/G,GAARkK,CAAiB,CAAA,CAJ9BzK,GAAAA,CAAC+K,KAAAA,CAAA,CAAM,KAAA,CAAOA,KAAAA,CAAM,sBAAA,CAAwB,WAAA,CAAahN,IAAE,yBAAyB,CAAA,CAAG,CAAA,CAnBvFiC,GAAAA,CAAAsH,QAAAA,CAAA,CAAG,QAAA,CAAA/G,CAAAA,CAAS,CAwBvB,CAAA,CAGOyK,EAAAA,CAAQzC,IAAAA,CAAKgC,EAAW,ECzC/B,IAAMU,EAAAA,CAAmB,IAAM,CAC7B,GAAM,CAAE,CAAA,CAAAlN,CAAE,CAAA,CAAIC,GAAAA,EAAe,CACvBkN,EAAWC,WAAAA,EAAY,CACvB,CAAE,IAAA,CAAAC,EAAM,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAAC,CAAM,EAAIV,CAAAA,EAAiB,CAE9CW,CAAAA,CAAgB,IAAM,CAC1BD,CAAAA,EAAM,CACNJ,CAAAA,CAASG,CAAS,EACpB,CAAA,CAEMG,CAAAA,CAAiBhM,CAAAA,EAAqB,EACtCA,CAAAA,CAAE,GAAA,GAAQ,OAAA,EAAWA,CAAAA,CAAE,MAAQ,GAAA,IACjCA,CAAAA,CAAE,cAAA,EAAe,CACjB+L,CAAAA,EAAc,EAElB,CAAA,CAEME,CAAAA,CAAyBjM,GAAqB,CAAA,CAC9CA,CAAAA,CAAE,GAAA,GAAQ,OAAA,EAAWA,EAAE,GAAA,GAAQ,GAAA,GACjCA,CAAAA,CAAE,cAAA,GAEN,CAAA,CAEMmJ,CAAAA,CAA4B,CAChC,CACE,GAAA,CAAK,GAAA,CACL,IAAA,CAAM3I,GAAAA,CAAC0L,eAAA,EAAe,CAAA,CACtB,KAAA,CACE1L,GAAAA,CAAC,KAAE,IAAA,CAAK,QAAA,CAAS,QAAA,CAAU,CAAA,CAAG,QAASuL,CAAAA,CAAe,SAAA,CAAWC,CAAAA,CAC9D,QAAA,CAAAzN,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CAEJ,CACF,CAAA,CAEA,OACEiC,GAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAAA,GAAAA,CAAC2L,QAAAA,CAAA,CACC,KAAM,CACJ,UAAA,CAAY,IAAA,CACZ,KAAA,CAAAhD,CACF,CAAA,CACA,SAAA,CAAU,aAAA,CAEV,SAAA3I,GAAAA,CAAC,GAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAU,CAAA,CACV,OAAA,CAASR,CAAAA,EAAK,CACZA,EAAE,cAAA,GACJ,CAAA,CACA,SAAA,CAAWiM,CAAAA,CAEX,QAAA,CAAA3L,IAAAA,CAACC,KAAAA,CAAA,CAAM,KAAA,CAAM,QAAA,CACX,QAAA,CAAA,CAAAC,GAAAA,CAAC,QAAM,QAAA,CAAAoL,CAAAA,EAAM,WAAA,CAAY,CAAA,CACzBpL,IAAC4L,YAAAA,CAAA,CAAa,KAAA,CAAO,CAAE,QAAA,CAAU,MAAO,CAAA,CAAG,CAAA,CAAA,CAC7C,EACF,CAAA,CACF,CAAA,CACF,CAEJ,CAAA,CAEOC,GAAQZ,GC7Df,GAAM,CAAE,IAAA,CAAAa,EAAK,CAAA,CAAInL,UAAAA,CAOXoL,EAAAA,CAAqCtO,GAA8B,CACvE,GAAM,CAAE,MAAA,CAAAuO,EAAQ,OAAA,CAAAC,CAAQ,CAAA,CAAIxO,CAAAA,CACtB,CAAE,CAAA,CAAAM,CAAE,CAAA,CAAIC,GAAAA,EAAe,CACvB,CAAE,SAAA,CAAAkO,CAAAA,CAAW,MAAAzB,CAAAA,CAAO,QAAA,CAAA0B,GAAS,CAAA,CAAIvB,GAAiB,CAClD,CAAE,IAAA,CAAA5H,CAAAA,CAAM,UAAA6H,CAAU,CAAA,CAAIC,CAAAA,EAAS,CAC/BsB,GAAAA,CAAcC,cAAAA,EAAe,CAE7BC,CAAAA,CAAerH,QACnB,IAAMjC,CAAAA,EAAM,MAAA,CAAQoG,CAAAA,EAAe4C,IAAS5C,CAAS,CAAA,EAAK,IAAI,CAAA,CAC9D,CAACpG,CAAAA,CAAMgJ,CAAM,CACf,CAAA,CAEMO,CAAAA,CAAgBtH,OAAAA,CACpB,IACE,OAAOgH,GAAY,UAAA,CACfA,CAAAA,CAAQK,CAAY,CAAA,CACpBA,CAAAA,EAAc,GAAA,CAAKlD,CAAAA,GAAa,CAC9B,MAAOA,CAAAA,CAAK,IAAA,CACZ,KAAA,CAAO8C,CAAAA,CAAY9C,CAAAA,CAAK,OAAA,CAAUA,CAAAA,CAAK,EACzC,EAAE,CAAA,CACR,CAAC6C,CAAAA,CAASK,CAAAA,CAAcJ,CAAS,CACnC,CAAA,CAGMM,CAAAA,CAAgBC,CAAAA,EAA2B,CAE/CL,GAAAA,CAAY,iBAAA,CAAkB,CAC5B,SAAA,CAAWM,CAAAA,EAAS,CAClB,IAAMlL,CAAAA,CAAWkL,EAAM,QAAA,CACvB,OAAO,CAAClL,CAAAA,CAAS,SAAS,gBAAgB,CAAA,EAAK,CAACA,CAAAA,CAAS,SAAS,uBAAuB,CAC3F,CACF,CAAC,CAAA,CACD2K,GAAAA,CAASM,CAAK,EAChB,EAEA,OAAAxN,SAAAA,CAAU,IAAM,CAEV4L,IAEA0B,CAAAA,EAAiBA,CAAAA,CAAc,MAAA,CAAS,CAAA,CACpB9B,GAAS8B,CAAAA,CAAc,IAAA,CAAKnD,CAAAA,EAAQ,MAAA,CAAOA,CAAAA,CAAK,KAAK,CAAA,GAAM,MAAA,CAAOqB,CAAK,CAAC,CAAA,EAI5F0B,GAAAA,CAASI,CAAAA,CAAc,CAAC,CAAA,EAAG,KAAA,EAAS,MAAS,CAAA,CAAA,CAEtCA,IAAkB,MAAA,EAAaA,CAAAA,CAAc,MAAA,GAAW,CAAA,GAEjEJ,GAAAA,CAAS,MAAS,CAAA,EAEtB,CAAA,CAAG,CAACI,CAAAA,CAAe1B,CAAS,CAAC,CAAA,CAG3B/K,KAACC,KAAAA,CAAA,CACC,QAAA,CAAA,CAAAC,GAAAA,CAAC8L,GAAA,CAAM,QAAA,CAAA/N,CAAAA,CAAE,kBAAkB,CAAA,CAAE,CAAA,CAC7BiC,GAAAA,CAAC2M,MAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,gBAAA,CAAiB,OAAA,CACjB,MAAOlC,CAAAA,CACP,WAAA,CAAa1M,CAAAA,CAAE,wBAAwB,EACvC,OAAA,CAAS8M,CAAAA,CACT,KAAA,CAAO,CAAE,KAAA,CAAO,OAAQ,CAAA,CACxB,OAAA,CAAS0B,EACT,QAAA,CAAUC,CAAAA,CACZ,CAAA,CAAA,CACF,CAEJ,EAEOI,EAAAA,CAAQb,EAAAA,isZCjFf,IAAMc,EAAAA,CAAsBpP,CAAAA,EACnBuC,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAK8M,EAAAA,CAAS,GAAA,CAAI,OAAQ,GAAGrP,CAAAA,CAAO,CAAA,CAG3CsP,EAAAA,CAAQF,GCEf,IAAMG,CAAAA,CAAoB,gDAEpBC,EAAAA,CAAe1E,IAAAA,CAAwB,CAAC,CAAE,MAAA2E,CAAAA,CAAO,QAAA,CAAAC,CAAS,CAAA,GAAM,CACpE,GAAM,CAAE,YAAA,CAAAC,EAAc,SAAA,CAAAC,CAAU,CAAA,CAAIzC,CAAAA,GAEpC,OACE9K,IAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,yEACV,KAAA,CAAO,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,MAAA,CACT,aAAA,CAAe,QAAA,CACf,eAAgB,QAAA,CAChB,cAAA,CAAgB,WAAA,CAChB,oBAAA,CAAsB,WACxB,CAAA,CAEA,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAW,CAAA,yBAAA,EAA4BuN,CAAAA,CAAY,gBAAA,CAAmB,EAAE,CAAA,CAAA,CAC3E,QAAA,CAAA,CAAArN,GAAAA,CAACyI,IAAAA,CAAA,CACC,EAAA,CAAI2E,CAAAA,CACJ,SAAA,CAAU,8GAAA,CACV,MAAO,CACL,UAAA,CAAYJ,CAAAA,CACZ,OAAA,CAASK,EAAY,EAAA,CAAM,CAC7B,CAAA,CAEA,QAAA,CAAArN,GAAAA,CAAC+M,EAAAA,CAAA,CACC,KAAA,CAAO,GACP,KAAA,CAAO,CACL,SAAA,CAAW,SAAA,CACX,QAAS,OAAA,CACT,MAAA,CAAQ,4CAAA,CACR,UAAA,CAAYC,CACd,CAAA,CACF,CAAA,CACF,CAAA,CACCE,CAAAA,EACClN,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,8BAAA,CACV,MAAO,CACL,UAAA,CAAYgN,CAAAA,CACZ,OAAA,CAASK,EAAY,CAAA,CAAI,CAAA,CACzB,KAAA,CAAOA,CAAAA,CAAY,MAAQ,MAAA,CAC3B,UAAA,CAAYA,CAAAA,CAAY,KAAA,CAAQ,MAAA,CAChC,SAAA,CAAWA,CAAAA,CAAY,kBAAA,CAAqB,eAC9C,CAAA,CAEA,QAAA,CAAArN,GAAAA,CAACyI,IAAAA,CAAA,CACC,EAAA,CAAI2E,CAAAA,CACJ,SAAA,CAAU,sPAAA,CACV,MAAOF,CAAAA,CACP,KAAA,CAAO,CACL,aAAA,CAAe,QAAA,CACf,UAAA,CAAY,+BACd,CAAA,CAEC,SAAAA,CAAAA,CACH,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACAlN,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,6BAAA,CACV,KAAA,CAAO,CACL,MAAA,CAAQmN,CAAAA,EAAY,CAACE,CAAAA,CAAY,MAAA,CAAS,KAAA,CAC1C,UAAA,CAAYL,CACd,EAEA,QAAA,CAAAlN,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iDACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2CACV,KAAA,CAAO,CACL,OAAA,CAAS,CAACmN,CAAAA,EAAYE,CAAAA,CAAY,CAAA,CAAI,CAAA,CACtC,WAAYL,CACd,CAAA,CACF,CAAA,CACCG,CAAAA,EACCrN,KAAC,KAAA,CAAA,CACC,SAAA,CAAU,kCAAA,CACV,KAAA,CAAO,CACL,OAAA,CAASuN,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,SAAA,CAAWA,CAAAA,CAAY,kBAAA,CAAqB,eAAA,CAC5C,WAAYL,CACd,CAAA,CAEA,QAAA,CAAA,CAAAhN,GAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CAAkC,CAAA,CACjDA,GAAAA,CAAC,QAAK,SAAA,CAAU,kDAAA,CAAmD,KAAA,CAAOmN,CAAAA,CACvE,QAAA,CAAAA,CAAAA,CACH,CAAA,CACAnN,GAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CAAkC,CAAA,CAAA,CACnD,CAAA,CAAA,CAEJ,EACF,CAAA,CAAA,CACF,CAEJ,CAAC,CAAA,CAEDiN,GAAa,WAAA,CAAc,cAAA,CAE3B,IAAOK,EAAAA,CAAQL,EAAAA,CChGf,IAAM,CAAE,OAAAM,EAAAA,CAAQ,KAAA,CAAAC,EAAAA,CAAO,OAAA,CAAAC,EAAQ,CAAA,CAAIC,MAAAA,CAE7BC,EAAAA,CAAgB,EAAA,CAChBC,EAAAA,CAAkB,WAAA,CAClBC,EAAAA,CAAiB,QAAA,CACjBC,GAAiB,GAAA,CAkBjBC,EAAAA,CAAiCtQ,CAAAA,EAA6C,CAClF,GAAM,CACJ,aAAA,CAAAuQ,CAAAA,CACA,KAAA,CAAArF,EACA,WAAA,CAAAsF,CAAAA,CACA,QAAA,CAAA1N,CAAAA,CACA,gBAAA,CAAA2N,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,MAAAjB,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,cAAA,CAAAiB,GACF,CAAA,CAAI3Q,CAAAA,CACE,CACJ,KAAA,CAAO,CAAE,gBAAA,CAAA4Q,CAAAA,CAAkB,WAAA,CAAAC,CAAY,CACzC,CAAA,CAAIpQ,KAAAA,CAAM,QAAA,GACJ,CAAE,QAAA,CAAAqQ,CAAAA,CAAU,WAAA,CAAAC,CAAAA,CAAa,SAAA,CAAAnB,CAAAA,CAAW,eAAA,CAAAoB,EAAiB,WAAA,CAAA9D,CAAY,CAAA,CAAIC,CAAAA,EAAiB,CAEtF8D,CAAAA,CAAiB,CAACN,GAAAA,EAAkBzD,EAEpCgE,CAAAA,CAA4B,CAChC,MAAA,CAAQ,OAAA,CACR,UAAW,QAAA,CACX,SAAA,CAAW,MAAA,CACX,gBAAA,CAAkB,EAClB,gBAAA,CAAkB,OAAA,CAClB,gBAAA,CAAkBL,CACpB,CAAA,CAEMM,CAAAA,CAA6B,CACjC,OAAA,CAASf,GACT,UAAA,CAAYQ,CACd,CAAA,CAEMQ,CAAAA,CAA8B,CAClC,QAAA,CAAU,MAAA,CACV,OAAA,CAASjB,EAAAA,CACT,UAAW,CAAA,aAAA,EAAgBD,EAAa,CAAA,GAAA,CAC1C,CAAA,CAEMmB,CAAAA,CAA8B,CAClC,OAAA,CAAS,MAAA,CACT,eAAgB,QAAA,CAChB,UAAA,CAAY,QAAA,CACZ,MAAA,CAAQ,GAAGhB,EAAc,CAAA,EAAA,CAC3B,CAAA,CAEA,OACEhO,KAAC4N,MAAAA,CAAA,CACC,QAAA,CAAA,CAAA5N,IAAAA,CAAC0N,EAAAA,CAAA,CACC,WAAA,CAAagB,CAAAA,CACb,MAAM,OAAA,CACN,OAAA,CAAS,IAAA,CACT,SAAA,CAAWnB,EACX,KAAA,CAAOkB,CAAAA,CACP,KAAA,CAAOI,CAAAA,CAEP,UAAA3O,GAAAA,CAACsN,EAAAA,CAAA,CAAa,KAAA,CAAOJ,CAAAA,CAAO,QAAA,CAAUC,CAAAA,CAAU,CAAA,CAChDnN,IAACqK,EAAAA,CAAA,CAAI,KAAA,CAAO1B,CAAAA,CAAO,QAASqF,CAAAA,CAAe,CAAA,CAAA,CAC7C,CAAA,CACAlO,IAAAA,CAAC4N,OAAA,CACC,QAAA,CAAA,CAAA1N,GAAAA,CAACuN,EAAAA,CAAA,CAAO,KAAA,CAAOqB,CAAAA,CACb,QAAA,CAAA9O,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAA,KAACC,KAAAA,CAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAOC,GAAAA,CAAC+O,OAAAA,CAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,CAAA,CAAI,SAAA,CAAU,MAAA,CAC/D,UAAAP,CAAAA,EACCxO,GAAAA,CAAC4H,MAAAA,CAAA,CACC,KAAK,MAAA,CACL,IAAA,CAAMyF,CAAAA,CAAYrN,GAAAA,CAACgP,mBAAA,EAAmB,CAAA,CAAKhP,GAAAA,CAACiP,gBAAAA,CAAA,EAAiB,CAAA,CAC7D,KAAA,CAAO,CAAE,SAAU,MAAO,CAAA,CAC1B,OAAA,CAASR,CAAAA,CACX,EAEDC,CAAAA,EAAkB1O,GAAAA,CAAC4M,EAAAA,CAAA,CAAc,OAAQsB,CAAAA,CAAkB,OAAA,CAASC,CAAAA,CAAmB,CAAA,CACvFF,CAAAA,EAAa,IAAA,EAAM,GAAA,CAAIiB,CAAAA,EACtBlP,IAAC,MAAA,CAAA,CAAsB,QAAA,CAAAkP,CAAAA,CAAM,QAAA,CAAA,CAAlBA,EAAM,GAAqB,CACvC,CAAA,CAAA,CACH,CAAA,CACApP,KAACC,KAAAA,CAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAOC,GAAAA,CAAC+O,OAAAA,CAAA,CAAQ,KAAK,UAAA,CAAW,CAAA,CACjD,QAAA,CAAA,CAAAd,CAAAA,EAAa,OAAO,GAAA,CAAIiB,CAAAA,EACvBlP,GAAAA,CAAC,MAAA,CAAA,CAAsB,SAAAkP,CAAAA,CAAM,QAAA,CAAA,CAAlBA,CAAAA,CAAM,GAAqB,CACvC,CAAA,CACDlP,GAAAA,CAAC6L,EAAAA,CAAA,EAAa,CAAA,CAAA,CAChB,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACA7L,IAACyN,EAAAA,CAAA,CAAQ,KAAA,CAAOoB,CAAAA,CACd,SAAA7O,GAAAA,CAACmP,QAAAA,CAAA,CAAS,QAAA,CAAUnP,GAAAA,CAACmH,IAAAA,CAAA,CAAK,KAAA,CAAO2H,EAAc,CAAA,CAC7C,QAAA,CAAA9O,GAAAA,CAACgL,EAAAA,CAAA,CAAa,QAAA,CAAAzK,CAAAA,CAAS,CAAA,CACzB,CAAA,CACF,GACF,CAAA,CAAA,CACF,CAEJ,CAAA,CAEO6O,EAAAA,CAAQrB,GC7Gf,IAAMsB,EAAAA,CAAuD5R,CAAAA,EAAS,CACpE,GAAM,CAAE,IAAA,CAAA8F,CAAAA,CAAM,MAAA,CAAA+L,EAAQ,YAAA,CAAAC,CAAAA,CAAe,GAAA,CAAK,QAAA,CAAAhP,CAAS,CAAA,CAAI9C,CAAAA,CACjD,CAAE,IAAA,CAAMoH,CAAAA,CAAY,SAAA,CAAAgG,CAAU,CAAA,CAAI9F,IAAQxB,CAAAA,CAAM+L,CAAM,CAAA,CACtD,CAAE,EAAAvR,CAAE,CAAA,CAAIC,GAAAA,EAAe,CACvBkN,EAAWC,WAAAA,EAAY,CAE7B,OAAIN,CAAAA,CAEA7K,GAAAA,CAACmH,IAAAA,CAAA,CACC,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,cAAA,CAAgB,QAAA,CAChB,UAAA,CAAY,QAAA,CACZ,MAAA,CAAQ,GACV,EACF,CAAA,CAICtC,CAAAA,CAcE7E,GAAAA,CAAAsH,QAAAA,CAAA,CAAG,QAAA,CAAA/G,CAAAA,CAAS,CAAA,CAZfP,IAACoH,MAAAA,CAAA,CACC,MAAA,CAAO,KAAA,CACP,SAAUrJ,CAAAA,CAAE,sBAAsB,CAAA,CAClC,KAAA,CACEiC,IAAC4H,MAAAA,CAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAS,IAAMsD,CAAAA,CAASqE,CAAY,EACxD,QAAA,CAAAxR,CAAAA,CAAE,aAAa,CAAA,CAClB,EAEJ,CAKN,CAAA,CAEOyR,EAAAA,CAAQH,GC1DR,IAAMI,EAAAA,CAAiBC,CAAAA,GCuBvB,SAASC,GAAUlS,CAAAA,CAAuB,CAC/C,GAAM,CACJ,QAAAmS,CAAAA,CACA,SAAA,CAAA9I,CAAAA,CACA,SAAA,CAAA+I,EACA,UAAA,CAAAC,CAAAA,CACA,MAAA,CAAA5L,CAAAA,CACA,WAAA,CAAA6L,CAAAA,CAAc,cAAA,CACd,UAAA,CAAAC,EAAa,cAAA,CACb,kBAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,EACA,GAAGC,CACL,CAAA,CAAI1S,CAAAA,CAEE2S,EAAMnL,OAAAA,CAAQ,IAAMoL,CAAAA,EAAW,CAAG,EAAE,CAAA,CACpC,CAAE,KAAAC,CAAAA,CAAM,IAAA,CAAAC,CAAAA,CAAM,MAAA,CAAAC,EAAQ,OAAA,CAAAC,CAAQ,CAAA,CAAIhB,EAAAA,GAGxCxQ,SAAAA,CAAU,IACD,IAAM,CACXwR,CAAAA,CAAQL,CAAG,EACb,CAAA,CACC,CAACA,CAAAA,CAAKK,CAAO,CAAC,CAAA,CAEjB,IAAMC,CAAAA,CAAOF,CAAAA,CAAOJ,CAAG,CAAA,CACjB,CAACO,CAAAA,CAAgBC,CAAiB,CAAA,CAAIvS,QAAAA,CAAS,KAAK,CAAA,CACpDwS,CAAAA,CAAmB,OAAOjB,GAAY,UAAA,CAEtCkB,CAAAA,CAAQC,WAAAA,CAAY,SAAY,CACpCT,CAAAA,CAAKF,CAAG,CAAA,CACR,MAAMP,MACR,CAAA,CAAG,CAACO,CAAAA,CAAKE,CAAAA,CAAMT,CAAS,CAAC,CAAA,CAEnBmB,EAAQD,WAAAA,CAAY,IAAM,CAC9BR,CAAAA,CAAKH,CAAG,EACV,CAAA,CAAG,CAACA,CAAAA,CAAKG,CAAI,CAAC,CAAA,CAERU,CAAAA,CAAkCF,WAAAA,CAAY,SAAY,CAC9DC,CAAAA,EAAM,CACN,MAAMlB,CAAAA,KACR,CAAA,CAAG,CAACkB,EAAOlB,CAAU,CAAC,CAAA,CAEhBoB,CAAAA,CAAgBH,YAAY,SAAY,CAC5C,GAAI,CACFH,CAAAA,CAAkB,CAAA,CAAI,CAAA,CACtB,MAAM9J,MACR,CAAA,MAASzE,CAAAA,CAAO,CACd,cAAQ,KAAA,CAAM,uBAAA,CAAyBA,CAAK,CAAA,CACtCA,CACR,CAAA,OAAE,CACAuO,CAAAA,CAAkB,KAAK,EACzB,CACF,CAAA,CAAG,CAAC9J,CAAS,CAAC,CAAA,CAERqK,CAAAA,CACJjN,CAAAA,GAAW,OACTlE,GAAAA,CAAAsH,QAAAA,CAAA,CAAG,QAAA,CAAApD,EAAO,CAAA,CAEVpE,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC4H,MAAAA,CAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAS+I,CAAAA,CAAiB,GAAGV,CAAAA,CAAoB,OAAA,CAASiB,CAAAA,CAC9E,QAAA,CAAAnB,EACH,CAAA,CACA/P,GAAAA,CAAC4H,MAAAA,CAAA,CAAQ,GAAGsI,CAAAA,CAAmB,OAAA,CAASe,CAAAA,CACrC,SAAAjB,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CAGEoB,CAAAA,CACJpR,IAACqR,MAAAA,CAAA,CAAQ,GAAGlB,CAAAA,CAAa,KAAMO,CAAAA,CAAM,MAAA,CAAQS,CAAAA,CAAc,OAAA,CAASF,CAAAA,CACjE,QAAA,CAAAJ,CAAAA,CAAmB7Q,GAAAA,CAAAsH,SAAA,CAAG,QAAA,CAAAsI,CAAAA,CAAQ,CAAE,KAAMoB,CAAM,CAAC,CAAA,CAAE,CAAA,CAAMhR,IAAAsH,QAAAA,CAAA,CAAG,QAAA,CAAAsI,CAAAA,CAAQ,CAAA,CACnE,CAAA,CAGF,OAAO,CACL,GAAIQ,CAAAA,CACJ,IAAA,CAAMU,CAAAA,CACN,IAAA,CAAME,CAAAA,CACN,cAAA,CAAAL,CAAAA,CACA,MAAA,CAAQS,CACV,CACF,CC1EO,SAASE,GACd7T,CAAAA,CAC0C,CAC1C,GAAM,CAAE,OAAA,CAAAmS,CAAAA,CAAS,IAAA,CAAAzL,CAAAA,CAAM,UAAAoN,CAAAA,CAAW,SAAA,CAAAzK,CAAAA,CAAW,SAAA,CAAA0K,EAAW,UAAA,CAAA1B,CAAAA,CAAY,GAAGK,CAAY,EAAI1S,CAAAA,CACjF,CAACgU,CAAAA,CAAqBC,CAAsB,CAAA,CAAIrT,QAAAA,CAAsB,EAAiB,EACvF,CAACsT,CAAY,CAAA,CAAIrN,IAAAA,CAAK,QAAgBH,CAAI,CAAA,CAE1C0M,CAAAA,CAAmB,OAAOjB,GAAY,UAAA,CAEtC,CAAE,EAAA,CAAAtO,CAAAA,CAAI,IAAA,CAAAgP,CAAAA,CAAM,IAAA,CAAAC,CAAAA,CAAM,OAAAqB,CAAO,CAAA,CAAIjC,EAAAA,CAAU,CAC3C,GAAGQ,CAAAA,CACH,OAAA,CAAS0B,CAAAA,EACP7R,GAAAA,CAACsE,KAAA,CAAM,GAAGiN,CAAAA,CAAW,IAAA,CAAMI,CAAAA,CACxB,QAAA,CAAAd,CAAAA,CAAmB7Q,GAAAA,CAAAsH,SAAA,CAAG,QAAA,CAAAsI,CAAAA,CAAQ6B,CAAAA,CAAqBI,CAAS,CAAA,CAAE,CAAA,CAAM7R,GAAAA,CAAAsH,QAAAA,CAAA,CAAG,QAAA,CAAAsI,CAAAA,CAAQ,CAAA,CAClF,CAAA,CAEF,SAAA,CAAW,SAAY,CACrB,GAAI,CACF,IAAM7I,CAAAA,CAAS,MAAM4K,CAAAA,CAAa,gBAAe,CACjD,MAAM7K,CAAAA,GAAYC,CAAAA,CAAQ0K,CAAmB,CAAA,CAC7CD,CAAAA,IAAY,CACZjB,CAAAA,GACF,CAAA,MAASlO,CAAAA,CAAO,CACd,cAAQ,KAAA,CAAM,sCAAA,CAAwCA,CAAK,CAAA,CACrDA,CACR,CACF,CAAA,CACA,UAAA,CAAY,IAAM,CAChBqP,CAAAA,CAAuB,EAAiB,CAAA,CACxC5B,CAAAA,GAAa6B,CAAY,EAC3B,CACF,CAAC,CAAA,CAEKG,CAAAA,CAAWf,WAAAA,CACd9E,CAAAA,EAAmD,CAClD,GAAM,CAAE,aAAA,CAAA8F,CAAAA,CAAe,YAAAC,CAAY,CAAA,CAAI/F,CAAAA,EAAW,EAAC,CAE/C+F,CAAAA,GAAgB,MAAA,EAClBN,CAAAA,CAAuBM,CAAW,CAAA,CAGhCD,CAAAA,EACFJ,CAAAA,CAAa,cAAA,CAAeI,CAAa,CAAA,CAG3CzB,CAAAA,GACF,CAAA,CACA,CAACqB,CAAAA,CAAcrB,CAAI,CACrB,CAAA,CAEA,OAAO,CACL,EAAA,CAAAhP,CAAAA,CACA,KAAMwQ,CAAAA,CACN,IAAA,CAAAvB,CAAAA,CACA,MAAA,CAAAqB,CACF,CACF,KCrFMK,EAAAA,CAAeC,IAAAA,CAAK,IAAM,OAAO,4BAAsB,CAAC,CAAA,CACxDC,EAAAA,CAAiBD,IAAAA,CAAK,IAAM,OAAO,8BAAwB,CAAC,EAC5DE,EAAAA,CAAiBF,IAAAA,CAAK,IAAM,OAAO,8BAAwB,CAAC,CAAA,CAE3DG,EAAAA,CACLvS,IAAAA,CAACwS,OAAA,CACC,QAAA,CAAA,CAAAtS,GAAAA,CAACuS,KAAAA,CAAA,CAAM,KAAA,CAAK,IAAA,CAAC,OAAA,CAASvS,IAACiS,EAAAA,CAAA,EAAa,CAAA,CAAI,CAAA,CACxCjS,IAACuS,KAAAA,CAAA,CAAM,IAAA,CAAK,QAAA,CAAS,QAASvS,GAAAA,CAACmS,EAAAA,CAAA,EAAe,CAAA,CAAI,CAAA,CAClDnS,GAAAA,CAACuS,KAAAA,CAAA,CAAM,KAAK,YAAA,CAAa,OAAA,CAASvS,GAAAA,CAACoS,EAAAA,CAAA,EAAe,CAAA,CAAI,CAAA,CAAA,CACxD,ECTF,IAAMI,EAAAA,CAAWN,KAAK,IAAM,OAAO,wBAAkB,CAAC,CAAA,CAChDO,EAAAA,CAAaP,IAAAA,CAAK,IAAM,OAAO,0BAAoB,CAAC,CAAA,CACpDQ,EAAAA,CAAWR,IAAAA,CAAK,IAAM,OAAO,wBAAkB,CAAC,CAAA,CAChDS,EAAAA,CAAaT,IAAAA,CAAK,IAAM,OAAO,0BAAoB,CAAC,CAAA,CAEnDU,GACL9S,IAAAA,CAACwS,MAAAA,CAAA,CACC,QAAA,CAAA,CAAAtS,IAACuS,KAAAA,CAAA,CAAM,KAAA,CAAK,IAAA,CAAC,QAASvS,GAAAA,CAAC6S,QAAAA,CAAA,CAAS,EAAA,CAAG,MAAA,CAAO,CAAA,CAAI,CAAA,CAC9C7S,GAAAA,CAACuS,MAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAASvS,IAACwS,EAAAA,CAAA,EAAS,CAAA,CAAI,CAAA,CAC1CxS,IAACuS,KAAAA,CAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAASvS,GAAAA,CAACyS,EAAAA,CAAA,EAAW,EAAI,CAAA,CAChDzS,GAAAA,CAACuS,KAAAA,CAAA,CAAM,KAAK,MAAA,CAAO,OAAA,CAASvS,GAAAA,CAAC0S,EAAAA,CAAA,EAAS,CAAA,CAAI,CAAA,CAC1C1S,GAAAA,CAACuS,KAAAA,CAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAASvS,IAAC2S,EAAAA,CAAA,EAAW,CAAA,CAAI,CAAA,CAAA,CACpD,MCLIG,EAAAA,CAA8BrV,CAAAA,EAAS,CAC3C,GAAM,CAAE,WAAA,CAAAsV,CAAY,CAAA,CAAItV,CAAAA,CAClByN,EAAWC,WAAAA,EAAY,CACvB,CAAE,CAAA,CAAApN,CAAE,CAAA,CAAIC,GAAAA,EAAe,CAE7B,OACEgC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,SAAAA,GAAAA,CAACoH,MAAAA,CAAA,CACC,MAAA,CAAO,MACP,KAAA,CAAM,KAAA,CACN,QAAA,CAAUrJ,CAAAA,CAAE,mBAAmB,CAAA,CAC/B,KAAA,CACEgV,CAAAA,EACE/S,IAAC4H,MAAAA,CAAA,CACC,IAAA,CAAK,SAAA,CACL,QAAS,IAAM,CACbsD,CAAAA,CAAS6H,CAAW,EACtB,CAAA,CAEC,QAAA,CAAAhV,CAAAA,CAAE,qBAAqB,CAAA,CAC1B,CAAA,CAGN,CAAA,CACF,CAEJ,EAEOiV,EAAAA,CAAQF,GC1Bf,IAAM,CAAE,MAAA,CAAAG,EAAO,CAAA,CAAItG,MAAAA,CAEbuG,EAAAA,CAAuB,IAAM,CACjC,GAAM,CAAE,CAAA,CAAAnV,CAAE,CAAA,CAAIC,GAAAA,EAAe,CAEvBmV,CAAAA,CAA6C,CACjD,CACE,GAAA,CAAK,UAAA,CACL,KAAA,CAAOpV,EAAE,iBAAiB,CAAA,CAC1B,SAAA,CAAW,OAAA,CACX,MAAO,GACT,CAAA,CACA,CACE,GAAA,CAAK,OAAA,CACL,KAAA,CAAOA,CAAAA,CAAE,cAAc,EACvB,SAAA,CAAW,OAAA,CACX,KAAA,CAAO,GACT,EACA,CACE,GAAA,CAAK,QAAA,CACL,KAAA,CAAOA,EAAE,eAAe,CAAA,CACxB,SAAA,CAAW,QAAA,CACX,KAAA,CAAO,GACT,CAAA,CACA,CACE,IAAK,OAAA,CACL,KAAA,CAAOA,CAAAA,CAAE,cAAc,EACvB,SAAA,CAAW,OAAA,CACX,KAAA,CAAO,GACT,EACA,CACE,GAAA,CAAK,SAAA,CACL,KAAA,CAAOA,CAAAA,CAAE,gBAAgB,CAAA,CACzB,SAAA,CAAW,UACX,MAAA,CAAO0O,CAAAA,CAAe,CACpB,OAAOzM,IAACc,EAAAA,CAAA,CAAqB,QAAA,CAAA2L,CAAAA,CAAM,CACrC,CACF,CAAA,CACA,CACE,GAAA,CAAK,UAAA,CACL,KAAA,CAAO1O,CAAAA,CAAE,iBAAiB,EAC1B,SAAA,CAAW,UAAA,CACX,MAAA,CAAO0O,CAAAA,CAAe,CACpB,OAAOzM,GAAAA,CAACc,EAAAA,CAAA,CAAqB,SAAA2L,CAAAA,CAAM,CACrC,CACF,CAAA,CACA,CACE,GAAA,CAAK,eAAA,CACL,KAAA,CAAO1O,EAAE,qBAAqB,CAAA,CAC9B,SAAA,CAAW,OAAA,CACX,MAAO,GAAA,CACP,MAAA,CAAO0O,CAAAA,CAAe,CACpB,OAAO2G,EAAAA,CAAM3G,CAAK,CAAA,CAAE,MAAA,CAAO,qBAAqB,CAClD,CACF,CACF,EAEA,OACEzM,GAAAA,CAACqT,IAAAA,CAAA,CAAK,KAAA,CAAM,0BAAA,CACV,QAAA,CAAArT,GAAAA,CAACsT,EAAA,CAUC,UAAA,CAAW,oBAAA,CACX,MAAA,CAAO,IAAA,CACP,IAAA,CAAK,QAAA,CACL,OAAA,CAASH,EACT,WAAA,CAAY,OAAA,CACZ,OAAA,CAAS,CACP,IAAK,uBAAA,CACL,MAAA,CAAQ,KACV,CAAA,CACA,YAAanQ,CAAAA,GAAS,CACpB,KAAA,CAAOA,CAAAA,EAAM,KAAA,CACb,KAAA,CAAOA,CAAAA,EAAM,IACf,GACA,UAAA,CAAYmB,CAAAA,EACVrE,IAAAA,CAACwE,IAAAA,CAAA,CAAK,IAAA,CAAMH,CAAAA,CAAM,MAAA,CAAO,QAAA,CACvB,UAAAnE,GAAAA,CAACsE,IAAAA,CAAK,IAAA,CAAL,CAAU,KAAA,CAAOvG,CAAAA,CAAE,iBAAiB,CAAA,CAAG,KAAK,OAAA,CAC3C,QAAA,CAAAiC,GAAAA,CAACE,KAAAA,CAAA,CAAM,UAAA,CAAU,IAAA,CAAC,CAAA,CACpB,CAAA,CACAF,IAACsE,IAAAA,CAAK,IAAA,CAAL,CAAU,KAAA,CAAOvG,CAAAA,CAAE,cAAc,CAAA,CAAG,IAAA,CAAK,QACxC,QAAA,CAAAiC,GAAAA,CAACE,KAAAA,CAAA,CAAM,WAAU,IAAA,CAAC,CAAA,CACpB,CAAA,CACAF,GAAAA,CAACsE,KAAK,IAAA,CAAL,CAAU,KAAA,CAAOvG,CAAAA,CAAE,eAAe,CAAA,CAAG,IAAA,CAAK,QAAA,CACzC,SAAA+B,IAAAA,CAAC6M,MAAAA,CAAA,CAAO,UAAA,CAAU,KAAC,KAAA,CAAO,CAAE,KAAA,CAAO,OAAQ,EACzC,QAAA,CAAA,CAAA3M,GAAAA,CAACiT,EAAAA,CAAA,CAAO,KAAA,CAAM,KAAA,CAAM,QAAA,CAAA,KAAA,CAAG,CAAA,CACvBjT,IAACiT,EAAAA,CAAA,CAAO,KAAA,CAAM,MAAA,CAAO,gBAAI,CAAA,CAAA,CAC3B,CAAA,CACF,CAAA,CACAjT,GAAAA,CAACsE,KAAK,IAAA,CAAL,CAAU,KAAA,CAAOvG,CAAAA,CAAE,cAAc,CAAA,CAAG,IAAA,CAAK,OAAA,CACxC,SAAAiC,GAAAA,CAACE,KAAAA,CAAA,CAAM,UAAA,CAAU,KAAC,CAAA,CACpB,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,CACF,CAEJ,CAAA,CAEOqT,EAAAA,CAAQC,CAAAA,CAAYN,EAAAA,CAAkB,CAAE,QAAA,CAAU,IAAK,CAAC,2/lDC7G/D,IAAMO,EAAAA,CAAe,QAAA,CACfC,GAAiB,yBAAA,CAKvB,SAASC,EAAAA,CAAepO,CAAAA,CAAkB,CACxC,IAAMhE,CAAAA,CAAM,IAAI,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CACxCgE,EAAO,OAAA,CAAQqO,CAAAA,EAASrS,CAAAA,CAAI,YAAA,CAAa,OAAOqS,CAAK,CAAC,CAAA,CACtD,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,EAAC,CAAG,GAAIrS,CAAAA,CAAI,QAAA,EAAU,EACpD,CAKO,SAASsS,EAAAA,EAAiB,CAC/B,IAAMlP,EAAKC,CAAAA,EAAM,CACX,CAAE,QAAA,CAAAkP,CAAS,CAAA,CAAIlJ,CAAAA,EAAiB,CAEhCrF,EAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CACnDwO,CAAAA,CAASxO,CAAAA,CAAO,GAAA,CAAIkO,EAAY,CAAA,CAChCO,GAAAA,CAAsBzO,CAAAA,CAAO,GAAA,CAAI0O,GAAiB,CAAA,GAAMC,CAAAA,CAExD,CAACC,EAAgBC,CAAiB,CAAA,CAAI/V,QAAAA,CAAS2V,GAAmB,EAElE,CAAE,SAAA,CAAAnJ,GAAAA,CAAW,KAAA,CAAAxI,CAAM,CAAA,CAAIgS,QAAAA,CAAS,CACpC,QAAA,CAAUC,CAAAA,CAAU,IAAA,CAAK,WAAA,CAAYP,CAAM,EAC3C,OAAA,CAAS,SAAY,CACnB,GAAI,CACF,GAAM,CAAE,KAAA,CAAA9V,CAAM,EAAI,MAAM0G,CAAAA,CAAG,GAAA,CAAuB+O,EAAAA,CAAgB,CAChE,YAAA,CAAc,CAAE,MAAA,CAAQK,CAAQ,CAClC,CAAC,CAAA,CACD,OAAAD,EAAS7V,CAAK,CAAA,CACPA,CACT,CAAA,OAAE,CAEA0V,EAAAA,CAAe,CAACF,EAAY,CAAC,EAC/B,CACF,CAAA,CACA,OAAA,CAAS,CAAC,CAACM,CAAAA,CACX,KAAA,CAAO,KAAA,CACP,oBAAA,CAAsB,KAAA,CACtB,kBAAA,CAAoB,KACtB,CAAC,CAAA,CASD,OAAO,CACL,SAAA,CAAAlJ,GAAAA,CACA,KAAA,CAAAxI,CAAAA,CACA,cAAA,CAAA8R,EACA,mBAAA,CAX0B,IAAM,CAChCC,CAAAA,CAAkB,KAAK,CAAA,CACnBJ,GAAAA,EACFL,EAAAA,CAAe,CAACM,GAAiB,CAAC,EAEtC,CAOA,CACF,CCtDA,IAAMM,EAAAA,CAAgB,GAAA,CAChBC,GAAY,EAAA,CACZC,EAAAA,CAAa,GAAA,CAObC,EAAAA,CAA0B,CAAC,CAAE,KAAA,CAAAxF,CAAAA,CAAO,KAAA,CAAAhC,CAAM,CAAA,GAAM,CACpD,GAAM,CAAE,KAAA,CAAAjP,CAAAA,CAAO,YAAA,CAAAmP,CAAa,EAAIxC,CAAAA,EAAiB,CAC3C,CAAE,CAAA,CAAA7M,CAAE,CAAA,CAAIC,GAAAA,EAAe,CACvB,CAAE,SAAA,CAAA6M,CAAAA,CAAW,cAAA,CAAAsJ,CAAAA,CAAgB,oBAAAQ,CAAoB,CAAA,CAAId,EAAAA,EAAe,CAGpEe,EAAc,CAAA,EAAGC,CAAO,CAAA,eAAA,EAAkB,kBAAA,CAAmB,OAAO,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAElFC,GAAAA,CAA0C,CAC9C,YAAA,CAAc,CAAA,EAAGP,EAAa,CAAA,EAAA,CAChC,CAAA,CAEMQ,GAAAA,CAA8B,CAClC,MAAO,CAAA,EAAGR,EAAa,CAAA,EAAA,CAAA,CACvB,eAAA,CAAiB,4BACjB,UAAA,CAAY,oCACd,CAAA,CAEMS,CAAAA,CAAqC,CACzC,SAAA,CAAW,CAAA,EAAGP,EAAU,KAC1B,CAAA,CAEA,OAAI5J,CAAAA,CAEA7K,GAAAA,CAAC,OAAI,SAAA,CAAU,oDAAA,CACb,QAAA,CAAAA,GAAAA,CAACmH,KAAA,EAAK,CAAA,CACR,CAAA,CAIAlJ,CAAAA,CACK+B,GAAAA,CAAC6S,QAAAA,CAAA,CAAS,OAAA,CAAO,KAAC,EAAA,CAAIzF,CAAAA,CAAc,CAAA,CAI3CtN,IAAAA,CAAC,OAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,OAAI,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAAkP,CAAAA,CAAM,CAAA,CACtDlP,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BACb,QAAA,CAAAF,IAAAA,CAACC,KAAAA,CAAA,CAAM,MAAM,QAAA,CACX,QAAA,CAAA,CAAAC,GAAAA,CAAC+M,EAAAA,CAAA,CAAK,KAAA,CAAOyH,EAAAA,CAAW,CAAA,CACvBtH,CAAAA,EAASlN,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAsB,SAAAkN,CAAAA,CAAM,CAAA,CAAA,CACxD,CAAA,CACF,CAAA,CACAlN,IAAC,KAAA,CAAA,CACC,SAAA,CAAU,iHAAA,CACV,KAAA,CAAO8U,IAEP,QAAA,CAAA9U,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKiV,EAAAA,CACL,GAAA,CAAI,YAAA,CACJ,SAAA,CAAU,mCACV,KAAA,CAAO,CAAE,KAAA,CAAO,YAAA,CAAc,SAAU,MAAO,CAAA,CACjD,CAAA,CACF,CAAA,CACAjV,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,KAAA,CAAO+U,GAAAA,CAC/E,QAAA,CAAA/U,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,OAAA,CAAQ,KAAA,CAAOgV,CAAAA,CAC5B,QAAA,CAAAlV,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BAAA,CACb,QAAA,CAAA,CAAAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACZ,SAAAmU,CAAAA,EACCnU,GAAAA,CAACkV,KAAAA,CAAA,CACC,OAAM,IAAA,CACN,QAAA,CAAQ,IAAA,CACR,OAAA,CAASnX,EAAE,qBAAqB,CAAA,CAChC,IAAA,CAAK,OAAA,CACL,OAAA,CAAS4W,CAAAA,CACX,CAAA,CAEJ,CAAA,CACA3U,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,IAACW,UAAAA,CAAW,KAAA,CAAX,CAAiB,KAAA,CAAO,EAAI,QAAA,CAAA5C,CAAAA,CAAE,gBAAgB,CAAA,CAAE,CAAA,CACnD,CAAA,CACAiC,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC4H,MAAAA,CAAA,CAAO,KAAA,CAAK,IAAA,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAMgN,CAAAA,CAAa,MAAA,CAAO,OAAA,CAC/E,QAAA,CAAA7W,EAAE,wBAAwB,CAAA,CAC7B,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,EAEOoX,EAAAA,CAAQT","file":"index.js","sourcesContent":["import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, CSSProperties, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const { t } = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n const tagInputStyle: CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n style={tagInputStyle}\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n style={{ userSelect: 'none' }}\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n {t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import { Typography } from 'antd'\nimport type { ParagraphProps } from 'antd/es/typography/Paragraph'\nimport type { FC } from 'react'\nimport { useState } from 'react'\n\nexport type ExpandableParagraphProps = Omit<ParagraphProps, 'ellipsis' | 'className'>\n\nconst ExpandableParagraph: FC<ExpandableParagraphProps> = props => {\n const { children, ...restProps } = props\n const [expanded, setExpanded] = useState(false)\n\n return (\n <Typography.Paragraph\n {...restProps}\n className=\"mb-0\"\n ellipsis={{\n rows: 2,\n expandable: 'collapsible',\n expanded,\n onExpand: (_, info) => {\n setExpanded(info.expanded)\n },\n }}\n >\n {children}\n </Typography.Paragraph>\n )\n}\n\nexport default ExpandableParagraph\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { InfiniteListPayload } from './InfiniteList'\n\n// Infinite Query 更新函数类型\ntype InfiniteQueryRefetchFunction = () => void | Promise<unknown>\ntype InfiniteQueryFetchNextPageFunction = () => void | Promise<unknown>\n\n// InfiniteList 实例信息\ninterface InfiniteListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: InfiniteListPayload\n refetch: InfiniteQueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n// 简化的状态接口\ninterface InfiniteListState {\n // 实例管理\n instances: Map<string, InfiniteListInstance>\n\n // 核心方法\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: InfiniteQueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n ): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: InfiniteListPayload): void\n getPayload(id: string): InfiniteListPayload\n refetch(id: string, payload?: InfiniteListPayload): Promise<void>\n fetchNextPage(id: string): Promise<void>\n\n // 工具方法\n getInstance(id: string): InfiniteListInstance | undefined\n getAllInstances(): InfiniteListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<InfiniteListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch, fetchNextPage) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新函数\n if (existingInstance) {\n // 仅当引用发生变化时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch || existingInstance.fetchNextPage !== fetchNextPage) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n fetchNextPage,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: InfiniteListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n fetchNextPage,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n async fetchNextPage(id) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n // 调用 fetchNextPage 函数\n try {\n await instance.fetchNextPage()\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'infinite-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useInfiniteListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useInfiniteQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useInfiniteListStore } from './stores'\n\nexport interface InfiniteListPayload<Values = any> {\n page?: number\n filters?: Values\n}\n\nexport interface InfiniteListRequestConfig<Values = any> {\n url: string\n method?: 'GET' | 'POST'\n body?:\n | FormData\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => FormData | Record<string | number, any>)\n params?:\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => Record<string | number, any>)\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n // 缓存配置\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\nexport enum InfiniteListAction {\n Confirm,\n Reset,\n LoadMore,\n Init,\n}\n\nexport interface InfiniteListDataAdapter<Item = any, Values = any, Data = any> {\n items?: (data: Data[] | undefined, form: FormInstance<Values>) => Item[] | undefined\n hasMore?: (lastPage: Data | undefined, allPages: Data[]) => boolean\n nextPageParam?: (lastPage: Data | undefined, allPages: Data[], pageParam: any) => any\n}\n\nexport interface InfiniteListRef<Item = any, Values = any, Data = any> {\n data: Data[] | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n refetch: () => void\n fetchNextPage: () => void\n hasNextPage: boolean\n isFetchingNextPage: boolean\n}\n\nexport interface InfiniteListProps<Item, Values, Data>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选标识符,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n request: InfiniteListRequestConfig<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data[]) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: InfiniteListAction, form: FormInstance<Values>, data?: Data[]) => void\n afterError?: (error: Error, action: InfiniteListAction, form: FormInstance<Values>) => void\n dataAdapter?: InfiniteListDataAdapter<Item, Values, Data>\n initialPageParam?: any\n footer?: (data: Data[] | undefined) => ReactNode\n}\n\n// 常量定义(对齐 QueryList 行为)\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\nconst DEFAULT_STALE_TIME = 30 * 1000\n\nconst SPIN_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n}\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\nconst generateUniqueIdentifier = (): string => `infiniteList_${Date.now()}_${++identifierCounter}`\n\nconst InternalInfiniteList = <Item extends AnyObject, Values extends object | undefined = undefined, Data = any>(\n props: InfiniteListProps<Item, Values, Data>,\n ref: Ref<InfiniteListRef<Item, Values, Data>>,\n) => {\n const defaultDataAdapter: InfiniteListDataAdapter<Item, Values, Data> = {\n items: (data: Data[] | undefined) => {\n if (!data) return []\n return data.flatMap((page: any) => page?.list || page || [])\n },\n hasMore: (lastPage: Data | undefined): boolean => {\n if (!lastPage) return false\n const page = lastPage as any\n return page?.hasMore || page?.has_more || false\n },\n nextPageParam: (lastPage: Data | undefined, allPages: Data[], _pageParam: any): any => {\n const hasMore = (page: Data | undefined): boolean => {\n if (!page) return false\n const pageData = page as any\n return pageData?.hasMore || pageData?.has_more || false\n }\n return hasMore(lastPage) ? allPages.length : undefined\n },\n }\n\n const internalProps: InfiniteListProps<Item, Values, Data> & {\n refreshInterval: number\n initialPageParam: any\n } = {\n refreshInterval: 0,\n initialPageParam: 0,\n ...props,\n dataAdapter: {\n ...defaultDataAdapter,\n ...props.dataAdapter,\n },\n }\n\n const {\n identifier,\n code,\n buttonsAlign,\n showReset,\n refreshInterval,\n request,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n dataAdapter,\n initialPageParam,\n footer,\n form,\n ...tableProps\n } = internalProps\n const { t } = useTranslation()\n const [_form] = Form.useForm<Values>(form)\n const [isValid, setIsValid] = useState(false)\n const shouldPoll = useRef(false)\n const action = useRef(InfiniteListAction.Init)\n const ky = useKy()\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n // 生成或使用提供的 identifier\n const finalIdentifier = useMemo(() => identifier || generateUniqueIdentifier(), [identifier])\n\n // 订阅当前 identifier 的 payload,驱动 queryKey 与渲染\n const subscribedPayload = useInfiniteListStore(s => s.getPayload(finalIdentifier))\n\n // 获取当前表单值\n const formInstance = useMemo(() => _form, [_form])\n\n // 构建请求参数\n const {\n url,\n method = 'GET',\n body,\n params,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = request\n const requestHeaders = useMemo(\n () => (typeof headers === 'function' ? headers(formInstance) : headers),\n [headers, formInstance],\n )\n // 请求参数和 body 将在 queryFn 中动态构建,因为它们依赖于 pageParam\n\n // 构建查询键\n const queryKey = useMemo(() => {\n return ['infiniteList', url, finalIdentifier, accessible, isValid, subscribedPayload, requestHeaders]\n }, [url, finalIdentifier, accessible, isValid, subscribedPayload, requestHeaders])\n\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage, refetch, isFetching } = useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = initialPageParam }) => {\n try {\n const payload = subscribedPayload\n\n // 动态构建请求参数,包含 pageParam\n const requestParams = typeof params === 'function' ? params(payload, pageParam) : params\n const requestBody = typeof body === 'function' ? body(payload, pageParam) : body\n\n const kyOptions: KyOptions = {\n method: method as any,\n searchParams: requestParams,\n headers: requestHeaders,\n }\n\n if (requestBody) {\n if (requestBody instanceof FormData) {\n kyOptions.body = requestBody\n } else {\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, [response])\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n initialPageParam,\n getNextPageParam: (lastPage: Data, allPages: Data[]) => {\n return dataAdapter?.nextPageParam?.(lastPage, allPages, initialPageParam)\n },\n enabled: accessible && isValid,\n retry: (failureCount, retryError) => {\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n gcTime: cacheTime,\n staleTime,\n })\n\n // 在组件挂载时注册实例\n useEffect(() => {\n useInfiniteListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch, fetchNextPage)\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url, queryKey, refetch, fetchNextPage])\n\n const dataSource = dataAdapter?.items?.(data?.pages, formInstance)\n const isLoadingMore = isFetchingNextPage\n const isReachingEnd = !hasNextPage\n const isEmpty = !dataSource || dataSource.length === 0\n\n const onConfirm = async () => {\n action.current = InfiniteListAction.Confirm\n const values = await _form.getFieldsValue()\n\n try {\n await _form.validateFields()\n setIsValid(true)\n\n // 更新 store 中的 payload\n useInfiniteListStore.getState().refetch(finalIdentifier, { page: 0, filters: values })\n } catch {\n setIsValid(false)\n }\n }\n\n const loadMore = () => {\n action.current = InfiniteListAction.LoadMore\n fetchNextPage()\n }\n\n const onReset = async () => {\n action.current = InfiniteListAction.Reset\n try {\n _form.resetFields()\n const values = await _form.getFieldsValue()\n\n // 重置 store 中的 payload\n useInfiniteListStore.getState().updatePayload(finalIdentifier, { page: 0, filters: values })\n\n await _form.validateFields({ validateOnly: true })\n useInfiniteListStore.getState().refetch(finalIdentifier)\n } catch {\n // Handle validation error\n }\n }\n\n useEffect(() => {\n setTimeout(() => {\n if (accessible) {\n _form\n .validateFields({ validateOnly: true })\n .then(values => {\n setIsValid(true)\n\n // 初始化 store 中的 payload\n useInfiniteListStore.getState().updatePayload(finalIdentifier, { page: 0, filters: values })\n })\n .catch(() => {\n setIsValid(false)\n })\n }\n }, 300)\n }, [accessible, _form, finalIdentifier])\n\n useImperativeHandle(ref, () => ({\n data: data?.pages,\n dataSource,\n form: _form,\n refetch: () => useInfiniteListStore.getState().refetch(finalIdentifier),\n fetchNextPage: () => useInfiniteListStore.getState().fetchNextPage(finalIdentifier),\n hasNextPage: !!hasNextPage,\n isFetchingNextPage,\n }))\n\n if (isChecking) {\n return <Spin style={SPIN_STYLE} />\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data?.pages)}</> : undefined\n\n const renderTableExtra = () => {\n if (typeof tableExtra === 'function') {\n return tableExtra(formInstance, data?.pages)\n }\n return tableExtra\n }\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isFetching}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(_form) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={_form} />\n )\n\n return (\n <>\n {formRenderer}\n {renderTableExtra()}\n <div style={{ minHeight: '400px' }}>\n <Table {...tableProps} dataSource={dataSource} loading={isFetching} pagination={false} footer={renderFooter} />\n </div>\n {!isEmpty && (\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n )}\n </>\n )\n}\n\nconst InfiniteList = forwardRef(InternalInfiniteList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: InfiniteListProps<Item, Values, Data> & { ref?: Ref<InfiniteListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default InfiniteList\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n (set, get) => ({\n openKeys: [],\n setOpenKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (current.openKeys.length !== keys.length || !current.openKeys.every((key, index) => key === keys[index])) {\n set({ openKeys: keys })\n }\n },\n selectedKeys: [],\n setSelectedKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (\n current.selectedKeys.length !== keys.length ||\n !current.selectedKeys.every((key, index) => key === keys[index])\n ) {\n set({ selectedKeys: keys })\n }\n },\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n // 减少持久化频率,提升性能\n skipHydration: false,\n version: 1,\n },\n ),\n)\n","import type { ItemType, MenuDividerType } from 'antd/es/menu/interface'\nimport { memo } from 'react'\nimport { Link } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\n\nimport type { NavItem, NavMenuItemGroupType, NavMenuItemType, NavSubMenuType } from './types'\n\n// 优化 Link 组件,避免重复创建\nconst MemoizedLink = memo(({ to, children }: { to: string; children: React.ReactNode }) => (\n <Link to={to}>{children}</Link>\n))\n\nMemoizedLink.displayName = 'MemoizedLink'\n\n// 将自定义的菜单配置转换为 antd 的菜单配置,添加 react-router-dom Link 等。\nexport function transformItems(items?: NavItem[]) {\n const result: ItemType[] = []\n\n if (items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null || (items[i] as MenuDividerType).type === 'divider') {\n result[i] = items[i] as null | MenuDividerType\n } else if ((items[i] as NavSubMenuType | NavMenuItemGroupType).children) {\n const { children, ...rest } = items[i] as NavSubMenuType | NavMenuItemGroupType\n result[i] = {\n ...rest,\n children: transformItems(children),\n }\n } else {\n const { route, label, ...rest } = items[i] as NavMenuItemType\n const labelNode = route ? <MemoizedLink to={route}>{label}</MemoizedLink> : label\n\n result[i] = {\n ...rest,\n label: labelNode,\n }\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nexport function flatItems(\n items: NavItem[],\n result: Merge<NavMenuItemType, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n): Merge<NavMenuItemType, { keypath?: string[] }>[] {\n for (const item of items) {\n const children = (item as NavSubMenuType | NavMenuItemGroupType)?.children as NavItem[]\n\n if (Array.isArray(children)) {\n const keys =\n (item as NavMenuItemGroupType).type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, keys)\n } else if (item) {\n result.push({ ...(item as NavMenuItemType), keypath })\n }\n }\n\n return result\n}\n","import type { MenuProps } from 'antd'\nimport { Menu, Spin } from 'antd'\nimport { useEffect } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { useNavStore } from './stores'\nimport type { NavItem } from './types'\nimport { flatItems, transformItems } from './utils'\n\nexport interface NavProps {\n items?: NavItem[]\n theme?: MenuProps['theme']\n loading?: boolean\n}\n\nconst Nav = (props: NavProps) => {\n const { items = [], theme, loading } = props\n const location = useLocation()\n\n const flattenItems = flatItems(items)\n const internalItems = transformItems(items)\n\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n useEffect(() => {\n const match = flattenItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n\n // 使用 getState() 获取最新状态,避免将状态值作为 useEffect 依赖项,\n // 从而防止不必要的 Effect 执行循环\n const { selectedKeys: currentSelectedKeys, openKeys: currentOpenKeys } = useNavStore.getState()\n\n if (currentSelectedKeys[0] !== key) {\n setSelectedKeys([key])\n }\n\n // 只在 keypath 不在 openKeys 中时才添加,保留其他已展开的菜单\n const missingKeys = keypath.filter(k => !currentOpenKeys.includes(k))\n if (missingKeys.length > 0) {\n setOpenKeys([...currentOpenKeys, ...missingKeys])\n }\n }\n }, [flattenItems, location.pathname, setOpenKeys, setSelectedKeys])\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center\" style={{ height: 'calc(100vh - 64px)' }}>\n <Spin />\n </div>\n )\n }\n\n return (\n <Menu\n theme={theme}\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={setOpenKeys}\n />\n )\n}\n\nexport default Nav\n","import { Empty, Spin } from 'antd'\nimport type { CSSProperties, FC, PropsWithChildren } from 'react'\nimport { Fragment, memo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionVersion } from '@/constants'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\n// 提取样式常量,避免每次渲染创建新对象\nconst LOADING_CONTAINER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 400,\n}\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const { permissionVersion, appId, isGlobal, requireGame } = useToolkitsStore()\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n // 早期返回:如果不需要游戏选择,直接返回 children\n if (!requireGame) {\n return <>{children}</>\n }\n\n // 加载状态\n if (isLoading) {\n return (\n <div style={LOADING_CONTAINER_STYLE}>\n <Spin />\n </div>\n )\n }\n\n // V1 版本或全局权限直接显示内容\n if (permissionVersion === PermissionVersion.V1 || isGlobal) {\n return <>{children}</>\n }\n\n // 未选择游戏时显示空状态\n if (!appId) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n }\n\n // 正常情况:使用 Fragment 包裹 children,key 用于在切换游戏时重置组件状态\n return <Fragment key={appId}>{children}</Fragment>\n}\n\n// 使用 memo 优化性能,避免不必要的重渲染\nexport default memo(RequireGame)\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC, KeyboardEvent } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nconst UserDropdown: FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { user, loginPath, clear } = useToolkitsStore()\n\n const handleSignOut = () => {\n clear()\n navigate(loginPath)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSignOut()\n }\n }\n\n const handleDropdownKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n icon: <LogoutOutlined />,\n label: (\n <a role=\"button\" tabIndex={0} onClick={handleSignOut} onKeyDown={handleKeyDown}>\n {t('UserDropdown.signOutText')}\n </a>\n ),\n },\n ]\n\n return (\n <div>\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n <a\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.preventDefault()\n }}\n onKeyDown={handleDropdownKeyDown}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserDropdown\n","import { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect, useMemo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nconst { Text } = Typography\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options } = props\n const { t } = useTranslation()\n const { gameApiV2, appId, setAppId } = useToolkitsStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n\n const filteredData = useMemo(\n () => data?.filter((item: Game) => filter?.(item as T) ?? true) as T[] | undefined,\n [data, filter],\n )\n\n const selectOptions = useMemo(\n () =>\n typeof options === 'function'\n ? options(filteredData)\n : filteredData?.map((item: T) => ({\n label: item.name,\n value: gameApiV2 ? item.game_id : item.id,\n })),\n [options, filteredData, gameApiV2],\n )\n\n // 切换游戏时清空 TanStack Query 缓存触发重新请求以更新视图。\n const handleChange = (value: string | number) => {\n // 标记除游戏列表外的所有缓存为过期,保留现有数据直到新数据加载完成\n queryClient.invalidateQueries({\n predicate: query => {\n const queryKey = query.queryKey\n return !queryKey.includes('/api/game/list') && !queryKey.includes('/api/usystem/game/all')\n },\n })\n setAppId(value)\n }\n\n useEffect(() => {\n // 数据还在加载中时,不要修改 appId\n if (isLoading) return\n\n if (selectOptions && selectOptions.length > 0) {\n const hasValidAppId = appId && selectOptions.some(item => String(item.value) === String(appId))\n\n // 只有当 appId 无效时才设置为第一个选项\n if (!hasValidAppId) {\n setAppId(selectOptions[0]?.value ?? undefined)\n }\n } else if (selectOptions === undefined || selectOptions.length === 0) {\n // 如果没有选项,则清空当前游戏 ID\n setAppId(undefined)\n }\n }, [selectOptions, isLoading])\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={appId as string | number | undefined}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n style={{ width: '250px' }}\n options={selectOptions}\n onChange={handleChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { DetailedHTMLProps, FC, ImgHTMLAttributes } from 'react'\n\nimport logoUrl from './logo.png'\n\nexport type LogoProps = Omit<DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, 'src' | 'alt'>\n\nconst Logo: FC<LogoProps> = props => {\n return <img src={logoUrl} alt=\"logo\" {...props} />\n}\n\nexport default Logo\n","import { memo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitsStore } from '../toolkitsProvider'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n}\n\nconst TRANSITION_EASING = 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)'\n\nconst LayoutHeader = memo<LayoutHeaderProps>(({ title, subtitle }) => {\n const { mainPagePath, collapsed } = useToolkitsStore()\n\n return (\n <div\n className=\"px-6 py-2 font-bold relative bg-gradient-to-r from-white to-gray-50/30\"\n style={{\n height: 'auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n >\n <div className={`flex items-center w-full ${collapsed ? 'justify-center' : ''}`}>\n <Link\n to={mainPagePath}\n className=\"hover:opacity-80 transition-all duration-300 ease-out block rounded-lg p-1 hover:bg-white/50 hover:shadow-sm\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0.8 : 1,\n }}\n >\n <Logo\n width={36}\n style={{\n objectFit: 'contain',\n display: 'block',\n filter: 'drop-shadow(0 1px 1px rgba(0, 0, 0, 0.05))',\n transition: TRANSITION_EASING,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml-4 overflow-hidden min-w-0\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0 : 1,\n width: collapsed ? '0px' : 'auto',\n marginLeft: collapsed ? '0px' : '16px',\n transform: collapsed ? 'translateX(-8px)' : 'translateX(0)',\n }}\n >\n <Link\n to={mainPagePath}\n className=\"text-xl leading-tight hover:text-blue-600 transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block bg-gradient-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent hover:from-blue-600 hover:to-blue-500\"\n title={title}\n style={{\n letterSpacing: '0.02em',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n }}\n >\n {title}\n </Link>\n </div>\n )}\n </div>\n <div\n className=\"w-full mt-2 overflow-hidden\"\n style={{\n height: subtitle && !collapsed ? '20px' : '1px',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex items-center justify-center h-full w-full\">\n <div\n className=\"w-full border-t border-gray-200 absolute\"\n style={{\n opacity: !subtitle || collapsed ? 1 : 0,\n transition: TRANSITION_EASING,\n }}\n />\n {subtitle && (\n <div\n className=\"flex items-center w-full text-sm\"\n style={{\n opacity: collapsed ? 0 : 1,\n transform: collapsed ? 'translateY(-3px)' : 'translateY(0)',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex-1 border-t border-gray-200\"></div>\n <span className=\"px-3 text-gray-500 font-medium whitespace-nowrap\" title={subtitle}>\n {subtitle}\n </span>\n <div className=\"flex-1 border-t border-gray-200\"></div>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n})\n\nLayoutHeader.displayName = 'LayoutHeader'\n\nexport default LayoutHeader\n","import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'\nimport { Button, Divider, Layout as AntdLayout, Space, Spin, theme } from 'antd'\nimport type { CSSProperties, Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\n\nimport type { NavItem } from '@/components/nav'\nimport { Nav } from '@/components/nav'\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { UserDropdown } from '@/components/userDropdown'\n\nimport type { GameSelectProps } from './GameSelect'\nimport GameSelect from './GameSelect'\nimport LayoutHeader from './LayoutHeader'\nimport type { Game } from './types'\n\nconst { Header, Sider, Content } = AntdLayout\n\nconst HEADER_HEIGHT = 64\nconst CONTENT_PADDING = '24px 16px'\nconst HEADER_PADDING = '0 24px'\nconst SPINNER_HEIGHT = 200\n\ntype HeaderExtra = { key: Key; children: ReactNode }\n\nexport interface LayoutProps<T extends Game = Game> {\n title?: string\n subtitle?: string\n isMenuLoading?: boolean\n items?: NavItem[]\n gameSelectFilter?: GameSelectProps<T>['filter']\n gameSelectOptions?: GameSelectProps<T>['options']\n hideGameSelect?: boolean\n headerExtra?: {\n left?: HeaderExtra[]\n right?: HeaderExtra[]\n }\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const {\n isMenuLoading,\n items,\n headerExtra,\n children,\n gameSelectFilter,\n gameSelectOptions,\n title,\n subtitle,\n hideGameSelect,\n } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { navWidth, collapsible, collapsed, toggleCollapsed, requireGame } = useToolkitsStore()\n\n const showGameSelect = !hideGameSelect && requireGame\n\n const siderStyle: CSSProperties = {\n height: '100vh',\n overflowX: 'hidden',\n overflowY: 'auto',\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }\n\n const headerStyle: CSSProperties = {\n padding: HEADER_PADDING,\n background: colorBgContainer,\n }\n\n const contentStyle: CSSProperties = {\n overflow: 'auto',\n padding: CONTENT_PADDING,\n maxHeight: `calc(100vh - ${HEADER_HEIGHT}px)`,\n }\n\n const spinnerStyle: CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: `${SPINNER_HEIGHT}px`,\n }\n\n return (\n <AntdLayout>\n <Sider\n collapsible={collapsible}\n theme=\"light\"\n trigger={null}\n collapsed={collapsed}\n width={navWidth}\n style={siderStyle}\n >\n <LayoutHeader title={title} subtitle={subtitle} />\n <Nav items={items} loading={isMenuLoading} />\n </Sider>\n <AntdLayout>\n <Header style={headerStyle}>\n <div className=\"flex justify-between items-center h-full\">\n <Space size=\"small\" split={<Divider type=\"vertical\" />} className=\"mr-6\">\n {collapsible && (\n <Button\n type=\"text\"\n icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n style={{ fontSize: '16px' }}\n onClick={toggleCollapsed}\n />\n )}\n {showGameSelect && <GameSelect<T> filter={gameSelectFilter} options={gameSelectOptions} />}\n {headerExtra?.left?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n </Space>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {headerExtra?.right?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n <UserDropdown />\n </Space>\n </div>\n </Header>\n <Content style={contentStyle}>\n <Suspense fallback={<Spin style={spinnerStyle} />}>\n <RequireGame>{children}</RequireGame>\n </Suspense>\n </Content>\n </AntdLayout>\n </AntdLayout>\n )\n}\n\nexport default Layout\n","import { Button, Result, Spin } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: KyOptions\n /** 无权限时点击返回按钮跳转的路径,默认为首页 '/' */\n redirectPath?: string\n}\n\n/**\n * 授权保护组件\n * 根据权限码控制子组件的访问权限\n * - 有权限:渲染子组件\n * - 无权限:显示 403 无权限页面,可点击按钮返回指定路径\n * - 加载中:显示加载动画\n */\nconst RequireAuth: FC<PropsWithChildren<RequireAuthProps>> = props => {\n const { code, config, redirectPath = '/', children } = props\n const { data: accessible, isLoading } = useAuth(code, config)\n const { t } = useTranslation()\n const navigate = useNavigate()\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return (\n <Result\n status=\"403\"\n subTitle={t('global.noEntitlement')}\n extra={\n <Button type=\"primary\" onClick={() => navigate(redirectPath)}>\n {t('global.back')}\n </Button>\n }\n />\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireAuth\n","import { createVisibilityStore } from '@/utils'\n\nexport const useDrawerStore = createVisibilityStore()\n","import type { DrawerProps } from 'antd'\nimport { Button, Drawer } from 'antd'\nimport type { ComponentProps, ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useDrawerStore } from './stores'\n\nexport interface UseDrawerOperation {\n hide: () => void\n}\n\nexport interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {\n content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n footer?: ReactNode | null\n confirmText?: string\n cancelText?: string\n confirmButtonProps?: ComponentProps<typeof Button>\n cancelButtonProps?: ComponentProps<typeof Button>\n}\n\nexport function useDrawer(props: UseDrawerProps) {\n const {\n content,\n onConfirm,\n afterOpen,\n afterClose,\n footer,\n confirmText = '确认',\n cancelText = '取消',\n confirmButtonProps,\n cancelButtonProps,\n ...drawerProps\n } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useDrawerStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onClose: DrawerProps['onClose'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const handleConfirm = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } catch (error) {\n console.error('Drawer confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm])\n\n const drawerFooter: DrawerProps['footer'] =\n footer !== undefined ? (\n <>{footer}</>\n ) : (\n <div className=\"flex gap-4 mx-4\">\n <Button type=\"primary\" loading={confirmLoading} {...confirmButtonProps} onClick={handleConfirm}>\n {confirmText}\n </Button>\n <Button {...cancelButtonProps} onClick={onClose}>\n {cancelText}\n </Button>\n </div>\n )\n\n const internalDrawer = (\n <Drawer {...drawerProps} open={open} footer={drawerFooter} onClose={onClose}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Drawer>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n confirmLoading,\n drawer: internalDrawer,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useDrawer, type UseDrawerOperation, type UseDrawerProps } from './drawer'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormDrawerReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n drawer: ReactNode\n}\n\nexport function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormDrawerProps<Values, ExtraValues>,\n): UseFormDrawerReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...drawerProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, drawer } = useDrawer({\n ...drawerProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? <>{content(internalExtraValues, operation)}</> : <>{content}</>}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n drawer,\n }\n}\n","import { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\nexport default (\n <Routes>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </Routes>\n)\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nconst UserList = lazy(() => import('./pages/userList'))\nconst UserDetail = lazy(() => import('./pages/userDetail'))\nconst RoleList = lazy(() => import('./pages/roleList'))\nconst RoleDetail = lazy(() => import('./pages/roleDetail'))\n\nexport default (\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"user/:id\" element={<UserDetail />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n)\n","import { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\n\ninterface NotFoundProps {\n redirectUrl?: string\n}\n\nconst NotFound: FC<NotFoundProps> = props => {\n const { redirectUrl } = props\n const navigate = useNavigate()\n const { t } = useTranslation()\n\n return (\n <div className=\"text-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n redirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(redirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Form, Input, Select } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\n\nimport { ExpandableParagraph } from '@/components/expandableParagraph'\nimport { QueryList } from '@/components/queryList'\nimport { withContext } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nimport type { OperationLogListItem } from './types'\n\nconst { Option } = Select\n\nconst OperationLogList: FC = () => {\n const { t } = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n width: 200,\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n { List: OperationLogListItem[]; Total: number }\n >\n identifier=\"operation-log-list\"\n rowKey=\"id\"\n code=\"300001\"\n columns={columns}\n tableLayout=\"fixed\"\n request={{\n url: '/api/usystem/log/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.Total,\n items: data?.List,\n })}\n renderForm={form => (\n <Form form={form} layout=\"inline\">\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear style={{ width: '100px' }}>\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default withContext(OperationLogList, { isGlobal: true })\n","import { useQuery } from '@tanstack/react-query'\nimport { useState } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { TRUE, UNREGISTERED_FLAG } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\n// 常量定义\nconst TICKET_PARAM = 'ticket'\nconst LOGIN_ENDPOINT = '/api/usystem/user/login'\n\n/**\n * 清除 URL 中的查询参数\n */\nfunction clearUrlParams(params: string[]) {\n const url = new URL(window.location.href)\n params.forEach(param => url.searchParams.delete(param))\n window.history.replaceState({}, '', url.toString())\n}\n\n/**\n * 处理登录页面的票据逻辑和未注册用户提示\n */\nexport function useTicketLogin() {\n const ky = useKy()\n const { setToken } = useToolkitsStore()\n\n const params = new URLSearchParams(window.location.search)\n const ticket = params.get(TICKET_PARAM)\n const unregisteredFromUrl = params.get(UNREGISTERED_FLAG) === TRUE\n\n const [isUnregistered, setIsUnregistered] = useState(unregisteredFromUrl)\n\n const { isLoading, error } = useQuery({\n queryKey: queryKeys.auth.ticketLogin(ticket),\n queryFn: async () => {\n try {\n const { token } = await ky.get<{ token: string }>(LOGIN_ENDPOINT, {\n searchParams: { ticket: ticket! },\n })\n setToken(token)\n return token\n } finally {\n // 无论成功或失败都清除 ticket 参数\n clearUrlParams([TICKET_PARAM])\n }\n },\n enabled: !!ticket,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })\n\n const dismissUnregistered = () => {\n setIsUnregistered(false)\n if (unregisteredFromUrl) {\n clearUrlParams([UNREGISTERED_FLAG])\n }\n }\n\n return {\n isLoading,\n error,\n isUnregistered,\n dismissUnregistered,\n }\n}\n","import { Alert, Button, Space, Spin, Typography } from 'antd'\nimport type { CSSProperties, FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { SSO_URL } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport backgroundUrl from './background.svg'\nimport { useTicketLogin } from './hooks'\n\n// 常量定义\nconst SIDEBAR_WIDTH = 500\nconst LOGO_SIZE = 48\nconst TOP_OFFSET = -10\n\ninterface SignInProps {\n extra?: ReactNode\n title?: string\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title }) => {\n const { token, mainPagePath } = useToolkitsStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n // 构建 SSO 登录 URL\n const ssoLoginUrl = `${SSO_URL}/login?service=${encodeURIComponent(window.location.href)}`\n\n const backgroundContainerStyle: CSSProperties = {\n paddingRight: `${SIDEBAR_WIDTH}px`,\n }\n\n const sidebarStyle: CSSProperties = {\n width: `${SIDEBAR_WIDTH}px`,\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n borderLeft: '1px solid rgba(229, 231, 235, 0.5)',\n }\n\n const contentWrapperStyle: CSSProperties = {\n marginTop: `${TOP_OFFSET}rem`,\n }\n\n if (isLoading) {\n return (\n <div className=\"w-screen h-screen flex justify-center items-center\">\n <Spin />\n </div>\n )\n }\n\n if (token) {\n return <Navigate replace to={mainPagePath} />\n }\n\n return (\n <div className=\"w-screen h-screen relative overflow-hidden\">\n <div className=\"absolute top-16 right-16 z-10\">{extra}</div>\n <div className=\"absolute left-14 top-6 z-10\">\n <Space align=\"center\">\n <Logo width={LOGO_SIZE} />\n {title && <span className=\"text-2xl font-bold\">{title}</span>}\n </Space>\n </div>\n <div\n className=\"w-full h-full flex justify-center items-center bg-linear-to-br from-blue-50/30 via-indigo-50/30 to-purple-50/30\"\n style={backgroundContainerStyle}\n >\n <img\n src={backgroundUrl}\n alt=\"background\"\n className=\"max-w-full h-auto object-contain\"\n style={{ width: '83.333333%', maxWidth: '100%' }}\n />\n </div>\n <div className=\"fixed top-0 right-0 h-screen backdrop-blur-sm shadow-2xl\" style={sidebarStyle}>\n <div className=\"flex justify-center items-center h-full\">\n <div className=\"px-36\" style={contentWrapperStyle}>\n <div className=\"flex flex-col justify-center\">\n <div className=\"h-10 mb-4\">\n {isUnregistered && (\n <Alert\n banner\n closable\n message={t('SignIn.unregistered')}\n type=\"error\"\n onClose={dismissUnregistered}\n />\n )}\n </div>\n <div className=\"mb-4 text-center\">\n <Typography.Title level={2}>{t('SignIn.welcome')}</Typography.Title>\n </div>\n <div className=\"flex justify-center items-center\">\n <Button block type=\"primary\" size=\"large\" shape=\"round\" href={ssoLoginUrl} target=\"_self\">\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {c}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=menuItemList-
|
|
1
|
+
import {c}from'./chunk-F3OT6ENF.js';import {c as c$1,e,b as b$1}from'./chunk-IWPBGSXS.js';import {a}from'./chunk-S4LUEDFA.js';import {b}from'./chunk-SMBHLRAO.js';import {m}from'./chunk-3ZT3BOPJ.js';import {App,Card,Space,Button,Popconfirm}from'antd';import {useNavigate}from'react-router-dom';import {jsx,Fragment,jsxs}from'react/jsx-runtime';var M=m(()=>{let{t:n}=a(),{message:y}=App.useApp(),f=c(),{refetch:g}=c$1(),{refetch:h}=b(),m=useNavigate();return jsx(Fragment,{children:jsx(Card,{title:"\u83DC\u5355\u7BA1\u7406",extra:jsx(Button,{type:"primary",onClick:()=>{m("./create");},children:"\u521B\u5EFA\u83DC\u5355\u9879"}),children:jsx(e,{identifier:"menu-item-list",onePage:true,code:"9900001",rowKey:"id",columns:[{title:"\u83DC\u5355\u540D\u79F0",dataIndex:"category",key:"category"},{title:"\u524D\u7AEF\u8DEF\u7531",dataIndex:"front_route"},{title:"Order",dataIndex:"order"},{title:"Is Common",dataIndex:"is_common",key:"is_common",render:o=>o?"\u662F":"\u5426"},{title:"\u6A21\u677F\u540D\u79F0",dataIndex:"model_name",key:"model_name"},{title:"\u64CD\u4F5C",key:"action",width:150,align:"center",render(o,t){return t.is_model?jsxs(Space,{size:"small",children:[jsx(Button,{type:"link",onClick:()=>{m(`./update/${t.id}`);},children:n("global.update")}),jsx(Popconfirm,{title:"\u5220\u9664\u83DC\u5355",placement:"topRight",description:jsxs(b$1,{texts:[t.category],children:["\u786E\u5B9A\u8981\u5220\u9664\u83DC\u5355 ",t.category," \u5417\uFF1F"]}),onConfirm:async()=>{await f.mutateAsync(t.id),g("menu-item-list"),h(),y.success("\u5220\u9664\u6210\u529F");},children:jsx(Button,{danger:true,type:"link",size:"small",children:n("global.delete")})})]}):null}}],request:{url:"/api/usystem/menu/list",method:"GET"},dataAdapter:o=>({items:o})})})})},{isGlobal:true}),G=M;export{G as default};//# sourceMappingURL=menuItemList-4ZLZ7HSG.js.map
|
|
2
|
+
//# sourceMappingURL=menuItemList-4ZLZ7HSG.js.map
|