diff --git a/pywxdump/__init__.py b/pywxdump/__init__.py index 5b7d679..68d488f 100644 --- a/pywxdump/__init__.py +++ b/pywxdump/__init__.py @@ -22,4 +22,4 @@ except: VERSION_LIST = {} VERSION_LIST_PATH = None -__version__ = "2.3.29" +__version__ = "2.4.0" diff --git a/pywxdump/cli.py b/pywxdump/cli.py index 111cd4e..cd7b024 100644 --- a/pywxdump/cli.py +++ b/pywxdump/cli.py @@ -8,6 +8,7 @@ import argparse import os import sys +import time from pywxdump import * import pywxdump @@ -291,7 +292,8 @@ class MainAll(): # 获取微信信息 save_path = args.save_path WxInfo = read_info(VERSION_LIST, True, save_path) - + if isinstance(WxInfo, str): # 如果返回的是字符串,则表示出错 + return for user in WxInfo: key = user.get("key", "") if not key: @@ -365,14 +367,15 @@ class MainAll(): # 合并所有的数据库 print(f"[*] 合并数据库中...(用时较久,耐心等待)") merge_save_path = merge_db(parpare_merge_db_path, os.path.join(out_path, "merge_all.db")) - - FileStorage_path = os.path.join(filePath, "FileStorage") if filePath else "FileStorage" - + time.sleep(1) + print(f"[+] 合并完成:{merge_save_path}") + print("=" * 32) # # 查看聊天记录 args.msg_path = merge_save_path args.micro_path = merge_save_path args.media_path = merge_save_path - args.filestorage_path = FileStorage_path + args.wxid_path = filePath + args.my_wxid = wxid MainShowChatRecords().run(args) diff --git a/pywxdump/server.py b/pywxdump/server.py index 4805bb9..6e8daa9 100644 --- a/pywxdump/server.py +++ b/pywxdump/server.py @@ -19,12 +19,12 @@ CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=True) # 允 @app.before_request def before_request(): - path = r"D:\_code\py_code\test\a2023\b0821wxdb\merge_wfwx_db\kkWxMsg\MSG_all.db" + path = r"****.db" g.msg_path = path g.micro_path = path g.media_path = path - g.wxid_path = r"C:\Users\xaoyo\Documents\Tencent\WeChat Files\wxid_vzzcn5fevion22" - g.my_wxid = "wxid_vzzcn5fevion22" + g.wxid_path = r"*****" + g.my_wxid = "******" g.tmp_path = "dist" # 临时文件夹,用于存放图片等 g.user_list = [] diff --git a/pywxdump/ui/web/assets/AboutView-MhlltB0I.js b/pywxdump/ui/web/assets/AboutView-MhlltB0I.js new file mode 100644 index 0000000..6194749 --- /dev/null +++ b/pywxdump/ui/web/assets/AboutView-MhlltB0I.js @@ -0,0 +1,24 @@ +import{_ as l,a as i,b as m,c as r,e as t,f as a,g as s,m as e,h as o}from"./index-ct5HAHRh.js";const u=""+new URL("qq-iQ8jIM6k.png",import.meta.url).href,c=""+new URL("qrcode_gh-wCDAugtE.jpg",import.meta.url).href,d={},y={class:"about"},n={id:"-center-pywxdump-center-"},x=e('
FAQ
。 逍遥之芯
(右边二维码) ,回复:PyWxDump
获取图文教程。 qq交流群:577704006(左边二维码) or 点击链接加入群聊pywxdump功能交流。
(因为qq群将满,所以进群需要密码,密码请查看UserGuide.md)
PyWxDump是一款用于获取账号信息(昵称/账号/手机/邮箱/数据库密钥) 、解密数据库、查看聊天记录、备份导出聊天记录为html的工具。
',11),g=t("a",{href:"https://github.com/xaoyaoo/PyWxDump/"},[t("img",{src:"https://img.shields.io/github/stars/xaoyaoo/PyWxDump.svg?style=social&label=Star",alt:"Star"})],-1),b=e(`利用场景
PyWxDump是SharpWxDump 的经过重构python语言版本,同时添加了一些新的功能。
详细使用说明见UserGuide.md
极简版使用说明pywxdumpmini
【注】:
wxdump bias
命令代替,现仅用作学习原理) 本项目仅供学习交流使用,请勿用于非法用途,否则后果自负。
您应该在下载保存,编译使用本项目的24小时内,删除本项目的源代码和(编译出的)程序。
本项目仅允许在授权情况下对数据库进行备份,严禁用于非法目的,否则自行承担所有相关责任。
下载、保存、进一步浏览源代码或者下载安装、编译使用本程序,表示你同意本警告,并承诺遵守它;
请勿利用本项目的相关技术从事非法测试,如因此产生的一切不良后果与项目作者无关。
MIT License
+
+Copyright (c) 2023 xaoyaoo
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+PyWxDump is hosted at: https://github.com/xaoyaoo/PyWxDump
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
`,23);function f(D,w){const p=i("center"),h=i("big");return m(),r("div",y,[t("h1",n,[a(p,null,{default:s(()=>[o("PyWxDump")]),_:1})]),x,t("ul",null,[t("li",null,[t("strong",null,[a(h,null,{default:s(()=>[o(" 超级想要star,走过路过,帮忙点个"),g,o(" 呗,谢谢啦~")]),_:1})])])]),b])}const W=l(d,[["render",f]]);export{W as default};
diff --git a/pywxdump/ui/web/assets/BiasView-GJ4usZ7i.js b/pywxdump/ui/web/assets/BiasView-GJ4usZ7i.js
new file mode 100644
index 0000000..df59014
--- /dev/null
+++ b/pywxdump/ui/web/assets/BiasView-GJ4usZ7i.js
@@ -0,0 +1 @@
+import{_ as o,b as s,c,e,h as t}from"./index-ct5HAHRh.js";const a={},n={style:{"background-color":"#d2d2fa",height:"100vh",display:"grid","place-items":"center"}},r=e("h2",{style:{"text-align":"center"}},[t("欢迎使用"),e("a",{href:"https://github.com/xaoyaoo/PyWxDump.git"},"PyWxDump"),t("聊天记录查看工具! ")],-1),i=e("p",null,"如需提前体验更多功能,请开通超级vip",-1),_=[r,i];function d(h,l){return s(),c("div",n,_)}const f=o(a,[["render",d]]);export{f as default};
diff --git a/pywxdump/ui/web/assets/ChatView-15JuBujm.css b/pywxdump/ui/web/assets/ChatView-15JuBujm.css
new file mode 100644
index 0000000..3d2e8f1
--- /dev/null
+++ b/pywxdump/ui/web/assets/ChatView-15JuBujm.css
@@ -0,0 +1 @@
+.label_color[data-v-cb8b8fa3]{color:#333;font-size:15px;padding-left:15px;padding-right:0}.data_color[data-v-cb8b8fa3]{color:#08488c;background-color:#f4f4f4;font-size:15px;padding-left:6px;padding-right:6px;font-weight:700;white-space:nowrap;max-width:80%}.chat-content[data-v-36141b84]{width:100%;padding:20px}.chat-content .word[data-v-36141b84]{display:flex;margin-bottom:20px}.chat-content .word img[data-v-36141b84]{width:40px;height:40px;border-radius:50%}.chat-content .word .info[data-v-36141b84]{margin-left:10px}.chat-content .word .info .time[data-v-36141b84]{font-size:12px;color:#333c;margin:-5px 0 0;height:20px;line-height:20px}.chat-content .word .info .info-content[data-v-36141b84]{max-width:80%;padding:10px;font-size:14px;background:#fff;position:relative;margin-top:8px}.chat-content .word .info .info-content[data-v-36141b84]:before{position:absolute;left:-8px;top:8px;content:"";border-right:10px solid #FFF;border-top:8px solid transparent;border-bottom:8px solid transparent}.chat-content .word-my[data-v-36141b84]{display:flex;justify-content:flex-end;margin-bottom:20px}.chat-content .word-my img[data-v-36141b84]{width:40px;height:40px;border-radius:50%}.chat-content .word-my .info[data-v-36141b84]{width:90%;margin-left:10px;text-align:right}.chat-content .word-my .info .time[data-v-36141b84]{font-size:12px;color:#333c;margin:-5px 10px 0 0;height:20px;line-height:20px}.chat-content .word-my .info .info-content[data-v-36141b84]{max-width:80%;padding:10px;font-size:14px;float:right;margin-right:10px;position:relative;margin-top:8px;background:#95ec69;text-align:left}.chat-content .word-my .info .info-content[data-v-36141b84]:after{position:absolute;right:-8px;top:8px;content:"";border-left:10px solid #95EC69;border-top:8px solid transparent;border-bottom:8px solid transparent}.chat-content[data-v-5bacfdce]{width:100%;padding:20px}.chat-content .word[data-v-5bacfdce]{display:flex;margin-bottom:20px}.chat-content .word img[data-v-5bacfdce]{width:40px;height:40px;border-radius:50%}.chat-content .word .info[data-v-5bacfdce]{margin-left:10px}.chat-content .word .info .time[data-v-5bacfdce]{font-size:12px;color:#333c;margin:-5px 0 0;height:20px;line-height:20px}.chat-content .word .info .info-content[data-v-5bacfdce]{max-width:80%;padding:10px;font-size:14px;background:#fff;position:relative;margin-top:8px}.chat-content .word .info .chat_img[data-v-5bacfdce]{width:200px;height:200px;border-radius:5px}.chat-content .word .info .info-content[data-v-5bacfdce]:before{position:absolute;left:-8px;top:8px;content:"";border-right:10px solid #FFF;border-top:8px solid transparent;border-bottom:8px solid transparent}.chat-content .word-my[data-v-5bacfdce]{display:flex;justify-content:flex-end;margin-bottom:20px}.chat-content .word-my img[data-v-5bacfdce]{width:40px;height:40px;border-radius:50%}.chat-content .word-my .info[data-v-5bacfdce]{width:90%;margin-left:10px;text-align:right}.chat-content .word-my .info .time[data-v-5bacfdce]{font-size:12px;color:#333c;margin:-5px 10px 0 0;height:20px;line-height:20px}.chat-content .word-my .info .info-content[data-v-5bacfdce]{max-width:80%;padding:10px;font-size:14px;float:right;margin-right:10px;position:relative;margin-top:8px;background:#95ec69;text-align:left}.chat-content .word-my .info .chat_img[data-v-5bacfdce]{width:200px;height:200px;border-radius:5px}.chat-content .word-my .info .info-content[data-v-5bacfdce]:after{position:absolute;right:-8px;top:8px;content:"";border-left:10px solid #95EC69;border-top:8px solid transparent;border-bottom:8px solid transparent}.demo-image__error .image-slot[data-v-5bacfdce],.demo-image__error .image-slot .el-icon[data-v-5bacfdce]{font-size:30px}.demo-image__error .el-image[data-v-5bacfdce]{width:100%;height:200px}.chat-content[data-v-ee21176a]{width:100%;padding:20px}.chat-content .word[data-v-ee21176a]{display:flex;margin-bottom:20px}.chat-content .word img[data-v-ee21176a]{width:40px;height:40px;border-radius:50%}.chat-content .word .info[data-v-ee21176a]{margin-left:10px}.chat-content .word .info .time[data-v-ee21176a]{font-size:12px;color:#333c;margin:-5px 0 0;height:20px;line-height:20px}.chat-content .word .info .info-content[data-v-ee21176a]{max-width:80%;padding:10px;font-size:14px;background:#fff;position:relative;margin-top:8px}.chat-content .word .info .chat_img[data-v-ee21176a]{width:200px;height:200px;border-radius:5px}.chat-content .word .info .info-content[data-v-ee21176a]:before{position:absolute;left:-8px;top:8px;content:"";border-right:10px solid #FFF;border-top:8px solid transparent;border-bottom:8px solid transparent}.chat-content .word-my[data-v-ee21176a]{display:flex;justify-content:flex-end;margin-bottom:20px}.chat-content .word-my img[data-v-ee21176a]{width:40px;height:40px;border-radius:50%}.chat-content .word-my .info[data-v-ee21176a]{width:90%;margin-left:10px;text-align:right}.chat-content .word-my .info .time[data-v-ee21176a]{font-size:12px;color:#333c;margin:-5px 10px 0 0;height:20px;line-height:20px}.chat-content .word-my .info .info-content[data-v-ee21176a]{max-width:80%;padding:10px;font-size:14px;float:right;margin-right:10px;position:relative;margin-top:8px;background:#95ec69;text-align:left}.chat-content .word-my .info .chat_img[data-v-ee21176a]{width:200px;height:200px;border-radius:5px}.chat-content .word-my .info .info-content[data-v-ee21176a]:after{position:absolute;right:-8px;top:8px;content:"";border-left:10px solid #95EC69;border-top:8px solid transparent;border-bottom:8px solid transparent}.demo-image__error .image-slot[data-v-ee21176a],.demo-image__error .image-slot .el-icon[data-v-ee21176a]{font-size:30px}.demo-image__error .el-image[data-v-ee21176a]{width:100%;height:200px}#chat[data-v-8da1fa43]{position:relative;width:100%;height:100%;background-color:#f5f5f5;display:flex;flex-direction:column}#chat[data-v-8da1fa43] .chat_body[data-v-8da1fa43]{flex:1;overflow-y:hidden;overflow-x:hidden}#chat[data-v-8da1fa43] .chat_body[data-v-8da1fa43] .chat_window[data-v-8da1fa43]{height:100%;overflow-y:scroll;width:calc(100% + 17px);padding:0;margin:0}#chat[data-v-8da1fa43] .chat_body[data-v-8da1fa43] .chat_window[data-v-8da1fa43]>.message[data-v-8da1fa43]:last-of-type{margin-bottom:8px}
diff --git a/pywxdump/ui/web/assets/ChatView-I97tceRE.js b/pywxdump/ui/web/assets/ChatView-I97tceRE.js
new file mode 100644
index 0000000..8cf73b1
--- /dev/null
+++ b/pywxdump/ui/web/assets/ChatView-I97tceRE.js
@@ -0,0 +1,5 @@
+import{d as L,r as C,o as Q,a as x,b as w,c as S,e as y,f as b,w as Ye,g as A,h as H,t as k,i as ae,F as ce,j as I,_ as z,k as et,l as tt,H as nt}from"./index-ct5HAHRh.js";function Pe(e,t){return function(){return e.apply(t,arguments)}}const{toString:rt}=Object.prototype,{getPrototypeOf:pe}=Object,Z=(e=>t=>{const n=rt.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),P=e=>(e=e.toLowerCase(),t=>Z(t)===e),Y=e=>t=>typeof t===e,{isArray:$}=Array,q=Y("undefined");function st(e){return e!==null&&!q(e)&&e.constructor!==null&&!q(e.constructor)&&T(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const ve=P("ArrayBuffer");function ot(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&ve(e.buffer),t}const it=Y("string"),T=Y("function"),De=Y("number"),ee=e=>e!==null&&typeof e=="object",at=e=>e===!0||e===!1,W=e=>{if(Z(e)!=="object")return!1;const t=pe(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},ct=P("Date"),lt=P("File"),ut=P("Blob"),dt=P("FileList"),ft=e=>ee(e)&&T(e.pipe),ht=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||T(e.append)&&((t=Z(e))==="formdata"||t==="object"&&T(e.toString)&&e.toString()==="[object FormData]"))},pt=P("URLSearchParams"),mt=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function V(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),$(e))for(r=0,s=e.length;r方法一:进入链接releases下载最新版本exe文件
方法二:(本地安装有python环境)使用pip安装
pip install PyWxDump
+
./wxdump.exe
,按回车键(pip安装输入wxdump
)提交拉取请求(Pull Request),请按照以下步骤进行操作:
Clone or download
按钮,获取仓库的 URL。然后在本地使用 Git 命令克隆仓库到你的电脑上:git clone 仓库的URL
git checkout -b 你的分支名
git add
和 git commit
命令将修改提交到本地仓库中: git add .
+git commit -m "提交信息"
+
git push
命令将你的本地分支推送到你的 GitHub 仓库中:git push origin 你的分支名
Create pull request
按钮,即可提交拉取请求。 contributors
中看到你的名字了。wxdump.exe info
,而不是info
info
,回车键确认decrypted
文件夹里面的内容是解密后的数据库,对应的是微信数据库目录下的文件(都是相对路径)Multi
目录下的是微信数据目录下Msg
下Multi
内的数据库解密后的相对路径decrypted
根目录下的MicroMsg
是微信数据目录下Msg
下MicroMsg
的数据库解密后的相对路径 Multi
目录下的MSG0
-MSG5
是微信数据目录下Msg
下Multi
内的数据库解密后的相对路径 Multi
目录下的de_MediaMsg0
~de_MediaMsg5
是微信数据目录下Msg
下Multi
内的MediaMsg0
的数据库解密后的相对路径 MSG0
~MSG5
是微信聊天记录不同时间段下的数据库,MSG0
是最旧的,MSG5
是最新的 MediaMsg0
~MediaMsg5
是微信聊天记录不同时间段下的数据库,MediaMsg0
是最旧的,MediaMsg5
是最新的 MSG5
和MediaMsg5
,如果想看最旧的聊天记录,就选择MSG0
和MediaMsg0
,如果想看中间的聊天记录,就选择MSG1
~MSG4
和MediaMsg1
~MediaMsg4
使用命令wxdump.exe merge
,然后根据提示输入参数,回车键确认。 eg:wxdump.exe merge -i "C:\\Users\\user\\Desktop\\decrypted\\MSG0.db,C:\\Users\\user\\Desktop\\decrypted\\MSG1.db,C:\\Users\\user\\Desktop\\decrypted\\MSG2.db" -o "C:\\Users\\user\\Desktop\\decrypted\\merge.db"
相信你看到这里,已经可以自己解决所有问题了。
如果实在还有疑问,更加建议提交issues。
如果还是想添加qq群,那么关注公众号:逍遥之芯
,回复qq群密码
即可获取qq群密码。(因为qq群又快满了,群主又没钱买vip,所以只能这样了)
不可以,只能看到有密钥的数据库的聊天记录,如果你有别人的密钥,那么可以查看别人的聊天记录。
不能,必须登录微信才能获取到密钥。 但是可以保存密钥,下次再次使用时候,不需要登录即可。
`,48),t=[s];function p(h,u){return o(),i("div",c,t)}const r=e(l,[["render",p]]);export{r as default}; diff --git a/pywxdump/ui/web/assets/MergeView-u74EqMxx.js b/pywxdump/ui/web/assets/MergeView-u74EqMxx.js new file mode 100644 index 0000000..bfbb84a --- /dev/null +++ b/pywxdump/ui/web/assets/MergeView-u74EqMxx.js @@ -0,0 +1 @@ +import{_ as o,b as c,c as s,e,h as t}from"./index-ct5HAHRh.js";const a={},r={style:{"background-color":"#d2d2fa",height:"100vh",display:"grid","place-items":"center"}},n=e("h2",{style:{"text-align":"center"}},[t("欢迎使用"),e("a",{href:"https://github.com/xaoyaoo/PyWxDump.git"},"PyWxDump"),t("聊天记录查看工具! ")],-1),i=e("p",null,"如需提前体验更多功能,请开通超级vip",-1),_=[n,i];function d(h,l){return c(),s("div",r,_)}const f=o(a,[["render",d]]);export{f as default}; diff --git a/pywxdump/ui/web/assets/StatisticsView-v-n8Q3Re.js b/pywxdump/ui/web/assets/StatisticsView-v-n8Q3Re.js new file mode 100644 index 0000000..37dc1ec --- /dev/null +++ b/pywxdump/ui/web/assets/StatisticsView-v-n8Q3Re.js @@ -0,0 +1 @@ +import{_ as o,b as s,c,e,h as t}from"./index-ct5HAHRh.js";const a={},i={style:{"background-color":"#d2d2fa",height:"100vh",display:"grid","place-items":"center"}},n=e("h2",{style:{"text-align":"center"}},[t("欢迎使用"),e("a",{href:"https://github.com/xaoyaoo/PyWxDump.git"},"PyWxDump"),t("聊天记录查看工具! ")],-1),r=e("p",null,"如需提前体验更多功能,请开通超级vip",-1),_=[n,r];function d(h,l){return s(),c("div",i,_)}const f=o(a,[["render",d]]);export{f as default}; diff --git a/pywxdump/ui/web/assets/WxinfoView-T1JKlNEu.js b/pywxdump/ui/web/assets/WxinfoView-T1JKlNEu.js new file mode 100644 index 0000000..35a4519 --- /dev/null +++ b/pywxdump/ui/web/assets/WxinfoView-T1JKlNEu.js @@ -0,0 +1 @@ +import{_ as o,b as c,c as s,e,h as t}from"./index-ct5HAHRh.js";const a={},n={style:{"background-color":"#d2d2fa",height:"100vh",display:"grid","place-items":"center"}},r=e("h2",{style:{"text-align":"center"}},[t("欢迎使用"),e("a",{href:"https://github.com/xaoyaoo/PyWxDump.git"},"PyWxDump"),t("聊天记录查看工具! ")],-1),i=e("p",null,"如需提前体验更多功能,请开通超级vip",-1),_=[r,i];function d(h,l){return c(),s("div",n,_)}const f=o(a,[["render",d]]);export{f as default}; diff --git a/pywxdump/ui/web/assets/index-ct5HAHRh.js b/pywxdump/ui/web/assets/index-ct5HAHRh.js new file mode 100644 index 0000000..1b8e86d --- /dev/null +++ b/pywxdump/ui/web/assets/index-ct5HAHRh.js @@ -0,0 +1,60 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))o(l);new MutationObserver(l=>{for(const r of l)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&o(a)}).observe(document,{childList:!0,subtree:!0});function n(l){const r={};return l.integrity&&(r.integrity=l.integrity),l.referrerPolicy&&(r.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?r.credentials="include":l.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function o(l){if(l.ep)return;l.ep=!0;const r=n(l);fetch(l.href,r)}})();function kf(e,t){const n=new Set(e.split(","));return t?o=>n.has(o.toLowerCase()):o=>n.has(o)}const Wt={},Fr=[],$t=()=>{},HC=()=>!1,$u=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),_f=e=>e.startsWith("onUpdate:"),Qt=Object.assign,Ef=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zC=Object.prototype.hasOwnProperty,gt=(e,t)=>zC.call(e,t),De=Array.isArray,Hr=e=>Ns(e)==="[object Map]",Tu=e=>Ns(e)==="[object Set]",dr=e=>Ns(e)==="[object Date]",Xe=e=>typeof e=="function",Qe=e=>typeof e=="string",_l=e=>typeof e=="symbol",it=e=>e!==null&&typeof e=="object",Qa=e=>(it(e)||Xe(e))&&Xe(e.then)&&Xe(e.catch),v0=Object.prototype.toString,Ns=e=>v0.call(e),wi=e=>Ns(e).slice(8,-1),Zi=e=>Ns(e)==="[object Object]",$f=e=>Qe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ci=kf(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ou=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},KC=/-(\w)/g,Jn=Ou(e=>e.replace(KC,(t,n)=>n?n.toUpperCase():"")),WC=/\B([A-Z])/g,Nl=Ou(e=>e.replace(WC,"-$1").toLowerCase()),Ps=Ou(e=>e.charAt(0).toUpperCase()+e.slice(1)),Si=Ou(e=>e?`on${Ps(e)}`:""),El=(e,t)=>!Object.is(e,t),ki=(e,t)=>{for(let n=0;nYz(e,n,t),getStopIndexForStartIndex:(e,t,n,o)=>{const{height:l,total:r,layout:a,width:i}=e,u=$s(a)?i:l,c=Vr(e,t,o),f=n+u;let d=c.offset+c.size,p=t;for(;p {const o=zo(e,t,n,"column");return[o.size,o.offset]},getRowPosition:(e,t,n)=>{const o=zo(e,t,n,"row");return[o.size,o.offset]},getColumnOffset:(e,t,n,o,l,r)=>Vg(e,t,n,o,l,"column",r),getRowOffset:(e,t,n,o,l,r)=>Vg(e,t,n,o,l,"row",r),getColumnStartIndexForOffset:(e,t,n)=>Bg(e,n,t,"column"),getColumnStopIndexForStartIndex:(e,t,n,o)=>{const l=zo(e,t,o,"column"),r=n+e.width;let a=l.offset+l.size,i=t;for(;i