From 4f8da4f4ae2a7663f20926783509bc1c30e7c0d3 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 16 Feb 2025 05:54:14 +0800 Subject: [PATCH] Fix panic (#167) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * Fix panic https://github.com/qydysky/bili_danmu/issues/166 * Update golang 1.24 * Imporve 离线构建 * Imporve 离线构建 * Fix github action --- .github/workflows/go.yml | 24 +++++--- .github/workflows/test.yml | 26 +++++--- README.md | 10 +++- Reply/F.go | 63 ++++++++++++-------- Reply/F/comp.go | 1 + Reply/F/danmuCountPerMin/danmuCountPerMin.go | 11 +++- Reply/F/videoInfo/videoInfo.go | 2 +- go.mod | 38 ++++++------ go.sum | 43 ++++++++++++- 9 files changed, 150 insertions(+), 68 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 4286a44..731fb08 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -9,11 +9,11 @@ on: jobs: buildtest: - name: test_ubuntu_go${{ matrix.go }} + name: test_ubuntu_go runs-on: ubuntu-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] env: GH_TOKEN: ${{ github.token }} steps: @@ -41,6 +41,7 @@ jobs: sudo apt-get update sudo apt-get install libgtk-3-dev libcairo2-dev libglib2.0-dev go get . + go mod vendor CGO_ENABLED=0 go test -v --cover -coverprofile=coverage ./... - name: Codecov @@ -52,14 +53,21 @@ jobs: - name: Create draft release run: | gh release create draft --draft + + - name: zipVendor + run: zip -q -r vendor.zip vendor + + - name: Upload a Release Asset + run: | + gh release upload draft vendor.zip u-build: - name: build_ubuntu_go${{ matrix.go }} + name: build_ubuntu_go needs: [buildtest] runs-on: ubuntu-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] env: GH_TOKEN: ${{ github.token }} steps: @@ -93,12 +101,12 @@ jobs: gh release upload draft ubuntu_go${{ matrix.go }}.zip w-build: - name: build_windows_go${{ matrix.go }} + name: build_windows_go needs: [buildtest] runs-on: windows-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] env: GH_TOKEN: ${{ github.token }} steps: @@ -132,12 +140,12 @@ jobs: gh release upload draft windows_go${{ matrix.go }}.zip m-build: - name: build_macos_go${{ matrix.go }} + name: build_macos_go needs: [buildtest] runs-on: macos-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] env: GH_TOKEN: ${{ github.token }} steps: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 55c21f8..9c0d6df 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,11 +14,11 @@ on: jobs: buildtest: - name: test_ubuntu_go${{ matrix.go }} + name: test_ubuntu_go runs-on: ubuntu-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] steps: - name: Set up Go${{ matrix.go }} uses: actions/setup-go@v5 @@ -44,6 +44,7 @@ jobs: sudo apt-get update sudo apt-get install libgtk-3-dev libcairo2-dev libglib2.0-dev go get . + go mod vendor CGO_ENABLED=0 go test -v --cover -coverprofile=coverage ./... - name: Codecov @@ -51,14 +52,23 @@ jobs: with: token: ${{secrets.CODECOV_TOKEN}} file: coverage + + - name: zip + run: zip -q -r vendor.zip vendor + + - name: Upload a Build Artifact + uses: actions/upload-artifact@v4 + with: + name: vendor.zip + path: ./vendor.zip u-build: - name: build_ubuntu_go${{ matrix.go }} + name: build_ubuntu_go needs: [buildtest] runs-on: ubuntu-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] steps: - name: Set up Go${{ matrix.go }} uses: actions/setup-go@v5 @@ -93,12 +103,12 @@ jobs: path: ./ubuntu_go${{ matrix.go }}.zip w-build: - name: build_windows_go${{ matrix.go }} + name: build_windows_go needs: [buildtest] runs-on: windows-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] steps: - name: Set up Go${{ matrix.go }} uses: actions/setup-go@v5 @@ -132,12 +142,12 @@ jobs: path: ./windows_go${{ matrix.go }}.zip mac-build: - name: build_macos_go${{ matrix.go }} + name: build_macos_go needs: [buildtest] runs-on: macos-latest strategy: matrix: - go: [ '1.23' ] + go: [ '1.24' ] steps: - name: Set up Go${{ matrix.go }} uses: actions/setup-go@v5 diff --git a/README.md b/README.md index a362bc7..f665ec5 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,8 @@ ### 说明 本项目使用github action自动构建,构建过程详见[yml](https://github.com/qydysky/bili_danmu/blob/master/.github/workflows/go.yml) +关于离线构建,详见章节`运行`及其`注意事项` + #### 环境变量覆盖配置项 添加配置项`从环境变量覆盖`(>v0.14.26)。将在配置文件都加载后,用环境变量覆盖配置项。 @@ -1111,10 +1113,16 @@ go build . * 当`-r`,`-ckv`为空时,将尝试从环境变量中获取,分别对应键值`r`,`ckv`(>v0.14.21) * 法1,2,3建议使用最新提交 * 程序受主机时区配置影响,注意正确配置主机时区 -* 弹幕及礼物会记录于danmu.log中 +* 弹幕及礼物默认会记录于danmu.log中 * 部分功能(如签到、发送弹幕、获取原画等)**需要在`cookie路径`下对应位置放置有效`cookie.txt`才可用** 或 **运行时按提示使用扫码登录成功后才可用(登录信息会保存在`cookie路径`中)**(`cookie路径`(>v0.14.26)默认为程序目录下的`cookie.txt`) * 在golang1.20+,由于某些[原因](https://github.com/golang/go/issues/57328#issuecomment-1353413399),你可能需要在构建时添加`CGO_ENABLED=0` * 由于通常是发现功能不正常时,才会检查b站是否更新,又因日常录播并不会使用到全部功能,所以并不能确保全部功能都能正常运行 +* 离线编译:release版本将包含`vendor`压缩文件(>v0.15.7)。下载源代码及vendor压缩文件,解压后将`vendor`文件夹放置在`go.mod`同级目录时,你可以在`demo`文件夹使用`go build -mod=vendor -v .`进行离线构建 + + 源代码链接: `https://github.com/qydysky/bili_danmu/archive/refs/tags/{version}.zip` + + vendor链接: `https://github.com/qydysky/bili_danmu/releases/download/{version}/vendor.zip` + #### 关于更新版本v0.{y}.{z} * 当bilibili停止服务时,将会发布v1版本。 diff --git a/Reply/F.go b/Reply/F.go index 3e6341d..77559e3 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -824,7 +824,7 @@ func init() { w.Header().Set("Content-Type", "text/html") } - f := file.New("html/streamList/"+p, 0, true) + f := file.New("html/streamList/"+p, 0, true).CheckRoot("html/streamList/") if !f.IsExist() || f.IsDir() { w.WriteHeader(http.StatusNotFound) return @@ -859,6 +859,7 @@ func init() { w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte("[]")) } else { + replyFunc.DanmuCountPerMin.CheckRoot(v) rpath := "/" + qref + "/" if strings.HasSuffix(v, "/") || strings.HasSuffix(v, "\\") { v += rpath[1:] @@ -950,13 +951,17 @@ func init() { }) skip, _ := strconv.Atoi(r.URL.Query().Get("skip")) size, _ := strconv.Atoi(r.URL.Query().Get("size")) - for i, n := skip, len(fs); i < n && (size == 0 || len(filePaths) < size); i++ { + for i, n := 0, len(fs); i < n && (size == 0 || len(filePaths) < size); i++ { if filePath, e := videoInfo.Get.Run(context.Background(), fs[i]); e != nil { if !errors.Is(e, os.ErrNotExist) { flog.L(`W: `, fs[i], e) } continue } else { + skip -= 1 + if skip >= 0 { + continue + } if t, e := time.Parse("2006_01_02-15_04_05", filePath.StartT); e == nil { filePath.StartT = t.Format(time.DateTime) } @@ -983,7 +988,7 @@ func init() { return } - f := file.New("emots/"+strings.TrimPrefix(r.URL.Path, spath+"emots/"), 0, true) + f := file.New("emots/"+strings.TrimPrefix(r.URL.Path, spath+"emots/"), 0, true).CheckRoot("emots/") if !f.IsExist() { w.WriteHeader(http.StatusNotFound) return @@ -1010,9 +1015,12 @@ func init() { p = "index.html" } + var s string if strings.HasPrefix(p, "emots/") { + s = "emots/" p = replyFunc.DanmuEmotes.Hashr(p) } else { + s = "html/artPlayer/" p = "html/artPlayer/" + p } @@ -1024,7 +1032,7 @@ func init() { w.Header().Set("content-type", "text/html") } - f := file.New(p, 0, true) + f := file.New(p, 0, true).CheckRoot(s) if !f.IsExist() { w.WriteHeader(http.StatusNotFound) return @@ -1114,16 +1122,17 @@ func init() { rpath = "/" + qref + "/" if rpath != `/now/` { - if v, ok := c.C.K_v.LoadV(`直播流保存位置`).(string); !ok || v == "" { + if s, ok := c.C.K_v.LoadV(`直播流保存位置`).(string); !ok || s == "" { w.Header().Set("Retry-After", "1") w.WriteHeader(http.StatusServiceUnavailable) flog.L(`W: `, `直播流保存位置无效`) return } else { - if strings.HasSuffix(v, "/") || strings.HasSuffix(v, "\\") { - v += rpath[1:] + var v string + if strings.HasSuffix(s, "/") || strings.HasSuffix(s, "\\") { + v = s + rpath[1:] } else { - v += rpath + v = s + rpath } if rawPath, e := url.PathUnescape(v); e != nil { w.WriteHeader(http.StatusServiceUnavailable) @@ -1132,10 +1141,10 @@ func init() { } else { v = rawPath } - if file.New(v+"0.flv", 0, true).IsExist() { + if file.New(v+"0.flv", 0, true).CheckRoot(s).IsExist() { v += "0.flv" w.Header().Set("Content-Type", "flv-application/octet-stream") - } else if file.New(v+"0.mp4", 0, true).IsExist() { + } else if file.New(v+"0.mp4", 0, true).CheckRoot(s).IsExist() { v += "0.mp4" w.Header().Set("Content-Type", "video/mp4") } else { @@ -1176,7 +1185,7 @@ func init() { } } - f := file.New(v, 0, false) + f := file.New(v, 0, false).CheckRoot(s) defer f.Close() // 设置当前返回区间,并拷贝 @@ -1202,7 +1211,7 @@ func init() { flvDecoder.Diff = v } // fastSeed - if fastSeedF := file.New(v+".fastSeed", 0, true); fastSeedF.IsExist() { + if fastSeedF := file.New(v+".fastSeed", 0, true).CheckRoot(s); fastSeedF.IsExist() { if gf, e := replyFunc.VideoFastSeed.InitGet(v + ".fastSeed"); e != nil { flog.L(`E: `, e) } else if e := flvDecoder.CutSeed(f, startT, duration, res, f, gf); e != nil && !errors.Is(e, io.EOF) { @@ -1224,7 +1233,7 @@ func init() { fmp4Decoder.AVTDiff = v } // fastSeed - if fastSeedF := file.New(v+".fastSeed", 0, true); fastSeedF.IsExist() { + if fastSeedF := file.New(v+".fastSeed", 0, true).CheckRoot(s); fastSeedF.IsExist() { if gf, e := replyFunc.VideoFastSeed.InitGet(v + ".fastSeed"); e != nil { flog.L(`E: `, e) } else if e := fmp4Decoder.CutSeed(f, startT, duration, res, f, gf); e != nil && !errors.Is(e, io.EOF) { @@ -1314,17 +1323,18 @@ func init() { return } if rpath != `/now/` { - if v, ok := c.C.K_v.LoadV(`直播流保存位置`).(string); ok && v != "" { - if strings.HasSuffix(v, "/") || strings.HasSuffix(v, "\\") { - v += rpath[1:] + if s, ok := c.C.K_v.LoadV(`直播流保存位置`).(string); ok && s != "" { + var v string + if strings.HasSuffix(s, "/") || strings.HasSuffix(s, "\\") { + v = s + rpath[1:] } else { - v += rpath + v = s + rpath } - if !file.New(v+"0.csv", 0, true).IsExist() { + if !file.New(v+"0.csv", 0, true).CheckRoot(s).IsExist() { w.WriteHeader(http.StatusNotFound) return - } else if !file.New(v+"0.xml", 0, true).IsExist() { + } else if !file.New(v+"0.xml", 0, true).CheckRoot(s).IsExist() { if _, e := danmuXml.DanmuXml.Run(context.Background(), &v); e != nil { flog.L(`E: `, e) } @@ -1395,19 +1405,20 @@ func init() { return } - if v, ok := c.C.K_v.LoadV(`直播流保存位置`).(string); !ok || v == "" { + if s, ok := c.C.K_v.LoadV(`直播流保存位置`).(string); !ok || s == "" { w.Header().Set("Retry-After", "1") w.WriteHeader(http.StatusServiceUnavailable) flog.L(`W: `, `直播流保存位置无效`) } else { - if strings.HasSuffix(v, "/") || strings.HasSuffix(v, "\\") { - v += rpath[1:] + var v string + if strings.HasSuffix(s, "/") || strings.HasSuffix(s, "\\") { + v = s + rpath[1:] } else { - v += rpath + v = s + rpath } - if !file.New(v+"0.xml", 0, true).IsExist() { - if !file.New(v+"0.csv", 0, true).IsExist() { + if !file.New(v+"0.xml", 0, true).CheckRoot(s).IsExist() { + if !file.New(v+"0.csv", 0, true).CheckRoot(s).IsExist() { w.WriteHeader(http.StatusNotFound) return } @@ -1416,7 +1427,7 @@ func init() { } } - if e := file.New(v+"0.xml", 0, true).CopyToIoWriter(w, pio.CopyConfig{}); e != nil { + if e := file.New(v+"0.xml", 0, true).CheckRoot(s).CopyToIoWriter(w, pio.CopyConfig{}); e != nil { flog.L(`W: `, e) } } diff --git a/Reply/F/comp.go b/Reply/F/comp.go index d25466e..eedc547 100644 --- a/Reply/F/comp.go +++ b/Reply/F/comp.go @@ -19,6 +19,7 @@ import ( var DanmuCountPerMin = comp.Get[interface { // will WriteHeader GetRec(savePath string, r *http.Request, w http.ResponseWriter) error + CheckRoot(dir string) Rec(ctx context.Context, roomid int, savePath string) func(any) Do(roomid int, msg string, uid string) }](`danmuCountPerMin`) diff --git a/Reply/F/danmuCountPerMin/danmuCountPerMin.go b/Reply/F/danmuCountPerMin/danmuCountPerMin.go index eda6dc0..20bf449 100644 --- a/Reply/F/danmuCountPerMin/danmuCountPerMin.go +++ b/Reply/F/danmuCountPerMin/danmuCountPerMin.go @@ -19,6 +19,7 @@ import ( type TargetInterface interface { // will WriteHeader GetRec(savePath string, r *http.Request, w http.ResponseWriter) error + CheckRoot(dir string) Rec(ctx context.Context, roomid int, savePath string) func(any) Do(roomid int, msg string, uid string) } @@ -42,12 +43,16 @@ type mi struct { } type danmuCountPerMin struct { - m *msgq.MsgType[mi] + root string + m *msgq.MsgType[mi] } -func (t *danmuCountPerMin) GetRec(savePath string, r *http.Request, w http.ResponseWriter) error { - f := file.New(savePath+filename, 0, true) +func (t *danmuCountPerMin) CheckRoot(dir string) { + t.root = dir +} +func (t *danmuCountPerMin) GetRec(savePath string, r *http.Request, w http.ResponseWriter) error { + f := file.New(savePath+filename, 0, true).CheckRoot(t.root) if f.IsDir() || !f.IsExist() { if pweb.NotModified(r, w, noFoundModT) { return nil diff --git a/Reply/F/videoInfo/videoInfo.go b/Reply/F/videoInfo/videoInfo.go index 4c3838c..4e9d932 100644 --- a/Reply/F/videoInfo/videoInfo.go +++ b/Reply/F/videoInfo/videoInfo.go @@ -97,7 +97,7 @@ func get(ctx context.Context, savepath string) (*Paf, error) { // } // 从0.json获取信息 { - json0 := file.New(savepath+string(os.PathSeparator)+"0.json", 0, true) + json0 := file.New(savepath+string(os.PathSeparator)+"0.json", 0, true).CheckRoot(savepath) if !json0.IsExist() { return &d, os.ErrNotExist } diff --git a/go.mod b/go.mod index 47c8b23..020fc15 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,21 @@ module github.com/qydysky/bili_danmu -go 1.23 +go 1.24 require ( github.com/gotk3/gotk3 v0.6.4 github.com/mdp/qrterminal/v3 v3.2.0 - github.com/qydysky/part v0.28.20250211194255 + github.com/qydysky/part v0.28.20250215204247 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 - golang.org/x/text v0.21.0 + golang.org/x/text v0.22.0 ) require ( github.com/google/uuid v1.6.0 github.com/qydysky/biliApi v0.0.0-20240725184407-15076dddb6fb github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 - golang.org/x/exp v0.0.0-20241210194714-1829a127f884 + golang.org/x/exp v0.0.0-20250215185904-eff6e970281f ) require ( @@ -27,14 +27,14 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/term v0.27.0 // indirect - modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852 // indirect - modernc.org/libc v1.61.4 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.8.0 // indirect - modernc.org/strutil v1.2.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/term v0.29.0 // indirect + modernc.org/gc/v3 v3.0.0-20250121204235-2db1fde51ea4 // indirect + modernc.org/libc v1.61.13 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.8.2 // indirect + modernc.org/strutil v1.2.1 // indirect modernc.org/token v1.1.0 // indirect ) @@ -43,19 +43,19 @@ require ( github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.8.1 github.com/gorilla/websocket v1.5.3 // indirect - github.com/jackc/pgx/v5 v5.7.1 + github.com/jackc/pgx/v5 v5.7.2 github.com/klauspost/compress v1.17.11 // indirect github.com/lib/pq v1.10.9 - github.com/miekg/dns v1.1.62 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.9.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/tools v0.28.0 // indirect - modernc.org/sqlite v1.34.2 + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/tools v0.30.0 // indirect + modernc.org/sqlite v1.35.0 rsc.io/qr v0.2.0 // indirect ) diff --git a/go.sum b/go.sum index 7a436cb..b3c91d3 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7Ulw github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= +github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= @@ -40,6 +42,8 @@ github.com/mdp/qrterminal/v3 v3.2.0 h1:qteQMXO3oyTK4IHwj2mWsKYYRBOp1Pj2WRYFYYNTC github.com/mdp/qrterminal/v3 v3.2.0/go.mod h1:XGGuua4Lefrl7TLEsSONiD+UEjQXJZ4mPzF+gWYIJkk= github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -48,8 +52,8 @@ github.com/qydysky/biliApi v0.0.0-20240725184407-15076dddb6fb h1:dtSpNF9hLQa09TU github.com/qydysky/biliApi v0.0.0-20240725184407-15076dddb6fb/go.mod h1:om024vfxALQ5vxsbaGoMm8IS0esLYBnEOpJI8FsGoDg= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 h1:k451T+bpsLr+Dq9Ujo+Qtx0iomRA1XXS5ttlEojvfuQ= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9/go.mod h1:cI8/gy/wjy2Eb+p2IUj2ZuDnC8R5Vrx3O0VMPvMvphA= -github.com/qydysky/part v0.28.20250211194255 h1:rCJs36/oIsEs81abGA1LX0uBoqG0IYqZySDpsvFTOwI= -github.com/qydysky/part v0.28.20250211194255/go.mod h1:RAb3G05OaqCSRWFJz9FnONB6iqF/Dk4R+Z5c/H7mWSg= +github.com/qydysky/part v0.28.20250215204247 h1:8WpJKeWANIZ/+ldDoxTo8zX+RYtBD8+iHDL/I5KXeZM= +github.com/qydysky/part v0.28.20250215204247/go.mod h1:MsSAiZMiWQ5pGP5BCEB3OBsoAPaGykNB7vbeY3mKF2w= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -73,53 +77,88 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= +golang.org/x/exp v0.0.0-20250215185904-eff6e970281f h1:oFMYAjX0867ZD2jcNiLBrI9BdpmEkvPyi5YrBGXbamg= +golang.org/x/exp v0.0.0-20250215185904-eff6e970281f/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= modernc.org/cc/v4 v4.23.1 h1:WqJoPL3x4cUufQVHkXpXX7ThFJ1C4ik80i2eXEXbhD8= modernc.org/cc/v4 v4.23.1/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0= modernc.org/ccgo/v4 v4.23.1 h1:N49a7JiWGWV7lkPE4yYcvjkBGZQi93/JabRYjdWmJXc= modernc.org/ccgo/v4 v4.23.1/go.mod h1:JoIUegEIfutvoWV/BBfDFpPpfR2nc3U0jKucGcbmwDU= +modernc.org/ccgo/v4 v4.23.16 h1:Z2N+kk38b7SfySC1ZkpGLN2vthNJP1+ZzGZIlH7uBxo= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M= modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v2 v2.6.3 h1:aJVhcqAte49LF+mGveZ5KPlsp4tdGdAOT4sipJXADjw= modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852 h1:IYXPPTTjjoSHvUClZIYexDiO7g+4x+XveKT4gCIAwiY= modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/gc/v3 v3.0.0-20250121204235-2db1fde51ea4 h1:FzVgEBZAG56u1XSuXBI02I+33/NCfTGFj3KBCfl6+U0= +modernc.org/gc/v3 v3.0.0-20250121204235-2db1fde51ea4/go.mod h1:LG5UO1Ran4OO0JRKz2oNiXhR5nNrgz0PzH7UKhz0aMU= modernc.org/libc v1.61.4 h1:wVyqEx6tlltte9lPTjq0kDAdtdM9c4JH8rU6M1ZVawA= modernc.org/libc v1.61.4/go.mod h1:VfXVuM/Shh5XsMNrh3C6OkfL78G3loa4ZC/Ljv9k7xc= +modernc.org/libc v1.61.13 h1:3LRd6ZO1ezsFiX1y+bHd1ipyEHIJKvuprv0sLTBwLW8= +modernc.org/libc v1.61.13/go.mod h1:8F/uJWL/3nNil0Lgt1Dpz+GgkApWh04N3el3hxJcA6E= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI= +modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sqlite v1.34.2 h1:J9n76TPsfYYkFkZ9Uy1QphILYifiVEwwOT7yP5b++2Y= modernc.org/sqlite v1.34.2/go.mod h1:dnR723UrTtjKpoHCAMN0Q/gZ9MT4r+iRvIBb9umWFkU= +modernc.org/sqlite v1.35.0 h1:yQps4fegMnZFdphtzlfQTCNBWtS0CZv48pRpW3RFHRw= +modernc.org/sqlite v1.35.0/go.mod h1:9cr2sicr7jIaWTBKQmAxQLfBv9LL0su4ZTEV+utt3ic= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= -- 2.39.2