From ce4f08f2e2176cf548d1b5e5ae83c0d78680b67d Mon Sep 17 00:00:00 2001 From: ucwong Date: Wed, 17 Dec 2025 21:57:39 +0800 Subject: [PATCH] deps --- go.mod | 80 +- go.sum | 156 ++-- .../torrent/client-piece-request-order.go | 2 +- .../torrent/client-tracker-announcer.go | 68 +- .../torrent/client-unlock-handlers.go | 15 +- vendor/github.com/anacrolix/torrent/client.go | 148 ++-- .../github.com/anacrolix/torrent/deferrwl.go | 2 +- .../torrent/internal/amortize/amortize.go | 10 + .../internal/indexed/internal-table.go | 2 +- .../torrent/internal/indexed/misc.go | 2 +- .../request-strategy/piece-request-order.go | 13 +- .../github.com/anacrolix/torrent/mse/mse.go | 21 +- .../torrent/request-strategy-impls.go | 12 +- .../anacrolix/torrent/storage/file-misc.go | 7 +- vendor/github.com/anacrolix/torrent/t.go | 6 + .../torrent/torrent-piece-request-order.go | 2 +- .../github.com/anacrolix/torrent/torrent.go | 84 +- .../torrent/torrents-by-short-infohash.go | 90 -- .../anacrolix/torrent/webseed-requesting.go | 3 +- .../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +- .../aws/transport/http/client.go | 2 + .../aws/aws-sdk-go-v2/config/CHANGELOG.md | 12 + .../config/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/credentials/CHANGELOG.md | 12 + .../credentials/go_module_metadata.go | 2 +- .../feature/ec2/imds/CHANGELOG.md | 4 + .../feature/ec2/imds/go_module_metadata.go | 2 +- .../internal/configsources/CHANGELOG.md | 4 + .../configsources/go_module_metadata.go | 2 +- .../internal/endpoints/v2/CHANGELOG.md | 4 + .../endpoints/v2/go_module_metadata.go | 2 +- .../internal/presigned-url/CHANGELOG.md | 4 + .../presigned-url/go_module_metadata.go | 2 +- .../service/route53/CHANGELOG.md | 8 + .../service/route53/go_module_metadata.go | 2 +- .../service/route53/types/enums.go | 6 + .../aws-sdk-go-v2/service/signin/CHANGELOG.md | 4 + .../service/signin/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sso/CHANGELOG.md | 8 + .../service/sso/go_module_metadata.go | 2 +- .../sso/internal/endpoints/endpoints.go | 3 + .../service/ssooidc/CHANGELOG.md | 4 + .../service/ssooidc/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sts/CHANGELOG.md | 8 + .../service/sts/go_module_metadata.go | 2 +- .../sts/internal/endpoints/endpoints.go | 5 + .../charmbracelet/colorprofile/.golangci.yml | 3 + .../charmbracelet/colorprofile/env.go | 4 +- .../charmbracelet/colorprofile/profile.go | 26 +- .../charmbracelet/colorprofile/writer.go | 14 +- .../github.com/charmbracelet/x/ansi/style.go | 6 + .../clipperhouse/displaywidth/trie.go | 492 ++++++----- .../clipperhouse/displaywidth/width.go | 22 +- .../dgraph-io/badger/v4/CHANGELOG.md | 346 +++++--- .../dgraph-io/badger/v4/CODE_OF_CONDUCT.md | 4 +- .../dgraph-io/badger/v4/CONTRIBUTING.md | 16 +- .../github.com/dgraph-io/badger/v4/Makefile | 2 +- .../github.com/dgraph-io/badger/v4/README.md | 34 +- .../dgraph-io/badger/v4/SECURITY.md | 2 +- .../github.com/dgraph-io/badger/v4/backup.go | 2 +- .../github.com/dgraph-io/badger/v4/batch.go | 2 +- .../github.com/dgraph-io/badger/v4/changes.sh | 2 +- .../dgraph-io/badger/v4/compaction.go | 2 +- vendor/github.com/dgraph-io/badger/v4/db.go | 4 +- .../dgraph-io/badger/v4/dir_other.go | 2 +- .../dgraph-io/badger/v4/dir_plan9.go | 2 +- .../dgraph-io/badger/v4/dir_unix.go | 2 +- .../dgraph-io/badger/v4/dir_windows.go | 6 +- .../github.com/dgraph-io/badger/v4/discard.go | 2 +- .../github.com/dgraph-io/badger/v4/errors.go | 4 +- .../dgraph-io/badger/v4/fb/flatbuffer.fbs | 2 +- .../dgraph-io/badger/v4/histogram.go | 2 +- .../dgraph-io/badger/v4/iterator.go | 4 +- .../dgraph-io/badger/v4/key_registry.go | 6 +- .../dgraph-io/badger/v4/level_handler.go | 2 +- .../github.com/dgraph-io/badger/v4/levels.go | 4 +- .../github.com/dgraph-io/badger/v4/logger.go | 2 +- .../dgraph-io/badger/v4/managed_db.go | 2 +- .../dgraph-io/badger/v4/manifest.go | 10 +- .../dgraph-io/badger/v4/memtable.go | 2 +- .../github.com/dgraph-io/badger/v4/merge.go | 2 +- .../github.com/dgraph-io/badger/v4/options.go | 2 +- .../dgraph-io/badger/v4/options/options.go | 2 +- .../dgraph-io/badger/v4/pb/badgerpb4.pb.go | 2 +- .../dgraph-io/badger/v4/pb/badgerpb4.proto | 2 +- .../dgraph-io/badger/v4/publisher.go | 2 +- .../dgraph-io/badger/v4/skl/arena.go | 2 +- .../github.com/dgraph-io/badger/v4/skl/skl.go | 2 +- .../github.com/dgraph-io/badger/v4/stream.go | 2 +- .../dgraph-io/badger/v4/stream_writer.go | 2 +- .../github.com/dgraph-io/badger/v4/structs.go | 8 +- .../dgraph-io/badger/v4/table/builder.go | 8 +- .../dgraph-io/badger/v4/table/iterator.go | 2 +- .../badger/v4/table/merge_iterator.go | 2 +- .../dgraph-io/badger/v4/table/table.go | 6 +- vendor/github.com/dgraph-io/badger/v4/test.sh | 4 +- .../dgraph-io/badger/v4/test_extensions.go | 6 +- .../dgraph-io/badger/v4/trie/trie.go | 4 +- vendor/github.com/dgraph-io/badger/v4/txn.go | 2 +- vendor/github.com/dgraph-io/badger/v4/util.go | 2 +- .../github.com/dgraph-io/badger/v4/value.go | 4 +- .../dgraph-io/badger/v4/y/checksum.go | 2 +- .../dgraph-io/badger/v4/y/encrypt.go | 2 +- .../github.com/dgraph-io/badger/v4/y/error.go | 2 +- .../dgraph-io/badger/v4/y/event_log.go | 2 +- .../dgraph-io/badger/v4/y/file_dsync.go | 2 +- .../dgraph-io/badger/v4/y/file_nodsync.go | 2 +- .../dgraph-io/badger/v4/y/iterator.go | 2 +- .../dgraph-io/badger/v4/y/metrics.go | 2 +- .../dgraph-io/badger/v4/y/watermark.go | 4 +- vendor/github.com/dgraph-io/badger/v4/y/y.go | 10 +- .../github.com/dgraph-io/badger/v4/y/zstd.go | 2 +- vendor/github.com/go-resty/resty/v2/README.md | 4 +- .../go-resty/resty/v2/middleware.go | 3 + .../github.com/go-resty/resty/v2/request.go | 3 +- vendor/github.com/go-resty/resty/v2/resty.go | 2 +- .../jedib0t/go-pretty/v6/text/string.go | 39 +- vendor/github.com/pion/dtls/v3/conn.go | 2 +- .../github.com/pion/dtls/v3/flight0handler.go | 11 +- vendor/github.com/pion/ice/v4/agent.go | 193 ++++- vendor/github.com/pion/ice/v4/agent_config.go | 7 + .../github.com/pion/ice/v4/agent_options.go | 301 ++++++- vendor/github.com/pion/ice/v4/errors.go | 42 +- .../pion/ice/v4/external_ip_mapper.go | 456 ++++++++-- vendor/github.com/pion/ice/v4/gather.go | 780 ++++++++++++------ vendor/github.com/pion/ice/v4/net.go | 11 +- vendor/github.com/pion/ice/v4/udp_mux.go | 4 +- .../github.com/pion/ice/v4/udp_mux_multi.go | 4 +- .../github.com/pion/webrtc/v4/datachannel.go | 22 +- .../pion/webrtc/v4/datachannel_js.go | 4 + .../pion/webrtc/v4/dtlstransport.go | 58 +- .../pion/webrtc/v4/internal/mux/endpoint.go | 14 +- .../go.opentelemetry.io/otel/.codespellignore | 1 + vendor/go.opentelemetry.io/otel/.golangci.yml | 3 + vendor/go.opentelemetry.io/otel/.lycheeignore | 6 +- vendor/go.opentelemetry.io/otel/CHANGELOG.md | 72 +- .../go.opentelemetry.io/otel/CONTRIBUTING.md | 458 +++++++++- vendor/go.opentelemetry.io/otel/Makefile | 3 +- vendor/go.opentelemetry.io/otel/README.md | 11 +- vendor/go.opentelemetry.io/otel/RELEASING.md | 54 +- vendor/go.opentelemetry.io/otel/VERSIONING.md | 2 +- .../otel/attribute/encoder.go | 2 +- .../otel/attribute/hash.go | 92 +++ .../otel/attribute/internal/xxhash/xxhash.go | 64 ++ .../go.opentelemetry.io/otel/attribute/set.go | 145 ++-- .../otel/attribute/type_string.go | 5 +- .../otel/baggage/baggage.go | 12 +- .../otel/dependencies.Dockerfile | 2 +- .../otel/internal/global/meter.go | 2 +- vendor/go.opentelemetry.io/otel/metric.go | 2 +- .../go.opentelemetry.io/otel/metric/config.go | 38 +- .../otel/propagation/trace_context.go | 2 +- .../otel/semconv/v1.37.0/error_type.go | 47 +- .../go.opentelemetry.io/otel/trace/config.go | 45 +- vendor/go.opentelemetry.io/otel/trace/span.go | 4 + vendor/go.opentelemetry.io/otel/version.go | 2 +- vendor/go.opentelemetry.io/otel/versions.yaml | 27 +- vendor/golang.org/x/mod/modfile/print.go | 2 +- vendor/golang.org/x/mod/modfile/read.go | 2 +- vendor/golang.org/x/mod/modfile/rule.go | 8 +- vendor/golang.org/x/mod/module/module.go | 4 +- .../golang.org/x/net/dns/dnsmessage/svcb.go | 21 +- vendor/golang.org/x/net/http2/transport.go | 160 +++- vendor/golang.org/x/net/trace/events.go | 2 +- vendor/golang.org/x/sync/errgroup/errgroup.go | 4 +- vendor/golang.org/x/sys/cpu/cpu.go | 3 - vendor/golang.org/x/sys/cpu/cpu_arm64.go | 20 +- vendor/golang.org/x/sys/cpu/cpu_arm64.s | 7 - vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 1 - .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 1 - .../golang.org/x/sys/cpu/cpu_netbsd_arm64.go | 2 +- .../golang.org/x/sys/cpu/cpu_openbsd_arm64.go | 2 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 3 +- vendor/golang.org/x/sys/unix/zerrors_linux.go | 2 + .../x/sys/unix/zerrors_linux_386.go | 2 + .../x/sys/unix/zerrors_linux_amd64.go | 2 + .../x/sys/unix/zerrors_linux_arm.go | 2 + .../x/sys/unix/zerrors_linux_arm64.go | 2 + .../x/sys/unix/zerrors_linux_loong64.go | 2 + .../x/sys/unix/zerrors_linux_mips.go | 2 + .../x/sys/unix/zerrors_linux_mips64.go | 2 + .../x/sys/unix/zerrors_linux_mips64le.go | 2 + .../x/sys/unix/zerrors_linux_mipsle.go | 2 + .../x/sys/unix/zerrors_linux_ppc.go | 2 + .../x/sys/unix/zerrors_linux_ppc64.go | 2 + .../x/sys/unix/zerrors_linux_ppc64le.go | 2 + .../x/sys/unix/zerrors_linux_riscv64.go | 2 + .../x/sys/unix/zerrors_linux_s390x.go | 2 + .../x/sys/unix/zerrors_linux_sparc64.go | 2 + .../x/sys/unix/ztypes_netbsd_arm.go | 2 +- vendor/golang.org/x/text/collate/collate.go | 1 - .../x/text/internal/colltab/collelem.go | 2 - .../x/tools/go/ast/astutil/imports.go | 19 +- .../x/tools/go/packages/packages.go | 41 +- .../x/tools/go/types/typeutil/callee.go | 1 + .../x/tools/internal/event/core/export.go | 15 +- .../x/tools/internal/event/label/label.go | 12 +- .../x/tools/internal/imports/sortimports.go | 23 +- .../x/tools/internal/modindex/lookup.go | 8 +- .../x/tools/internal/stdlib/deps.go | 626 +++++++------- .../x/tools/internal/stdlib/manifest.go | 549 +++++++++++- .../x/tools/internal/stdlib/stdlib.go | 2 +- .../internal/typesinternal/classify_call.go | 2 +- .../x/tools/internal/typesinternal/types.go | 4 +- .../x/tools/internal/versions/features.go | 1 + .../cmd/protoc-gen-go/internal_gengo/main.go | 1 + .../protoc-gen-go/internal_gengo/opaque.go | 2 + .../protobuf/compiler/protogen/protogen.go | 54 +- .../protobuf/internal/encoding/tag/tag.go | 11 +- .../protobuf/internal/encoding/text/decode.go | 115 ++- .../protobuf/internal/filedesc/desc.go | 1 + .../protobuf/internal/filedesc/desc_lazy.go | 22 - .../protobuf/internal/genid/descriptor_gen.go | 1 + .../protobuf/internal/impl/codec_map.go | 6 + .../protobuf/internal/impl/decode.go | 3 +- .../protobuf/internal/impl/validate.go | 26 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/proto/decode.go | 10 +- .../protobuf/reflect/protodesc/desc.go | 11 +- .../protobuf/reflect/protodesc/editions.go | 4 +- .../types/descriptorpb/descriptor.pb.go | 13 +- .../types/known/timestamppb/timestamp.pb.go | 13 +- vendor/modules.txt | 87 +- 223 files changed, 4942 insertions(+), 2055 deletions(-) delete mode 100644 vendor/github.com/anacrolix/torrent/torrents-by-short-infohash.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/hash.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go diff --git a/go.mod b/go.mod index aab6f941aa..e0a59debfa 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,20 @@ module github.com/CortexFoundation/CortexTheseus -go 1.24.4 +go 1.24.9 require ( github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 github.com/CortexFoundation/inference v1.0.2-0.20230307032835-9197d586a4e8 github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66 - github.com/CortexFoundation/torrentfs v1.0.73-0.20251206142004-4323a1e1ed27 + github.com/CortexFoundation/torrentfs v1.0.73-0.20251217130652-29bcb4ed05d5 github.com/Microsoft/go-winio v0.6.2 - github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251119083800-2aa1d4cc79d7 + github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251213223233-751f36331c62 github.com/VictoriaMetrics/fastcache v1.13.2 github.com/arsham/figurine v1.3.0 - github.com/aws/aws-sdk-go-v2 v1.40.1 - github.com/aws/aws-sdk-go-v2/config v1.32.3 - github.com/aws/aws-sdk-go-v2/credentials v1.19.3 - github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1 + github.com/aws/aws-sdk-go-v2 v1.41.0 + github.com/aws/aws-sdk-go-v2/config v1.32.6 + github.com/aws/aws-sdk-go-v2/credentials v1.19.6 + github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 github.com/cespare/cp v1.1.1 github.com/charmbracelet/bubbletea v1.3.10 github.com/cloudflare/cloudflare-go v0.116.0 @@ -64,14 +64,14 @@ require ( github.com/ucwong/color v1.10.1-0.20200624105241-fba1e010fe1e github.com/urfave/cli/v2 v2.27.7 go.uber.org/automaxprocs v1.6.0 - golang.org/x/crypto v0.45.0 + golang.org/x/crypto v0.46.0 golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f - golang.org/x/sync v0.18.0 - golang.org/x/sys v0.38.0 - golang.org/x/text v0.31.0 + golang.org/x/sync v0.19.0 + golang.org/x/sys v0.39.0 + golang.org/x/text v0.32.0 golang.org/x/time v0.14.0 - golang.org/x/tools v0.39.0 - google.golang.org/protobuf v1.36.10 + golang.org/x/tools v0.40.0 + google.golang.org/protobuf v1.36.11 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c gopkg.in/urfave/cli.v1 v1.20.0 ) @@ -82,7 +82,7 @@ require ( github.com/CortexFoundation/compress v0.0.0-20240218153512-9074bdc2397c // indirect github.com/CortexFoundation/cvm-runtime v0.0.0-20221117094012-b5a251885572 // indirect github.com/CortexFoundation/merkletree v0.0.0-20250807103550-396f9f0ba0f1 // indirect - github.com/CortexFoundation/robot v1.0.7-0.20251009210220-5dbe0a584392 // indirect + github.com/CortexFoundation/robot v1.0.7-0.20251209195009-d70c8c78437e // indirect github.com/CortexFoundation/wormhole v0.0.2-0.20250807143819-52807b74f358 // indirect github.com/DataDog/zstd v1.5.7 // indirect github.com/RoaringBitmap/roaring v1.9.4 // indirect @@ -101,23 +101,23 @@ require ( github.com/anacrolix/multiless v0.4.0 // indirect github.com/anacrolix/stm v0.5.0 // indirect github.com/anacrolix/sync v0.6.0 // indirect - github.com/anacrolix/torrent v1.60.1-0.20251203050330-6022de0123ad // indirect + github.com/anacrolix/torrent v1.60.1-0.20251217073903-486bcbe758e0 // indirect github.com/anacrolix/upnp v0.1.4 // indirect github.com/anacrolix/utp v0.2.0 // indirect github.com/antlabs/stl v0.0.2 // indirect github.com/antlabs/timer v0.1.4 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/arsham/rainbow v1.2.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect github.com/aws/smithy-go v1.24.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect @@ -128,12 +128,12 @@ require ( github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charmbracelet/colorprofile v0.3.3 // indirect + github.com/charmbracelet/colorprofile v0.4.1 // indirect github.com/charmbracelet/lipgloss v1.1.0 // indirect - github.com/charmbracelet/x/ansi v0.11.2 // indirect + github.com/charmbracelet/x/ansi v0.11.3 // indirect github.com/charmbracelet/x/cellbuf v0.0.14 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect - github.com/clipperhouse/displaywidth v0.6.1 // indirect + github.com/clipperhouse/displaywidth v0.6.2 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect github.com/clipperhouse/uax29/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.12.0 // indirect @@ -144,7 +144,7 @@ require ( github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect - github.com/dgraph-io/badger/v4 v4.8.1-0.20250905144248-6cbc8fde682c // indirect + github.com/dgraph-io/badger/v4 v4.9.0 // indirect github.com/dgraph-io/ristretto/v2 v2.3.0 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -160,7 +160,7 @@ require ( github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-resty/resty/v2 v2.17.0 // indirect + github.com/go-resty/resty/v2 v2.17.1 // indirect github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -168,11 +168,11 @@ require ( github.com/google/flatbuffers v25.9.23+incompatible // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 // indirect + github.com/google/pprof v0.0.0-20251213031049-b05bdaca462f // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/huandu/xstrings v1.5.0 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect - github.com/jedib0t/go-pretty/v6 v6.7.5 // indirect + github.com/jedib0t/go-pretty/v6 v6.7.7 // indirect github.com/klauspost/compress v1.18.2 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect @@ -196,8 +196,8 @@ require ( github.com/otiai10/mint v1.6.3 // indirect github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect - github.com/pion/dtls/v3 v3.0.8 // indirect - github.com/pion/ice/v4 v4.0.13 // indirect + github.com/pion/dtls/v3 v3.0.9 // indirect + github.com/pion/ice/v4 v4.1.0 // indirect github.com/pion/interceptor v0.1.42 // indirect github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns/v2 v2.1.0 // indirect @@ -211,7 +211,7 @@ require ( github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v3 v3.1.1 // indirect github.com/pion/turn/v4 v4.1.3 // indirect - github.com/pion/webrtc/v4 v4.1.7 // indirect + github.com/pion/webrtc/v4 v4.1.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.23.2 // indirect @@ -245,14 +245,14 @@ require ( github.com/zeebo/xxh3 v1.0.3-0.20230502181907-3808c706a06a // indirect go.etcd.io/bbolt v1.4.3 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel v1.38.0 // indirect - go.opentelemetry.io/otel/metric v1.38.0 // indirect - go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect - golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 // indirect - golang.org/x/mod v0.30.0 // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/term v0.37.0 // indirect + golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/term v0.38.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index 1704893d15..4ac911cdda 100644 --- a/go.sum +++ b/go.sum @@ -63,15 +63,15 @@ github.com/CortexFoundation/inference v1.0.2-0.20230307032835-9197d586a4e8 h1:W/ github.com/CortexFoundation/inference v1.0.2-0.20230307032835-9197d586a4e8/go.mod h1:Doj3mBNzdjCDvKVwysKaHEPbS20A7RRaQY0bHtEVz88= github.com/CortexFoundation/merkletree v0.0.0-20250807103550-396f9f0ba0f1 h1:Pl3f7uSQ6YgC8WJcjxU6uKJFC/9fTDOBLfK458UPemQ= github.com/CortexFoundation/merkletree v0.0.0-20250807103550-396f9f0ba0f1/go.mod h1:H/XQUOyyWqFweHqa39mLPewU3q9GTY4wvf8KQduuuPQ= -github.com/CortexFoundation/robot v1.0.7-0.20251009210220-5dbe0a584392 h1:14IXtXlPDppxmFLb+EtK+Kl9pUgIaqdUc/x5AxTFRtM= -github.com/CortexFoundation/robot v1.0.7-0.20251009210220-5dbe0a584392/go.mod h1:2O4ZF0E9FQR7BKVh8guqSghBzP7kDVLmISJeSIyiTc0= +github.com/CortexFoundation/robot v1.0.7-0.20251209195009-d70c8c78437e h1:gw/OLVEiq/xzU7QPCHhcRMYMTCAD6XRpWVWDHayZKvc= +github.com/CortexFoundation/robot v1.0.7-0.20251209195009-d70c8c78437e/go.mod h1:7da2FJgO2bvzGoFWlIvjtRUgB5LeHCMUX0rLvYAjGEE= github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66 h1:yJbN4DFvpStCShXOVxNV64aawsPqizLuXZhrnhCr2fY= github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66/go.mod h1:AkjV4OECAskB9m6w+2e84F0Zcx7oZWEmHB3EKoaDXYk= github.com/CortexFoundation/torrentfs v1.0.13-0.20200623060705-ce027f43f2f8/go.mod h1:Ma+tGhPPvz4CEZHaqEJQMOEGOfHeQBiAoNd1zyc/w3Q= github.com/CortexFoundation/torrentfs v1.0.14-0.20200703071639-3fcabcabf274/go.mod h1:qnb3YlIJmuetVBtC6Lsejr0Xru+1DNmDCdTqnwy7lhk= github.com/CortexFoundation/torrentfs v1.0.20-0.20200810031954-d36d26f82fcc/go.mod h1:N5BsicP5ynjXIi/Npl/SRzlJ630n1PJV2sRj0Z0t2HA= -github.com/CortexFoundation/torrentfs v1.0.73-0.20251206142004-4323a1e1ed27 h1:lk0qpgcgsZcZWkgblactVASY14IVcl3EiFObbM/NfkA= -github.com/CortexFoundation/torrentfs v1.0.73-0.20251206142004-4323a1e1ed27/go.mod h1:QuBcmFSJc6rlV5qCW+XBY01e++zezs4W1FnsO5pIigM= +github.com/CortexFoundation/torrentfs v1.0.73-0.20251217130652-29bcb4ed05d5 h1:uXwfi1WI24H7jrpZRTz6PE4hDivtyxH8KtKWPJfYxuI= +github.com/CortexFoundation/torrentfs v1.0.73-0.20251217130652-29bcb4ed05d5/go.mod h1:t0r+P2JTv5z7zXQ0acSgiTpaeaQSm34GETHHAb1tWbE= github.com/CortexFoundation/wormhole v0.0.2-0.20250807143819-52807b74f358 h1:y0QMrHsFxmrKBJDjYTnsXw8h/rtjO+tMnmK2OdUzZ/w= github.com/CortexFoundation/wormhole v0.0.2-0.20250807143819-52807b74f358/go.mod h1:R/2T+BS27RdmRWWhoDdgSlordZpUBjVTh8hi4fHoioE= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -85,8 +85,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251119083800-2aa1d4cc79d7 h1:uups37roJCTtR/BrJa0WoMrxt3rzgV+Qrj+TxYyJoAo= -github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251119083800-2aa1d4cc79d7/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251213223233-751f36331c62 h1:Rge3uIIO891+nLqKTfMulCw+tWHtTl16Oudi0yUcAoE= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251213223233-751f36331c62/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= github.com/RoaringBitmap/roaring v0.4.17/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= @@ -225,8 +225,8 @@ github.com/anacrolix/torrent v1.15.0/go.mod h1:MFc6KcbpAyfwGqOyRkdarUK9QnKA/FkVg github.com/anacrolix/torrent v1.15.1-0.20200504230043-cc5d2abe18e5/go.mod h1:QlOfgrCz5kbvhOz8M58dUwHY5SfZ9VbIvReZ0z0MdIk= github.com/anacrolix/torrent v1.15.1-0.20200619022403-dd51e99b88cc/go.mod h1:wuopQPC5+/M+zHYvhcA2vp5UCTm9rUc+VqjyBa882Q8= github.com/anacrolix/torrent v1.15.1-0.20200715061614-dd906f8fa72e/go.mod h1:XWo/fJN1oKgcjgxM+pUZpvalHfqHDs27BY5mBZjIQWo= -github.com/anacrolix/torrent v1.60.1-0.20251203050330-6022de0123ad h1:Y9zYqK0K7vMbr3j9FIgtr7eQvfxz/Jjlc7S/6Po/mLQ= -github.com/anacrolix/torrent v1.60.1-0.20251203050330-6022de0123ad/go.mod h1:yKUKuZSSDdyOsCbuH+rDOpswl/g546gICapdrU7aUmQ= +github.com/anacrolix/torrent v1.60.1-0.20251217073903-486bcbe758e0 h1:lzjUG5O/Vzn4vodFZnrmVny08kMnujjmMLQw0X7cetI= +github.com/anacrolix/torrent v1.60.1-0.20251217073903-486bcbe758e0/go.mod h1:yKUKuZSSDdyOsCbuH+rDOpswl/g546gICapdrU7aUmQ= github.com/anacrolix/upnp v0.1.1/go.mod h1:LXsbsp5h+WGN7YR+0A7iVXm5BL1LYryDev1zuJMWYQo= github.com/anacrolix/upnp v0.1.2-0.20200416075019-5e9378ed1425/go.mod h1:Pz94W3kl8rf+wxH3IbCa9Sq+DTJr8OSbV2Q3/y51vYs= github.com/anacrolix/upnp v0.1.4 h1:+2t2KA6QOhm/49zeNyeVwDu1ZYS9dB9wfxyVvh/wk7U= @@ -267,34 +267,34 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.30.24/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.31.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc= -github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= -github.com/aws/aws-sdk-go-v2/config v1.32.3 h1:cpz7H2uMNTDa0h/5CYL5dLUEzPSLo2g0NkbxTRJtSSU= -github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s= -github.com/aws/aws-sdk-go-v2/credentials v1.19.3 h1:01Ym72hK43hjwDeJUfi1l2oYLXBAOR8gNSZNmXmvuas= -github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 h1:utxLraaifrSBkeyII9mIbVwXXWrZdlPO7FIKmyLCEcY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 h1:Y5YXgygXwDI5P4RkteB5yF7v35neH7LfJKBG+hzIons= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 h1:AvltKnW9ewxX2hFmQS0FyJH93aSvJVUEFvXfU+HWtSE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA= +github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4= +github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= +github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8= +github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI= +github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 h1:3/u/4yZOffg5jdNk1sDpOQ4Y+R6Xbh+GzpDrSZjuy3U= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU= -github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1 h1:ik9tMw+xWZqzffOtGH3PfV0Yy/V+QsCb1XYXXXjUskk= -github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1/go.mod h1:JRqmldxIPU6uck5bcFS8ExwwG2mUwfy+jiUmismOxJs= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 h1:d/6xOGIllc/XW1lzG9a4AUBMmpLA9PXcQnVPTuHHcik= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 h1:8sTTiw+9yuNXcfWeqKF2x01GqCF49CpP4Z9nKrrk/ts= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 h1:E+KqWoVsSrj1tJ6I/fjDIu5xoS2Zacuu1zT+H7KtiIk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 h1:tzMkjh0yTChUqJDgGkcDdxvZDSrJ/WB6R6ymI5ehqJI= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM= +github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 h1:80pDB3Tpmb2RCSZORrK9/3iQxsd+w6vSzVqpT1FGiwE= +github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0/go.mod h1:6EZUGGNLPLh5Unt30uEoA+KQcByERfXIkax9qrc80nA= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk= github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= @@ -345,12 +345,12 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= -github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI= -github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4= +github.com/charmbracelet/colorprofile v0.4.1 h1:a1lO03qTrSIRaK8c3JRxJDZOvhvIeSco3ej+ngLk1kk= +github.com/charmbracelet/colorprofile v0.4.1/go.mod h1:U1d9Dljmdf9DLegaJ0nGZNJvoXAhayhmidOdcBwAvKk= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.11.2 h1:XAG3FSjiVtFvgEgGrNBkCNNYrsucAt8c6bfxHyROLLs= -github.com/charmbracelet/x/ansi v0.11.2/go.mod h1:9tY2bzX5SiJCU0iWyskjBeI2BRQfvPqI+J760Mjf+Rg= +github.com/charmbracelet/x/ansi v0.11.3 h1:6DcVaqWI82BBVM/atTyq6yBoRLZFBsnoDoX9GCu2YOI= +github.com/charmbracelet/x/ansi v0.11.3/go.mod h1:yI7Zslym9tCJcedxz5+WBq+eUGMJT0bM06Fqy1/Y4dI= github.com/charmbracelet/x/cellbuf v0.0.14 h1:iUEMryGyFTelKW3THW4+FfPgi4fkmKnnaLOXuc+/Kj4= github.com/charmbracelet/x/cellbuf v0.0.14/go.mod h1:P447lJl49ywBbil/KjCk2HexGh4tEY9LH0/1QrZZ9rA= github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= @@ -367,8 +367,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/clipperhouse/displaywidth v0.6.1 h1:/zMlAezfDzT2xy6acHBzwIfyu2ic0hgkT83UX5EY2gY= -github.com/clipperhouse/displaywidth v0.6.1/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o= +github.com/clipperhouse/displaywidth v0.6.2 h1:ZDpTkFfpHOKte4RG5O/BOyf3ysnvFswpyYrV7z2uAKo= +github.com/clipperhouse/displaywidth v0.6.2/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o= github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= @@ -430,8 +430,8 @@ github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= -github.com/dgraph-io/badger/v4 v4.8.1-0.20250905144248-6cbc8fde682c h1:jNnG903ruaoPXEBzvI9nXf2clxpLnvDjHNvMMh6l0x0= -github.com/dgraph-io/badger/v4 v4.8.1-0.20250905144248-6cbc8fde682c/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0= +github.com/dgraph-io/badger/v4 v4.9.0 h1:tpqWb0NewSrCYqTvywbcXOhQdWcqephkVkbBmaaqHzc= +github.com/dgraph-io/badger/v4 v4.9.0/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0= github.com/dgraph-io/ristretto/v2 v2.3.0 h1:qTQ38m7oIyd4GAed/QkUZyPFNMnvVWyazGXRwvOt5zk= github.com/dgraph-io/ristretto/v2 v2.3.0/go.mod h1:gpoRV3VzrEY1a9dWAYV6T1U7YzfgttXdd/ZzL1s9OZM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -553,8 +553,8 @@ github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZs github.com/go-resty/resty/v2 v2.3.0-rc.1/go.mod h1:nYW/8rxqQCmI3bPz9Fsmjbr2FBjGuR2Mzt6kDh3zZ7w= github.com/go-resty/resty/v2 v2.3.1-0.20200619075926-b87f65ce5ed5/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= github.com/go-resty/resty/v2 v2.3.1-0.20200717071130-ca7661ad51fe/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= -github.com/go-resty/resty/v2 v2.17.0 h1:pW9DeXcaL4Rrym4EZ8v7L19zZiIlWPg5YXAcVmt+gN0= -github.com/go-resty/resty/v2 v2.17.0/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= +github.com/go-resty/resty/v2 v2.17.1 h1:x3aMpHK1YM9e4va/TMDRlusDDoZiQ+ViDu/WpA6xTM4= +github.com/go-resty/resty/v2 v2.17.1/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= @@ -642,8 +642,8 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 h1:3DsUAV+VNEQa2CUVLxCY3f87278uWfIDhJnbdvDjvmE= -github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= +github.com/google/pprof v0.0.0-20251213031049-b05bdaca462f h1:HU1RgM6NALf/KW9HEY6zry3ADbDKcmpQ+hJedoNGQYQ= +github.com/google/pprof v0.0.0-20251213031049-b05bdaca462f/go.mod h1:67FPmZWbr+KDT/VlpWtw6sO9XSjpJmLuHpoLmWiTGgY= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -748,8 +748,8 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3UzhtuiM= -github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.7 h1:Y1Id3lJ3k4UB8uwWWy3l8EVFnUlx5chR5+VbsofPNX0= +github.com/jedib0t/go-pretty/v6 v6.7.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 h1:FWpSWRD8FbVkKQu8M1DM9jF5oXFLyE+XpisIYfdzbic= github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7/go.mod h1:BMxO138bOokdgt4UaxZiEfypcSHX0t6SIFimVP1oRfk= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= @@ -987,12 +987,12 @@ github.com/pion/dtls/v2 v2.0.0/go.mod h1:VkY5VL2wtsQQOG60xQ4lkV5pdn0wwBBTzCfRJqX github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/dtls/v3 v3.0.8 h1:ZrPUrvPVDaTJDM8Vu1veatzXebLlsIWeT7Vaate/zwM= -github.com/pion/dtls/v3 v3.0.8/go.mod h1:abApPjgadS/ra1wvUzHLc3o2HvoxppAh+NZkyApL4Os= +github.com/pion/dtls/v3 v3.0.9 h1:4AijfFRm8mAjd1gfdlB1wzJF3fjjR/VPIpJgkEtvYmM= +github.com/pion/dtls/v3 v3.0.9/go.mod h1:abApPjgadS/ra1wvUzHLc3o2HvoxppAh+NZkyApL4Os= github.com/pion/ice v0.7.13/go.mod h1:U3ERMkJgkPMlBjzMe2XxIQPl6ZrfRHyENwGCBoFrWWk= github.com/pion/ice v0.7.14/go.mod h1:/Lz6jAUhsvXed7kNJImXtvVSgjtcdGKoZAZIYb9WEm0= -github.com/pion/ice/v4 v4.0.13 h1:1cdmd80gmLdnVTM2bXzw2CBebvXvkGNEaWi/CuDK9WQ= -github.com/pion/ice/v4 v4.0.13/go.mod h1:Xo5f5DBbEjQac+6pR7i83AGuwoGxnxwXkOOvHFVnfnM= +github.com/pion/ice/v4 v4.1.0 h1:YlxIii2bTPWyC08/4hdmtYq4srbrY0T9xcTsTjldGqU= +github.com/pion/ice/v4 v4.1.0/go.mod h1:5gPbzYxqenvn05k7zKPIZFuSAufolygiy6P1U9HzvZ4= github.com/pion/interceptor v0.1.42 h1:0/4tvNtruXflBxLfApMVoMubUMik57VZ+94U0J7cmkQ= github.com/pion/interceptor v0.1.42/go.mod h1:g6XYTChs9XyolIQFhRHOOUS+bGVGLRfgTCUzH29EfVU= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= @@ -1041,8 +1041,8 @@ github.com/pion/turn/v4 v4.1.3 h1:jVNW0iR05AS94ysEtvzsrk3gKs9Zqxf6HmnsLfRvlzA= github.com/pion/turn/v4 v4.1.3/go.mod h1:TD/eiBUf5f5LwXbCJa35T7dPtTpCHRJ9oJWmyPLVT3A= github.com/pion/webrtc/v2 v2.2.7/go.mod h1:EfCuvKjzMgX4F/aSryRUC7L9o3u2N8WNUgnzd6wOO+8= github.com/pion/webrtc/v2 v2.2.9/go.mod h1:TcArPDphZIBtZ+mh8J/qOREyY3ca7ihQrenulOIvfPQ= -github.com/pion/webrtc/v4 v4.1.7 h1:sl3vFuVHa1u/7DcFbud7e1zk3sG3RjBS5GI2ckltROg= -github.com/pion/webrtc/v4 v4.1.7/go.mod h1:y3mRk8wpmOVkTTEGYB/eXAg0DPEfTEdC/Y021zRiOiM= +github.com/pion/webrtc/v4 v4.1.8 h1:ynkjfiURDQ1+8EcJsoa60yumHAmyeYjz08AaOuor+sk= +github.com/pion/webrtc/v4 v4.1.8/go.mod h1:KVaARG2RN0lZx0jc7AWTe38JpPv+1/KicOZ9jN52J/s= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1330,12 +1330,12 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1379,8 +1379,8 @@ golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1393,8 +1393,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= +golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 h1:MDfG8Cvcqlt9XXrmEiD4epKn7VJHZO84hejP9Jmp0MM= +golang.org/x/exp v0.0.0-20251209150349-8475f28825e9/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1421,8 +1421,8 @@ golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1481,8 +1481,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1503,8 +1503,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1582,8 +1582,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -1592,8 +1592,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1606,8 +1606,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1656,8 +1656,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -1739,8 +1739,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= -google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/anacrolix/torrent/client-piece-request-order.go b/vendor/github.com/anacrolix/torrent/client-piece-request-order.go index 48749cbe5a..0984b40996 100644 --- a/vendor/github.com/anacrolix/torrent/client-piece-request-order.go +++ b/vendor/github.com/anacrolix/torrent/client-piece-request-order.go @@ -31,7 +31,7 @@ type clientPieceRequestOrderSharedStorageTorrentKey clientPieceRequestOrderKey[s func (c clientPieceRequestOrderSharedStorageTorrentKey) getRequestStrategyInput(cl *Client) requestStrategy.Input { return requestStrategyInputMultiTorrent{ requestStrategyInputCommon: cl.getRequestStrategyInputCommon(), - torrents: &cl.torrentsByShortHash, + torrents: cl.torrentsByShortHash, capFunc: c.inner, } } diff --git a/vendor/github.com/anacrolix/torrent/client-tracker-announcer.go b/vendor/github.com/anacrolix/torrent/client-tracker-announcer.go index 416568ac70..f374740d67 100644 --- a/vendor/github.com/anacrolix/torrent/client-tracker-announcer.go +++ b/vendor/github.com/anacrolix/torrent/client-tracker-announcer.go @@ -121,6 +121,8 @@ func (me *regularTrackerAnnounceDispatcher) init(client *Client) { me.trackerAnnounceHead.Init(func(a, b trackerAnnounceHeadRecord) int { return cmp.Compare(a.url, b.url) }) + // Just empty url. + me.trackerAnnounceHead.SetMinRecord(trackerAnnounceHeadRecord{}) me.nextAnnounce = indexed.NewFullIndex( &me.trackerAnnounceHead, func(a, b trackerAnnounceHeadRecord) int { @@ -338,41 +340,24 @@ func (me *regularTrackerAnnounceDispatcher) updateOverdue() { end := me.overdueIndex.MinRecord() end.overdue = false end.When = now.Add(1) - var last g.Option[torrentTrackerAnnouncerKey] -again: - for { - for r := range indexed.FirstInRange(me.overdueIndex, start, end).Iter { - // Check we're making progress. - if last.Ok { - if last.Value.Compare(r.torrentTrackerAnnouncerKey) == 0 { - panicif.NotEq( - r.nextAnnounceInput, - g.OptionFromTuple(me.announceData.Get(r.torrentTrackerAnnouncerKey)).Unwrap()) - me.logger.Log(context.Background(), slog.LevelWarn, - "same item seen twice while updating overdue announces", - "last", last.Value, - "current record", fmt.Sprintf("%#v", r), - "now", now, - "cmp", r.When.Compare(now), - "after", now.After(r.When)) - break again - } - } - last.Set(r.torrentTrackerAnnouncerKey) - panicif.False(me.announceData.Update( - r.torrentTrackerAnnouncerKey, - func(value nextAnnounceInput) nextAnnounceInput { - panicif.NotEq(value, r.nextAnnounceInput) - // Must use same now as the range, or we can get stuck scanning the same window - // wondering and not moving things. - oldOverdue := value.overdue - value.overdue = value.When.Compare(now) <= 0 - panicif.Eq(value.overdue, oldOverdue) - return value - }).Exists) - continue again - } - break + + // This stops recursive thrashing while we pivot on a fixed now. + var updateKeys []torrentTrackerAnnouncerKey + for r := range indexed.IterRange(me.overdueIndex, start, end) { + updateKeys = append(updateKeys, r.torrentTrackerAnnouncerKey) + } + for _, key := range updateKeys { + // There's no guarantee we actually change anything, the overdue might remain the same due + // to timing. + panicif.False(me.announceData.Update( + key, + func(value nextAnnounceInput) nextAnnounceInput { + // For recursive updates, we make sure to monotonically progress state. (Now always + // forward, so we are always agreeing with other instances of updateOverdue). + value.overdue = value.When.Compare(time.Now()) <= 0 + return value + }, + ).Exists) } } @@ -395,6 +380,10 @@ func (me *regularTrackerAnnounceDispatcher) addKey(key torrentTrackerAnnouncerKe return } t := me.torrentFromShortInfohash(key.ShortInfohash) + if t == nil { + // Crude, but the torrent was already dropped. We probably called AddTrackers late. + return + } g.MakeMapIfNil(&me.torrentForAnnounceRequests) // This can be duplicated when there's multiple trackers for a short infohash. That's fine. me.torrentForAnnounceRequests[key.ShortInfohash] = weak.Make(t) @@ -413,8 +402,7 @@ func (me *regularTrackerAnnounceDispatcher) addKey(key torrentTrackerAnnouncerKe // Returns nil if the torrent was dropped. func (me *regularTrackerAnnounceDispatcher) torrentFromShortInfohash(short shortInfohash) *Torrent { - t, _ := me.torrentClient.torrentsByShortHash.Get(short) - return t + return me.torrentClient.torrentsByShortHash[short] } const maxConcurrentAnnouncesPerTracker = 2 @@ -435,8 +423,8 @@ func (me *regularTrackerAnnounceDispatcher) dispatchAnnounces() { expected := me.makeTorrentInput(t) if actual != expected { me.logger.Warn("announce dispatcher torrent input is not synced", - "expected", expected, - "actual", actual) + "expected", fmt.Sprintf("%#v", expected), + "actual", fmt.Sprintf("%#v", actual)) } } if !next.Value.overdue { @@ -646,7 +634,7 @@ func (me *regularTrackerAnnounceDispatcher) makeTorrentInput(t *Torrent) (_ g.Op // No torrent means the client has lost interest and the dispatcher just does followup actions. // If we drop a torrent, we still end up here but with a torrent that should result in None, so // check for that. - if t == nil || !g.MapContains(me.torrentClient.torrents, t) { + if t == nil || t.isDropped() { return } return g.Some(nextAnnounceTorrentInput{ diff --git a/vendor/github.com/anacrolix/torrent/client-unlock-handlers.go b/vendor/github.com/anacrolix/torrent/client-unlock-handlers.go index 29011aba87..e12a0756cc 100644 --- a/vendor/github.com/anacrolix/torrent/client-unlock-handlers.go +++ b/vendor/github.com/anacrolix/torrent/client-unlock-handlers.go @@ -1,6 +1,9 @@ package torrent import ( + "log/slog" + "time" + g "github.com/anacrolix/generics" "github.com/anacrolix/missinggo/v2/panicif" ) @@ -34,9 +37,12 @@ func (me *clientUnlockHandlers) addUpdateComplete(t *Torrent) { me.torrentActions[t] = v } -func (me *clientUnlockHandlers) run() { +func (me *clientUnlockHandlers) run(logger *slog.Logger) { + trackers := 0 + started := time.Now() for t, v := range me.torrentActions { if v.updateRegularTrackerAnnouncing { + trackers++ t.updateRegularTrackerAnnouncing() } if v.updateComplete { @@ -44,9 +50,14 @@ func (me *clientUnlockHandlers) run() { } delete(me.torrentActions, t) } - panicif.NotEq(len(me.torrentActions), 0) + since := time.Since(started) + // Around here the Go scheduler starts to do crazy stuff. + if since > 20*time.Millisecond { + logger.Warn("client unlock handlers took a long time", "duration", since, "trackers", trackers) + } for p := range me.changedPieceStates { p.publishStateChange() delete(me.changedPieceStates, p) } + panicif.NotEq(len(me.torrentActions), 0) } diff --git a/vendor/github.com/anacrolix/torrent/client.go b/vendor/github.com/anacrolix/torrent/client.go index 306b8e897c..3997a3af8a 100644 --- a/vendor/github.com/anacrolix/torrent/client.go +++ b/vendor/github.com/anacrolix/torrent/client.go @@ -34,6 +34,7 @@ import ( "github.com/anacrolix/missinggo/v2/panicif" "github.com/anacrolix/missinggo/v2/pproffd" "github.com/anacrolix/sync" + "github.com/anacrolix/torrent/internal/amortize" "github.com/anacrolix/torrent/internal/extracmp" "github.com/anacrolix/torrent/tracker" "github.com/anacrolix/torrent/webtorrent" @@ -66,6 +67,7 @@ type Client struct { _mu lockWithDeferreds unlockHandlers clientUnlockHandlers + check amortize.Value // Used in constrained situations when the lock is held. roaringIntIterator roaring.IntIterator event sync.Cond @@ -93,7 +95,7 @@ type Client struct { // All Torrents by their short infohashes (v1 if valid, and truncated v2 if valid). Unless the // info has been obtained, there's no knowing if an infohash belongs to v1 or v2. TODO: Make // this a weak pointer. - torrentsByShortHash syncMapTorrentsByShortHash + torrentsByShortHash map[InfoHash]*Torrent // Piece request orderings grouped by storage. Value is value type because all fields are // references. @@ -274,8 +276,9 @@ func (cl *Client) init(cfg *ClientConfig) { cl.regularTrackerAnnounceDispatcher.init(cl) cfg.setRateLimiterBursts() g.MakeMap(&cl.dopplegangerAddrs) - cl.torrentsByShortHash.Init() + g.MakeMap(&cl.torrentsByShortHash) g.MakeMap(&cl.torrents) + cl.torrentsByShortHash = make(map[metainfo.Hash]*Torrent) cl.event.L = cl.locker() cl.ipBlockList = cfg.IPBlocklist cl.httpClient = &http.Client{ @@ -330,7 +333,7 @@ func (cl *Client) init(cfg *ClientConfig) { ) { cl.lock() defer cl.unlock() - t, ok := cl.torrentsByShortHash.Get(infoHash) + t, ok := cl.torrentsByShortHash[infoHash] if !ok { return tracker.AnnounceRequest{}, errors.New("torrent not tracked by client") } @@ -344,7 +347,7 @@ func (cl *Client) init(cfg *ClientConfig) { OnConn: func(dc webtorrent.DataChannelConn, dcc webtorrent.DataChannelContext) { cl.lock() defer cl.unlock() - t, ok := cl.torrentsByShortHash.Get(dcc.InfoHash) + t, ok := cl.torrentsByShortHash[dcc.InfoHash] if !ok { cl.logger.WithDefaultLevel(log.Warning).Printf( "got webrtc conn for unloaded torrent with infohash %x", @@ -542,6 +545,7 @@ func (cl *Client) Close() (errs []error) { } // Can we not modify cl.torrents as we delete from it? panicif.NotZero(len(cl.torrents)) + panicif.NotZero(len(cl.torrentsByShortHash)) cl.clearPortMappings() for i := range cl.onClose { cl.onClose[len(cl.onClose)-1-i]() @@ -694,7 +698,10 @@ func (cl *Client) incomingConnection(nc net.Conn) { // Returns a handle to the given torrent, if it's present in the client. func (cl *Client) Torrent(ih metainfo.Hash) (t *Torrent, ok bool) { - return cl.torrentsByShortHash.Get(ih) + cl.rLock() + defer cl.rUnlock() + t, ok = cl.torrentsByShortHash[ih] + return } type DialResult struct { @@ -1017,17 +1024,32 @@ func (cl *Client) initiateHandshakes(ctx context.Context, c *PeerConn, t *Torren // Calls f with any secret keys. Note that it takes the Client lock, and so must be used from code // that won't also try to take the lock. This saves us copying all the infohashes everytime. -func (cl *Client) forSkeys(yield func([20]byte) bool) { - for ih := range cl.torrentsByShortHash.IterKeys { - if !yield(ih) { - return +func (cl *Client) forSkeys(f func([]byte) bool) { + cl.rLock() + defer cl.rUnlock() + if false { // Emulate the bug from #114 + var firstIh InfoHash + for ih := range cl.torrentsByShortHash { + firstIh = ih + break + } + for range cl.torrentsByShortHash { + if !f(firstIh[:]) { + break + } + } + return + } + for ih := range cl.torrentsByShortHash { + if !f(ih[:]) { + break } } } func (cl *Client) handshakeReceiverSecretKeys() mse.SecretKeyIter { - if cb := cl.config.Callbacks.ReceiveEncryptedHandshakeSkeys; cb != nil { - return cb + if ret := cl.config.Callbacks.ReceiveEncryptedHandshakeSkeys; ret != nil { + return ret } return cl.forSkeys } @@ -1066,18 +1088,13 @@ func (cl *Client) receiveHandshakes(c *PeerConn) (t *Torrent, err error) { return nil, fmt.Errorf("during bt handshake: %w", err) } - // Hooray for atomics. - t, _ = cl.torrentsByShortHash.Get(ih) - if t != nil { - cl.rLock() - isV2 := t.infoHashV2.Ok && *t.infoHashV2.Value.ToShort() == ih - cl.rUnlock() - if isV2 { - torrent.Add("v2 handshakes received", 1) - // PeerConn isn't owned by the Client yet. - c.v2 = true - } + cl.lock() + t = cl.torrentsByShortHash[ih] + if t != nil && t.infoHashV2.Ok && *t.infoHashV2.Value.ToShort() == ih { + torrent.Add("v2 handshakes received", 1) + c.v2 = true } + cl.unlock() return } @@ -1460,54 +1477,53 @@ func (cl *Client) AddTorrentInfoHash(infoHash metainfo.Hash) (t *Torrent, new bo return cl.AddTorrentInfoHashWithStorage(infoHash, nil) } -// Deprecated. Adds a torrent by InfoHash with a custom Storage implementation. If the torrent -// already exists then this Storage is ignored and the existing torrent returned with `new` set to -// `false` +// Deprecated. Adds a torrent by InfoHash with a custom Storage implementation. +// If the torrent already exists then this Storage is ignored and the +// existing torrent returned with `new` set to `false` func (cl *Client) AddTorrentInfoHashWithStorage( infoHash metainfo.Hash, specStorage storage.ClientImpl, ) (t *Torrent, new bool) { - return cl.AddTorrentOpt(AddTorrentOpts{ - InfoHash: infoHash, - Storage: specStorage, - }) -} + cl.lock() + defer cl.unlock() + t, ok := cl.torrentsByShortHash[infoHash] + if ok { + return + } + new = true -func (cl *Client) addTorrentReturningExisting(opts AddTorrentOpts) (t *Torrent, ok bool) { - t, ok = cl.torrentsByShortHash.Get(opts.InfoHash) - if !ok { - if opts.InfoHashV2.Ok { - t, ok = cl.torrentsByShortHash.Get(*opts.InfoHashV2.Value.ToShort()) + t = cl.newTorrent(infoHash, specStorage) + cl.eachDhtServer(func(s DhtServer) { + if cl.config.PeriodicallyAnnounceTorrentsToDht { + go t.dhtAnnouncer(s) } - } + }) + cl.torrentsByShortHash[infoHash] = t + cl.torrents[t] = struct{}{} + cl.clearAcceptLimits() + t.updateWantPeersEvent() + // Tickle Client.waitAccept, new torrent may want conns. + cl.event.Broadcast() return } // Adds a torrent by InfoHash with a custom Storage implementation. If the torrent already exists // then this Storage is ignored and the existing torrent returned with `new` set to `false`. func (cl *Client) AddTorrentOpt(opts AddTorrentOpts) (t *Torrent, new bool) { - panicif.Zero(opts.InfoHash) - - t, ok := cl.addTorrentReturningExisting(opts) - if ok && !t.closed.IsSet() { - return - } - + infoHash := opts.InfoHash + panicif.Zero(infoHash) cl.lock() defer cl.unlock() - - t, ok = cl.addTorrentReturningExisting(opts) + t, ok := cl.torrentsByShortHash[infoHash] if ok { - if !t.closed.IsSet() { + return + } + if opts.InfoHashV2.Ok { + t, ok = cl.torrentsByShortHash[*opts.InfoHashV2.Value.ToShort()] + if ok { return } - // Do we have to nuke this? Can't we just clobber it? - t.eachShortInfohash(func(short [20]byte) { - cl.torrentsByShortHash.Delete(short) - }) } - - infoHash := opts.InfoHash new = true t = cl.newTorrentOpt(opts) @@ -1516,7 +1532,7 @@ func (cl *Client) AddTorrentOpt(opts AddTorrentOpts) (t *Torrent, new bool) { go t.dhtAnnouncer(s) } }) - panicif.False(cl.torrentsByShortHash.Set(infoHash, t)) + cl.torrentsByShortHash[infoHash] = t t.setInfoBytesLocked(opts.InfoBytes) cl.clearAcceptLimits() t.updateWantPeersEvent() @@ -1581,13 +1597,17 @@ func (t *Torrent) MergeSpec(spec *TorrentSpec) error { for _, url := range spec.Webseeds { t.addWebSeed(url) } - for _, peerAddr := range spec.PeerAddrs { - t.addPeer(PeerInfo{ - Addr: StringAddr(peerAddr), - Source: PeerSourceDirect, - Trusted: true, - }) - } + t.addPeersIter(func(yield func(PeerInfo) bool) { + for _, peerAddr := range spec.PeerAddrs { + if !yield(PeerInfo{ + Addr: StringAddr(peerAddr), + Source: PeerSourceDirect, + Trusted: true, + }) { + return + } + } + }) if spec.ChunkSize != 0 { panic("chunk size cannot be changed for existing Torrent") } @@ -1766,12 +1786,12 @@ func (cl *Client) newDownloadRateLimitedReader(r io.Reader) io.Reader { } func (cl *Client) onDHTAnnouncePeer(ih metainfo.Hash, ip net.IP, port int, portOk bool) { - t, ok := cl.torrentsByShortHash.Get(ih) - if !ok { - return - } cl.lock() defer cl.unlock() + t := cl.torrentsByShortHash[ih] + if t == nil { + return + } t.addPeers([]PeerInfo{{ Addr: ipPortAddr{ip, port}, Source: PeerSourceDhtAnnouncePeer, diff --git a/vendor/github.com/anacrolix/torrent/deferrwl.go b/vendor/github.com/anacrolix/torrent/deferrwl.go index 4fc3c0af10..c0d55c4577 100644 --- a/vendor/github.com/anacrolix/torrent/deferrwl.go +++ b/vendor/github.com/anacrolix/torrent/deferrwl.go @@ -32,7 +32,7 @@ func (me *lockWithDeferreds) Unlock() { defer me.internal.Unlock() panicif.False(me.allowDefers) me.allowDefers = false - me.client.unlockHandlers.run() + me.client.unlockHandlers.run(me.client.slogger) startLen := len(me.unlockActions) var i int for i = 0; i < len(me.unlockActions); i++ { diff --git a/vendor/github.com/anacrolix/torrent/internal/amortize/amortize.go b/vendor/github.com/anacrolix/torrent/internal/amortize/amortize.go index f5a96e104c..a3e97e9da9 100644 --- a/vendor/github.com/anacrolix/torrent/internal/amortize/amortize.go +++ b/vendor/github.com/anacrolix/torrent/internal/amortize/amortize.go @@ -1,6 +1,7 @@ package amortize import ( + "math/bits" "sync/atomic" ) @@ -25,3 +26,12 @@ var global Atomic func Try() bool { return global.Try() } + +type Value struct { + count uint +} + +func (me *Value) Try() bool { + me.count++ + return bits.OnesCount(me.count) == 1 +} diff --git a/vendor/github.com/anacrolix/torrent/internal/indexed/internal-table.go b/vendor/github.com/anacrolix/torrent/internal/indexed/internal-table.go index 0790e7b4b0..1a7bb20f39 100644 --- a/vendor/github.com/anacrolix/torrent/internal/indexed/internal-table.go +++ b/vendor/github.com/anacrolix/torrent/internal/indexed/internal-table.go @@ -32,7 +32,7 @@ func (me *table[R]) SetMinRecord(min R) { func (me *table[R]) Init(cmp func(a, b R) int) { panicif.True(me.inited) - me.set = makeTidwallBtreeSet[R](cmp) + me.set = makeAjwernerSet(cmp) me.cmp = cmp me.inited = true } diff --git a/vendor/github.com/anacrolix/torrent/internal/indexed/misc.go b/vendor/github.com/anacrolix/torrent/internal/indexed/misc.go index 5123390633..5e5a03ed93 100644 --- a/vendor/github.com/anacrolix/torrent/internal/indexed/misc.go +++ b/vendor/github.com/anacrolix/torrent/internal/indexed/misc.go @@ -44,7 +44,7 @@ func NewFullMappedIndex[F, T comparable]( mapFunc func(F) T, minRecord T, ) Index[T] { - var index *Table[T] + var index *table[T] g.InitNew(&index) index.Init(cmpFunc) index.SetMinRecord(minRecord) diff --git a/vendor/github.com/anacrolix/torrent/internal/request-strategy/piece-request-order.go b/vendor/github.com/anacrolix/torrent/internal/request-strategy/piece-request-order.go index 7fa8e197b8..22f94fa118 100644 --- a/vendor/github.com/anacrolix/torrent/internal/request-strategy/piece-request-order.go +++ b/vendor/github.com/anacrolix/torrent/internal/request-strategy/piece-request-order.go @@ -1,7 +1,6 @@ package requestStrategy import ( - "iter" "unique" g "github.com/anacrolix/generics" @@ -13,7 +12,7 @@ import ( type Btree interface { Delete(PieceRequestOrderItem) Add(PieceRequestOrderItem) - // TODO: Add an iterator variant of this and benchmark. + // This is an iterator. Go can't guarantee to not allocate if you return an iterator. Scan(func(PieceRequestOrderItem) bool) Contains(PieceRequestOrderItem) bool } @@ -92,12 +91,10 @@ func (me *PieceRequestOrder) Len() int { return len(me.keys) } -func (me *PieceRequestOrder) Iter() iter.Seq[PieceRequestOrderItem] { - return func(yield func(PieceRequestOrderItem) bool) { - me.tree.Scan(func(item PieceRequestOrderItem) bool { - return yield(item) - }) - } +func (me *PieceRequestOrder) Iter(yield func(PieceRequestOrderItem) bool) { + me.tree.Scan(func(item PieceRequestOrderItem) bool { + return yield(item) + }) } func (me *PieceRequestOrder) Get(key PieceRequestOrderKey) (ret g.Option[PieceRequestOrderState]) { diff --git a/vendor/github.com/anacrolix/torrent/mse/mse.go b/vendor/github.com/anacrolix/torrent/mse/mse.go index e351a764a0..f566c63f79 100644 --- a/vendor/github.com/anacrolix/torrent/mse/mse.go +++ b/vendor/github.com/anacrolix/torrent/mse/mse.go @@ -13,7 +13,6 @@ import ( "expvar" "fmt" "io" - "iter" "math" "math/big" "strconv" @@ -438,18 +437,19 @@ func (h *handshake) receiverSteps(ctx context.Context) (ret io.ReadWriter, chose eachHash := sha1.New() var sum, xored [sha1.Size]byte err = ErrNoSecretKeyMatch - for skey := range h.skeys { + h.skeys(func(skey []byte) bool { eachHash.Reset() eachHash.Write(req2) - eachHash.Write(skey[:]) + eachHash.Write(skey) eachHash.Sum(sum[:0]) xorInPlace(xored[:], sum[:], expectedHash) if bytes.Equal(xored[:], b[:]) { - h.skey = skey[:] + h.skey = skey err = nil - break + return false } - } + return true + }) if err != nil { return } @@ -598,12 +598,9 @@ func ReceiveHandshakeEx( return } -type ( - // For performance reasons prefer a static-sized array rather than []byte. - SecretKey = [20]byte - // A function that given a function, calls it with secret keys until it returns false or exhausted. - SecretKeyIter = iter.Seq[SecretKey] -) +// A function that given a function, calls it with secret keys until it +// returns false or exhausted. +type SecretKeyIter func(callback func(skey []byte) (more bool)) func DefaultCryptoSelector(provided CryptoMethod) CryptoMethod { // We prefer plaintext for performance reasons. diff --git a/vendor/github.com/anacrolix/torrent/request-strategy-impls.go b/vendor/github.com/anacrolix/torrent/request-strategy-impls.go index d375c4b121..e67bb9f0e3 100644 --- a/vendor/github.com/anacrolix/torrent/request-strategy-impls.go +++ b/vendor/github.com/anacrolix/torrent/request-strategy-impls.go @@ -1,7 +1,7 @@ package torrent import ( - "github.com/anacrolix/missinggo/v2/panicif" + g "github.com/anacrolix/generics" requestStrategy "github.com/anacrolix/torrent/internal/request-strategy" "github.com/anacrolix/torrent/metainfo" @@ -16,20 +16,14 @@ func (r requestStrategyInputCommon) MaxUnverifiedBytes() int64 { return r.maxUnverifiedBytes } -type torrentFromHashGetter interface { - Get(shortInfohash) (*Torrent, bool) -} - type requestStrategyInputMultiTorrent struct { requestStrategyInputCommon - torrents torrentFromHashGetter + torrents map[metainfo.Hash]*Torrent capFunc storage.TorrentCapacity } func (r requestStrategyInputMultiTorrent) Torrent(ih metainfo.Hash) requestStrategy.Torrent { - t, ok := r.torrents.Get(ih) - panicif.False(ok) - return requestStrategyTorrent{t} + return requestStrategyTorrent{g.MapMustGet(r.torrents, ih)} } func (r requestStrategyInputMultiTorrent) Capacity() (int64, bool) { diff --git a/vendor/github.com/anacrolix/torrent/storage/file-misc.go b/vendor/github.com/anacrolix/torrent/storage/file-misc.go index 9d6ff33f0b..afa65f4436 100644 --- a/vendor/github.com/anacrolix/torrent/storage/file-misc.go +++ b/vendor/github.com/anacrolix/torrent/storage/file-misc.go @@ -45,8 +45,13 @@ func fsync(filePath string) (err error) { func CreateNativeZeroLengthFile(name string) error { os.MkdirAll(filepath.Dir(name), dirPerm) var f io.Closer - f, err := os.Create(name) + // Must request write perms to create and trunc. But we don't need those for a zero-length file. + f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, filePerm) if err != nil { + stat, statErr := os.Stat(name) + if statErr == nil && stat.Mode().IsRegular() && stat.Size() == 0 { + return nil + } return err } return f.Close() diff --git a/vendor/github.com/anacrolix/torrent/t.go b/vendor/github.com/anacrolix/torrent/t.go index ceea328ad0..82dffe1436 100644 --- a/vendor/github.com/anacrolix/torrent/t.go +++ b/vendor/github.com/anacrolix/torrent/t.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/anacrolix/chansync/events" + g "github.com/anacrolix/generics" "github.com/anacrolix/missinggo/v2/pubsub" "github.com/anacrolix/sync" @@ -303,3 +304,8 @@ func (t *Torrent) WebseedPeerConns() []*Peer { } return ret } + +// Was dropped from the Client. +func (t *Torrent) isDropped() bool { + return !g.MapContains(t.cl.torrents, t) +} diff --git a/vendor/github.com/anacrolix/torrent/torrent-piece-request-order.go b/vendor/github.com/anacrolix/torrent/torrent-piece-request-order.go index ebc908766f..cedc919d4f 100644 --- a/vendor/github.com/anacrolix/torrent/torrent-piece-request-order.go +++ b/vendor/github.com/anacrolix/torrent/torrent-piece-request-order.go @@ -98,7 +98,7 @@ func (t *Torrent) checkPendingPiecesMatchesRequestOrder() { } short := *t.canonicalShortInfohash() var proBitmap roaring.Bitmap - for item := range t.getPieceRequestOrder().Iter() { + for item := range t.getPieceRequestOrder().Iter { if item.Key.InfoHash.Value() != short { continue } diff --git a/vendor/github.com/anacrolix/torrent/torrent.go b/vendor/github.com/anacrolix/torrent/torrent.go index 31bfc06c74..d720e6df59 100644 --- a/vendor/github.com/anacrolix/torrent/torrent.go +++ b/vendor/github.com/anacrolix/torrent/torrent.go @@ -38,7 +38,6 @@ import ( "github.com/anacrolix/missinggo/v2/pubsub" "github.com/anacrolix/multiless" "github.com/anacrolix/sync" - "github.com/pion/webrtc/v4" "golang.org/x/sync/errgroup" "golang.org/x/time/rate" @@ -52,7 +51,6 @@ import ( pp "github.com/anacrolix/torrent/peer_protocol" utHolepunch "github.com/anacrolix/torrent/peer_protocol/ut-holepunch" "github.com/anacrolix/torrent/segments" - "github.com/anacrolix/torrent/storage" "github.com/anacrolix/torrent/tracker" typedRoaring "github.com/anacrolix/torrent/typed-roaring" @@ -369,6 +367,7 @@ func (t *Torrent) appendConns(ret []*PeerConn, f func(*PeerConn) bool) []*PeerCo return ret } +// Don't call this directly, call Torrent.addPeers* to handle events. func (t *Torrent) addPeer(p PeerInfo) (added bool) { cl := t.cl torrent.Add(fmt.Sprintf("peers added by source %q", p.Source), 1) @@ -621,7 +620,7 @@ func (t *Torrent) hashInfoBytes(b []byte, info *metainfo.Info) error { if v1Hash == t.infoHash.Value { if info.HasV2() { t.infoHashV2.Set(v2Hash) - cl.torrentsByShortHash.Set(*v2Hash.ToShort(), t) + cl.torrentsByShortHash[*v2Hash.ToShort()] = t } } else if *v2Hash.ToShort() == t.infoHash.Value { if !info.HasV2() { @@ -630,7 +629,7 @@ func (t *Torrent) hashInfoBytes(b []byte, info *metainfo.Info) error { t.infoHashV2.Set(v2Hash) t.infoHash.SetNone() if info.HasV1() { - cl.torrentsByShortHash.Set(v1Hash, t) + cl.torrentsByShortHash[v1Hash] = t t.infoHash.Set(v1Hash) } } @@ -647,7 +646,7 @@ func (t *Torrent) hashInfoBytes(b []byte, info *metainfo.Info) error { } if info.HasV1() { t.infoHash.Set(v1Hash) - cl.torrentsByShortHash.Set(v1Hash, t) + cl.torrentsByShortHash[v1Hash] = t } } else { panic("no expected infohashes") @@ -1102,7 +1101,9 @@ func (t *Torrent) numPiecesCompleted() (num pieceIndex) { func (t *Torrent) close(wg *sync.WaitGroup) { // Should only be called from the Client. panicif.False(t.closed.Set()) - // We now keep a weak pointer in torrentsByShortHash for asynchronous cleanup like announcing Stopped. + t.eachShortInfohash(func(short [20]byte) { + delete(t.cl.torrentsByShortHash, short) + }) t.deferUpdateRegularTrackerAnnouncing() t.closedCtxCancel(errTorrentClosed) t.getInfoCtxCancel(errTorrentClosed) @@ -1555,10 +1556,11 @@ func (t *Torrent) updatePeerRequestsForPiece(piece pieceIndex, reason updateRequ } } -// Stuff we don't want to run when the pending pieces change while benchmarking. +// Stuff to do when pending pieces changes. We avoid running this in some benchmarks. func (t *Torrent) onPiecePendingTriggers(piece pieceIndex) { t.maybeNewConns() t.deferPublishPieceStateChange(piece) + t.deferUpdateRegularTrackerAnnouncing() } // Pending pieces is an old bitmap of stuff we want. I think it's more nuanced than that now with @@ -1629,7 +1631,7 @@ func (t *Torrent) logPieceRequestOrder() { // benchmarking. if false { if pro != nil { - for item := range pro.Iter() { + for item := range pro.Iter { t.slogger().Debug("piece request order item", "infohash", item.Key.InfoHash, "piece", item.Key.Index, @@ -1721,21 +1723,25 @@ func (t *Torrent) maxHalfOpen() int { } func (t *Torrent) openNewConns() (initiated int) { - defer t.updateWantPeersEvent() - for t.peers.Len() != 0 { - if !t.wantOutgoingConns() { - return - } + if len(t.cl.dialers) == 0 { + return + } + if !t.wantOutgoingConns() { + return + } + numPeers := t.peers.Len() + for numPeers != 0 { if len(t.halfOpen) >= t.maxHalfOpen() { return } - if len(t.cl.dialers) == 0 { - return - } if t.cl.numHalfOpen >= t.cl.config.TotalHalfOpenConns { return } p := t.peers.PopMax() + numPeers-- + if numPeers == t.cl.config.TorrentPeersLowWater { + t.deferUpdateRegularTrackerAnnouncing() + } opts := outgoingConnOpts{ peerInfo: p, t: t, @@ -1746,6 +1752,9 @@ func (t *Torrent) openNewConns() (initiated int) { } initiateConn(opts, false) initiated++ + if t.cl.check.Try() { + panicif.NotEq(numPeers, t.peers.Len()) + } } return } @@ -1820,9 +1829,6 @@ func (t *Torrent) afterSetPieceCompletion(piece pieceIndex, changed bool) { cmpl := p.completion() complete := cmpl.Ok && cmpl.Complete p.t.updatePieceRequestOrderPiece(piece) - if complete { - t.openNewConns() - } t.deferUpdateComplete() if complete && len(p.dirtiers) != 0 { t.logger.Printf("marked piece %v complete but still has dirtiers", piece) @@ -1830,6 +1836,9 @@ func (t *Torrent) afterSetPieceCompletion(piece pieceIndex, changed bool) { if changed { t.pieceCompletionChanged(piece, "Torrent.updatePieceCompletion") } + if complete { + t.openNewConns() + } } // Non-blocking read. Client lock is not required. @@ -1908,6 +1917,11 @@ func appendMissingTrackerTiers(existing [][]string, minNumTiers int) (ret [][]st } func (t *Torrent) addTrackers(announceList [][]string) { + if t.isDropped() { + // Can't alter dropped Torrent because it may have skipped registering announce states with + // the announce dispatcher. + return + } fullAnnounceList := &t.announceList t.announceList = appendMissingTrackerTiers(*fullAnnounceList, len(announceList)) for tierIndex, trackerURLs := range announceList { @@ -1926,8 +1940,7 @@ func (t *Torrent) modifyTrackers(announceList [][]string) { }) } workers.Wait() - - clear(t.announceList) + t.announceList = nil t.addTrackers(announceList) } @@ -2277,24 +2290,23 @@ func (t *Torrent) announceRequest( func (t *Torrent) consumeDhtAnnouncePeers(pvs <-chan dht.PeersValues) { cl := t.cl for v := range pvs { - cl.lock() - added := 0 + peerInfos := make([]PeerInfo, 0, len(v.Peers)) for _, cp := range v.Peers { if cp.Port == 0 { // Can't do anything with this. continue } - if t.addPeer(PeerInfo{ + peerInfos = append(peerInfos, PeerInfo{ Addr: ipPortAddr{cp.IP, cp.Port}, Source: PeerSourceDhtGetPeers, - }) { - added++ - } + }) + } + if len(peerInfos) > 0 { + cl.lock() + t.addPeers(peerInfos) + cl.unlock() + } - cl.unlock() - // if added != 0 { - // log.Printf("added %v peers from dht for %v", added, t.InfoHash().HexString()) - // } } } @@ -2410,11 +2422,19 @@ func (t *Torrent) dhtAnnouncer(s DhtServer) { } func (t *Torrent) addPeers(peers []PeerInfo) (added int) { - for _, p := range peers { + return t.addPeersIter(slices.Values(peers)) +} + +func (t *Torrent) addPeersIter(peers iter.Seq[PeerInfo]) (added int) { + wantPeers := t.wantPeers() + for p := range peers { if t.addPeer(p) { added++ } } + if t.wantPeers() != wantPeers { + t.deferUpdateRegularTrackerAnnouncing() + } return } diff --git a/vendor/github.com/anacrolix/torrent/torrents-by-short-infohash.go b/vendor/github.com/anacrolix/torrent/torrents-by-short-infohash.go deleted file mode 100644 index f3ca331d31..0000000000 --- a/vendor/github.com/anacrolix/torrent/torrents-by-short-infohash.go +++ /dev/null @@ -1,90 +0,0 @@ -package torrent - -import ( - "iter" - "sync" - "unique" - "weak" -) - -type torrentsByShortHash interface { - Get(key shortInfohash) (*Torrent, bool) - IterKeys() iter.Seq[shortInfohash] - Init() -} - -type syncMapTorrentsByShortHash struct { - inner sync.Map -} - -type ( - syncMapTorrentsByShortHashKey = unique.Handle[shortInfohash] - syncMapTorrentsByShortHashValue = weak.Pointer[Torrent] -) - -// sync.Map is zero initialized, but we want this function in case we switch implementations. -func (me *syncMapTorrentsByShortHash) Init() {} - -func (me *syncMapTorrentsByShortHash) IterKeys(yield func(shortInfohash) bool) { - // Do we have to check the values for weak pointers? Probably should to keep the map clean - // to speed up iteration. I wonder if it will introduce overhead to forSkeys. - for key := range me.iter() { - if !yield(key) { - return - } - } -} - -func (me *syncMapTorrentsByShortHash) iter() iter.Seq2[shortInfohash, *Torrent] { - return func(yield func(shortInfohash, *Torrent) bool) { - me.inner.Range(func(key, value any) bool { - uk := key.(syncMapTorrentsByShortHashKey) - v, ok := me.derefValueOrDelete(uk, value.(syncMapTorrentsByShortHashValue)) - if !ok { - // Current value was lost, move on. - return true - } - return yield(uk.Value(), v) - }) - } -} - -func (me *syncMapTorrentsByShortHash) IsEmpty() bool { - for range me.iter() { - return false - } - return true -} - -func (me *syncMapTorrentsByShortHash) derefValueOrDelete( - key syncMapTorrentsByShortHashKey, - wp syncMapTorrentsByShortHashValue, -) (*Torrent, bool) { - t := wp.Value() - if t != nil { - return t, true - } - me.inner.CompareAndDelete(key, wp) - return nil, false -} - -func (me *syncMapTorrentsByShortHash) Get(ih shortInfohash) (t *Torrent, ok bool) { - key := unique.Make(ih) - v, ok := me.inner.Load(key) - if !ok { - return - } - wp := v.(syncMapTorrentsByShortHashValue) - return me.derefValueOrDelete(key, wp) -} - -// Returns true if the key was newly inserted. -func (me *syncMapTorrentsByShortHash) Set(ih shortInfohash, t *Torrent) bool { - _, loaded := me.inner.Swap(unique.Make(ih), weak.Make(t)) - return !loaded -} - -// Returns true if the key was newly inserted. -func (me *syncMapTorrentsByShortHash) Delete(ih shortInfohash) { - me.inner.Delete(unique.Make(ih)) -} diff --git a/vendor/github.com/anacrolix/torrent/webseed-requesting.go b/vendor/github.com/anacrolix/torrent/webseed-requesting.go index ba509be5ff..5f0705aeb9 100644 --- a/vendor/github.com/anacrolix/torrent/webseed-requesting.go +++ b/vendor/github.com/anacrolix/torrent/webseed-requesting.go @@ -380,8 +380,7 @@ func (cl *Client) iterPossibleWebseedRequests() iter.Seq2[webseedUniqueRequestKe input, value.pieces, func(ih metainfo.Hash, pieceIndex int, orderState requestStrategy.PieceRequestOrderState) bool { - t, ok := cl.torrentsByShortHash.Get(ih) - panicif.False(ok) + t := cl.torrentsByShortHash[ih] if len(t.webSeeds) == 0 { return true } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go index 0e2e96d500..c9d0bdc4cd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go @@ -3,4 +3,4 @@ package aws // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.40.1" +const goModuleVersion = "1.41.0" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go index 8d7c35a9ec..c7ef0acc4d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go @@ -18,6 +18,7 @@ var ( // Default connection pool options DefaultHTTPTransportMaxIdleConns = 100 DefaultHTTPTransportMaxIdleConnsPerHost = 10 + DefaultHTTPTransportMaxConnsPerHost = 2048 // Default connection timeouts DefaultHTTPTransportIdleConnTimeout = 90 * time.Second @@ -186,6 +187,7 @@ func defaultHTTPTransport() *http.Transport { TLSHandshakeTimeout: DefaultHTTPTransportTLSHandleshakeTimeout, MaxIdleConns: DefaultHTTPTransportMaxIdleConns, MaxIdleConnsPerHost: DefaultHTTPTransportMaxIdleConnsPerHost, + MaxConnsPerHost: DefaultHTTPTransportMaxConnsPerHost, IdleConnTimeout: DefaultHTTPTransportIdleConnTimeout, ExpectContinueTimeout: DefaultHTTPTransportExpectContinueTimeout, ForceAttemptHTTP2: true, diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md index 96241169ab..ba568ed25b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md @@ -1,3 +1,15 @@ +# v1.32.6 (2025-12-16) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.5 (2025-12-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.32.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go index f746b90384..effc38ea6d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go @@ -3,4 +3,4 @@ package config // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.32.3" +const goModuleVersion = "1.32.6" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md index d9cf2f26b7..210fb2e5bd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md @@ -1,3 +1,15 @@ +# v1.19.6 (2025-12-16) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.5 (2025-12-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.19.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go index 84c1d0298f..4e620d43dd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go @@ -3,4 +3,4 @@ package credentials // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.19.3" +const goModuleVersion = "1.19.6" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md index a7a537774c..5b9f6cc16a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.18.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.18.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go index 8ad9afa8f8..630ccb34d1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go @@ -3,4 +3,4 @@ package imds // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.15" +const goModuleVersion = "1.18.16" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md index f4a5edd69a..6ffdf06108 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.4.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.4.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go index f9790cb5dc..72df7b81bf 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go @@ -3,4 +3,4 @@ package configsources // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.4.15" +const goModuleVersion = "1.4.16" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md index f5d88c32d0..b2d3477911 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md @@ -1,3 +1,7 @@ +# v2.7.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v2.7.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go index d9929521e5..1a524ae2e5 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go @@ -3,4 +3,4 @@ package endpoints // goModuleVersion is the tagged release for this module -const goModuleVersion = "2.7.15" +const goModuleVersion = "2.7.16" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md index 402a4e7d20..743183c8df 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.13.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.13.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go index 148feaf959..a8a2e692bf 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go @@ -3,4 +3,4 @@ package presignedurl // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.15" +const goModuleVersion = "1.13.16" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md index fe9cb88753..8a8aaf8334 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.62.0 (2025-12-09) + +* **Feature**: Amazon Route 53 now supports the EU (Germany) Region (eusc-de-east-1) for latency records, geoproximity records, and private DNS for Amazon VPCs in that region + +# v1.61.2 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.61.1 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go index 89f9e05f06..1a7e585abf 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go @@ -3,4 +3,4 @@ package route53 // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.61.1" +const goModuleVersion = "1.62.0" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/types/enums.go b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/types/enums.go index e6d21f422c..a75f56cf3a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/types/enums.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/types/enums.go @@ -166,6 +166,7 @@ const ( CloudWatchRegionEuIsoeWest1 CloudWatchRegion = "eu-isoe-west-1" CloudWatchRegionApSoutheast6 CloudWatchRegion = "ap-southeast-6" CloudWatchRegionUsIsobWest1 CloudWatchRegion = "us-isob-west-1" + CloudWatchRegionEuscDeEast1 CloudWatchRegion = "eusc-de-east-1" ) // Values returns all known values for CloudWatchRegion. Note that this can be @@ -219,6 +220,7 @@ func (CloudWatchRegion) Values() []CloudWatchRegion { "eu-isoe-west-1", "ap-southeast-6", "us-isob-west-1", + "eusc-de-east-1", } } @@ -449,6 +451,7 @@ const ( ResourceRecordSetRegionUsGovWest1 ResourceRecordSetRegion = "us-gov-west-1" ResourceRecordSetRegionApEast2 ResourceRecordSetRegion = "ap-east-2" ResourceRecordSetRegionApSoutheast6 ResourceRecordSetRegion = "ap-southeast-6" + ResourceRecordSetRegionEuscDeEast1 ResourceRecordSetRegion = "eusc-de-east-1" ) // Values returns all known values for ResourceRecordSetRegion. Note that this can @@ -495,6 +498,7 @@ func (ResourceRecordSetRegion) Values() []ResourceRecordSetRegion { "us-gov-west-1", "ap-east-2", "ap-southeast-6", + "eusc-de-east-1", } } @@ -658,6 +662,7 @@ const ( VPCRegionEuIsoeWest1 VPCRegion = "eu-isoe-west-1" VPCRegionApSoutheast6 VPCRegion = "ap-southeast-6" VPCRegionUsIsobWest1 VPCRegion = "us-isob-west-1" + VPCRegionEuscDeEast1 VPCRegion = "eusc-de-east-1" ) // Values returns all known values for VPCRegion. Note that this can be expanded @@ -711,5 +716,6 @@ func (VPCRegion) Values() []VPCRegion { "eu-isoe-west-1", "ap-southeast-6", "us-isob-west-1", + "eusc-de-east-1", } } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md index 39a8a2cd75..4d6c08996e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.0.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.0.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go index 2510f96005..2424c057e8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go @@ -3,4 +3,4 @@ package signin // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.0.3" +const goModuleVersion = "1.0.4" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md index f108ccc8c4..f73d6253ed 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.30.8 (2025-12-16) + +* No change notes available for this release. + +# v1.30.7 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.30.6 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go index 747cb9e822..5d9e65e303 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go @@ -3,4 +3,4 @@ package sso // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.30.6" +const goModuleVersion = "1.30.8" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go index bbac359645..182423b4e6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go @@ -157,6 +157,9 @@ var defaultPartitions = endpoints.Partitions{ Region: "ap-east-1", }, }, + endpoints.EndpointKey{ + Region: "ap-east-2", + }: endpoints.Endpoint{}, endpoints.EndpointKey{ Region: "ap-northeast-1", }: endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md index e70dd5ea76..0ac3f8cc4c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.35.12 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.35.11 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go index 32d58763d4..1399651002 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go @@ -3,4 +3,4 @@ package ssooidc // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.35.11" +const goModuleVersion = "1.35.12" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md index 9b70885cc4..42c252ba1f 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.41.5 (2025-12-09) + +* No change notes available for this release. + +# v1.41.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.41.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go index 22d9a94a02..c081cdeb30 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go @@ -3,4 +3,4 @@ package sts // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.41.3" +const goModuleVersion = "1.41.5" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go index b2b933c566..be72d93dcc 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go @@ -390,6 +390,11 @@ var defaultPartitions = endpoints.Partitions{ }, RegionRegex: partitionRegexp.AwsEusc, IsRegionalized: true, + Endpoints: endpoints.Endpoints{ + endpoints.EndpointKey{ + Region: "eusc-de-east-1", + }: endpoints.Endpoint{}, + }, }, { ID: "aws-iso", diff --git a/vendor/github.com/charmbracelet/colorprofile/.golangci.yml b/vendor/github.com/charmbracelet/colorprofile/.golangci.yml index 929cb0ac99..c90f031611 100644 --- a/vendor/github.com/charmbracelet/colorprofile/.golangci.yml +++ b/vendor/github.com/charmbracelet/colorprofile/.golangci.yml @@ -33,6 +33,9 @@ linters: generated: lax presets: - common-false-positives + settings: + exhaustive: + default-signifies-exhaustive: true issues: max-issues-per-linter: 0 max-same-issues: 0 diff --git a/vendor/github.com/charmbracelet/colorprofile/env.go b/vendor/github.com/charmbracelet/colorprofile/env.go index 3c312c9fd9..3547324a85 100644 --- a/vendor/github.com/charmbracelet/colorprofile/env.go +++ b/vendor/github.com/charmbracelet/colorprofile/env.go @@ -83,8 +83,8 @@ func colorProfile(isatty bool, env environ) (p Profile) { } if envNoColor(env) && isatty { - if p > Ascii { - p = Ascii + if p > ASCII { + p = ASCII } return //nolint:nakedret } diff --git a/vendor/github.com/charmbracelet/colorprofile/profile.go b/vendor/github.com/charmbracelet/colorprofile/profile.go index 4eb77ca43d..4ff7f68978 100644 --- a/vendor/github.com/charmbracelet/colorprofile/profile.go +++ b/vendor/github.com/charmbracelet/colorprofile/profile.go @@ -11,10 +11,12 @@ import ( type Profile byte const ( + // Unknown is a profile that represents the absence of a profile. + Unknown Profile = iota // NoTTY is a profile with no terminal support. - NoTTY Profile = iota - // Ascii is a profile with no color support. - Ascii //nolint:revive + NoTTY + // ASCII is a profile with no color support. + ASCII // ANSI is a profile with 16 colors (4-bit). ANSI // ANSI256 is a profile with 256 colors (8-bit). @@ -23,6 +25,9 @@ const ( TrueColor ) +// Ascii is an alias for the [ASCII] profile for backwards compatibility. +const Ascii = ASCII //nolint:revive + // String returns the string representation of a Profile. func (p Profile) String() string { switch p { @@ -32,12 +37,13 @@ func (p Profile) String() string { return "ANSI256" case ANSI: return "ANSI" - case Ascii: + case ASCII: return "Ascii" case NoTTY: return "NoTTY" + default: + return "Unknown" } - return "Unknown" } var ( @@ -50,7 +56,7 @@ var ( // Convert transforms a given Color to a Color supported within the Profile. func (p Profile) Convert(c color.Color) (cc color.Color) { - if p <= Ascii { + if p <= ASCII { return nil } if p == TrueColor { @@ -90,11 +96,13 @@ func (p Profile) Convert(c color.Color) (cc color.Color) { return c default: - if p == ANSI256 { + switch p { + case ANSI256: return ansi.Convert256(c) - } else if p == ANSI { + case ANSI: return ansi.Convert16(c) + default: + return c } - return c } } diff --git a/vendor/github.com/charmbracelet/colorprofile/writer.go b/vendor/github.com/charmbracelet/colorprofile/writer.go index 47f0c6eb9b..1a88e2b7b5 100644 --- a/vendor/github.com/charmbracelet/colorprofile/writer.go +++ b/vendor/github.com/charmbracelet/colorprofile/writer.go @@ -36,12 +36,12 @@ type Writer struct { // Write writes the given text to the underlying writer. func (w *Writer) Write(p []byte) (int, error) { - switch w.Profile { - case TrueColor: + switch { + case w.Profile == TrueColor: return w.Forward.Write(p) //nolint:wrapcheck - case NoTTY: + case w.Profile <= NoTTY: return io.WriteString(w.Forward, ansi.Strip(string(p))) //nolint:wrapcheck - case Ascii, ANSI, ANSI256: + case w.Profile == ASCII, w.Profile == ANSI, w.Profile == ANSI256: return w.downsample(p) default: return 0, fmt.Errorf("invalid profile: %v", w.Profile) @@ -112,7 +112,7 @@ func handleSgr(w *Writer, p *ansi.Parser, buf *bytes.Buffer) { if w.Profile < ANSI { continue } - style = style.DefaultForegroundColor() + style = style.ForegroundColor(nil) case 40, 41, 42, 43, 44, 45, 46, 47: // 8-bit background color if w.Profile < ANSI { continue @@ -132,7 +132,7 @@ func handleSgr(w *Writer, p *ansi.Parser, buf *bytes.Buffer) { if w.Profile < ANSI { continue } - style = style.DefaultBackgroundColor() + style = style.BackgroundColor(nil) case 58: // 16 or 24-bit underline color var c color.Color if n := ansi.ReadStyleColor(params[i:], &c); n > 0 { @@ -146,7 +146,7 @@ func handleSgr(w *Writer, p *ansi.Parser, buf *bytes.Buffer) { if w.Profile < ANSI { continue } - style = style.DefaultUnderlineColor() + style = style.UnderlineColor(nil) case 90, 91, 92, 93, 94, 95, 96, 97: // 8-bit bright foreground color if w.Profile < ANSI { continue diff --git a/vendor/github.com/charmbracelet/x/ansi/style.go b/vendor/github.com/charmbracelet/x/ansi/style.go index f3344273e8..44649b42ae 100644 --- a/vendor/github.com/charmbracelet/x/ansi/style.go +++ b/vendor/github.com/charmbracelet/x/ansi/style.go @@ -504,6 +504,8 @@ const ( // See: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters func foregroundColorString(c Color) string { switch c := c.(type) { + case nil: + return attrDefaultForegroundColor case BasicColor: // 3-bit or 4-bit ANSI foreground // "3" or "9" where n is the color number from 0 to 7 @@ -562,6 +564,8 @@ func foregroundColorString(c Color) string { // See: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters func backgroundColorString(c Color) string { switch c := c.(type) { + case nil: + return attrDefaultBackgroundColor case BasicColor: // 3-bit or 4-bit ANSI foreground // "4" or "10" where n is the color number from 0 to 7 @@ -620,6 +624,8 @@ func backgroundColorString(c Color) string { // See: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters func underlineColorString(c Color) string { switch c := c.(type) { + case nil: + return attrDefaultUnderlineColor // NOTE: we can't use 3-bit and 4-bit ANSI color codes with underline // color, use 256-color instead. // diff --git a/vendor/github.com/clipperhouse/displaywidth/trie.go b/vendor/github.com/clipperhouse/displaywidth/trie.go index c63ed320ac..b03f882811 100644 --- a/vendor/github.com/clipperhouse/displaywidth/trie.go +++ b/vendor/github.com/clipperhouse/displaywidth/trie.go @@ -10,14 +10,10 @@ type property uint8 const ( // Always 0 width, includes combining marks, control characters, non-printable, etc _Zero_Width property = iota + 1 - // Always 2 wide (East Asian Wide F/W) - _East_Asian_Wide + // Always 2 wide (East Asian Wide F/W, Emoji, Regional Indicator) + _Wide // Width depends on EastAsianWidth option _East_Asian_Ambiguous - // Extended_Pictographic + Emoji_Presentation - _Emoji - // Regional Indicator symbols (used in flag emoji pairs) - _Regional_Indicator ) // lookup returns the trie value for the first UTF-8 encoding in s and @@ -83,7 +79,7 @@ func lookup[T stringish.Interface](s T) (v uint8, sz int) { return 0, 1 } -// stringWidthTrie. Total size: 17792 bytes (17.38 KiB). Checksum: a03a02693a639d4a. +// stringWidthTrie. Total size: 17664 bytes (17.25 KiB). Checksum: c77d82ff2d69f0d2. // type stringWidthTrie struct { } // func newStringWidthTrie(i int) *stringWidthTrie { @@ -98,9 +94,9 @@ func lookupValue(n uint32, b byte) uint8 { } } -// stringWidthValues: 248 blocks, 15872 entries, 15872 bytes +// stringWidthValues: 246 blocks, 15744 entries, 15744 bytes // The third block is the zero block. -var stringWidthValues = [15872]uint8{ +var stringWidthValues = [15744]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 @@ -579,13 +575,13 @@ var stringWidthValues = [15872]uint8{ 0x167f: 0x0003, // Block 0x5a, offset 0x1680 0x1692: 0x0003, - 0x169a: 0x0004, 0x169b: 0x0004, + 0x169a: 0x0002, 0x169b: 0x0002, 0x16a9: 0x0002, 0x16aa: 0x0002, // Block 0x5b, offset 0x16c0 - 0x16e9: 0x0004, - 0x16ea: 0x0004, 0x16eb: 0x0004, 0x16ec: 0x0004, - 0x16f0: 0x0004, 0x16f3: 0x0004, + 0x16e9: 0x0002, + 0x16ea: 0x0002, 0x16eb: 0x0002, 0x16ec: 0x0002, + 0x16f0: 0x0002, 0x16f3: 0x0002, // Block 0x5c, offset 0x1700 0x1720: 0x0003, 0x1721: 0x0003, 0x1722: 0x0003, 0x1723: 0x0003, 0x1724: 0x0003, 0x1725: 0x0003, 0x1726: 0x0003, 0x1727: 0x0003, 0x1728: 0x0003, 0x1729: 0x0003, @@ -644,63 +640,63 @@ var stringWidthValues = [15872]uint8{ 0x1862: 0x0003, 0x1863: 0x0003, 0x1864: 0x0003, 0x1865: 0x0003, 0x186f: 0x0003, - 0x187d: 0x0004, 0x187e: 0x0004, + 0x187d: 0x0002, 0x187e: 0x0002, // Block 0x62, offset 0x1880 0x1885: 0x0003, 0x1886: 0x0003, 0x1889: 0x0003, 0x188e: 0x0003, 0x188f: 0x0003, - 0x1894: 0x0004, 0x1895: 0x0004, + 0x1894: 0x0002, 0x1895: 0x0002, 0x189c: 0x0003, 0x189e: 0x0003, 0x18b0: 0x0002, 0x18b1: 0x0002, 0x18b2: 0x0002, 0x18b3: 0x0002, 0x18b4: 0x0002, 0x18b5: 0x0002, 0x18b6: 0x0002, 0x18b7: 0x0002, // Block 0x63, offset 0x18c0 0x18c0: 0x0003, 0x18c2: 0x0003, - 0x18c8: 0x0004, 0x18c9: 0x0004, 0x18ca: 0x0004, 0x18cb: 0x0004, - 0x18cc: 0x0004, 0x18cd: 0x0004, 0x18ce: 0x0004, 0x18cf: 0x0004, 0x18d0: 0x0004, 0x18d1: 0x0004, - 0x18d2: 0x0004, 0x18d3: 0x0004, + 0x18c8: 0x0002, 0x18c9: 0x0002, 0x18ca: 0x0002, 0x18cb: 0x0002, + 0x18cc: 0x0002, 0x18cd: 0x0002, 0x18ce: 0x0002, 0x18cf: 0x0002, 0x18d0: 0x0002, 0x18d1: 0x0002, + 0x18d2: 0x0002, 0x18d3: 0x0002, 0x18e0: 0x0003, 0x18e1: 0x0003, 0x18e3: 0x0003, 0x18e4: 0x0003, 0x18e5: 0x0003, 0x18e7: 0x0003, 0x18e8: 0x0003, 0x18e9: 0x0003, 0x18ea: 0x0003, 0x18ec: 0x0003, 0x18ed: 0x0003, 0x18ef: 0x0003, - 0x18ff: 0x0004, + 0x18ff: 0x0002, // Block 0x64, offset 0x1900 0x190a: 0x0002, 0x190b: 0x0002, 0x190c: 0x0002, 0x190d: 0x0002, 0x190e: 0x0002, 0x190f: 0x0002, - 0x1913: 0x0004, - 0x191e: 0x0003, 0x191f: 0x0003, 0x1921: 0x0004, - 0x192a: 0x0004, 0x192b: 0x0004, - 0x193d: 0x0004, 0x193e: 0x0004, 0x193f: 0x0003, + 0x1913: 0x0002, + 0x191e: 0x0003, 0x191f: 0x0003, 0x1921: 0x0002, + 0x192a: 0x0002, 0x192b: 0x0002, + 0x193d: 0x0002, 0x193e: 0x0002, 0x193f: 0x0003, // Block 0x65, offset 0x1940 - 0x1944: 0x0004, 0x1945: 0x0004, + 0x1944: 0x0002, 0x1945: 0x0002, 0x1946: 0x0003, 0x1947: 0x0003, 0x1948: 0x0003, 0x1949: 0x0003, 0x194a: 0x0003, 0x194b: 0x0003, - 0x194c: 0x0003, 0x194d: 0x0003, 0x194e: 0x0004, 0x194f: 0x0003, 0x1950: 0x0003, 0x1951: 0x0003, - 0x1952: 0x0003, 0x1953: 0x0003, 0x1954: 0x0004, 0x1955: 0x0003, 0x1956: 0x0003, 0x1957: 0x0003, + 0x194c: 0x0003, 0x194d: 0x0003, 0x194e: 0x0002, 0x194f: 0x0003, 0x1950: 0x0003, 0x1951: 0x0003, + 0x1952: 0x0003, 0x1953: 0x0003, 0x1954: 0x0002, 0x1955: 0x0003, 0x1956: 0x0003, 0x1957: 0x0003, 0x1958: 0x0003, 0x1959: 0x0003, 0x195a: 0x0003, 0x195b: 0x0003, 0x195c: 0x0003, 0x195d: 0x0003, 0x195e: 0x0003, 0x195f: 0x0003, 0x1960: 0x0003, 0x1961: 0x0003, 0x1963: 0x0003, 0x1968: 0x0003, 0x1969: 0x0003, - 0x196a: 0x0004, 0x196b: 0x0003, 0x196c: 0x0003, 0x196d: 0x0003, 0x196e: 0x0003, 0x196f: 0x0003, - 0x1970: 0x0003, 0x1971: 0x0003, 0x1972: 0x0004, 0x1973: 0x0004, 0x1974: 0x0003, 0x1975: 0x0004, - 0x1976: 0x0003, 0x1977: 0x0003, 0x1978: 0x0003, 0x1979: 0x0003, 0x197a: 0x0004, 0x197b: 0x0003, - 0x197c: 0x0003, 0x197d: 0x0004, 0x197e: 0x0003, 0x197f: 0x0003, + 0x196a: 0x0002, 0x196b: 0x0003, 0x196c: 0x0003, 0x196d: 0x0003, 0x196e: 0x0003, 0x196f: 0x0003, + 0x1970: 0x0003, 0x1971: 0x0003, 0x1972: 0x0002, 0x1973: 0x0002, 0x1974: 0x0003, 0x1975: 0x0002, + 0x1976: 0x0003, 0x1977: 0x0003, 0x1978: 0x0003, 0x1979: 0x0003, 0x197a: 0x0002, 0x197b: 0x0003, + 0x197c: 0x0003, 0x197d: 0x0002, 0x197e: 0x0003, 0x197f: 0x0003, // Block 0x66, offset 0x1980 - 0x1985: 0x0004, - 0x198a: 0x0004, 0x198b: 0x0004, - 0x19a8: 0x0004, + 0x1985: 0x0002, + 0x198a: 0x0002, 0x198b: 0x0002, + 0x19a8: 0x0002, 0x19bd: 0x0003, // Block 0x67, offset 0x19c0 - 0x19cc: 0x0004, 0x19ce: 0x0004, - 0x19d3: 0x0004, 0x19d4: 0x0004, 0x19d5: 0x0004, 0x19d7: 0x0004, + 0x19cc: 0x0002, 0x19ce: 0x0002, + 0x19d3: 0x0002, 0x19d4: 0x0002, 0x19d5: 0x0002, 0x19d7: 0x0002, 0x19f6: 0x0003, 0x19f7: 0x0003, 0x19f8: 0x0003, 0x19f9: 0x0003, 0x19fa: 0x0003, 0x19fb: 0x0003, 0x19fc: 0x0003, 0x19fd: 0x0003, 0x19fe: 0x0003, 0x19ff: 0x0003, // Block 0x68, offset 0x1a00 - 0x1a15: 0x0004, 0x1a16: 0x0004, 0x1a17: 0x0004, - 0x1a30: 0x0004, - 0x1a3f: 0x0004, + 0x1a15: 0x0002, 0x1a16: 0x0002, 0x1a17: 0x0002, + 0x1a30: 0x0002, + 0x1a3f: 0x0002, // Block 0x69, offset 0x1a40 - 0x1a5b: 0x0004, 0x1a5c: 0x0004, + 0x1a5b: 0x0002, 0x1a5c: 0x0002, // Block 0x6a, offset 0x1a80 - 0x1a90: 0x0004, - 0x1a95: 0x0004, 0x1a96: 0x0003, 0x1a97: 0x0003, + 0x1a90: 0x0002, + 0x1a95: 0x0002, 0x1a96: 0x0003, 0x1a97: 0x0003, 0x1a98: 0x0003, 0x1a99: 0x0003, // Block 0x6b, offset 0x1ac0 0x1aef: 0x0001, @@ -1275,9 +1271,9 @@ var stringWidthValues = [15872]uint8{ 0x3604: 0x0001, 0x3605: 0x0001, 0x3606: 0x0001, 0x3607: 0x0001, 0x3608: 0x0001, 0x3609: 0x0001, 0x360a: 0x0001, // Block 0xd9, offset 0x3640 - 0x3644: 0x0004, + 0x3644: 0x0002, // Block 0xda, offset 0x3680 - 0x368f: 0x0004, + 0x368f: 0x0002, // Block 0xdb, offset 0x36c0 0x36c0: 0x0003, 0x36c1: 0x0003, 0x36c2: 0x0003, 0x36c3: 0x0003, 0x36c4: 0x0003, 0x36c5: 0x0003, 0x36c6: 0x0003, 0x36c7: 0x0003, 0x36c8: 0x0003, 0x36c9: 0x0003, 0x36ca: 0x0003, @@ -1304,252 +1300,228 @@ var stringWidthValues = [15872]uint8{ // Block 0xdd, offset 0x3740 0x3740: 0x0003, 0x3741: 0x0003, 0x3742: 0x0003, 0x3743: 0x0003, 0x3744: 0x0003, 0x3745: 0x0003, 0x3746: 0x0003, 0x3747: 0x0003, 0x3748: 0x0003, 0x3749: 0x0003, 0x374a: 0x0003, 0x374b: 0x0003, - 0x374c: 0x0003, 0x374d: 0x0003, 0x374e: 0x0004, 0x374f: 0x0003, 0x3750: 0x0003, 0x3751: 0x0004, - 0x3752: 0x0004, 0x3753: 0x0004, 0x3754: 0x0004, 0x3755: 0x0004, 0x3756: 0x0004, 0x3757: 0x0004, - 0x3758: 0x0004, 0x3759: 0x0004, 0x375a: 0x0004, 0x375b: 0x0003, 0x375c: 0x0003, 0x375d: 0x0003, + 0x374c: 0x0003, 0x374d: 0x0003, 0x374e: 0x0002, 0x374f: 0x0003, 0x3750: 0x0003, 0x3751: 0x0002, + 0x3752: 0x0002, 0x3753: 0x0002, 0x3754: 0x0002, 0x3755: 0x0002, 0x3756: 0x0002, 0x3757: 0x0002, + 0x3758: 0x0002, 0x3759: 0x0002, 0x375a: 0x0002, 0x375b: 0x0003, 0x375c: 0x0003, 0x375d: 0x0003, 0x375e: 0x0003, 0x375f: 0x0003, 0x3760: 0x0003, 0x3761: 0x0003, 0x3762: 0x0003, 0x3763: 0x0003, 0x3764: 0x0003, 0x3765: 0x0003, 0x3766: 0x0003, 0x3767: 0x0003, 0x3768: 0x0003, 0x3769: 0x0003, 0x376a: 0x0003, 0x376b: 0x0003, 0x376c: 0x0003, // Block 0xde, offset 0x3780 - 0x37a6: 0x0005, 0x37a7: 0x0005, 0x37a8: 0x0005, 0x37a9: 0x0005, - 0x37aa: 0x0005, 0x37ab: 0x0005, 0x37ac: 0x0005, 0x37ad: 0x0005, 0x37ae: 0x0005, 0x37af: 0x0005, - 0x37b0: 0x0005, 0x37b1: 0x0005, 0x37b2: 0x0005, 0x37b3: 0x0005, 0x37b4: 0x0005, 0x37b5: 0x0005, - 0x37b6: 0x0005, 0x37b7: 0x0005, 0x37b8: 0x0005, 0x37b9: 0x0005, 0x37ba: 0x0005, 0x37bb: 0x0005, - 0x37bc: 0x0005, 0x37bd: 0x0005, 0x37be: 0x0005, 0x37bf: 0x0005, + 0x37a6: 0x0002, 0x37a7: 0x0002, 0x37a8: 0x0002, 0x37a9: 0x0002, + 0x37aa: 0x0002, 0x37ab: 0x0002, 0x37ac: 0x0002, 0x37ad: 0x0002, 0x37ae: 0x0002, 0x37af: 0x0002, + 0x37b0: 0x0002, 0x37b1: 0x0002, 0x37b2: 0x0002, 0x37b3: 0x0002, 0x37b4: 0x0002, 0x37b5: 0x0002, + 0x37b6: 0x0002, 0x37b7: 0x0002, 0x37b8: 0x0002, 0x37b9: 0x0002, 0x37ba: 0x0002, 0x37bb: 0x0002, + 0x37bc: 0x0002, 0x37bd: 0x0002, 0x37be: 0x0002, 0x37bf: 0x0002, // Block 0xdf, offset 0x37c0 - 0x37c0: 0x0002, 0x37c1: 0x0004, 0x37c2: 0x0002, + 0x37c0: 0x0002, 0x37c1: 0x0002, 0x37c2: 0x0002, 0x37d0: 0x0002, 0x37d1: 0x0002, 0x37d2: 0x0002, 0x37d3: 0x0002, 0x37d4: 0x0002, 0x37d5: 0x0002, 0x37d6: 0x0002, 0x37d7: 0x0002, - 0x37d8: 0x0002, 0x37d9: 0x0002, 0x37da: 0x0004, 0x37db: 0x0002, 0x37dc: 0x0002, 0x37dd: 0x0002, + 0x37d8: 0x0002, 0x37d9: 0x0002, 0x37da: 0x0002, 0x37db: 0x0002, 0x37dc: 0x0002, 0x37dd: 0x0002, 0x37de: 0x0002, 0x37df: 0x0002, 0x37e0: 0x0002, 0x37e1: 0x0002, 0x37e2: 0x0002, 0x37e3: 0x0002, 0x37e4: 0x0002, 0x37e5: 0x0002, 0x37e6: 0x0002, 0x37e7: 0x0002, 0x37e8: 0x0002, 0x37e9: 0x0002, - 0x37ea: 0x0002, 0x37eb: 0x0002, 0x37ec: 0x0002, 0x37ed: 0x0002, 0x37ee: 0x0002, 0x37ef: 0x0004, - 0x37f0: 0x0002, 0x37f1: 0x0002, 0x37f2: 0x0004, 0x37f3: 0x0004, 0x37f4: 0x0004, 0x37f5: 0x0004, - 0x37f6: 0x0004, 0x37f7: 0x0002, 0x37f8: 0x0004, 0x37f9: 0x0004, 0x37fa: 0x0004, 0x37fb: 0x0002, + 0x37ea: 0x0002, 0x37eb: 0x0002, 0x37ec: 0x0002, 0x37ed: 0x0002, 0x37ee: 0x0002, 0x37ef: 0x0002, + 0x37f0: 0x0002, 0x37f1: 0x0002, 0x37f2: 0x0002, 0x37f3: 0x0002, 0x37f4: 0x0002, 0x37f5: 0x0002, + 0x37f6: 0x0002, 0x37f7: 0x0002, 0x37f8: 0x0002, 0x37f9: 0x0002, 0x37fa: 0x0002, 0x37fb: 0x0002, // Block 0xe0, offset 0x3800 0x3800: 0x0002, 0x3801: 0x0002, 0x3802: 0x0002, 0x3803: 0x0002, 0x3804: 0x0002, 0x3805: 0x0002, 0x3806: 0x0002, 0x3807: 0x0002, 0x3808: 0x0002, - 0x3810: 0x0004, 0x3811: 0x0004, + 0x3810: 0x0002, 0x3811: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002, 0x3824: 0x0002, 0x3825: 0x0002, // Block 0xe1, offset 0x3840 - 0x3840: 0x0004, 0x3841: 0x0004, 0x3842: 0x0004, 0x3843: 0x0004, 0x3844: 0x0004, 0x3845: 0x0004, - 0x3846: 0x0004, 0x3847: 0x0004, 0x3848: 0x0004, 0x3849: 0x0004, 0x384a: 0x0004, 0x384b: 0x0004, - 0x384c: 0x0004, 0x384d: 0x0004, 0x384e: 0x0004, 0x384f: 0x0004, 0x3850: 0x0004, 0x3851: 0x0004, - 0x3852: 0x0004, 0x3853: 0x0004, 0x3854: 0x0004, 0x3855: 0x0004, 0x3856: 0x0004, 0x3857: 0x0004, - 0x3858: 0x0004, 0x3859: 0x0004, 0x385a: 0x0004, 0x385b: 0x0004, 0x385c: 0x0004, 0x385d: 0x0004, - 0x385e: 0x0004, 0x385f: 0x0004, 0x3860: 0x0004, - 0x386d: 0x0004, 0x386e: 0x0004, 0x386f: 0x0004, - 0x3870: 0x0004, 0x3871: 0x0004, 0x3872: 0x0004, 0x3873: 0x0004, 0x3874: 0x0004, 0x3875: 0x0004, - 0x3877: 0x0004, 0x3878: 0x0004, 0x3879: 0x0004, 0x387a: 0x0004, 0x387b: 0x0004, - 0x387c: 0x0004, 0x387d: 0x0004, 0x387e: 0x0004, 0x387f: 0x0004, + 0x3840: 0x0002, 0x3841: 0x0002, 0x3842: 0x0002, 0x3843: 0x0002, 0x3844: 0x0002, 0x3845: 0x0002, + 0x3846: 0x0002, 0x3847: 0x0002, 0x3848: 0x0002, 0x3849: 0x0002, 0x384a: 0x0002, 0x384b: 0x0002, + 0x384c: 0x0002, 0x384d: 0x0002, 0x384e: 0x0002, 0x384f: 0x0002, 0x3850: 0x0002, 0x3851: 0x0002, + 0x3852: 0x0002, 0x3853: 0x0002, 0x3854: 0x0002, 0x3855: 0x0002, 0x3856: 0x0002, 0x3857: 0x0002, + 0x3858: 0x0002, 0x3859: 0x0002, 0x385a: 0x0002, 0x385b: 0x0002, 0x385c: 0x0002, 0x385d: 0x0002, + 0x385e: 0x0002, 0x385f: 0x0002, 0x3860: 0x0002, + 0x386d: 0x0002, 0x386e: 0x0002, 0x386f: 0x0002, + 0x3870: 0x0002, 0x3871: 0x0002, 0x3872: 0x0002, 0x3873: 0x0002, 0x3874: 0x0002, 0x3875: 0x0002, + 0x3877: 0x0002, 0x3878: 0x0002, 0x3879: 0x0002, 0x387a: 0x0002, 0x387b: 0x0002, + 0x387c: 0x0002, 0x387d: 0x0002, 0x387e: 0x0002, 0x387f: 0x0002, // Block 0xe2, offset 0x3880 - 0x3880: 0x0004, 0x3881: 0x0004, 0x3882: 0x0004, 0x3883: 0x0004, 0x3884: 0x0004, 0x3885: 0x0004, - 0x3886: 0x0004, 0x3887: 0x0004, 0x3888: 0x0004, 0x3889: 0x0004, 0x388a: 0x0004, 0x388b: 0x0004, - 0x388c: 0x0004, 0x388d: 0x0004, 0x388e: 0x0004, 0x388f: 0x0004, 0x3890: 0x0004, 0x3891: 0x0004, - 0x3892: 0x0004, 0x3893: 0x0004, 0x3894: 0x0004, 0x3895: 0x0004, 0x3896: 0x0004, 0x3897: 0x0004, - 0x3898: 0x0004, 0x3899: 0x0004, 0x389a: 0x0004, 0x389b: 0x0004, 0x389c: 0x0004, 0x389d: 0x0004, - 0x389e: 0x0004, 0x389f: 0x0004, 0x38a0: 0x0004, 0x38a1: 0x0004, 0x38a2: 0x0004, 0x38a3: 0x0004, - 0x38a4: 0x0004, 0x38a5: 0x0004, 0x38a6: 0x0004, 0x38a7: 0x0004, 0x38a8: 0x0004, 0x38a9: 0x0004, - 0x38aa: 0x0004, 0x38ab: 0x0004, 0x38ac: 0x0004, 0x38ad: 0x0004, 0x38ae: 0x0004, 0x38af: 0x0004, - 0x38b0: 0x0004, 0x38b1: 0x0004, 0x38b2: 0x0004, 0x38b3: 0x0004, 0x38b4: 0x0004, 0x38b5: 0x0004, - 0x38b6: 0x0004, 0x38b7: 0x0004, 0x38b8: 0x0004, 0x38b9: 0x0004, 0x38ba: 0x0004, 0x38bb: 0x0004, - 0x38bc: 0x0004, 0x38be: 0x0004, 0x38bf: 0x0004, + 0x3880: 0x0002, 0x3881: 0x0002, 0x3882: 0x0002, 0x3883: 0x0002, 0x3884: 0x0002, 0x3885: 0x0002, + 0x3886: 0x0002, 0x3887: 0x0002, 0x3888: 0x0002, 0x3889: 0x0002, 0x388a: 0x0002, 0x388b: 0x0002, + 0x388c: 0x0002, 0x388d: 0x0002, 0x388e: 0x0002, 0x388f: 0x0002, 0x3890: 0x0002, 0x3891: 0x0002, + 0x3892: 0x0002, 0x3893: 0x0002, 0x3894: 0x0002, 0x3895: 0x0002, 0x3896: 0x0002, 0x3897: 0x0002, + 0x3898: 0x0002, 0x3899: 0x0002, 0x389a: 0x0002, 0x389b: 0x0002, 0x389c: 0x0002, 0x389d: 0x0002, + 0x389e: 0x0002, 0x389f: 0x0002, 0x38a0: 0x0002, 0x38a1: 0x0002, 0x38a2: 0x0002, 0x38a3: 0x0002, + 0x38a4: 0x0002, 0x38a5: 0x0002, 0x38a6: 0x0002, 0x38a7: 0x0002, 0x38a8: 0x0002, 0x38a9: 0x0002, + 0x38aa: 0x0002, 0x38ab: 0x0002, 0x38ac: 0x0002, 0x38ad: 0x0002, 0x38ae: 0x0002, 0x38af: 0x0002, + 0x38b0: 0x0002, 0x38b1: 0x0002, 0x38b2: 0x0002, 0x38b3: 0x0002, 0x38b4: 0x0002, 0x38b5: 0x0002, + 0x38b6: 0x0002, 0x38b7: 0x0002, 0x38b8: 0x0002, 0x38b9: 0x0002, 0x38ba: 0x0002, 0x38bb: 0x0002, + 0x38bc: 0x0002, 0x38be: 0x0002, 0x38bf: 0x0002, // Block 0xe3, offset 0x38c0 - 0x38c0: 0x0004, 0x38c1: 0x0004, 0x38c2: 0x0004, 0x38c3: 0x0004, 0x38c4: 0x0004, 0x38c5: 0x0004, - 0x38c6: 0x0004, 0x38c7: 0x0004, 0x38c8: 0x0004, 0x38c9: 0x0004, 0x38ca: 0x0004, 0x38cb: 0x0004, - 0x38cc: 0x0004, 0x38cd: 0x0004, 0x38ce: 0x0004, 0x38cf: 0x0004, 0x38d0: 0x0004, 0x38d1: 0x0004, - 0x38d2: 0x0004, 0x38d3: 0x0004, - 0x38e0: 0x0004, 0x38e1: 0x0004, 0x38e2: 0x0004, 0x38e3: 0x0004, - 0x38e4: 0x0004, 0x38e5: 0x0004, 0x38e6: 0x0004, 0x38e7: 0x0004, 0x38e8: 0x0004, 0x38e9: 0x0004, - 0x38ea: 0x0004, 0x38eb: 0x0004, 0x38ec: 0x0004, 0x38ed: 0x0004, 0x38ee: 0x0004, 0x38ef: 0x0004, - 0x38f0: 0x0004, 0x38f1: 0x0004, 0x38f2: 0x0004, 0x38f3: 0x0004, 0x38f4: 0x0004, 0x38f5: 0x0004, - 0x38f6: 0x0004, 0x38f7: 0x0004, 0x38f8: 0x0004, 0x38f9: 0x0004, 0x38fa: 0x0004, 0x38fb: 0x0004, - 0x38fc: 0x0004, 0x38fd: 0x0004, 0x38fe: 0x0004, 0x38ff: 0x0004, + 0x38c0: 0x0002, 0x38c1: 0x0002, 0x38c2: 0x0002, 0x38c3: 0x0002, 0x38c4: 0x0002, 0x38c5: 0x0002, + 0x38c6: 0x0002, 0x38c7: 0x0002, 0x38c8: 0x0002, 0x38c9: 0x0002, 0x38ca: 0x0002, 0x38cb: 0x0002, + 0x38cc: 0x0002, 0x38cd: 0x0002, 0x38ce: 0x0002, 0x38cf: 0x0002, 0x38d0: 0x0002, 0x38d1: 0x0002, + 0x38d2: 0x0002, 0x38d3: 0x0002, + 0x38e0: 0x0002, 0x38e1: 0x0002, 0x38e2: 0x0002, 0x38e3: 0x0002, + 0x38e4: 0x0002, 0x38e5: 0x0002, 0x38e6: 0x0002, 0x38e7: 0x0002, 0x38e8: 0x0002, 0x38e9: 0x0002, + 0x38ea: 0x0002, 0x38eb: 0x0002, 0x38ec: 0x0002, 0x38ed: 0x0002, 0x38ee: 0x0002, 0x38ef: 0x0002, + 0x38f0: 0x0002, 0x38f1: 0x0002, 0x38f2: 0x0002, 0x38f3: 0x0002, 0x38f4: 0x0002, 0x38f5: 0x0002, + 0x38f6: 0x0002, 0x38f7: 0x0002, 0x38f8: 0x0002, 0x38f9: 0x0002, 0x38fa: 0x0002, 0x38fb: 0x0002, + 0x38fc: 0x0002, 0x38fd: 0x0002, 0x38fe: 0x0002, 0x38ff: 0x0002, // Block 0xe4, offset 0x3900 - 0x3900: 0x0004, 0x3901: 0x0004, 0x3902: 0x0004, 0x3903: 0x0004, 0x3904: 0x0004, 0x3905: 0x0004, - 0x3906: 0x0004, 0x3907: 0x0004, 0x3908: 0x0004, 0x3909: 0x0004, 0x390a: 0x0004, - 0x390f: 0x0004, 0x3910: 0x0004, 0x3911: 0x0004, - 0x3912: 0x0004, 0x3913: 0x0004, - 0x3920: 0x0004, 0x3921: 0x0004, 0x3922: 0x0004, 0x3923: 0x0004, - 0x3924: 0x0004, 0x3925: 0x0004, 0x3926: 0x0004, 0x3927: 0x0004, 0x3928: 0x0004, 0x3929: 0x0004, - 0x392a: 0x0004, 0x392b: 0x0004, 0x392c: 0x0004, 0x392d: 0x0004, 0x392e: 0x0004, 0x392f: 0x0004, - 0x3930: 0x0004, 0x3934: 0x0004, - 0x3938: 0x0004, 0x3939: 0x0004, 0x393a: 0x0004, 0x393b: 0x0002, + 0x3900: 0x0002, 0x3901: 0x0002, 0x3902: 0x0002, 0x3903: 0x0002, 0x3904: 0x0002, 0x3905: 0x0002, + 0x3906: 0x0002, 0x3907: 0x0002, 0x3908: 0x0002, 0x3909: 0x0002, 0x390a: 0x0002, + 0x390f: 0x0002, 0x3910: 0x0002, 0x3911: 0x0002, + 0x3912: 0x0002, 0x3913: 0x0002, + 0x3920: 0x0002, 0x3921: 0x0002, 0x3922: 0x0002, 0x3923: 0x0002, + 0x3924: 0x0002, 0x3925: 0x0002, 0x3926: 0x0002, 0x3927: 0x0002, 0x3928: 0x0002, 0x3929: 0x0002, + 0x392a: 0x0002, 0x392b: 0x0002, 0x392c: 0x0002, 0x392d: 0x0002, 0x392e: 0x0002, 0x392f: 0x0002, + 0x3930: 0x0002, 0x3934: 0x0002, + 0x3938: 0x0002, 0x3939: 0x0002, 0x393a: 0x0002, 0x393b: 0x0002, 0x393c: 0x0002, 0x393d: 0x0002, 0x393e: 0x0002, 0x393f: 0x0002, // Block 0xe5, offset 0x3940 - 0x3940: 0x0004, 0x3941: 0x0004, 0x3942: 0x0004, 0x3943: 0x0004, 0x3944: 0x0004, 0x3945: 0x0004, - 0x3946: 0x0004, 0x3947: 0x0004, 0x3948: 0x0004, 0x3949: 0x0004, 0x394a: 0x0004, 0x394b: 0x0004, - 0x394c: 0x0004, 0x394d: 0x0004, 0x394e: 0x0004, 0x394f: 0x0004, 0x3950: 0x0004, 0x3951: 0x0004, - 0x3952: 0x0004, 0x3953: 0x0004, 0x3954: 0x0004, 0x3955: 0x0004, 0x3956: 0x0004, 0x3957: 0x0004, - 0x3958: 0x0004, 0x3959: 0x0004, 0x395a: 0x0004, 0x395b: 0x0004, 0x395c: 0x0004, 0x395d: 0x0004, - 0x395e: 0x0004, 0x395f: 0x0004, 0x3960: 0x0004, 0x3961: 0x0004, 0x3962: 0x0004, 0x3963: 0x0004, - 0x3964: 0x0004, 0x3965: 0x0004, 0x3966: 0x0004, 0x3967: 0x0004, 0x3968: 0x0004, 0x3969: 0x0004, - 0x396a: 0x0004, 0x396b: 0x0004, 0x396c: 0x0004, 0x396d: 0x0004, 0x396e: 0x0004, 0x396f: 0x0004, - 0x3970: 0x0004, 0x3971: 0x0004, 0x3972: 0x0004, 0x3973: 0x0004, 0x3974: 0x0004, 0x3975: 0x0004, - 0x3976: 0x0004, 0x3977: 0x0004, 0x3978: 0x0004, 0x3979: 0x0004, 0x397a: 0x0004, 0x397b: 0x0004, - 0x397c: 0x0004, 0x397d: 0x0004, 0x397e: 0x0004, + 0x3940: 0x0002, 0x3941: 0x0002, 0x3942: 0x0002, 0x3943: 0x0002, 0x3944: 0x0002, 0x3945: 0x0002, + 0x3946: 0x0002, 0x3947: 0x0002, 0x3948: 0x0002, 0x3949: 0x0002, 0x394a: 0x0002, 0x394b: 0x0002, + 0x394c: 0x0002, 0x394d: 0x0002, 0x394e: 0x0002, 0x394f: 0x0002, 0x3950: 0x0002, 0x3951: 0x0002, + 0x3952: 0x0002, 0x3953: 0x0002, 0x3954: 0x0002, 0x3955: 0x0002, 0x3956: 0x0002, 0x3957: 0x0002, + 0x3958: 0x0002, 0x3959: 0x0002, 0x395a: 0x0002, 0x395b: 0x0002, 0x395c: 0x0002, 0x395d: 0x0002, + 0x395e: 0x0002, 0x395f: 0x0002, 0x3960: 0x0002, 0x3961: 0x0002, 0x3962: 0x0002, 0x3963: 0x0002, + 0x3964: 0x0002, 0x3965: 0x0002, 0x3966: 0x0002, 0x3967: 0x0002, 0x3968: 0x0002, 0x3969: 0x0002, + 0x396a: 0x0002, 0x396b: 0x0002, 0x396c: 0x0002, 0x396d: 0x0002, 0x396e: 0x0002, 0x396f: 0x0002, + 0x3970: 0x0002, 0x3971: 0x0002, 0x3972: 0x0002, 0x3973: 0x0002, 0x3974: 0x0002, 0x3975: 0x0002, + 0x3976: 0x0002, 0x3977: 0x0002, 0x3978: 0x0002, 0x3979: 0x0002, 0x397a: 0x0002, 0x397b: 0x0002, + 0x397c: 0x0002, 0x397d: 0x0002, 0x397e: 0x0002, // Block 0xe6, offset 0x3980 - 0x3980: 0x0004, 0x3982: 0x0004, 0x3983: 0x0004, 0x3984: 0x0004, 0x3985: 0x0004, - 0x3986: 0x0004, 0x3987: 0x0004, 0x3988: 0x0004, 0x3989: 0x0004, 0x398a: 0x0004, 0x398b: 0x0004, - 0x398c: 0x0004, 0x398d: 0x0004, 0x398e: 0x0004, 0x398f: 0x0004, 0x3990: 0x0004, 0x3991: 0x0004, - 0x3992: 0x0004, 0x3993: 0x0004, 0x3994: 0x0004, 0x3995: 0x0004, 0x3996: 0x0004, 0x3997: 0x0004, - 0x3998: 0x0004, 0x3999: 0x0004, 0x399a: 0x0004, 0x399b: 0x0004, 0x399c: 0x0004, 0x399d: 0x0004, - 0x399e: 0x0004, 0x399f: 0x0004, 0x39a0: 0x0004, 0x39a1: 0x0004, 0x39a2: 0x0004, 0x39a3: 0x0004, - 0x39a4: 0x0004, 0x39a5: 0x0004, 0x39a6: 0x0004, 0x39a7: 0x0004, 0x39a8: 0x0004, 0x39a9: 0x0004, - 0x39aa: 0x0004, 0x39ab: 0x0004, 0x39ac: 0x0004, 0x39ad: 0x0004, 0x39ae: 0x0004, 0x39af: 0x0004, - 0x39b0: 0x0004, 0x39b1: 0x0004, 0x39b2: 0x0004, 0x39b3: 0x0004, 0x39b4: 0x0004, 0x39b5: 0x0004, - 0x39b6: 0x0004, 0x39b7: 0x0004, 0x39b8: 0x0004, 0x39b9: 0x0004, 0x39ba: 0x0004, 0x39bb: 0x0004, - 0x39bc: 0x0004, 0x39bd: 0x0004, 0x39be: 0x0004, 0x39bf: 0x0004, + 0x3980: 0x0002, 0x3982: 0x0002, 0x3983: 0x0002, 0x3984: 0x0002, 0x3985: 0x0002, + 0x3986: 0x0002, 0x3987: 0x0002, 0x3988: 0x0002, 0x3989: 0x0002, 0x398a: 0x0002, 0x398b: 0x0002, + 0x398c: 0x0002, 0x398d: 0x0002, 0x398e: 0x0002, 0x398f: 0x0002, 0x3990: 0x0002, 0x3991: 0x0002, + 0x3992: 0x0002, 0x3993: 0x0002, 0x3994: 0x0002, 0x3995: 0x0002, 0x3996: 0x0002, 0x3997: 0x0002, + 0x3998: 0x0002, 0x3999: 0x0002, 0x399a: 0x0002, 0x399b: 0x0002, 0x399c: 0x0002, 0x399d: 0x0002, + 0x399e: 0x0002, 0x399f: 0x0002, 0x39a0: 0x0002, 0x39a1: 0x0002, 0x39a2: 0x0002, 0x39a3: 0x0002, + 0x39a4: 0x0002, 0x39a5: 0x0002, 0x39a6: 0x0002, 0x39a7: 0x0002, 0x39a8: 0x0002, 0x39a9: 0x0002, + 0x39aa: 0x0002, 0x39ab: 0x0002, 0x39ac: 0x0002, 0x39ad: 0x0002, 0x39ae: 0x0002, 0x39af: 0x0002, + 0x39b0: 0x0002, 0x39b1: 0x0002, 0x39b2: 0x0002, 0x39b3: 0x0002, 0x39b4: 0x0002, 0x39b5: 0x0002, + 0x39b6: 0x0002, 0x39b7: 0x0002, 0x39b8: 0x0002, 0x39b9: 0x0002, 0x39ba: 0x0002, 0x39bb: 0x0002, + 0x39bc: 0x0002, 0x39bd: 0x0002, 0x39be: 0x0002, 0x39bf: 0x0002, // Block 0xe7, offset 0x39c0 - 0x39c0: 0x0004, 0x39c1: 0x0004, 0x39c2: 0x0004, 0x39c3: 0x0004, 0x39c4: 0x0004, 0x39c5: 0x0004, - 0x39c6: 0x0004, 0x39c7: 0x0004, 0x39c8: 0x0004, 0x39c9: 0x0004, 0x39ca: 0x0004, 0x39cb: 0x0004, - 0x39cc: 0x0004, 0x39cd: 0x0004, 0x39ce: 0x0004, 0x39cf: 0x0004, 0x39d0: 0x0004, 0x39d1: 0x0004, - 0x39d2: 0x0004, 0x39d3: 0x0004, 0x39d4: 0x0004, 0x39d5: 0x0004, 0x39d6: 0x0004, 0x39d7: 0x0004, - 0x39d8: 0x0004, 0x39d9: 0x0004, 0x39da: 0x0004, 0x39db: 0x0004, 0x39dc: 0x0004, 0x39dd: 0x0004, - 0x39de: 0x0004, 0x39df: 0x0004, 0x39e0: 0x0004, 0x39e1: 0x0004, 0x39e2: 0x0004, 0x39e3: 0x0004, - 0x39e4: 0x0004, 0x39e5: 0x0004, 0x39e6: 0x0004, 0x39e7: 0x0004, 0x39e8: 0x0004, 0x39e9: 0x0004, - 0x39ea: 0x0004, 0x39eb: 0x0004, 0x39ec: 0x0004, 0x39ed: 0x0004, 0x39ee: 0x0004, 0x39ef: 0x0004, - 0x39f0: 0x0004, 0x39f1: 0x0004, 0x39f2: 0x0004, 0x39f3: 0x0004, 0x39f4: 0x0004, 0x39f5: 0x0004, - 0x39f6: 0x0004, 0x39f7: 0x0004, 0x39f8: 0x0004, 0x39f9: 0x0004, 0x39fa: 0x0004, 0x39fb: 0x0004, - 0x39fc: 0x0004, 0x39fd: 0x0004, 0x39fe: 0x0004, 0x39ff: 0x0004, + 0x39c0: 0x0002, 0x39c1: 0x0002, 0x39c2: 0x0002, 0x39c3: 0x0002, 0x39c4: 0x0002, 0x39c5: 0x0002, + 0x39c6: 0x0002, 0x39c7: 0x0002, 0x39c8: 0x0002, 0x39c9: 0x0002, 0x39ca: 0x0002, 0x39cb: 0x0002, + 0x39cc: 0x0002, 0x39cd: 0x0002, 0x39ce: 0x0002, 0x39cf: 0x0002, 0x39d0: 0x0002, 0x39d1: 0x0002, + 0x39d2: 0x0002, 0x39d3: 0x0002, 0x39d4: 0x0002, 0x39d5: 0x0002, 0x39d6: 0x0002, 0x39d7: 0x0002, + 0x39d8: 0x0002, 0x39d9: 0x0002, 0x39da: 0x0002, 0x39db: 0x0002, 0x39dc: 0x0002, 0x39dd: 0x0002, + 0x39de: 0x0002, 0x39df: 0x0002, 0x39e0: 0x0002, 0x39e1: 0x0002, 0x39e2: 0x0002, 0x39e3: 0x0002, + 0x39e4: 0x0002, 0x39e5: 0x0002, 0x39e6: 0x0002, 0x39e7: 0x0002, 0x39e8: 0x0002, 0x39e9: 0x0002, + 0x39ea: 0x0002, 0x39eb: 0x0002, 0x39ec: 0x0002, 0x39ed: 0x0002, 0x39ee: 0x0002, 0x39ef: 0x0002, + 0x39f0: 0x0002, 0x39f1: 0x0002, 0x39f2: 0x0002, 0x39f3: 0x0002, 0x39f4: 0x0002, 0x39f5: 0x0002, + 0x39f6: 0x0002, 0x39f7: 0x0002, 0x39f8: 0x0002, 0x39f9: 0x0002, 0x39fa: 0x0002, 0x39fb: 0x0002, + 0x39fc: 0x0002, 0x39ff: 0x0002, // Block 0xe8, offset 0x3a00 - 0x3a00: 0x0004, 0x3a01: 0x0004, 0x3a02: 0x0004, 0x3a03: 0x0004, 0x3a04: 0x0004, 0x3a05: 0x0004, - 0x3a06: 0x0004, 0x3a07: 0x0004, 0x3a08: 0x0004, 0x3a09: 0x0004, 0x3a0a: 0x0004, 0x3a0b: 0x0004, - 0x3a0c: 0x0004, 0x3a0d: 0x0004, 0x3a0e: 0x0004, 0x3a0f: 0x0004, 0x3a10: 0x0004, 0x3a11: 0x0004, - 0x3a12: 0x0004, 0x3a13: 0x0004, 0x3a14: 0x0004, 0x3a15: 0x0004, 0x3a16: 0x0004, 0x3a17: 0x0004, - 0x3a18: 0x0004, 0x3a19: 0x0004, 0x3a1a: 0x0004, 0x3a1b: 0x0004, 0x3a1c: 0x0004, 0x3a1d: 0x0004, - 0x3a1e: 0x0004, 0x3a1f: 0x0004, 0x3a20: 0x0004, 0x3a21: 0x0004, 0x3a22: 0x0004, 0x3a23: 0x0004, - 0x3a24: 0x0004, 0x3a25: 0x0004, 0x3a26: 0x0004, 0x3a27: 0x0004, 0x3a28: 0x0004, 0x3a29: 0x0004, - 0x3a2a: 0x0004, 0x3a2b: 0x0004, 0x3a2c: 0x0004, 0x3a2d: 0x0004, 0x3a2e: 0x0004, 0x3a2f: 0x0004, - 0x3a30: 0x0004, 0x3a31: 0x0004, 0x3a32: 0x0004, 0x3a33: 0x0004, 0x3a34: 0x0004, 0x3a35: 0x0004, - 0x3a36: 0x0004, 0x3a37: 0x0004, 0x3a38: 0x0004, 0x3a39: 0x0004, 0x3a3a: 0x0004, 0x3a3b: 0x0004, - 0x3a3c: 0x0004, 0x3a3f: 0x0004, + 0x3a00: 0x0002, 0x3a01: 0x0002, 0x3a02: 0x0002, 0x3a03: 0x0002, 0x3a04: 0x0002, 0x3a05: 0x0002, + 0x3a06: 0x0002, 0x3a07: 0x0002, 0x3a08: 0x0002, 0x3a09: 0x0002, 0x3a0a: 0x0002, 0x3a0b: 0x0002, + 0x3a0c: 0x0002, 0x3a0d: 0x0002, 0x3a0e: 0x0002, 0x3a0f: 0x0002, 0x3a10: 0x0002, 0x3a11: 0x0002, + 0x3a12: 0x0002, 0x3a13: 0x0002, 0x3a14: 0x0002, 0x3a15: 0x0002, 0x3a16: 0x0002, 0x3a17: 0x0002, + 0x3a18: 0x0002, 0x3a19: 0x0002, 0x3a1a: 0x0002, 0x3a1b: 0x0002, 0x3a1c: 0x0002, 0x3a1d: 0x0002, + 0x3a1e: 0x0002, 0x3a1f: 0x0002, 0x3a20: 0x0002, 0x3a21: 0x0002, 0x3a22: 0x0002, 0x3a23: 0x0002, + 0x3a24: 0x0002, 0x3a25: 0x0002, 0x3a26: 0x0002, 0x3a27: 0x0002, 0x3a28: 0x0002, 0x3a29: 0x0002, + 0x3a2a: 0x0002, 0x3a2b: 0x0002, 0x3a2c: 0x0002, 0x3a2d: 0x0002, 0x3a2e: 0x0002, 0x3a2f: 0x0002, + 0x3a30: 0x0002, 0x3a31: 0x0002, 0x3a32: 0x0002, 0x3a33: 0x0002, 0x3a34: 0x0002, 0x3a35: 0x0002, + 0x3a36: 0x0002, 0x3a37: 0x0002, 0x3a38: 0x0002, 0x3a39: 0x0002, 0x3a3a: 0x0002, 0x3a3b: 0x0002, + 0x3a3c: 0x0002, 0x3a3d: 0x0002, // Block 0xe9, offset 0x3a40 - 0x3a40: 0x0004, 0x3a41: 0x0004, 0x3a42: 0x0004, 0x3a43: 0x0004, 0x3a44: 0x0004, 0x3a45: 0x0004, - 0x3a46: 0x0004, 0x3a47: 0x0004, 0x3a48: 0x0004, 0x3a49: 0x0004, 0x3a4a: 0x0004, 0x3a4b: 0x0004, - 0x3a4c: 0x0004, 0x3a4d: 0x0004, 0x3a4e: 0x0004, 0x3a4f: 0x0004, 0x3a50: 0x0004, 0x3a51: 0x0004, - 0x3a52: 0x0004, 0x3a53: 0x0004, 0x3a54: 0x0004, 0x3a55: 0x0004, 0x3a56: 0x0004, 0x3a57: 0x0004, - 0x3a58: 0x0004, 0x3a59: 0x0004, 0x3a5a: 0x0004, 0x3a5b: 0x0004, 0x3a5c: 0x0004, 0x3a5d: 0x0004, - 0x3a5e: 0x0004, 0x3a5f: 0x0004, 0x3a60: 0x0004, 0x3a61: 0x0004, 0x3a62: 0x0004, 0x3a63: 0x0004, - 0x3a64: 0x0004, 0x3a65: 0x0004, 0x3a66: 0x0004, 0x3a67: 0x0004, 0x3a68: 0x0004, 0x3a69: 0x0004, - 0x3a6a: 0x0004, 0x3a6b: 0x0004, 0x3a6c: 0x0004, 0x3a6d: 0x0004, 0x3a6e: 0x0004, 0x3a6f: 0x0004, - 0x3a70: 0x0004, 0x3a71: 0x0004, 0x3a72: 0x0004, 0x3a73: 0x0004, 0x3a74: 0x0004, 0x3a75: 0x0004, - 0x3a76: 0x0004, 0x3a77: 0x0004, 0x3a78: 0x0004, 0x3a79: 0x0004, 0x3a7a: 0x0004, 0x3a7b: 0x0004, - 0x3a7c: 0x0004, 0x3a7d: 0x0004, + 0x3a4b: 0x0002, + 0x3a4c: 0x0002, 0x3a4d: 0x0002, 0x3a4e: 0x0002, 0x3a50: 0x0002, 0x3a51: 0x0002, + 0x3a52: 0x0002, 0x3a53: 0x0002, 0x3a54: 0x0002, 0x3a55: 0x0002, 0x3a56: 0x0002, 0x3a57: 0x0002, + 0x3a58: 0x0002, 0x3a59: 0x0002, 0x3a5a: 0x0002, 0x3a5b: 0x0002, 0x3a5c: 0x0002, 0x3a5d: 0x0002, + 0x3a5e: 0x0002, 0x3a5f: 0x0002, 0x3a60: 0x0002, 0x3a61: 0x0002, 0x3a62: 0x0002, 0x3a63: 0x0002, + 0x3a64: 0x0002, 0x3a65: 0x0002, 0x3a66: 0x0002, 0x3a67: 0x0002, + 0x3a7a: 0x0002, // Block 0xea, offset 0x3a80 - 0x3a8b: 0x0004, - 0x3a8c: 0x0004, 0x3a8d: 0x0004, 0x3a8e: 0x0004, 0x3a90: 0x0004, 0x3a91: 0x0004, - 0x3a92: 0x0004, 0x3a93: 0x0004, 0x3a94: 0x0004, 0x3a95: 0x0004, 0x3a96: 0x0004, 0x3a97: 0x0004, - 0x3a98: 0x0004, 0x3a99: 0x0004, 0x3a9a: 0x0004, 0x3a9b: 0x0004, 0x3a9c: 0x0004, 0x3a9d: 0x0004, - 0x3a9e: 0x0004, 0x3a9f: 0x0004, 0x3aa0: 0x0004, 0x3aa1: 0x0004, 0x3aa2: 0x0004, 0x3aa3: 0x0004, - 0x3aa4: 0x0004, 0x3aa5: 0x0004, 0x3aa6: 0x0004, 0x3aa7: 0x0004, - 0x3aba: 0x0004, + 0x3a95: 0x0002, 0x3a96: 0x0002, + 0x3aa4: 0x0002, // Block 0xeb, offset 0x3ac0 - 0x3ad5: 0x0004, 0x3ad6: 0x0004, - 0x3ae4: 0x0004, + 0x3afb: 0x0002, + 0x3afc: 0x0002, 0x3afd: 0x0002, 0x3afe: 0x0002, 0x3aff: 0x0002, // Block 0xec, offset 0x3b00 - 0x3b3b: 0x0004, - 0x3b3c: 0x0004, 0x3b3d: 0x0004, 0x3b3e: 0x0004, 0x3b3f: 0x0004, + 0x3b00: 0x0002, 0x3b01: 0x0002, 0x3b02: 0x0002, 0x3b03: 0x0002, 0x3b04: 0x0002, 0x3b05: 0x0002, + 0x3b06: 0x0002, 0x3b07: 0x0002, 0x3b08: 0x0002, 0x3b09: 0x0002, 0x3b0a: 0x0002, 0x3b0b: 0x0002, + 0x3b0c: 0x0002, 0x3b0d: 0x0002, 0x3b0e: 0x0002, 0x3b0f: 0x0002, // Block 0xed, offset 0x3b40 - 0x3b40: 0x0004, 0x3b41: 0x0004, 0x3b42: 0x0004, 0x3b43: 0x0004, 0x3b44: 0x0004, 0x3b45: 0x0004, - 0x3b46: 0x0004, 0x3b47: 0x0004, 0x3b48: 0x0004, 0x3b49: 0x0004, 0x3b4a: 0x0004, 0x3b4b: 0x0004, - 0x3b4c: 0x0004, 0x3b4d: 0x0004, 0x3b4e: 0x0004, 0x3b4f: 0x0004, + 0x3b40: 0x0002, 0x3b41: 0x0002, 0x3b42: 0x0002, 0x3b43: 0x0002, 0x3b44: 0x0002, 0x3b45: 0x0002, + 0x3b4c: 0x0002, 0x3b50: 0x0002, 0x3b51: 0x0002, + 0x3b52: 0x0002, 0x3b55: 0x0002, 0x3b56: 0x0002, 0x3b57: 0x0002, + 0x3b5c: 0x0002, 0x3b5d: 0x0002, + 0x3b5e: 0x0002, 0x3b5f: 0x0002, + 0x3b6b: 0x0002, 0x3b6c: 0x0002, + 0x3b74: 0x0002, 0x3b75: 0x0002, + 0x3b76: 0x0002, 0x3b77: 0x0002, 0x3b78: 0x0002, 0x3b79: 0x0002, 0x3b7a: 0x0002, 0x3b7b: 0x0002, + 0x3b7c: 0x0002, // Block 0xee, offset 0x3b80 - 0x3b80: 0x0004, 0x3b81: 0x0004, 0x3b82: 0x0004, 0x3b83: 0x0004, 0x3b84: 0x0004, 0x3b85: 0x0004, - 0x3b8c: 0x0004, 0x3b90: 0x0004, 0x3b91: 0x0004, - 0x3b92: 0x0004, 0x3b95: 0x0004, 0x3b96: 0x0004, 0x3b97: 0x0004, - 0x3b9c: 0x0004, 0x3b9d: 0x0004, - 0x3b9e: 0x0004, 0x3b9f: 0x0004, - 0x3bab: 0x0004, 0x3bac: 0x0004, - 0x3bb4: 0x0004, 0x3bb5: 0x0004, - 0x3bb6: 0x0004, 0x3bb7: 0x0004, 0x3bb8: 0x0004, 0x3bb9: 0x0004, 0x3bba: 0x0004, 0x3bbb: 0x0004, - 0x3bbc: 0x0004, + 0x3ba0: 0x0002, 0x3ba1: 0x0002, 0x3ba2: 0x0002, 0x3ba3: 0x0002, + 0x3ba4: 0x0002, 0x3ba5: 0x0002, 0x3ba6: 0x0002, 0x3ba7: 0x0002, 0x3ba8: 0x0002, 0x3ba9: 0x0002, + 0x3baa: 0x0002, 0x3bab: 0x0002, + 0x3bb0: 0x0002, // Block 0xef, offset 0x3bc0 - 0x3be0: 0x0004, 0x3be1: 0x0004, 0x3be2: 0x0004, 0x3be3: 0x0004, - 0x3be4: 0x0004, 0x3be5: 0x0004, 0x3be6: 0x0004, 0x3be7: 0x0004, 0x3be8: 0x0004, 0x3be9: 0x0004, - 0x3bea: 0x0004, 0x3beb: 0x0004, - 0x3bf0: 0x0004, + 0x3bcc: 0x0002, 0x3bcd: 0x0002, 0x3bce: 0x0002, 0x3bcf: 0x0002, 0x3bd0: 0x0002, 0x3bd1: 0x0002, + 0x3bd2: 0x0002, 0x3bd3: 0x0002, 0x3bd4: 0x0002, 0x3bd5: 0x0002, 0x3bd6: 0x0002, 0x3bd7: 0x0002, + 0x3bd8: 0x0002, 0x3bd9: 0x0002, 0x3bda: 0x0002, 0x3bdb: 0x0002, 0x3bdc: 0x0002, 0x3bdd: 0x0002, + 0x3bde: 0x0002, 0x3bdf: 0x0002, 0x3be0: 0x0002, 0x3be1: 0x0002, 0x3be2: 0x0002, 0x3be3: 0x0002, + 0x3be4: 0x0002, 0x3be5: 0x0002, 0x3be6: 0x0002, 0x3be7: 0x0002, 0x3be8: 0x0002, 0x3be9: 0x0002, + 0x3bea: 0x0002, 0x3beb: 0x0002, 0x3bec: 0x0002, 0x3bed: 0x0002, 0x3bee: 0x0002, 0x3bef: 0x0002, + 0x3bf0: 0x0002, 0x3bf1: 0x0002, 0x3bf2: 0x0002, 0x3bf3: 0x0002, 0x3bf4: 0x0002, 0x3bf5: 0x0002, + 0x3bf6: 0x0002, 0x3bf7: 0x0002, 0x3bf8: 0x0002, 0x3bf9: 0x0002, 0x3bfa: 0x0002, + 0x3bfc: 0x0002, 0x3bfd: 0x0002, 0x3bfe: 0x0002, 0x3bff: 0x0002, // Block 0xf0, offset 0x3c00 - 0x3c0c: 0x0004, 0x3c0d: 0x0004, 0x3c0e: 0x0004, 0x3c0f: 0x0004, 0x3c10: 0x0004, 0x3c11: 0x0004, - 0x3c12: 0x0004, 0x3c13: 0x0004, 0x3c14: 0x0004, 0x3c15: 0x0004, 0x3c16: 0x0004, 0x3c17: 0x0004, - 0x3c18: 0x0004, 0x3c19: 0x0004, 0x3c1a: 0x0004, 0x3c1b: 0x0004, 0x3c1c: 0x0004, 0x3c1d: 0x0004, - 0x3c1e: 0x0004, 0x3c1f: 0x0004, 0x3c20: 0x0004, 0x3c21: 0x0004, 0x3c22: 0x0004, 0x3c23: 0x0004, - 0x3c24: 0x0004, 0x3c25: 0x0004, 0x3c26: 0x0004, 0x3c27: 0x0004, 0x3c28: 0x0004, 0x3c29: 0x0004, - 0x3c2a: 0x0004, 0x3c2b: 0x0004, 0x3c2c: 0x0004, 0x3c2d: 0x0004, 0x3c2e: 0x0004, 0x3c2f: 0x0004, - 0x3c30: 0x0004, 0x3c31: 0x0004, 0x3c32: 0x0004, 0x3c33: 0x0004, 0x3c34: 0x0004, 0x3c35: 0x0004, - 0x3c36: 0x0004, 0x3c37: 0x0004, 0x3c38: 0x0004, 0x3c39: 0x0004, 0x3c3a: 0x0004, - 0x3c3c: 0x0004, 0x3c3d: 0x0004, 0x3c3e: 0x0004, 0x3c3f: 0x0004, + 0x3c00: 0x0002, 0x3c01: 0x0002, 0x3c02: 0x0002, 0x3c03: 0x0002, 0x3c04: 0x0002, 0x3c05: 0x0002, + 0x3c07: 0x0002, 0x3c08: 0x0002, 0x3c09: 0x0002, 0x3c0a: 0x0002, 0x3c0b: 0x0002, + 0x3c0c: 0x0002, 0x3c0d: 0x0002, 0x3c0e: 0x0002, 0x3c0f: 0x0002, 0x3c10: 0x0002, 0x3c11: 0x0002, + 0x3c12: 0x0002, 0x3c13: 0x0002, 0x3c14: 0x0002, 0x3c15: 0x0002, 0x3c16: 0x0002, 0x3c17: 0x0002, + 0x3c18: 0x0002, 0x3c19: 0x0002, 0x3c1a: 0x0002, 0x3c1b: 0x0002, 0x3c1c: 0x0002, 0x3c1d: 0x0002, + 0x3c1e: 0x0002, 0x3c1f: 0x0002, 0x3c20: 0x0002, 0x3c21: 0x0002, 0x3c22: 0x0002, 0x3c23: 0x0002, + 0x3c24: 0x0002, 0x3c25: 0x0002, 0x3c26: 0x0002, 0x3c27: 0x0002, 0x3c28: 0x0002, 0x3c29: 0x0002, + 0x3c2a: 0x0002, 0x3c2b: 0x0002, 0x3c2c: 0x0002, 0x3c2d: 0x0002, 0x3c2e: 0x0002, 0x3c2f: 0x0002, + 0x3c30: 0x0002, 0x3c31: 0x0002, 0x3c32: 0x0002, 0x3c33: 0x0002, 0x3c34: 0x0002, 0x3c35: 0x0002, + 0x3c36: 0x0002, 0x3c37: 0x0002, 0x3c38: 0x0002, 0x3c39: 0x0002, 0x3c3a: 0x0002, 0x3c3b: 0x0002, + 0x3c3c: 0x0002, 0x3c3d: 0x0002, 0x3c3e: 0x0002, 0x3c3f: 0x0002, // Block 0xf1, offset 0x3c40 - 0x3c40: 0x0004, 0x3c41: 0x0004, 0x3c42: 0x0004, 0x3c43: 0x0004, 0x3c44: 0x0004, 0x3c45: 0x0004, - 0x3c47: 0x0004, 0x3c48: 0x0004, 0x3c49: 0x0004, 0x3c4a: 0x0004, 0x3c4b: 0x0004, - 0x3c4c: 0x0004, 0x3c4d: 0x0004, 0x3c4e: 0x0004, 0x3c4f: 0x0004, 0x3c50: 0x0004, 0x3c51: 0x0004, - 0x3c52: 0x0004, 0x3c53: 0x0004, 0x3c54: 0x0004, 0x3c55: 0x0004, 0x3c56: 0x0004, 0x3c57: 0x0004, - 0x3c58: 0x0004, 0x3c59: 0x0004, 0x3c5a: 0x0004, 0x3c5b: 0x0004, 0x3c5c: 0x0004, 0x3c5d: 0x0004, - 0x3c5e: 0x0004, 0x3c5f: 0x0004, 0x3c60: 0x0004, 0x3c61: 0x0004, 0x3c62: 0x0004, 0x3c63: 0x0004, - 0x3c64: 0x0004, 0x3c65: 0x0004, 0x3c66: 0x0004, 0x3c67: 0x0004, 0x3c68: 0x0004, 0x3c69: 0x0004, - 0x3c6a: 0x0004, 0x3c6b: 0x0004, 0x3c6c: 0x0004, 0x3c6d: 0x0004, 0x3c6e: 0x0004, 0x3c6f: 0x0004, - 0x3c70: 0x0004, 0x3c71: 0x0004, 0x3c72: 0x0004, 0x3c73: 0x0004, 0x3c74: 0x0004, 0x3c75: 0x0004, - 0x3c76: 0x0004, 0x3c77: 0x0004, 0x3c78: 0x0004, 0x3c79: 0x0004, 0x3c7a: 0x0004, 0x3c7b: 0x0004, - 0x3c7c: 0x0004, 0x3c7d: 0x0004, 0x3c7e: 0x0004, 0x3c7f: 0x0004, + 0x3c70: 0x0002, 0x3c71: 0x0002, 0x3c72: 0x0002, 0x3c73: 0x0002, 0x3c74: 0x0002, 0x3c75: 0x0002, + 0x3c76: 0x0002, 0x3c77: 0x0002, 0x3c78: 0x0002, 0x3c79: 0x0002, 0x3c7a: 0x0002, 0x3c7b: 0x0002, + 0x3c7c: 0x0002, // Block 0xf2, offset 0x3c80 - 0x3cb0: 0x0004, 0x3cb1: 0x0004, 0x3cb2: 0x0004, 0x3cb3: 0x0004, 0x3cb4: 0x0004, 0x3cb5: 0x0004, - 0x3cb6: 0x0004, 0x3cb7: 0x0004, 0x3cb8: 0x0004, 0x3cb9: 0x0004, 0x3cba: 0x0004, 0x3cbb: 0x0004, - 0x3cbc: 0x0004, + 0x3c80: 0x0002, 0x3c81: 0x0002, 0x3c82: 0x0002, 0x3c83: 0x0002, 0x3c84: 0x0002, 0x3c85: 0x0002, + 0x3c86: 0x0002, 0x3c87: 0x0002, 0x3c88: 0x0002, 0x3c89: 0x0002, + 0x3c8f: 0x0002, 0x3c90: 0x0002, 0x3c91: 0x0002, + 0x3c92: 0x0002, 0x3c93: 0x0002, 0x3c94: 0x0002, 0x3c95: 0x0002, 0x3c96: 0x0002, 0x3c97: 0x0002, + 0x3c98: 0x0002, 0x3c99: 0x0002, 0x3c9a: 0x0002, 0x3c9b: 0x0002, 0x3c9c: 0x0002, 0x3c9d: 0x0002, + 0x3c9e: 0x0002, 0x3c9f: 0x0002, 0x3ca0: 0x0002, 0x3ca1: 0x0002, 0x3ca2: 0x0002, 0x3ca3: 0x0002, + 0x3ca4: 0x0002, 0x3ca5: 0x0002, 0x3ca6: 0x0002, 0x3ca7: 0x0002, 0x3ca8: 0x0002, 0x3ca9: 0x0002, + 0x3caa: 0x0002, 0x3cab: 0x0002, 0x3cac: 0x0002, 0x3cad: 0x0002, 0x3cae: 0x0002, 0x3caf: 0x0002, + 0x3cb0: 0x0002, 0x3cb1: 0x0002, 0x3cb2: 0x0002, 0x3cb3: 0x0002, 0x3cb4: 0x0002, 0x3cb5: 0x0002, + 0x3cb6: 0x0002, 0x3cb7: 0x0002, 0x3cb8: 0x0002, 0x3cb9: 0x0002, 0x3cba: 0x0002, 0x3cbb: 0x0002, + 0x3cbc: 0x0002, 0x3cbd: 0x0002, 0x3cbe: 0x0002, 0x3cbf: 0x0002, // Block 0xf3, offset 0x3cc0 - 0x3cc0: 0x0004, 0x3cc1: 0x0004, 0x3cc2: 0x0004, 0x3cc3: 0x0004, 0x3cc4: 0x0004, 0x3cc5: 0x0004, - 0x3cc6: 0x0004, 0x3cc7: 0x0004, 0x3cc8: 0x0004, 0x3cc9: 0x0004, - 0x3ccf: 0x0004, 0x3cd0: 0x0004, 0x3cd1: 0x0004, - 0x3cd2: 0x0004, 0x3cd3: 0x0004, 0x3cd4: 0x0004, 0x3cd5: 0x0004, 0x3cd6: 0x0004, 0x3cd7: 0x0004, - 0x3cd8: 0x0004, 0x3cd9: 0x0004, 0x3cda: 0x0004, 0x3cdb: 0x0004, 0x3cdc: 0x0004, 0x3cdd: 0x0004, - 0x3cde: 0x0004, 0x3cdf: 0x0004, 0x3ce0: 0x0004, 0x3ce1: 0x0004, 0x3ce2: 0x0004, 0x3ce3: 0x0004, - 0x3ce4: 0x0004, 0x3ce5: 0x0004, 0x3ce6: 0x0004, 0x3ce7: 0x0004, 0x3ce8: 0x0004, 0x3ce9: 0x0004, - 0x3cea: 0x0004, 0x3ceb: 0x0004, 0x3cec: 0x0004, 0x3ced: 0x0004, 0x3cee: 0x0004, 0x3cef: 0x0004, - 0x3cf0: 0x0004, 0x3cf1: 0x0004, 0x3cf2: 0x0004, 0x3cf3: 0x0004, 0x3cf4: 0x0004, 0x3cf5: 0x0004, - 0x3cf6: 0x0004, 0x3cf7: 0x0004, 0x3cf8: 0x0004, 0x3cf9: 0x0004, 0x3cfa: 0x0004, 0x3cfb: 0x0004, - 0x3cfc: 0x0004, 0x3cfd: 0x0004, 0x3cfe: 0x0004, 0x3cff: 0x0004, + 0x3cc0: 0x0002, 0x3cc1: 0x0002, 0x3cc2: 0x0002, 0x3cc3: 0x0002, 0x3cc4: 0x0002, 0x3cc5: 0x0002, + 0x3cc6: 0x0002, + 0x3cce: 0x0002, 0x3ccf: 0x0002, 0x3cd0: 0x0002, 0x3cd1: 0x0002, + 0x3cd2: 0x0002, 0x3cd3: 0x0002, 0x3cd4: 0x0002, 0x3cd5: 0x0002, 0x3cd6: 0x0002, 0x3cd7: 0x0002, + 0x3cd8: 0x0002, 0x3cd9: 0x0002, 0x3cda: 0x0002, 0x3cdb: 0x0002, 0x3cdc: 0x0002, + 0x3cdf: 0x0002, 0x3ce0: 0x0002, 0x3ce1: 0x0002, 0x3ce2: 0x0002, 0x3ce3: 0x0002, + 0x3ce4: 0x0002, 0x3ce5: 0x0002, 0x3ce6: 0x0002, 0x3ce7: 0x0002, 0x3ce8: 0x0002, 0x3ce9: 0x0002, + 0x3cf0: 0x0002, 0x3cf1: 0x0002, 0x3cf2: 0x0002, 0x3cf3: 0x0002, 0x3cf4: 0x0002, 0x3cf5: 0x0002, + 0x3cf6: 0x0002, 0x3cf7: 0x0002, 0x3cf8: 0x0002, // Block 0xf4, offset 0x3d00 - 0x3d00: 0x0004, 0x3d01: 0x0004, 0x3d02: 0x0004, 0x3d03: 0x0004, 0x3d04: 0x0004, 0x3d05: 0x0004, - 0x3d06: 0x0004, - 0x3d0e: 0x0004, 0x3d0f: 0x0004, 0x3d10: 0x0004, 0x3d11: 0x0004, - 0x3d12: 0x0004, 0x3d13: 0x0004, 0x3d14: 0x0004, 0x3d15: 0x0004, 0x3d16: 0x0004, 0x3d17: 0x0004, - 0x3d18: 0x0004, 0x3d19: 0x0004, 0x3d1a: 0x0004, 0x3d1b: 0x0004, 0x3d1c: 0x0004, - 0x3d1f: 0x0004, 0x3d20: 0x0004, 0x3d21: 0x0004, 0x3d22: 0x0004, 0x3d23: 0x0004, - 0x3d24: 0x0004, 0x3d25: 0x0004, 0x3d26: 0x0004, 0x3d27: 0x0004, 0x3d28: 0x0004, 0x3d29: 0x0004, - 0x3d30: 0x0004, 0x3d31: 0x0004, 0x3d32: 0x0004, 0x3d33: 0x0004, 0x3d34: 0x0004, 0x3d35: 0x0004, - 0x3d36: 0x0004, 0x3d37: 0x0004, 0x3d38: 0x0004, + 0x3d01: 0x0001, + 0x3d20: 0x0001, 0x3d21: 0x0001, 0x3d22: 0x0001, 0x3d23: 0x0001, + 0x3d24: 0x0001, 0x3d25: 0x0001, 0x3d26: 0x0001, 0x3d27: 0x0001, 0x3d28: 0x0001, 0x3d29: 0x0001, + 0x3d2a: 0x0001, 0x3d2b: 0x0001, 0x3d2c: 0x0001, 0x3d2d: 0x0001, 0x3d2e: 0x0001, 0x3d2f: 0x0001, + 0x3d30: 0x0001, 0x3d31: 0x0001, 0x3d32: 0x0001, 0x3d33: 0x0001, 0x3d34: 0x0001, 0x3d35: 0x0001, + 0x3d36: 0x0001, 0x3d37: 0x0001, 0x3d38: 0x0001, 0x3d39: 0x0001, 0x3d3a: 0x0001, 0x3d3b: 0x0001, + 0x3d3c: 0x0001, 0x3d3d: 0x0001, 0x3d3e: 0x0001, 0x3d3f: 0x0001, // Block 0xf5, offset 0x3d40 - 0x3d40: 0x0002, 0x3d41: 0x0002, 0x3d42: 0x0002, 0x3d43: 0x0002, 0x3d44: 0x0002, 0x3d45: 0x0002, - 0x3d46: 0x0002, 0x3d47: 0x0002, 0x3d48: 0x0002, 0x3d49: 0x0002, 0x3d4a: 0x0002, 0x3d4b: 0x0002, - 0x3d4c: 0x0002, 0x3d4d: 0x0002, 0x3d4e: 0x0002, 0x3d4f: 0x0002, 0x3d50: 0x0002, 0x3d51: 0x0002, - 0x3d52: 0x0002, 0x3d53: 0x0002, 0x3d54: 0x0002, 0x3d55: 0x0002, 0x3d56: 0x0002, 0x3d57: 0x0002, - 0x3d58: 0x0002, 0x3d59: 0x0002, 0x3d5a: 0x0002, 0x3d5b: 0x0002, 0x3d5c: 0x0002, 0x3d5d: 0x0002, - 0x3d5e: 0x0002, 0x3d5f: 0x0002, 0x3d60: 0x0002, 0x3d61: 0x0002, 0x3d62: 0x0002, 0x3d63: 0x0002, - 0x3d64: 0x0002, 0x3d65: 0x0002, 0x3d66: 0x0002, 0x3d67: 0x0002, 0x3d68: 0x0002, 0x3d69: 0x0002, - 0x3d6a: 0x0002, 0x3d6b: 0x0002, 0x3d6c: 0x0002, 0x3d6d: 0x0002, 0x3d6e: 0x0002, 0x3d6f: 0x0002, - 0x3d70: 0x0002, 0x3d71: 0x0002, 0x3d72: 0x0002, 0x3d73: 0x0002, 0x3d74: 0x0002, 0x3d75: 0x0002, - 0x3d76: 0x0002, 0x3d77: 0x0002, 0x3d78: 0x0002, 0x3d79: 0x0002, 0x3d7a: 0x0002, 0x3d7b: 0x0002, - 0x3d7c: 0x0002, 0x3d7d: 0x0002, - // Block 0xf6, offset 0x3d80 - 0x3d81: 0x0001, - 0x3da0: 0x0001, 0x3da1: 0x0001, 0x3da2: 0x0001, 0x3da3: 0x0001, - 0x3da4: 0x0001, 0x3da5: 0x0001, 0x3da6: 0x0001, 0x3da7: 0x0001, 0x3da8: 0x0001, 0x3da9: 0x0001, - 0x3daa: 0x0001, 0x3dab: 0x0001, 0x3dac: 0x0001, 0x3dad: 0x0001, 0x3dae: 0x0001, 0x3daf: 0x0001, - 0x3db0: 0x0001, 0x3db1: 0x0001, 0x3db2: 0x0001, 0x3db3: 0x0001, 0x3db4: 0x0001, 0x3db5: 0x0001, - 0x3db6: 0x0001, 0x3db7: 0x0001, 0x3db8: 0x0001, 0x3db9: 0x0001, 0x3dba: 0x0001, 0x3dbb: 0x0001, - 0x3dbc: 0x0001, 0x3dbd: 0x0001, 0x3dbe: 0x0001, 0x3dbf: 0x0001, - // Block 0xf7, offset 0x3dc0 - 0x3dc0: 0x0003, 0x3dc1: 0x0003, 0x3dc2: 0x0003, 0x3dc3: 0x0003, 0x3dc4: 0x0003, 0x3dc5: 0x0003, - 0x3dc6: 0x0003, 0x3dc7: 0x0003, 0x3dc8: 0x0003, 0x3dc9: 0x0003, 0x3dca: 0x0003, 0x3dcb: 0x0003, - 0x3dcc: 0x0003, 0x3dcd: 0x0003, 0x3dce: 0x0003, 0x3dcf: 0x0003, 0x3dd0: 0x0003, 0x3dd1: 0x0003, - 0x3dd2: 0x0003, 0x3dd3: 0x0003, 0x3dd4: 0x0003, 0x3dd5: 0x0003, 0x3dd6: 0x0003, 0x3dd7: 0x0003, - 0x3dd8: 0x0003, 0x3dd9: 0x0003, 0x3dda: 0x0003, 0x3ddb: 0x0003, 0x3ddc: 0x0003, 0x3ddd: 0x0003, - 0x3dde: 0x0003, 0x3ddf: 0x0003, 0x3de0: 0x0003, 0x3de1: 0x0003, 0x3de2: 0x0003, 0x3de3: 0x0003, - 0x3de4: 0x0003, 0x3de5: 0x0003, 0x3de6: 0x0003, 0x3de7: 0x0003, 0x3de8: 0x0003, 0x3de9: 0x0003, - 0x3dea: 0x0003, 0x3deb: 0x0003, 0x3dec: 0x0003, 0x3ded: 0x0003, 0x3dee: 0x0003, 0x3def: 0x0003, - 0x3df0: 0x0003, 0x3df1: 0x0003, 0x3df2: 0x0003, 0x3df3: 0x0003, 0x3df4: 0x0003, 0x3df5: 0x0003, - 0x3df6: 0x0003, 0x3df7: 0x0003, 0x3df8: 0x0003, 0x3df9: 0x0003, 0x3dfa: 0x0003, 0x3dfb: 0x0003, - 0x3dfc: 0x0003, 0x3dfd: 0x0003, + 0x3d40: 0x0003, 0x3d41: 0x0003, 0x3d42: 0x0003, 0x3d43: 0x0003, 0x3d44: 0x0003, 0x3d45: 0x0003, + 0x3d46: 0x0003, 0x3d47: 0x0003, 0x3d48: 0x0003, 0x3d49: 0x0003, 0x3d4a: 0x0003, 0x3d4b: 0x0003, + 0x3d4c: 0x0003, 0x3d4d: 0x0003, 0x3d4e: 0x0003, 0x3d4f: 0x0003, 0x3d50: 0x0003, 0x3d51: 0x0003, + 0x3d52: 0x0003, 0x3d53: 0x0003, 0x3d54: 0x0003, 0x3d55: 0x0003, 0x3d56: 0x0003, 0x3d57: 0x0003, + 0x3d58: 0x0003, 0x3d59: 0x0003, 0x3d5a: 0x0003, 0x3d5b: 0x0003, 0x3d5c: 0x0003, 0x3d5d: 0x0003, + 0x3d5e: 0x0003, 0x3d5f: 0x0003, 0x3d60: 0x0003, 0x3d61: 0x0003, 0x3d62: 0x0003, 0x3d63: 0x0003, + 0x3d64: 0x0003, 0x3d65: 0x0003, 0x3d66: 0x0003, 0x3d67: 0x0003, 0x3d68: 0x0003, 0x3d69: 0x0003, + 0x3d6a: 0x0003, 0x3d6b: 0x0003, 0x3d6c: 0x0003, 0x3d6d: 0x0003, 0x3d6e: 0x0003, 0x3d6f: 0x0003, + 0x3d70: 0x0003, 0x3d71: 0x0003, 0x3d72: 0x0003, 0x3d73: 0x0003, 0x3d74: 0x0003, 0x3d75: 0x0003, + 0x3d76: 0x0003, 0x3d77: 0x0003, 0x3d78: 0x0003, 0x3d79: 0x0003, 0x3d7a: 0x0003, 0x3d7b: 0x0003, + 0x3d7c: 0x0003, 0x3d7d: 0x0003, } // stringWidthIndex: 30 blocks, 1920 entries, 1920 bytes @@ -1683,10 +1655,10 @@ var stringWidthIndex = [1920]uint8{ // Block 0x17, offset 0x5c0 0x5c0: 0xd7, 0x5c3: 0xd8, 0x5c4: 0xd9, 0x5c5: 0xda, 0x5c6: 0xdb, 0x5c7: 0xdc, 0x5c8: 0xdd, 0x5c9: 0xde, 0x5cc: 0xdf, 0x5cd: 0xe0, 0x5ce: 0xe1, 0x5cf: 0xe2, - 0x5d0: 0xe3, 0x5d1: 0xe4, 0x5d2: 0xe5, 0x5d3: 0xe6, 0x5d4: 0xe7, 0x5d5: 0xe8, 0x5d6: 0xe9, 0x5d7: 0xea, - 0x5d8: 0xe5, 0x5d9: 0xeb, 0x5da: 0xe5, 0x5db: 0xec, 0x5df: 0xed, - 0x5e4: 0xee, 0x5e5: 0xef, 0x5e6: 0xe5, 0x5e7: 0xe5, - 0x5e9: 0xf0, 0x5ea: 0xf1, 0x5eb: 0xf2, + 0x5d0: 0xe3, 0x5d1: 0xe4, 0x5d2: 0x39, 0x5d3: 0xe5, 0x5d4: 0xe6, 0x5d5: 0xe7, 0x5d6: 0xe8, 0x5d7: 0xe9, + 0x5d8: 0x39, 0x5d9: 0xea, 0x5da: 0x39, 0x5db: 0xeb, 0x5df: 0xec, + 0x5e4: 0xed, 0x5e5: 0xee, 0x5e6: 0x39, 0x5e7: 0x39, + 0x5e9: 0xef, 0x5ea: 0xf0, 0x5eb: 0xf1, // Block 0x18, offset 0x600 0x600: 0x39, 0x601: 0x39, 0x602: 0x39, 0x603: 0x39, 0x604: 0x39, 0x605: 0x39, 0x606: 0x39, 0x607: 0x39, 0x608: 0x39, 0x609: 0x39, 0x60a: 0x39, 0x60b: 0x39, 0x60c: 0x39, 0x60d: 0x39, 0x60e: 0x39, 0x60f: 0x39, @@ -1695,7 +1667,7 @@ var stringWidthIndex = [1920]uint8{ 0x620: 0x39, 0x621: 0x39, 0x622: 0x39, 0x623: 0x39, 0x624: 0x39, 0x625: 0x39, 0x626: 0x39, 0x627: 0x39, 0x628: 0x39, 0x629: 0x39, 0x62a: 0x39, 0x62b: 0x39, 0x62c: 0x39, 0x62d: 0x39, 0x62e: 0x39, 0x62f: 0x39, 0x630: 0x39, 0x631: 0x39, 0x632: 0x39, 0x633: 0x39, 0x634: 0x39, 0x635: 0x39, 0x636: 0x39, 0x637: 0x39, - 0x638: 0x39, 0x639: 0x39, 0x63a: 0x39, 0x63b: 0x39, 0x63c: 0x39, 0x63d: 0x39, 0x63e: 0x39, 0x63f: 0xf3, + 0x638: 0x39, 0x639: 0x39, 0x63a: 0x39, 0x63b: 0x39, 0x63c: 0x39, 0x63d: 0x39, 0x63e: 0x39, 0x63f: 0xe6, // Block 0x19, offset 0x640 0x650: 0x0b, 0x651: 0x0c, 0x653: 0x0d, 0x656: 0x0e, 0x657: 0x06, 0x658: 0x0f, 0x65a: 0x10, 0x65b: 0x11, 0x65c: 0x12, 0x65d: 0x13, 0x65e: 0x14, 0x65f: 0x15, @@ -1704,7 +1676,7 @@ var stringWidthIndex = [1920]uint8{ 0x670: 0x06, 0x671: 0x06, 0x672: 0x06, 0x673: 0x06, 0x674: 0x06, 0x675: 0x06, 0x676: 0x06, 0x677: 0x06, 0x678: 0x06, 0x679: 0x06, 0x67a: 0x06, 0x67b: 0x06, 0x67c: 0x06, 0x67d: 0x06, 0x67e: 0x06, 0x67f: 0x16, // Block 0x1a, offset 0x680 - 0x680: 0xf4, 0x681: 0x08, 0x684: 0x08, 0x685: 0x08, 0x686: 0x08, 0x687: 0x09, + 0x680: 0xf2, 0x681: 0x08, 0x684: 0x08, 0x685: 0x08, 0x686: 0x08, 0x687: 0x09, // Block 0x1b, offset 0x6c0 0x6c0: 0x5b, 0x6c1: 0x5b, 0x6c2: 0x5b, 0x6c3: 0x5b, 0x6c4: 0x5b, 0x6c5: 0x5b, 0x6c6: 0x5b, 0x6c7: 0x5b, 0x6c8: 0x5b, 0x6c9: 0x5b, 0x6ca: 0x5b, 0x6cb: 0x5b, 0x6cc: 0x5b, 0x6cd: 0x5b, 0x6ce: 0x5b, 0x6cf: 0x5b, @@ -1713,7 +1685,7 @@ var stringWidthIndex = [1920]uint8{ 0x6e0: 0x5b, 0x6e1: 0x5b, 0x6e2: 0x5b, 0x6e3: 0x5b, 0x6e4: 0x5b, 0x6e5: 0x5b, 0x6e6: 0x5b, 0x6e7: 0x5b, 0x6e8: 0x5b, 0x6e9: 0x5b, 0x6ea: 0x5b, 0x6eb: 0x5b, 0x6ec: 0x5b, 0x6ed: 0x5b, 0x6ee: 0x5b, 0x6ef: 0x5b, 0x6f0: 0x5b, 0x6f1: 0x5b, 0x6f2: 0x5b, 0x6f3: 0x5b, 0x6f4: 0x5b, 0x6f5: 0x5b, 0x6f6: 0x5b, 0x6f7: 0x5b, - 0x6f8: 0x5b, 0x6f9: 0x5b, 0x6fa: 0x5b, 0x6fb: 0x5b, 0x6fc: 0x5b, 0x6fd: 0x5b, 0x6fe: 0x5b, 0x6ff: 0xf5, + 0x6f8: 0x5b, 0x6f9: 0x5b, 0x6fa: 0x5b, 0x6fb: 0x5b, 0x6fc: 0x5b, 0x6fd: 0x5b, 0x6fe: 0x5b, 0x6ff: 0xf3, // Block 0x1c, offset 0x700 0x720: 0x18, 0x730: 0x09, 0x731: 0x09, 0x732: 0x09, 0x733: 0x09, 0x734: 0x09, 0x735: 0x09, 0x736: 0x09, 0x737: 0x09, diff --git a/vendor/github.com/clipperhouse/displaywidth/width.go b/vendor/github.com/clipperhouse/displaywidth/width.go index 55dd4584c0..a96ab0b075 100644 --- a/vendor/github.com/clipperhouse/displaywidth/width.go +++ b/vendor/github.com/clipperhouse/displaywidth/width.go @@ -122,28 +122,18 @@ func graphemeWidth[T stringish.Interface](s T, options Options) int { prop := property(p) // Variation Selector 16 (VS16) requests emoji presentation - if sz > 0 && len(s) >= sz+3 { + if prop != _Wide && sz > 0 && len(s) >= sz+3 { vs := s[sz : sz+3] if isVS16(vs) { - prop = _Emoji + prop = _Wide } // VS15 (0x8E) requests text presentation but does not affect width, // in my reading of Unicode TR51. Falls through to return the base // character's property. } - /* - Note: we previously had some regional indicator handling here, - intending to treat single RI's as width 1 and pairs as width 2. - We think that's what the Unicode #11 indicates? - - Then we looked at what actual terminals do, and they seem to treat - single and paired RI's as width 2, regardless. See terminal-test/. - Looks like VS Code does the same FWIW. - */ - if options.EastAsianWidth && prop == _East_Asian_Ambiguous { - prop = _East_Asian_Wide + prop = _Wide } if prop > upperBound { @@ -167,13 +157,11 @@ func isVS16[T stringish.Interface](s T) bool { } // propertyWidths is a jump table of sorts, instead of a switch -var propertyWidths = [6]int{ +var propertyWidths = [4]int{ _Default: 1, _Zero_Width: 0, - _East_Asian_Wide: 2, + _Wide: 2, _East_Asian_Ambiguous: 1, - _Emoji: 2, - _Regional_Indicator: 2, } const upperBound = property(len(propertyWidths) - 1) diff --git a/vendor/github.com/dgraph-io/badger/v4/CHANGELOG.md b/vendor/github.com/dgraph-io/badger/v4/CHANGELOG.md index 05d36674b0..30d70266ba 100644 --- a/vendor/github.com/dgraph-io/badger/v4/CHANGELOG.md +++ b/vendor/github.com/dgraph-io/badger/v4/CHANGELOG.md @@ -4,10 +4,139 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). -## [Unreleased] +## [4.9.0] - 2025-12-15 + +**Fixed** + +- fix(y): y.SafeCopy shall always return empty slice rather than nil (#2245) + > **WARNING** SafeCopy now returns an empty slice rather than nil. For those using our `y` utility + > package, this could be a breaking change. This has implications for empty slices stored in + > badger, specifically, upon retrieval the value stored with the key will be equal to what was set + > (an empty []byte). See #2067 for more details. +- fix: test.sh error (#2225) +- fix: typo of abandoned (#2222) + +**Docs** + +- add doc for encryption at rest (#2240) +- move docs pages in the repo (#2232) + +**Chores** + +- chore(ci): restrict Dgraph test to core packages only (#2242) +- chore: update README.md with correct links and badges (#2239) +- chore: change renovate to maintain backwards compatible go version (#2236) +- chore: configure renovate to leave go version as declared (#2235) +- chore(deps): Update actions (major) (#2229) +- chore(deps): Update actions/checkout action to v5 (#2221) +- chore(deps): Update go minor and patch (#2218) +- chore: update the trunk conf file (#2217) +- chore(deps): Update dependency node to v22 (#2219) +- chore(deps): Update go minor and patch (#2212) + +**CI** + +- move to GitHub Actions runners + +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.8.0...v4.8.1 + +## [4.8.0] - 2025-07-15 + +**Features** + +- feat(stream): Update stream framework with new alternate keyToList function (#2211) + +**Fixed** + +- fix: crash loop on missing manifest tables (#2198) + +**Chores** + +- chore(deps): Update module golang.org/x/sys to v0.34.0 (#2210) +- chore(deps): Update go minor and patch (#2208) +- chore(deps): Update go minor and patch (#2204) +- chore(deps): Update go minor and patch (#2202) +- chore(deps): Update go minor and patch (#2200) +- chore(deps): Update module golang.org/x/sys to v0.33.0 (#2195) +- chore(deps): Update go minor and patch (#2189) +- Compile with jemalloc v5.3.0 (#2191) + +**CI** + +- Update trunk.yml +- move Trunk to action + +**Docs** + +- docs: add new badge (#2194) + +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.7.0...v4.8.0 + +## [4.7.0] - 2025-04-08 + +**Chores** + +- chore(deps): remove dependency on github.com/pkg/errors (#2184) +- chore(deps): Update go minor and patch (#2187) +- chore(deps): Update go minor and patch (#2181) +- chore(deps): Update module golang.org/x/sys to v0.31.0 (#2179) + +**Fixed** + +- fix broken badge (#2186) + +**Docs** + +- Update README.md +- doc: add Blink Labs projects to the using Badger list (#2183) +- doc: add FlowG to "Projects Using Badger" section of the README (#2180) + +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.6.0...v4.7.0 + +## [4.6.0] - 2025-02-26 + +**Chores** -- chore(deps): Remove dependency on github.com/pkg/errors (#2184) - chore(deps): Migrate from OpenCensus to OpenTelemetry (#2169) +- chore(deps): Update go minor and patch (#2177) +- chore(deps): Update module github.com/spf13/cobra to v1.9.0 (#2174) +- chore: add editor config +- update .gitignore (#2176) + +**Fixed** + +- fix: remove accidentally uploaded binary `badger-darwin-arm64` (#2175) + +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.5.2...v4.6.0 + +## [4.5.2] - 2025-02-14 + +**Chores** + +- chore(deps): Update go minor and patch (#2168) +- chore(deps): bump minimum Go support to 1.22 (#2171) +- chore: migrate docs to centralized docs repo (#2166) +- chore: align repo conventions (#2158) +- chore(deps): bump the patch group with 2 updates (#2156) +- chore(deps): bump github.com/google/flatbuffers from 24.12.23+incompatible to 25.1.21+incompatible + (#2153) +- chore(deps): bump golangci/golangci-lint-action from 6.1.1 to 6.2.0 in the actions group (#2154) +- Update renovate.json +- Update trunk.yaml +- enable Trivy + +**Fixed** + +- update docs link in error message (#2170) +- Revert "Update badgerpb4.pb.go" (#2172) + +**Docs** + +- Update README.md +- Added my project that uses Badger database (#2157) +- Create SECURITY.md + +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.5.1...v4.5.2 ## [4.5.1] - 2025-01-21 @@ -26,48 +155,46 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - docs: Add pagination explanation to docs (#2134) - Fix build for GOARCH=wasm with GOOS=js or GOOS=wasip1 (#2048) -**Full Changelog**: https://github.com/hypermodeinc/badger/compare/v4.5.0...v4.5.1 +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.5.0...v4.5.1 ## [4.5.0] - 2024-11-29 -- fix the cd pipeline by @mangalaman93 in https://github.com/hypermodeinc/badger/pull/2127 +- fix the cd pipeline by @mangalaman93 in https://github.com/dgraph-io/badger/pull/2127 - chore(deps): bump the minor group with 2 updates by @dependabot in - https://github.com/hypermodeinc/badger/pull/2128 + https://github.com/dgraph-io/badger/pull/2128 - chore(deps): bump github.com/stretchr/testify from 1.9.0 to 1.10.0 in the minor group by - @dependabot in https://github.com/hypermodeinc/badger/pull/2130 -- upgrade protobuf library by @shivaji-kharse in https://github.com/hypermodeinc/badger/pull/2131 + @dependabot in https://github.com/dgraph-io/badger/pull/2130 +- upgrade protobuf library by @shivaji-kharse in https://github.com/dgraph-io/badger/pull/2131 -**Full Changelog**: https://github.com/hypermodeinc/badger/compare/v4.4.0...v4.5.0 +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.4.0...v4.5.0 ## [4.4.0] - 2024-10-26 - retract v4.3.0 due to #2121 and #2113, upgrade to Go v1.23, use ristretto v2 in - https://github.com/hypermodeinc/badger/pull/2122 -- Allow stream custom maxsize per batch in https://github.com/hypermodeinc/badger/pull/2063 + https://github.com/dgraph-io/badger/pull/2122 +- Allow stream custom maxsize per batch in https://github.com/dgraph-io/badger/pull/2063 - chore(deps): bump github.com/klauspost/compress from 1.17.10 to 1.17.11 in the patch group in - https://github.com/hypermodeinc/badger/pull/2120 -- fix: sentinel errors should not have stack traces in - https://github.com/hypermodeinc/badger/pull/2042 -- chore(deps): bump the minor group with 2 updates in - https://github.com/hypermodeinc/badger/pull/2119 + https://github.com/dgraph-io/badger/pull/2120 +- fix: sentinel errors should not have stack traces in https://github.com/dgraph-io/badger/pull/2042 +- chore(deps): bump the minor group with 2 updates in https://github.com/dgraph-io/badger/pull/2119 -**Full Changelog**: https://github.com/hypermodeinc/badger/compare/v4.3.1...v4.4.0 +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.3.1...v4.4.0 ## [4.3.1] - 2024-10-06 -- chore: update docs links by @ryanfoxtyler in https://github.com/hypermodeinc/badger/pull/2097 +- chore: update docs links by @ryanfoxtyler in https://github.com/dgraph-io/badger/pull/2097 - chore(deps): bump golang.org/x/sys from 0.24.0 to 0.25.0 in the minor group by @dependabot in - https://github.com/hypermodeinc/badger/pull/2100 + https://github.com/dgraph-io/badger/pull/2100 - chore(deps): bump golang.org/x/net from 0.28.0 to 0.29.0 in the minor group by @dependabot in - https://github.com/hypermodeinc/badger/pull/2106 + https://github.com/dgraph-io/badger/pull/2106 - fix: fix reverse iterator broken by seek by @harshil-goel in - https://github.com/hypermodeinc/badger/pull/2109 + https://github.com/dgraph-io/badger/pull/2109 - chore(deps): bump github.com/klauspost/compress from 1.17.9 to 1.17.10 in the patch group by - @dependabot in https://github.com/hypermodeinc/badger/pull/2114 -- chore(deps): bump github.com/hypermodeinc/ristretto from 0.1.2-0.20240116140435-c67e07994f91 to - 1.0.0 by @dependabot in https://github.com/hypermodeinc/badger/pull/2112 + @dependabot in https://github.com/dgraph-io/badger/pull/2114 +- chore(deps): bump github.com/dgraph-io/ristretto from 0.1.2-0.20240116140435-c67e07994f91 to 1.0.0 + by @dependabot in https://github.com/dgraph-io/badger/pull/2112 -**Full Changelog**: https://github.com/hypermodeinc/badger/compare/v4.3.0...v4.3.1 +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.3.0...v4.3.1 ## [4.3.0] - 2024-08-29 @@ -77,75 +204,75 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). **Fixes** - chore(changelog): add a missed entry in CHANGELOG for v4.2.0 by @mangalaman93 in - https://github.com/hypermodeinc/badger/pull/1988 + https://github.com/dgraph-io/badger/pull/1988 - update README with project KVS using badger by @tauraamui in - https://github.com/hypermodeinc/badger/pull/1989 + https://github.com/dgraph-io/badger/pull/1989 - fix edge case for watermark when index is zero by @mangalaman93 in - https://github.com/hypermodeinc/badger/pull/1999 + https://github.com/dgraph-io/badger/pull/1999 - upgrade spf13/cobra to version v1.7.0 by @mangalaman93 in - https://github.com/hypermodeinc/badger/pull/2001 -- chore: update readme by @joshua-goldstein in https://github.com/hypermodeinc/badger/pull/2011 + https://github.com/dgraph-io/badger/pull/2001 +- chore: update readme by @joshua-goldstein in https://github.com/dgraph-io/badger/pull/2011 - perf: upgrade compress package test and benchmark. by @siddhant2001 in - https://github.com/hypermodeinc/badger/pull/2009 + https://github.com/dgraph-io/badger/pull/2009 - fix(Transactions): Fix resource consumption on empty write transaction by @Zach-Johnson in - https://github.com/hypermodeinc/badger/pull/2018 + https://github.com/dgraph-io/badger/pull/2018 - chore(deps): bump golang.org/x/net from 0.7.0 to 0.17.0 by @dependabot in - https://github.com/hypermodeinc/badger/pull/2017 + https://github.com/dgraph-io/badger/pull/2017 - perf(compactor): optimize allocations: use buffer for priorities by @deff7 in - https://github.com/hypermodeinc/badger/pull/2006 + https://github.com/dgraph-io/badger/pull/2006 - fix(Transaction): discard empty transactions on CommitWith by @Wondertan in - https://github.com/hypermodeinc/badger/pull/2031 + https://github.com/dgraph-io/badger/pull/2031 - fix(levelHandler): use lock for levelHandler sort tables instead of rlock by @xgzlucario in - https://github.com/hypermodeinc/badger/pull/2034 + https://github.com/dgraph-io/badger/pull/2034 - Docs: update README with project LLS using badger by @Boc-chi-no in - https://github.com/hypermodeinc/badger/pull/2032 + https://github.com/dgraph-io/badger/pull/2032 - chore: MaxTableSize has been renamed to BaseTableSize by @mitar in - https://github.com/hypermodeinc/badger/pull/2038 -- Update CODEOWNERS by @ryanfoxtyler in https://github.com/hypermodeinc/badger/pull/2043 -- Chore(): add Stale Action by @ryanfoxtyler in https://github.com/hypermodeinc/badger/pull/2070 + https://github.com/dgraph-io/badger/pull/2038 +- Update CODEOWNERS by @ryanfoxtyler in https://github.com/dgraph-io/badger/pull/2043 +- Chore(): add Stale Action by @ryanfoxtyler in https://github.com/dgraph-io/badger/pull/2070 - Update ristretto and refactor for use of generics by @paralin in - https://github.com/hypermodeinc/badger/pull/2047 -- chore: Remove obsolete comment by @mitar in https://github.com/hypermodeinc/badger/pull/2039 + https://github.com/dgraph-io/badger/pull/2047 +- chore: Remove obsolete comment by @mitar in https://github.com/dgraph-io/badger/pull/2039 - chore(Docs): Update jQuery 3.2.1 to 3.7.1 by @kokizzu in - https://github.com/hypermodeinc/badger/pull/2023 + https://github.com/dgraph-io/badger/pull/2023 - chore(deps): bump the go_modules group with 3 updates by @dependabot in - https://github.com/hypermodeinc/badger/pull/2074 -- docs(): update docs path by @ryanfoxtyler in https://github.com/hypermodeinc/badger/pull/2076 -- perf: fix operation in seek by @harshil-goel in https://github.com/hypermodeinc/badger/pull/2077 -- Add lakeFS to README.md by @N-o-Z in https://github.com/hypermodeinc/badger/pull/2078 -- chore(): add Dependabot by @ryanfoxtyler in https://github.com/hypermodeinc/badger/pull/2080 + https://github.com/dgraph-io/badger/pull/2074 +- docs(): update docs path by @ryanfoxtyler in https://github.com/dgraph-io/badger/pull/2076 +- perf: fix operation in seek by @harshil-goel in https://github.com/dgraph-io/badger/pull/2077 +- Add lakeFS to README.md by @N-o-Z in https://github.com/dgraph-io/badger/pull/2078 +- chore(): add Dependabot by @ryanfoxtyler in https://github.com/dgraph-io/badger/pull/2080 - chore(deps): bump golangci/golangci-lint-action from 4 to 6 by @dependabot in - https://github.com/hypermodeinc/badger/pull/2083 + https://github.com/dgraph-io/badger/pull/2083 - chore(deps): bump actions/upload-artifact from 3 to 4 by @dependabot in - https://github.com/hypermodeinc/badger/pull/2081 + https://github.com/dgraph-io/badger/pull/2081 - chore(deps): bump github/codeql-action from 2 to 3 by @dependabot in - https://github.com/hypermodeinc/badger/pull/2082 + https://github.com/dgraph-io/badger/pull/2082 - chore(deps): bump the minor group with 7 updates by @dependabot in - https://github.com/hypermodeinc/badger/pull/2089 -- Action Manager by @madhu72 in https://github.com/hypermodeinc/badger/pull/2050 + https://github.com/dgraph-io/badger/pull/2089 +- Action Manager by @madhu72 in https://github.com/dgraph-io/badger/pull/2050 - chore(deps): bump golang.org/x/sys from 0.23.0 to 0.24.0 in the minor group by @dependabot in - https://github.com/hypermodeinc/badger/pull/2091 + https://github.com/dgraph-io/badger/pull/2091 - chore(deps): bump github.com/golang/protobuf from 1.5.3 to 1.5.4 in the patch group by @dependabot - in https://github.com/hypermodeinc/badger/pull/2090 -- chore: fix some comments by @dufucun in https://github.com/hypermodeinc/badger/pull/2092 + in https://github.com/dgraph-io/badger/pull/2090 +- chore: fix some comments by @dufucun in https://github.com/dgraph-io/badger/pull/2092 - chore(deps): bump github.com/google/flatbuffers from 1.12.1 to 24.3.25+incompatible by @dependabot - in https://github.com/hypermodeinc/badger/pull/2084 + in https://github.com/dgraph-io/badger/pull/2084 **CI** - ci: change cron frequency to fix ghost jobs by @joshua-goldstein in - https://github.com/hypermodeinc/badger/pull/2010 + https://github.com/dgraph-io/badger/pull/2010 - fix(CI): Update to pull_request trigger by @ryanfoxtyler in - https://github.com/hypermodeinc/badger/pull/2056 -- ci/cd optimization by @ryanfoxtyler in https://github.com/hypermodeinc/badger/pull/2051 -- fix(cd): fixed cd pipeline by @harshil-goel in https://github.com/hypermodeinc/badger/pull/2093 -- fix(cd): change name by @harshil-goel in https://github.com/hypermodeinc/badger/pull/2094 + https://github.com/dgraph-io/badger/pull/2056 +- ci/cd optimization by @ryanfoxtyler in https://github.com/dgraph-io/badger/pull/2051 +- fix(cd): fixed cd pipeline by @harshil-goel in https://github.com/dgraph-io/badger/pull/2093 +- fix(cd): change name by @harshil-goel in https://github.com/dgraph-io/badger/pull/2094 - fix(cd): added more debug things to cd by @harshil-goel in - https://github.com/hypermodeinc/badger/pull/2095 + https://github.com/dgraph-io/badger/pull/2095 - fix(cd): removing some debug items by @harshil-goel in - https://github.com/hypermodeinc/badger/pull/2096 + https://github.com/dgraph-io/badger/pull/2096 -**Full Changelog**: https://github.com/hypermodeinc/badger/compare/v4.2.0...v4.3.0 +**Full Changelog**: https://github.com/dgraph-io/badger/compare/v4.2.0...v4.3.0 ## [4.2.0] - 2023-08-03 @@ -182,7 +309,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). This release adds support for incremental stream writer. We also do some cleanup in the docs and resolve some CI issues for community PR's. We resolve high and medium CVE's and fix -[#1833](https://github.com/hypermodeinc/badger/issues/1833). +[#1833](https://github.com/dgraph-io/badger/issues/1833). **Features** @@ -191,7 +318,7 @@ resolve some CI issues for community PR's. We resolve high and medium CVE's and **Fixes** - chore: upgrade xxhash from v1.1.0 to v2.1.2 (#1910) (fixes - [#1833](https://github.com/hypermodeinc/badger/issues/1833)) + [#1833](https://github.com/dgraph-io/badger/issues/1833)) **Security** @@ -199,13 +326,13 @@ resolve some CI issues for community PR's. We resolve high and medium CVE's and **CVEs** -- [CVE-2021-31525](https://github.com/hypermodeinc/badger/security/dependabot/7) -- [CVE-2022-41723](https://github.com/hypermodeinc/badger/security/dependabot/4) -- [CVE-2022-27664](https://github.com/hypermodeinc/badger/security/dependabot/5) -- [CVE-2021-33194](https://github.com/hypermodeinc/badger/security/dependabot/9) -- [CVE-2022-41723](https://github.com/hypermodeinc/badger/security/dependabot/13) -- [CVE-2021-33194](https://github.com/hypermodeinc/badger/security/dependabot/16) -- [CVE-2021-38561](https://github.com/hypermodeinc/badger/security/dependabot/8) +- [CVE-2021-31525](https://github.com/dgraph-io/badger/security/dependabot/7) +- [CVE-2022-41723](https://github.com/dgraph-io/badger/security/dependabot/4) +- [CVE-2022-27664](https://github.com/dgraph-io/badger/security/dependabot/5) +- [CVE-2021-33194](https://github.com/dgraph-io/badger/security/dependabot/9) +- [CVE-2022-41723](https://github.com/dgraph-io/badger/security/dependabot/13) +- [CVE-2021-33194](https://github.com/dgraph-io/badger/security/dependabot/16) +- [CVE-2021-38561](https://github.com/dgraph-io/badger/security/dependabot/8) **Chores** @@ -674,7 +801,6 @@ This sections lists the changes which were reverted because of non-reproducible **New APIs** - badger.Options - - WithInMemory (f5b6321) - WithZSTDCompressionLevel (3eb4e72) @@ -706,7 +832,6 @@ This sections lists the changes which were reverted because of non-reproducible **New APIs** - badger.DB - - NewWriteBatchAt (7f43769) - CacheMetrics (b9056f1) @@ -784,7 +909,6 @@ _Note_: The hashes in parentheses correspond to the commits that impacted the gi **New APIs** - badger.DB - - DropPrefix (291295e) - Flatten (7e41bba) - KeySplits (4751ef1) @@ -795,30 +919,25 @@ _Note_: The hashes in parentheses correspond to the commits that impacted the gi - Sync (851e462) - badger.DefaultOptions() and badger.LSMOnlyOptions() (91ce687) - - badger.Options.WithX methods - badger.Entry (e9447c9) - - NewEntry - WithMeta - WithDiscard - WithTTL - badger.Item - - KeySize (fd59907) - ValueSize (5242a99) - badger.IteratorOptions - - PickTable (7d46029, 49a49e3) - Prefix (7d46029) - badger.Logger (fbb2778) - badger.Options - - CompactL0OnClose (7e41bba) - Logger (3f66663) - LogRotatesToFlush (2237832) @@ -890,7 +1009,7 @@ Bug Fixes: - Fix for infinite yieldItemValue recursion. #503 - Fix recursive addition of `badgerMove` prefix. - https://github.com/hypermodeinc/badger/commit/2e3a32f0ccac3066fb4206b28deb39c210c5266f + https://github.com/dgraph-io/badger/commit/2e3a32f0ccac3066fb4206b28deb39c210c5266f - Use file size based window size for sampling, instead of fixing it to 10MB. #501 Cleanup: @@ -957,23 +1076,46 @@ Bug fix: - Fix an uint16 overflow when resizing key slice -[Unreleased]: https://github.com/hypermodeinc/badger/compare/v2.2007.2...HEAD -[2.2007.2]: https://github.com/hypermodeinc/badger/compare/v2.2007.1...v2.2007.2 -[2.2007.1]: https://github.com/hypermodeinc/badger/compare/v2.2007.0...v2.2007.1 -[2.2007.0]: https://github.com/hypermodeinc/badger/compare/v2.0.3...v2.2007.0 -[2.0.3]: https://github.com/hypermodeinc/badger/compare/v2.0.2...v2.0.3 -[2.0.2]: https://github.com/hypermodeinc/badger/compare/v2.0.1...v2.0.2 -[2.0.1]: https://github.com/hypermodeinc/badger/compare/v2.0.0...v2.0.1 -[2.0.0]: https://github.com/hypermodeinc/badger/compare/v1.6.0...v2.0.0 -[1.6.0]: https://github.com/hypermodeinc/badger/compare/v1.5.5...v1.6.0 -[1.5.5]: https://github.com/hypermodeinc/badger/compare/v1.5.3...v1.5.5 -[1.5.3]: https://github.com/hypermodeinc/badger/compare/v1.5.2...v1.5.3 -[1.5.2]: https://github.com/hypermodeinc/badger/compare/v1.5.1...v1.5.2 -[1.5.1]: https://github.com/hypermodeinc/badger/compare/v1.5.0...v1.5.1 -[1.5.0]: https://github.com/hypermodeinc/badger/compare/v1.4.0...v1.5.0 -[1.4.0]: https://github.com/hypermodeinc/badger/compare/v1.3.0...v1.4.0 -[1.3.0]: https://github.com/hypermodeinc/badger/compare/v1.2.0...v1.3.0 -[1.2.0]: https://github.com/hypermodeinc/badger/compare/v1.1.1...v1.2.0 -[1.1.1]: https://github.com/hypermodeinc/badger/compare/v1.1.0...v1.1.1 -[1.1.0]: https://github.com/hypermodeinc/badger/compare/v1.0.1...v1.1.0 -[1.0.1]: https://github.com/hypermodeinc/badger/compare/v1.0.0...v1.0.1 +[4.9.0]: https://github.com/dgraph-io/badger/compare/v4.8.0...v4.9.0 +[4.8.0]: https://github.com/dgraph-io/badger/compare/v4.7.0...v4.8.0 +[4.7.0]: https://github.com/dgraph-io/badger/compare/v4.6.0...v4.7.0 +[4.6.0]: https://github.com/dgraph-io/badger/compare/v4.5.2...v4.6.0 +[4.5.2]: https://github.com/dgraph-io/badger/compare/v4.5.1...v4.5.2 +[4.5.1]: https://github.com/dgraph-io/badger/compare/v4.5.0...v4.5.1 +[4.5.0]: https://github.com/dgraph-io/badger/compare/v4.4.0...v4.5.0 +[4.4.0]: https://github.com/dgraph-io/badger/compare/v4.3.1...v4.4.0 +[4.3.1]: https://github.com/dgraph-io/badger/compare/v4.3.0...v4.3.1 +[4.3.0]: https://github.com/dgraph-io/badger/compare/v4.2.0...v4.3.0 +[4.2.0]: https://github.com/dgraph-io/badger/compare/v4.1.0...v4.2.0 +[4.1.0]: https://github.com/dgraph-io/badger/compare/v4.0.1...v4.1.0 +[4.0.1]: https://github.com/dgraph-io/badger/compare/v4.0.0...v4.0.1 +[4.0.0]: https://github.com/dgraph-io/badger/compare/v3.2103.5...v4.0.0 +[3.2103.5]: https://github.com/dgraph-io/badger/compare/v3.2103.4...v3.2103.5 +[3.2103.4]: https://github.com/dgraph-io/badger/compare/v3.2103.3...v3.2103.4 +[3.2103.3]: https://github.com/dgraph-io/badger/compare/v3.2103.2...v3.2103.3 +[3.2103.2]: https://github.com/dgraph-io/badger/compare/v3.2103.1...v3.2103.2 +[3.2103.1]: https://github.com/dgraph-io/badger/compare/v3.2103.0...v3.2103.1 +[3.2103.0]: https://github.com/dgraph-io/badger/compare/v3.2011.1...v3.2103.0 +[3.2011.1]: https://github.com/dgraph-io/badger/compare/v3.2011.0...v3.2011.1 +[3.2011.0]: https://github.com/dgraph-io/badger/compare/v2.2007.4...v3.2011.0 +[2.2007.4]: https://github.com/dgraph-io/badger/compare/v2.2007.3...v2.2007.4 +[2.2007.3]: https://github.com/dgraph-io/badger/compare/v2.2007.2...v2.2007.3 +[2.2007.2]: https://github.com/dgraph-io/badger/compare/v2.2007.1...v2.2007.2 +[2.2007.1]: https://github.com/dgraph-io/badger/compare/v2.2007.0...v2.2007.1 +[2.2007.0]: https://github.com/dgraph-io/badger/compare/v2.0.3...v2.2007.0 +[2.0.3]: https://github.com/dgraph-io/badger/compare/v2.0.2...v2.0.3 +[2.0.2]: https://github.com/dgraph-io/badger/compare/v2.0.1...v2.0.2 +[2.0.1]: https://github.com/dgraph-io/badger/compare/v2.0.0...v2.0.1 +[2.0.0]: https://github.com/dgraph-io/badger/compare/v1.6.0...v2.0.0 +[1.6.0]: https://github.com/dgraph-io/badger/compare/v1.5.5...v1.6.0 +[1.5.5]: https://github.com/dgraph-io/badger/compare/v1.5.3...v1.5.5 +[1.5.3]: https://github.com/dgraph-io/badger/compare/v1.5.2...v1.5.3 +[1.5.2]: https://github.com/dgraph-io/badger/compare/v1.5.1...v1.5.2 +[1.5.1]: https://github.com/dgraph-io/badger/compare/v1.5.0...v1.5.1 +[1.5.0]: https://github.com/dgraph-io/badger/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/dgraph-io/badger/compare/v1.3.0...v1.4.0 +[1.3.0]: https://github.com/dgraph-io/badger/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/dgraph-io/badger/compare/v1.1.1...v1.2.0 +[1.1.1]: https://github.com/dgraph-io/badger/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/dgraph-io/badger/compare/v1.0.1...v1.1.0 +[1.0.1]: https://github.com/dgraph-io/badger/compare/v1.0.0...v1.0.1 diff --git a/vendor/github.com/dgraph-io/badger/v4/CODE_OF_CONDUCT.md b/vendor/github.com/dgraph-io/badger/v4/CODE_OF_CONDUCT.md index 614af544e1..16320059d1 100644 --- a/vendor/github.com/dgraph-io/badger/v4/CODE_OF_CONDUCT.md +++ b/vendor/github.com/dgraph-io/badger/v4/CODE_OF_CONDUCT.md @@ -51,8 +51,8 @@ an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community -leaders responsible for enforcement at hello@hypermode.com. All complaints will be reviewed and -investigated promptly and fairly. +leaders responsible for enforcement at dgraph-admin@istaridigital.com. All complaints will be +reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. diff --git a/vendor/github.com/dgraph-io/badger/v4/CONTRIBUTING.md b/vendor/github.com/dgraph-io/badger/v4/CONTRIBUTING.md index f6d595953e..3f1752dd40 100644 --- a/vendor/github.com/dgraph-io/badger/v4/CONTRIBUTING.md +++ b/vendor/github.com/dgraph-io/badger/v4/CONTRIBUTING.md @@ -25,18 +25,20 @@ Please make sure to read and observe our [Code of Conduct](./CODE_OF_CONDUCT.md) ### Find a good first topic You can start by finding an existing issue with the -[good first issue](https://github.com/hypermodeinc/badger/labels/good%20first%20issue) or -[help wanted](https://github.com/hypermodeinc/badger/labels/help%20wanted) labels. These issues are +[good first issue](https://github.com/dgraph-io/badger/labels/good%20first%20issue) or +[help wanted](https://github.com/dgraph-io/badger/labels/help%20wanted) labels. These issues are well suited for new contributors. ## Setting up your development environment -Badger uses [`Go Modules`](https://github.com/golang/go/wiki/Modules) to manage dependencies. The -version of Go should be **1.12** or above. +- [Install Go 1.25.0 or above](https://golang.org/doc/install). +- Install + [trunk](https://docs.trunk.io/code-quality/overview/getting-started/install#install-the-launcher). + Our CI uses trunk to lint and check code, having it installed locally will save you time. ### Fork the project -- Visit https://github.com/hypermodeinc/badger +- Visit https://github.com/dgraph-io/badger - Click the `Fork` button (top right) to create a fork of the repository ### Clone the project @@ -44,7 +46,7 @@ version of Go should be **1.12** or above. ```sh git clone https://github.com/$GITHUB_USER/badger cd badger -git remote add upstream git@github.com:hypermodeinc/badger.git +git remote add upstream git@github.com:dgraph-io/badger.git # Never push to the upstream master git remote set-url --push upstream no_push @@ -98,7 +100,7 @@ description. ### Sign the CLA Click the **Sign in with Github to agree** button to sign the CLA. -[An example](https://cla-assistant.io/hypermodeinc/badger?pullRequest=1377). +[An example](https://cla-assistant.io/dgraph-io/badger?pullRequest=1377). ### Get a code review diff --git a/vendor/github.com/dgraph-io/badger/v4/Makefile b/vendor/github.com/dgraph-io/badger/v4/Makefile index bc0e5ef3a7..aa34d87dbd 100644 --- a/vendor/github.com/dgraph-io/badger/v4/Makefile +++ b/vendor/github.com/dgraph-io/badger/v4/Makefile @@ -1,5 +1,5 @@ # -# SPDX-FileCopyrightText: © Hypermode Inc. +# SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. # SPDX-License-Identifier: Apache-2.0 # diff --git a/vendor/github.com/dgraph-io/badger/v4/README.md b/vendor/github.com/dgraph-io/badger/v4/README.md index e07f99986c..79aade6656 100644 --- a/vendor/github.com/dgraph-io/badger/v4/README.md +++ b/vendor/github.com/dgraph-io/badger/v4/README.md @@ -2,16 +2,16 @@ [![Go Reference](https://pkg.go.dev/badge/github.com/dgraph-io/badger/v4.svg)](https://pkg.go.dev/github.com/dgraph-io/badger/v4) [![Go Report Card](https://goreportcard.com/badge/github.com/dgraph-io/badger/v4)](https://goreportcard.com/report/github.com/dgraph-io/badger/v4) -[![Sourcegraph](https://sourcegraph.com/github.com/hypermodeinc/badger/-/badge.svg)](https://sourcegraph.com/github.com/hypermodeinc/badger?badge) -[![ci-badger-tests](https://github.com/hypermodeinc/badger/actions/workflows/ci-badger-tests.yml/badge.svg)](https://github.com/hypermodeinc/badger/actions/workflows/ci-badger-tests.yml) -[![ci-badger-bank-tests](https://github.com/hypermodeinc/badger/actions/workflows/ci-badger-bank-tests.yml/badge.svg)](https://github.com/hypermodeinc/badger/actions/workflows/ci-badger-bank-tests.yml) -[![ci-badger-bank-tests-nightly](https://github.com/hypermodeinc/badger/actions/workflows/ci-badger-bank-tests-nightly.yml/badge.svg)](https://github.com/hypermodeinc/badger/actions/workflows/ci-badger-bank-tests-nightly.yml) +[![Sourcegraph](https://sourcegraph.com/github.com/dgraph-io/badger/-/badge.svg)](https://sourcegraph.com/github.com/dgraph-io/badger?badge) +[![ci-badger-tests](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-tests.yml/badge.svg)](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-tests.yml) +[![ci-badger-bank-tests](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-bank-tests.yml/badge.svg)](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-bank-tests.yml) +[![ci-badger-bank-tests-nightly](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-bank-tests-nightly.yml/badge.svg)](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-bank-tests-nightly.yml) ![Badger mascot](images/diggy-shadow.png) BadgerDB is an embeddable, persistent and fast key-value (KV) database written in pure Go. It is the -underlying database for [Dgraph](https://github.com/hypermodeinc/dgraph), a fast, distributed graph database. It's meant -to be a performant alternative to non-Go-based key-value stores like RocksDB. +underlying database for [Dgraph](https://github.com/dgraph-io/dgraph), a fast, distributed graph +database. It's meant to be a performant alternative to non-Go-based key-value stores like RocksDB. ## Project Status @@ -26,7 +26,10 @@ The list of projects using Badger can be found [here](#projects-using-badger). Please consult the [Changelog] for more detailed information on releases. -[Changelog]: https://github.com/hypermodeinc/badger/blob/main/CHANGELOG.md +Note: Badger is built with go 1.23 and we refrain from bumping this version to minimize downstream +effects of those using Badger in applications built with older versions of Go. + +[Changelog]: https://github.com/dgraph-io/badger/blob/main/CHANGELOG.md ## Table of Contents @@ -51,7 +54,7 @@ Please consult the [Changelog] for more detailed information on releases. ### Installing -To start using Badger, install Go 1.21 or above. Badger v3 and above needs go modules. From your +To start using Badger, install Go 1.23 or above. Badger v3 and above needs go modules. From your project, run the following command ```sh @@ -74,7 +77,7 @@ This will install the badger command line utility into your $GOBIN path. ## Badger Documentation -Badger Documentation is available at https://docs.hypermode.com/badger +Badger Documentation is available at [https://badger.dgraph.io](https://badger.dgraph.io) ## Resources @@ -138,7 +141,7 @@ including graphs can be found the blog posts (linked above). Below is a list of known projects that use Badger: -- [Dgraph](https://github.com/hypermodeinc/dgraph) - Distributed graph database. +- [Dgraph](https://github.com/dgraph-io/dgraph) - Distributed graph database. - [Jaeger](https://github.com/jaegertracing/jaeger) - Distributed tracing platform. - [go-ipfs](https://github.com/ipfs/go-ipfs) - Go client for the InterPlanetary File System (IPFS), a new hypermedia distribution protocol. @@ -244,8 +247,8 @@ Below is a list of known projects that use Badger: - [MightyMap](https://github.com/thisisdevelopment/mightymap) - Mightymap: Conveys both robustness and high capability, fitting for a powerful concurrent map. - [FlowG](https://github.com/link-society/flowg) - A low-code log processing facility -- [Bluefin](https://github.com/blinklabs-io/bluefin) - Bluefin is a TUNA Proof of Work miner for - the Fortuna smart contract on the Cardano blockchain +- [Bluefin](https://github.com/blinklabs-io/bluefin) - Bluefin is a TUNA Proof of Work miner for the + Fortuna smart contract on the Cardano blockchain - [cDNSd](https://github.com/blinklabs-io/cdnsd) - A Cardano blockchain backed DNS server daemon - [Dingo](https://github.com/blinklabs-io/dingo) - A Cardano blockchain data node @@ -257,7 +260,6 @@ If you're interested in contributing to Badger see [CONTRIBUTING](./CONTRIBUTING ## Contact -- Please use [Github issues](https://github.com/hypermodeinc/badger/issues) for filing bugs. -- Please use [discuss.hypermode.com](https://discuss.hypermode.com) for questions, discussions, and feature - requests. -- Follow us on Twitter [@hypermodeinc](https://twitter.com/hypermodeinc). +- Please use [Github issues](https://github.com/dgraph-io/badger/issues) for filing bugs. +- Please use [Discussions](https://github.com/orgs/dgraph-io/discussions) for questions, + discussions, and feature requests. diff --git a/vendor/github.com/dgraph-io/badger/v4/SECURITY.md b/vendor/github.com/dgraph-io/badger/v4/SECURITY.md index 361a26c097..fe1355d5d6 100644 --- a/vendor/github.com/dgraph-io/badger/v4/SECURITY.md +++ b/vendor/github.com/dgraph-io/badger/v4/SECURITY.md @@ -5,6 +5,6 @@ vulnerability in Badger, we encourage you to let us know right away. We will investigate all legitimate reports and do our best to quickly fix the problem. Please report any issues or vulnerabilities via GitHub Security Advisories instead of posting a public issue in -GitHub. You can also send security communications to security@hypermode.com. +GitHub. You can also send security communications to dgraph-admin@istaridigital.com. Please include the version identifier and details on how the vulnerability can be exploited. diff --git a/vendor/github.com/dgraph-io/badger/v4/backup.go b/vendor/github.com/dgraph-io/badger/v4/backup.go index 4337e4d16d..df46649de7 100644 --- a/vendor/github.com/dgraph-io/badger/v4/backup.go +++ b/vendor/github.com/dgraph-io/badger/v4/backup.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/batch.go b/vendor/github.com/dgraph-io/badger/v4/batch.go index 63e6190973..de3131fcb1 100644 --- a/vendor/github.com/dgraph-io/badger/v4/batch.go +++ b/vendor/github.com/dgraph-io/badger/v4/batch.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/changes.sh b/vendor/github.com/dgraph-io/badger/v4/changes.sh index 83832c5cd8..0aa49ec7ae 100644 --- a/vendor/github.com/dgraph-io/badger/v4/changes.sh +++ b/vendor/github.com/dgraph-io/badger/v4/changes.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -GHORG=${GHORG:-hypermodeinc} +GHORG=${GHORG:-dgraph-io} GHREPO=${GHREPO:-badger} cat < + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/db.go b/vendor/github.com/dgraph-io/badger/v4/db.go index f30949ebf0..c466505213 100644 --- a/vendor/github.com/dgraph-io/badger/v4/db.go +++ b/vendor/github.com/dgraph-io/badger/v4/db.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -1700,7 +1700,7 @@ func (db *DB) dropAll() (func(), error) { return f, err } // prepareToDrop will stop all the incoming write and flushes any pending memtables. - // Before we drop, we'll stop the compaction because anyways all the datas are going to + // Before we drop, we'll stop the compaction because anyways all the data are going to // be deleted. db.stopCompactions() resume := func() { diff --git a/vendor/github.com/dgraph-io/badger/v4/dir_other.go b/vendor/github.com/dgraph-io/badger/v4/dir_other.go index f959c80802..1fb3b26f73 100644 --- a/vendor/github.com/dgraph-io/badger/v4/dir_other.go +++ b/vendor/github.com/dgraph-io/badger/v4/dir_other.go @@ -2,7 +2,7 @@ // +build js wasip1 /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/dir_plan9.go b/vendor/github.com/dgraph-io/badger/v4/dir_plan9.go index d6cb8d9bd5..15e0b72ec1 100644 --- a/vendor/github.com/dgraph-io/badger/v4/dir_plan9.go +++ b/vendor/github.com/dgraph-io/badger/v4/dir_plan9.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/dir_unix.go b/vendor/github.com/dgraph-io/badger/v4/dir_unix.go index dab0224fed..e56434ab69 100644 --- a/vendor/github.com/dgraph-io/badger/v4/dir_unix.go +++ b/vendor/github.com/dgraph-io/badger/v4/dir_unix.go @@ -2,7 +2,7 @@ // +build !windows,!plan9,!js,!wasip1 /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/dir_windows.go b/vendor/github.com/dgraph-io/badger/v4/dir_windows.go index 237649eb46..672ed266b7 100644 --- a/vendor/github.com/dgraph-io/badger/v4/dir_windows.go +++ b/vendor/github.com/dgraph-io/badger/v4/dir_windows.go @@ -2,7 +2,7 @@ // +build windows /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -74,7 +74,7 @@ func acquireDirectoryLock(dirPath string, pidFileName string, readOnly bool) (*d // FILE_ATTRIBUTE_TEMPORARY is used to tell Windows to try to create the handle in memory. // FILE_FLAG_DELETE_ON_CLOSE is not specified in syscall_windows.go but tells Windows to delete // the file when all processes holding the handler are closed. - // XXX: this works but it's a bit klunky. i'd prefer to use LockFileEx but it needs unsafe pkg. + // XXX: this works but it's a bit clunky. i'd prefer to use LockFileEx but it needs unsafe pkg. h, err := syscall.CreateFile( syscall.StringToUTF16Ptr(absLockFilePath), 0, 0, nil, syscall.OPEN_ALWAYS, @@ -96,5 +96,5 @@ func (g *directoryLockGuard) release() error { } // Windows doesn't support syncing directories to the file system. See -// https://github.com/hypermodeinc/badger/issues/699#issuecomment-504133587 for more details. +// https://github.com/dgraph-io/badger/issues/699#issuecomment-504133587 for more details. func syncDir(dir string) error { return nil } diff --git a/vendor/github.com/dgraph-io/badger/v4/discard.go b/vendor/github.com/dgraph-io/badger/v4/discard.go index 424cb3a14c..c6aa221f22 100644 --- a/vendor/github.com/dgraph-io/badger/v4/discard.go +++ b/vendor/github.com/dgraph-io/badger/v4/discard.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/errors.go b/vendor/github.com/dgraph-io/badger/v4/errors.go index 3063fd627f..aa2ebc6564 100644 --- a/vendor/github.com/dgraph-io/badger/v4/errors.go +++ b/vendor/github.com/dgraph-io/badger/v4/errors.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -33,7 +33,7 @@ var ( // ErrReadOnlyTxn is returned if an update function is called on a read-only transaction. ErrReadOnlyTxn = stderrors.New("No sets or deletes are allowed in a read-only transaction") - // ErrDiscardedTxn is returned if a previously discarded transaction is re-used. + // ErrDiscardedTxn is returned if a previously discarded transaction is reused. ErrDiscardedTxn = stderrors.New("This transaction has been discarded. Create a new one") // ErrEmptyKey is returned if an empty key is passed on an update function. diff --git a/vendor/github.com/dgraph-io/badger/v4/fb/flatbuffer.fbs b/vendor/github.com/dgraph-io/badger/v4/fb/flatbuffer.fbs index af73c4dcf5..dce714b575 100644 --- a/vendor/github.com/dgraph-io/badger/v4/fb/flatbuffer.fbs +++ b/vendor/github.com/dgraph-io/badger/v4/fb/flatbuffer.fbs @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/histogram.go b/vendor/github.com/dgraph-io/badger/v4/histogram.go index a2f00db523..3cda875bda 100644 --- a/vendor/github.com/dgraph-io/badger/v4/histogram.go +++ b/vendor/github.com/dgraph-io/badger/v4/histogram.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/iterator.go b/vendor/github.com/dgraph-io/badger/v4/iterator.go index 0ff786db09..f57cfa4c93 100644 --- a/vendor/github.com/dgraph-io/badger/v4/iterator.go +++ b/vendor/github.com/dgraph-io/badger/v4/iterator.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -106,7 +106,7 @@ func (item *Item) Value(fn func(val []byte) error) error { // returned. Tip: It might make sense to reuse the returned slice as dst argument for the next call. // // This function is useful in long running iterate/update transactions to avoid a write deadlock. -// See Github issue: https://github.com/hypermodeinc/badger/issues/315 +// See Github issue: https://github.com/dgraph-io/badger/issues/315 func (item *Item) ValueCopy(dst []byte) ([]byte, error) { item.wg.Wait() if item.status == prefetched { diff --git a/vendor/github.com/dgraph-io/badger/v4/key_registry.go b/vendor/github.com/dgraph-io/badger/v4/key_registry.go index 028fae0d12..fcd969ce31 100644 --- a/vendor/github.com/dgraph-io/badger/v4/key_registry.go +++ b/vendor/github.com/dgraph-io/badger/v4/key_registry.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -246,7 +246,7 @@ func WriteKeyRegistry(reg *KeyRegistry, opt KeyRegistryOptions) error { var err error eSanity, err = y.XORBlockAllocate(eSanity, opt.EncryptionKey, iv) if err != nil { - return y.Wrapf(err, "Error while encrpting sanity text in WriteKeyRegistry") + return y.Wrapf(err, "Error while encrypting sanity text in WriteKeyRegistry") } } y.Check2(buf.Write(iv)) @@ -310,7 +310,7 @@ func (kr *KeyRegistry) LatestDataKey() (*pb.DataKey, error) { // validKey return datakey if the last generated key duration less than // rotation duration. validKey := func() (*pb.DataKey, bool) { - // Time diffrence from the last generated time. + // Time difference from the last generated time. diff := time.Since(time.Unix(kr.lastCreated, 0)) if diff < kr.opt.EncryptionKeyRotationDuration { return kr.dataKeys[kr.nextKeyID], true diff --git a/vendor/github.com/dgraph-io/badger/v4/level_handler.go b/vendor/github.com/dgraph-io/badger/v4/level_handler.go index 391803f5ce..0c58e1fef2 100644 --- a/vendor/github.com/dgraph-io/badger/v4/level_handler.go +++ b/vendor/github.com/dgraph-io/badger/v4/level_handler.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/levels.go b/vendor/github.com/dgraph-io/badger/v4/levels.go index 5d20d34172..8d6c5d7114 100644 --- a/vendor/github.com/dgraph-io/badger/v4/levels.go +++ b/vendor/github.com/dgraph-io/badger/v4/levels.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -1573,7 +1573,7 @@ func (s *levelsController) addLevel0Table(t *table.Table) error { } for !s.levels[0].tryAddLevel0Table(t) { - // Before we unstall, we need to make sure that level 0 is healthy. + // Before we uninstall, we need to make sure that level 0 is healthy. timeStart := time.Now() for s.levels[0].numTables() >= s.kv.opt.NumLevelZeroTablesStall { time.Sleep(10 * time.Millisecond) diff --git a/vendor/github.com/dgraph-io/badger/v4/logger.go b/vendor/github.com/dgraph-io/badger/v4/logger.go index 408ff02785..520e918b60 100644 --- a/vendor/github.com/dgraph-io/badger/v4/logger.go +++ b/vendor/github.com/dgraph-io/badger/v4/logger.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/managed_db.go b/vendor/github.com/dgraph-io/badger/v4/managed_db.go index 7afab5eba2..e1d3699ed9 100644 --- a/vendor/github.com/dgraph-io/badger/v4/managed_db.go +++ b/vendor/github.com/dgraph-io/badger/v4/managed_db.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/manifest.go b/vendor/github.com/dgraph-io/badger/v4/manifest.go index 27c328114c..cabe0b1373 100644 --- a/vendor/github.com/dgraph-io/badger/v4/manifest.go +++ b/vendor/github.com/dgraph-io/badger/v4/manifest.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -368,14 +368,14 @@ func ReplayManifestFile(fp *os.File, extMagic uint16, opt Options) (Manifest, in return Manifest{}, 0, //nolint:lll fmt.Errorf("manifest has unsupported version: %d (we support %d).\n"+ - "Please see https://docs.hypermode.com/badger/troubleshooting#i-see-manifest-has-unsupported-version-x-we-support-y-error"+ - " on how to fix this.", + "Please see https://github.com/dgraph-io/badger/blob/main/docs/troubleshooting.md#i-see-manifest-has-unsupported-version-x-we-support-y-error"+ + " on how to fix this", version, badgerMagicVersion) } if extVersion != extMagic { return Manifest{}, 0, - fmt.Errorf("Cannot open DB because the external magic number doesn't match. "+ - "Expected: %d, version present in manifest: %d\n", extMagic, extVersion) + fmt.Errorf("cannot open DB because the external magic number doesn't match, "+ + "expected: %d, version present in manifest: %d", extMagic, extVersion) } stat, err := fp.Stat() diff --git a/vendor/github.com/dgraph-io/badger/v4/memtable.go b/vendor/github.com/dgraph-io/badger/v4/memtable.go index 58461cfb91..161a463bc6 100644 --- a/vendor/github.com/dgraph-io/badger/v4/memtable.go +++ b/vendor/github.com/dgraph-io/badger/v4/memtable.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/merge.go b/vendor/github.com/dgraph-io/badger/v4/merge.go index afc14df9b4..9c94c0c0c3 100644 --- a/vendor/github.com/dgraph-io/badger/v4/merge.go +++ b/vendor/github.com/dgraph-io/badger/v4/merge.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/options.go b/vendor/github.com/dgraph-io/badger/v4/options.go index 54eeed51fc..2ead08c304 100644 --- a/vendor/github.com/dgraph-io/badger/v4/options.go +++ b/vendor/github.com/dgraph-io/badger/v4/options.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/options/options.go b/vendor/github.com/dgraph-io/badger/v4/options/options.go index e5b580d97a..3dcf901283 100644 --- a/vendor/github.com/dgraph-io/badger/v4/options/options.go +++ b/vendor/github.com/dgraph-io/badger/v4/options/options.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.pb.go b/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.pb.go index 6af70a1f48..9e3745cec5 100644 --- a/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.pb.go +++ b/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.pb.go @@ -1,5 +1,5 @@ // -// SPDX-FileCopyrightText: © Hypermode Inc. +// SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. // SPDX-License-Identifier: Apache-2.0 // Use protos/gen.sh to generate .pb.go files. diff --git a/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.proto b/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.proto index 530d828917..0eb8abeaf4 100644 --- a/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.proto +++ b/vendor/github.com/dgraph-io/badger/v4/pb/badgerpb4.proto @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/publisher.go b/vendor/github.com/dgraph-io/badger/v4/publisher.go index 8c51a56b2e..c8682ae5ea 100644 --- a/vendor/github.com/dgraph-io/badger/v4/publisher.go +++ b/vendor/github.com/dgraph-io/badger/v4/publisher.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/skl/arena.go b/vendor/github.com/dgraph-io/badger/v4/skl/arena.go index 33c4484826..dcf529b024 100644 --- a/vendor/github.com/dgraph-io/badger/v4/skl/arena.go +++ b/vendor/github.com/dgraph-io/badger/v4/skl/arena.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/skl/skl.go b/vendor/github.com/dgraph-io/badger/v4/skl/skl.go index 27dd12290f..465caa8b07 100644 --- a/vendor/github.com/dgraph-io/badger/v4/skl/skl.go +++ b/vendor/github.com/dgraph-io/badger/v4/skl/skl.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/stream.go b/vendor/github.com/dgraph-io/badger/v4/stream.go index ae468abda7..be3930f99f 100644 --- a/vendor/github.com/dgraph-io/badger/v4/stream.go +++ b/vendor/github.com/dgraph-io/badger/v4/stream.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/stream_writer.go b/vendor/github.com/dgraph-io/badger/v4/stream_writer.go index 910a6e053f..a3d563f1a7 100644 --- a/vendor/github.com/dgraph-io/badger/v4/stream_writer.go +++ b/vendor/github.com/dgraph-io/badger/v4/stream_writer.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/structs.go b/vendor/github.com/dgraph-io/badger/v4/structs.go index 75aec4bc58..3f3b975b29 100644 --- a/vendor/github.com/dgraph-io/badger/v4/structs.go +++ b/vendor/github.com/dgraph-io/badger/v4/structs.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -45,8 +45,8 @@ func (p valuePointer) Encode() []byte { // Decode decodes the value pointer into the provided byte buffer. func (p *valuePointer) Decode(b []byte) { // Copy over data from b into p. Using *p=unsafe.pointer(...) leads to - // pointer alignment issues. See https://github.com/hypermodeinc/badger/issues/1096 - // and comment https://github.com/hypermodeinc/badger/pull/1097#pullrequestreview-307361714 + // pointer alignment issues. See https://github.com/dgraph-io/badger/issues/1096 + // and comment https://github.com/dgraph-io/badger/pull/1097#pullrequestreview-307361714 copy(((*[vptrSize]byte)(unsafe.Pointer(p))[:]), b[:vptrSize]) } @@ -65,7 +65,7 @@ const ( maxHeaderSize = 22 ) -// Encode encodes the header into []byte. The provided []byte should be atleast 5 bytes. The +// Encode encodes the header into []byte. The provided []byte should be at least 5 bytes. The // function will panic if out []byte isn't large enough to hold all the values. // The encoded header looks like // +------+----------+------------+--------------+-----------+ diff --git a/vendor/github.com/dgraph-io/badger/v4/table/builder.go b/vendor/github.com/dgraph-io/badger/v4/table/builder.go index 70ebc99bdb..e493692ab2 100644 --- a/vendor/github.com/dgraph-io/badger/v4/table/builder.go +++ b/vendor/github.com/dgraph-io/badger/v4/table/builder.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -51,8 +51,8 @@ func (h header) Encode() []byte { // Decode decodes the header. func (h *header) Decode(buf []byte) { // Copy over data from buf into h. Using *h=unsafe.pointer(...) leads to - // pointer alignment issues. See https://github.com/hypermodeinc/badger/issues/1096 - // and comment https://github.com/hypermodeinc/badger/pull/1097#pullrequestreview-307361714 + // pointer alignment issues. See https://github.com/dgraph-io/badger/issues/1096 + // and comment https://github.com/dgraph-io/badger/pull/1097#pullrequestreview-307361714 copy(((*[headerSize]byte)(unsafe.Pointer(h))[:]), buf[:headerSize]) } @@ -356,7 +356,7 @@ func (b *Builder) addInternal(key []byte, value y.ValueStruct, valueLen uint32, // ReachedCapacity returns true if we... roughly (?) reached capacity? func (b *Builder) ReachedCapacity() bool { - // If encryption/compression is enabled then use the compresssed size. + // If encryption/compression is enabled then use the compressed size. sumBlockSizes := b.compressedSize.Load() if b.opts.Compression == options.None && b.opts.DataKey == nil { sumBlockSizes = b.uncompressedSize.Load() diff --git a/vendor/github.com/dgraph-io/badger/v4/table/iterator.go b/vendor/github.com/dgraph-io/badger/v4/table/iterator.go index 7277b2e37f..772f6396e5 100644 --- a/vendor/github.com/dgraph-io/badger/v4/table/iterator.go +++ b/vendor/github.com/dgraph-io/badger/v4/table/iterator.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/table/merge_iterator.go b/vendor/github.com/dgraph-io/badger/v4/table/merge_iterator.go index e4a9377df5..b42d79e03d 100644 --- a/vendor/github.com/dgraph-io/badger/v4/table/merge_iterator.go +++ b/vendor/github.com/dgraph-io/badger/v4/table/merge_iterator.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/table/table.go b/vendor/github.com/dgraph-io/badger/v4/table/table.go index a32515e2dd..cd6d86dc27 100644 --- a/vendor/github.com/dgraph-io/badger/v4/table/table.go +++ b/vendor/github.com/dgraph-io/badger/v4/table/table.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -214,7 +214,7 @@ func (b *Block) decrRef() { return } - // Insert the []byte into pool only if the block is resuable. When a block + // Insert the []byte into pool only if the block is reusable. When a block // is reusable a new []byte is used for decompression and this []byte can // be reused. // In case of an uncompressed block, the []byte is a reference to the @@ -332,7 +332,7 @@ func OpenInMemoryTable(data []byte, id uint64, opt *Options) (*Table, error) { } func (t *Table) initBiggestAndSmallest() error { - // This defer will help gathering debugging info incase initIndex crashes. + // This defer will help gathering debugging info in case initIndex crashes. defer func() { if r := recover(); r != nil { // Use defer for printing info because there may be an intermediate panic. diff --git a/vendor/github.com/dgraph-io/badger/v4/test.sh b/vendor/github.com/dgraph-io/badger/v4/test.sh index 11da0ef9ff..9b080d34fd 100644 --- a/vendor/github.com/dgraph-io/badger/v4/test.sh +++ b/vendor/github.com/dgraph-io/badger/v4/test.sh @@ -5,7 +5,7 @@ set -eo pipefail go version # Check if Github Actions is running -if [ $CI = "true" ]; then +if [ "$CI" = "true" ]; then # Enable code coverage # export because tests run in a subprocess export covermode="-covermode=atomic" @@ -27,7 +27,7 @@ popd # Run the memory intensive tests first. manual() { - timeout="-timeout 2m" + timeout="-timeout 5m" echo "==> Running package tests for $packages" set -e go env -w GOTOOLCHAIN=go1.25.0+auto diff --git a/vendor/github.com/dgraph-io/badger/v4/test_extensions.go b/vendor/github.com/dgraph-io/badger/v4/test_extensions.go index 0a863ea9f8..16242cebd0 100644 --- a/vendor/github.com/dgraph-io/badger/v4/test_extensions.go +++ b/vendor/github.com/dgraph-io/badger/v4/test_extensions.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -45,7 +45,7 @@ type testOnlyDBExtensions struct { // logToSyncChan sends a message to the DB's syncChan. Note that we expect // that the DB never closes this channel; the responsibility for // allocating and closing the channel belongs to the test module. -// if db.syncChan is nil or has never been initialized, ths will be +// if db.syncChan is nil or has never been initialized, this will be // silently ignored. func (db *DB) logToSyncChan(msg string) { if db.syncChan != nil { @@ -55,7 +55,7 @@ func (db *DB) logToSyncChan(msg string) { // captureDiscardStats will copy the contents of the discardStats file // maintained by vlog to the onCloseDiscardCapture map specified by -// db.opt. Of couse, if db.opt.onCloseDiscardCapture is nil (as expected +// db.opt. Of course, if db.opt.onCloseDiscardCapture is nil (as expected // for a production system as opposed to a test system), this is a no-op. func (db *DB) captureDiscardStats() { if db.onCloseDiscardCapture != nil { diff --git a/vendor/github.com/dgraph-io/badger/v4/trie/trie.go b/vendor/github.com/dgraph-io/badger/v4/trie/trie.go index 5675a4e140..e448f90835 100644 --- a/vendor/github.com/dgraph-io/badger/v4/trie/trie.go +++ b/vendor/github.com/dgraph-io/badger/v4/trie/trie.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -121,7 +121,7 @@ func (t *Trie) fix(m pb.Match, id uint64, op int) error { ignore, err := parseIgnoreBytes(m.IgnoreBytes) if err != nil { - return fmt.Errorf( "while parsing ignore bytes: %s: %w", m.IgnoreBytes,err) + return fmt.Errorf("while parsing ignore bytes: %s: %w", m.IgnoreBytes, err) } for len(ignore) < len(m.Prefix) { ignore = append(ignore, false) diff --git a/vendor/github.com/dgraph-io/badger/v4/txn.go b/vendor/github.com/dgraph-io/badger/v4/txn.go index d5a6af524b..9c916d18ad 100644 --- a/vendor/github.com/dgraph-io/badger/v4/txn.go +++ b/vendor/github.com/dgraph-io/badger/v4/txn.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/util.go b/vendor/github.com/dgraph-io/badger/v4/util.go index d99abee046..bab3697afe 100644 --- a/vendor/github.com/dgraph-io/badger/v4/util.go +++ b/vendor/github.com/dgraph-io/badger/v4/util.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/value.go b/vendor/github.com/dgraph-io/badger/v4/value.go index e30a80cfb3..77a0232657 100644 --- a/vendor/github.com/dgraph-io/badger/v4/value.go +++ b/vendor/github.com/dgraph-io/badger/v4/value.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -252,7 +252,7 @@ func (vlog *valueLog) rewrite(f *logFile) error { // // NOTE: moveKeyi is the gc'ed version of the original key with version i // We're calling the gc'ed keys as moveKey to simplify the - // explanantion. We used to add move keys but we no longer do that. + // explanation. We used to add move keys but we no longer do that. // // Assume we have 3 move keys in L0. // - moveKey1 (points to vlog file 10), diff --git a/vendor/github.com/dgraph-io/badger/v4/y/checksum.go b/vendor/github.com/dgraph-io/badger/v4/y/checksum.go index 0cf538378c..725c9300c1 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/checksum.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/checksum.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/encrypt.go b/vendor/github.com/dgraph-io/badger/v4/y/encrypt.go index 676d9eaf57..fb04df299b 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/encrypt.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/encrypt.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/error.go b/vendor/github.com/dgraph-io/badger/v4/y/error.go index fcd293c4e9..5e95bc3b2d 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/error.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/error.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/event_log.go b/vendor/github.com/dgraph-io/badger/v4/y/event_log.go index 603e043b77..ed6a3aeb12 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/event_log.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/event_log.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/file_dsync.go b/vendor/github.com/dgraph-io/badger/v4/y/file_dsync.go index ceebac0ffe..a5e13046e9 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/file_dsync.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/file_dsync.go @@ -2,7 +2,7 @@ // +build !dragonfly,!freebsd,!windows,!plan9,!js,!wasip1 /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/file_nodsync.go b/vendor/github.com/dgraph-io/badger/v4/y/file_nodsync.go index 209bb49e3a..70b7d5cb52 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/file_nodsync.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/file_nodsync.go @@ -2,7 +2,7 @@ // +build dragonfly freebsd windows plan9 /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/iterator.go b/vendor/github.com/dgraph-io/badger/v4/y/iterator.go index ccaa9a422f..ec25552b75 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/iterator.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/iterator.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/metrics.go b/vendor/github.com/dgraph-io/badger/v4/y/metrics.go index 8834433b12..dd9775060e 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/metrics.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/metrics.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/dgraph-io/badger/v4/y/watermark.go b/vendor/github.com/dgraph-io/badger/v4/y/watermark.go index 5479c9cbf9..881e8399f7 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/watermark.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/watermark.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -119,7 +119,7 @@ func (w *WaterMark) WaitForMark(ctx context.Context, index uint64) error { // process is used to process the Mark channel. This is not thread-safe, // so only run one goroutine for process. One is sufficient, because // all goroutine ops use purely memory and cpu. -// Each index has to emit atleast one begin watermark in serial order otherwise waiters +// Each index has to emit at least one begin watermark in serial order otherwise waiters // can get blocked idefinitely. Example: We had an watermark at 100 and a waiter at 101, // if no watermark is emitted at index 101 then waiter would get stuck indefinitely as it // can't decide whether the task at 101 has decided not to emit watermark or it didn't get diff --git a/vendor/github.com/dgraph-io/badger/v4/y/y.go b/vendor/github.com/dgraph-io/badger/v4/y/y.go index 761e870389..7d7f23e2ae 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/y.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/y.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ @@ -95,7 +95,11 @@ func OpenTruncFile(filename string, sync bool) (*os.File, error) { // SafeCopy does append(a[:0], src...). func SafeCopy(a, src []byte) []byte { - return append(a[:0], src...) + b := append(a[:0], src...) + if b == nil { + return []byte{} + } + return b } // Copy copies a byte slice and returns the copied slice. @@ -134,7 +138,7 @@ func CompareKeys(key1, key2 []byte) int { // ParseKey parses the actual key from the key bytes. func ParseKey(key []byte) []byte { - if key == nil { + if len(key) < 8 { return nil } diff --git a/vendor/github.com/dgraph-io/badger/v4/y/zstd.go b/vendor/github.com/dgraph-io/badger/v4/y/zstd.go index 5bdb908879..517e6cb558 100644 --- a/vendor/github.com/dgraph-io/badger/v4/y/zstd.go +++ b/vendor/github.com/dgraph-io/badger/v4/y/zstd.go @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-FileCopyrightText: © 2017-2025 Istari Digital, Inc. * SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/github.com/go-resty/resty/v2/README.md b/vendor/github.com/go-resty/resty/v2/README.md index a8f2ffbdb6..21bf8d1241 100644 --- a/vendor/github.com/go-resty/resty/v2/README.md +++ b/vendor/github.com/go-resty/resty/v2/README.md @@ -4,12 +4,12 @@

Features section describes in detail about Resty capabilities

-

Build Status Code Coverage Go Report Card Release Version GoDoc License Mentioned in Awesome Go

+

Build Status Code Coverage Go Report Card Release Version GoDoc License Mentioned in Awesome Go

## News - * v2.17.0 [released](https://github.com/go-resty/resty/releases/tag/v2.17.0) and tagged on Nov 22, 2025. + * v2.17.1 [released](https://github.com/go-resty/resty/releases/tag/v2.17.1) and tagged on Dec 15, 2025. * v2.0.0 [released](https://github.com/go-resty/resty/releases/tag/v2.0.0) and tagged on Jul 16, 2019. * v1.12.0 [released](https://github.com/go-resty/resty/releases/tag/v1.12.0) and tagged on Feb 27, 2019. * v1.0 released and tagged on Sep 25, 2017. - Resty's first version was released on Sep 15, 2015 then it grew gradually as a very handy and helpful library. Its been a two years since first release. I'm very thankful to Resty users and its [contributors](https://github.com/go-resty/resty/graphs/contributors). diff --git a/vendor/github.com/go-resty/resty/v2/middleware.go b/vendor/github.com/go-resty/resty/v2/middleware.go index a0ba070064..daf63addf2 100644 --- a/vendor/github.com/go-resty/resty/v2/middleware.go +++ b/vendor/github.com/go-resty/resty/v2/middleware.go @@ -501,6 +501,9 @@ func handleFormData(c *Client, r *Request) { } func handleContentType(c *Client, r *Request) { + if r.Body == http.NoBody { + return + } contentType := r.Header.Get(hdrContentTypeKey) if IsStringEmpty(contentType) { contentType = DetectContentType(r.Body) diff --git a/vendor/github.com/go-resty/resty/v2/request.go b/vendor/github.com/go-resty/resty/v2/request.go index e5ab36152e..66f4a82013 100644 --- a/vendor/github.com/go-resty/resty/v2/request.go +++ b/vendor/github.com/go-resty/resty/v2/request.go @@ -1095,7 +1095,8 @@ type SRVRecord struct { func (r *Request) fmtBodyString(sl int64) (body string) { body = "***** NO CONTENT *****" - if !isPayloadSupported(r.Method, r.client.AllowGetMethodPayload) { + if !isPayloadSupported(r.Method, r.client.AllowGetMethodPayload) || + r.Body == http.NoBody { return } diff --git a/vendor/github.com/go-resty/resty/v2/resty.go b/vendor/github.com/go-resty/resty/v2/resty.go index 4a191961a6..8428f9b187 100644 --- a/vendor/github.com/go-resty/resty/v2/resty.go +++ b/vendor/github.com/go-resty/resty/v2/resty.go @@ -14,7 +14,7 @@ import ( ) // Version # of resty -const Version = "2.16.5" +const Version = "2.17.1" // New method creates a new Resty client. func New() *Client { diff --git a/vendor/github.com/jedib0t/go-pretty/v6/text/string.go b/vendor/github.com/jedib0t/go-pretty/v6/text/string.go index ab5e293761..fa3e4f1db8 100644 --- a/vendor/github.com/jedib0t/go-pretty/v6/text/string.go +++ b/vendor/github.com/jedib0t/go-pretty/v6/text/string.go @@ -76,17 +76,20 @@ func LongestLineLen(str string) int { return maxLength } -// OverrideRuneWidthEastAsianWidth can *probably* help with alignment, and -// length calculation issues when dealing with Unicode character-set and a -// non-English language set in the LANG variable. +// OverrideRuneWidthEastAsianWidth overrides the East Asian width detection in +// the runewidth library. This is primarily for advanced use cases. // -// Set this to 'false' to force the "runewidth" library to pretend to deal with -// English character-set. Be warned that if the text/content you are dealing -// with contains East Asian character-set, this may result in unexpected -// behavior. +// Box drawing (U+2500-U+257F) and block element (U+2580-U+259F) characters +// are automatically handled and always reported as width 1, regardless of +// this setting, fixing alignment issues that previously required setting this +// to false. // -// References: -// * https://github.com/mattn/go-runewidth/issues/64#issuecomment-1221642154 +// Setting this to false forces runewidth to treat all characters as if in an +// English locale. Warning: this may cause East Asian characters (Chinese, +// Japanese, Korean) to be incorrectly reported as width 1 instead of 2. +// +// See: +// * https://github.com/mattn/go-runewidth/issues/64 // * https://github.com/jedib0t/go-pretty/issues/220 // * https://github.com/jedib0t/go-pretty/issues/204 func OverrideRuneWidthEastAsianWidth(val bool) { @@ -184,16 +187,28 @@ func RuneCount(str string) int { return StringWidthWithoutEscSequences(str) } -// RuneWidth returns the mostly accurate character-width of the rune. This is -// not 100% accurate as the character width is usually dependent on the -// typeface (font) used in the console/terminal. For ex.: +// RuneWidth returns the display width of a rune. Width accuracy depends on +// the terminal font, as character width is font-dependent. Examples: // // RuneWidth('A') == 1 // RuneWidth('ツ') == 2 // RuneWidth('⊙') == 1 // RuneWidth('︿') == 2 // RuneWidth(0x27) == 0 +// +// Box drawing (U+2500-U+257F) and block element (U+2580-U+259F) characters +// are always treated as width 1, regardless of locale, to ensure proper +// alignment in tables and progress indicators. This fixes incorrect width 2 +// reporting in East Asian locales (e.g., LANG=zh_CN.UTF-8). +// +// See: +// * https://github.com/mattn/go-runewidth/issues/64 +// * https://github.com/jedib0t/go-pretty/issues/220 +// * https://github.com/jedib0t/go-pretty/issues/204 func RuneWidth(r rune) int { + if (r >= 0x2500 && r <= 0x257F) || (r >= 0x2580 && r <= 0x259F) { + return 1 + } return rwCondition.RuneWidth(r) } diff --git a/vendor/github.com/pion/dtls/v3/conn.go b/vendor/github.com/pion/dtls/v3/conn.go index 53837d6c22..687d477f9c 100644 --- a/vendor/github.com/pion/dtls/v3/conn.go +++ b/vendor/github.com/pion/dtls/v3/conn.go @@ -153,7 +153,7 @@ func createConn( } workerInterval := initialTickerInterval - if config.FlightInterval != 0 { + if config.FlightInterval > 0 { workerInterval = config.FlightInterval } diff --git a/vendor/github.com/pion/dtls/v3/flight0handler.go b/vendor/github.com/pion/dtls/v3/flight0handler.go index b221b7cfc2..36dc80dd00 100644 --- a/vendor/github.com/pion/dtls/v3/flight0handler.go +++ b/vendor/github.com/pion/dtls/v3/flight0handler.go @@ -14,7 +14,11 @@ import ( "github.com/pion/dtls/v3/pkg/protocol/handshake" ) -//nolint:cyclop +// renegotiationInfoSCSV is TLS_EMPTY_RENEGOTIATION_INFO_SCSV defined in RFC 5746. +// https://datatracker.ietf.org/doc/html/rfc5746#section-3.3. +const renegotiationInfoSCSV uint16 = 0x00ff + +//nolint:cyclop,gocognit func flight0Parse( _ context.Context, _ flightConn, @@ -52,6 +56,11 @@ func flight0Parse( cipherSuites := []CipherSuite{} for _, id := range clientHello.CipherSuiteIDs { + if id == renegotiationInfoSCSV { + state.remoteSupportsRenegotiation = true + + continue + } if c := cipherSuiteForID(CipherSuiteID(id), cfg.customCipherSuites); c != nil { cipherSuites = append(cipherSuites, c) } diff --git a/vendor/github.com/pion/ice/v4/agent.go b/vendor/github.com/pion/ice/v4/agent.go index 3d49b121bd..8d82e543c2 100644 --- a/vendor/github.com/pion/ice/v4/agent.go +++ b/vendor/github.com/pion/ice/v4/agent.go @@ -25,6 +25,7 @@ import ( "github.com/pion/transport/v3/packetio" "github.com/pion/transport/v3/stdnet" "github.com/pion/transport/v3/vnet" + "github.com/pion/turn/v4" "golang.org/x/net/proxy" ) @@ -111,18 +112,17 @@ type Agent struct { selectedPair atomic.Value // *CandidatePair - urls []*stun.URI - networkTypes []NetworkType - natCandidateType CandidateType - natIPs []string + urls []*stun.URI + networkTypes []NetworkType + addressRewriteRules []AddressRewriteRule buf *packetio.Buffer // LRU of outbound Binding request Transaction IDs pendingBindingRequests []bindingRequest - // 1:1 D-NAT IP address mapping - extIPMapper *externalIPMapper + // Address rewrite (1:1) IP mapping + addressRewriteMapper *addressRewriteMapper // Callback that allows user to implement custom behavior // for STUN Binding Requests @@ -167,9 +167,12 @@ type Agent struct { automaticRenomination bool renominationInterval time.Duration lastRenominationTime time.Time + + turnClientFactory func(*turn.ClientConfig) (turnClient, error) } // NewAgent creates a new Agent. +// Deprecated: use NewAgentWithOptions instead. func NewAgent(config *AgentConfig) (*Agent, error) { return newAgentFromConfig(config) } @@ -191,12 +194,122 @@ func newAgentFromConfig(config *AgentConfig, opts ...AgentOption) (*Agent, error agent.localUfrag = config.LocalUfrag agent.localPwd = config.LocalPwd - agent.natCandidateType = config.NAT1To1IPCandidateType - agent.natIPs = config.NAT1To1IPs + if config.NAT1To1IPs != nil { + if err := validateLegacyNAT1To1IPs(config.NAT1To1IPs); err != nil { + return nil, err + } + + typ := CandidateTypeHost + if config.NAT1To1IPCandidateType != CandidateTypeUnspecified { + typ = config.NAT1To1IPCandidateType + } + + rules, err := legacyNAT1To1Rules(config.NAT1To1IPs, typ) + if err != nil { + return nil, err + } + agent.addressRewriteRules = rules + } return newAgentWithConfig(agent, opts...) } +func validateLegacyNAT1To1IPs(ips []string) error { + var hasIPv4CatchAll, hasIPv6CatchAll bool + + for _, mapping := range ips { + trimmed := strings.TrimSpace(mapping) + var err error + hasIPv4CatchAll, hasIPv6CatchAll, err = validateLegacyNAT1To1Entry(trimmed, hasIPv4CatchAll, hasIPv6CatchAll) + if err != nil { + return err + } + } + + return nil +} + +func validateLegacyNAT1To1Entry(mapping string, hasIPv4CatchAll, hasIPv6CatchAll bool) (bool, bool, error) { + if mapping == "" { + return hasIPv4CatchAll, hasIPv6CatchAll, nil + } + + parts := strings.Split(mapping, "/") + if len(parts) == 0 || len(parts) > 2 { + return hasIPv4CatchAll, hasIPv6CatchAll, ErrInvalidNAT1To1IPMapping + } + + _, isIPv4, err := validateIPString(parts[0]) + if err != nil { + return hasIPv4CatchAll, hasIPv6CatchAll, err + } + + if len(parts) == 2 { + if _, _, err := validateIPString(strings.TrimSpace(parts[1])); err != nil { + return hasIPv4CatchAll, hasIPv6CatchAll, err + } + + return hasIPv4CatchAll, hasIPv6CatchAll, nil + } + + if isIPv4 { + if hasIPv4CatchAll { + return hasIPv4CatchAll, hasIPv6CatchAll, ErrInvalidNAT1To1IPMapping + } + + return true, hasIPv6CatchAll, nil + } + + if hasIPv6CatchAll { + return hasIPv4CatchAll, hasIPv6CatchAll, ErrInvalidNAT1To1IPMapping + } + + return hasIPv4CatchAll, true, nil +} + +func legacyNAT1To1Rules(ips []string, candidateType CandidateType) ([]AddressRewriteRule, error) { + var rules []AddressRewriteRule + + for _, mapping := range ips { + trimmed := strings.TrimSpace(mapping) + if trimmed == "" { + continue + } + + parts := strings.Split(trimmed, "/") + switch len(parts) { + case 1: + rules = append(rules, AddressRewriteRule{ + External: []string{parts[0]}, + AsCandidateType: candidateType, + }) + case 2: + ext := strings.TrimSpace(parts[0]) + local := strings.TrimSpace(parts[1]) + if ext == "" || local == "" { + return nil, ErrInvalidNAT1To1IPMapping + } + + if _, _, err := validateIPString(ext); err != nil { + return nil, err + } + if _, _, err := validateIPString(local); err != nil { + return nil, err + } + + rules = append(rules, AddressRewriteRule{ + External: []string{ext}, + Local: local, + AsCandidateType: candidateType, + }) + default: + return nil, ErrInvalidNAT1To1IPMapping + } + } + + return rules, nil +} + func createAgentBase(config *AgentConfig) (*Agent, error) { if config.PortMax < config.PortMin { return nil, ErrPort @@ -256,6 +369,7 @@ func createAgentBase(config *AgentConfig) (*Agent, error) { lastKnownInterfaces: make(map[string]netip.Addr), automaticRenomination: false, renominationInterval: 3 * time.Second, // Default matching libwebrtc + turnClientFactory: defaultTurnClient, } config.initWithDefaults(agent) @@ -263,31 +377,36 @@ func createAgentBase(config *AgentConfig) (*Agent, error) { return agent, nil } -func applyExternalIPMapping(agent *Agent, candidateType CandidateType, ips []string) error { - mapper, err := newExternalIPMapper(candidateType, ips) +func applyAddressRewriteMapping(agent *Agent) error { + mapper, err := newAddressRewriteMapper(agent.addressRewriteRules) if err != nil { return err } - agent.extIPMapper = mapper - if agent.extIPMapper == nil { + agent.addressRewriteMapper = mapper + if agent.addressRewriteMapper == nil { return nil } - switch agent.extIPMapper.candidateType { - case CandidateTypeHost: + if agent.addressRewriteMapper.hasCandidateType(CandidateTypeHost) { + // for mDNS QueryAndGather we never advertise rewritten host IPs to avoid + // leaking local addresses, this matches the legacy NAT1:1 behavior. if agent.mDNSMode == MulticastDNSModeQueryAndGather { return ErrMulticastDNSWithNAT1To1IPMapping } + // surface misconfiguration when host candidates are disabled but a host + // rewrite rule was provided. if !containsCandidateType(CandidateTypeHost, agent.candidateTypes) { return ErrIneffectiveNAT1To1IPMappingHost } - case CandidateTypeServerReflexive: + } + + if agent.addressRewriteMapper.hasCandidateType(CandidateTypeServerReflexive) { + // surface misconfiguration when srflx candidates are disabled but a srflx + // rewrite rule was provided. if !containsCandidateType(CandidateTypeServerReflexive, agent.candidateTypes) { return ErrIneffectiveNAT1To1IPMappingSrflx } - default: - return nil } return nil @@ -394,7 +513,7 @@ func newAgentWithConfig(agent *Agent, opts ...AgentOption) (*Agent, error) { return nil, ErrUselessUrlsProvided } - if err = applyExternalIPMapping(agent, agent.natCandidateType, agent.natIPs); err != nil { + if err = applyAddressRewriteMapping(agent); err != nil { agent.closeMulticastConn() return nil, err @@ -696,16 +815,32 @@ func (a *Agent) validateSelectedPair() bool { totalTimeToFailure += a.disconnectedTimeout } + a.updateConnectionState(a.connectionStateForDisconnection(disconnectedTime, totalTimeToFailure)) + + return true +} + +func (a *Agent) connectionStateForDisconnection( + disconnectedTime time.Duration, + totalTimeToFailure time.Duration, +) ConnectionState { + disconnected := a.disconnectedTimeout != 0 && disconnectedTime > a.disconnectedTimeout + failed := totalTimeToFailure != 0 && disconnectedTime > totalTimeToFailure + switch { - case totalTimeToFailure != 0 && disconnectedTime > totalTimeToFailure: - a.updateConnectionState(ConnectionStateFailed) - case a.disconnectedTimeout != 0 && disconnectedTime > a.disconnectedTimeout: - a.updateConnectionState(ConnectionStateDisconnected) + case failed: + if disconnected && a.connectionState != ConnectionStateDisconnected && a.connectionState != ConnectionStateFailed { + // If we never reported disconnected but both thresholds are already exceeded, + // emit disconnected first so callers can observe both transitions. + return ConnectionStateDisconnected + } + + return ConnectionStateFailed + case disconnected: + return ConnectionStateDisconnected default: - a.updateConnectionState(ConnectionStateConnected) + return ConnectionStateConnected } - - return true } // checkKeepalive sends STUN Binding Indications to the selected pair @@ -829,7 +964,7 @@ func (a *Agent) addRemotePassiveTCPCandidate(remoteCandidate Candidate) { conn := newActiveTCPConn( a.loop, - net.JoinHostPort(localIPs[i].String(), "0"), + net.JoinHostPort(localIPs[i].addr.String(), "0"), netip.AddrPortFrom(ip, uint16(remoteCandidate.Port())), //nolint:gosec // G115, no overflow, a port a.log, ) @@ -843,7 +978,7 @@ func (a *Agent) addRemotePassiveTCPCandidate(remoteCandidate Candidate) { localCandidate, err := NewCandidateHost(&CandidateHostConfig{ Network: remoteCandidate.NetworkType().String(), - Address: localIPs[i].String(), + Address: localIPs[i].addr.String(), Port: tcpAddr.Port, Component: ComponentRTP, TCPType: TCPTypeActive, @@ -904,6 +1039,10 @@ func (a *Agent) addRemoteCandidate(cand Candidate) { //nolint:cyclop } func (a *Agent) addCandidate(ctx context.Context, cand Candidate, candidateConn net.PacketConn) error { + if err := ctx.Err(); err != nil { + return err + } + return a.loop.Run(ctx, func(context.Context) { set := a.localCandidates[cand.NetworkType()] for _, candidate := range set { diff --git a/vendor/github.com/pion/ice/v4/agent_config.go b/vendor/github.com/pion/ice/v4/agent_config.go index 151486edf1..02d2670d5f 100644 --- a/vendor/github.com/pion/ice/v4/agent_config.go +++ b/vendor/github.com/pion/ice/v4/agent_config.go @@ -72,6 +72,7 @@ func defaultRelayAcceptanceMinWaitFor(candidateTypes []CandidateType) time.Durat // AgentConfig collects the arguments to ice.Agent construction into // a single structure, for future-proofness of the interface. +// Deprecated: use NewAgentWithOptions instead. type AgentConfig struct { Urls []*stun.URI @@ -134,12 +135,18 @@ type AgentConfig struct { // If CandidateTypeServerReflexive, it will insert a srflx candidate (as if it was derived // from a STUN server) with its port number being the one for the actual host candidate. // Other values will result in an error. + // + // Deprecated: use WithAddressRewriteRules with an explicit host or srflx rule instead. + // This field will be removed in a future major release. NAT1To1IPCandidateType CandidateType // NAT1To1IPs contains a list of public IP addresses that are to be used as a host // candidate or srflx candidate. This is used typically for servers that are behind // 1:1 D-NAT (e.g. AWS EC2 instances) and to eliminate the need of server reflexive // candidate gathering. + // + // Deprecated: use WithAddressRewriteRules with an explicit host or srflx rule instead. + // This field will be removed in a future major release. NAT1To1IPs []string // HostAcceptanceMinWait specify a minimum wait time before selecting host candidates diff --git a/vendor/github.com/pion/ice/v4/agent_options.go b/vendor/github.com/pion/ice/v4/agent_options.go index c9ab3b32dd..032f6d4230 100644 --- a/vendor/github.com/pion/ice/v4/agent_options.go +++ b/vendor/github.com/pion/ice/v4/agent_options.go @@ -4,7 +4,9 @@ package ice import ( + "fmt" "net" + "sort" "strings" "sync/atomic" "time" @@ -31,6 +33,301 @@ func DefaultNominationValueGenerator() NominationValueGenerator { } } +// WithAddressRewriteRules appends the provided address rewrite (1:1) rules to the agent's +// existing configuration. Each `AddressRewriteRule` can limit the mapping to a specific +// interface (`Iface`), local address (`Local`), CIDR block (`CIDR`), or subset +// of network types (`Networks`), allowing fine-grained control over which local +// addresses are replaced with the supplied external IPs. +// Use `Mode` to control whether a rule replaces the original candidate (default for +// host) or appends additional candidates (default for other types). +// +// Rules are evaluated in the order they are added; for each candidate type + +// local address, explicit `Local` matches win immediately. Otherwise, the most +// specific catch-all is chosen (iface+CIDR > iface-only > CIDR-only > global), +// with declaration order breaking ties at the same specificity. `Iface` (when +// set) must also match. This lets you layer specificity (e.g., iface+CIDR, then +// iface-only, then global) while still keeping rule order meaningful. +// Overlapping rules in the same scope are logged as warnings. +func WithAddressRewriteRules(rules ...AddressRewriteRule) AgentOption { + return func(agent *Agent) error { + return appendAddressRewriteRules(agent, rules...) + } +} + +func warnOnAddressRewriteConflicts(agent *Agent) { + if agent == nil || agent.log == nil { + return + } + + for _, conflict := range findAddressRewriteRuleConflicts(agent.addressRewriteRules) { + scope := conflict.scope + scopeSummary := fmt.Sprintf( + "candidate=%s iface=%s cidr=%s networks=%s local=%s", + scope.candidateType.String(), + emptyScopeValue(scope.iface), + emptyScopeValue(scope.cidr), + emptyScopeValue(scope.networksKey), + scope.localKey, + ) + + message := fmt.Sprintf( + "detected overlapping address rewrite rule (%s): existing external IPs [%s], additional external IP %s", + scopeSummary, + strings.Join(conflict.existingExternalIPs, ", "), + conflict.conflictingExternal, + ) + + agent.log.Warn(message) + } +} + +func emptyScopeValue(v string) string { + if v == "" { + return "*" + } + + return v +} + +func appendAddressRewriteRules(agent *Agent, rules ...AddressRewriteRule) error { + if len(rules) == 0 { + return nil + } + + sanitized := make([]AddressRewriteRule, 0, len(rules)) + for _, rule := range rules { + normalized, err := sanitizeAddressRewriteRule(rule) + if err != nil { + return err + } + + sanitized = append(sanitized, normalized) + } + + agent.addressRewriteRules = append(agent.addressRewriteRules, sanitized...) + warnOnAddressRewriteConflicts(agent) + + return nil +} + +func sanitizeAddressRewriteRule(rule AddressRewriteRule) (AddressRewriteRule, error) { + cleaned, err := sanitizeExternalIPs(rule.External) + if err != nil { + return AddressRewriteRule{}, err + } + + normalized := rule + normalized.External = cleaned + normalized.Local = strings.TrimSpace(rule.Local) + if normalized.Local != "" { + if _, _, err := validateIPString(normalized.Local); err != nil { + return AddressRewriteRule{}, err + } + } + switch normalized.Mode { + case addressRewriteModeUnspecified: + normalized.Mode = defaultAddressRewriteMode(normalized.AsCandidateType) + case AddressRewriteReplace, AddressRewriteAppend: + default: + return AddressRewriteRule{}, ErrInvalidNAT1To1IPMapping + } + if len(rule.Networks) > 0 { + normalized.Networks = append([]NetworkType(nil), rule.Networks...) + } + + return normalized, nil +} + +func defaultAddressRewriteMode(candidateType CandidateType) AddressRewriteMode { + if candidateType == CandidateTypeUnspecified || candidateType == CandidateTypeHost { + return AddressRewriteReplace + } + + return AddressRewriteAppend +} + +func sanitizeExternalIPs(ips []string) ([]string, error) { + seen := make(map[string]struct{}, len(ips)) + sanitized := make([]string, 0, len(ips)) + + for _, raw := range ips { + trimmed := strings.TrimSpace(raw) + if trimmed == "" { + continue + } + + if _, ok := seen[trimmed]; ok { + continue + } + + if strings.Contains(trimmed, "/") { + return nil, ErrInvalidNAT1To1IPMapping + } + + if _, _, err := validateIPString(trimmed); err != nil { + return nil, err + } + + seen[trimmed] = struct{}{} + sanitized = append(sanitized, trimmed) + } + + if len(sanitized) == 0 { + return nil, ErrInvalidNAT1To1IPMapping + } + + return sanitized, nil +} + +type addressRewriteScopeKey struct { + candidateType CandidateType + iface string + cidr string + networksKey string + localKey string +} + +type addressRewriteConflict struct { + scope addressRewriteScopeKey + existingExternalIPs []string + conflictingExternal string +} + +func findAddressRewriteRuleConflicts(rules []AddressRewriteRule) []addressRewriteConflict { + conflicts := make([]addressRewriteConflict, 0) + scopeState := make(map[addressRewriteScopeKey]map[string]struct{}) + + for _, rule := range rules { + candidateType := rule.AsCandidateType + if candidateType == CandidateTypeUnspecified { + candidateType = CandidateTypeHost + } + + networksKey := "*" + if len(rule.Networks) > 0 { + names := make([]string, len(rule.Networks)) + for i, network := range rule.Networks { + names[i] = network.String() + } + sort.Strings(names) + networksKey = strings.Join(names, ",") + } + + externalEntries := enumerateAddressRewriteExternalEntries(rule) + for _, entry := range externalEntries { + key := addressRewriteScopeKey{ + candidateType: candidateType, + iface: rule.Iface, + cidr: rule.CIDR, + networksKey: networksKey, + localKey: entry.localScopeKey, + } + + existing := scopeState[key] + if existing == nil { + existing = make(map[string]struct{}) + scopeState[key] = existing + } + + if len(existing) > 0 { + if _, ok := existing[entry.externalIP]; !ok { + conflicts = append(conflicts, addressRewriteConflict{ + scope: key, + existingExternalIPs: mapKeys(existing), + conflictingExternal: entry.externalIP, + }) + } + } + + existing[entry.externalIP] = struct{}{} + } + } + + return conflicts +} + +type addressRewriteExternalEntry struct { + externalIP string + localScopeKey string +} + +func enumerateAddressRewriteExternalEntries(rule AddressRewriteRule) []addressRewriteExternalEntry { + if len(rule.External) == 0 { + return nil + } + + entries := make([]addressRewriteExternalEntry, 0, len(rule.External)) + localScope := deriveAddressRewriteLocalScopeKey(rule.Local) + + for _, mapping := range rule.External { + if mapping == "" { + continue + } + + external := strings.TrimSpace(mapping) + if external == "" { + continue + } + + scopeKey := localScope + if scopeKey == "" { + scopeKey = deriveAddressRewriteFamilyScopeKey(external) + } + + entries = append(entries, addressRewriteExternalEntry{ + externalIP: external, + localScopeKey: scopeKey, + }) + } + + return entries +} + +func deriveAddressRewriteLocalScopeKey(local string) string { + local = strings.TrimSpace(local) + if local == "" { + return "" + } + + ip, _, err := validateIPString(local) + if err != nil { + return "family:unknown" + } + + if ip.To4() != nil { + return "family:ipv4" + } + + return "family:ipv6" +} + +func deriveAddressRewriteFamilyScopeKey(ipStr string) string { + ip, _, err := validateIPString(ipStr) + if err != nil { + return "family:unknown" + } + + if ip.To4() != nil { + return "family:ipv4" + } + + return "family:ipv6" +} + +func mapKeys(m map[string]struct{}) []string { + if len(m) == 0 { + return nil + } + + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + + return keys +} + // WithICELite configures whether the agent operates in lite mode. // Lite agents do not perform connectivity checks and only provide host candidates. func WithICELite(lite bool) AgentOption { @@ -61,10 +358,6 @@ func WithUrls(urls []*stun.URI) AgentOption { // WithPortRange sets the UDP port range for host candidates. func WithPortRange(portMin, portMax uint16) AgentOption { return func(a *Agent) error { - if portMax < portMin { - return ErrPort - } - a.portMin = portMin a.portMax = portMax diff --git a/vendor/github.com/pion/ice/v4/errors.go b/vendor/github.com/pion/ice/v4/errors.go index 4249678a2e..73c76f7dc3 100644 --- a/vendor/github.com/pion/ice/v4/errors.go +++ b/vendor/github.com/pion/ice/v4/errors.go @@ -81,27 +81,55 @@ var ( // ErrUnsupportedNAT1To1IPCandidateType indicates that the specified NAT1To1IPCandidateType is // unsupported. - ErrUnsupportedNAT1To1IPCandidateType = errors.New("unsupported 1:1 NAT IP candidate type") + // + // Deprecated: use ErrUnsupportedAddressRewriteCandidateType instead. May still be returned + // when configuring address rewrite rules while NAT1:1 compatibility remains. + ErrUnsupportedNAT1To1IPCandidateType = errors.New("unsupported address rewrite candidate type") + // ErrUnsupportedAddressRewriteCandidateType is an alias for ErrUnsupportedNAT1To1IPCandidateType. + ErrUnsupportedAddressRewriteCandidateType = ErrUnsupportedNAT1To1IPCandidateType // ErrInvalidNAT1To1IPMapping indicates that the given 1:1 NAT IP mapping is invalid. - ErrInvalidNAT1To1IPMapping = errors.New("invalid 1:1 NAT IP mapping") - - // ErrExternalMappedIPNotFound in NAT1To1IPMapping. + // + // Deprecated: use ErrInvalidAddressRewriteMapping instead. May still be returned by + // WithAddressRewriteRules while NAT1:1 compatibility remains. + ErrInvalidNAT1To1IPMapping = errors.New("invalid address rewrite mapping") + // ErrInvalidAddressRewriteMapping is an alias for ErrInvalidNAT1To1IPMapping. + ErrInvalidAddressRewriteMapping = ErrInvalidNAT1To1IPMapping + + // ErrExternalMappedIPNotFound in address rewrite mapping. + // + // Kept for compatibility; current code paths treat "no externals" via match state and + // no longer return this error. ErrExternalMappedIPNotFound = errors.New("external mapped IP not found") // ErrMulticastDNSWithNAT1To1IPMapping indicates that the mDNS gathering cannot be used along // with 1:1 NAT IP mapping for host candidate. + // + // Deprecated: use ErrMulticastDNSWithAddressRewrite instead. May still be returned by + // WithAddressRewriteRules while NAT1:1 compatibility remains. ErrMulticastDNSWithNAT1To1IPMapping = errors.New( - "mDNS gathering cannot be used with 1:1 NAT IP mapping for host candidate", + "mDNS gathering cannot be used with address rewrite for host candidate", ) + // ErrMulticastDNSWithAddressRewrite is an alias for ErrMulticastDNSWithNAT1To1IPMapping. + ErrMulticastDNSWithAddressRewrite = ErrMulticastDNSWithNAT1To1IPMapping // ErrIneffectiveNAT1To1IPMappingHost indicates that 1:1 NAT IP mapping for host candidate is // requested, but the host candidate type is disabled. - ErrIneffectiveNAT1To1IPMappingHost = errors.New("1:1 NAT IP mapping for host candidate ineffective") + // + // Deprecated: use ErrIneffectiveAddressRewriteHost instead. May still be returned by + // WithAddressRewriteRules while NAT1:1 compatibility remains. + ErrIneffectiveNAT1To1IPMappingHost = errors.New("address rewrite for host candidate ineffective") + // ErrIneffectiveAddressRewriteHost is an alias for ErrIneffectiveNAT1To1IPMappingHost. + ErrIneffectiveAddressRewriteHost = ErrIneffectiveNAT1To1IPMappingHost // ErrIneffectiveNAT1To1IPMappingSrflx indicates that 1:1 NAT IP mapping for srflx candidate is // requested, but the srflx candidate type is disabled. - ErrIneffectiveNAT1To1IPMappingSrflx = errors.New("1:1 NAT IP mapping for srflx candidate ineffective") + // + // Deprecated: use ErrIneffectiveAddressRewriteSrflx instead. May still be returned by + // WithAddressRewriteRules while NAT1:1 compatibility remains. + ErrIneffectiveNAT1To1IPMappingSrflx = errors.New("address rewrite for srflx candidate ineffective") + // ErrIneffectiveAddressRewriteSrflx is an alias for ErrIneffectiveNAT1To1IPMappingSrflx. + ErrIneffectiveAddressRewriteSrflx = ErrIneffectiveNAT1To1IPMappingSrflx // ErrInvalidMulticastDNSHostName indicates an invalid MulticastDNSHostName. ErrInvalidMulticastDNSHostName = errors.New( diff --git a/vendor/github.com/pion/ice/v4/external_ip_mapper.go b/vendor/github.com/pion/ice/v4/external_ip_mapper.go index 2d483ff96b..92ff709637 100644 --- a/vendor/github.com/pion/ice/v4/external_ip_mapper.go +++ b/vendor/github.com/pion/ice/v4/external_ip_mapper.go @@ -4,10 +4,58 @@ package ice import ( + "fmt" "net" "strings" ) +// AddressRewriteMode controls whether a rule replaces or appends candidates. +type AddressRewriteMode int + +const ( + addressRewriteModeUnspecified AddressRewriteMode = iota + AddressRewriteReplace + AddressRewriteAppend +) + +// AddressRewriteRule represents a rule for remapping candidate addresses. +type AddressRewriteRule struct { + // External are the 1:1 external addresses to advertise for this rule. + // For replace mode, an empty list is treated as "drop the matched local + // address" (no candidate emitted). For append mode, an empty list is a + // no-op: the original candidate is kept. + // Empty External rules are intentional: + // - Mode AddressRewriteReplace drops the matched candidate (deny-list style). + // - Mode AddressRewriteAppend keeps the original candidate and adds nothing, + // which is useful when you combine a catch-all replace with per-interface + // allow rules. + External []string + // Local optionally pins this rule to a specific local address. When set, + // external IPs map to that address regardless of IP family. When empty, + // External acts as a catch-all for the family implied by the local scope + // (CIDR when set, otherwise the external IP family). + Local string + // Iface is the optional interface name to limit the rule to, empty = any. + Iface string + // CIDR is the optional CIDR to limit the rule to, empty = any. + CIDR string + // AsCandidateType is the candidate type to publish as for this rule. Defaults to host + // when unspecified. Supported values: host, server reflexive, relay. + AsCandidateType CandidateType + // Mode controls whether we replace the original candidate or append extra + // candidates. + // + // If Mode is zero, the default is: + // - CandidateTypeHost -> AddressRewriteReplace + // - CandidateTypeServerReflexive, CandidateTypeRelay -> AddressRewriteAppend + // For replace mode, a match with zero external IPs removes the candidate. + // For append mode, a match with zero external IPs leaves the original + // candidate untouched. + Mode AddressRewriteMode + // Networks is the optional networks to limit the rule to, nil/empty = all. + Networks []NetworkType +} + func validateIPString(ipStr string) (net.IP, bool, error) { ip := net.ParseIP(ipStr) if ip == nil { @@ -21,140 +69,388 @@ func validateIPString(ipStr string) (net.IP, bool, error) { // // for a particular IP family. type ipMapping struct { - ipSole net.IP // When non-nil, this is the sole external IP for one local IP assumed - ipMap map[string]net.IP // Local-to-external IP mapping (k: local, v: external) - valid bool // If not set any external IP, valid is false + ipSole []net.IP // When non-empty, these are the catch-all external IPs for one local IP family + ipMap map[string][]net.IP // Local-to-external IP mapping (k: local, v: external IPs) + valid bool // If not set any external IP, valid is false + catchAllSet bool } -func (m *ipMapping) setSoleIP(ip net.IP) error { - if m.ipSole != nil || len(m.ipMap) > 0 { - return ErrInvalidNAT1To1IPMapping +func newIPMapping() ipMapping { + return ipMapping{ + ipMap: make(map[string][]net.IP), } +} - m.ipSole = ip +func (m *ipMapping) addSoleIP(ip net.IP) { + m.ipSole = append(m.ipSole, ip) m.valid = true + m.catchAllSet = true +} - return nil +func addExternalMappings( + external []string, + ruleMapping *addressRewriteRuleMapping, + hasLocalAddr bool, + localAddr net.IP, + localIsIPv4 bool, +) (bool, error) { + added := false + + for _, raw := range external { + extIPStr := strings.TrimSpace(raw) + ipPair := strings.Split(extIPStr, "/") + if len(ipPair) != 1 { + return false, ErrInvalidNAT1To1IPMapping + } + + extIP, isExtIPv4, err := validateIPString(ipPair[0]) + if err != nil { + return false, err + } + + targetLocalIPv4 := isExtIPv4 + if hasLocalAddr { + targetLocalIPv4 = localIsIPv4 + } else if ruleMapping.cidr != nil { + targetLocalIPv4 = ruleMapping.cidr.IP.To4() != nil + } + + if !ruleMapping.isFamilyAllowed(targetLocalIPv4) { + continue + } + + ruleMapping.addImplicitMapping(extIP, targetLocalIPv4, hasLocalAddr, localAddr) + added = true + } + + return added, nil } -func (m *ipMapping) addIPMapping(locIP, extIP net.IP) error { - if m.ipSole != nil { - return ErrInvalidNAT1To1IPMapping +func maybeMarkEmptyMapping( + ruleMapping *addressRewriteRuleMapping, + added bool, + hasLocalAddr bool, + localIsIPv4 bool, + localAddr net.IP, +) { + if added { + return } - locIPStr := locIP.String() + if hasLocalAddr { + if ruleMapping.isFamilyAllowed(localIsIPv4) { + family := ruleMapping.mappingForFamily(localIsIPv4) + family.ipMap[localAddr.String()] = nil + family.valid = true + } + + return + } - // Check if dup of local IP - if _, ok := m.ipMap[locIPStr]; ok { - return ErrInvalidNAT1To1IPMapping + if ruleMapping.allowIPv4 { + ruleMapping.ipv4Mapping.valid = true + ruleMapping.ipv4Mapping.catchAllSet = true + } + if ruleMapping.allowIPv6 { + ruleMapping.ipv6Mapping.valid = true + ruleMapping.ipv6Mapping.catchAllSet = true } +} + +func (m *ipMapping) addIPMapping(locIP, extIP net.IP) { + locIPStr := locIP.String() - m.ipMap[locIPStr] = extIP + m.ipMap[locIPStr] = append(m.ipMap[locIPStr], extIP) m.valid = true +} - return nil +func cloneIPs(src []net.IP) []net.IP { + if len(src) == 0 { + return nil + } + + cloned := make([]net.IP, 0, len(src)) + for _, ip := range src { + if ip == nil { + continue + } + copied := make(net.IP, len(ip)) + copy(copied, ip) + cloned = append(cloned, copied) + } + + return cloned } -func (m *ipMapping) findExternalIP(locIP net.IP) (net.IP, error) { +func (m *ipMapping) findExternalIPs(locIP net.IP) []net.IP { if !m.valid { - return locIP, nil + return nil } - if m.ipSole != nil { - return m.ipSole, nil + if m.ipMap != nil { + if extIPs, ok := m.ipMap[locIP.String()]; ok && len(extIPs) > 0 { + return cloneIPs(extIPs) + } } - extIP, ok := m.ipMap[locIP.String()] - if !ok { - return nil, ErrExternalMappedIPNotFound + if len(m.ipSole) > 0 { + return cloneIPs(m.ipSole) } - return extIP, nil + return nil } -type externalIPMapper struct { - ipv4Mapping ipMapping - ipv6Mapping ipMapping - candidateType CandidateType +type addressRewriteRuleMapping struct { + rule AddressRewriteRule + mode AddressRewriteMode + ipv4Mapping ipMapping + ipv6Mapping ipMapping + cidr *net.IPNet + allowIPv4 bool + allowIPv6 bool } -//nolint:gocognit,cyclop -func newExternalIPMapper( - candidateType CandidateType, - ips []string, -) (*externalIPMapper, error) { - if len(ips) == 0 { - return nil, nil //nolint:nilnil +func (m *addressRewriteRuleMapping) hasMappings() bool { + return m.ipv4Mapping.valid || m.ipv6Mapping.valid +} + +func (m *addressRewriteRuleMapping) mappingForFamily(isIPv4 bool) *ipMapping { + if isIPv4 { + return &m.ipv4Mapping } - if candidateType == CandidateTypeUnspecified { - candidateType = CandidateTypeHost // Defaults to host - } else if candidateType != CandidateTypeHost && candidateType != CandidateTypeServerReflexive { - return nil, ErrUnsupportedNAT1To1IPCandidateType + + return &m.ipv6Mapping +} + +func (m *addressRewriteRuleMapping) isFamilyAllowed(isLocalIPv4 bool) bool { + if isLocalIPv4 { + return m.allowIPv4 } - mapper := &externalIPMapper{ - ipv4Mapping: ipMapping{ipMap: map[string]net.IP{}}, - ipv6Mapping: ipMapping{ipMap: map[string]net.IP{}}, - candidateType: candidateType, + return m.allowIPv6 +} + +func (m *addressRewriteRuleMapping) addImplicitMapping( + extIP net.IP, + isLocalIPv4 bool, + hasLocalAddr bool, + localAddr net.IP, +) { + mapping := m.mappingForFamily(isLocalIPv4) + if hasLocalAddr { + mapping.addIPMapping(localAddr, extIP) + } else { + mapping.addSoleIP(extIP) } +} - for _, extIPStr := range ips { - ipPair := strings.Split(extIPStr, "/") - if len(ipPair) == 0 || len(ipPair) > 2 { - return nil, ErrInvalidNAT1To1IPMapping +type addressRewriteMapper struct { + rulesByCandidateType map[CandidateType][]*addressRewriteRuleMapping +} + +//nolint:gocognit,gocyclo,cyclop +func newAddressRewriteMapper(rules []AddressRewriteRule) (*addressRewriteMapper, error) { + if len(rules) == 0 { + return nil, nil //nolint:nilnil + } + + mapper := &addressRewriteMapper{ + rulesByCandidateType: make(map[CandidateType][]*addressRewriteRuleMapping), + } + + for _, rule := range rules { + candidateType := rule.AsCandidateType + if candidateType == CandidateTypeUnspecified { + candidateType = CandidateTypeHost + } + if candidateType == CandidateTypePeerReflexive { + return nil, ErrUnsupportedNAT1To1IPCandidateType } - extIP, isExtIPv4, err := validateIPString(ipPair[0]) - if err != nil { - return nil, err + mode := rule.Mode + if mode == addressRewriteModeUnspecified { + mode = defaultAddressRewriteMode(candidateType) + } + + ruleMapping := &addressRewriteRuleMapping{ + rule: rule, + mode: mode, + ipv4Mapping: newIPMapping(), + ipv6Mapping: newIPMapping(), + allowIPv4: true, + allowIPv6: true, } - if len(ipPair) == 1 { //nolint:nestif - if isExtIPv4 { - if err := mapper.ipv4Mapping.setSoleIP(extIP); err != nil { - return nil, err + + if len(rule.Networks) > 0 { + ruleMapping.allowIPv4 = false + ruleMapping.allowIPv6 = false + for _, network := range rule.Networks { + if network.IsIPv4() { + ruleMapping.allowIPv4 = true } - } else { - if err := mapper.ipv6Mapping.setSoleIP(extIP); err != nil { - return nil, err + if network.IsIPv6() { + ruleMapping.allowIPv6 = true } } - } else { - locIP, isLocIPv4, err := validateIPString(ipPair[1]) + if !ruleMapping.allowIPv4 && !ruleMapping.allowIPv6 { + continue + } + } + if rule.CIDR != "" { + _, ipNet, err := net.ParseCIDR(rule.CIDR) if err != nil { - return nil, err + return nil, ErrInvalidNAT1To1IPMapping } - if isExtIPv4 { - if !isLocIPv4 { - return nil, ErrInvalidNAT1To1IPMapping - } + ruleMapping.cidr = ipNet + } - if err := mapper.ipv4Mapping.addIPMapping(locIP, extIP); err != nil { - return nil, err - } - } else { - if isLocIPv4 { - return nil, ErrInvalidNAT1To1IPMapping - } + var ( + localAddr net.IP + localIsIPv4 bool + hasLocalAddr bool + err error + ) + if trimmedLocal := strings.TrimSpace(rule.Local); trimmedLocal != "" { + localAddr, localIsIPv4, err = validateIPString(trimmedLocal) + if err != nil { + return nil, err + } + hasLocalAddr = true - if err := mapper.ipv6Mapping.addIPMapping(locIP, extIP); err != nil { - return nil, err - } + if ruleMapping.cidr != nil && !ruleMapping.cidr.Contains(localAddr) { + return nil, fmt.Errorf("%w: Invalid local IP is outside CIDR", ErrInvalidNAT1To1IPMapping) } } + + added, mapErr := addExternalMappings(rule.External, ruleMapping, hasLocalAddr, localAddr, localIsIPv4) + if mapErr != nil { + return nil, mapErr + } + maybeMarkEmptyMapping(ruleMapping, added, hasLocalAddr, localIsIPv4, localAddr) + + if ruleMapping.hasMappings() { + mapper.rulesByCandidateType[candidateType] = append(mapper.rulesByCandidateType[candidateType], ruleMapping) + } + } + + if len(mapper.rulesByCandidateType) == 0 { + return nil, nil //nolint:nilnil } return mapper, nil } -func (m *externalIPMapper) findExternalIP(localIPStr string) (net.IP, error) { +func (m *addressRewriteMapper) hasCandidateType(candidateType CandidateType) bool { + rules := m.rulesByCandidateType[candidateType] + for _, rule := range rules { + if rule.hasMappings() { + return true + } + } + + return false +} + +func (m *addressRewriteMapper) shouldReplace(candidateType CandidateType) bool { + for _, rule := range m.rulesByCandidateType[candidateType] { + if rule.mode == AddressRewriteReplace { + return true + } + } + + return false +} + +func (m *addressRewriteMapper) findExternalIPs( + candidateType CandidateType, + localIPStr string, + iface string, +) ([]net.IP, bool, AddressRewriteMode, error) { locIP, isLocIPv4, err := validateIPString(localIPStr) if err != nil { - return nil, err + return nil, false, addressRewriteModeUnspecified, err + } + + rules := m.rulesByCandidateType[candidateType] + ips, matched, mode := evaluateRewriteRules(rules, locIP, isLocIPv4, iface) + + return ips, matched, mode, nil +} + +func ruleMappingForLookup( + rule *addressRewriteRuleMapping, + locIP net.IP, + isLocIPv4 bool, + iface string, +) (*ipMapping, bool) { + if rule.rule.Iface != "" && rule.rule.Iface != iface { + return nil, false + } + if rule.cidr != nil && !rule.cidr.Contains(locIP) { + return nil, false + } + + ipMapping := rule.mappingForFamily(isLocIPv4) + if !ipMapping.valid { + return nil, false + } + + return ipMapping, true +} + +func catchAllSpecificity(rule *addressRewriteRuleMapping, iface string) int { + spec := 0 + if rule.rule.Iface != "" { + spec += 2 + if rule.cidr != nil { + spec++ + } + } else if iface == "" && rule.cidr != nil { + spec++ + } + + return spec +} + +func evaluateRewriteRules( + rules []*addressRewriteRuleMapping, + locIP net.IP, + isLocIPv4 bool, + iface string, +) (ips []net.IP, matched bool, mode AddressRewriteMode) { + var ( + catchAll []net.IP + catchAllMode AddressRewriteMode + hasCatchAll bool + bestSpec = -1 + ) + + for _, rule := range rules { + ipMapping, ok := ruleMappingForLookup(rule, locIP, isLocIPv4, iface) + if !ok { + continue + } + + if explicit, ok := ipMapping.ipMap[locIP.String()]; ok { + cloned := cloneIPs(explicit) + + return cloned, true, rule.mode + } + + if ipMapping.catchAllSet { + spec := catchAllSpecificity(rule, iface) + if !hasCatchAll || spec > bestSpec { + catchAll = cloneIPs(ipMapping.ipSole) + catchAllMode = rule.mode + hasCatchAll = true + bestSpec = spec + } + } } - if isLocIPv4 { - return m.ipv4Mapping.findExternalIP(locIP) + if hasCatchAll { + return catchAll, true, catchAllMode } - return m.ipv6Mapping.findExternalIP(locIP) + return nil, false, addressRewriteModeUnspecified } diff --git a/vendor/github.com/pion/ice/v4/gather.go b/vendor/github.com/pion/ice/v4/gather.go index fad9068483..c896c0612d 100644 --- a/vendor/github.com/pion/ice/v4/gather.go +++ b/vendor/github.com/pion/ice/v4/gather.go @@ -23,6 +23,16 @@ import ( "github.com/pion/turn/v4" ) +type turnClient interface { + Listen() error + Allocate() (net.PacketConn, error) + Close() +} + +func defaultTurnClient(cfg *turn.ClientConfig) (turnClient, error) { + return turn.NewClient(cfg) +} + // Close a net.Conn and log if we have a failure. func closeConnAndLog(c io.Closer, log logging.LeveledLogger, msg string, args ...any) { if c == nil || (reflect.ValueOf(c).Kind() == reflect.Ptr && reflect.ValueOf(c).IsNil()) { @@ -93,8 +103,8 @@ func (a *Agent) gatherCandidates(ctx context.Context, done chan struct{}) { //no if err != nil { a.log.Warnf("Failed to get initial interfaces for monitoring: %v", err) } else { - for _, addr := range addrs { - a.lastKnownInterfaces[addr.String()] = addr + for _, info := range addrs { + a.lastKnownInterfaces[info.addr.String()] = info.addr } a.log.Infof("Initialized network monitoring with %d IP addresses", len(addrs)) } @@ -102,6 +112,86 @@ func (a *Agent) gatherCandidates(ctx context.Context, done chan struct{}) { //no } } +func (a *Agent) shouldRewriteCandidateType(candidateType CandidateType) bool { + return a.addressRewriteMapper != nil && a.addressRewriteMapper.hasCandidateType(candidateType) +} + +func (a *Agent) shouldRewriteHostCandidates() bool { + return a.mDNSMode != MulticastDNSModeQueryAndGather && a.shouldRewriteCandidateType(CandidateTypeHost) +} + +func (a *Agent) applyHostAddressRewrite(addr netip.Addr, mappedAddrs []netip.Addr, iface string) ([]netip.Addr, bool) { + mappedIPs, matched, mode, innerErr := a.addressRewriteMapper.findExternalIPs( + CandidateTypeHost, + addr.String(), + iface, + ) + if innerErr != nil { + a.log.Warnf("Address rewrite mapping is enabled but no external IP is found for %s", addr.String()) + + return mappedAddrs, true + } + if !matched { + return mappedAddrs, true + } + + if mode == AddressRewriteReplace { + mappedAddrs = mappedAddrs[:0] + } + mappedAddrs = appendHostMappedAddrs(mappedAddrs, mappedIPs, addr, a.log) + if len(mappedAddrs) == 0 && mode == AddressRewriteReplace { + a.log.Warnf("Address rewrite mapping is enabled but produced no usable external IP for %s", addr.String()) + + return mappedAddrs, false + } + + return mappedAddrs, true +} + +func appendHostMappedAddrs( + mappedAddrs []netip.Addr, + mappedIPs []net.IP, + addr netip.Addr, + log logging.LeveledLogger, +) []netip.Addr { + for _, mappedIP := range mappedIPs { + conv, ok := netip.AddrFromSlice(mappedIP) + if !ok { + log.Warnf("failed to convert mapped external IP to netip.Addr'%s'", addr.String()) + + continue + } + // we'd rather have an IPv4-mapped IPv6 become IPv4 so that it is usable + mappedAddrs = append(mappedAddrs, conv.Unmap()) + } + + return mappedAddrs +} + +func (a *Agent) applyHostRewriteForUDPMux(candidateIPs []net.IP, udpAddr *net.UDPAddr) ([]net.IP, bool) { + mappedIPs, matched, mode, err := a.addressRewriteMapper.findExternalIPs(CandidateTypeHost, udpAddr.IP.String(), "") + if err != nil { + a.log.Warnf("Address rewrite mapping is enabled but failed for %s: %v", udpAddr.IP.String(), err) + + return candidateIPs, false + } + if !matched { + return candidateIPs, true + } + if len(mappedIPs) == 0 { + if mode == AddressRewriteReplace { + return candidateIPs, false + } + + return candidateIPs, true + } + if mode == AddressRewriteReplace { + candidateIPs = candidateIPs[:0] + } + + return append(candidateIPs, mappedIPs...), true +} + // gatherCandidatesInternal performs the actual candidate gathering for all configured types. func (a *Agent) gatherCandidatesInternal(ctx context.Context) { var wg sync.WaitGroup @@ -114,22 +204,7 @@ func (a *Agent) gatherCandidatesInternal(ctx context.Context) { wg.Done() }() case CandidateTypeServerReflexive: - wg.Add(1) - go func() { - if a.udpMuxSrflx != nil { - a.gatherCandidatesSrflxUDPMux(ctx, a.urls, a.networkTypes) - } else { - a.gatherCandidatesSrflx(ctx, a.urls, a.networkTypes) - } - wg.Done() - }() - if a.extIPMapper != nil && a.extIPMapper.candidateType == CandidateTypeServerReflexive { - wg.Add(1) - go func() { - a.gatherCandidatesSrflxMapped(ctx, a.networkTypes) - wg.Done() - }() - } + a.gatherServerReflexiveCandidates(ctx, &wg) case CandidateTypeRelay: wg.Add(1) go func() { @@ -144,7 +219,29 @@ func (a *Agent) gatherCandidatesInternal(ctx context.Context) { wg.Wait() } -//nolint:gocognit,gocyclo,cyclop +func (a *Agent) gatherServerReflexiveCandidates(ctx context.Context, wg *sync.WaitGroup) { + replaceSrflx := a.addressRewriteMapper != nil && a.addressRewriteMapper.shouldReplace(CandidateTypeServerReflexive) + if !replaceSrflx { + wg.Add(1) + go func() { + if a.udpMuxSrflx != nil { + a.gatherCandidatesSrflxUDPMux(ctx, a.urls, a.networkTypes) + } else { + a.gatherCandidatesSrflx(ctx, a.urls, a.networkTypes) + } + wg.Done() + }() + } + if a.addressRewriteMapper != nil && a.addressRewriteMapper.hasCandidateType(CandidateTypeServerReflexive) { + wg.Add(1) + go func() { + a.gatherCandidatesSrflxMapped(ctx, a.networkTypes) + wg.Done() + }() + } +} + +//nolint:gocognit,gocyclo,cyclop,maintidx func (a *Agent) gatherCandidatesLocal(ctx context.Context, networkTypes []NetworkType) { networks := map[string]struct{}{} for _, networkType := range networkTypes { @@ -170,157 +267,160 @@ func (a *Agent) gatherCandidatesLocal(ctx context.Context, networkTypes []Networ return } - for _, addr := range localAddrs { - mappedIP := addr - if a.mDNSMode != MulticastDNSModeQueryAndGather && - a.extIPMapper != nil && a.extIPMapper.candidateType == CandidateTypeHost { - if _mappedIP, innerErr := a.extIPMapper.findExternalIP(addr.String()); innerErr == nil { - conv, ok := netip.AddrFromSlice(_mappedIP) - if !ok { - a.log.Warnf("failed to convert mapped external IP to netip.Addr'%s'", addr.String()) - - continue - } - // we'd rather have an IPv4-mapped IPv6 become IPv4 so that it is usable - mappedIP = conv.Unmap() - } else { - a.log.Warnf("1:1 NAT mapping is enabled but no external IP is found for %s", addr.String()) + for _, info := range localAddrs { + addr := info.addr + ifaceName := info.iface + mappedAddrs := []netip.Addr{addr} + if a.shouldRewriteHostCandidates() { + var ok bool + mappedAddrs, ok = a.applyHostAddressRewrite(addr, mappedAddrs, ifaceName) + if !ok { + continue } } - address := mappedIP.String() - var isLocationTracked bool - if a.mDNSMode == MulticastDNSModeQueryAndGather { - address = a.mDNSName - } else { - // Here, we are not doing multicast gathering, so we will need to skip this address so - // that we don't accidentally reveal location tracking information. Otherwise, the - // case above hides the IP behind an mDNS address. - isLocationTracked = shouldFilterLocationTrackedIP(mappedIP) - } - - for network := range networks { - type connAndPort struct { - conn net.PacketConn - port int + for mappedIdx, mappedIP := range mappedAddrs { + address := mappedIP.String() + var isLocationTracked bool + if a.mDNSMode == MulticastDNSModeQueryAndGather { + address = a.mDNSName + } else { + // Here, we are not doing multicast gathering, so we will need to skip this address so + // that we don't accidentally reveal location tracking information. Otherwise, the + // case above hides the IP behind an mDNS address. + isLocationTracked = shouldFilterLocationTrackedIP(mappedIP) } - var ( - conns []connAndPort - tcpType TCPType - ) - switch network { - case tcp: - if a.tcpMux == nil { + for network := range networks { + // TCPMux maintains a single listener per interface. Avoid duplicating passive TCP candidates + // for additional mapped IPs until connection sharing is supported. + if network == tcp && mappedIdx > 0 { continue } - // Handle ICE TCP passive mode - var muxConns []net.PacketConn - if multi, ok := a.tcpMux.(AllConnsGetter); ok { - a.log.Debugf("GetAllConns by ufrag: %s", a.localUfrag) - // Note: this is missing zone for IPv6 by just grabbing the IP slice - muxConns, err = multi.GetAllConns(a.localUfrag, mappedIP.Is6(), addr.AsSlice()) - if err != nil { - a.log.Warnf("Failed to get all TCP connections by ufrag: %s %s %s", network, addr, a.localUfrag) + type connAndPort struct { + conn net.PacketConn + port int + } + var ( + conns []connAndPort + tcpType TCPType + ) + switch network { + case tcp: + if a.tcpMux == nil { continue } - } else { - a.log.Debugf("GetConn by ufrag: %s", a.localUfrag) - // Note: this is missing zone for IPv6 by just grabbing the IP slice - conn, err := a.tcpMux.GetConnByUfrag(a.localUfrag, mappedIP.Is6(), addr.AsSlice()) - if err != nil { - a.log.Warnf("Failed to get TCP connections by ufrag: %s %s %s", network, addr, a.localUfrag) - continue + // Only advertise TCP candidates for addresses that the mux listener is actually + // bound to. When the listener is bound to a specific IP, exposing other interface + // addresses would generate unreachable passive candidates and can stall active + // TCP connect attempts. + if addrProvider, ok := a.tcpMux.(interface{ LocalAddr() net.Addr }); ok { + if muxAddr, ok := addrProvider.LocalAddr().(*net.TCPAddr); ok { + if ip := muxAddr.IP; ip != nil && !ip.IsUnspecified() && !ip.Equal(addr.AsSlice()) { + continue + } + } } - muxConns = []net.PacketConn{conn} - } - // Extract the port for each PacketConn we got. - for _, conn := range muxConns { - if tcpConn, ok := conn.LocalAddr().(*net.TCPAddr); ok { - conns = append(conns, connAndPort{conn, tcpConn.Port}) + // Handle ICE TCP passive mode + var muxConns []net.PacketConn + if multi, ok := a.tcpMux.(AllConnsGetter); ok { + a.log.Debugf("GetAllConns by ufrag: %s", a.localUfrag) + // Note: this is missing zone for IPv6 by just grabbing the IP slice + muxConns, err = multi.GetAllConns(a.localUfrag, mappedIP.Is6(), addr.AsSlice()) + if err != nil { + a.log.Warnf("Failed to get all TCP connections by ufrag: %s %s %s", network, addr, a.localUfrag) + + continue + } } else { - a.log.Warnf("Failed to get port of connection from TCPMux: %s %s %s", network, addr, a.localUfrag) + a.log.Debugf("GetConn by ufrag: %s", a.localUfrag) + // Note: this is missing zone for IPv6 by just grabbing the IP slice + conn, err := a.tcpMux.GetConnByUfrag(a.localUfrag, mappedIP.Is6(), addr.AsSlice()) + if err != nil { + a.log.Warnf("Failed to get TCP connections by ufrag: %s %s %s", network, addr, a.localUfrag) + + continue + } + muxConns = []net.PacketConn{conn} } - } - if len(conns) == 0 { - // Didn't succeed with any, try the next network. - continue - } - tcpType = TCPTypePassive - // Is there a way to verify that the listen address is even - // accessible from the current interface. - case udp: - conn, err := listenUDPInPortRange(a.net, a.log, int(a.portMax), int(a.portMin), network, &net.UDPAddr{ - IP: addr.AsSlice(), - Port: 0, - Zone: addr.Zone(), - }) - if err != nil { - a.log.Warnf("Failed to listen %s %s", network, addr) - continue - } + // Extract the port for each PacketConn we got. + for _, conn := range muxConns { + if tcpConn, ok := conn.LocalAddr().(*net.TCPAddr); ok { + conns = append(conns, connAndPort{conn, tcpConn.Port}) + } else { + a.log.Warnf("Failed to get port of connection from TCPMux: %s %s %s", network, addr, a.localUfrag) + } + } + if len(conns) == 0 { + // Didn't succeed with any, try the next network. + continue + } + tcpType = TCPTypePassive + // Is there a way to verify that the listen address is even + // accessible from the current interface. + case udp: + conn, err := listenUDPInPortRange(a.net, a.log, int(a.portMax), int(a.portMin), network, &net.UDPAddr{ + IP: addr.AsSlice(), + Port: 0, + Zone: addr.Zone(), + }) + if err != nil { + a.log.Warnf("Failed to listen %s %s", network, addr) - if udpConn, ok := conn.LocalAddr().(*net.UDPAddr); ok { - conns = append(conns, connAndPort{conn, udpConn.Port}) - } else { - a.log.Warnf("Failed to get port of UDPAddr from ListenUDPInPortRange: %s %s %s", network, addr, a.localUfrag) + continue + } - continue - } - } + if udpConn, ok := conn.LocalAddr().(*net.UDPAddr); ok { + conns = append(conns, connAndPort{conn, udpConn.Port}) + } else { + a.log.Warnf("Failed to get port of UDPAddr from ListenUDPInPortRange: %s %s %s", network, addr, a.localUfrag) - for _, connAndPort := range conns { - hostConfig := CandidateHostConfig{ - Network: network, - Address: address, - Port: connAndPort.port, - Component: ComponentRTP, - TCPType: tcpType, - // we will still process this candidate so that we start up the right - // listeners. - IsLocationTracked: isLocationTracked, + continue + } } - candidateHost, err := NewCandidateHost(&hostConfig) - if err != nil { - closeConnAndLog( - connAndPort.conn, - a.log, - "failed to create host candidate: %s %s %d: %v", - network, mappedIP, - connAndPort.port, - err, - ) + for _, connAndPort := range conns { + hostConfig := CandidateHostConfig{ + Network: network, + Address: address, + Port: connAndPort.port, + Component: ComponentRTP, + TCPType: tcpType, + // we will still process this candidate so that we start up the right + // listeners. + IsLocationTracked: isLocationTracked, + } - continue - } + candidateHost, err := NewCandidateHost(&hostConfig) - if a.mDNSMode == MulticastDNSModeQueryAndGather { - if err = candidateHost.setIPAddr(addr); err != nil { + if err == nil && a.mDNSMode == MulticastDNSModeQueryAndGather { + err = candidateHost.setIPAddr(addr) + } + + if err != nil { closeConnAndLog( connAndPort.conn, a.log, "failed to create host candidate: %s %s %d: %v", - network, - mappedIP, + network, mappedIP, connAndPort.port, err, ) continue } - } - if err := a.addCandidate(ctx, candidateHost, connAndPort.conn); err != nil { - if closeErr := candidateHost.close(); closeErr != nil { - a.log.Warnf("Failed to close candidate: %v", closeErr) + if err := a.addCandidate(ctx, candidateHost, connAndPort.conn); err != nil { + if closeErr := candidateHost.close(); closeErr != nil { + a.log.Warnf("Failed to close candidate: %v", closeErr) + } + a.log.Warnf("Failed to append to localCandidates and run onCandidateHdlr: %v", err) } - a.log.Warnf("Failed to append to localCandidates and run onCandidateHdlr: %v", err) } } } @@ -362,87 +462,86 @@ func (a *Agent) gatherCandidatesLocalUDPMux(ctx context.Context) error { //nolin if !ok { return errInvalidAddress } - candidateIP := udpAddr.IP + candidateIPs := []net.IP{udpAddr.IP} - if _, ok := a.udpMux.(*UDPMuxDefault); ok && !a.includeLoopback && candidateIP.IsLoopback() { + if _, ok := a.udpMux.(*UDPMuxDefault); ok && !a.includeLoopback && udpAddr.IP.IsLoopback() { // Unlike MultiUDPMux Default, UDPMuxDefault doesn't have // a separate param to include loopback, so we respect agent config continue } - if a.mDNSMode != MulticastDNSModeQueryAndGather && - a.extIPMapper != nil && - a.extIPMapper.candidateType == CandidateTypeHost { - mappedIP, err := a.extIPMapper.findExternalIP(candidateIP.String()) - if err != nil { - a.log.Warnf("1:1 NAT mapping is enabled but no external IP is found for %s", candidateIP.String()) - + if a.shouldRewriteHostCandidates() { + var ok bool + candidateIPs, ok = a.applyHostRewriteForUDPMux(candidateIPs, udpAddr) + if !ok { continue } - - candidateIP = mappedIP } - var address string - var isLocationTracked bool - if a.mDNSMode == MulticastDNSModeQueryAndGather { - address = a.mDNSName - } else { - address = candidateIP.String() - // Here, we are not doing multicast gathering, so we will need to skip this address so - // that we don't accidentally reveal location tracking information. Otherwise, the - // case above hides the IP behind an mDNS address. - isLocationTracked = shouldFilterLocationTracked(candidateIP) - } - - hostConfig := CandidateHostConfig{ - Network: udp, - Address: address, - Port: udpAddr.Port, - Component: ComponentRTP, - IsLocationTracked: isLocationTracked, - } + for _, candidateIP := range candidateIPs { + var address string + var isLocationTracked bool + if a.mDNSMode == MulticastDNSModeQueryAndGather { + address = a.mDNSName + } else { + address = candidateIP.String() + // Here, we are not doing multicast gathering, so we will need to skip this address so + // that we don't accidentally reveal location tracking information. Otherwise, the + // case above hides the IP behind an mDNS address. + isLocationTracked = shouldFilterLocationTracked(candidateIP) + } - // Detect a duplicate candidate before calling addCandidate(). - // otherwise, addCandidate() detects the duplicate candidate - // and close its connection, invalidating all candidates - // that share the same connection. - if _, ok := existingConfigs[hostConfig]; ok { - continue - } + hostConfig := CandidateHostConfig{ + Network: udp, + Address: address, + Port: udpAddr.Port, + Component: ComponentRTP, + IsLocationTracked: isLocationTracked, + } - conn, err := a.udpMux.GetConn(a.localUfrag, udpAddr) - if err != nil { - return err - } + // Detect a duplicate candidate before calling addCandidate(). + // otherwise, addCandidate() detects the duplicate candidate + // and close its connection, invalidating all candidates + // that share the same connection. + if _, ok := existingConfigs[hostConfig]; ok { + continue + } - c, err := NewCandidateHost(&hostConfig) - if err != nil { - closeConnAndLog(conn, a.log, "failed to create host mux candidate: %s %d: %v", candidateIP, udpAddr.Port, err) + conn, err := a.udpMux.GetConn(a.localUfrag, udpAddr) + if err != nil { + return err + } - continue - } + c, err := NewCandidateHost(&hostConfig) + if err != nil { + closeConnAndLog(conn, a.log, "failed to create host mux candidate: %s %d: %v", candidateIP, udpAddr.Port, err) - if err := a.addCandidate(ctx, c, conn); err != nil { - if closeErr := c.close(); closeErr != nil { - a.log.Warnf("Failed to close candidate: %v", closeErr) + continue } - closeConnAndLog(conn, a.log, "failed to add candidate: %s %d: %v", candidateIP, udpAddr.Port, err) + if err := a.addCandidate(ctx, c, conn); err != nil { + if closeErr := c.close(); closeErr != nil { + a.log.Warnf("Failed to close candidate: %v", closeErr) + } + + closeConnAndLog(conn, a.log, "failed to add candidate: %s %d: %v", candidateIP, udpAddr.Port, err) - continue - } + continue + } - existingConfigs[hostConfig] = struct{}{} + existingConfigs[hostConfig] = struct{}{} + } } return nil } -func (a *Agent) gatherCandidatesSrflxMapped(ctx context.Context, networkTypes []NetworkType) { +func (a *Agent) gatherCandidatesSrflxMapped(ctx context.Context, networkTypes []NetworkType) { //nolint:gocognit,cyclop var wg sync.WaitGroup defer wg.Wait() + _, ifaces, _ := localInterfaces(a.net, a.interfaceFilter, a.ipFilter, networkTypes, a.includeLoopback) + for _, networkType := range networkTypes { if networkType.IsTCP() { continue @@ -469,48 +568,84 @@ func (a *Agent) gatherCandidatesSrflxMapped(ctx context.Context, networkTypes [] lAddr, ok := conn.LocalAddr().(*net.UDPAddr) if !ok { - closeConnAndLog(conn, a.log, "1:1 NAT mapping is enabled but LocalAddr is not a UDPAddr") + closeConnAndLog(conn, a.log, "Address rewrite mapping is enabled but LocalAddr is not a UDPAddr") return } - mappedIP, err := a.extIPMapper.findExternalIP(lAddr.IP.String()) - if err != nil { - closeConnAndLog(conn, a.log, "1:1 NAT mapping is enabled but no external IP is found for %s", lAddr.IP.String()) + addresses, ok := a.resolveSrflxAddresses(lAddr.IP, findIfaceForIP(ifaces, lAddr.IP)) + if !ok { + closeConnAndLog( + conn, a.log, "Address rewrite mapping did not provide usable external IPs for %s", lAddr.IP.String(), + ) return } - if shouldFilterLocationTracked(mappedIP) { - closeConnAndLog(conn, a.log, "external IP is somehow filtered for location tracking reasons %s", mappedIP) + for idx, mappedIP := range addresses { + currentConn := conn + currentAddr := lAddr + if idx > 0 { + newConn, listenErr := listenUDPInPortRange( + a.net, + a.log, + int(a.portMax), + int(a.portMin), + network, + &net.UDPAddr{IP: lAddr.IP, Port: 0}, + ) + if listenErr != nil { + closeConnAndLog(newConn, a.log, "Failed to listen %s for additional srflx mapping: %v", network, listenErr) - return - } + return + } + currentConn = newConn + var ok bool + currentAddr, ok = currentConn.LocalAddr().(*net.UDPAddr) + if !ok { + closeConnAndLog(currentConn, a.log, "Address rewrite mapping is enabled but LocalAddr is not a UDPAddr") - srflxConfig := CandidateServerReflexiveConfig{ - Network: network, - Address: mappedIP.String(), - Port: lAddr.Port, - Component: ComponentRTP, - RelAddr: lAddr.IP.String(), - RelPort: lAddr.Port, - } - c, err := NewCandidateServerReflexive(&srflxConfig) - if err != nil { - closeConnAndLog(conn, a.log, "failed to create server reflexive candidate: %s %s %d: %v", - network, - mappedIP.String(), - lAddr.Port, - err) + return + } + } - return - } + if shouldFilterLocationTracked(mappedIP) { + closeConnAndLog(currentConn, a.log, "external IP is somehow filtered for location tracking reasons %s", mappedIP) - if err := a.addCandidate(ctx, c, conn); err != nil { - if closeErr := c.close(); closeErr != nil { - a.log.Warnf("Failed to close candidate: %v", closeErr) + continue + } + + srflxConfig := CandidateServerReflexiveConfig{ + Network: network, + Address: mappedIP.String(), + Port: currentAddr.Port, + Component: ComponentRTP, + RelAddr: currentAddr.IP.String(), + RelPort: currentAddr.Port, + } + c, err := NewCandidateServerReflexive(&srflxConfig) + if err != nil { + closeConnAndLog(currentConn, a.log, "failed to create server reflexive candidate: %s %s %d: %v", + network, + mappedIP.String(), + currentAddr.Port, + err) + + continue + } + + if err := a.addCandidate(ctx, c, currentConn); err != nil { + if closeErr := c.close(); closeErr != nil { + a.log.Warnf("Failed to close candidate: %v", closeErr) + } + a.log.Warnf("Failed to append to localCandidates and run onCandidateHdlr: %v", err) + closeConnAndLog( + currentConn, + a.log, + "closing srflx conn after addCandidate failure: %v", + err, + ) } - a.log.Warnf("Failed to append to localCandidates and run onCandidateHdlr: %v", err) } }() } @@ -694,6 +829,8 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*stun.URI) { defer wg.Wait() network := NetworkTypeUDP4.String() + _, ifaces, _ := localInterfaces(a.net, a.interfaceFilter, a.ipFilter, a.networkTypes, a.includeLoopback) + for i := range urls { switch { case urls[i].Scheme != stun.SchemeTypeTURN && urls[i].Scheme != stun.SchemeTypeTURNS: @@ -843,7 +980,12 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*stun.URI) { return } - client, err := turn.NewClient(&turn.ClientConfig{ + factory := a.turnClientFactory + if factory == nil { + factory = defaultTurnClient + } + + client, err := factory(&turn.ClientConfig{ TURNServerAddr: turnServerAddr, Conn: locConn, Username: url.Username, @@ -880,44 +1022,184 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*stun.URI) { return } - relayConfig := CandidateRelayConfig{ - Network: network, - Component: ComponentRTP, - Address: rAddr.IP.String(), - Port: rAddr.Port, - RelAddr: relAddr, - RelPort: relPort, - RelayProtocol: relayProtocol, - OnClose: func() error { + a.addRelayCandidates(ctx, relayEndpoint{ + network: network, + address: rAddr.IP, + port: rAddr.Port, + relAddr: relAddr, + relPort: relPort, + iface: findIfaceForIP(ifaces, net.ParseIP(relAddr)), + protocol: relayProtocol, + conn: relayConn, + onClose: func() error { client.Close() return locConn.Close() }, - } - relayConnClose := func() { - if relayConErr := relayConn.Close(); relayConErr != nil { - a.log.Warnf("Failed to close relay %v", relayConErr) - } - } - candidate, err := NewCandidateRelay(&relayConfig) - if err != nil { - relayConnClose() + closeConn: func() { + if relayConErr := relayConn.Close(); relayConErr != nil { + a.log.Warnf("Failed to close relay %v", relayConErr) + } + }, + }) + }(*urls[i]) + } +} - client.Close() - closeConnAndLog(locConn, a.log, "failed to create relay candidate: %s %s: %v", network, rAddr.String(), err) +type relayEndpoint struct { + network string + address net.IP + port int + relAddr string + relPort int + protocol string + iface string + conn net.PacketConn + onClose func() error + closeConn func() +} - return - } +func (a *Agent) resolveRelayAddresses(ep relayEndpoint) ([]net.IP, bool) { + addresses := []net.IP{ep.address} + if !a.shouldRewriteCandidateType(CandidateTypeRelay) { + return addresses, true + } + + mappedIPs, matched, mode, err := a.addressRewriteMapper.findExternalIPs( + CandidateTypeRelay, + ep.relAddr, + ep.iface, + ) + if err != nil { + return nil, false + } + if !matched { + return addresses, true + } + if len(mappedIPs) == 0 { + if mode == AddressRewriteReplace { + a.log.Warnf("Address rewrite mapping returned no external relay addresses for %s", ep.relAddr) - if err := a.addCandidate(ctx, candidate, relayConn); err != nil { - relayConnClose() + return nil, false + } - if closeErr := candidate.close(); closeErr != nil { - a.log.Warnf("Failed to close candidate: %v", closeErr) + return addresses, true + } + if mode == AddressRewriteReplace { + return mappedIPs, true + } + + return append(addresses, mappedIPs...), true +} + +func (a *Agent) resolveSrflxAddresses(localIP net.IP, iface string) ([]net.IP, bool) { + addresses := []net.IP{localIP} + if !a.shouldRewriteCandidateType(CandidateTypeServerReflexive) { + return addresses, true + } + + mappedIPs, matched, mode, err := a.addressRewriteMapper.findExternalIPs( + CandidateTypeServerReflexive, + localIP.String(), + iface, + ) + if err != nil { + a.log.Warnf("Address rewrite mapping is enabled but no external IP is found for %s: %v", localIP.String(), err) + + return nil, false + } + + if !matched { + return addresses, true + } + + if len(mappedIPs) == 0 { + if mode == AddressRewriteReplace { + return nil, false + } + + return addresses, true + } + + if mode == AddressRewriteReplace { + return mappedIPs, true + } + + return mappedIPs, true +} + +func findIfaceForIP(ifaces []ifaceAddr, ip net.IP) string { + if ip == nil { + return "" + } + for _, info := range ifaces { + if info.addr.String() == ip.String() { + return info.iface + } + } + + return "" +} + +func (a *Agent) createRelayCandidate(ctx context.Context, ep relayEndpoint, ip net.IP, onClose func() error) error { + relayConfig := CandidateRelayConfig{ + Network: ep.network, + Component: ComponentRTP, + Address: ip.String(), + Port: ep.port, + RelAddr: ep.relAddr, + RelPort: ep.relPort, + RelayProtocol: ep.protocol, + OnClose: onClose, + } + candidate, err := NewCandidateRelay(&relayConfig) + if err != nil { + a.log.Warnf("failed to create relay candidate: %s %d: %v", ip, ep.port, err) + + return err + } + + if err := a.addCandidate(ctx, candidate, ep.conn); err != nil { + if closeErr := candidate.close(); closeErr != nil { + a.log.Warnf("Failed to close candidate: %v", closeErr) + } + a.log.Warnf("Failed to append to localCandidates and run onCandidateHdlr: %v", err) + + return err + } + + return nil +} + +func (a *Agent) addRelayCandidates(ctx context.Context, ep relayEndpoint) { + if ep.conn == nil || ep.address == nil { + return + } + + addresses, ok := a.resolveRelayAddresses(ep) + if !ok { + return + } + + for idx, ip := range addresses { + onClose := ep.onClose + if idx > 0 { + onClose = nil + } + + if err := a.createRelayCandidate(ctx, ep, ip, onClose); err != nil { + if idx == 0 { + if ep.closeConn != nil { + ep.closeConn() } - a.log.Warnf("Failed to append to localCandidates and run onCandidateHdlr: %v", err) + + return } - }(*urls[i]) + + a.log.Warnf("failed to create additional relay candidate for %s: %v", ip, err) + + continue + } } } @@ -962,9 +1244,9 @@ func (a *Agent) detectNetworkChanges() bool { } currentInterfaces := make(map[string]netip.Addr) - for _, addr := range currentAddrs { - key := addr.String() - currentInterfaces[key] = addr + for _, info := range currentAddrs { + key := info.addr.String() + currentInterfaces[key] = info.addr } hasAdditions := false diff --git a/vendor/github.com/pion/ice/v4/net.go b/vendor/github.com/pion/ice/v4/net.go index 54ec4ca266..38f7ae70b5 100644 --- a/vendor/github.com/pion/ice/v4/net.go +++ b/vendor/github.com/pion/ice/v4/net.go @@ -11,6 +11,11 @@ import ( "github.com/pion/transport/v3" ) +type ifaceAddr struct { + addr netip.Addr + iface string +} + // The conditions of invalidation written below are defined in // https://tools.ietf.org/html/rfc8445#section-5.1.1.1 // It is partial because the link-local check is done later in various gather local @@ -45,8 +50,8 @@ func localInterfaces( ipFilter func(net.IP) (keep bool), networkTypes []NetworkType, includeLoopback bool, -) ([]*transport.Interface, []netip.Addr, error) { - ipAddrs := []netip.Addr{} +) ([]*transport.Interface, []ifaceAddr, error) { + ipAddrs := []ifaceAddr{} ifaces, err := n.Interfaces() if err != nil { return nil, ipAddrs, err @@ -108,7 +113,7 @@ func localInterfaces( } atLeastOneAddr = true - ipAddrs = append(ipAddrs, ipAddr) + ipAddrs = append(ipAddrs, ifaceAddr{addr: ipAddr, iface: iface.Name}) } if atLeastOneAddr { diff --git a/vendor/github.com/pion/ice/v4/udp_mux.go b/vendor/github.com/pion/ice/v4/udp_mux.go index 257ef5fa24..1c782f8864 100644 --- a/vendor/github.com/pion/ice/v4/udp_mux.go +++ b/vendor/github.com/pion/ice/v4/udp_mux.go @@ -98,9 +98,9 @@ func NewUDPMuxDefault(params UDPMuxParams) *UDPMuxDefault { //nolint:cyclop localAddrsForUnspecified = make([]net.Addr, len(addrs)) for i, addr := range addrs { localAddrsForUnspecified[i] = &net.UDPAddr{ - IP: addr.AsSlice(), + IP: addr.addr.AsSlice(), Port: udpAddr.Port, - Zone: addr.Zone(), + Zone: addr.addr.Zone(), } } } else { diff --git a/vendor/github.com/pion/ice/v4/udp_mux_multi.go b/vendor/github.com/pion/ice/v4/udp_mux_multi.go index 46c88bb931..efafd3d6bb 100644 --- a/vendor/github.com/pion/ice/v4/udp_mux_multi.go +++ b/vendor/github.com/pion/ice/v4/udp_mux_multi.go @@ -102,9 +102,9 @@ func NewMultiUDPMuxFromPort(port int, opts ...UDPMuxFromPortOption) (*MultiUDPMu conns := make([]net.PacketConn, 0, len(addrs)) for _, addr := range addrs { conn, listenErr := params.net.ListenUDP("udp", &net.UDPAddr{ - IP: addr.AsSlice(), + IP: addr.addr.AsSlice(), Port: port, - Zone: addr.Zone(), + Zone: addr.addr.Zone(), }) if listenErr != nil { err = listenErr diff --git a/vendor/github.com/pion/webrtc/v4/datachannel.go b/vendor/github.com/pion/webrtc/v4/datachannel.go index dbaa88c831..e0aa6940aa 100644 --- a/vendor/github.com/pion/webrtc/v4/datachannel.go +++ b/vendor/github.com/pion/webrtc/v4/datachannel.go @@ -707,13 +707,23 @@ func (d *DataChannel) OnBufferedAmountLow(f func()) { d.mu.Lock() defer d.mu.Unlock() - d.onBufferedAmountLow = func() { - go f() - } + onBufferedAmountLow := d.makeBufferedAmountLowHandler(f) + d.onBufferedAmountLow = onBufferedAmountLow + if d.dataChannel != nil { - d.dataChannel.OnBufferedAmountLow(func() { - go f() - }) + d.dataChannel.OnBufferedAmountLow(onBufferedAmountLow) + } +} + +func (d *DataChannel) makeBufferedAmountLowHandler(f func()) func() { + return func() { + go func() { + if d.ReadyState() != DataChannelStateOpen { + return + } + + f() + }() } } diff --git a/vendor/github.com/pion/webrtc/v4/datachannel_js.go b/vendor/github.com/pion/webrtc/v4/datachannel_js.go index 26ff02cdfc..bd258c7160 100644 --- a/vendor/github.com/pion/webrtc/v4/datachannel_js.go +++ b/vendor/github.com/pion/webrtc/v4/datachannel_js.go @@ -301,6 +301,10 @@ func (d *DataChannel) OnBufferedAmountLow(f func()) { defer oldHandler.Release() } onBufferedAmountLow := js.FuncOf(func(this js.Value, args []js.Value) any { + if d.ReadyState() != DataChannelStateOpen { + return js.Undefined() + } + go f() return js.Undefined() }) diff --git a/vendor/github.com/pion/webrtc/v4/dtlstransport.go b/vendor/github.com/pion/webrtc/v4/dtlstransport.go index 90ed241cff..402518217a 100644 --- a/vendor/github.com/pion/webrtc/v4/dtlstransport.go +++ b/vendor/github.com/pion/webrtc/v4/dtlstransport.go @@ -371,6 +371,26 @@ func (t *DTLSTransport) Start(remoteParameters DTLSParameters) error { //nolint: dtlsConfig.ClientHelloMessageHook = t.api.settingEngine.dtls.clientHelloMessageHook dtlsConfig.ServerHelloMessageHook = t.api.settingEngine.dtls.serverHelloMessageHook dtlsConfig.CertificateRequestMessageHook = t.api.settingEngine.dtls.certificateRequestMessageHook + dtlsConfig.VerifyPeerCertificate = func(rawCerts [][]byte, _verifiedChains [][]*x509.Certificate) error { + if len(rawCerts) == 0 { + return errNoRemoteCertificate + } + + t.lock.Lock() + defer t.lock.Unlock() + t.remoteCertificate = rawCerts[0] + + if t.api.settingEngine.disableCertificateFingerprintVerification { + return nil + } + + parsedRemoteCert, parseErr := x509.ParseCertificate(t.remoteCertificate) + if parseErr != nil { + return parseErr + } + + return t.validateFingerPrint(parsedRemoteCert) + } // Connect as DTLS Client/Server, function is blocking and we // must not hold the DTLSTransport lock @@ -421,44 +441,6 @@ func (t *DTLSTransport) Start(remoteParameters DTLSParameters) error { //nolint: return ErrNoSRTPProtectionProfile } - // Check the fingerprint if a certificate was exchanged - connectionState, ok := dtlsConn.ConnectionState() - if !ok { - t.onStateChange(DTLSTransportStateFailed) - - return errNoRemoteCertificate - } - - if len(connectionState.PeerCertificates) == 0 { - t.onStateChange(DTLSTransportStateFailed) - - return errNoRemoteCertificate - } - t.remoteCertificate = connectionState.PeerCertificates[0] - - if !t.api.settingEngine.disableCertificateFingerprintVerification { //nolint:nestif - parsedRemoteCert, err := x509.ParseCertificate(t.remoteCertificate) - if err != nil { - if closeErr := dtlsConn.Close(); closeErr != nil { - t.log.Error(err.Error()) - } - - t.onStateChange(DTLSTransportStateFailed) - - return err - } - - if err = t.validateFingerPrint(parsedRemoteCert); err != nil { - if closeErr := dtlsConn.Close(); closeErr != nil { - t.log.Error(err.Error()) - } - - t.onStateChange(DTLSTransportStateFailed) - - return err - } - } - t.conn = dtlsConn t.onStateChange(DTLSTransportStateConnected) diff --git a/vendor/github.com/pion/webrtc/v4/internal/mux/endpoint.go b/vendor/github.com/pion/webrtc/v4/internal/mux/endpoint.go index d1a24c0b67..790ded811a 100644 --- a/vendor/github.com/pion/webrtc/v4/internal/mux/endpoint.go +++ b/vendor/github.com/pion/webrtc/v4/internal/mux/endpoint.go @@ -80,14 +80,16 @@ func (e *Endpoint) RemoteAddr() net.Addr { return e.mux.nextConn.RemoteAddr() } -// SetDeadline is a stub. -func (e *Endpoint) SetDeadline(time.Time) error { - return nil +// SetDeadline sets the read deadline for this Endpoint. +// Write deadlines are not supported because writes go directly to the shared +// underlying connection and are non-blocking for this endpoint. +func (e *Endpoint) SetDeadline(t time.Time) error { + return e.buffer.SetReadDeadline(t) } -// SetReadDeadline is a stub. -func (e *Endpoint) SetReadDeadline(time.Time) error { - return nil +// SetReadDeadline sets the read deadline for this Endpoint. +func (e *Endpoint) SetReadDeadline(t time.Time) error { + return e.buffer.SetReadDeadline(t) } // SetWriteDeadline is a stub. diff --git a/vendor/go.opentelemetry.io/otel/.codespellignore b/vendor/go.opentelemetry.io/otel/.codespellignore index 2b53a25e1e..a6d0cbcc9e 100644 --- a/vendor/go.opentelemetry.io/otel/.codespellignore +++ b/vendor/go.opentelemetry.io/otel/.codespellignore @@ -8,3 +8,4 @@ nam valu thirdparty addOpt +observ diff --git a/vendor/go.opentelemetry.io/otel/.golangci.yml b/vendor/go.opentelemetry.io/otel/.golangci.yml index b01762ffcc..1b1b2aff9a 100644 --- a/vendor/go.opentelemetry.io/otel/.golangci.yml +++ b/vendor/go.opentelemetry.io/otel/.golangci.yml @@ -197,6 +197,9 @@ linters: - float-compare - go-require - require-error + usetesting: + context-background: true + context-todo: true exclusions: generated: lax presets: diff --git a/vendor/go.opentelemetry.io/otel/.lycheeignore b/vendor/go.opentelemetry.io/otel/.lycheeignore index 5328505888..994b677df7 100644 --- a/vendor/go.opentelemetry.io/otel/.lycheeignore +++ b/vendor/go.opentelemetry.io/otel/.lycheeignore @@ -1,4 +1,5 @@ http://localhost +https://localhost http://jaeger-collector https://github.com/open-telemetry/opentelemetry-go/milestone/ https://github.com/open-telemetry/opentelemetry-go/projects @@ -6,4 +7,7 @@ https://github.com/open-telemetry/opentelemetry-go/projects https?:\/\/github\.com\/open-telemetry\/semantic-conventions\/archive\/refs\/tags\/[^.]+\.zip\[[^]]+] file:///home/runner/work/opentelemetry-go/opentelemetry-go/libraries file:///home/runner/work/opentelemetry-go/opentelemetry-go/manual -http://4.3.2.1:78/user/123 \ No newline at end of file +http://4.3.2.1:78/user/123 +file:///home/runner/work/opentelemetry-go/opentelemetry-go/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/dns:/:4317 +# URL works, but it has blocked link checkers. +https://dl.acm.org/doi/10.1145/198429.198435 diff --git a/vendor/go.opentelemetry.io/otel/CHANGELOG.md b/vendor/go.opentelemetry.io/otel/CHANGELOG.md index f3abcfdc2e..ecbe0582c4 100644 --- a/vendor/go.opentelemetry.io/otel/CHANGELOG.md +++ b/vendor/go.opentelemetry.io/otel/CHANGELOG.md @@ -11,6 +11,74 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm +## [1.39.0/0.61.0/0.15.0/0.0.14] 2025-12-05 + +### Added + +- Greatly reduce the cost of recording metrics in `go.opentelemetry.io/otel/sdk/metric` using hashing for map keys. (#7175) +- Add `WithInstrumentationAttributeSet` option to `go.opentelemetry.io/otel/log`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/trace` packages. + This provides a concurrent-safe and performant alternative to `WithInstrumentationAttributes` by accepting a pre-constructed `attribute.Set`. (#7287) +- Add experimental observability for the Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus`. + Check the `go.opentelemetry.io/otel/exporters/prometheus/internal/x` package documentation for more information. (#7345) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#7353) +- Add temporality selector functions `DeltaTemporalitySelector`, `CumulativeTemporalitySelector`, `LowMemoryTemporalitySelector` to `go.opentelemetry.io/otel/sdk/metric`. (#7434) +- Add experimental observability metrics for simple log processor in `go.opentelemetry.io/otel/sdk/log`. (#7548) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#7459) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#7486) +- Add experimental observability metrics for simple span processor in `go.opentelemetry.io/otel/sdk/trace`. (#7374) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#7512) +- Add experimental observability metrics for manual reader in `go.opentelemetry.io/otel/sdk/metric`. (#7524) +- Add experimental observability metrics for periodic reader in `go.opentelemetry.io/otel/sdk/metric`. (#7571) +- Support `OTEL_EXPORTER_OTLP_LOGS_INSECURE` and `OTEL_EXPORTER_OTLP_INSECURE` environmental variables in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#7608) +- Add `Enabled` method to the `Processor` interface in `go.opentelemetry.io/otel/sdk/log`. + All `Processor` implementations now include an `Enabled` method. (#7639) +- The `go.opentelemetry.io/otel/semconv/v1.38.0` package. + The package contains semantic conventions from the `v1.38.0` version of the OpenTelemetry Semantic Conventions. + See the [migration documentation](./semconv/v1.38.0/MIGRATION.md) for information on how to upgrade from `go.opentelemetry.io/otel/semconv/v1.37.0.`(#7648) + +### Changed + +- `Distinct` in `go.opentelemetry.io/otel/attribute` is no longer guaranteed to uniquely identify an attribute set. + Collisions between `Distinct` values for different Sets are possible with extremely high cardinality (billions of series per instrument), but are highly unlikely. (#7175) +- `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/trace` synchronously de-duplicates the passed attributes instead of delegating it to the returned `TracerOption`. (#7266) +- `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/meter` synchronously de-duplicates the passed attributes instead of delegating it to the returned `MeterOption`. (#7266) +- `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/log` synchronously de-duplicates the passed attributes instead of delegating it to the returned `LoggerOption`. (#7266) +- Rename the `OTEL_GO_X_SELF_OBSERVABILITY` environment variable to `OTEL_GO_X_OBSERVABILITY` in `go.opentelemetry.io/otel/sdk/trace`, `go.opentelemetry.io/otel/sdk/log`, and `go.opentelemetry.io/otel/exporters/stdout/stdouttrace`. (#7302) +- Improve performance of histogram `Record` in `go.opentelemetry.io/otel/sdk/metric` when min and max are disabled using `NoMinMax`. (#7306) +- Improve error handling for dropped data during translation by using `prometheus.NewInvalidMetric` in `go.opentelemetry.io/otel/exporters/prometheus`. + ⚠️ **Breaking Change:** Previously, these cases were only logged and scrapes succeeded. + Now, when translation would drop data (e.g., invalid label/value), the exporter emits a `NewInvalidMetric`, and Prometheus scrapes **fail with HTTP 500** by default. + To preserve the prior behavior (scrapes succeed while errors are logged), configure your Prometheus HTTP handler with: `promhttp.HandlerOpts{ ErrorHandling: promhttp.ContinueOnError }`. (#7363) +- Replace fnv hash with xxhash in `go.opentelemetry.io/otel/attribute` for better performance. (#7371) +- The default `TranslationStrategy` in `go.opentelemetry.io/exporters/prometheus` is changed from `otlptranslator.NoUTF8EscapingWithSuffixes` to `otlptranslator.UnderscoreEscapingWithSuffixes`. (#7421) +- Improve performance of concurrent measurements in `go.opentelemetry.io/otel/sdk/metric`. (#7427) +- Include W3C TraceFlags (bits 0–7) in the OTLP `Span.Flags` field in `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracehttp` and `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracegrpc`. (#7438) +- The `ErrorType` function in `go.opentelemetry.io/otel/semconv/v1.37.0` now handles custom error types. + If an error implements an `ErrorType() string` method, the return value of that method will be used as the error type. (#7442) + +### Fixed + +- Fix `WithInstrumentationAttributes` options in `go.opentelemetry.io/otel/trace`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/log` to properly merge attributes when passed multiple times instead of replacing them. + Attributes with duplicate keys will use the last value passed. (#7300) +- The equality of `attribute.Set` when using the `Equal` method is not affected by the user overriding the empty set pointed to by `attribute.EmptySet` in `go.opentelemetry.io/otel/attribute`. (#7357) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#7372) +- Fix `AddAttributes`, `SetAttributes`, `SetBody` on `Record` in `go.opentelemetry.io/otel/sdk/log` to not mutate input. (#7403) +- Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.37.0`. (#7655) +- Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.36.0`. (#7656) + +### Removed + +- Drop support for [Go 1.23]. (#7274) +- Remove the `FilterProcessor` interface in `go.opentelemetry.io/otel/sdk/log`. + The `Enabled` method has been added to the `Processor` interface instead. + All `Processor` implementations must now implement the `Enabled` method. + Custom processors that do not filter records can implement `Enabled` to return `true`. (#7639) + ## [1.38.0/0.60.0/0.14.0/0.0.13] 2025-08-29 This release is the last to support [Go 1.23]. @@ -3430,8 +3498,10 @@ It contains api and sdk for trace and meter. - CircleCI build CI manifest files. - CODEOWNERS file to track owners of this project. -[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.38.0...HEAD +[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...HEAD +[1.39.0/0.61.0/0.15.0/0.0.14]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.39.0 [1.38.0/0.60.0/0.14.0/0.0.13]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.38.0 +[0.59.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/exporters/prometheus/v0.59.1 [1.37.0/0.59.0/0.13.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.37.0 [0.12.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/log/v0.12.2 [0.12.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/log/v0.12.1 diff --git a/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md b/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md index 0b3ae855c1..ff5e1f76ec 100644 --- a/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md +++ b/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md @@ -54,8 +54,8 @@ go get -d go.opentelemetry.io/otel (This may print some warning about "build constraints exclude all Go files", just ignore it.) -This will put the project in `${GOPATH}/src/go.opentelemetry.io/otel`. You -can alternatively use `git` directly with: +This will put the project in `${GOPATH}/src/go.opentelemetry.io/otel`. +Alternatively, you can use `git` directly with: ```sh git clone https://github.com/open-telemetry/opentelemetry-go @@ -65,8 +65,7 @@ git clone https://github.com/open-telemetry/opentelemetry-go that name is a kind of a redirector to GitHub that `go get` can understand, but `git` does not.) -This would put the project in the `opentelemetry-go` directory in -current working directory. +This will add the project as `opentelemetry-go` within the current directory. Enter the newly created directory and add your fork as a new remote: @@ -109,7 +108,7 @@ A PR is considered **ready to merge** when: This is not enforced through automation, but needs to be validated by the maintainer merging. - * At least one of the qualified approvals need to be from an + * At least one of the qualified approvals needs to be from an [Approver]/[Maintainer] affiliated with a different company than the author of the PR. * PRs introducing changes that have already been discussed and consensus @@ -166,11 +165,11 @@ guidelines](https://opentelemetry.io/docs/specs/otel/library-guidelines). ### Focus on Capabilities, Not Structure Compliance OpenTelemetry is an evolving specification, one where the desires and -use cases are clear, but the method to satisfy those uses cases are +use cases are clear, but the methods to satisfy those use cases are not. As such, Contributions should provide functionality and behavior that -conforms to the specification, but the interface and structure is +conforms to the specification, but the interface and structure are flexible. It is preferable to have contributions follow the idioms of the @@ -217,7 +216,7 @@ about dependency compatibility. This project does not partition dependencies based on the environment (i.e. `development`, `staging`, `production`). -Only the dependencies explicitly included in the released modules have be +Only the dependencies explicitly included in the released modules have been tested and verified to work with the released code. No other guarantee is made about the compatibility of other dependencies. @@ -635,8 +634,8 @@ is not in their root name. The use of internal packages should be scoped to a single module. A sub-module should never import from a parent internal package. This creates a coupling -between the two modules where a user can upgrade the parent without the child -and if the internal package API has changed it will fail to upgrade[^3]. +between the two modules where a user can upgrade the parent without the child, +and if the internal package API has changed, it will fail to upgrade[^3]. There are two known exceptions to this rule: @@ -657,7 +656,7 @@ this. ### Ignoring context cancellation -OpenTelemetry API implementations need to ignore the cancellation of the context that are +OpenTelemetry API implementations need to ignore the cancellation of the context that is passed when recording a value (e.g. starting a span, recording a measurement, emitting a log). Recording methods should not return an error describing the cancellation state of the context when they complete, nor should they abort any work. @@ -675,6 +674,441 @@ force flushing telemetry, shutting down a signal provider) the context cancellat should be honored. This means all work done on behalf of the user provided context should be canceled. +### Observability + +OpenTelemetry Go SDK components should be instrumented to enable users observability for the health and performance of the telemetry pipeline itself. +This allows operators to understand how well their observability infrastructure is functioning and to identify potential issues before they impact their applications. + +This section outlines the best practices for building instrumentation in OpenTelemetry Go SDK components. + +#### Environment Variable Activation + +Observability features are currently experimental. +They should be disabled by default and activated through the `OTEL_GO_X_OBSERVABILITY` environment variable. +This follows the established experimental feature pattern used throughout the SDK. + +Components should check for this environment variable using a consistent pattern: + +```go +import "go.opentelemetry.io/otel/*/internal/x" + +if x.Observability.Enabled() { + // Initialize observability metrics +} +``` + +**References**: + +- [stdouttrace exporter](./exporters/stdout/stdouttrace/internal/x/x.go) +- [sdk](./sdk/internal/x/x.go) + +#### Encapsulation + +Instrumentation should be encapsulated within a dedicated `struct` (e.g. `instrumentation`). +It should not be mixed into the instrumented component. + +Prefer this: + +```go +type SDKComponent struct { + inst *instrumentation +} + +type instrumentation struct { + inflight otelconv.SDKComponentInflight + exported otelconv.SDKComponentExported +} +``` + +To this: + +```go +// ❌ Avoid this pattern. +type SDKComponent struct { + /* other SDKComponent fields... */ + + inflight otelconv.SDKComponentInflight + exported otelconv.SDKComponentExported +} +``` + +The instrumentation code should not bloat the code being instrumented. +Likely, this means its own file, or its own package if it is complex or reused. + +#### Initialization + +Instrumentation setup should be explicit, side-effect free, and local to the relevant component. +Avoid relying on global or implicit [side effects][side-effect] for initialization. + +Encapsulate setup in constructor functions, ensuring clear ownership and scope: + +```go +import ( + "errors" + + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +type SDKComponent struct { + inst *instrumentation +} + +func NewSDKComponent(config Config) (*SDKComponent, error) { + inst, err := newInstrumentation() + if err != nil { + return nil, err + } + return &SDKComponent{inst: inst}, nil +} + +type instrumentation struct { + inflight otelconv.SDKComponentInflight + exported otelconv.SDKComponentExported +} + +func newInstrumentation() (*instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + meter := otel.GetMeterProvider().Meter( + "", + metric.WithInstrumentationVersion(sdk.Version()), + metric.WithSchemaURL(semconv.SchemaURL), + ) + + inst := &instrumentation{} + + var err, e error + inst.inflight, e = otelconv.NewSDKComponentInflight(meter) + err = errors.Join(err, e) + + inst.exported, e = otelconv.NewSDKComponentExported(meter) + err = errors.Join(err, e) + + return inst, err +} +``` + +```go +// ❌ Avoid this pattern. +func (c *Component) initObservability() { + // Initialize observability metrics + if !x.Observability.Enabled() { + return + } + + // Initialize observability metrics + c.inst = &instrumentation{/* ... */} +} +``` + +[side-effect]: https://en.wikipedia.org/wiki/Side_effect_(computer_science) + +#### Performance + +When observability is disabled there should be little to no overhead. + +```go +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + if e.inst != nil { + attrs := expensiveOperation() + e.inst.recordSpanInflight(ctx, int64(len(spans)), attrs...) + } + // Export spans... +} +``` + +```go +// ❌ Avoid this pattern. +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + attrs := expensiveOperation() + e.inst.recordSpanInflight(ctx, int64(len(spans)), attrs...) + // Export spans... +} + +func (i *instrumentation) recordSpanInflight(ctx context.Context, count int64, attrs ...attribute.KeyValue) { + if i == nil || i.inflight == nil { + return + } + i.inflight.Add(ctx, count, metric.WithAttributes(attrs...)) +} +``` + +When observability is enabled, the instrumentation code paths should be optimized to reduce allocation and computation overhead. + +##### Attribute and Option Allocation Management + +Pool attribute slices and options with [`sync.Pool`] to minimize allocations in measurement calls with dynamic attributes. + +```go +var ( + attrPool = sync.Pool{ + New: func() any { + // Pre-allocate common capacity + knownCap := 8 // Adjust based on expected usage + s := make([]attribute.KeyValue, 0, knownCap) + // Return a pointer to avoid extra allocation on Put(). + return &s + }, + } + + addOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.AddOption, 0, n) + // Return a pointer to avoid extra allocation on Put(). + return &o + }, + } +) + +func (i *instrumentation) record(ctx context.Context, value int64, baseAttrs ...attribute.KeyValue) { + attrs := attrPool.Get().(*[]attribute.KeyValue) + defer func() { + *attrs = (*attrs)[:0] // Reset. + attrPool.Put(attrs) + }() + + *attrs = append(*attrs, baseAttrs...) + // Add any dynamic attributes. + *attrs = append(*attrs, semconv.OTelComponentName("exporter-1")) + + addOpt := addOptPool.Get().(*[]metric.AddOption) + defer func() { + *addOpt = (*addOpt)[:0] + addOptPool.Put(addOpt) + }() + + set := attribute.NewSet(*attrs...) + *addOpt = append(*addOpt, metric.WithAttributeSet(set)) + + i.counter.Add(ctx, value, *addOpt...) +} +``` + +Pools are most effective when there are many pooled objects of the same sufficiently large size, and the objects are repeatedly used. +This amortizes the cost of allocation and synchronization. +Ideally, the pools should be scoped to be used as widely as possible within the component to maximize this efficiency while still ensuring correctness. + +[`sync.Pool`]: https://pkg.go.dev/sync#Pool + +##### Cache common attribute sets for repeated measurements + +If a static set of attributes are used for measurements and they are known at compile time, pre-compute and cache these attributes. + +```go +type spanLiveSetKey struct { + sampled bool +} + +var spanLiveSetCache = map[spanLiveSetKey]attribute.Set{ + {true}: attribute.NewSet( + otelconv.SDKSpanLive{}.AttrSpanSamplingResult( + otelconv.SpanSamplingResultRecordAndSample, + ), + ), + {false}: attribute.NewSet( + otelconv.SDKSpanLive{}.AttrSpanSamplingResult( + otelconv.SpanSamplingResultRecordOnly, + ), + ), +} + +func spanLiveSet(sampled bool) attribute.Set { + key := spanLiveSetKey{sampled: sampled} + return spanLiveSetCache[key] +} +``` + +##### Benchmarking + +Always provide benchmarks when introducing or refactoring instrumentation. +Demonstrate the impact (allocs/op, B/op, ns/op) in enabled/disabled scenarios: + +```go +func BenchmarkExportSpans(b *testing.B) { + scenarios := []struct { + name string + obsEnabled bool + }{ + {"ObsDisabled", false}, + {"ObsEnabled", true}, + } + + for _, scenario := range scenarios { + b.Run(scenario.name, func(b *testing.B) { + b.Setenv( + "OTEL_GO_X_OBSERVABILITY", + strconv.FormatBool(scenario.obsEnabled), + ) + + exporter := NewExporter() + spans := generateTestSpans(100) + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + _ = exporter.ExportSpans(context.Background(), spans) + } + }) + } +} +``` + +#### Error Handling and Robustness + +Errors should be reported back to the caller if possible, and partial failures should be handled as gracefully as possible. + +```go +func newInstrumentation() (*instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + m := otel.GetMeterProvider().Meter(/* initialize meter */) + counter, err := otelconv.NewSDKComponentCounter(m) + // Use the partially initialized counter if available. + i := &instrumentation{counter: counter} + // Return any error to the caller. + return i, err +} +``` + +```go +// ❌ Avoid this pattern. +func newInstrumentation() *instrumentation { + if !x.Observability.Enabled() { + return nil, nil + } + + m := otel.GetMeterProvider().Meter(/* initialize meter */) + counter, err := otelconv.NewSDKComponentCounter(m) + if err != nil { + // ❌ Do not dump the error to the OTel Handler. Return it to the + // caller. + otel.Handle(err) + // ❌ Do not return nil if we can still use the partially initialized + // counter. + return nil + } + return &instrumentation{counter: counter} +} +``` + +If the instrumented component cannot report the error to the user, let it report the error to `otel.Handle`. + +#### Context Propagation + +Ensure observability measurements receive the correct context, especially for trace exemplars and distributed context: + +```go +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + // Use the provided context for observability measurements + e.inst.recordSpanExportStarted(ctx, len(spans)) + + err := e.doExport(ctx, spans) + + if err != nil { + e.inst.recordSpanExportFailed(ctx, len(spans), err) + } else { + e.inst.recordSpanExportSucceeded(ctx, len(spans)) + } + + return err +} +``` + +```go +// ❌ Avoid this pattern. +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + // ❌ Do not break the context propagation. + e.inst.recordSpanExportStarted(context.Background(), len(spans)) + + err := e.doExport(ctx, spans) + + /* ... */ + + return err +} +``` + +#### Semantic Conventions Compliance + +All observability metrics should follow the [OpenTelemetry Semantic Conventions for SDK metrics](https://github.com/open-telemetry/semantic-conventions/blob/1cf2476ae5e518225a766990a28a6d5602bd5a30/docs/otel/sdk-metrics.md). + +Use the metric semantic conventions convenience package [otelconv](./semconv/v1.37.0/otelconv/metric.go). + +##### Component Identification + +Component names and types should follow [semantic convention](https://github.com/open-telemetry/semantic-conventions/blob/1cf2476ae5e518225a766990a28a6d5602bd5a30/docs/registry/attributes/otel.md#otel-component-attributes). + +If a component is not a well-known type specified in the semantic conventions, use the package path scope type as a stable identifier. + +```go +componentType := "go.opentelemetry.io/otel/sdk/trace.Span" +``` + +```go +// ❌ Do not do this. +componentType := "trace-span" +``` + +The component name should be a stable unique identifier for the specific instance of the component. + +Use a global counter to ensure uniqueness if necessary. + +```go +// Unique 0-based ID counter for component instances. +var componentIDCounter atomic.Int64 + +// nextID returns the next unique ID for a component. +func nextID() int64 { + return componentIDCounter.Add(1) - 1 +} + +// componentName returns a unique name for the component instance. +func componentName() attribute.KeyValue { + id := nextID() + name := fmt.Sprintf("%s/%d", componentType, id) + return semconv.OTelComponentName(name) +} +``` + +The component ID will need to be resettable for deterministic testing. +If tests are in a different package than the component being tested (i.e. a `_test` package name), use a generated `counter` internal package to manage the counter. +See [stdouttrace exporter example](./exporters/stdout/stdouttrace/internal/gen.go) for reference. + +#### Testing + +Use deterministic testing with isolated state: + +```go +func TestObservability(t *testing.T) { + // Restore state after test to ensure this does not affect other tests. + prev := otel.GetMeterProvider() + t.Cleanup(func() { otel.SetMeterProvider(prev) }) + + // Isolate the meter provider for deterministic testing + reader := metric.NewManualReader() + meterProvider := metric.NewMeterProvider(metric.WithReader(reader)) + otel.SetMeterProvider(meterProvider) + + // Use t.Setenv to ensure environment variable is restored after test. + t.Setenv("OTEL_GO_X_OBSERVABILITY", "true") + + // Reset component ID counter to ensure deterministic component names. + componentIDCounter.Store(0) + + /* ... test code ... */ +} +``` + +Test order should not affect results. +Ensure that any global state (e.g. component ID counters) is reset between tests. + ## Approvers and Maintainers ### Maintainers @@ -696,7 +1130,6 @@ For more information about the approver role, see the [community repository](htt ### Triagers - [Alex Kats](https://github.com/akats7), Capital One -- [Cheng-Zhen Yang](https://github.com/scorpionknifes), Independent For more information about the triager role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#triager). @@ -704,6 +1137,7 @@ For more information about the triager role, see the [community repository](http - [Aaron Clawson](https://github.com/MadVikingGod) - [Anthony Mirabella](https://github.com/Aneurysm9) +- [Cheng-Zhen Yang](https://github.com/scorpionknifes) - [Chester Cheung](https://github.com/hanyuancheung) - [Evan Torrie](https://github.com/evantorrie) - [Gustavo Silva Paiva](https://github.com/paivagustavo) diff --git a/vendor/go.opentelemetry.io/otel/Makefile b/vendor/go.opentelemetry.io/otel/Makefile index bc0f1f92d1..44870248c3 100644 --- a/vendor/go.opentelemetry.io/otel/Makefile +++ b/vendor/go.opentelemetry.io/otel/Makefile @@ -146,11 +146,12 @@ build-tests/%: # Tests -TEST_TARGETS := test-default test-bench test-short test-verbose test-race test-concurrent-safe +TEST_TARGETS := test-default test-bench test-short test-verbose test-race test-concurrent-safe test-fuzz .PHONY: $(TEST_TARGETS) test test-default test-race: ARGS=-race test-bench: ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=. test-short: ARGS=-short +test-fuzz: ARGS=-fuzztime=10s -fuzz test-verbose: ARGS=-v -race test-concurrent-safe: ARGS=-run=ConcurrentSafe -count=100 -race test-concurrent-safe: TIMEOUT=120 diff --git a/vendor/go.opentelemetry.io/otel/README.md b/vendor/go.opentelemetry.io/otel/README.md index 6b7ab5f219..c633595431 100644 --- a/vendor/go.opentelemetry.io/otel/README.md +++ b/vendor/go.opentelemetry.io/otel/README.md @@ -55,25 +55,18 @@ Currently, this project supports the following environments. |----------|------------|--------------| | Ubuntu | 1.25 | amd64 | | Ubuntu | 1.24 | amd64 | -| Ubuntu | 1.23 | amd64 | | Ubuntu | 1.25 | 386 | | Ubuntu | 1.24 | 386 | -| Ubuntu | 1.23 | 386 | | Ubuntu | 1.25 | arm64 | | Ubuntu | 1.24 | arm64 | -| Ubuntu | 1.23 | arm64 | -| macOS 13 | 1.25 | amd64 | -| macOS 13 | 1.24 | amd64 | -| macOS 13 | 1.23 | amd64 | +| macOS | 1.25 | amd64 | +| macOS | 1.24 | amd64 | | macOS | 1.25 | arm64 | | macOS | 1.24 | arm64 | -| macOS | 1.23 | arm64 | | Windows | 1.25 | amd64 | | Windows | 1.24 | amd64 | -| Windows | 1.23 | amd64 | | Windows | 1.25 | 386 | | Windows | 1.24 | 386 | -| Windows | 1.23 | 386 | While this project should work for other systems, no compatibility guarantees are made for those systems currently. diff --git a/vendor/go.opentelemetry.io/otel/RELEASING.md b/vendor/go.opentelemetry.io/otel/RELEASING.md index 1ddcdef039..861756fd74 100644 --- a/vendor/go.opentelemetry.io/otel/RELEASING.md +++ b/vendor/go.opentelemetry.io/otel/RELEASING.md @@ -24,7 +24,7 @@ Ensure things look correct before submitting a pull request to include the addit ## Breaking changes validation -You can run `make gorelease` that runs [gorelease](https://pkg.go.dev/golang.org/x/exp/cmd/gorelease) to ensure that there are no unwanted changes done in the public API. +You can run `make gorelease` which runs [gorelease](https://pkg.go.dev/golang.org/x/exp/cmd/gorelease) to ensure that there are no unwanted changes made in the public API. You can check/report problems with `gorelease` [here](https://golang.org/issues/26420). @@ -62,7 +62,7 @@ Update go.mod for submodules to depend on the new release which will happen in t ``` 3. Update the [Changelog](./CHANGELOG.md). - - Make sure all relevant changes for this release are included and are in language that non-contributors to the project can understand. + - Make sure all relevant changes for this release are included and are written in language that non-contributors to the project can understand. To verify this, you can look directly at the commits since the ``. ``` @@ -107,34 +107,50 @@ It is critical you make sure the version you push upstream is correct. ... ``` -## Release +## Sign artifacts -Finally create a Release for the new `` on GitHub. -The release body should include all the release notes from the Changelog for this release. +To ensure we comply with CNCF best practices, we need to sign the release artifacts. -### Sign the Release Artifact +Download the `.tar.gz` and `.zip` archives from the [tags page](https://github.com/open-telemetry/opentelemetry-go/tags) for the new release tag. +Both archives need to be signed with your GPG key. -To ensure we comply with CNCF best practices, we need to sign the release artifact. -The tarball attached to the GitHub release needs to be signed with your GPG key. +You can use [this script] to verify the contents of the archives before signing them. -Follow [these steps] to sign the release artifact and upload it to GitHub. -You can use [this script] to verify the contents of the tarball before signing it. +To find your GPG key ID, run: -Be sure to use the correct GPG key when signing the release artifact. +```terminal +gpg --list-secret-keys --keyid-format=long +``` + +The key ID is the 16-character string after `sec rsa4096/` (or similar). + +Set environment variables and sign both artifacts: ```terminal -gpg --local-user --armor --detach-sign opentelemetry-go-.tar.gz +export VERSION="" # e.g., v1.32.0 +export KEY_ID="" + +gpg --local-user $KEY_ID --armor --detach-sign opentelemetry-go-$VERSION.tar.gz +gpg --local-user $KEY_ID --armor --detach-sign opentelemetry-go-$VERSION.zip ``` -You can verify the signature with: +You can verify the signatures with: ```terminal -gpg --verify opentelemetry-go-.tar.gz.asc opentelemetry-go-.tar.gz +gpg --verify opentelemetry-go-$VERSION.tar.gz.asc opentelemetry-go-$VERSION.tar.gz +gpg --verify opentelemetry-go-$VERSION.zip.asc opentelemetry-go-$VERSION.zip ``` -[these steps]: https://wiki.debian.org/Creating%20signed%20GitHub%20releases [this script]: https://github.com/MrAlias/attest-sh +## Release + +Finally create a Release for the new `` on GitHub. +The release body should include all the release notes from the Changelog for this release. + +***IMPORTANT***: GitHub Releases are immutable once created. +You must upload the signed artifacts (`.tar.gz`, `.tar.gz.asc`, `.zip`, and `.zip.asc`) when creating the release, as they cannot be added or modified later. + ## Post-Release ### Contrib Repository @@ -160,14 +176,6 @@ This helps track what changes were included in each release. Once all related issues and PRs have been added to the milestone, close the milestone. -### Demo Repository - -Bump the dependencies in the following Go services: - -- [`accounting`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accounting) -- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkout) -- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/product-catalog) - ### Close the `Version Release` issue Once the todo list in the `Version Release` issue is complete, close the issue. diff --git a/vendor/go.opentelemetry.io/otel/VERSIONING.md b/vendor/go.opentelemetry.io/otel/VERSIONING.md index b8cb605c16..b27c9e84f5 100644 --- a/vendor/go.opentelemetry.io/otel/VERSIONING.md +++ b/vendor/go.opentelemetry.io/otel/VERSIONING.md @@ -83,7 +83,7 @@ is designed so the following goals can be achieved. in either the module path or the import path. * In addition to public APIs, telemetry produced by stable instrumentation will remain stable and backwards compatible. This is to avoid breaking - alerts and dashboard. + alerts and dashboards. * Modules will be used to encapsulate instrumentation, detectors, exporters, propagators, and any other independent sets of related components. * Experimental modules still under active development will be versioned at diff --git a/vendor/go.opentelemetry.io/otel/attribute/encoder.go b/vendor/go.opentelemetry.io/otel/attribute/encoder.go index 6333d34b31..6cc1a1655c 100644 --- a/vendor/go.opentelemetry.io/otel/attribute/encoder.go +++ b/vendor/go.opentelemetry.io/otel/attribute/encoder.go @@ -16,7 +16,7 @@ type ( // set into a wire representation. Encoder interface { // Encode returns the serialized encoding of the attribute set using - // its Iterator. This result may be cached by a attribute.Set. + // its Iterator. This result may be cached by an attribute.Set. Encode(iterator Iterator) string // ID returns a value that is unique for each class of attribute diff --git a/vendor/go.opentelemetry.io/otel/attribute/hash.go b/vendor/go.opentelemetry.io/otel/attribute/hash.go new file mode 100644 index 0000000000..6aa69aeaec --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/attribute/hash.go @@ -0,0 +1,92 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package attribute // import "go.opentelemetry.io/otel/attribute" + +import ( + "fmt" + "reflect" + + "go.opentelemetry.io/otel/attribute/internal/xxhash" +) + +// Type identifiers. These identifiers are hashed before the value of the +// corresponding type. This is done to distinguish values that are hashed with +// the same value representation (e.g. `int64(1)` and `true`, []int64{0} and +// int64(0)). +// +// These are all 8 byte length strings converted to a uint64 representation. A +// uint64 is used instead of the string directly as an optimization, it avoids +// the for loop in [xxhash] which adds minor overhead. +const ( + boolID uint64 = 7953749933313450591 // "_boolean" (little endian) + int64ID uint64 = 7592915492740740150 // "64_bit_i" (little endian) + float64ID uint64 = 7376742710626956342 // "64_bit_f" (little endian) + stringID uint64 = 6874584755375207263 // "_string_" (little endian) + boolSliceID uint64 = 6875993255270243167 // "_[]bool_" (little endian) + int64SliceID uint64 = 3762322556277578591 // "_[]int64" (little endian) + float64SliceID uint64 = 7308324551835016539 // "[]double" (little endian) + stringSliceID uint64 = 7453010373645655387 // "[]string" (little endian) +) + +// hashKVs returns a new xxHash64 hash of kvs. +func hashKVs(kvs []KeyValue) uint64 { + h := xxhash.New() + for _, kv := range kvs { + h = hashKV(h, kv) + } + return h.Sum64() +} + +// hashKV returns the xxHash64 hash of kv with h as the base. +func hashKV(h xxhash.Hash, kv KeyValue) xxhash.Hash { + h = h.String(string(kv.Key)) + + switch kv.Value.Type() { + case BOOL: + h = h.Uint64(boolID) + h = h.Uint64(kv.Value.numeric) + case INT64: + h = h.Uint64(int64ID) + h = h.Uint64(kv.Value.numeric) + case FLOAT64: + h = h.Uint64(float64ID) + // Assumes numeric stored with math.Float64bits. + h = h.Uint64(kv.Value.numeric) + case STRING: + h = h.Uint64(stringID) + h = h.String(kv.Value.stringly) + case BOOLSLICE: + h = h.Uint64(boolSliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.Bool(rv.Index(i).Bool()) + } + case INT64SLICE: + h = h.Uint64(int64SliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.Int64(rv.Index(i).Int()) + } + case FLOAT64SLICE: + h = h.Uint64(float64SliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.Float64(rv.Index(i).Float()) + } + case STRINGSLICE: + h = h.Uint64(stringSliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.String(rv.Index(i).String()) + } + case INVALID: + default: + // Logging is an alternative, but using the internal logger here + // causes an import cycle so it is not done. + v := kv.Value.AsInterface() + msg := fmt.Sprintf("unknown value type: %[1]v (%[1]T)", v) + panic(msg) + } + return h +} diff --git a/vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go b/vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go new file mode 100644 index 0000000000..113a978383 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go @@ -0,0 +1,64 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package xxhash provides a wrapper around the xxhash library for attribute hashing. +package xxhash // import "go.opentelemetry.io/otel/attribute/internal/xxhash" + +import ( + "encoding/binary" + "math" + + "github.com/cespare/xxhash/v2" +) + +// Hash wraps xxhash.Digest to provide an API friendly for hashing attribute values. +type Hash struct { + d *xxhash.Digest +} + +// New returns a new initialized xxHash64 hasher. +func New() Hash { + return Hash{d: xxhash.New()} +} + +func (h Hash) Uint64(val uint64) Hash { + var buf [8]byte + binary.LittleEndian.PutUint64(buf[:], val) + // errors from Write are always nil for xxhash + // if it returns an err then panic + _, err := h.d.Write(buf[:]) + if err != nil { + panic("xxhash write of uint64 failed: " + err.Error()) + } + return h +} + +func (h Hash) Bool(val bool) Hash { // nolint:revive // This is a hashing function. + if val { + return h.Uint64(1) + } + return h.Uint64(0) +} + +func (h Hash) Float64(val float64) Hash { + return h.Uint64(math.Float64bits(val)) +} + +func (h Hash) Int64(val int64) Hash { + return h.Uint64(uint64(val)) // nolint:gosec // Overflow doesn't matter since we are hashing. +} + +func (h Hash) String(val string) Hash { + // errors from WriteString are always nil for xxhash + // if it returns an err then panic + _, err := h.d.WriteString(val) + if err != nil { + panic("xxhash write of string failed: " + err.Error()) + } + return h +} + +// Sum64 returns the current hash value. +func (h Hash) Sum64() uint64 { + return h.d.Sum64() +} diff --git a/vendor/go.opentelemetry.io/otel/attribute/set.go b/vendor/go.opentelemetry.io/otel/attribute/set.go index 64735d382e..911d557ee5 100644 --- a/vendor/go.opentelemetry.io/otel/attribute/set.go +++ b/vendor/go.opentelemetry.io/otel/attribute/set.go @@ -9,6 +9,8 @@ import ( "reflect" "slices" "sort" + + "go.opentelemetry.io/otel/attribute/internal/xxhash" ) type ( @@ -23,19 +25,19 @@ type ( // the Equals method to ensure stable equivalence checking. // // Users should also use the Distinct returned from Equivalent as a map key - // instead of a Set directly. In addition to that type providing guarantees - // on stable equivalence, it may also provide performance improvements. + // instead of a Set directly. Set has relatively poor performance when used + // as a map key compared to Distinct. Set struct { - equivalent Distinct + hash uint64 + data any } - // Distinct is a unique identifier of a Set. + // Distinct is an identifier of a Set which is very likely to be unique. // - // Distinct is designed to ensure equivalence stability: comparisons will - // return the same value across versions. For this reason, Distinct should - // always be used as a map key instead of a Set. + // Distinct should be used as a map key instead of a Set for to provide better + // performance for map operations. Distinct struct { - iface any + hash uint64 } // Sortable implements sort.Interface, used for sorting KeyValue. @@ -46,15 +48,34 @@ type ( Sortable []KeyValue ) +// Compile time check these types remain comparable. +var ( + _ = isComparable(Set{}) + _ = isComparable(Distinct{}) +) + +func isComparable[T comparable](t T) T { return t } + var ( // keyValueType is used in computeDistinctReflect. keyValueType = reflect.TypeOf(KeyValue{}) - // emptySet is returned for empty attribute sets. - emptySet = &Set{ - equivalent: Distinct{ - iface: [0]KeyValue{}, - }, + // emptyHash is the hash of an empty set. + emptyHash = xxhash.New().Sum64() + + // userDefinedEmptySet is an empty set. It was mistakenly exposed to users + // as something they can assign to, so it must remain addressable and + // mutable. + // + // This is kept for backwards compatibility, but should not be used in new code. + userDefinedEmptySet = &Set{ + hash: emptyHash, + data: [0]KeyValue{}, + } + + emptySet = Set{ + hash: emptyHash, + data: [0]KeyValue{}, } ) @@ -62,33 +83,35 @@ var ( // // This is a convenience provided for optimized calling utility. func EmptySet() *Set { - return emptySet -} - -// reflectValue abbreviates reflect.ValueOf(d). -func (d Distinct) reflectValue() reflect.Value { - return reflect.ValueOf(d.iface) + // Continue to return the pointer to the user-defined empty set for + // backwards-compatibility. + // + // New code should not use this, instead use emptySet. + return userDefinedEmptySet } // Valid reports whether this value refers to a valid Set. -func (d Distinct) Valid() bool { - return d.iface != nil +func (d Distinct) Valid() bool { return d.hash != 0 } + +// reflectValue abbreviates reflect.ValueOf(d). +func (l Set) reflectValue() reflect.Value { + return reflect.ValueOf(l.data) } // Len returns the number of attributes in this set. func (l *Set) Len() int { - if l == nil || !l.equivalent.Valid() { + if l == nil || l.hash == 0 { return 0 } - return l.equivalent.reflectValue().Len() + return l.reflectValue().Len() } // Get returns the KeyValue at ordered position idx in this set. func (l *Set) Get(idx int) (KeyValue, bool) { - if l == nil || !l.equivalent.Valid() { + if l == nil || l.hash == 0 { return KeyValue{}, false } - value := l.equivalent.reflectValue() + value := l.reflectValue() if idx >= 0 && idx < value.Len() { // Note: The Go compiler successfully avoids an allocation for @@ -101,10 +124,10 @@ func (l *Set) Get(idx int) (KeyValue, bool) { // Value returns the value of a specified key in this set. func (l *Set) Value(k Key) (Value, bool) { - if l == nil || !l.equivalent.Valid() { + if l == nil || l.hash == 0 { return Value{}, false } - rValue := l.equivalent.reflectValue() + rValue := l.reflectValue() vlen := rValue.Len() idx := sort.Search(vlen, func(idx int) bool { @@ -144,20 +167,29 @@ func (l *Set) ToSlice() []KeyValue { return iter.ToSlice() } -// Equivalent returns a value that may be used as a map key. The Distinct type -// guarantees that the result will equal the equivalent. Distinct value of any +// Equivalent returns a value that may be used as a map key. Equal Distinct +// values are very likely to be equivalent attribute Sets. Distinct value of any // attribute set with the same elements as this, where sets are made unique by // choosing the last value in the input for any given key. func (l *Set) Equivalent() Distinct { - if l == nil || !l.equivalent.Valid() { - return emptySet.equivalent + if l == nil || l.hash == 0 { + return Distinct{hash: emptySet.hash} } - return l.equivalent + return Distinct{hash: l.hash} } // Equals reports whether the argument set is equivalent to this set. func (l *Set) Equals(o *Set) bool { - return l.Equivalent() == o.Equivalent() + if l.Equivalent() != o.Equivalent() { + return false + } + if l == nil || l.hash == 0 { + l = &emptySet + } + if o == nil || o.hash == 0 { + o = &emptySet + } + return l.data == o.data } // Encoded returns the encoded form of this set, according to encoder. @@ -169,12 +201,6 @@ func (l *Set) Encoded(encoder Encoder) string { return encoder.Encode(l.Iter()) } -func empty() Set { - return Set{ - equivalent: emptySet.equivalent, - } -} - // NewSet returns a new Set. See the documentation for // NewSetWithSortableFiltered for more details. // @@ -204,7 +230,7 @@ func NewSetWithSortable(kvs []KeyValue, _ *Sortable) Set { func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { // Check for empty set. if len(kvs) == 0 { - return empty(), nil + return emptySet, nil } // Stable sort so the following de-duplication can implement @@ -233,10 +259,10 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { if filter != nil { if div := filteredToFront(kvs, filter); div != 0 { - return Set{equivalent: computeDistinct(kvs[div:])}, kvs[:div] + return newSet(kvs[div:]), kvs[:div] } } - return Set{equivalent: computeDistinct(kvs)}, nil + return newSet(kvs), nil } // NewSetWithSortableFiltered returns a new Set. @@ -316,7 +342,7 @@ func (l *Set) Filter(re Filter) (Set, []KeyValue) { if first == 0 { // It is safe to assume len(slice) >= 1 given we found at least one // attribute above that needs to be filtered out. - return Set{equivalent: computeDistinct(slice[1:])}, slice[:1] + return newSet(slice[1:]), slice[:1] } // Move the filtered slice[first] to the front (preserving order). @@ -326,25 +352,24 @@ func (l *Set) Filter(re Filter) (Set, []KeyValue) { // Do not re-evaluate re(slice[first+1:]). div := filteredToFront(slice[1:first+1], re) + 1 - return Set{equivalent: computeDistinct(slice[div:])}, slice[:div] + return newSet(slice[div:]), slice[:div] } -// computeDistinct returns a Distinct using either the fixed- or -// reflect-oriented code path, depending on the size of the input. The input -// slice is assumed to already be sorted and de-duplicated. -func computeDistinct(kvs []KeyValue) Distinct { - iface := computeDistinctFixed(kvs) - if iface == nil { - iface = computeDistinctReflect(kvs) +// newSet returns a new set based on the sorted and uniqued kvs. +func newSet(kvs []KeyValue) Set { + s := Set{ + hash: hashKVs(kvs), + data: computeDataFixed(kvs), } - return Distinct{ - iface: iface, + if s.data == nil { + s.data = computeDataReflect(kvs) } + return s } -// computeDistinctFixed computes a Distinct for small slices. It returns nil -// if the input is too large for this code path. -func computeDistinctFixed(kvs []KeyValue) any { +// computeDataFixed computes a Set data for small slices. It returns nil if the +// input is too large for this code path. +func computeDataFixed(kvs []KeyValue) any { switch len(kvs) { case 1: return [1]KeyValue(kvs) @@ -371,9 +396,9 @@ func computeDistinctFixed(kvs []KeyValue) any { } } -// computeDistinctReflect computes a Distinct using reflection, works for any -// size input. -func computeDistinctReflect(kvs []KeyValue) any { +// computeDataReflect computes a Set data using reflection, works for any size +// input. +func computeDataReflect(kvs []KeyValue) any { at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem() for i, keyValue := range kvs { *(at.Index(i).Addr().Interface().(*KeyValue)) = keyValue @@ -383,7 +408,7 @@ func computeDistinctReflect(kvs []KeyValue) any { // MarshalJSON returns the JSON encoding of the Set. func (l *Set) MarshalJSON() ([]byte, error) { - return json.Marshal(l.equivalent.iface) + return json.Marshal(l.data) } // MarshalLog is the marshaling function used by the logging system to represent this Set. diff --git a/vendor/go.opentelemetry.io/otel/attribute/type_string.go b/vendor/go.opentelemetry.io/otel/attribute/type_string.go index e584b24776..24f1fa37db 100644 --- a/vendor/go.opentelemetry.io/otel/attribute/type_string.go +++ b/vendor/go.opentelemetry.io/otel/attribute/type_string.go @@ -24,8 +24,9 @@ const _Type_name = "INVALIDBOOLINT64FLOAT64STRINGBOOLSLICEINT64SLICEFLOAT64SLICE var _Type_index = [...]uint8{0, 7, 11, 16, 23, 29, 38, 48, 60, 71} func (i Type) String() string { - if i < 0 || i >= Type(len(_Type_index)-1) { + idx := int(i) - 0 + if i < 0 || idx >= len(_Type_index)-1 { return "Type(" + strconv.FormatInt(int64(i), 10) + ")" } - return _Type_name[_Type_index[i]:_Type_index[i+1]] + return _Type_name[_Type_index[idx]:_Type_index[idx+1]] } diff --git a/vendor/go.opentelemetry.io/otel/baggage/baggage.go b/vendor/go.opentelemetry.io/otel/baggage/baggage.go index f83a448ec6..78e98c4c0f 100644 --- a/vendor/go.opentelemetry.io/otel/baggage/baggage.go +++ b/vendor/go.opentelemetry.io/otel/baggage/baggage.go @@ -648,7 +648,7 @@ func parsePropertyInternal(s string) (p Property, ok bool) { // If we couldn't find any valid key character, // it means the key is either empty or invalid. if keyStart == keyEnd { - return + return p, ok } // Skip spaces after the key: " key< >= value ". @@ -658,13 +658,13 @@ func parsePropertyInternal(s string) (p Property, ok bool) { // A key can have no value, like: " key ". ok = true p.key = s[keyStart:keyEnd] - return + return p, ok } // If we have not reached the end and we can't find the '=' delimiter, // it means the property is invalid. if s[index] != keyValueDelimiter[0] { - return + return p, ok } // Attempting to parse the value. @@ -690,14 +690,14 @@ func parsePropertyInternal(s string) (p Property, ok bool) { // we have not reached the end, it means the property is // invalid, something like: " key = value value1". if index != len(s) { - return + return p, ok } // Decode a percent-encoded value. rawVal := s[valueStart:valueEnd] unescapeVal, err := url.PathUnescape(rawVal) if err != nil { - return + return p, ok } value := replaceInvalidUTF8Sequences(len(rawVal), unescapeVal) @@ -706,7 +706,7 @@ func parsePropertyInternal(s string) (p Property, ok bool) { p.hasValue = true p.value = value - return + return p, ok } func skipSpace(s string, offset int) int { diff --git a/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile b/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile index a311fbb483..cadb87cc0e 100644 --- a/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile +++ b/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile @@ -1,4 +1,4 @@ # This is a renovate-friendly source of Docker images. FROM python:3.13.6-slim-bullseye@sha256:e98b521460ee75bca92175c16247bdf7275637a8faaeb2bcfa19d879ae5c4b9a AS python -FROM otel/weaver:v0.17.1@sha256:32523b5e44fb44418786347e9f7dde187d8797adb6d57a2ee99c245346c3cdfe AS weaver +FROM otel/weaver:v0.19.0@sha256:3d20814cef548f1d31f27f054fb4cd6a05125641a9f7cc29fc7eb234e8052cd9 AS weaver FROM avtodev/markdown-lint:v1@sha256:6aeedc2f49138ce7a1cd0adffc1b1c0321b841dc2102408967d9301c031949ee AS markdown diff --git a/vendor/go.opentelemetry.io/otel/internal/global/meter.go b/vendor/go.opentelemetry.io/otel/internal/global/meter.go index adb37b5b0e..6db969f73c 100644 --- a/vendor/go.opentelemetry.io/otel/internal/global/meter.go +++ b/vendor/go.opentelemetry.io/otel/internal/global/meter.go @@ -105,7 +105,7 @@ type delegatedInstrument interface { setDelegate(metric.Meter) } -// instID are the identifying properties of a instrument. +// instID are the identifying properties of an instrument. type instID struct { // name is the name of the stream. name string diff --git a/vendor/go.opentelemetry.io/otel/metric.go b/vendor/go.opentelemetry.io/otel/metric.go index 1e6473b32f..527d9aec86 100644 --- a/vendor/go.opentelemetry.io/otel/metric.go +++ b/vendor/go.opentelemetry.io/otel/metric.go @@ -11,7 +11,7 @@ import ( // Meter returns a Meter from the global MeterProvider. The name must be the // name of the library providing instrumentation. This name may be the same as // the instrumented code only if that code provides built-in instrumentation. -// If the name is empty, then a implementation defined default name will be +// If the name is empty, then an implementation defined default name will be // used instead. // // If this is called before a global MeterProvider is registered the returned diff --git a/vendor/go.opentelemetry.io/otel/metric/config.go b/vendor/go.opentelemetry.io/otel/metric/config.go index d9e3b13e4d..e42dd6e70a 100644 --- a/vendor/go.opentelemetry.io/otel/metric/config.go +++ b/vendor/go.opentelemetry.io/otel/metric/config.go @@ -3,7 +3,11 @@ package metric // import "go.opentelemetry.io/otel/metric" -import "go.opentelemetry.io/otel/attribute" +import ( + "slices" + + "go.opentelemetry.io/otel/attribute" +) // MeterConfig contains options for Meters. type MeterConfig struct { @@ -62,12 +66,38 @@ func WithInstrumentationVersion(version string) MeterOption { }) } -// WithInstrumentationAttributes sets the instrumentation attributes. +// WithInstrumentationAttributes adds the instrumentation attributes. +// +// This is equivalent to calling [WithInstrumentationAttributeSet] with an +// [attribute.Set] created from a clone of the passed attributes. +// [WithInstrumentationAttributeSet] is recommended for more control. // -// The passed attributes will be de-duplicated. +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. func WithInstrumentationAttributes(attr ...attribute.KeyValue) MeterOption { + set := attribute.NewSet(slices.Clone(attr)...) + return WithInstrumentationAttributeSet(set) +} + +// WithInstrumentationAttributeSet adds the instrumentation attributes. +// +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. +func WithInstrumentationAttributeSet(set attribute.Set) MeterOption { + if set.Len() == 0 { + return meterOptionFunc(func(config MeterConfig) MeterConfig { + return config + }) + } + return meterOptionFunc(func(config MeterConfig) MeterConfig { - config.attrs = attribute.NewSet(attr...) + if config.attrs.Len() == 0 { + config.attrs = set + } else { + config.attrs = mergeSets(config.attrs, set) + } return config }) } diff --git a/vendor/go.opentelemetry.io/otel/propagation/trace_context.go b/vendor/go.opentelemetry.io/otel/propagation/trace_context.go index 6692d2665d..271ab71f1a 100644 --- a/vendor/go.opentelemetry.io/otel/propagation/trace_context.go +++ b/vendor/go.opentelemetry.io/otel/propagation/trace_context.go @@ -111,7 +111,7 @@ func (TraceContext) extract(carrier TextMapCarrier) trace.SpanContext { } // Clear all flags other than the trace-context supported sampling bit. - scc.TraceFlags = trace.TraceFlags(opts[0]) & trace.FlagsSampled + scc.TraceFlags = trace.TraceFlags(opts[0]) & trace.FlagsSampled // nolint:gosec // slice size already checked. // Ignore the error returned here. Failure to parse tracestate MUST NOT // affect the parsing of traceparent according to the W3C tracecontext diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go index 666bded4ba..267979c051 100644 --- a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go @@ -4,28 +4,53 @@ package semconv // import "go.opentelemetry.io/otel/semconv/v1.37.0" import ( - "fmt" "reflect" "go.opentelemetry.io/otel/attribute" ) // ErrorType returns an [attribute.KeyValue] identifying the error type of err. +// +// If err is nil, the returned attribute has the default value +// [ErrorTypeOther]. +// +// If err's type has the method +// +// ErrorType() string +// +// then the returned attribute has the value of err.ErrorType(). Otherwise, the +// returned attribute has a value derived from the concrete type of err. +// +// The key of the returned attribute is [ErrorTypeKey]. func ErrorType(err error) attribute.KeyValue { if err == nil { return ErrorTypeOther } - t := reflect.TypeOf(err) - var value string - if t.PkgPath() == "" && t.Name() == "" { - // Likely a builtin type. - value = t.String() - } else { - value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) + + return ErrorTypeKey.String(errorType(err)) +} + +func errorType(err error) string { + var s string + if et, ok := err.(interface{ ErrorType() string }); ok { + // Prioritize the ErrorType method if available. + s = et.ErrorType() } + if s == "" { + // Fallback to reflection if the ErrorType method is not supported or + // returns an empty value. - if value == "" { - return ErrorTypeOther + t := reflect.TypeOf(err) + pkg, name := t.PkgPath(), t.Name() + if pkg != "" && name != "" { + s = pkg + "." + name + } else { + // The type has no package path or name (predeclared, not-defined, + // or alias for a not-defined type). + // + // This is not guaranteed to be unique, but is a best effort. + s = t.String() + } } - return ErrorTypeKey.String(value) + return s } diff --git a/vendor/go.opentelemetry.io/otel/trace/config.go b/vendor/go.opentelemetry.io/otel/trace/config.go index aea11a2b52..d9ecef1cad 100644 --- a/vendor/go.opentelemetry.io/otel/trace/config.go +++ b/vendor/go.opentelemetry.io/otel/trace/config.go @@ -4,6 +4,7 @@ package trace // import "go.opentelemetry.io/otel/trace" import ( + "slices" "time" "go.opentelemetry.io/otel/attribute" @@ -304,12 +305,50 @@ func WithInstrumentationVersion(version string) TracerOption { }) } -// WithInstrumentationAttributes sets the instrumentation attributes. +// mergeSets returns the union of keys between a and b. Any duplicate keys will +// use the value associated with b. +func mergeSets(a, b attribute.Set) attribute.Set { + // NewMergeIterator uses the first value for any duplicates. + iter := attribute.NewMergeIterator(&b, &a) + merged := make([]attribute.KeyValue, 0, a.Len()+b.Len()) + for iter.Next() { + merged = append(merged, iter.Attribute()) + } + return attribute.NewSet(merged...) +} + +// WithInstrumentationAttributes adds the instrumentation attributes. // -// The passed attributes will be de-duplicated. +// This is equivalent to calling [WithInstrumentationAttributeSet] with an +// [attribute.Set] created from a clone of the passed attributes. +// [WithInstrumentationAttributeSet] is recommended for more control. +// +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. func WithInstrumentationAttributes(attr ...attribute.KeyValue) TracerOption { + set := attribute.NewSet(slices.Clone(attr)...) + return WithInstrumentationAttributeSet(set) +} + +// WithInstrumentationAttributeSet adds the instrumentation attributes. +// +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. +func WithInstrumentationAttributeSet(set attribute.Set) TracerOption { + if set.Len() == 0 { + return tracerOptionFunc(func(config TracerConfig) TracerConfig { + return config + }) + } + return tracerOptionFunc(func(config TracerConfig) TracerConfig { - config.attrs = attribute.NewSet(attr...) + if config.attrs.Len() == 0 { + config.attrs = set + } else { + config.attrs = mergeSets(config.attrs, set) + } return config }) } diff --git a/vendor/go.opentelemetry.io/otel/trace/span.go b/vendor/go.opentelemetry.io/otel/trace/span.go index d3aa476ee1..d01e793664 100644 --- a/vendor/go.opentelemetry.io/otel/trace/span.go +++ b/vendor/go.opentelemetry.io/otel/trace/span.go @@ -66,6 +66,10 @@ type Span interface { // SetAttributes sets kv as attributes of the Span. If a key from kv // already exists for an attribute of the Span it will be overwritten with // the value contained in kv. + // + // Note that adding attributes at span creation using [WithAttributes] is preferred + // to calling SetAttribute later, as samplers can only consider information + // already present during span creation. SetAttributes(kv ...attribute.KeyValue) // TracerProvider returns a TracerProvider that can be used to generate diff --git a/vendor/go.opentelemetry.io/otel/version.go b/vendor/go.opentelemetry.io/otel/version.go index bcaa5aa537..0d5b029187 100644 --- a/vendor/go.opentelemetry.io/otel/version.go +++ b/vendor/go.opentelemetry.io/otel/version.go @@ -5,5 +5,5 @@ package otel // import "go.opentelemetry.io/otel" // Version is the current release version of OpenTelemetry in use. func Version() string { - return "1.38.0" + return "1.39.0" } diff --git a/vendor/go.opentelemetry.io/otel/versions.yaml b/vendor/go.opentelemetry.io/otel/versions.yaml index 07145e254b..f4a3893eb5 100644 --- a/vendor/go.opentelemetry.io/otel/versions.yaml +++ b/vendor/go.opentelemetry.io/otel/versions.yaml @@ -3,7 +3,7 @@ module-sets: stable-v1: - version: v1.38.0 + version: v1.39.0 modules: - go.opentelemetry.io/otel - go.opentelemetry.io/otel/bridge/opencensus @@ -22,11 +22,11 @@ module-sets: - go.opentelemetry.io/otel/sdk/metric - go.opentelemetry.io/otel/trace experimental-metrics: - version: v0.60.0 + version: v0.61.0 modules: - go.opentelemetry.io/otel/exporters/prometheus experimental-logs: - version: v0.14.0 + version: v0.15.0 modules: - go.opentelemetry.io/otel/log - go.opentelemetry.io/otel/log/logtest @@ -36,9 +36,28 @@ module-sets: - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp - go.opentelemetry.io/otel/exporters/stdout/stdoutlog experimental-schema: - version: v0.0.13 + version: v0.0.14 modules: - go.opentelemetry.io/otel/schema excluded-modules: - go.opentelemetry.io/otel/internal/tools - go.opentelemetry.io/otel/trace/internal/telemetry/test +modules: + go.opentelemetry.io/otel/exporters/stdout/stdouttrace: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/prometheus: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp: + version-refs: + - ./internal/version.go diff --git a/vendor/golang.org/x/mod/modfile/print.go b/vendor/golang.org/x/mod/modfile/print.go index 2a0123d4b9..48dbd82aec 100644 --- a/vendor/golang.org/x/mod/modfile/print.go +++ b/vendor/golang.org/x/mod/modfile/print.go @@ -33,7 +33,7 @@ type printer struct { } // printf prints to the buffer. -func (p *printer) printf(format string, args ...interface{}) { +func (p *printer) printf(format string, args ...any) { fmt.Fprintf(p, format, args...) } diff --git a/vendor/golang.org/x/mod/modfile/read.go b/vendor/golang.org/x/mod/modfile/read.go index f58de029ea..504a2f1df6 100644 --- a/vendor/golang.org/x/mod/modfile/read.go +++ b/vendor/golang.org/x/mod/modfile/read.go @@ -600,7 +600,7 @@ func (in *input) readToken() { // Checked all punctuation. Must be identifier token. if c := in.peekRune(); !isIdent(c) { - in.Error(fmt.Sprintf("unexpected input character %#q", c)) + in.Error(fmt.Sprintf("unexpected input character %#q", rune(c))) } // Scan over identifier. diff --git a/vendor/golang.org/x/mod/modfile/rule.go b/vendor/golang.org/x/mod/modfile/rule.go index a86ee4fd82..c5b8305de7 100644 --- a/vendor/golang.org/x/mod/modfile/rule.go +++ b/vendor/golang.org/x/mod/modfile/rule.go @@ -368,7 +368,7 @@ func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, a Err: err, }) } - errorf := func(format string, args ...interface{}) { + errorf := func(format string, args ...any) { wrapError(fmt.Errorf(format, args...)) } @@ -574,7 +574,7 @@ func parseReplace(filename string, line *Line, verb string, args []string, fix V Err: err, } } - errorf := func(format string, args ...interface{}) *Error { + errorf := func(format string, args ...any) *Error { return wrapError(fmt.Errorf(format, args...)) } @@ -685,7 +685,7 @@ func (f *WorkFile) add(errs *ErrorList, line *Line, verb string, args []string, Err: err, }) } - errorf := func(format string, args ...interface{}) { + errorf := func(format string, args ...any) { wrapError(fmt.Errorf(format, args...)) } @@ -1594,7 +1594,7 @@ func (f *File) AddRetract(vi VersionInterval, rationale string) error { r.Syntax = f.Syntax.addLine(nil, "retract", "[", AutoQuote(vi.Low), ",", AutoQuote(vi.High), "]") } if rationale != "" { - for _, line := range strings.Split(rationale, "\n") { + for line := range strings.SplitSeq(rationale, "\n") { com := Comment{Token: "// " + line} r.Syntax.Comment().Before = append(r.Syntax.Comment().Before, com) } diff --git a/vendor/golang.org/x/mod/module/module.go b/vendor/golang.org/x/mod/module/module.go index 9d3955bd73..739c13f48f 100644 --- a/vendor/golang.org/x/mod/module/module.go +++ b/vendor/golang.org/x/mod/module/module.go @@ -802,8 +802,8 @@ func MatchPrefixPatterns(globs, target string) bool { for globs != "" { // Extract next non-empty glob in comma-separated list. var glob string - if i := strings.Index(globs, ","); i >= 0 { - glob, globs = globs[:i], globs[i+1:] + if before, after, ok := strings.Cut(globs, ","); ok { + glob, globs = before, after } else { glob, globs = globs, "" } diff --git a/vendor/golang.org/x/net/dns/dnsmessage/svcb.go b/vendor/golang.org/x/net/dns/dnsmessage/svcb.go index de1633f0d1..4840516a7f 100644 --- a/vendor/golang.org/x/net/dns/dnsmessage/svcb.go +++ b/vendor/golang.org/x/net/dns/dnsmessage/svcb.go @@ -5,9 +5,7 @@ package dnsmessage import ( - "math" "slices" - "strings" ) // An SVCBResource is an SVCB Resource record. @@ -23,19 +21,18 @@ func (r *SVCBResource) realType() Type { // GoString implements fmt.GoStringer.GoString. func (r *SVCBResource) GoString() string { - var b strings.Builder - b.WriteString("dnsmessage.SVCBResource{") - b.WriteString("Priority: " + printUint16(r.Priority) + ", ") - b.WriteString("Target: " + r.Target.GoString() + ", ") - b.WriteString("Params: []dnsmessage.SVCParam{") + b := []byte("dnsmessage.SVCBResource{" + + "Priority: " + printUint16(r.Priority) + ", " + + "Target: " + r.Target.GoString() + ", " + + "Params: []dnsmessage.SVCParam{") if len(r.Params) > 0 { - b.WriteString(r.Params[0].GoString()) + b = append(b, r.Params[0].GoString()...) for _, p := range r.Params[1:] { - b.WriteString(", " + p.GoString()) + b = append(b, ", "+p.GoString()...) } } - b.WriteString("}}") - return b.String() + b = append(b, "}}"...) + return string(b) } // An HTTPSResource is an HTTPS Resource record. @@ -176,7 +173,7 @@ func (r *SVCBResource) pack(msg []byte, _ map[string]uint16, _ int) ([]byte, err if i > 0 && param.Key <= previousKey { return oldMsg, &nestedError{"SVCBResource.Params", errParamOutOfOrder} } - if len(param.Value) > math.MaxUint16 { + if len(param.Value) > (1<<16)-1 { return oldMsg, &nestedError{"SVCBResource.Params", errTooLongSVCBValue} } msg = packUint16(msg, uint16(param.Key)) diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 1965913e54..ccb87e6da3 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -376,11 +376,24 @@ type ClientConn struct { // completely unresponsive connection. pendingResets int + // readBeforeStreamID is the smallest stream ID that has not been followed by + // a frame read from the peer. We use this to determine when a request may + // have been sent to a completely unresponsive connection: + // If the request ID is less than readBeforeStreamID, then we have had some + // indication of life on the connection since sending the request. + readBeforeStreamID uint32 + // reqHeaderMu is a 1-element semaphore channel controlling access to sending new requests. // Write to reqHeaderMu to lock it, read from it to unlock. // Lock reqmu BEFORE mu or wmu. reqHeaderMu chan struct{} + // internalStateHook reports state changes back to the net/http.ClientConn. + // Note that this is different from the user state hook registered by + // net/http.ClientConn.SetStateHook: The internal hook calls ClientConn, + // which calls the user hook. + internalStateHook func() + // wmu is held while writing. // Acquire BEFORE mu when holding both, to avoid blocking mu on network writes. // Only acquire both at the same time when changing peer settings. @@ -710,7 +723,7 @@ func canRetryError(err error) bool { func (t *Transport) dialClientConn(ctx context.Context, addr string, singleUse bool) (*ClientConn, error) { if t.transportTestHooks != nil { - return t.newClientConn(nil, singleUse) + return t.newClientConn(nil, singleUse, nil) } host, _, err := net.SplitHostPort(addr) if err != nil { @@ -720,7 +733,7 @@ func (t *Transport) dialClientConn(ctx context.Context, addr string, singleUse b if err != nil { return nil, err } - return t.newClientConn(tconn, singleUse) + return t.newClientConn(tconn, singleUse, nil) } func (t *Transport) newTLSConfig(host string) *tls.Config { @@ -772,10 +785,10 @@ func (t *Transport) expectContinueTimeout() time.Duration { } func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { - return t.newClientConn(c, t.disableKeepAlives()) + return t.newClientConn(c, t.disableKeepAlives(), nil) } -func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) { +func (t *Transport) newClientConn(c net.Conn, singleUse bool, internalStateHook func()) (*ClientConn, error) { conf := configFromTransport(t) cc := &ClientConn{ t: t, @@ -797,6 +810,7 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro pings: make(map[[8]byte]chan struct{}), reqHeaderMu: make(chan struct{}, 1), lastActive: time.Now(), + internalStateHook: internalStateHook, } if t.transportTestHooks != nil { t.transportTestHooks.newclientconn(cc) @@ -1037,10 +1051,7 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { maxConcurrentOkay = cc.currentRequestCountLocked() < int(cc.maxConcurrentStreams) } - st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay && - !cc.doNotReuse && - int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 && - !cc.tooIdleLocked() + st.canTakeNewRequest = maxConcurrentOkay && cc.isUsableLocked() // If this connection has never been used for a request and is closed, // then let it take a request (which will fail). @@ -1056,6 +1067,31 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { return } +func (cc *ClientConn) isUsableLocked() bool { + return cc.goAway == nil && + !cc.closed && + !cc.closing && + !cc.doNotReuse && + int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 && + !cc.tooIdleLocked() +} + +// canReserveLocked reports whether a net/http.ClientConn can reserve a slot on this conn. +// +// This follows slightly different rules than clientConnIdleState.canTakeNewRequest. +// We only permit reservations up to the conn's concurrency limit. +// This differs from ClientConn.ReserveNewRequest, which permits reservations +// past the limit when StrictMaxConcurrentStreams is set. +func (cc *ClientConn) canReserveLocked() bool { + if cc.currentRequestCountLocked() >= int(cc.maxConcurrentStreams) { + return false + } + if !cc.isUsableLocked() { + return false + } + return true +} + // currentRequestCountLocked reports the number of concurrency slots currently in use, // including active streams, reserved slots, and reset streams waiting for acknowledgement. func (cc *ClientConn) currentRequestCountLocked() int { @@ -1067,6 +1103,14 @@ func (cc *ClientConn) canTakeNewRequestLocked() bool { return st.canTakeNewRequest } +// availableLocked reports the number of concurrency slots available. +func (cc *ClientConn) availableLocked() int { + if !cc.canTakeNewRequestLocked() { + return 0 + } + return max(0, int(cc.maxConcurrentStreams)-cc.currentRequestCountLocked()) +} + // tooIdleLocked reports whether this connection has been been sitting idle // for too much wall time. func (cc *ClientConn) tooIdleLocked() bool { @@ -1091,6 +1135,7 @@ func (cc *ClientConn) closeConn() { t := time.AfterFunc(250*time.Millisecond, cc.forceCloseConn) defer t.Stop() cc.tconn.Close() + cc.maybeCallStateHook() } // A tls.Conn.Close can hang for a long time if the peer is unresponsive. @@ -1616,6 +1661,8 @@ func (cs *clientStream) cleanupWriteRequest(err error) { } bodyClosed := cs.reqBodyClosed closeOnIdle := cc.singleUse || cc.doNotReuse || cc.t.disableKeepAlives() || cc.goAway != nil + // Have we read any frames from the connection since sending this request? + readSinceStream := cc.readBeforeStreamID > cs.ID cc.mu.Unlock() if mustCloseBody { cs.reqBody.Close() @@ -1647,8 +1694,10 @@ func (cs *clientStream) cleanupWriteRequest(err error) { // // This could be due to the server becoming unresponsive. // To avoid sending too many requests on a dead connection, - // we let the request continue to consume a concurrency slot - // until we can confirm the server is still responding. + // if we haven't read any frames from the connection since + // sending this request, we let it continue to consume + // a concurrency slot until we can confirm the server is + // still responding. // We do this by sending a PING frame along with the RST_STREAM // (unless a ping is already in flight). // @@ -1659,7 +1708,7 @@ func (cs *clientStream) cleanupWriteRequest(err error) { // because it's short lived and will probably be closed before // we get the ping response. ping := false - if !closeOnIdle { + if !closeOnIdle && !readSinceStream { cc.mu.Lock() // rstStreamPingsBlocked works around a gRPC behavior: // see comment on the field for details. @@ -1693,6 +1742,7 @@ func (cs *clientStream) cleanupWriteRequest(err error) { } close(cs.donec) + cc.maybeCallStateHook() } // awaitOpenSlotForStreamLocked waits until len(streams) < maxConcurrentStreams. @@ -2745,6 +2795,7 @@ func (rl *clientConnReadLoop) streamByID(id uint32, headerOrData bool) *clientSt // See comment on ClientConn.rstStreamPingsBlocked for details. rl.cc.rstStreamPingsBlocked = false } + rl.cc.readBeforeStreamID = rl.cc.nextStreamID cs := rl.cc.streams[id] if cs != nil && !cs.readAborted { return cs @@ -2795,6 +2846,7 @@ func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error { func (rl *clientConnReadLoop) processSettingsNoWrite(f *SettingsFrame) error { cc := rl.cc + defer cc.maybeCallStateHook() cc.mu.Lock() defer cc.mu.Unlock() @@ -2975,6 +3027,7 @@ func (cc *ClientConn) Ping(ctx context.Context) error { func (rl *clientConnReadLoop) processPing(f *PingFrame) error { if f.IsAck() { cc := rl.cc + defer cc.maybeCallStateHook() cc.mu.Lock() defer cc.mu.Unlock() // If ack, notify listener if any @@ -3198,9 +3251,13 @@ func registerHTTPSProtocol(t *http.Transport, rt noDialH2RoundTripper) (err erro } // noDialH2RoundTripper is a RoundTripper which only tries to complete the request -// if there's already has a cached connection to the host. +// if there's already a cached connection to the host. // (The field is exported so it can be accessed via reflect from net/http; tested // by TestNoDialH2RoundTripperType) +// +// A noDialH2RoundTripper is registered with http1.Transport.RegisterProtocol, +// and the http1.Transport can use type assertions to call non-RoundTrip methods on it. +// This lets us expose, for example, NewClientConn to net/http. type noDialH2RoundTripper struct{ *Transport } func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { @@ -3211,6 +3268,85 @@ func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, err return res, err } +func (rt noDialH2RoundTripper) NewClientConn(conn net.Conn, internalStateHook func()) (http.RoundTripper, error) { + tr := rt.Transport + cc, err := tr.newClientConn(conn, tr.disableKeepAlives(), internalStateHook) + if err != nil { + return nil, err + } + + // RoundTrip should block when the conn is at its concurrency limit, + // not return an error. Setting strictMaxConcurrentStreams enables this. + cc.strictMaxConcurrentStreams = true + + return netHTTPClientConn{cc}, nil +} + +// netHTTPClientConn wraps ClientConn and implements the interface net/http expects from +// the RoundTripper returned by NewClientConn. +type netHTTPClientConn struct { + cc *ClientConn +} + +func (cc netHTTPClientConn) RoundTrip(req *http.Request) (*http.Response, error) { + return cc.cc.RoundTrip(req) +} + +func (cc netHTTPClientConn) Close() error { + return cc.cc.Close() +} + +func (cc netHTTPClientConn) Err() error { + cc.cc.mu.Lock() + defer cc.cc.mu.Unlock() + if cc.cc.closed { + return errors.New("connection closed") + } + return nil +} + +func (cc netHTTPClientConn) Reserve() error { + defer cc.cc.maybeCallStateHook() + cc.cc.mu.Lock() + defer cc.cc.mu.Unlock() + if !cc.cc.canReserveLocked() { + return errors.New("connection is unavailable") + } + cc.cc.streamsReserved++ + return nil +} + +func (cc netHTTPClientConn) Release() { + defer cc.cc.maybeCallStateHook() + cc.cc.mu.Lock() + defer cc.cc.mu.Unlock() + // We don't complain if streamsReserved is 0. + // + // This is consistent with RoundTrip: both Release and RoundTrip will + // consume a reservation iff one exists. + if cc.cc.streamsReserved > 0 { + cc.cc.streamsReserved-- + } +} + +func (cc netHTTPClientConn) Available() int { + cc.cc.mu.Lock() + defer cc.cc.mu.Unlock() + return cc.cc.availableLocked() +} + +func (cc netHTTPClientConn) InFlight() int { + cc.cc.mu.Lock() + defer cc.cc.mu.Unlock() + return cc.cc.currentRequestCountLocked() +} + +func (cc *ClientConn) maybeCallStateHook() { + if cc.internalStateHook != nil { + cc.internalStateHook() + } +} + func (t *Transport) idleConnTimeout() time.Duration { // to keep things backwards compatible, we use non-zero values of // IdleConnTimeout, followed by using the IdleConnTimeout on the underlying diff --git a/vendor/golang.org/x/net/trace/events.go b/vendor/golang.org/x/net/trace/events.go index 3aaffdd1f7..c2b3c00980 100644 --- a/vendor/golang.org/x/net/trace/events.go +++ b/vendor/golang.org/x/net/trace/events.go @@ -58,8 +58,8 @@ func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { Buckets: buckets, } - data.Families = make([]string, 0, len(families)) famMu.RLock() + data.Families = make([]string, 0, len(families)) for name := range families { data.Families = append(data.Families, name) } diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go index 2f45dbc86e..f69fd75468 100644 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -144,8 +144,8 @@ func (g *Group) SetLimit(n int) { g.sem = nil return } - if len(g.sem) != 0 { - panic(fmt.Errorf("errgroup: modify limit while %v goroutines in the group are still active", len(g.sem))) + if active := len(g.sem); active != 0 { + panic(fmt.Errorf("errgroup: modify limit while %v goroutines in the group are still active", active)) } g.sem = make(chan token, n) } diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go index 34c9ae76ef..63541994ef 100644 --- a/vendor/golang.org/x/sys/cpu/cpu.go +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -92,9 +92,6 @@ var ARM64 struct { HasSHA2 bool // SHA2 hardware implementation HasCRC32 bool // CRC32 hardware implementation HasATOMICS bool // Atomic memory operation instruction set - HasHPDS bool // Hierarchical permission disables in translations tables - HasLOR bool // Limited ordering regions - HasPAN bool // Privileged access never HasFPHP bool // Half precision floating-point instruction set HasASIMDHP bool // Advanced SIMD half precision instruction set HasCPUID bool // CPUID identification scheme registers diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go index f449c679fe..af2aa99f9f 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -65,10 +65,10 @@ func setMinimalFeatures() { func readARM64Registers() { Initialized = true - parseARM64SystemRegisters(getisar0(), getisar1(), getmmfr1(), getpfr0()) + parseARM64SystemRegisters(getisar0(), getisar1(), getpfr0()) } -func parseARM64SystemRegisters(isar0, isar1, mmfr1, pfr0 uint64) { +func parseARM64SystemRegisters(isar0, isar1, pfr0 uint64) { // ID_AA64ISAR0_EL1 switch extractBits(isar0, 4, 7) { case 1: @@ -152,22 +152,6 @@ func parseARM64SystemRegisters(isar0, isar1, mmfr1, pfr0 uint64) { ARM64.HasI8MM = true } - // ID_AA64MMFR1_EL1 - switch extractBits(mmfr1, 12, 15) { - case 1, 2: - ARM64.HasHPDS = true - } - - switch extractBits(mmfr1, 16, 19) { - case 1: - ARM64.HasLOR = true - } - - switch extractBits(mmfr1, 20, 23) { - case 1, 2, 3: - ARM64.HasPAN = true - } - // ID_AA64PFR0_EL1 switch extractBits(pfr0, 16, 19) { case 0: diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_arm64.s index a4f24b3b0c..3b0450a06a 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_arm64.s +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.s @@ -20,13 +20,6 @@ TEXT ·getisar1(SB),NOSPLIT,$0-8 MOVD R0, ret+0(FP) RET -// func getmmfr1() uint64 -TEXT ·getmmfr1(SB),NOSPLIT,$0-8 - // get Memory Model Feature Register 1 into x0 - MRS ID_AA64MMFR1_EL1, R0 - MOVD R0, ret+0(FP) - RET - // func getpfr0() uint64 TEXT ·getpfr0(SB),NOSPLIT,$0-8 // get Processor Feature Register 0 into x0 diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go index e3fc5a8d31..6ac6e1efb2 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go @@ -8,6 +8,5 @@ package cpu func getisar0() uint64 func getisar1() uint64 -func getmmfr1() uint64 func getpfr0() uint64 func getzfr0() uint64 diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go index 8df2079e15..7f1946780b 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -8,5 +8,4 @@ package cpu func getisar0() uint64 { return 0 } func getisar1() uint64 { return 0 } -func getmmfr1() uint64 { return 0 } func getpfr0() uint64 { return 0 } diff --git a/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go index 19aea0633e..ebfb3fc8e7 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go @@ -167,7 +167,7 @@ func doinit() { setMinimalFeatures() return } - parseARM64SystemRegisters(cpuid.aa64isar0, cpuid.aa64isar1, cpuid.aa64mmfr1, cpuid.aa64pfr0) + parseARM64SystemRegisters(cpuid.aa64isar0, cpuid.aa64isar1, cpuid.aa64pfr0) Initialized = true } diff --git a/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go index 87fd3a7780..85b64d5ccb 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go @@ -59,7 +59,7 @@ func doinit() { if !ok { return } - parseARM64SystemRegisters(isar0, isar1, 0, 0) + parseARM64SystemRegisters(isar0, isar1, 0) Initialized = true } diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 42517077c4..fd39be4efd 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -256,6 +256,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -613,7 +614,7 @@ ccflags="$@" $2 !~ /IOC_MAGIC/ && $2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ || $2 ~ /^(VM|VMADDR)_/ || - $2 ~ /^IOCTL_VM_SOCKETS_/ || + $2 ~ /^(IOCTL_VM_SOCKETS_|IOCTL_MEI_)/ || $2 ~ /^(TASKSTATS|TS)_/ || $2 ~ /^CGROUPSTATS_/ || $2 ~ /^GENL_/ || diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index d0a75da572..120a7b35d1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -1615,6 +1615,8 @@ const ( IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 + IOCTL_MEI_CONNECT_CLIENT = 0xc0104801 + IOCTL_MEI_CONNECT_CLIENT_VTAG = 0xc0144804 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 1c37f9fbc4..97a61fc5b8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -116,6 +116,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 6f54d34aef..a0d6d498c4 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -116,6 +116,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 783ec5c126..dd9c903f9a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index ca83d3ba16..384c61ca3a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -120,6 +120,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index 607e611c0c..6384c9831f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -116,6 +116,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index b9cb5bd3c0..553c1c6f15 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x100 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x80 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xfffffff IPV6_FLOWLABEL_MASK = 0xfffff diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 65b078a638..b3339f2099 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x100 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x80 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xfffffff IPV6_FLOWLABEL_MASK = 0xfffff diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 5298a3033d..177091d2bc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x100 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x80 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 7bc557c876..c5abf156d0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x100 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x80 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 152399bb04..f1f3fadf57 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x400 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xfffffff IPV6_FLOWLABEL_MASK = 0xfffff diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 1a1ce2409c..203ad9c54a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x400 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xfffffff IPV6_FLOWLABEL_MASK = 0xfffff diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 4231a1fb57..4b9abcb21a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x400 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 21c0e95266..f87983037d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index f00d1cd7cf..64347eb354 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -115,6 +115,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x80000 IN_NONBLOCK = 0x800 + IOCTL_MEI_NOTIFY_GET = 0x80044803 + IOCTL_MEI_NOTIFY_SET = 0x40044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPV6_FLOWINFO_MASK = 0xfffffff IPV6_FLOWLABEL_MASK = 0xfffff diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index bc8d539e6a..7d71911718 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -119,6 +119,8 @@ const ( IEXTEN = 0x8000 IN_CLOEXEC = 0x400000 IN_NONBLOCK = 0x4000 + IOCTL_MEI_NOTIFY_GET = 0x40044803 + IOCTL_MEI_NOTIFY_SET = 0x80044802 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPV6_FLOWINFO_MASK = 0xfffffff IPV6_FLOWLABEL_MASK = 0xfffff diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index 439548ec9a..50e8e64497 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -104,7 +104,7 @@ type Statvfs_t struct { Fsid uint32 Namemax uint32 Owner uint32 - Spare [4]uint32 + Spare [4]uint64 Fstypename [32]byte Mntonname [1024]byte Mntfromname [1024]byte diff --git a/vendor/golang.org/x/text/collate/collate.go b/vendor/golang.org/x/text/collate/collate.go index d8c23cb696..449c73c8d1 100644 --- a/vendor/golang.org/x/text/collate/collate.go +++ b/vendor/golang.org/x/text/collate/collate.go @@ -255,7 +255,6 @@ func (i *iter) nextPrimary() int { return 0 } } - panic("should not reach here") } func (i *iter) nextSecondary() int { diff --git a/vendor/golang.org/x/text/internal/colltab/collelem.go b/vendor/golang.org/x/text/internal/colltab/collelem.go index bdcae9b135..1757efc8f5 100644 --- a/vendor/golang.org/x/text/internal/colltab/collelem.go +++ b/vendor/golang.org/x/text/internal/colltab/collelem.go @@ -71,8 +71,6 @@ func (ce Elem) ctype() ceType { } return ceDecompose } - panic("should not reach here") - return ceType(-1) } // For normal collation elements, we assume that a collation element either has diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go index 5bacc0fa49..adb4711019 100644 --- a/vendor/golang.org/x/tools/go/ast/astutil/imports.go +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -9,6 +9,7 @@ import ( "fmt" "go/ast" "go/token" + "reflect" "slices" "strconv" "strings" @@ -149,7 +150,7 @@ func AddNamedImport(fset *token.FileSet, f *ast.File, name, path string) (added if newImport.Name != nil { newImport.Name.NamePos = pos } - newImport.Path.ValuePos = pos + updateBasicLitPos(newImport.Path, pos) newImport.EndPos = pos // Clean up parens. impDecl contains at least one spec. @@ -184,7 +185,7 @@ func AddNamedImport(fset *token.FileSet, f *ast.File, name, path string) (added first.Lparen = first.Pos() // Move the imports of the other import declaration to the first one. for _, spec := range gen.Specs { - spec.(*ast.ImportSpec).Path.ValuePos = first.Pos() + updateBasicLitPos(spec.(*ast.ImportSpec).Path, first.Pos()) first.Specs = append(first.Specs, spec) } f.Decls = slices.Delete(f.Decls, i, i+1) @@ -470,3 +471,17 @@ func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec { return groups } + +// updateBasicLitPos updates lit.Pos, +// ensuring that lit.End (if set) is displaced by the same amount. +// (See https://go.dev/issue/76395.) +func updateBasicLitPos(lit *ast.BasicLit, pos token.Pos) { + len := lit.End() - lit.Pos() + lit.ValuePos = pos + // TODO(adonovan): after go1.26, simplify to: + // lit.ValueEnd = pos + len + v := reflect.ValueOf(lit).Elem().FieldByName("ValueEnd") + if v.IsValid() && v.Int() != 0 { + v.SetInt(int64(pos + len)) + } +} diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go index 060ab08efb..ff607389da 100644 --- a/vendor/golang.org/x/tools/go/packages/packages.go +++ b/vendor/golang.org/x/tools/go/packages/packages.go @@ -1027,11 +1027,15 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { // Precondition: ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0. func (ld *loader) loadPackage(lpkg *loaderPackage) { if lpkg.PkgPath == "unsafe" { - // Fill in the blanks to avoid surprises. + // To avoid surprises, fill in the blanks consistent + // with other packages. (For example, some analyzers + // assert that each needed types.Info map is non-nil + // even when there is no syntax that would cause them + // to consult the map.) lpkg.Types = types.Unsafe lpkg.Fset = ld.Fset lpkg.Syntax = []*ast.File{} - lpkg.TypesInfo = new(types.Info) + lpkg.TypesInfo = ld.newTypesInfo() lpkg.TypesSizes = ld.sizes return } @@ -1180,20 +1184,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { return } - // Populate TypesInfo only if needed, as it - // causes the type checker to work much harder. - if ld.Config.Mode&NeedTypesInfo != 0 { - lpkg.TypesInfo = &types.Info{ - Types: make(map[ast.Expr]types.TypeAndValue), - Defs: make(map[*ast.Ident]types.Object), - Uses: make(map[*ast.Ident]types.Object), - Implicits: make(map[ast.Node]types.Object), - Instances: make(map[*ast.Ident]types.Instance), - Scopes: make(map[ast.Node]*types.Scope), - Selections: make(map[*ast.SelectorExpr]*types.Selection), - FileVersions: make(map[*ast.File]string), - } - } + lpkg.TypesInfo = ld.newTypesInfo() lpkg.TypesSizes = ld.sizes importer := importerFunc(func(path string) (*types.Package, error) { @@ -1307,6 +1298,24 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { lpkg.IllTyped = illTyped } +func (ld *loader) newTypesInfo() *types.Info { + // Populate TypesInfo only if needed, as it + // causes the type checker to work much harder. + if ld.Config.Mode&NeedTypesInfo == 0 { + return nil + } + return &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Instances: make(map[*ast.Ident]types.Instance), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + FileVersions: make(map[*ast.File]string), + } +} + // An importFunc is an implementation of the single-method // types.Importer interface based on a function value. type importerFunc func(path string) (*types.Package, error) diff --git a/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/vendor/golang.org/x/tools/go/types/typeutil/callee.go index 5f10f56cba..3d24a8c637 100644 --- a/vendor/golang.org/x/tools/go/types/typeutil/callee.go +++ b/vendor/golang.org/x/tools/go/types/typeutil/callee.go @@ -12,6 +12,7 @@ import ( // Callee returns the named target of a function call, if any: // a function, method, builtin, or variable. +// It returns nil for a T(x) conversion. // // Functions and methods may potentially have type parameters. // diff --git a/vendor/golang.org/x/tools/internal/event/core/export.go b/vendor/golang.org/x/tools/internal/event/core/export.go index 05f3a9a579..16ae6bb021 100644 --- a/vendor/golang.org/x/tools/internal/event/core/export.go +++ b/vendor/golang.org/x/tools/internal/event/core/export.go @@ -8,7 +8,6 @@ import ( "context" "sync/atomic" "time" - "unsafe" "golang.org/x/tools/internal/event/label" ) @@ -17,23 +16,21 @@ import ( // It may return a modified context and event. type Exporter func(context.Context, Event, label.Map) context.Context -var ( - exporter unsafe.Pointer -) +var exporter atomic.Pointer[Exporter] // SetExporter sets the global exporter function that handles all events. // The exporter is called synchronously from the event call site, so it should // return quickly so as not to hold up user code. func SetExporter(e Exporter) { - p := unsafe.Pointer(&e) if e == nil { // &e is always valid, and so p is always valid, but for the early abort // of ProcessEvent to be efficient it needs to make the nil check on the // pointer without having to dereference it, so we make the nil function // also a nil pointer - p = nil + exporter.Store(nil) + } else { + exporter.Store(&e) } - atomic.StorePointer(&exporter, p) } // deliver is called to deliver an event to the supplied exporter. @@ -48,7 +45,7 @@ func deliver(ctx context.Context, exporter Exporter, ev Event) context.Context { // Export is called to deliver an event to the global exporter if set. func Export(ctx context.Context, ev Event) context.Context { // get the global exporter and abort early if there is not one - exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter)) + exporterPtr := exporter.Load() if exporterPtr == nil { return ctx } @@ -61,7 +58,7 @@ func Export(ctx context.Context, ev Event) context.Context { // It will fill in the time. func ExportPair(ctx context.Context, begin, end Event) (context.Context, func()) { // get the global exporter and abort early if there is not one - exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter)) + exporterPtr := exporter.Load() if exporterPtr == nil { return ctx, func() {} } diff --git a/vendor/golang.org/x/tools/internal/event/label/label.go b/vendor/golang.org/x/tools/internal/event/label/label.go index 92a3910573..c37584af94 100644 --- a/vendor/golang.org/x/tools/internal/event/label/label.go +++ b/vendor/golang.org/x/tools/internal/event/label/label.go @@ -7,7 +7,6 @@ package label import ( "fmt" "io" - "reflect" "slices" "unsafe" ) @@ -103,11 +102,10 @@ type stringptr unsafe.Pointer // This method is for implementing new key types, label creation should // normally be done with the Of method of the key. func OfString(k Key, v string) Label { - hdr := (*reflect.StringHeader)(unsafe.Pointer(&v)) return Label{ key: k, - packed: uint64(hdr.Len), - untyped: stringptr(hdr.Data), + packed: uint64(len(v)), + untyped: stringptr(unsafe.StringData(v)), } } @@ -116,11 +114,7 @@ func OfString(k Key, v string) Label { // This method is for implementing new key types, for type safety normal // access should be done with the From method of the key. func (t Label) UnpackString() string { - var v string - hdr := (*reflect.StringHeader)(unsafe.Pointer(&v)) - hdr.Data = uintptr(t.untyped.(stringptr)) - hdr.Len = int(t.packed) - return v + return unsafe.String((*byte)(t.untyped.(stringptr)), int(t.packed)) } // Valid returns true if the Label is a valid one (it has a key). diff --git a/vendor/golang.org/x/tools/internal/imports/sortimports.go b/vendor/golang.org/x/tools/internal/imports/sortimports.go index 67c17bc431..f390be90f1 100644 --- a/vendor/golang.org/x/tools/internal/imports/sortimports.go +++ b/vendor/golang.org/x/tools/internal/imports/sortimports.go @@ -11,6 +11,7 @@ import ( "go/ast" "go/token" "log" + "reflect" "slices" "sort" "strconv" @@ -65,7 +66,7 @@ func sortImports(localPrefix string, tokFile *token.File, f *ast.File) { } // mergeImports merges all the import declarations into the first one. -// Taken from golang.org/x/tools/ast/astutil. +// Taken from golang.org/x/tools/go/ast/astutil. // This does not adjust line numbers properly func mergeImports(f *ast.File) { if len(f.Decls) <= 1 { @@ -89,7 +90,7 @@ func mergeImports(f *ast.File) { first.Lparen = first.Pos() // Move the imports of the other import declaration to the first one. for _, spec := range gen.Specs { - spec.(*ast.ImportSpec).Path.ValuePos = first.Pos() + updateBasicLitPos(spec.(*ast.ImportSpec).Path, first.Pos()) first.Specs = append(first.Specs, spec) } f.Decls = slices.Delete(f.Decls, i, i+1) @@ -98,7 +99,7 @@ func mergeImports(f *ast.File) { } // declImports reports whether gen contains an import of path. -// Taken from golang.org/x/tools/ast/astutil. +// Taken from golang.org/x/tools/go/ast/astutil. func declImports(gen *ast.GenDecl, path string) bool { if gen.Tok != token.IMPORT { return false @@ -221,7 +222,7 @@ func sortSpecs(localPrefix string, tokFile *token.File, f *ast.File, specs []ast if s.Name != nil { s.Name.NamePos = pos[i].Start } - s.Path.ValuePos = pos[i].Start + updateBasicLitPos(s.Path, pos[i].Start) s.EndPos = pos[i].End nextSpecPos := pos[i].End @@ -296,3 +297,17 @@ type byCommentPos []*ast.CommentGroup func (x byCommentPos) Len() int { return len(x) } func (x byCommentPos) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() } + +// updateBasicLitPos updates lit.Pos, +// ensuring that lit.End (if set) is displaced by the same amount. +// (See https://go.dev/issue/76395.) +func updateBasicLitPos(lit *ast.BasicLit, pos token.Pos) { + len := lit.End() - lit.Pos() + lit.ValuePos = pos + // TODO(adonovan): after go1.26, simplify to: + // lit.ValueEnd = pos + len + v := reflect.ValueOf(lit).Elem().FieldByName("ValueEnd") + if v.IsValid() && v.Int() != 0 { + v.SetInt(int64(pos + len)) + } +} diff --git a/vendor/golang.org/x/tools/internal/modindex/lookup.go b/vendor/golang.org/x/tools/internal/modindex/lookup.go index 0c011a99b3..83bd49cd4b 100644 --- a/vendor/golang.org/x/tools/internal/modindex/lookup.go +++ b/vendor/golang.org/x/tools/internal/modindex/lookup.go @@ -8,6 +8,8 @@ import ( "slices" "strconv" "strings" + + "golang.org/x/mod/module" ) type Candidate struct { @@ -104,11 +106,15 @@ func (ix *Index) Lookup(pkgName, name string, prefix bool) []Candidate { if len(flds) < 2 { continue // should never happen } + impPath, err := module.UnescapePath(e.ImportPath) + if err != nil { + continue + } px := Candidate{ PkgName: pkgName, Name: flds[0], Dir: string(e.Dir), - ImportPath: e.ImportPath, + ImportPath: impPath, Type: asLexType(flds[1][0]), Deprecated: len(flds[1]) > 1 && flds[1][1] == 'D', } diff --git a/vendor/golang.org/x/tools/internal/stdlib/deps.go b/vendor/golang.org/x/tools/internal/stdlib/deps.go index 581784da43..f7b9c12865 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/deps.go +++ b/vendor/golang.org/x/tools/internal/stdlib/deps.go @@ -12,360 +12,364 @@ type pkginfo struct { } var deps = [...]pkginfo{ - {"archive/tar", "\x03n\x03E<\x01\n\x01$\x01\x01\x02\x05\b\x02\x01\x02\x02\f"}, - {"archive/zip", "\x02\x04d\a\x03\x12\x021<\x01+\x05\x01\x0f\x03\x02\x0e\x04"}, - {"bufio", "\x03n\x84\x01D\x14"}, - {"bytes", "q*Z\x03\fG\x02\x02"}, + {"archive/tar", "\x03p\x03F=\x01\n\x01$\x01\x01\x02\x05\b\x02\x01\x02\x02\f"}, + {"archive/zip", "\x02\x04f\a\x03\x13\x021=\x01+\x05\x01\x0f\x03\x02\x0e\x04"}, + {"bufio", "\x03p\x86\x01D\x14"}, + {"bytes", "s+[\x03\fG\x02\x02"}, {"cmp", ""}, - {"compress/bzip2", "\x02\x02\xf1\x01A"}, - {"compress/flate", "\x02o\x03\x81\x01\f\x033\x01\x03"}, - {"compress/gzip", "\x02\x04d\a\x03\x14mT"}, - {"compress/lzw", "\x02o\x03\x81\x01"}, - {"compress/zlib", "\x02\x04d\a\x03\x12\x01n"}, - {"container/heap", "\xb7\x02"}, + {"compress/bzip2", "\x02\x02\xf5\x01A"}, + {"compress/flate", "\x02q\x03\x83\x01\f\x033\x01\x03"}, + {"compress/gzip", "\x02\x04f\a\x03\x15nT"}, + {"compress/lzw", "\x02q\x03\x83\x01"}, + {"compress/zlib", "\x02\x04f\a\x03\x13\x01o"}, + {"container/heap", "\xbb\x02"}, {"container/list", ""}, {"container/ring", ""}, - {"context", "q[o\x01\r"}, - {"crypto", "\x86\x01oC"}, - {"crypto/aes", "\x10\n\t\x95\x02"}, - {"crypto/cipher", "\x03 \x01\x01\x1f\x11\x1c+Y"}, - {"crypto/des", "\x10\x15\x1f-+\x9c\x01\x03"}, - {"crypto/dsa", "D\x04)\x84\x01\r"}, - {"crypto/ecdh", "\x03\v\f\x10\x04\x16\x04\r\x1c\x84\x01"}, - {"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x10\a\v\x06\x01\x04\f\x01\x1c\x84\x01\r\x05K\x01"}, - {"crypto/ed25519", "\x0e\x1e\x11\a\n\a\x1c\x84\x01C"}, - {"crypto/elliptic", "2?\x84\x01\r9"}, + {"context", "s\\p\x01\r"}, + {"crypto", "\x89\x01pC"}, + {"crypto/aes", "\x10\n\t\x99\x02"}, + {"crypto/cipher", "\x03 \x01\x01 \x12\x1c,Z"}, + {"crypto/des", "\x10\x15 .,\x9d\x01\x03"}, + {"crypto/dsa", "E\x04*\x86\x01\r"}, + {"crypto/ecdh", "\x03\v\f\x10\x04\x17\x04\x0e\x1c\x86\x01"}, + {"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x10\b\v\x06\x01\x04\r\x01\x1c\x86\x01\r\x05K\x01"}, + {"crypto/ed25519", "\x0e\x1e\x12\a\v\a\x1c\x86\x01C"}, + {"crypto/elliptic", "3@\x86\x01\r9"}, {"crypto/fips140", "\"\x05"}, - {"crypto/hkdf", "/\x14\x01-\x15"}, - {"crypto/hmac", "\x1a\x16\x13\x01\x111"}, - {"crypto/internal/boring", "\x0e\x02\ri"}, - {"crypto/internal/boring/bbig", "\x1a\xe8\x01M"}, - {"crypto/internal/boring/bcache", "\xbc\x02\x13"}, + {"crypto/hkdf", "/\x15\x01.\x16"}, + {"crypto/hmac", "\x1a\x16\x14\x01\x122"}, + {"crypto/internal/boring", "\x0e\x02\rl"}, + {"crypto/internal/boring/bbig", "\x1a\xec\x01M"}, + {"crypto/internal/boring/bcache", "\xc0\x02\x13"}, {"crypto/internal/boring/sig", ""}, {"crypto/internal/constanttime", ""}, - {"crypto/internal/cryptotest", "\x03\r\n\b%\x0e\x19\x06\x12\x12 \x04\x06\t\x18\x01\x11\x11\x1b\x01\a\x05\b\x03\x05\v"}, - {"crypto/internal/entropy", "I"}, - {"crypto/internal/entropy/v1.0.0", "B/\x93\x018\x13"}, - {"crypto/internal/fips140", "A0\xbd\x01\v\x16"}, - {"crypto/internal/fips140/aes", "\x03\x1f\x03\x02\x13\x05\x01\x01\x06*\x93\x014"}, - {"crypto/internal/fips140/aes/gcm", "\"\x01\x02\x02\x02\x11\x05\x01\a*\x90\x01"}, - {"crypto/internal/fips140/alias", "\xcf\x02"}, - {"crypto/internal/fips140/bigmod", "'\x18\x01\a*\x93\x01"}, - {"crypto/internal/fips140/check", "\"\x0e\x06\t\x02\xb4\x01Z"}, - {"crypto/internal/fips140/check/checktest", "'\x87\x02!"}, - {"crypto/internal/fips140/drbg", "\x03\x1e\x01\x01\x04\x13\x05\t\x01(\x84\x01\x0f7\x01"}, - {"crypto/internal/fips140/ecdh", "\x03\x1f\x05\x02\t\r2\x84\x01\x0f7"}, - {"crypto/internal/fips140/ecdsa", "\x03\x1f\x04\x01\x02\a\x02\x069\x15oF"}, - {"crypto/internal/fips140/ed25519", "\x03\x1f\x05\x02\x04\v9\xc7\x01\x03"}, - {"crypto/internal/fips140/edwards25519", "\x1e\t\a\x112\x93\x017"}, - {"crypto/internal/fips140/edwards25519/field", "'\x13\x052\x93\x01"}, - {"crypto/internal/fips140/hkdf", "\x03\x1f\x05\t\x06;\x15"}, - {"crypto/internal/fips140/hmac", "\x03\x1f\x14\x01\x019\x15"}, - {"crypto/internal/fips140/mlkem", "\x03\x1f\x05\x02\x0e\x03\x052\xca\x01"}, - {"crypto/internal/fips140/nistec", "\x1e\t\f\f2\x93\x01*\r\x14"}, - {"crypto/internal/fips140/nistec/fiat", "'\x137\x93\x01"}, - {"crypto/internal/fips140/pbkdf2", "\x03\x1f\x05\t\x06;\x15"}, - {"crypto/internal/fips140/rsa", "\x03\x1b\x04\x04\x01\x02\r\x01\x01\x027\x15oF"}, - {"crypto/internal/fips140/sha256", "\x03\x1f\x1d\x01\a*\x15~"}, - {"crypto/internal/fips140/sha3", "\x03\x1f\x18\x05\x011\x93\x01K"}, - {"crypto/internal/fips140/sha512", "\x03\x1f\x1d\x01\a*\x15~"}, - {"crypto/internal/fips140/ssh", "'_"}, - {"crypto/internal/fips140/subtle", "\x1e\a\x1a\xc5\x01"}, - {"crypto/internal/fips140/tls12", "\x03\x1f\x05\t\x06\x029\x15"}, - {"crypto/internal/fips140/tls13", "\x03\x1f\x05\b\a\t2\x15"}, - {"crypto/internal/fips140cache", "\xae\x02\r&"}, + {"crypto/internal/cryptotest", "\x03\r\n\b&\x0f\x19\x06\x13\x12 \x04\x06\t\x19\x01\x11\x11\x1b\x01\a\x05\b\x03\x05\v"}, + {"crypto/internal/entropy", "J"}, + {"crypto/internal/entropy/v1.0.0", "C0\x95\x018\x13"}, + {"crypto/internal/fips140", "B1\xbf\x01\v\x16"}, + {"crypto/internal/fips140/aes", "\x03\x1f\x03\x02\x14\x05\x01\x01\x06+\x95\x014"}, + {"crypto/internal/fips140/aes/gcm", "\"\x01\x02\x02\x02\x12\x05\x01\a+\x92\x01"}, + {"crypto/internal/fips140/alias", "\xd3\x02"}, + {"crypto/internal/fips140/bigmod", "'\x19\x01\a+\x95\x01"}, + {"crypto/internal/fips140/check", "\"\x0e\a\t\x02\xb7\x01Z"}, + {"crypto/internal/fips140/check/checktest", "'\x8b\x02!"}, + {"crypto/internal/fips140/drbg", "\x03\x1e\x01\x01\x04\x14\x05\t\x01)\x86\x01\x0f7\x01"}, + {"crypto/internal/fips140/ecdh", "\x03\x1f\x05\x02\n\r3\x86\x01\x0f7"}, + {"crypto/internal/fips140/ecdsa", "\x03\x1f\x04\x01\x02\a\x03\x06:\x16pF"}, + {"crypto/internal/fips140/ed25519", "\x03\x1f\x05\x02\x04\f:\xc9\x01\x03"}, + {"crypto/internal/fips140/edwards25519", "\x1e\t\a\x123\x95\x017"}, + {"crypto/internal/fips140/edwards25519/field", "'\x14\x053\x95\x01"}, + {"crypto/internal/fips140/hkdf", "\x03\x1f\x05\t\a<\x16"}, + {"crypto/internal/fips140/hmac", "\x03\x1f\x15\x01\x01:\x16"}, + {"crypto/internal/fips140/mldsa", "\x03\x1b\x04\x05\x02\x0e\x01\x03\x053\x95\x017"}, + {"crypto/internal/fips140/mlkem", "\x03\x1f\x05\x02\x0f\x03\x053\xcc\x01"}, + {"crypto/internal/fips140/nistec", "\x1e\t\r\f3\x95\x01*\r\x14"}, + {"crypto/internal/fips140/nistec/fiat", "'\x148\x95\x01"}, + {"crypto/internal/fips140/pbkdf2", "\x03\x1f\x05\t\a<\x16"}, + {"crypto/internal/fips140/rsa", "\x03\x1b\x04\x04\x01\x02\x0e\x01\x01\x028\x16pF"}, + {"crypto/internal/fips140/sha256", "\x03\x1f\x1e\x01\a+\x16\x7f"}, + {"crypto/internal/fips140/sha3", "\x03\x1f\x19\x05\x012\x95\x01K"}, + {"crypto/internal/fips140/sha512", "\x03\x1f\x1e\x01\a+\x16\x7f"}, + {"crypto/internal/fips140/ssh", "'b"}, + {"crypto/internal/fips140/subtle", "\x1e\a\x1b\xc8\x01"}, + {"crypto/internal/fips140/tls12", "\x03\x1f\x05\t\a\x02:\x16"}, + {"crypto/internal/fips140/tls13", "\x03\x1f\x05\b\b\t3\x16"}, + {"crypto/internal/fips140cache", "\xb2\x02\r&"}, {"crypto/internal/fips140deps", ""}, - {"crypto/internal/fips140deps/byteorder", "\x9c\x01"}, - {"crypto/internal/fips140deps/cpu", "\xb1\x01\a"}, - {"crypto/internal/fips140deps/godebug", "\xb9\x01"}, - {"crypto/internal/fips140deps/time", "\xc9\x02"}, - {"crypto/internal/fips140hash", "7\x1c3\xc9\x01"}, - {"crypto/internal/fips140only", ")\r\x01\x01N3<"}, + {"crypto/internal/fips140deps/byteorder", "\x9f\x01"}, + {"crypto/internal/fips140deps/cpu", "\xb4\x01\a"}, + {"crypto/internal/fips140deps/godebug", "\xbc\x01"}, + {"crypto/internal/fips140deps/time", "\xcd\x02"}, + {"crypto/internal/fips140hash", "8\x1d4\xca\x01"}, + {"crypto/internal/fips140only", ")\x0e\x01\x01P3="}, {"crypto/internal/fips140test", ""}, - {"crypto/internal/hpke", "\x0e\x01\x01\x03\x056#+hM"}, - {"crypto/internal/impl", "\xb9\x02"}, - {"crypto/internal/randutil", "\xf5\x01\x12"}, - {"crypto/internal/sysrand", "qo! \r\r\x01\x01\f\x06"}, - {"crypto/internal/sysrand/internal/seccomp", "q"}, - {"crypto/md5", "\x0e6-\x15\x16h"}, - {"crypto/mlkem", "1"}, - {"crypto/pbkdf2", "4\x0f\x01-\x15"}, - {"crypto/rand", "\x1a\b\a\x1b\x04\x01(\x84\x01\rM"}, - {"crypto/rc4", "%\x1f-\xc7\x01"}, - {"crypto/rsa", "\x0e\f\x01\v\x0f\x0e\x01\x04\x06\a\x1c\x03\x123<\f\x01"}, - {"crypto/sha1", "\x0e\f*\x03*\x15\x16\x15S"}, - {"crypto/sha256", "\x0e\f\x1cP"}, - {"crypto/sha3", "\x0e)O\xc9\x01"}, - {"crypto/sha512", "\x0e\f\x1eN"}, - {"crypto/subtle", "\x1e\x1c\x9c\x01X"}, - {"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x02\x01\x01\t\x01\r\n\x01\n\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x12\x16\x15\b<\x16\x16\r\b\x01\x01\x01\x02\x01\r\x06\x02\x01\x0f"}, - {"crypto/tls/internal/fips140tls", "\x17\xa5\x02"}, - {"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x015\x05\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x039\x01\x02\b\x01\x01\x02\a\x10\x05\x01\x06\x02\x05\b\x02\x01\x02\x0e\x02\x01\x01\x02\x03\x01"}, - {"crypto/x509/pkix", "g\x06\a\x8e\x01G"}, - {"database/sql", "\x03\nN\x16\x03\x81\x01\v\a\"\x05\b\x02\x03\x01\r\x02\x02\x02"}, - {"database/sql/driver", "\rd\x03\xb5\x01\x0f\x11"}, - {"debug/buildinfo", "\x03[\x02\x01\x01\b\a\x03e\x1a\x02\x01+\x0f\x1f"}, - {"debug/dwarf", "\x03g\a\x03\x81\x011\x11\x01\x01"}, - {"debug/elf", "\x03\x06T\r\a\x03e\x1b\x01\f \x17\x01\x16"}, - {"debug/gosym", "\x03g\n\xc3\x01\x01\x01\x02"}, - {"debug/macho", "\x03\x06T\r\ne\x1c,\x17\x01"}, - {"debug/pe", "\x03\x06T\r\a\x03e\x1c,\x17\x01\x16"}, - {"debug/plan9obj", "j\a\x03e\x1c,"}, - {"embed", "q*A\x19\x01S"}, + {"crypto/internal/hpke", "\x03\v\x01\x01\x03\x055\x03\x04\x01\x01\x16\a\x03\x13\xcc\x01"}, + {"crypto/internal/impl", "\xbd\x02"}, + {"crypto/internal/randutil", "\xf9\x01\x12"}, + {"crypto/internal/sysrand", "sq! \r\r\x01\x01\f\x06"}, + {"crypto/internal/sysrand/internal/seccomp", "s"}, + {"crypto/md5", "\x0e7.\x16\x16i"}, + {"crypto/mlkem", "\x0e$"}, + {"crypto/mlkem/mlkemtest", "2\x1b&"}, + {"crypto/pbkdf2", "5\x0f\x01.\x16"}, + {"crypto/rand", "\x1a\b\a\x1c\x04\x01)\x86\x01\rM"}, + {"crypto/rc4", "% .\xc9\x01"}, + {"crypto/rsa", "\x0e\f\x01\v\x10\x0e\x01\x04\a\a\x1c\x03\x133=\f\x01"}, + {"crypto/sha1", "\x0e\f+\x03+\x16\x16\x15T"}, + {"crypto/sha256", "\x0e\f\x1dR"}, + {"crypto/sha3", "\x0e*Q\xca\x01"}, + {"crypto/sha512", "\x0e\f\x1fP"}, + {"crypto/subtle", "\x1e\x1d\x9f\x01X"}, + {"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x02\x01\x01\t\x01\x0e\n\x01\n\x05\x04\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x13\x16\x15\b=\x16\x16\r\b\x01\x01\x01\x02\x01\r\x06\x02\x01\x0f"}, + {"crypto/tls/internal/fips140tls", "\x17\xa9\x02"}, + {"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x016\x06\x01\x01\x02\x05\x0e\x06\x02\x02\x03F\x03:\x01\x02\b\x01\x01\x02\a\x10\x05\x01\x06\a\b\x02\x01\x02\x0e\x02\x01\x01\x02\x03\x01"}, + {"crypto/x509/pkix", "i\x06\a\x90\x01G"}, + {"database/sql", "\x03\nP\x16\x03\x83\x01\v\a\"\x05\b\x02\x03\x01\r\x02\x02\x02"}, + {"database/sql/driver", "\rf\x03\xb7\x01\x0f\x11"}, + {"debug/buildinfo", "\x03]\x02\x01\x01\b\a\x03g\x1a\x02\x01+\x0f\x1f"}, + {"debug/dwarf", "\x03i\a\x03\x83\x011\x11\x01\x01"}, + {"debug/elf", "\x03\x06V\r\a\x03g\x1b\x01\f \x17\x01\x16"}, + {"debug/gosym", "\x03i\n\xc5\x01\x01\x01\x02"}, + {"debug/macho", "\x03\x06V\r\ng\x1c,\x17\x01"}, + {"debug/pe", "\x03\x06V\r\a\x03g\x1c,\x17\x01\x16"}, + {"debug/plan9obj", "l\a\x03g\x1c,"}, + {"embed", "s+B\x19\x01S"}, {"embed/internal/embedtest", ""}, {"encoding", ""}, - {"encoding/ascii85", "\xf5\x01C"}, - {"encoding/asn1", "\x03n\x03e(\x01'\r\x02\x01\x10\x03\x01"}, - {"encoding/base32", "\xf5\x01A\x02"}, - {"encoding/base64", "\x9c\x01YA\x02"}, - {"encoding/binary", "q\x84\x01\f(\r\x05"}, - {"encoding/csv", "\x02\x01n\x03\x81\x01D\x12\x02"}, - {"encoding/gob", "\x02c\x05\a\x03e\x1c\v\x01\x03\x1d\b\x12\x01\x0f\x02"}, - {"encoding/hex", "q\x03\x81\x01A\x03"}, - {"encoding/json", "\x03\x01a\x04\b\x03\x81\x01\f(\r\x02\x01\x02\x10\x01\x01\x02"}, - {"encoding/pem", "\x03f\b\x84\x01A\x03"}, - {"encoding/xml", "\x02\x01b\f\x03\x81\x014\x05\n\x01\x02\x10\x02"}, - {"errors", "\xcc\x01\x83\x01"}, - {"expvar", "nK@\b\v\x15\r\b\x02\x03\x01\x11"}, - {"flag", "e\f\x03\x81\x01,\b\x05\b\x02\x01\x10"}, - {"fmt", "qE&\x19\f \b\r\x02\x03\x12"}, - {"go/ast", "\x03\x01p\x0e\x01r\x03)\b\r\x02\x01\x12\x02"}, - {"go/build", "\x02\x01n\x03\x01\x02\x02\a\x02\x01\x17\x1f\x04\x02\b\x1b\x13\x01+\x01\x04\x01\a\b\x02\x01\x12\x02\x02"}, - {"go/build/constraint", "q\xc7\x01\x01\x12\x02"}, - {"go/constant", "t\x0f~\x01\x024\x01\x02\x12"}, - {"go/doc", "\x04p\x01\x05\t=51\x10\x02\x01\x12\x02"}, - {"go/doc/comment", "\x03q\xc2\x01\x01\x01\x01\x12\x02"}, - {"go/format", "\x03q\x01\v\x01\x02rD"}, - {"go/importer", "v\a\x01\x01\x04\x01q9"}, - {"go/internal/gccgoimporter", "\x02\x01[\x13\x03\x04\v\x01o\x02,\x01\x05\x11\x01\f\b"}, - {"go/internal/gcimporter", "\x02r\x0f\x010\x05\r/,\x15\x03\x02"}, - {"go/internal/srcimporter", "t\x01\x01\n\x03\x01q,\x01\x05\x12\x02\x14"}, - {"go/parser", "\x03n\x03\x01\x02\v\x01r\x01+\x06\x12"}, - {"go/printer", "t\x01\x02\x03\tr\f \x15\x02\x01\x02\v\x05\x02"}, - {"go/scanner", "\x03q\x0fr2\x10\x01\x13\x02"}, - {"go/token", "\x04p\x84\x01>\x02\x03\x01\x0f\x02"}, - {"go/types", "\x03\x01\x06g\x03\x01\x03\b\x03\x024\x062\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x0f\x02\x02"}, - {"go/version", "\xbe\x01{"}, - {"hash", "\xf5\x01"}, - {"hash/adler32", "q\x15\x16"}, - {"hash/crc32", "q\x15\x16\x15\x8a\x01\x01\x13"}, - {"hash/crc64", "q\x15\x16\x9f\x01"}, - {"hash/fnv", "q\x15\x16h"}, - {"hash/maphash", "\x86\x01\x11<|"}, - {"html", "\xb9\x02\x02\x12"}, - {"html/template", "\x03k\x06\x18-<\x01\n!\x05\x01\x02\x03\f\x01\x02\f\x01\x03\x02"}, - {"image", "\x02o\x1ef\x0f4\x03\x01"}, + {"encoding/ascii85", "\xf9\x01C"}, + {"encoding/asn1", "\x03p\x03g(\x01'\r\x02\x01\x10\x03\x01"}, + {"encoding/base32", "\xf9\x01A\x02"}, + {"encoding/base64", "\x9f\x01ZA\x02"}, + {"encoding/binary", "s\x86\x01\f(\r\x05"}, + {"encoding/csv", "\x02\x01p\x03\x83\x01D\x12\x02"}, + {"encoding/gob", "\x02e\x05\a\x03g\x1c\v\x01\x03\x1d\b\x12\x01\x0f\x02"}, + {"encoding/hex", "s\x03\x83\x01A\x03"}, + {"encoding/json", "\x03\x01c\x04\b\x03\x83\x01\f(\r\x02\x01\x02\x10\x01\x01\x02"}, + {"encoding/pem", "\x03h\b\x86\x01A\x03"}, + {"encoding/xml", "\x02\x01d\f\x03\x83\x014\x05\n\x01\x02\x10\x02"}, + {"errors", "\xcf\x01\x84\x01"}, + {"expvar", "pLA\b\v\x15\r\b\x02\x03\x01\x11"}, + {"flag", "g\f\x03\x83\x01,\b\x05\b\x02\x01\x10"}, + {"fmt", "sF'\x19\f \b\r\x02\x03\x12"}, + {"go/ast", "\x03\x01r\x0f\x01s\x03)\b\r\x02\x01\x12\x02"}, + {"go/build", "\x02\x01p\x03\x01\x02\x02\b\x02\x01\x17\x1f\x04\x02\b\x1c\x13\x01+\x01\x04\x01\a\b\x02\x01\x12\x02\x02"}, + {"go/build/constraint", "s\xc9\x01\x01\x12\x02"}, + {"go/constant", "v\x10\x7f\x01\x024\x01\x02\x12"}, + {"go/doc", "\x04r\x01\x05\n=61\x10\x02\x01\x12\x02"}, + {"go/doc/comment", "\x03s\xc4\x01\x01\x01\x01\x12\x02"}, + {"go/format", "\x03s\x01\f\x01\x02sD"}, + {"go/importer", "x\a\x01\x02\x04\x01r9"}, + {"go/internal/gccgoimporter", "\x02\x01]\x13\x03\x04\f\x01p\x02,\x01\x05\x11\x01\f\b"}, + {"go/internal/gcimporter", "\x02t\x10\x010\x05\r0,\x15\x03\x02"}, + {"go/internal/scannerhooks", "\x86\x01"}, + {"go/internal/srcimporter", "v\x01\x01\v\x03\x01r,\x01\x05\x12\x02\x14"}, + {"go/parser", "\x03p\x03\x01\x02\b\x04\x01s\x01+\x06\x12"}, + {"go/printer", "v\x01\x02\x03\ns\f \x15\x02\x01\x02\v\x05\x02"}, + {"go/scanner", "\x03s\v\x05s2\x10\x01\x13\x02"}, + {"go/token", "\x04r\x86\x01>\x02\x03\x01\x0f\x02"}, + {"go/types", "\x03\x01\x06i\x03\x01\x03\t\x03\x024\x063\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x0f\x02\x02"}, + {"go/version", "\xc1\x01|"}, + {"hash", "\xf9\x01"}, + {"hash/adler32", "s\x16\x16"}, + {"hash/crc32", "s\x16\x16\x15\x8b\x01\x01\x13"}, + {"hash/crc64", "s\x16\x16\xa0\x01"}, + {"hash/fnv", "s\x16\x16i"}, + {"hash/maphash", "\x89\x01\x11<}"}, + {"html", "\xbd\x02\x02\x12"}, + {"html/template", "\x03m\x06\x19-=\x01\n!\x05\x01\x02\x03\f\x01\x02\f\x01\x03\x02"}, + {"image", "\x02q\x1fg\x0f4\x03\x01"}, {"image/color", ""}, - {"image/color/palette", "\x8f\x01"}, - {"image/draw", "\x8e\x01\x01\x04"}, - {"image/gif", "\x02\x01\x05i\x03\x1a\x01\x01\x01\vY"}, - {"image/internal/imageutil", "\x8e\x01"}, - {"image/jpeg", "\x02o\x1d\x01\x04b"}, - {"image/png", "\x02\aa\n\x12\x02\x06\x01fC"}, - {"index/suffixarray", "\x03g\a\x84\x01\f+\n\x01"}, - {"internal/abi", "\xb8\x01\x97\x01"}, - {"internal/asan", "\xcf\x02"}, - {"internal/bisect", "\xae\x02\r\x01"}, - {"internal/buildcfg", "tGf\x06\x02\x05\n\x01"}, - {"internal/bytealg", "\xb1\x01\x9e\x01"}, + {"image/color/palette", "\x92\x01"}, + {"image/draw", "\x91\x01\x01\x04"}, + {"image/gif", "\x02\x01\x05k\x03\x1b\x01\x01\x01\vZ\x0f"}, + {"image/internal/imageutil", "\x91\x01"}, + {"image/jpeg", "\x02q\x1e\x01\x04c"}, + {"image/png", "\x02\ac\n\x13\x02\x06\x01gC"}, + {"index/suffixarray", "\x03i\a\x86\x01\f+\n\x01"}, + {"internal/abi", "\xbb\x01\x98\x01"}, + {"internal/asan", "\xd3\x02"}, + {"internal/bisect", "\xb2\x02\r\x01"}, + {"internal/buildcfg", "vHg\x06\x02\x05\n\x01"}, + {"internal/bytealg", "\xb4\x01\x9f\x01"}, {"internal/byteorder", ""}, {"internal/cfg", ""}, - {"internal/cgrouptest", "tZS\x06\x0f\x02\x01\x04\x01"}, - {"internal/chacha8rand", "\x9c\x01\x15\a\x97\x01"}, + {"internal/cgrouptest", "v[T\x06\x0f\x02\x01\x04\x01"}, + {"internal/chacha8rand", "\x9f\x01\x15\a\x98\x01"}, {"internal/copyright", ""}, {"internal/coverage", ""}, {"internal/coverage/calloc", ""}, - {"internal/coverage/cfile", "n\x06\x16\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01\"\x02&,\x06\a\n\x01\x03\r\x06"}, - {"internal/coverage/cformat", "\x04p-\x04P\v6\x01\x02\r"}, - {"internal/coverage/cmerge", "t-`"}, - {"internal/coverage/decodecounter", "j\n-\v\x02G,\x17\x17"}, - {"internal/coverage/decodemeta", "\x02h\n\x16\x17\v\x02G,"}, - {"internal/coverage/encodecounter", "\x02h\n-\f\x01\x02E\v!\x15"}, - {"internal/coverage/encodemeta", "\x02\x01g\n\x12\x04\x17\r\x02E,."}, - {"internal/coverage/pods", "\x04p-\x80\x01\x06\x05\n\x02\x01"}, - {"internal/coverage/rtcov", "\xcf\x02"}, - {"internal/coverage/slicereader", "j\n\x81\x01Z"}, - {"internal/coverage/slicewriter", "t\x81\x01"}, - {"internal/coverage/stringtab", "t8\x04E"}, + {"internal/coverage/cfile", "p\x06\x17\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01\"\x02',\x06\a\n\x01\x03\r\x06"}, + {"internal/coverage/cformat", "\x04r.\x04Q\v6\x01\x02\r"}, + {"internal/coverage/cmerge", "v.a"}, + {"internal/coverage/decodecounter", "l\n.\v\x02H,\x17\x17"}, + {"internal/coverage/decodemeta", "\x02j\n\x17\x17\v\x02H,"}, + {"internal/coverage/encodecounter", "\x02j\n.\f\x01\x02F\v!\x15"}, + {"internal/coverage/encodemeta", "\x02\x01i\n\x13\x04\x17\r\x02F,."}, + {"internal/coverage/pods", "\x04r.\x81\x01\x06\x05\n\x02\x01"}, + {"internal/coverage/rtcov", "\xd3\x02"}, + {"internal/coverage/slicereader", "l\n\x83\x01Z"}, + {"internal/coverage/slicewriter", "v\x83\x01"}, + {"internal/coverage/stringtab", "v9\x04F"}, {"internal/coverage/test", ""}, {"internal/coverage/uleb128", ""}, - {"internal/cpu", "\xcf\x02"}, - {"internal/dag", "\x04p\xc2\x01\x03"}, - {"internal/diff", "\x03q\xc3\x01\x02"}, - {"internal/exportdata", "\x02\x01n\x03\x02c\x1c,\x01\x05\x11\x01\x02"}, - {"internal/filepathlite", "q*A\x1a@"}, - {"internal/fmtsort", "\x04\xa5\x02\r"}, - {"internal/fuzz", "\x03\nE\x18\x04\x03\x03\x01\v\x036<\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\f\x04\x02"}, + {"internal/cpu", "\xd3\x02"}, + {"internal/dag", "\x04r\xc4\x01\x03"}, + {"internal/diff", "\x03s\xc5\x01\x02"}, + {"internal/exportdata", "\x02\x01p\x03\x02e\x1c,\x01\x05\x11\x01\x02"}, + {"internal/filepathlite", "s+B\x1a@"}, + {"internal/fmtsort", "\x04\xa9\x02\r"}, + {"internal/fuzz", "\x03\nG\x18\x04\x03\x03\x01\f\x036=\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\f\x04\x02"}, {"internal/goarch", ""}, - {"internal/godebug", "\x99\x01!\x81\x01\x01\x13"}, + {"internal/godebug", "\x9c\x01!\x82\x01\x01\x13"}, {"internal/godebugs", ""}, {"internal/goexperiment", ""}, {"internal/goos", ""}, - {"internal/goroot", "\xa1\x02\x01\x05\x12\x02"}, + {"internal/goroot", "\xa5\x02\x01\x05\x12\x02"}, {"internal/gover", "\x04"}, {"internal/goversion", ""}, - {"internal/lazyregexp", "\xa1\x02\v\r\x02"}, - {"internal/lazytemplate", "\xf5\x01,\x18\x02\f"}, - {"internal/msan", "\xcf\x02"}, + {"internal/lazyregexp", "\xa5\x02\v\r\x02"}, + {"internal/lazytemplate", "\xf9\x01,\x18\x02\f"}, + {"internal/msan", "\xd3\x02"}, {"internal/nettrace", ""}, - {"internal/obscuretestdata", "i\x8c\x01,"}, - {"internal/oserror", "q"}, - {"internal/pkgbits", "\x03O\x18\a\x03\x04\vr\r\x1f\r\n\x01"}, + {"internal/obscuretestdata", "k\x8e\x01,"}, + {"internal/oserror", "s"}, + {"internal/pkgbits", "\x03Q\x18\a\x03\x04\fs\r\x1f\r\n\x01"}, {"internal/platform", ""}, - {"internal/poll", "qj\x05\x159\r\x01\x01\f\x06"}, - {"internal/profile", "\x03\x04j\x03\x81\x017\n\x01\x01\x01\x10"}, + {"internal/poll", "sl\x05\x159\r\x01\x01\f\x06"}, + {"internal/profile", "\x03\x04l\x03\x83\x017\n\x01\x01\x01\x10"}, {"internal/profilerecord", ""}, - {"internal/race", "\x97\x01\xb8\x01"}, - {"internal/reflectlite", "\x97\x01!:\x16"}, - {"vendor/golang.org/x/text/unicode/norm", "j\n\x81\x01F\x12\x11"}, - {"weak", "\x97\x01\x97\x01!"}, + {"vendor/golang.org/x/crypto/internal/alias", "\xd3\x02"}, + {"vendor/golang.org/x/crypto/internal/poly1305", "W\x15\x9c\x01"}, + {"vendor/golang.org/x/net/dns/dnsmessage", "s\xc7\x01"}, + {"vendor/golang.org/x/net/http/httpguts", "\x8f\x02\x14\x1a\x14\r"}, + {"vendor/golang.org/x/net/http/httpproxy", "s\x03\x99\x01\x10\x05\x01\x18\x14\r"}, + {"vendor/golang.org/x/net/http2/hpack", "\x03p\x03\x83\x01F"}, + {"vendor/golang.org/x/net/idna", "v\x8f\x018\x14\x10\x02\x01"}, + {"vendor/golang.org/x/net/nettest", "\x03i\a\x03\x83\x01\x11\x05\x16\x01\f\n\x01\x02\x02\x01\v"}, + {"vendor/golang.org/x/sys/cpu", "\xa5\x02\r\n\x01\x16"}, + {"vendor/golang.org/x/text/secure/bidirule", "s\xde\x01\x11\x01"}, + {"vendor/golang.org/x/text/transform", "\x03p\x86\x01X"}, + {"vendor/golang.org/x/text/unicode/bidi", "\x03\bk\x87\x01>\x16"}, + {"vendor/golang.org/x/text/unicode/norm", "l\n\x83\x01F\x12\x11"}, + {"weak", "\x9a\x01\x98\x01!"}, } // bootstrap is the list of bootstrap packages extracted from cmd/dist. @@ -385,6 +389,7 @@ var bootstrap = map[string]bool{ "cmd/compile/internal/arm64": true, "cmd/compile/internal/base": true, "cmd/compile/internal/bitvec": true, + "cmd/compile/internal/bloop": true, "cmd/compile/internal/compare": true, "cmd/compile/internal/coverage": true, "cmd/compile/internal/deadlocals": true, @@ -413,6 +418,7 @@ var bootstrap = map[string]bool{ "cmd/compile/internal/riscv64": true, "cmd/compile/internal/rttype": true, "cmd/compile/internal/s390x": true, + "cmd/compile/internal/slice": true, "cmd/compile/internal/ssa": true, "cmd/compile/internal/ssagen": true, "cmd/compile/internal/staticdata": true, diff --git a/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/vendor/golang.org/x/tools/internal/stdlib/manifest.go index 362f23c436..f1e24625a7 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/manifest.go +++ b/vendor/golang.org/x/tools/internal/stdlib/manifest.go @@ -16,6 +16,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).Flush", Method, 0, ""}, {"(*Writer).Write", Method, 0, ""}, {"(*Writer).WriteHeader", Method, 0, ""}, + {"(FileInfoNames).Gname", Method, 23, ""}, + {"(FileInfoNames).IsDir", Method, 23, ""}, + {"(FileInfoNames).ModTime", Method, 23, ""}, + {"(FileInfoNames).Mode", Method, 23, ""}, + {"(FileInfoNames).Name", Method, 23, ""}, + {"(FileInfoNames).Size", Method, 23, ""}, + {"(FileInfoNames).Sys", Method, 23, ""}, + {"(FileInfoNames).Uname", Method, 23, ""}, {"(Format).String", Method, 10, ""}, {"ErrFieldTooLong", Var, 0, ""}, {"ErrHeader", Var, 0, ""}, @@ -338,6 +346,9 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).Write", Method, 0, ""}, {"(CorruptInputError).Error", Method, 0, ""}, {"(InternalError).Error", Method, 0, ""}, + {"(Reader).Read", Method, 0, ""}, + {"(Reader).ReadByte", Method, 0, ""}, + {"(Resetter).Reset", Method, 4, ""}, {"BestCompression", Const, 0, ""}, {"BestSpeed", Const, 0, ""}, {"CorruptInputError", Type, 0, ""}, @@ -409,6 +420,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).Flush", Method, 0, ""}, {"(*Writer).Reset", Method, 2, ""}, {"(*Writer).Write", Method, 0, ""}, + {"(Resetter).Reset", Method, 4, ""}, {"BestCompression", Const, 0, ""}, {"BestSpeed", Const, 0, ""}, {"DefaultCompression", Const, 0, ""}, @@ -426,6 +438,11 @@ var PackageSymbols = map[string][]Symbol{ {"Writer", Type, 0, ""}, }, "container/heap": { + {"(Interface).Len", Method, 0, ""}, + {"(Interface).Less", Method, 0, ""}, + {"(Interface).Pop", Method, 0, ""}, + {"(Interface).Push", Method, 0, ""}, + {"(Interface).Swap", Method, 0, ""}, {"Fix", Func, 2, "func(h Interface, i int)"}, {"Init", Func, 0, "func(h Interface)"}, {"Interface", Type, 0, ""}, @@ -469,6 +486,10 @@ var PackageSymbols = map[string][]Symbol{ {"Ring.Value", Field, 0, ""}, }, "context": { + {"(Context).Deadline", Method, 7, ""}, + {"(Context).Done", Method, 7, ""}, + {"(Context).Err", Method, 7, ""}, + {"(Context).Value", Method, 7, ""}, {"AfterFunc", Func, 21, "func(ctx Context, f func()) (stop func() bool)"}, {"Background", Func, 7, "func() Context"}, {"CancelCauseFunc", Type, 20, ""}, @@ -488,17 +509,31 @@ var PackageSymbols = map[string][]Symbol{ {"WithoutCancel", Func, 21, "func(parent Context) Context"}, }, "crypto": { + {"(Decapsulator).Decapsulate", Method, 26, ""}, + {"(Decapsulator).Encapsulator", Method, 26, ""}, + {"(Decrypter).Decrypt", Method, 5, ""}, + {"(Decrypter).Public", Method, 5, ""}, + {"(Encapsulator).Bytes", Method, 26, ""}, + {"(Encapsulator).Encapsulate", Method, 26, ""}, {"(Hash).Available", Method, 0, ""}, {"(Hash).HashFunc", Method, 4, ""}, {"(Hash).New", Method, 0, ""}, {"(Hash).Size", Method, 0, ""}, {"(Hash).String", Method, 15, ""}, + {"(MessageSigner).Public", Method, 25, ""}, + {"(MessageSigner).Sign", Method, 25, ""}, + {"(MessageSigner).SignMessage", Method, 25, ""}, + {"(Signer).Public", Method, 4, ""}, + {"(Signer).Sign", Method, 4, ""}, + {"(SignerOpts).HashFunc", Method, 4, ""}, {"BLAKE2b_256", Const, 9, ""}, {"BLAKE2b_384", Const, 9, ""}, {"BLAKE2b_512", Const, 9, ""}, {"BLAKE2s_256", Const, 9, ""}, + {"Decapsulator", Type, 26, ""}, {"Decrypter", Type, 5, ""}, {"DecrypterOpts", Type, 5, ""}, + {"Encapsulator", Type, 26, ""}, {"Hash", Type, 0, ""}, {"MD4", Const, 0, ""}, {"MD5", Const, 0, ""}, @@ -530,6 +565,16 @@ var PackageSymbols = map[string][]Symbol{ {"NewCipher", Func, 0, "func(key []byte) (cipher.Block, error)"}, }, "crypto/cipher": { + {"(AEAD).NonceSize", Method, 2, ""}, + {"(AEAD).Open", Method, 2, ""}, + {"(AEAD).Overhead", Method, 2, ""}, + {"(AEAD).Seal", Method, 2, ""}, + {"(Block).BlockSize", Method, 0, ""}, + {"(Block).Decrypt", Method, 0, ""}, + {"(Block).Encrypt", Method, 0, ""}, + {"(BlockMode).BlockSize", Method, 0, ""}, + {"(BlockMode).CryptBlocks", Method, 0, ""}, + {"(Stream).XORKeyStream", Method, 0, ""}, {"(StreamReader).Read", Method, 0, ""}, {"(StreamWriter).Close", Method, 0, ""}, {"(StreamWriter).Write", Method, 0, ""}, @@ -594,7 +639,13 @@ var PackageSymbols = map[string][]Symbol{ {"(*PublicKey).Bytes", Method, 20, ""}, {"(*PublicKey).Curve", Method, 20, ""}, {"(*PublicKey).Equal", Method, 20, ""}, - {"Curve", Type, 20, ""}, + {"(Curve).GenerateKey", Method, 20, ""}, + {"(Curve).NewPrivateKey", Method, 20, ""}, + {"(Curve).NewPublicKey", Method, 20, ""}, + {"(KeyExchanger).Curve", Method, 26, ""}, + {"(KeyExchanger).ECDH", Method, 26, ""}, + {"(KeyExchanger).PublicKey", Method, 26, ""}, + {"KeyExchanger", Type, 26, ""}, {"P256", Func, 20, "func() Curve"}, {"P384", Func, 20, "func() Curve"}, {"P521", Func, 20, "func() Curve"}, @@ -667,6 +718,12 @@ var PackageSymbols = map[string][]Symbol{ {"(*CurveParams).Params", Method, 0, ""}, {"(*CurveParams).ScalarBaseMult", Method, 0, ""}, {"(*CurveParams).ScalarMult", Method, 0, ""}, + {"(Curve).Add", Method, 0, ""}, + {"(Curve).Double", Method, 0, ""}, + {"(Curve).IsOnCurve", Method, 0, ""}, + {"(Curve).Params", Method, 0, ""}, + {"(Curve).ScalarBaseMult", Method, 0, ""}, + {"(Curve).ScalarMult", Method, 0, ""}, {"Curve", Type, 0, ""}, {"CurveParams", Type, 0, ""}, {"CurveParams.B", Field, 0, ""}, @@ -688,6 +745,7 @@ var PackageSymbols = map[string][]Symbol{ }, "crypto/fips140": { {"Enabled", Func, 24, "func() bool"}, + {"Version", Func, 26, "func() string"}, }, "crypto/hkdf": { {"Expand", Func, 24, "func[H hash.Hash](h func() H, pseudorandomKey []byte, info string, keyLength int) ([]byte, error)"}, @@ -708,9 +766,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*DecapsulationKey1024).Bytes", Method, 24, ""}, {"(*DecapsulationKey1024).Decapsulate", Method, 24, ""}, {"(*DecapsulationKey1024).EncapsulationKey", Method, 24, ""}, + {"(*DecapsulationKey1024).Encapsulator", Method, 26, ""}, {"(*DecapsulationKey768).Bytes", Method, 24, ""}, {"(*DecapsulationKey768).Decapsulate", Method, 24, ""}, {"(*DecapsulationKey768).EncapsulationKey", Method, 24, ""}, + {"(*DecapsulationKey768).Encapsulator", Method, 26, ""}, {"(*EncapsulationKey1024).Bytes", Method, 24, ""}, {"(*EncapsulationKey1024).Encapsulate", Method, 24, ""}, {"(*EncapsulationKey768).Bytes", Method, 24, ""}, @@ -732,6 +792,10 @@ var PackageSymbols = map[string][]Symbol{ {"SeedSize", Const, 24, ""}, {"SharedKeySize", Const, 24, ""}, }, + "crypto/mlkem/mlkemtest": { + {"Encapsulate1024", Func, 26, "func(ek *mlkem.EncapsulationKey1024, random []byte) (sharedKey []byte, ciphertext []byte, err error)"}, + {"Encapsulate768", Func, 26, "func(ek *mlkem.EncapsulationKey768, random []byte) (sharedKey []byte, ciphertext []byte, err error)"}, + }, "crypto/pbkdf2": { {"Key", Func, 24, "func[Hash hash.Hash](h func() Hash, password string, salt []byte, iter int, keyLength int) ([]byte, error)"}, }, @@ -769,6 +833,7 @@ var PackageSymbols = map[string][]Symbol{ {"DecryptPKCS1v15", Func, 0, "func(random io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)"}, {"DecryptPKCS1v15SessionKey", Func, 0, "func(random io.Reader, priv *PrivateKey, ciphertext []byte, key []byte) error"}, {"EncryptOAEP", Func, 0, "func(hash hash.Hash, random io.Reader, pub *PublicKey, msg []byte, label []byte) ([]byte, error)"}, + {"EncryptOAEPWithOptions", Func, 26, "func(random io.Reader, pub *PublicKey, msg []byte, opts *OAEPOptions) ([]byte, error)"}, {"EncryptPKCS1v15", Func, 0, "func(random io.Reader, pub *PublicKey, msg []byte) ([]byte, error)"}, {"ErrDecryption", Var, 0, ""}, {"ErrMessageTooLong", Var, 0, ""}, @@ -921,6 +986,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*SessionState).Bytes", Method, 21, ""}, {"(AlertError).Error", Method, 21, ""}, {"(ClientAuthType).String", Method, 15, ""}, + {"(ClientSessionCache).Get", Method, 3, ""}, + {"(ClientSessionCache).Put", Method, 3, ""}, {"(CurveID).String", Method, 15, ""}, {"(QUICEncryptionLevel).String", Method, 21, ""}, {"(RecordHeaderError).Error", Method, 6, ""}, @@ -953,6 +1020,7 @@ var PackageSymbols = map[string][]Symbol{ {"ClientHelloInfo.CipherSuites", Field, 4, ""}, {"ClientHelloInfo.Conn", Field, 8, ""}, {"ClientHelloInfo.Extensions", Field, 24, ""}, + {"ClientHelloInfo.HelloRetryRequest", Field, 26, ""}, {"ClientHelloInfo.ServerName", Field, 4, ""}, {"ClientHelloInfo.SignatureSchemes", Field, 8, ""}, {"ClientHelloInfo.SupportedCurves", Field, 4, ""}, @@ -1001,6 +1069,7 @@ var PackageSymbols = map[string][]Symbol{ {"ConnectionState.DidResume", Field, 1, ""}, {"ConnectionState.ECHAccepted", Field, 23, ""}, {"ConnectionState.HandshakeComplete", Field, 0, ""}, + {"ConnectionState.HelloRetryRequest", Field, 26, ""}, {"ConnectionState.NegotiatedProtocol", Field, 0, ""}, {"ConnectionState.NegotiatedProtocolIsMutual", Field, 0, ""}, {"ConnectionState.OCSPResponse", Field, 5, ""}, @@ -1055,8 +1124,10 @@ var PackageSymbols = map[string][]Symbol{ {"QUICEncryptionLevelEarly", Const, 21, ""}, {"QUICEncryptionLevelHandshake", Const, 21, ""}, {"QUICEncryptionLevelInitial", Const, 21, ""}, + {"QUICErrorEvent", Const, 26, ""}, {"QUICEvent", Type, 21, ""}, {"QUICEvent.Data", Field, 21, ""}, + {"QUICEvent.Err", Field, 26, ""}, {"QUICEvent.Kind", Field, 21, ""}, {"QUICEvent.Level", Field, 21, ""}, {"QUICEvent.SessionState", Field, 23, ""}, @@ -1151,8 +1222,10 @@ var PackageSymbols = map[string][]Symbol{ {"(*RevocationList).CheckSignatureFrom", Method, 19, ""}, {"(CertificateInvalidError).Error", Method, 0, ""}, {"(ConstraintViolationError).Error", Method, 0, ""}, + {"(ExtKeyUsage).String", Method, 26, ""}, {"(HostnameError).Error", Method, 0, ""}, {"(InsecureAlgorithmError).Error", Method, 6, ""}, + {"(KeyUsage).String", Method, 26, ""}, {"(OID).AppendBinary", Method, 24, ""}, {"(OID).AppendText", Method, 24, ""}, {"(OID).Equal", Method, 22, ""}, @@ -1516,6 +1589,9 @@ var PackageSymbols = map[string][]Symbol{ {"(NullInt64).Value", Method, 0, ""}, {"(NullString).Value", Method, 0, ""}, {"(NullTime).Value", Method, 13, ""}, + {"(Result).LastInsertId", Method, 0, ""}, + {"(Result).RowsAffected", Method, 0, ""}, + {"(Scanner).Scan", Method, 0, ""}, {"ColumnType", Type, 8, ""}, {"Conn", Type, 9, ""}, {"DB", Type, 0, ""}, @@ -1547,8 +1623,6 @@ var PackageSymbols = map[string][]Symbol{ {"NamedArg.Name", Field, 8, ""}, {"NamedArg.Value", Field, 8, ""}, {"Null", Type, 22, ""}, - {"Null.V", Field, 22, ""}, - {"Null.Valid", Field, 22, ""}, {"NullBool", Type, 0, ""}, {"NullBool.Bool", Field, 0, ""}, {"NullBool.Valid", Field, 0, ""}, @@ -1591,10 +1665,72 @@ var PackageSymbols = map[string][]Symbol{ {"TxOptions.ReadOnly", Field, 8, ""}, }, "database/sql/driver": { + {"(ColumnConverter).ColumnConverter", Method, 0, ""}, + {"(Conn).Begin", Method, 0, ""}, + {"(Conn).Close", Method, 0, ""}, + {"(Conn).Prepare", Method, 0, ""}, + {"(ConnBeginTx).BeginTx", Method, 8, ""}, + {"(ConnPrepareContext).PrepareContext", Method, 8, ""}, + {"(Connector).Connect", Method, 10, ""}, + {"(Connector).Driver", Method, 10, ""}, + {"(Driver).Open", Method, 0, ""}, + {"(DriverContext).OpenConnector", Method, 10, ""}, + {"(Execer).Exec", Method, 0, ""}, + {"(ExecerContext).ExecContext", Method, 8, ""}, + {"(NamedValueChecker).CheckNamedValue", Method, 9, ""}, {"(NotNull).ConvertValue", Method, 0, ""}, {"(Null).ConvertValue", Method, 0, ""}, + {"(Pinger).Ping", Method, 8, ""}, + {"(Queryer).Query", Method, 1, ""}, + {"(QueryerContext).QueryContext", Method, 8, ""}, + {"(Result).LastInsertId", Method, 0, ""}, + {"(Result).RowsAffected", Method, 0, ""}, + {"(Rows).Close", Method, 0, ""}, + {"(Rows).Columns", Method, 0, ""}, + {"(Rows).Next", Method, 0, ""}, {"(RowsAffected).LastInsertId", Method, 0, ""}, {"(RowsAffected).RowsAffected", Method, 0, ""}, + {"(RowsColumnScanner).Close", Method, 26, ""}, + {"(RowsColumnScanner).Columns", Method, 26, ""}, + {"(RowsColumnScanner).Next", Method, 26, ""}, + {"(RowsColumnScanner).ScanColumn", Method, 26, ""}, + {"(RowsColumnTypeDatabaseTypeName).Close", Method, 8, ""}, + {"(RowsColumnTypeDatabaseTypeName).ColumnTypeDatabaseTypeName", Method, 8, ""}, + {"(RowsColumnTypeDatabaseTypeName).Columns", Method, 8, ""}, + {"(RowsColumnTypeDatabaseTypeName).Next", Method, 8, ""}, + {"(RowsColumnTypeLength).Close", Method, 8, ""}, + {"(RowsColumnTypeLength).ColumnTypeLength", Method, 8, ""}, + {"(RowsColumnTypeLength).Columns", Method, 8, ""}, + {"(RowsColumnTypeLength).Next", Method, 8, ""}, + {"(RowsColumnTypeNullable).Close", Method, 8, ""}, + {"(RowsColumnTypeNullable).ColumnTypeNullable", Method, 8, ""}, + {"(RowsColumnTypeNullable).Columns", Method, 8, ""}, + {"(RowsColumnTypeNullable).Next", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).Close", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).ColumnTypePrecisionScale", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).Columns", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).Next", Method, 8, ""}, + {"(RowsColumnTypeScanType).Close", Method, 8, ""}, + {"(RowsColumnTypeScanType).ColumnTypeScanType", Method, 8, ""}, + {"(RowsColumnTypeScanType).Columns", Method, 8, ""}, + {"(RowsColumnTypeScanType).Next", Method, 8, ""}, + {"(RowsNextResultSet).Close", Method, 8, ""}, + {"(RowsNextResultSet).Columns", Method, 8, ""}, + {"(RowsNextResultSet).HasNextResultSet", Method, 8, ""}, + {"(RowsNextResultSet).Next", Method, 8, ""}, + {"(RowsNextResultSet).NextResultSet", Method, 8, ""}, + {"(SessionResetter).ResetSession", Method, 10, ""}, + {"(Stmt).Close", Method, 0, ""}, + {"(Stmt).Exec", Method, 0, ""}, + {"(Stmt).NumInput", Method, 0, ""}, + {"(Stmt).Query", Method, 0, ""}, + {"(StmtExecContext).ExecContext", Method, 8, ""}, + {"(StmtQueryContext).QueryContext", Method, 8, ""}, + {"(Tx).Commit", Method, 0, ""}, + {"(Tx).Rollback", Method, 0, ""}, + {"(Validator).IsValid", Method, 15, ""}, + {"(ValueConverter).ConvertValue", Method, 0, ""}, + {"(Valuer).Value", Method, 0, ""}, {"Bool", Var, 0, ""}, {"ColumnConverter", Type, 0, ""}, {"Conn", Type, 0, ""}, @@ -1756,6 +1892,9 @@ var PackageSymbols = map[string][]Symbol{ {"(DecodeError).Error", Method, 0, ""}, {"(Tag).GoString", Method, 0, ""}, {"(Tag).String", Method, 0, ""}, + {"(Type).Common", Method, 0, ""}, + {"(Type).Size", Method, 0, ""}, + {"(Type).String", Method, 0, ""}, {"AddrType", Type, 0, ""}, {"AddrType.BasicType", Field, 0, ""}, {"ArrayType", Type, 0, ""}, @@ -3163,6 +3302,7 @@ var PackageSymbols = map[string][]Symbol{ {"R_LARCH_B16", Const, 20, ""}, {"R_LARCH_B21", Const, 20, ""}, {"R_LARCH_B26", Const, 20, ""}, + {"R_LARCH_CALL36", Const, 26, ""}, {"R_LARCH_CFA", Const, 22, ""}, {"R_LARCH_COPY", Const, 19, ""}, {"R_LARCH_DELETE", Const, 22, ""}, @@ -3220,11 +3360,25 @@ var PackageSymbols = map[string][]Symbol{ {"R_LARCH_SUB64", Const, 19, ""}, {"R_LARCH_SUB8", Const, 19, ""}, {"R_LARCH_SUB_ULEB128", Const, 22, ""}, + {"R_LARCH_TLS_DESC32", Const, 26, ""}, + {"R_LARCH_TLS_DESC64", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_HI12", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_LO20", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_PC_HI12", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_PC_LO20", Const, 26, ""}, + {"R_LARCH_TLS_DESC_CALL", Const, 26, ""}, + {"R_LARCH_TLS_DESC_HI20", Const, 26, ""}, + {"R_LARCH_TLS_DESC_LD", Const, 26, ""}, + {"R_LARCH_TLS_DESC_LO12", Const, 26, ""}, + {"R_LARCH_TLS_DESC_PCREL20_S2", Const, 26, ""}, + {"R_LARCH_TLS_DESC_PC_HI20", Const, 26, ""}, + {"R_LARCH_TLS_DESC_PC_LO12", Const, 26, ""}, {"R_LARCH_TLS_DTPMOD32", Const, 19, ""}, {"R_LARCH_TLS_DTPMOD64", Const, 19, ""}, {"R_LARCH_TLS_DTPREL32", Const, 19, ""}, {"R_LARCH_TLS_DTPREL64", Const, 19, ""}, {"R_LARCH_TLS_GD_HI20", Const, 20, ""}, + {"R_LARCH_TLS_GD_PCREL20_S2", Const, 26, ""}, {"R_LARCH_TLS_GD_PC_HI20", Const, 20, ""}, {"R_LARCH_TLS_IE64_HI12", Const, 20, ""}, {"R_LARCH_TLS_IE64_LO20", Const, 20, ""}, @@ -3235,11 +3389,15 @@ var PackageSymbols = map[string][]Symbol{ {"R_LARCH_TLS_IE_PC_HI20", Const, 20, ""}, {"R_LARCH_TLS_IE_PC_LO12", Const, 20, ""}, {"R_LARCH_TLS_LD_HI20", Const, 20, ""}, + {"R_LARCH_TLS_LD_PCREL20_S2", Const, 26, ""}, {"R_LARCH_TLS_LD_PC_HI20", Const, 20, ""}, {"R_LARCH_TLS_LE64_HI12", Const, 20, ""}, {"R_LARCH_TLS_LE64_LO20", Const, 20, ""}, + {"R_LARCH_TLS_LE_ADD_R", Const, 26, ""}, {"R_LARCH_TLS_LE_HI20", Const, 20, ""}, + {"R_LARCH_TLS_LE_HI20_R", Const, 26, ""}, {"R_LARCH_TLS_LE_LO12", Const, 20, ""}, + {"R_LARCH_TLS_LE_LO12_R", Const, 26, ""}, {"R_LARCH_TLS_TPREL32", Const, 19, ""}, {"R_LARCH_TLS_TPREL64", Const, 19, ""}, {"R_MIPS", Type, 6, ""}, @@ -3944,6 +4102,7 @@ var PackageSymbols = map[string][]Symbol{ {"(FatArch).ImportedSymbols", Method, 3, ""}, {"(FatArch).Section", Method, 3, ""}, {"(FatArch).Segment", Method, 3, ""}, + {"(Load).Raw", Method, 0, ""}, {"(LoadBytes).Raw", Method, 0, ""}, {"(LoadCmd).GoString", Method, 0, ""}, {"(LoadCmd).String", Method, 0, ""}, @@ -4590,6 +4749,12 @@ var PackageSymbols = map[string][]Symbol{ {"FS", Type, 16, ""}, }, "encoding": { + {"(BinaryAppender).AppendBinary", Method, 24, ""}, + {"(BinaryMarshaler).MarshalBinary", Method, 2, ""}, + {"(BinaryUnmarshaler).UnmarshalBinary", Method, 2, ""}, + {"(TextAppender).AppendText", Method, 24, ""}, + {"(TextMarshaler).MarshalText", Method, 2, ""}, + {"(TextUnmarshaler).UnmarshalText", Method, 2, ""}, {"BinaryAppender", Type, 24, ""}, {"BinaryMarshaler", Type, 2, ""}, {"BinaryUnmarshaler", Type, 2, ""}, @@ -4705,6 +4870,17 @@ var PackageSymbols = map[string][]Symbol{ {"URLEncoding", Var, 0, ""}, }, "encoding/binary": { + {"(AppendByteOrder).AppendUint16", Method, 19, ""}, + {"(AppendByteOrder).AppendUint32", Method, 19, ""}, + {"(AppendByteOrder).AppendUint64", Method, 19, ""}, + {"(AppendByteOrder).String", Method, 19, ""}, + {"(ByteOrder).PutUint16", Method, 0, ""}, + {"(ByteOrder).PutUint32", Method, 0, ""}, + {"(ByteOrder).PutUint64", Method, 0, ""}, + {"(ByteOrder).String", Method, 0, ""}, + {"(ByteOrder).Uint16", Method, 0, ""}, + {"(ByteOrder).Uint32", Method, 0, ""}, + {"(ByteOrder).Uint64", Method, 0, ""}, {"Append", Func, 23, "func(buf []byte, order ByteOrder, data any) ([]byte, error)"}, {"AppendByteOrder", Type, 19, ""}, {"AppendUvarint", Func, 19, "func(buf []byte, x uint64) []byte"}, @@ -4767,6 +4943,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*Decoder).DecodeValue", Method, 0, ""}, {"(*Encoder).Encode", Method, 0, ""}, {"(*Encoder).EncodeValue", Method, 0, ""}, + {"(GobDecoder).GobDecode", Method, 0, ""}, + {"(GobEncoder).GobEncode", Method, 0, ""}, {"CommonType", Type, 0, ""}, {"CommonType.Id", Field, 0, ""}, {"CommonType.Name", Field, 0, ""}, @@ -4819,10 +4997,12 @@ var PackageSymbols = map[string][]Symbol{ {"(*UnsupportedTypeError).Error", Method, 0, ""}, {"(*UnsupportedValueError).Error", Method, 0, ""}, {"(Delim).String", Method, 5, ""}, + {"(Marshaler).MarshalJSON", Method, 0, ""}, {"(Number).Float64", Method, 1, ""}, {"(Number).Int64", Method, 1, ""}, {"(Number).String", Method, 1, ""}, {"(RawMessage).MarshalJSON", Method, 8, ""}, + {"(Unmarshaler).UnmarshalJSON", Method, 0, ""}, {"Compact", Func, 0, "func(dst *bytes.Buffer, src []byte) error"}, {"Decoder", Type, 0, ""}, {"Delim", Type, 5, ""}, @@ -4894,10 +5074,15 @@ var PackageSymbols = map[string][]Symbol{ {"(CharData).Copy", Method, 0, ""}, {"(Comment).Copy", Method, 0, ""}, {"(Directive).Copy", Method, 0, ""}, + {"(Marshaler).MarshalXML", Method, 2, ""}, + {"(MarshalerAttr).MarshalXMLAttr", Method, 2, ""}, {"(ProcInst).Copy", Method, 0, ""}, {"(StartElement).Copy", Method, 0, ""}, {"(StartElement).End", Method, 2, ""}, + {"(TokenReader).Token", Method, 10, ""}, {"(UnmarshalError).Error", Method, 0, ""}, + {"(Unmarshaler).UnmarshalXML", Method, 2, ""}, + {"(UnmarshalerAttr).UnmarshalXMLAttr", Method, 2, ""}, {"Attr", Type, 0, ""}, {"Attr.Name", Field, 0, ""}, {"Attr.Value", Field, 0, ""}, @@ -4984,6 +5169,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*String).Value", Method, 8, ""}, {"(Func).String", Method, 0, ""}, {"(Func).Value", Method, 8, ""}, + {"(Var).String", Method, 0, ""}, {"Do", Func, 0, "func(f func(KeyValue))"}, {"Float", Type, 0, ""}, {"Func", Type, 0, ""}, @@ -5039,6 +5225,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*FlagSet).Var", Method, 0, ""}, {"(*FlagSet).Visit", Method, 0, ""}, {"(*FlagSet).VisitAll", Method, 0, ""}, + {"(Getter).Get", Method, 2, ""}, + {"(Getter).Set", Method, 2, ""}, + {"(Getter).String", Method, 2, ""}, + {"(Value).Set", Method, 0, ""}, + {"(Value).String", Method, 0, ""}, {"Arg", Func, 0, "func(i int) string"}, {"Args", Func, 0, "func() []string"}, {"Bool", Func, 0, "func(name string, value bool, usage string) *bool"}, @@ -5090,6 +5281,20 @@ var PackageSymbols = map[string][]Symbol{ {"VisitAll", Func, 0, "func(fn func(*Flag))"}, }, "fmt": { + {"(Formatter).Format", Method, 0, ""}, + {"(GoStringer).GoString", Method, 0, ""}, + {"(ScanState).Read", Method, 0, ""}, + {"(ScanState).ReadRune", Method, 0, ""}, + {"(ScanState).SkipSpace", Method, 0, ""}, + {"(ScanState).Token", Method, 0, ""}, + {"(ScanState).UnreadRune", Method, 0, ""}, + {"(ScanState).Width", Method, 0, ""}, + {"(Scanner).Scan", Method, 0, ""}, + {"(State).Flag", Method, 0, ""}, + {"(State).Precision", Method, 0, ""}, + {"(State).Width", Method, 0, ""}, + {"(State).Write", Method, 0, ""}, + {"(Stringer).String", Method, 0, ""}, {"Append", Func, 19, "func(b []byte, a ...any) []byte"}, {"Appendf", Func, 19, "func(b []byte, format string, a ...any) []byte"}, {"Appendln", Func, 19, "func(b []byte, a ...any) []byte"}, @@ -5248,7 +5453,18 @@ var PackageSymbols = map[string][]Symbol{ {"(CommentMap).Filter", Method, 1, ""}, {"(CommentMap).String", Method, 1, ""}, {"(CommentMap).Update", Method, 1, ""}, + {"(Decl).End", Method, 0, ""}, + {"(Decl).Pos", Method, 0, ""}, + {"(Expr).End", Method, 0, ""}, + {"(Expr).Pos", Method, 0, ""}, + {"(Node).End", Method, 0, ""}, + {"(Node).Pos", Method, 0, ""}, {"(ObjKind).String", Method, 0, ""}, + {"(Spec).End", Method, 0, ""}, + {"(Spec).Pos", Method, 0, ""}, + {"(Stmt).End", Method, 0, ""}, + {"(Stmt).Pos", Method, 0, ""}, + {"(Visitor).Visit", Method, 0, ""}, {"ArrayType", Type, 0, ""}, {"ArrayType.Elt", Field, 0, ""}, {"ArrayType.Lbrack", Field, 0, ""}, @@ -5271,6 +5487,7 @@ var PackageSymbols = map[string][]Symbol{ {"BasicLit", Type, 0, ""}, {"BasicLit.Kind", Field, 0, ""}, {"BasicLit.Value", Field, 0, ""}, + {"BasicLit.ValueEnd", Field, 26, ""}, {"BasicLit.ValuePos", Field, 0, ""}, {"BinaryExpr", Type, 0, ""}, {"BinaryExpr.Op", Field, 0, ""}, @@ -5320,7 +5537,6 @@ var PackageSymbols = map[string][]Symbol{ {"CompositeLit.Rbrace", Field, 0, ""}, {"CompositeLit.Type", Field, 0, ""}, {"Con", Const, 0, ""}, - {"Decl", Type, 0, ""}, {"DeclStmt", Type, 0, ""}, {"DeclStmt.Decl", Field, 0, ""}, {"DeferStmt", Type, 0, ""}, @@ -5341,7 +5557,6 @@ var PackageSymbols = map[string][]Symbol{ {"EmptyStmt", Type, 0, ""}, {"EmptyStmt.Implicit", Field, 5, ""}, {"EmptyStmt.Semicolon", Field, 0, ""}, - {"Expr", Type, 0, ""}, {"ExprStmt", Type, 0, ""}, {"ExprStmt.X", Field, 0, ""}, {"Field", Type, 0, ""}, @@ -5525,11 +5740,9 @@ var PackageSymbols = map[string][]Symbol{ {"SliceExpr.Slice3", Field, 2, ""}, {"SliceExpr.X", Field, 0, ""}, {"SortImports", Func, 0, "func(fset *token.FileSet, f *File)"}, - {"Spec", Type, 0, ""}, {"StarExpr", Type, 0, ""}, {"StarExpr.Star", Field, 0, ""}, {"StarExpr.X", Field, 0, ""}, - {"Stmt", Type, 0, ""}, {"StructType", Type, 0, ""}, {"StructType.Fields", Field, 0, ""}, {"StructType.Incomplete", Field, 0, ""}, @@ -5684,10 +5897,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*SyntaxError).Error", Method, 16, ""}, {"(*TagExpr).Eval", Method, 16, ""}, {"(*TagExpr).String", Method, 16, ""}, + {"(Expr).Eval", Method, 16, ""}, + {"(Expr).String", Method, 16, ""}, {"AndExpr", Type, 16, ""}, {"AndExpr.X", Field, 16, ""}, {"AndExpr.Y", Field, 16, ""}, - {"Expr", Type, 16, ""}, {"GoVersion", Func, 21, "func(x Expr) string"}, {"IsGoBuild", Func, 16, "func(line string) bool"}, {"IsPlusBuild", Func, 16, "func(line string) bool"}, @@ -5706,6 +5920,9 @@ var PackageSymbols = map[string][]Symbol{ }, "go/constant": { {"(Kind).String", Method, 18, ""}, + {"(Value).ExactString", Method, 6, ""}, + {"(Value).Kind", Method, 5, ""}, + {"(Value).String", Method, 5, ""}, {"BinaryOp", Func, 5, "func(x_ Value, op token.Token, y_ Value) Value"}, {"BitLen", Func, 5, "func(x Value) int"}, {"Bool", Const, 5, ""}, @@ -5744,7 +5961,6 @@ var PackageSymbols = map[string][]Symbol{ {"UnaryOp", Func, 5, "func(op token.Token, y Value, prec uint) Value"}, {"Unknown", Const, 5, ""}, {"Val", Func, 13, "func(x Value) any"}, - {"Value", Type, 5, ""}, }, "go/doc": { {"(*Package).Filter", Method, 0, ""}, @@ -5828,7 +6044,6 @@ var PackageSymbols = map[string][]Symbol{ {"(*Printer).HTML", Method, 19, ""}, {"(*Printer).Markdown", Method, 19, ""}, {"(*Printer).Text", Method, 19, ""}, - {"Block", Type, 19, ""}, {"Code", Type, 19, ""}, {"Code.Text", Field, 19, ""}, {"DefaultLookupPackage", Func, 19, "func(name string) (importPath string, ok bool)"}, @@ -5873,7 +6088,6 @@ var PackageSymbols = map[string][]Symbol{ {"Printer.TextCodePrefix", Field, 19, ""}, {"Printer.TextPrefix", Field, 19, ""}, {"Printer.TextWidth", Field, 19, ""}, - {"Text", Type, 19, ""}, }, "go/format": { {"Node", Func, 1, "func(dst io.Writer, fset *token.FileSet, node any) error"}, @@ -5945,6 +6159,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*File).AddLineColumnInfo", Method, 11, ""}, {"(*File).AddLineInfo", Method, 0, ""}, {"(*File).Base", Method, 0, ""}, + {"(*File).End", Method, 26, ""}, {"(*File).Line", Method, 0, ""}, {"(*File).LineCount", Method, 0, ""}, {"(*File).LineStart", Method, 12, ""}, @@ -6307,6 +6522,22 @@ var PackageSymbols = map[string][]Symbol{ {"(Checker).PkgNameOf", Method, 22, ""}, {"(Checker).TypeOf", Method, 5, ""}, {"(Error).Error", Method, 5, ""}, + {"(Importer).Import", Method, 5, ""}, + {"(ImporterFrom).Import", Method, 6, ""}, + {"(ImporterFrom).ImportFrom", Method, 6, ""}, + {"(Object).Exported", Method, 5, ""}, + {"(Object).Id", Method, 5, ""}, + {"(Object).Name", Method, 5, ""}, + {"(Object).Parent", Method, 5, ""}, + {"(Object).Pkg", Method, 5, ""}, + {"(Object).Pos", Method, 5, ""}, + {"(Object).String", Method, 5, ""}, + {"(Object).Type", Method, 5, ""}, + {"(Sizes).Alignof", Method, 5, ""}, + {"(Sizes).Offsetsof", Method, 5, ""}, + {"(Sizes).Sizeof", Method, 5, ""}, + {"(Type).String", Method, 5, ""}, + {"(Type).Underlying", Method, 5, ""}, {"(TypeAndValue).Addressable", Method, 5, ""}, {"(TypeAndValue).Assignable", Method, 5, ""}, {"(TypeAndValue).HasOk", Method, 5, ""}, @@ -6445,7 +6676,6 @@ var PackageSymbols = map[string][]Symbol{ {"NewUnion", Func, 18, "func(terms []*Term) *Union"}, {"NewVar", Func, 5, "func(pos token.Pos, pkg *Package, name string, typ Type) *Var"}, {"Nil", Type, 5, ""}, - {"Object", Type, 5, ""}, {"ObjectString", Func, 5, "func(obj Object, qf Qualifier) string"}, {"Package", Type, 5, ""}, {"PackageVar", Const, 25, ""}, @@ -6516,6 +6746,33 @@ var PackageSymbols = map[string][]Symbol{ {"Lang", Func, 22, "func(x string) string"}, }, "hash": { + {"(Cloner).BlockSize", Method, 25, ""}, + {"(Cloner).Clone", Method, 25, ""}, + {"(Cloner).Reset", Method, 25, ""}, + {"(Cloner).Size", Method, 25, ""}, + {"(Cloner).Sum", Method, 25, ""}, + {"(Cloner).Write", Method, 25, ""}, + {"(Hash).BlockSize", Method, 0, ""}, + {"(Hash).Reset", Method, 0, ""}, + {"(Hash).Size", Method, 0, ""}, + {"(Hash).Sum", Method, 0, ""}, + {"(Hash).Write", Method, 0, ""}, + {"(Hash32).BlockSize", Method, 0, ""}, + {"(Hash32).Reset", Method, 0, ""}, + {"(Hash32).Size", Method, 0, ""}, + {"(Hash32).Sum", Method, 0, ""}, + {"(Hash32).Sum32", Method, 0, ""}, + {"(Hash32).Write", Method, 0, ""}, + {"(Hash64).BlockSize", Method, 0, ""}, + {"(Hash64).Reset", Method, 0, ""}, + {"(Hash64).Size", Method, 0, ""}, + {"(Hash64).Sum", Method, 0, ""}, + {"(Hash64).Sum64", Method, 0, ""}, + {"(Hash64).Write", Method, 0, ""}, + {"(XOF).BlockSize", Method, 25, ""}, + {"(XOF).Read", Method, 25, ""}, + {"(XOF).Reset", Method, 25, ""}, + {"(XOF).Write", Method, 25, ""}, {"Cloner", Type, 25, ""}, {"Hash", Type, 0, ""}, {"Hash32", Type, 0, ""}, @@ -6781,6 +7038,13 @@ var PackageSymbols = map[string][]Symbol{ {"(*YCbCr).SubImage", Method, 0, ""}, {"(*YCbCr).YCbCrAt", Method, 4, ""}, {"(*YCbCr).YOffset", Method, 0, ""}, + {"(Image).At", Method, 0, ""}, + {"(Image).Bounds", Method, 0, ""}, + {"(Image).ColorModel", Method, 0, ""}, + {"(PalettedImage).At", Method, 0, ""}, + {"(PalettedImage).Bounds", Method, 0, ""}, + {"(PalettedImage).ColorIndexAt", Method, 0, ""}, + {"(PalettedImage).ColorModel", Method, 0, ""}, {"(Point).Add", Method, 0, ""}, {"(Point).Div", Method, 0, ""}, {"(Point).Eq", Method, 0, ""}, @@ -6789,6 +7053,10 @@ var PackageSymbols = map[string][]Symbol{ {"(Point).Mul", Method, 0, ""}, {"(Point).String", Method, 0, ""}, {"(Point).Sub", Method, 0, ""}, + {"(RGBA64Image).At", Method, 17, ""}, + {"(RGBA64Image).Bounds", Method, 17, ""}, + {"(RGBA64Image).ColorModel", Method, 17, ""}, + {"(RGBA64Image).RGBA64At", Method, 17, ""}, {"(Rectangle).Add", Method, 0, ""}, {"(Rectangle).At", Method, 5, ""}, {"(Rectangle).Bounds", Method, 5, ""}, @@ -6913,8 +7181,10 @@ var PackageSymbols = map[string][]Symbol{ {"(Alpha).RGBA", Method, 0, ""}, {"(Alpha16).RGBA", Method, 0, ""}, {"(CMYK).RGBA", Method, 5, ""}, + {"(Color).RGBA", Method, 0, ""}, {"(Gray).RGBA", Method, 0, ""}, {"(Gray16).RGBA", Method, 0, ""}, + {"(Model).Convert", Method, 0, ""}, {"(NRGBA).RGBA", Method, 0, ""}, {"(NRGBA64).RGBA", Method, 0, ""}, {"(NYCbCrA).RGBA", Method, 6, ""}, @@ -6992,7 +7262,19 @@ var PackageSymbols = map[string][]Symbol{ {"WebSafe", Var, 2, ""}, }, "image/draw": { + {"(Drawer).Draw", Method, 2, ""}, + {"(Image).At", Method, 0, ""}, + {"(Image).Bounds", Method, 0, ""}, + {"(Image).ColorModel", Method, 0, ""}, + {"(Image).Set", Method, 0, ""}, {"(Op).Draw", Method, 2, ""}, + {"(Quantizer).Quantize", Method, 2, ""}, + {"(RGBA64Image).At", Method, 17, ""}, + {"(RGBA64Image).Bounds", Method, 17, ""}, + {"(RGBA64Image).ColorModel", Method, 17, ""}, + {"(RGBA64Image).RGBA64At", Method, 17, ""}, + {"(RGBA64Image).Set", Method, 17, ""}, + {"(RGBA64Image).SetRGBA64", Method, 17, ""}, {"Draw", Func, 0, "func(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)"}, {"DrawMask", Func, 0, "func(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op)"}, {"Drawer", Type, 2, ""}, @@ -7027,6 +7309,8 @@ var PackageSymbols = map[string][]Symbol{ }, "image/jpeg": { {"(FormatError).Error", Method, 0, ""}, + {"(Reader).Read", Method, 0, ""}, + {"(Reader).ReadByte", Method, 0, ""}, {"(UnsupportedError).Error", Method, 0, ""}, {"Decode", Func, 0, "func(r io.Reader) (image.Image, error)"}, {"DecodeConfig", Func, 0, "func(r io.Reader) (image.Config, error)"}, @@ -7040,6 +7324,8 @@ var PackageSymbols = map[string][]Symbol{ }, "image/png": { {"(*Encoder).Encode", Method, 4, ""}, + {"(EncoderBufferPool).Get", Method, 9, ""}, + {"(EncoderBufferPool).Put", Method, 9, ""}, {"(FormatError).Error", Method, 0, ""}, {"(UnsupportedError).Error", Method, 0, ""}, {"BestCompression", Const, 4, ""}, @@ -7083,6 +7369,41 @@ var PackageSymbols = map[string][]Symbol{ {"(*SectionReader).ReadAt", Method, 0, ""}, {"(*SectionReader).Seek", Method, 0, ""}, {"(*SectionReader).Size", Method, 0, ""}, + {"(ByteReader).ReadByte", Method, 0, ""}, + {"(ByteScanner).ReadByte", Method, 0, ""}, + {"(ByteScanner).UnreadByte", Method, 0, ""}, + {"(ByteWriter).WriteByte", Method, 1, ""}, + {"(Closer).Close", Method, 0, ""}, + {"(ReadCloser).Close", Method, 0, ""}, + {"(ReadCloser).Read", Method, 0, ""}, + {"(ReadSeekCloser).Close", Method, 16, ""}, + {"(ReadSeekCloser).Read", Method, 16, ""}, + {"(ReadSeekCloser).Seek", Method, 16, ""}, + {"(ReadSeeker).Read", Method, 0, ""}, + {"(ReadSeeker).Seek", Method, 0, ""}, + {"(ReadWriteCloser).Close", Method, 0, ""}, + {"(ReadWriteCloser).Read", Method, 0, ""}, + {"(ReadWriteCloser).Write", Method, 0, ""}, + {"(ReadWriteSeeker).Read", Method, 0, ""}, + {"(ReadWriteSeeker).Seek", Method, 0, ""}, + {"(ReadWriteSeeker).Write", Method, 0, ""}, + {"(ReadWriter).Read", Method, 0, ""}, + {"(ReadWriter).Write", Method, 0, ""}, + {"(Reader).Read", Method, 0, ""}, + {"(ReaderAt).ReadAt", Method, 0, ""}, + {"(ReaderFrom).ReadFrom", Method, 0, ""}, + {"(RuneReader).ReadRune", Method, 0, ""}, + {"(RuneScanner).ReadRune", Method, 0, ""}, + {"(RuneScanner).UnreadRune", Method, 0, ""}, + {"(Seeker).Seek", Method, 0, ""}, + {"(StringWriter).WriteString", Method, 12, ""}, + {"(WriteCloser).Close", Method, 0, ""}, + {"(WriteCloser).Write", Method, 0, ""}, + {"(WriteSeeker).Seek", Method, 0, ""}, + {"(WriteSeeker).Write", Method, 0, ""}, + {"(Writer).Write", Method, 0, ""}, + {"(WriterAt).WriteAt", Method, 0, ""}, + {"(WriterTo).WriteTo", Method, 0, ""}, {"ByteReader", Type, 0, ""}, {"ByteScanner", Type, 0, ""}, {"ByteWriter", Type, 1, ""}, @@ -7142,11 +7463,42 @@ var PackageSymbols = map[string][]Symbol{ {"(*PathError).Error", Method, 16, ""}, {"(*PathError).Timeout", Method, 16, ""}, {"(*PathError).Unwrap", Method, 16, ""}, + {"(DirEntry).Info", Method, 16, ""}, + {"(DirEntry).IsDir", Method, 16, ""}, + {"(DirEntry).Name", Method, 16, ""}, + {"(DirEntry).Type", Method, 16, ""}, + {"(FS).Open", Method, 16, ""}, + {"(File).Close", Method, 16, ""}, + {"(File).Read", Method, 16, ""}, + {"(File).Stat", Method, 16, ""}, + {"(FileInfo).IsDir", Method, 16, ""}, + {"(FileInfo).ModTime", Method, 16, ""}, + {"(FileInfo).Mode", Method, 16, ""}, + {"(FileInfo).Name", Method, 16, ""}, + {"(FileInfo).Size", Method, 16, ""}, + {"(FileInfo).Sys", Method, 16, ""}, {"(FileMode).IsDir", Method, 16, ""}, {"(FileMode).IsRegular", Method, 16, ""}, {"(FileMode).Perm", Method, 16, ""}, {"(FileMode).String", Method, 16, ""}, {"(FileMode).Type", Method, 16, ""}, + {"(GlobFS).Glob", Method, 16, ""}, + {"(GlobFS).Open", Method, 16, ""}, + {"(ReadDirFS).Open", Method, 16, ""}, + {"(ReadDirFS).ReadDir", Method, 16, ""}, + {"(ReadDirFile).Close", Method, 16, ""}, + {"(ReadDirFile).Read", Method, 16, ""}, + {"(ReadDirFile).ReadDir", Method, 16, ""}, + {"(ReadDirFile).Stat", Method, 16, ""}, + {"(ReadFileFS).Open", Method, 16, ""}, + {"(ReadFileFS).ReadFile", Method, 16, ""}, + {"(ReadLinkFS).Lstat", Method, 25, ""}, + {"(ReadLinkFS).Open", Method, 25, ""}, + {"(ReadLinkFS).ReadLink", Method, 25, ""}, + {"(StatFS).Open", Method, 16, ""}, + {"(StatFS).Stat", Method, 16, ""}, + {"(SubFS).Open", Method, 16, ""}, + {"(SubFS).Sub", Method, 16, ""}, {"DirEntry", Type, 16, ""}, {"ErrClosed", Var, 16, ""}, {"ErrExist", Var, 16, ""}, @@ -7299,12 +7651,18 @@ var PackageSymbols = map[string][]Symbol{ {"(*TextHandler).WithGroup", Method, 21, ""}, {"(Attr).Equal", Method, 21, ""}, {"(Attr).String", Method, 21, ""}, + {"(Handler).Enabled", Method, 21, ""}, + {"(Handler).Handle", Method, 21, ""}, + {"(Handler).WithAttrs", Method, 21, ""}, + {"(Handler).WithGroup", Method, 21, ""}, {"(Kind).String", Method, 21, ""}, {"(Level).AppendText", Method, 24, ""}, {"(Level).Level", Method, 21, ""}, {"(Level).MarshalJSON", Method, 21, ""}, {"(Level).MarshalText", Method, 21, ""}, {"(Level).String", Method, 21, ""}, + {"(Leveler).Level", Method, 21, ""}, + {"(LogValuer).LogValue", Method, 21, ""}, {"(Record).Attrs", Method, 21, ""}, {"(Record).Clone", Method, 21, ""}, {"(Record).NumAttrs", Method, 21, ""}, @@ -7833,6 +8191,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*Rand).Uint32", Method, 0, ""}, {"(*Rand).Uint64", Method, 8, ""}, {"(*Zipf).Uint64", Method, 0, ""}, + {"(Source).Int63", Method, 0, ""}, + {"(Source).Seed", Method, 0, ""}, + {"(Source64).Int63", Method, 8, ""}, + {"(Source64).Seed", Method, 8, ""}, + {"(Source64).Uint64", Method, 8, ""}, {"ExpFloat64", Func, 0, "func() float64"}, {"Float32", Func, 0, "func() float32"}, {"Float64", Func, 0, "func() float64"}, @@ -7888,6 +8251,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*Rand).Uint64N", Method, 22, ""}, {"(*Rand).UintN", Method, 22, ""}, {"(*Zipf).Uint64", Method, 22, ""}, + {"(Source).Uint64", Method, 22, ""}, {"ChaCha8", Type, 22, ""}, {"ExpFloat64", Func, 22, "func() float64"}, {"Float32", Func, 22, "func() float32"}, @@ -7951,6 +8315,10 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).FormDataContentType", Method, 0, ""}, {"(*Writer).SetBoundary", Method, 1, ""}, {"(*Writer).WriteField", Method, 0, ""}, + {"(File).Close", Method, 0, ""}, + {"(File).Read", Method, 0, ""}, + {"(File).ReadAt", Method, 0, ""}, + {"(File).Seek", Method, 0, ""}, {"ErrMessageTooLarge", Var, 9, ""}, {"File", Type, 0, ""}, {"FileContentDisposition", Func, 25, "func(fieldname string, filename string) string"}, @@ -8135,6 +8503,19 @@ var PackageSymbols = map[string][]Symbol{ {"(*UnixListener).SetDeadline", Method, 0, ""}, {"(*UnixListener).SetUnlinkOnClose", Method, 8, ""}, {"(*UnixListener).SyscallConn", Method, 10, ""}, + {"(Addr).Network", Method, 0, ""}, + {"(Addr).String", Method, 0, ""}, + {"(Conn).Close", Method, 0, ""}, + {"(Conn).LocalAddr", Method, 0, ""}, + {"(Conn).Read", Method, 0, ""}, + {"(Conn).RemoteAddr", Method, 0, ""}, + {"(Conn).SetDeadline", Method, 0, ""}, + {"(Conn).SetReadDeadline", Method, 0, ""}, + {"(Conn).SetWriteDeadline", Method, 0, ""}, + {"(Conn).Write", Method, 0, ""}, + {"(Error).Error", Method, 0, ""}, + {"(Error).Temporary", Method, 0, ""}, + {"(Error).Timeout", Method, 0, ""}, {"(Flags).String", Method, 0, ""}, {"(HardwareAddr).String", Method, 0, ""}, {"(IP).AppendText", Method, 24, ""}, @@ -8158,6 +8539,16 @@ var PackageSymbols = map[string][]Symbol{ {"(InvalidAddrError).Error", Method, 0, ""}, {"(InvalidAddrError).Temporary", Method, 0, ""}, {"(InvalidAddrError).Timeout", Method, 0, ""}, + {"(Listener).Accept", Method, 0, ""}, + {"(Listener).Addr", Method, 0, ""}, + {"(Listener).Close", Method, 0, ""}, + {"(PacketConn).Close", Method, 0, ""}, + {"(PacketConn).LocalAddr", Method, 0, ""}, + {"(PacketConn).ReadFrom", Method, 0, ""}, + {"(PacketConn).SetDeadline", Method, 0, ""}, + {"(PacketConn).SetReadDeadline", Method, 0, ""}, + {"(PacketConn).SetWriteDeadline", Method, 0, ""}, + {"(PacketConn).WriteTo", Method, 0, ""}, {"(UnknownNetworkError).Error", Method, 0, ""}, {"(UnknownNetworkError).Temporary", Method, 0, ""}, {"(UnknownNetworkError).Timeout", Method, 0, ""}, @@ -8333,6 +8724,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Client).Head", Method, 0, ""}, {"(*Client).Post", Method, 0, ""}, {"(*Client).PostForm", Method, 0, ""}, + {"(*ClientConn).Available", Method, 26, ""}, + {"(*ClientConn).Close", Method, 26, ""}, + {"(*ClientConn).Err", Method, 26, ""}, + {"(*ClientConn).InFlight", Method, 26, ""}, + {"(*ClientConn).Release", Method, 26, ""}, + {"(*ClientConn).Reserve", Method, 26, ""}, + {"(*ClientConn).RoundTrip", Method, 26, ""}, + {"(*ClientConn).SetStateHook", Method, 26, ""}, {"(*Cookie).String", Method, 0, ""}, {"(*Cookie).Valid", Method, 18, ""}, {"(*CrossOriginProtection).AddInsecureBypassPattern", Method, 25, ""}, @@ -8392,10 +8791,22 @@ var PackageSymbols = map[string][]Symbol{ {"(*Transport).CancelRequest", Method, 1, ""}, {"(*Transport).Clone", Method, 13, ""}, {"(*Transport).CloseIdleConnections", Method, 0, ""}, + {"(*Transport).NewClientConn", Method, 26, ""}, {"(*Transport).RegisterProtocol", Method, 0, ""}, {"(*Transport).RoundTrip", Method, 0, ""}, + {"(CloseNotifier).CloseNotify", Method, 1, ""}, {"(ConnState).String", Method, 3, ""}, + {"(CookieJar).Cookies", Method, 0, ""}, + {"(CookieJar).SetCookies", Method, 0, ""}, {"(Dir).Open", Method, 0, ""}, + {"(File).Close", Method, 0, ""}, + {"(File).Read", Method, 0, ""}, + {"(File).Readdir", Method, 0, ""}, + {"(File).Seek", Method, 0, ""}, + {"(File).Stat", Method, 0, ""}, + {"(FileSystem).Open", Method, 0, ""}, + {"(Flusher).Flush", Method, 0, ""}, + {"(Handler).ServeHTTP", Method, 0, ""}, {"(HandlerFunc).ServeHTTP", Method, 0, ""}, {"(Header).Add", Method, 0, ""}, {"(Header).Clone", Method, 13, ""}, @@ -8405,10 +8816,16 @@ var PackageSymbols = map[string][]Symbol{ {"(Header).Values", Method, 14, ""}, {"(Header).Write", Method, 0, ""}, {"(Header).WriteSubset", Method, 0, ""}, + {"(Hijacker).Hijack", Method, 0, ""}, {"(Protocols).HTTP1", Method, 24, ""}, {"(Protocols).HTTP2", Method, 24, ""}, {"(Protocols).String", Method, 24, ""}, {"(Protocols).UnencryptedHTTP2", Method, 24, ""}, + {"(Pusher).Push", Method, 8, ""}, + {"(ResponseWriter).Header", Method, 0, ""}, + {"(ResponseWriter).Write", Method, 0, ""}, + {"(ResponseWriter).WriteHeader", Method, 0, ""}, + {"(RoundTripper).RoundTrip", Method, 0, ""}, {"AllowQuerySemicolons", Func, 17, "func(h Handler) Handler"}, {"CanonicalHeaderKey", Func, 0, "func(s string) string"}, {"Client", Type, 0, ""}, @@ -8416,6 +8833,7 @@ var PackageSymbols = map[string][]Symbol{ {"Client.Jar", Field, 0, ""}, {"Client.Timeout", Field, 3, ""}, {"Client.Transport", Field, 0, ""}, + {"ClientConn", Type, 26, ""}, {"CloseNotifier", Type, 1, ""}, {"ConnState", Type, 3, ""}, {"Cookie", Type, 0, ""}, @@ -8726,6 +9144,8 @@ var PackageSymbols = map[string][]Symbol{ "net/http/cookiejar": { {"(*Jar).Cookies", Method, 1, ""}, {"(*Jar).SetCookies", Method, 1, ""}, + {"(PublicSuffixList).PublicSuffix", Method, 1, ""}, + {"(PublicSuffixList).String", Method, 1, ""}, {"Jar", Type, 1, ""}, {"New", Func, 1, "func(o *Options) (*Jar, error)"}, {"Options", Type, 1, ""}, @@ -8819,6 +9239,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*ServerConn).Pending", Method, 0, ""}, {"(*ServerConn).Read", Method, 0, ""}, {"(*ServerConn).Write", Method, 0, ""}, + {"(BufferPool).Get", Method, 6, ""}, + {"(BufferPool).Put", Method, 6, ""}, {"BufferPool", Type, 6, ""}, {"ClientConn", Type, 0, ""}, {"DumpRequest", Func, 0, "func(req *http.Request, body bool) ([]byte, error)"}, @@ -8972,6 +9394,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Server).ServeConn", Method, 0, ""}, {"(*Server).ServeHTTP", Method, 0, ""}, {"(*Server).ServeRequest", Method, 0, ""}, + {"(ClientCodec).Close", Method, 0, ""}, + {"(ClientCodec).ReadResponseBody", Method, 0, ""}, + {"(ClientCodec).ReadResponseHeader", Method, 0, ""}, + {"(ClientCodec).WriteRequest", Method, 0, ""}, + {"(ServerCodec).Close", Method, 0, ""}, + {"(ServerCodec).ReadRequestBody", Method, 0, ""}, + {"(ServerCodec).ReadRequestHeader", Method, 0, ""}, + {"(ServerCodec).WriteResponse", Method, 0, ""}, {"(ServerError).Error", Method, 0, ""}, {"Accept", Func, 0, "func(lis net.Listener)"}, {"Call", Type, 0, ""}, @@ -9030,6 +9460,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*Client).StartTLS", Method, 0, ""}, {"(*Client).TLSConnectionState", Method, 5, ""}, {"(*Client).Verify", Method, 0, ""}, + {"(Auth).Next", Method, 0, ""}, + {"(Auth).Start", Method, 0, ""}, {"Auth", Type, 0, ""}, {"CRAMMD5Auth", Func, 0, "func(username string, secret string) Auth"}, {"Client", Type, 0, ""}, @@ -9241,10 +9673,18 @@ var PackageSymbols = map[string][]Symbol{ {"(*SyscallError).Error", Method, 0, ""}, {"(*SyscallError).Timeout", Method, 10, ""}, {"(*SyscallError).Unwrap", Method, 13, ""}, + {"(FileInfo).IsDir", Method, 0, ""}, + {"(FileInfo).ModTime", Method, 0, ""}, + {"(FileInfo).Mode", Method, 0, ""}, + {"(FileInfo).Name", Method, 0, ""}, + {"(FileInfo).Size", Method, 0, ""}, + {"(FileInfo).Sys", Method, 0, ""}, {"(FileMode).IsDir", Method, 0, ""}, {"(FileMode).IsRegular", Method, 1, ""}, {"(FileMode).Perm", Method, 0, ""}, {"(FileMode).String", Method, 0, ""}, + {"(Signal).Signal", Method, 0, ""}, + {"(Signal).String", Method, 0, ""}, {"Args", Var, 0, ""}, {"Chdir", Func, 0, "func(dir string) error"}, {"Chmod", Func, 0, "func(name string, mode FileMode) error"}, @@ -9521,6 +9961,45 @@ var PackageSymbols = map[string][]Symbol{ {"(StructField).IsExported", Method, 17, ""}, {"(StructTag).Get", Method, 0, ""}, {"(StructTag).Lookup", Method, 7, ""}, + {"(Type).Align", Method, 0, ""}, + {"(Type).AssignableTo", Method, 0, ""}, + {"(Type).Bits", Method, 0, ""}, + {"(Type).CanSeq", Method, 23, ""}, + {"(Type).CanSeq2", Method, 23, ""}, + {"(Type).ChanDir", Method, 0, ""}, + {"(Type).Comparable", Method, 4, ""}, + {"(Type).ConvertibleTo", Method, 1, ""}, + {"(Type).Elem", Method, 0, ""}, + {"(Type).Field", Method, 0, ""}, + {"(Type).FieldAlign", Method, 0, ""}, + {"(Type).FieldByIndex", Method, 0, ""}, + {"(Type).FieldByName", Method, 0, ""}, + {"(Type).FieldByNameFunc", Method, 0, ""}, + {"(Type).Fields", Method, 26, ""}, + {"(Type).Implements", Method, 0, ""}, + {"(Type).In", Method, 0, ""}, + {"(Type).Ins", Method, 26, ""}, + {"(Type).IsVariadic", Method, 0, ""}, + {"(Type).Key", Method, 0, ""}, + {"(Type).Kind", Method, 0, ""}, + {"(Type).Len", Method, 0, ""}, + {"(Type).Method", Method, 0, ""}, + {"(Type).MethodByName", Method, 0, ""}, + {"(Type).Methods", Method, 26, ""}, + {"(Type).Name", Method, 0, ""}, + {"(Type).NumField", Method, 0, ""}, + {"(Type).NumIn", Method, 0, ""}, + {"(Type).NumMethod", Method, 0, ""}, + {"(Type).NumOut", Method, 0, ""}, + {"(Type).Out", Method, 0, ""}, + {"(Type).Outs", Method, 26, ""}, + {"(Type).OverflowComplex", Method, 23, ""}, + {"(Type).OverflowFloat", Method, 23, ""}, + {"(Type).OverflowInt", Method, 23, ""}, + {"(Type).OverflowUint", Method, 23, ""}, + {"(Type).PkgPath", Method, 0, ""}, + {"(Type).Size", Method, 0, ""}, + {"(Type).String", Method, 0, ""}, {"(Value).Addr", Method, 0, ""}, {"(Value).Bool", Method, 0, ""}, {"(Value).Bytes", Method, 0, ""}, @@ -9547,6 +10026,7 @@ var PackageSymbols = map[string][]Symbol{ {"(Value).FieldByIndexErr", Method, 18, ""}, {"(Value).FieldByName", Method, 0, ""}, {"(Value).FieldByNameFunc", Method, 0, ""}, + {"(Value).Fields", Method, 26, ""}, {"(Value).Float", Method, 0, ""}, {"(Value).Grow", Method, 20, ""}, {"(Value).Index", Method, 0, ""}, @@ -9563,6 +10043,7 @@ var PackageSymbols = map[string][]Symbol{ {"(Value).MapRange", Method, 12, ""}, {"(Value).Method", Method, 0, ""}, {"(Value).MethodByName", Method, 0, ""}, + {"(Value).Methods", Method, 26, ""}, {"(Value).NumField", Method, 0, ""}, {"(Value).NumMethod", Method, 0, ""}, {"(Value).OverflowComplex", Method, 0, ""}, @@ -9678,7 +10159,6 @@ var PackageSymbols = map[string][]Symbol{ {"StructOf", Func, 7, "func(fields []StructField) Type"}, {"StructTag", Type, 0, ""}, {"Swapper", Func, 8, "func(slice any) func(i int, j int)"}, - {"Type", Type, 0, ""}, {"TypeAssert", Func, 25, "func[T any](v Value) (T, bool)"}, {"TypeFor", Func, 22, "func[T any]() Type"}, {"TypeOf", Func, 0, "func(i any) Type"}, @@ -9880,6 +10360,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*TypeAssertionError).Error", Method, 0, ""}, {"(*TypeAssertionError).RuntimeError", Method, 0, ""}, {"(Cleanup).Stop", Method, 24, ""}, + {"(Error).Error", Method, 0, ""}, + {"(Error).RuntimeError", Method, 0, ""}, {"AddCleanup", Func, 24, "func[T, S any](ptr *T, cleanup func(S), arg S) Cleanup"}, {"BlockProfile", Func, 1, "func(p []BlockProfileRecord) (n int, ok bool)"}, {"BlockProfileRecord", Type, 1, ""}, @@ -10154,6 +10636,9 @@ var PackageSymbols = map[string][]Symbol{ {"(IntSlice).Search", Method, 0, ""}, {"(IntSlice).Sort", Method, 0, ""}, {"(IntSlice).Swap", Method, 0, ""}, + {"(Interface).Len", Method, 0, ""}, + {"(Interface).Less", Method, 0, ""}, + {"(Interface).Swap", Method, 0, ""}, {"(StringSlice).Len", Method, 0, ""}, {"(StringSlice).Less", Method, 0, ""}, {"(StringSlice).Search", Method, 0, ""}, @@ -10345,6 +10830,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*WaitGroup).Done", Method, 0, ""}, {"(*WaitGroup).Go", Method, 25, ""}, {"(*WaitGroup).Wait", Method, 0, ""}, + {"(Locker).Lock", Method, 0, ""}, + {"(Locker).Unlock", Method, 0, ""}, {"Cond", Type, 0, ""}, {"Cond.L", Field, 0, ""}, {"Locker", Type, 0, ""}, @@ -10486,10 +10973,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Timeval).Nano", Method, 0, ""}, {"(*Timeval).Nanoseconds", Method, 0, ""}, {"(*Timeval).Unix", Method, 0, ""}, + {"(Conn).SyscallConn", Method, 9, ""}, {"(Errno).Error", Method, 0, ""}, {"(Errno).Is", Method, 13, ""}, {"(Errno).Temporary", Method, 0, ""}, {"(Errno).Timeout", Method, 0, ""}, + {"(RawConn).Control", Method, 9, ""}, + {"(RawConn).Read", Method, 9, ""}, + {"(RawConn).Write", Method, 9, ""}, {"(Signal).Signal", Method, 0, ""}, {"(Signal).String", Method, 0, ""}, {"(Token).Close", Method, 0, ""}, @@ -14409,7 +14900,7 @@ var PackageSymbols = map[string][]Symbol{ {"RouteMessage.Data", Field, 0, ""}, {"RouteMessage.Header", Field, 0, ""}, {"RouteRIB", Func, 0, ""}, - {"RoutingMessage", Type, 0, ""}, + {"RoutingMessage", Type, 14, ""}, {"RtAttr", Type, 0, ""}, {"RtAttr.Len", Field, 0, ""}, {"RtAttr.Type", Field, 0, ""}, @@ -15895,7 +16386,6 @@ var PackageSymbols = map[string][]Symbol{ {"SockFprog.Filter", Field, 0, ""}, {"SockFprog.Len", Field, 0, ""}, {"SockFprog.Pad_cgo_0", Field, 0, ""}, - {"Sockaddr", Type, 0, ""}, {"SockaddrDatalink", Type, 0, ""}, {"SockaddrDatalink.Alen", Field, 0, ""}, {"SockaddrDatalink.Data", Field, 0, ""}, @@ -16801,6 +17291,29 @@ var PackageSymbols = map[string][]Symbol{ {"(BenchmarkResult).MemString", Method, 1, ""}, {"(BenchmarkResult).NsPerOp", Method, 0, ""}, {"(BenchmarkResult).String", Method, 0, ""}, + {"(TB).ArtifactDir", Method, 26, ""}, + {"(TB).Attr", Method, 25, ""}, + {"(TB).Chdir", Method, 24, ""}, + {"(TB).Cleanup", Method, 14, ""}, + {"(TB).Context", Method, 24, ""}, + {"(TB).Error", Method, 2, ""}, + {"(TB).Errorf", Method, 2, ""}, + {"(TB).Fail", Method, 2, ""}, + {"(TB).FailNow", Method, 2, ""}, + {"(TB).Failed", Method, 2, ""}, + {"(TB).Fatal", Method, 2, ""}, + {"(TB).Fatalf", Method, 2, ""}, + {"(TB).Helper", Method, 9, ""}, + {"(TB).Log", Method, 2, ""}, + {"(TB).Logf", Method, 2, ""}, + {"(TB).Name", Method, 8, ""}, + {"(TB).Output", Method, 25, ""}, + {"(TB).Setenv", Method, 17, ""}, + {"(TB).Skip", Method, 2, ""}, + {"(TB).SkipNow", Method, 2, ""}, + {"(TB).Skipf", Method, 2, ""}, + {"(TB).Skipped", Method, 2, ""}, + {"(TB).TempDir", Method, 15, ""}, {"AllocsPerRun", Func, 1, "func(runs int, f func()) (avg float64)"}, {"B", Type, 0, ""}, {"B.N", Field, 0, ""}, @@ -16851,7 +17364,6 @@ var PackageSymbols = map[string][]Symbol{ {"RunTests", Func, 0, "func(matchString func(pat string, str string) (bool, error), tests []InternalTest) (ok bool)"}, {"Short", Func, 0, "func() bool"}, {"T", Type, 0, ""}, - {"TB", Type, 2, ""}, {"Testing", Func, 21, "func() bool"}, {"Verbose", Func, 1, "func() bool"}, }, @@ -16887,6 +17399,7 @@ var PackageSymbols = map[string][]Symbol{ "testing/quick": { {"(*CheckEqualError).Error", Method, 0, ""}, {"(*CheckError).Error", Method, 0, ""}, + {"(Generator).Generate", Method, 0, ""}, {"(SetupError).Error", Method, 0, ""}, {"Check", Func, 0, "func(f any, config *Config) error"}, {"CheckEqual", Func, 0, "func(f any, g any, config *Config) error"}, @@ -17093,6 +17606,10 @@ var PackageSymbols = map[string][]Symbol{ {"(ListNode).Position", Method, 1, ""}, {"(ListNode).Type", Method, 0, ""}, {"(NilNode).Position", Method, 1, ""}, + {"(Node).Copy", Method, 0, ""}, + {"(Node).Position", Method, 1, ""}, + {"(Node).String", Method, 0, ""}, + {"(Node).Type", Method, 0, ""}, {"(NodeType).Type", Method, 0, ""}, {"(NumberNode).Position", Method, 1, ""}, {"(NumberNode).Type", Method, 0, ""}, diff --git a/vendor/golang.org/x/tools/internal/stdlib/stdlib.go b/vendor/golang.org/x/tools/internal/stdlib/stdlib.go index e223e0f340..59a5de36a2 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/stdlib.go +++ b/vendor/golang.org/x/tools/internal/stdlib/stdlib.go @@ -39,7 +39,7 @@ const ( Var // "EOF" Const // "Pi" Field // "Point.X" - Method // "(*Buffer).Grow" + Method // "(*Buffer).Grow" or "(Reader).Read" ) func (kind Kind) String() string { diff --git a/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go b/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go index 3db2a135b9..7ebe9768bc 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go @@ -8,7 +8,7 @@ import ( "fmt" "go/ast" "go/types" - _ "unsafe" + _ "unsafe" // for go:linkname hack ) // CallKind describes the function position of an [*ast.CallExpr]. diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index fef74a7856..51001666ef 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -23,7 +23,6 @@ import ( "go/token" "go/types" "reflect" - "unsafe" "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/internal/aliases" @@ -40,8 +39,7 @@ func SetUsesCgo(conf *types.Config) bool { } } - addr := unsafe.Pointer(f.UnsafeAddr()) - *(*bool)(addr) = true + *(*bool)(f.Addr().UnsafePointer()) = true return true } diff --git a/vendor/golang.org/x/tools/internal/versions/features.go b/vendor/golang.org/x/tools/internal/versions/features.go index a5f4e3252c..cdd36c388a 100644 --- a/vendor/golang.org/x/tools/internal/versions/features.go +++ b/vendor/golang.org/x/tools/internal/versions/features.go @@ -9,6 +9,7 @@ package versions // named constants, to avoid misspelling const ( + Go1_17 = "go1.17" Go1_18 = "go1.18" Go1_19 = "go1.19" Go1_20 = "go1.20" diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go index e29f52bebc..cd22f14fb3 100644 --- a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go @@ -817,6 +817,7 @@ func genExtensions(g *protogen.GeneratedFile, f *fileInfo) { leadingComments = appendDeprecationSuffix(leadingComments, x.Desc.ParentFile(), x.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) + g.AnnotateSymbol("E_"+x.GoIdent.GoName, protogen.Annotation{Location: x.Location}) g.P(leadingComments, "E_", x.GoIdent, " = &", extensionTypesVarName(f), "[", allExtensionsByPtr[x], "]", trailingComment(x.Comments.Trailing)) diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/opaque.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/opaque.go index 45749edd18..bfbafbebf9 100644 --- a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/opaque.go +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/opaque.go @@ -796,10 +796,12 @@ func opaqueGenWhichOneof(g *protogen.GeneratedFile, f *fileInfo, message *messag caseType := opaqueOneofCaseTypeName(oneof) g.P("const ", message.GoIdent.GoName, "_", oneof.GoName, "_not_set_case ", caseType, " = ", 0) for _, f := range oneof.Fields { + g.AnnotateSymbol(message.GoIdent.GoName+"_"+f.GoName+"_case", protogen.Annotation{Location: f.Location}) g.P("const ", message.GoIdent.GoName, "_", f.GoName, "_case ", caseType, " = ", f.Desc.Number()) } fieldtrackNoInterface(g, message.noInterface) whicherName := oneof.MethodName("Which") + g.AnnotateSymbol(message.GoIdent.GoName+"."+whicherName, protogen.Annotation{Location: oneof.Location}) g.P("func (x *", message.GoIdent, ") ", whicherName, "() ", caseType, " {") g.P("if x == nil {") g.P("return ", message.GoIdent.GoName, "_", oneof.GoName, "_not_set_case ") diff --git a/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go b/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go index f7f295aa55..f68418bb1a 100644 --- a/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go +++ b/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go @@ -267,6 +267,12 @@ func (opts Options) New(req *pluginpb.CodeGeneratorRequest) (*Plugin, error) { return nil, fmt.Errorf("cannot use module= with paths=source_relative") } + // Instead of generating each gen.Request.ProtoFile, + // generate gen.Request.FileToGenerate and its transitive dependencies. + // + // This effectively filters out 'import option' dependencies. + files := gatherTransitiveDependencies(gen.Request) + // Figure out the import path and package name for each file. // // The rules here are complicated and have grown organically over time. @@ -281,7 +287,7 @@ func (opts Options) New(req *pluginpb.CodeGeneratorRequest) (*Plugin, error) { // // Alternatively, build systems which want to exert full control over // import paths may specify M= flags. - for _, fdesc := range gen.Request.ProtoFile { + for _, fdesc := range files { filename := fdesc.GetName() // The "M" command-line flags take precedence over // the "go_package" option in the .proto source file. @@ -351,7 +357,7 @@ func (opts Options) New(req *pluginpb.CodeGeneratorRequest) (*Plugin, error) { // The extracted types from the full import set typeRegistry := newExtensionRegistry() - for _, fdesc := range gen.Request.ProtoFile { + for _, fdesc := range files { filename := fdesc.GetName() if gen.FilesByPath[filename] != nil { return nil, fmt.Errorf("duplicate file name: %q", filename) @@ -390,6 +396,50 @@ func (opts Options) New(req *pluginpb.CodeGeneratorRequest) (*Plugin, error) { return gen, nil } +type transitiveDependencies struct { + files map[string]*descriptorpb.FileDescriptorProto + deps map[string]bool + sortedDeps []*descriptorpb.FileDescriptorProto +} + +func newTransitiveDependencies(req *pluginpb.CodeGeneratorRequest) *transitiveDependencies { + files := make(map[string]*descriptorpb.FileDescriptorProto) + for _, f := range req.GetProtoFile() { + files[f.GetName()] = f + } + return &transitiveDependencies{ + files: files, + deps: make(map[string]bool), + } +} + +func (td *transitiveDependencies) add(name string) { + if td.deps[name] { + return + } + f := td.files[name] + if f == nil { + // This shouldn't happen, but will fail later if it does. + return + } + td.deps[name] = true + for _, dep := range f.GetDependency() { + td.add(dep) + } + td.sortedDeps = append(td.sortedDeps, f) +} + +func gatherTransitiveDependencies(req *pluginpb.CodeGeneratorRequest) []*descriptorpb.FileDescriptorProto { + if len(req.GetFileToGenerate()) == 0 { + return req.GetProtoFile() + } + td := newTransitiveDependencies(req) + for _, f := range req.GetFileToGenerate() { + td.add(f) + } + return td.sortedDeps +} + // InternalStripForEditionsDiff returns whether or not to strip non-functional // codegen for editions diff testing. // diff --git a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go index 669133d04d..c96e448346 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go @@ -32,7 +32,7 @@ var byteType = reflect.TypeOf(byte(0)) func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor { f := new(filedesc.Field) f.L0.ParentFile = filedesc.SurrogateProto2 - f.L1.EditionFeatures = f.L0.ParentFile.L1.EditionFeatures + packed := false for len(tag) > 0 { i := strings.IndexByte(tag, ',') if i < 0 { @@ -108,7 +108,7 @@ func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescri f.L1.StringName.InitJSON(jsonName) } case s == "packed": - f.L1.EditionFeatures.IsPacked = true + packed = true case strings.HasPrefix(s, "def="): // The default tag is special in that everything afterwards is the // default regardless of the presence of commas. @@ -121,6 +121,13 @@ func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescri tag = strings.TrimPrefix(tag[i:], ",") } + // Update EditionFeatures after the loop and after we know whether this is + // a proto2 or proto3 field. + f.L1.EditionFeatures = f.L0.ParentFile.L1.EditionFeatures + if packed { + f.L1.EditionFeatures.IsPacked = true + } + // The generator uses the group message name instead of the field name. // We obtain the real field name by lowercasing the group name. if f.L1.Kind == protoreflect.GroupKind { diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go index 099b2bf451..9aa7a9bb77 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go @@ -424,27 +424,34 @@ func (d *Decoder) parseFieldName() (tok Token, err error) { return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in)) } -// parseTypeName parses Any type URL or extension field name. The name is -// enclosed in [ and ] characters. The C++ parser does not handle many legal URL -// strings. This implementation is more liberal and allows for the pattern -// ^[-_a-zA-Z0-9]+([./][-_a-zA-Z0-9]+)*`). Whitespaces and comments are allowed -// in between [ ], '.', '/' and the sub names. +// parseTypeName parses an Any type URL or an extension field name. The name is +// enclosed in [ and ] characters. We allow almost arbitrary type URL prefixes, +// closely following the text-format spec [1,2]. We implement "ExtensionName | +// AnyName" as follows (with some exceptions for backwards compatibility): +// +// char = [-_a-zA-Z0-9] +// url_char = char | [.~!$&'()*+,;=] | "%", hex, hex +// +// Ident = char, { char } +// TypeName = Ident, { ".", Ident } ; +// UrlPrefix = url_char, { url_char | "/" } ; +// ExtensionName = "[", TypeName, "]" ; +// AnyName = "[", UrlPrefix, "/", TypeName, "]" ; +// +// Additionally, we allow arbitrary whitespace and comments between [ and ]. +// +// [1] https://protobuf.dev/reference/protobuf/textformat-spec/#characters +// [2] https://protobuf.dev/reference/protobuf/textformat-spec/#field-names func (d *Decoder) parseTypeName() (Token, error) { - startPos := len(d.orig) - len(d.in) // Use alias s to advance first in order to use d.in for error handling. - // Caller already checks for [ as first character. + // Caller already checks for [ as first character (d.in[0] == '['). s := consume(d.in[1:], 0) if len(s) == 0 { return Token{}, ErrUnexpectedEOF } + // Collect everything between [ and ] in name. var name []byte - for len(s) > 0 && isTypeNameChar(s[0]) { - name = append(name, s[0]) - s = s[1:] - } - s = consume(s, 0) - var closed bool for len(s) > 0 && !closed { switch { @@ -452,23 +459,20 @@ func (d *Decoder) parseTypeName() (Token, error) { s = s[1:] closed = true - case s[0] == '/', s[0] == '.': - if len(name) > 0 && (name[len(name)-1] == '/' || name[len(name)-1] == '.') { - return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s", - d.orig[startPos:len(d.orig)-len(s)+1]) - } + case s[0] == '/' || isTypeNameChar(s[0]) || isUrlExtraChar(s[0]): name = append(name, s[0]) - s = s[1:] - s = consume(s, 0) - for len(s) > 0 && isTypeNameChar(s[0]) { - name = append(name, s[0]) - s = s[1:] + s = consume(s[1:], 0) + + // URL percent-encoded chars + case s[0] == '%': + if len(s) < 3 || !isHexChar(s[1]) || !isHexChar(s[2]) { + return Token{}, d.parseTypeNameError(s, 3) } - s = consume(s, 0) + name = append(name, s[0], s[1], s[2]) + s = consume(s[3:], 0) default: - return Token{}, d.newSyntaxError( - "invalid type URL/extension field name: %s", d.orig[startPos:len(d.orig)-len(s)+1]) + return Token{}, d.parseTypeNameError(s, 1) } } @@ -476,15 +480,38 @@ func (d *Decoder) parseTypeName() (Token, error) { return Token{}, ErrUnexpectedEOF } - // First character cannot be '.'. Last character cannot be '.' or '/'. - size := len(name) - if size == 0 || name[0] == '.' || name[size-1] == '.' || name[size-1] == '/' { - return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s", - d.orig[startPos:len(d.orig)-len(s)]) + // Split collected name on last '/' into urlPrefix and typeName (if '/' is + // present). + typeName := name + if i := bytes.LastIndexByte(name, '/'); i != -1 { + urlPrefix := name[:i] + typeName = name[i+1:] + + // urlPrefix may be empty (for backwards compatibility). + // If non-empty, it must not start with '/'. + if len(urlPrefix) > 0 && urlPrefix[0] == '/' { + return Token{}, d.parseTypeNameError(s, 0) + } } + // typeName must not be empty (note: "" splits to [""]) and all identifier + // parts must not be empty. + for _, ident := range bytes.Split(typeName, []byte{'.'}) { + if len(ident) == 0 { + return Token{}, d.parseTypeNameError(s, 0) + } + } + + // typeName must not contain any percent-encoded or special URL chars. + for _, b := range typeName { + if b == '%' || (b != '.' && isUrlExtraChar(b)) { + return Token{}, d.parseTypeNameError(s, 0) + } + } + + startPos := len(d.orig) - len(d.in) + endPos := len(d.orig) - len(s) d.in = s - endPos := len(d.orig) - len(d.in) d.consume(0) return Token{ @@ -496,16 +523,32 @@ func (d *Decoder) parseTypeName() (Token, error) { }, nil } +func (d *Decoder) parseTypeNameError(s []byte, numUnconsumedChars int) error { + return d.newSyntaxError( + "invalid type URL/extension field name: %s", + d.in[:len(d.in)-len(s)+min(numUnconsumedChars, len(s))], + ) +} + +func isHexChar(b byte) bool { + return ('0' <= b && b <= '9') || + ('a' <= b && b <= 'f') || + ('A' <= b && b <= 'F') +} + func isTypeNameChar(b byte) bool { - return (b == '-' || b == '_' || + return b == '-' || b == '_' || ('0' <= b && b <= '9') || ('a' <= b && b <= 'z') || - ('A' <= b && b <= 'Z')) + ('A' <= b && b <= 'Z') } -func isWhiteSpace(b byte) bool { +// isUrlExtraChar complements isTypeNameChar with extra characters that we allow +// in URLs but not in type names. Note that '/' is not included so that it can +// be treated specially. +func isUrlExtraChar(b byte) bool { switch b { - case ' ', '\n', '\r', '\t': + case '.', '~', '!', '$', '&', '(', ')', '*', '+', ',', ';', '=': return true default: return false diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index dbcf90b871..c775e5832f 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -32,6 +32,7 @@ const ( EditionProto3 Edition = 999 Edition2023 Edition = 1000 Edition2024 Edition = 1001 + EditionUnstable Edition = 9999 EditionUnsupported Edition = 100000 ) diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go index dd31faaeb0..78f02b1b49 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go @@ -330,7 +330,6 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) extensionIdx++ case genid.DescriptorProto_Options_field_number: - md.unmarshalOptions(v) rawOptions = appendOptions(rawOptions, v) } default: @@ -356,27 +355,6 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions) } -func (md *Message) unmarshalOptions(b []byte) { - for len(b) > 0 { - num, typ, n := protowire.ConsumeTag(b) - b = b[n:] - switch typ { - case protowire.VarintType: - v, m := protowire.ConsumeVarint(b) - b = b[m:] - switch num { - case genid.MessageOptions_MapEntry_field_number: - md.L1.IsMapEntry = protowire.DecodeBool(v) - case genid.MessageOptions_MessageSetWireFormat_field_number: - md.L1.IsMessageSet = protowire.DecodeBool(v) - } - default: - m := protowire.ConsumeFieldValue(num, typ, b) - b = b[m:] - } - } -} - func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go index 950a6a325a..65aaf4d210 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go @@ -26,6 +26,7 @@ const ( Edition_EDITION_PROTO3_enum_value = 999 Edition_EDITION_2023_enum_value = 1000 Edition_EDITION_2024_enum_value = 1001 + Edition_EDITION_UNSTABLE_enum_value = 9999 Edition_EDITION_1_TEST_ONLY_enum_value = 1 Edition_EDITION_2_TEST_ONLY_enum_value = 2 Edition_EDITION_99997_TEST_ONLY_enum_value = 99997 diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go index 229c698013..4a3bf393ef 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go @@ -113,6 +113,9 @@ func sizeMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalO } func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { + if opts.depth--; opts.depth < 0 { + return out, errRecursionDepth + } if wtyp != protowire.BytesType { return out, errUnknown } @@ -170,6 +173,9 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo } func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { + if opts.depth--; opts.depth < 0 { + return out, errRecursionDepth + } if wtyp != protowire.BytesType { return out, errUnknown } diff --git a/vendor/google.golang.org/protobuf/internal/impl/decode.go b/vendor/google.golang.org/protobuf/internal/impl/decode.go index e0dd21fa5f..1228b5c8c2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/decode.go +++ b/vendor/google.golang.org/protobuf/internal/impl/decode.go @@ -102,8 +102,7 @@ var errUnknown = errors.New("unknown") func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) { mi.init() - opts.depth-- - if opts.depth < 0 { + if opts.depth--; opts.depth < 0 { return out, errRecursionDepth } if flags.ProtoLegacy && mi.isMessageSet { diff --git a/vendor/google.golang.org/protobuf/internal/impl/validate.go b/vendor/google.golang.org/protobuf/internal/impl/validate.go index 7b2995dde5..99a1eb95f7 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/validate.go +++ b/vendor/google.golang.org/protobuf/internal/impl/validate.go @@ -68,9 +68,13 @@ func Validate(mt protoreflect.MessageType, in protoiface.UnmarshalInput) (out pr if in.Resolver == nil { in.Resolver = protoregistry.GlobalTypes } + if in.Depth == 0 { + in.Depth = protowire.DefaultRecursionLimit + } o, st := mi.validate(in.Buf, 0, unmarshalOptions{ flags: in.Flags, resolver: in.Resolver, + depth: in.Depth, }) if o.initialized { out.Flags |= protoiface.UnmarshalInitialized @@ -257,6 +261,9 @@ func (mi *MessageInfo) validate(b []byte, groupTag protowire.Number, opts unmars states[0].typ = validationTypeGroup states[0].endGroup = groupTag } + if opts.depth--; opts.depth < 0 { + return out, ValidationInvalid + } initialized := true start := len(b) State: @@ -451,6 +458,13 @@ State: mi: vi.mi, tail: b, }) + if vi.typ == validationTypeMessage || + vi.typ == validationTypeGroup || + vi.typ == validationTypeMap { + if opts.depth--; opts.depth < 0 { + return out, ValidationInvalid + } + } b = v continue State case validationTypeRepeatedVarint: @@ -499,6 +513,9 @@ State: mi: vi.mi, endGroup: num, }) + if opts.depth--; opts.depth < 0 { + return out, ValidationInvalid + } continue State case flags.ProtoLegacy && vi.typ == validationTypeMessageSetItem: typeid, v, n, err := messageset.ConsumeFieldValue(b, false) @@ -521,6 +538,13 @@ State: mi: xvi.mi, tail: b[n:], }) + if xvi.typ == validationTypeMessage || + xvi.typ == validationTypeGroup || + xvi.typ == validationTypeMap { + if opts.depth--; opts.depth < 0 { + return out, ValidationInvalid + } + } b = v continue State } @@ -547,12 +571,14 @@ State: switch st.typ { case validationTypeMessage, validationTypeGroup: numRequiredFields = int(st.mi.numRequiredFields) + opts.depth++ case validationTypeMap: // If this is a map field with a message value that contains // required fields, require that the value be present. if st.mi != nil && st.mi.numRequiredFields > 0 { numRequiredFields = 1 } + opts.depth++ } // If there are more than 64 required fields, this check will // always fail and we will report that the message is potentially diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 77de0f238c..763fd82841 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -52,7 +52,7 @@ import ( const ( Major = 1 Minor = 36 - Patch = 10 + Patch = 11 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index 4cbf1aeaf7..889d8511d2 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -121,9 +121,8 @@ func (o UnmarshalOptions) unmarshal(b []byte, m protoreflect.Message) (out proto out, err = methods.Unmarshal(in) } else { - o.RecursionLimit-- - if o.RecursionLimit < 0 { - return out, errors.New("exceeded max recursion depth") + if o.RecursionLimit--; o.RecursionLimit < 0 { + return out, errRecursionDepth } err = o.unmarshalMessageSlow(b, m) } @@ -220,6 +219,9 @@ func (o UnmarshalOptions) unmarshalSingular(b []byte, wtyp protowire.Type, m pro } func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv protoreflect.Map, fd protoreflect.FieldDescriptor) (n int, err error) { + if o.RecursionLimit--; o.RecursionLimit < 0 { + return 0, errRecursionDepth + } if wtyp != protowire.BytesType { return 0, errUnknown } @@ -305,3 +307,5 @@ func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv proto var errUnknown = errors.New("BUG: internal error (unknown)") var errDecode = errors.New("cannot parse invalid wire-format data") + +var errRecursionDepth = errors.New("exceeded maximum recursion depth") diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go index 9196288e4a..40f17af4e3 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go @@ -108,7 +108,9 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot if f.L1.Path == "" { return nil, errors.New("file path must be populated") } - if f.L1.Syntax == protoreflect.Editions && (fd.GetEdition() < editionssupport.Minimum || fd.GetEdition() > editionssupport.Maximum) { + if f.L1.Syntax == protoreflect.Editions && + (fd.GetEdition() < editionssupport.Minimum || fd.GetEdition() > editionssupport.Maximum) && + fd.GetEdition() != descriptorpb.Edition_EDITION_UNSTABLE { // Allow cmd/protoc-gen-go/testdata to use any edition for easier // testing of upcoming edition features. if !strings.HasPrefix(fd.GetName(), "cmd/protoc-gen-go/testdata/") { @@ -152,6 +154,7 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot imp := &f.L2.Imports[i] imps.importPublic(imp.Imports()) } + optionImps := importSet{f.Path(): true} if len(fd.GetOptionDependency()) > 0 { optionImports := make(filedesc.FileImports, len(fd.GetOptionDependency())) for i, path := range fd.GetOptionDependency() { @@ -165,10 +168,12 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot } imp.FileDescriptor = f - if imps[imp.Path()] { + if imps[imp.Path()] || optionImps[imp.Path()] { return nil, errors.New("already imported %q", path) } - imps[imp.Path()] = true + // This needs to be a separate map so that we don't recognize non-options + // symbols coming from option imports. + optionImps[imp.Path()] = true } f.L2.OptionImports = func() protoreflect.FileImports { return &optionImports diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go index 697a61b290..147b8c7398 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go @@ -46,6 +46,8 @@ func toEditionProto(ed filedesc.Edition) descriptorpb.Edition { return descriptorpb.Edition_EDITION_2023 case filedesc.Edition2024: return descriptorpb.Edition_EDITION_2024 + case filedesc.EditionUnstable: + return descriptorpb.Edition_EDITION_UNSTABLE default: panic(fmt.Sprintf("unknown value for edition: %v", ed)) } @@ -58,7 +60,7 @@ func getFeatureSetFor(ed filedesc.Edition) *descriptorpb.FeatureSet { return def } edpb := toEditionProto(ed) - if defaults.GetMinimumEdition() > edpb || defaults.GetMaximumEdition() < edpb { + if (defaults.GetMinimumEdition() > edpb || defaults.GetMaximumEdition() < edpb) && edpb != descriptorpb.Edition_EDITION_UNSTABLE { // This should never happen protodesc.(FileOptions).New would fail when // initializing the file descriptor. // This most likely means the embedded defaults were not updated. diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go index 4eacb523c3..0b23faa957 100644 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go @@ -69,6 +69,8 @@ const ( // comparison. Edition_EDITION_2023 Edition = 1000 Edition_EDITION_2024 Edition = 1001 + // A placeholder edition for developing and testing unscheduled features. + Edition_EDITION_UNSTABLE Edition = 9999 // Placeholder editions for testing feature resolution. These should not be // used or relied on outside of tests. Edition_EDITION_1_TEST_ONLY Edition = 1 @@ -91,6 +93,7 @@ var ( 999: "EDITION_PROTO3", 1000: "EDITION_2023", 1001: "EDITION_2024", + 9999: "EDITION_UNSTABLE", 1: "EDITION_1_TEST_ONLY", 2: "EDITION_2_TEST_ONLY", 99997: "EDITION_99997_TEST_ONLY", @@ -105,6 +108,7 @@ var ( "EDITION_PROTO3": 999, "EDITION_2023": 1000, "EDITION_2024": 1001, + "EDITION_UNSTABLE": 9999, "EDITION_1_TEST_ONLY": 1, "EDITION_2_TEST_ONLY": 2, "EDITION_99997_TEST_ONLY": 99997, @@ -4793,11 +4797,11 @@ const file_google_protobuf_descriptor_proto_rawDesc = "" + "\x18EnumValueDescriptorProto\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n" + "\x06number\x18\x02 \x01(\x05R\x06number\x12;\n" + - "\aoptions\x18\x03 \x01(\v2!.google.protobuf.EnumValueOptionsR\aoptions\"\xa7\x01\n" + + "\aoptions\x18\x03 \x01(\v2!.google.protobuf.EnumValueOptionsR\aoptions\"\xb5\x01\n" + "\x16ServiceDescriptorProto\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12>\n" + "\x06method\x18\x02 \x03(\v2&.google.protobuf.MethodDescriptorProtoR\x06method\x129\n" + - "\aoptions\x18\x03 \x01(\v2\x1f.google.protobuf.ServiceOptionsR\aoptions\"\x89\x02\n" + + "\aoptions\x18\x03 \x01(\v2\x1f.google.protobuf.ServiceOptionsR\aoptionsJ\x04\b\x04\x10\x05R\x06stream\"\x89\x02\n" + "\x15MethodDescriptorProto\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + "\n" + @@ -5033,14 +5037,15 @@ const file_google_protobuf_descriptor_proto_rawDesc = "" + "\bSemantic\x12\b\n" + "\x04NONE\x10\x00\x12\a\n" + "\x03SET\x10\x01\x12\t\n" + - "\x05ALIAS\x10\x02*\xa7\x02\n" + + "\x05ALIAS\x10\x02*\xbe\x02\n" + "\aEdition\x12\x13\n" + "\x0fEDITION_UNKNOWN\x10\x00\x12\x13\n" + "\x0eEDITION_LEGACY\x10\x84\a\x12\x13\n" + "\x0eEDITION_PROTO2\x10\xe6\a\x12\x13\n" + "\x0eEDITION_PROTO3\x10\xe7\a\x12\x11\n" + "\fEDITION_2023\x10\xe8\a\x12\x11\n" + - "\fEDITION_2024\x10\xe9\a\x12\x17\n" + + "\fEDITION_2024\x10\xe9\a\x12\x15\n" + + "\x10EDITION_UNSTABLE\x10\x8fN\x12\x17\n" + "\x13EDITION_1_TEST_ONLY\x10\x01\x12\x17\n" + "\x13EDITION_2_TEST_ONLY\x10\x02\x12\x1d\n" + "\x17EDITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n" + diff --git a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go index 06d584c14b..484c21fd53 100644 --- a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go @@ -172,13 +172,14 @@ import ( // ) to obtain a formatter capable of generating timestamps in this format. type Timestamp struct { state protoimpl.MessageState `protogen:"open.v1"` - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. + // Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must + // be between -315576000000 and 315576000000 inclusive (which corresponds to + // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z). Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 + // Non-negative fractions of a second at nanosecond resolution. This field is + // the nanosecond portion of the duration, not an alternative to seconds. + // Negative second values with fractions must still have non-negative nanos + // values that count forward in time. Must be between 0 and 999,999,999 // inclusive. Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` unknownFields protoimpl.UnknownFields diff --git a/vendor/modules.txt b/vendor/modules.txt index 087d8581e4..76d3c9b1a2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -54,14 +54,14 @@ github.com/CortexFoundation/inference/synapse # github.com/CortexFoundation/merkletree v0.0.0-20250807103550-396f9f0ba0f1 ## explicit; go 1.22 github.com/CortexFoundation/merkletree -# github.com/CortexFoundation/robot v1.0.7-0.20251009210220-5dbe0a584392 +# github.com/CortexFoundation/robot v1.0.7-0.20251209195009-d70c8c78437e ## explicit; go 1.24.4 github.com/CortexFoundation/robot github.com/CortexFoundation/robot/backend # github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66 ## explicit; go 1.16 github.com/CortexFoundation/statik -# github.com/CortexFoundation/torrentfs v1.0.73-0.20251206142004-4323a1e1ed27 +# github.com/CortexFoundation/torrentfs v1.0.73-0.20251217130652-29bcb4ed05d5 ## explicit; go 1.24.4 github.com/CortexFoundation/torrentfs github.com/CortexFoundation/torrentfs/backend @@ -81,7 +81,7 @@ github.com/Microsoft/go-winio/internal/fs github.com/Microsoft/go-winio/internal/socket github.com/Microsoft/go-winio/internal/stringbuffer github.com/Microsoft/go-winio/pkg/guid -# github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251119083800-2aa1d4cc79d7 +# github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251213223233-751f36331c62 ## explicit; go 1.24.0 github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime # github.com/RoaringBitmap/roaring v1.9.4 @@ -164,7 +164,7 @@ github.com/anacrolix/stm/stmutil # github.com/anacrolix/sync v0.6.0 ## explicit; go 1.22 github.com/anacrolix/sync -# github.com/anacrolix/torrent v1.60.1-0.20251203050330-6022de0123ad +# github.com/anacrolix/torrent v1.60.1-0.20251217073903-486bcbe758e0 ## explicit; go 1.24.0 github.com/anacrolix/torrent github.com/anacrolix/torrent/analysis @@ -222,7 +222,7 @@ github.com/arsham/figurine/figurine # github.com/arsham/rainbow v1.2.1 ## explicit; go 1.18 github.com/arsham/rainbow/rainbow -# github.com/aws/aws-sdk-go-v2 v1.40.1 +# github.com/aws/aws-sdk-go-v2 v1.41.0 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/aws github.com/aws/aws-sdk-go-v2/aws/defaults @@ -248,10 +248,10 @@ github.com/aws/aws-sdk-go-v2/internal/shareddefaults github.com/aws/aws-sdk-go-v2/internal/strings github.com/aws/aws-sdk-go-v2/internal/sync/singleflight github.com/aws/aws-sdk-go-v2/internal/timeconv -# github.com/aws/aws-sdk-go-v2/config v1.32.3 +# github.com/aws/aws-sdk-go-v2/config v1.32.6 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/config -# github.com/aws/aws-sdk-go-v2/credentials v1.19.3 +# github.com/aws/aws-sdk-go-v2/credentials v1.19.6 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds @@ -261,14 +261,14 @@ github.com/aws/aws-sdk-go-v2/credentials/logincreds github.com/aws/aws-sdk-go-v2/credentials/processcreds github.com/aws/aws-sdk-go-v2/credentials/ssocreds github.com/aws/aws-sdk-go-v2/credentials/stscreds -# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 +# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config -# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 +# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/configsources -# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 +# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 # github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 @@ -277,31 +277,31 @@ github.com/aws/aws-sdk-go-v2/internal/ini # github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding -# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 +# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -# github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1 +# github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/route53 github.com/aws/aws-sdk-go-v2/service/route53/internal/customizations github.com/aws/aws-sdk-go-v2/service/route53/internal/endpoints github.com/aws/aws-sdk-go-v2/service/route53/types -# github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 +# github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/signin github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints github.com/aws/aws-sdk-go-v2/service/signin/types -# github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 +# github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sso/types -# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 +# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ssooidc/types -# github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 +# github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints @@ -365,13 +365,13 @@ github.com/cespare/xxhash/v2 # github.com/charmbracelet/bubbletea v1.3.10 ## explicit; go 1.24.0 github.com/charmbracelet/bubbletea -# github.com/charmbracelet/colorprofile v0.3.3 +# github.com/charmbracelet/colorprofile v0.4.1 ## explicit; go 1.24.2 github.com/charmbracelet/colorprofile # github.com/charmbracelet/lipgloss v1.1.0 ## explicit; go 1.18 github.com/charmbracelet/lipgloss -# github.com/charmbracelet/x/ansi v0.11.2 +# github.com/charmbracelet/x/ansi v0.11.3 ## explicit; go 1.24.2 github.com/charmbracelet/x/ansi github.com/charmbracelet/x/ansi/parser @@ -381,7 +381,7 @@ github.com/charmbracelet/x/cellbuf # github.com/charmbracelet/x/term v0.2.2 ## explicit; go 1.24.0 github.com/charmbracelet/x/term -# github.com/clipperhouse/displaywidth v0.6.1 +# github.com/clipperhouse/displaywidth v0.6.2 ## explicit; go 1.18 github.com/clipperhouse/displaywidth # github.com/clipperhouse/stringish v0.1.1 @@ -531,7 +531,7 @@ github.com/deckarep/golang-set/v2 ## explicit; go 1.17 github.com/decred/dcrd/dcrec/secp256k1/v4 github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa -# github.com/dgraph-io/badger/v4 v4.8.1-0.20250905144248-6cbc8fde682c +# github.com/dgraph-io/badger/v4 v4.9.0 ## explicit; go 1.23.0 github.com/dgraph-io/badger/v4 github.com/dgraph-io/badger/v4/fb @@ -639,7 +639,7 @@ github.com/go-logr/stdr ## explicit; go 1.12 github.com/go-ole/go-ole github.com/go-ole/go-ole/oleutil -# github.com/go-resty/resty/v2 v2.17.0 +# github.com/go-resty/resty/v2 v2.17.1 ## explicit; go 1.23.0 github.com/go-resty/resty/v2 github.com/go-resty/resty/v2/shellescape @@ -691,8 +691,8 @@ github.com/google/go-querystring/query ## explicit; go 1.12 github.com/google/gofuzz github.com/google/gofuzz/bytesource -# github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 -## explicit; go 1.24.0 +# github.com/google/pprof v0.0.0-20251213031049-b05bdaca462f +## explicit; go 1.24.9 github.com/google/pprof/profile # github.com/google/uuid v1.6.0 ## explicit @@ -752,7 +752,7 @@ github.com/influxdata/line-protocol # github.com/jackpal/go-nat-pmp v1.0.2 ## explicit github.com/jackpal/go-nat-pmp -# github.com/jedib0t/go-pretty/v6 v6.7.5 +# github.com/jedib0t/go-pretty/v6 v6.7.7 ## explicit; go 1.18 github.com/jedib0t/go-pretty/v6/progress github.com/jedib0t/go-pretty/v6/text @@ -889,7 +889,7 @@ github.com/pion/dtls/v2/pkg/protocol/alert github.com/pion/dtls/v2/pkg/protocol/extension github.com/pion/dtls/v2/pkg/protocol/handshake github.com/pion/dtls/v2/pkg/protocol/recordlayer -# github.com/pion/dtls/v3 v3.0.8 +# github.com/pion/dtls/v3 v3.0.9 ## explicit; go 1.21 github.com/pion/dtls/v3 github.com/pion/dtls/v3/internal/ciphersuite @@ -913,7 +913,7 @@ github.com/pion/dtls/v3/pkg/protocol/alert github.com/pion/dtls/v3/pkg/protocol/extension github.com/pion/dtls/v3/pkg/protocol/handshake github.com/pion/dtls/v3/pkg/protocol/recordlayer -# github.com/pion/ice/v4 v4.0.13 +# github.com/pion/ice/v4 v4.1.0 ## explicit; go 1.21 github.com/pion/ice/v4 github.com/pion/ice/v4/internal/atomic @@ -993,7 +993,7 @@ github.com/pion/turn/v4/internal/client github.com/pion/turn/v4/internal/ipnet github.com/pion/turn/v4/internal/proto github.com/pion/turn/v4/internal/server -# github.com/pion/webrtc/v4 v4.1.7 +# github.com/pion/webrtc/v4 v4.1.8 ## explicit; go 1.21 github.com/pion/webrtc/v4 github.com/pion/webrtc/v4/internal/fmtp @@ -1155,23 +1155,24 @@ go.etcd.io/bbolt/internal/freelist ## explicit; go 1.24.0 go.opentelemetry.io/auto/sdk go.opentelemetry.io/auto/sdk/internal/telemetry -# go.opentelemetry.io/otel v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel go.opentelemetry.io/otel/attribute go.opentelemetry.io/otel/attribute/internal +go.opentelemetry.io/otel/attribute/internal/xxhash go.opentelemetry.io/otel/baggage go.opentelemetry.io/otel/codes go.opentelemetry.io/otel/internal/baggage go.opentelemetry.io/otel/internal/global go.opentelemetry.io/otel/propagation go.opentelemetry.io/otel/semconv/v1.37.0 -# go.opentelemetry.io/otel/metric v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/metric v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/metric/embedded -# go.opentelemetry.io/otel/trace v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/trace v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/trace go.opentelemetry.io/otel/trace/embedded go.opentelemetry.io/otel/trace/internal/telemetry @@ -1185,7 +1186,7 @@ go.uber.org/automaxprocs/maxprocs # go.yaml.in/yaml/v2 v2.4.3 ## explicit; go 1.15 go.yaml.in/yaml/v2 -# golang.org/x/crypto v0.45.0 +# golang.org/x/crypto v0.46.0 ## explicit; go 1.24.0 golang.org/x/crypto/blake2b golang.org/x/crypto/blake2s @@ -1206,7 +1207,7 @@ golang.org/x/crypto/ripemd160 golang.org/x/crypto/scrypt golang.org/x/crypto/sha3 golang.org/x/crypto/ssh/terminal -# golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 +# golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 ## explicit; go 1.24.0 golang.org/x/exp/constraints golang.org/x/exp/rand @@ -1219,13 +1220,13 @@ golang.org/x/mobile/internal/binres golang.org/x/mobile/internal/importers golang.org/x/mobile/internal/importers/java golang.org/x/mobile/internal/importers/objc -# golang.org/x/mod v0.30.0 +# golang.org/x/mod v0.31.0 ## explicit; go 1.24.0 golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.47.0 +# golang.org/x/net v0.48.0 ## explicit; go 1.24.0 golang.org/x/net/bpf golang.org/x/net/dns/dnsmessage @@ -1243,23 +1244,23 @@ golang.org/x/net/ipv6 golang.org/x/net/proxy golang.org/x/net/publicsuffix golang.org/x/net/trace -# golang.org/x/sync v0.18.0 +# golang.org/x/sync v0.19.0 ## explicit; go 1.24.0 golang.org/x/sync/errgroup golang.org/x/sync/semaphore golang.org/x/sync/singleflight golang.org/x/sync/syncmap -# golang.org/x/sys v0.38.0 +# golang.org/x/sys v0.39.0 ## explicit; go 1.24.0 golang.org/x/sys/cpu golang.org/x/sys/execabs golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.37.0 +# golang.org/x/term v0.38.0 ## explicit; go 1.24.0 golang.org/x/term -# golang.org/x/text v0.31.0 +# golang.org/x/text v0.32.0 ## explicit; go 1.24.0 golang.org/x/text/cases golang.org/x/text/collate @@ -1278,7 +1279,7 @@ golang.org/x/text/width # golang.org/x/time v0.14.0 ## explicit; go 1.24.0 golang.org/x/time/rate -# golang.org/x/tools v0.39.0 +# golang.org/x/tools v0.40.0 ## explicit; go 1.24.0 golang.org/x/tools/cmd/stringer golang.org/x/tools/go/ast/astutil @@ -1305,7 +1306,7 @@ golang.org/x/tools/internal/stdlib golang.org/x/tools/internal/typeparams golang.org/x/tools/internal/typesinternal golang.org/x/tools/internal/versions -# google.golang.org/protobuf v1.36.10 +# google.golang.org/protobuf v1.36.11 ## explicit; go 1.23 google.golang.org/protobuf/cmd/protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo