From dec70f50f7bfc1525809cf7c41f627523ffcc485 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Fri, 31 May 2024 20:31:22 +0200 Subject: [PATCH] Update On Fri May 31 20:31:22 CEST 2024 --- .github/update.log | 1 + clash-meta/.github/workflows/build.yml | 4 + clash-meta/adapter/outbound/hysteria2.go | 4 +- clash-meta/adapter/outbound/ssh.go | 8 +- clash-meta/common/convert/util.go | 6 +- clash-meta/common/pool/alloc_test.go | 4 +- clash-meta/common/utils/uuid.go | 38 +- clash-meta/component/resolver/host.go | 4 +- clash-meta/component/resolver/resolver.go | 10 +- clash-meta/component/tls/reality.go | 6 +- clash-meta/dns/client.go | 4 +- clash-meta/go.mod | 2 +- clash-meta/go.sum | 4 +- .../transport/hysteria/conns/udp/hop.go | 6 +- .../transport/hysteria/conns/wechat/obfs.go | 4 +- clash-meta/transport/hysteria/core/client.go | 4 +- clash-meta/transport/hysteria/obfs/xplus.go | 5 +- clash-meta/transport/simple-obfs/http.go | 7 +- clash-meta/transport/simple-obfs/tls.go | 7 +- clash-meta/transport/ssr/obfs/http_simple.go | 10 +- clash-meta/transport/ssr/obfs/random_head.go | 7 +- .../transport/ssr/obfs/tls1.2_ticket_auth.go | 11 +- .../ssr/protocol/auth_aes128_sha1.go | 17 +- .../transport/ssr/protocol/auth_sha1_v4.go | 6 +- clash-meta/transport/ssr/protocol/base.go | 7 +- clash-meta/transport/ssr/protocol/protocol.go | 4 +- .../transport/tuic/congestion/bbr_sender.go | 4 +- .../tuic/congestion_v2/bbr_sender.go | 4 +- clash-meta/transport/tuic/v4/client.go | 4 +- clash-meta/transport/tuic/v5/client.go | 4 +- clash-meta/transport/tuic/v5/packet.go | 4 +- clash-meta/transport/vless/vision/padding.go | 10 +- clash-meta/transport/vmess/conn.go | 9 +- clash-meta/transport/vmess/h2.go | 4 +- clash-meta/transport/vmess/http.go | 8 +- clash-meta/transport/vmess/vmess.go | 4 +- clash-meta/transport/vmess/websocket.go | 7 +- clash-nyanpasu/backend/Cargo.lock | 12 +- clash-nyanpasu/frontend/nyanpasu/package.json | 4 +- clash-nyanpasu/frontend/ui/package.json | 2 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/package.json | 2 +- clash-nyanpasu/pnpm-lock.yaml | 1960 +++++++++++++++-- echo/examples/config.json | 188 +- echo/go.mod | 2 +- echo/internal/cli/config.go | 9 +- echo/internal/cli/flags.go | 7 + echo/internal/conn/{conn.go => relay_conn.go} | 5 +- .../conn/{conn_test.go => relay_conn_test.go} | 0 .../internal/{transporter => conn}/ws_conn.go | 8 +- .../{transporter => conn}/ws_conn_test.go | 6 +- echo/internal/transporter/ws.go | 7 +- echo/internal/transporter/wss_mux.go | 7 +- echo/pkg/buffer/buffer.go | 8 +- hysteria/app/internal/http/server.go | 5 + lede/package/kernel/linux/modules/video.mk | 1 + lede/target/linux/x86/64/config-6.6 | 1 + lede/target/linux/x86/generic/config-6.6 | 1 + lede/target/linux/x86/legacy/config-6.6 | 1 + mieru/.github/workflows/external_connect.yaml | 17 + mieru/pkg/congestion/rtt.go | 22 + mieru/pkg/protocolv2/underlay_base.go | 5 +- mieru/pkg/protocolv2/underlay_tcp.go | 7 +- mieru/pkg/protocolv2/underlay_udp.go | 7 +- mieru/pkg/socks5/socks5.go | 4 +- .../deploy/externalconnect/client_tcp.json | 41 + .../deploy/externalconnect/client_udp.json | 42 + mieru/test/deploy/externalconnect/libtest.sh | 58 + .../deploy/externalconnect/server_tcp.json | 30 + .../deploy/externalconnect/server_udp.json | 31 + mieru/test/deploy/externalconnect/test.sh | 47 + mieru/test/deploy/externalconnect/test_tcp.sh | 80 + mieru/test/deploy/externalconnect/test_udp.sh | 80 + mieru/test/deploy/httptest/Dockerfile | 2 +- mieru/test/deploy/proxychain/Dockerfile | 2 +- mihomo/.github/workflows/build.yml | 4 + mihomo/adapter/outbound/hysteria2.go | 4 +- mihomo/adapter/outbound/ssh.go | 8 +- mihomo/common/convert/util.go | 6 +- mihomo/common/pool/alloc_test.go | 4 +- mihomo/common/utils/uuid.go | 38 +- mihomo/component/resolver/host.go | 4 +- mihomo/component/resolver/resolver.go | 10 +- mihomo/component/tls/reality.go | 6 +- mihomo/dns/client.go | 4 +- mihomo/go.mod | 2 +- mihomo/go.sum | 4 +- mihomo/transport/hysteria/conns/udp/hop.go | 6 +- .../transport/hysteria/conns/wechat/obfs.go | 4 +- mihomo/transport/hysteria/core/client.go | 4 +- mihomo/transport/hysteria/obfs/xplus.go | 5 +- mihomo/transport/simple-obfs/http.go | 7 +- mihomo/transport/simple-obfs/tls.go | 7 +- mihomo/transport/ssr/obfs/http_simple.go | 10 +- mihomo/transport/ssr/obfs/random_head.go | 7 +- .../transport/ssr/obfs/tls1.2_ticket_auth.go | 11 +- .../ssr/protocol/auth_aes128_sha1.go | 17 +- mihomo/transport/ssr/protocol/auth_sha1_v4.go | 6 +- mihomo/transport/ssr/protocol/base.go | 7 +- mihomo/transport/ssr/protocol/protocol.go | 4 +- .../transport/tuic/congestion/bbr_sender.go | 4 +- .../tuic/congestion_v2/bbr_sender.go | 4 +- mihomo/transport/tuic/v4/client.go | 4 +- mihomo/transport/tuic/v5/client.go | 4 +- mihomo/transport/tuic/v5/packet.go | 4 +- mihomo/transport/vless/vision/padding.go | 10 +- mihomo/transport/vmess/conn.go | 9 +- mihomo/transport/vmess/h2.go | 4 +- mihomo/transport/vmess/http.go | 8 +- mihomo/transport/vmess/vmess.go | 4 +- mihomo/transport/vmess/websocket.go | 7 +- openwrt-passwall/luci-app-passwall/Makefile | 2 +- .../model/cbi/passwall/client/shunt_rules.lua | 13 +- .../model/cbi/passwall/client/type/ray.lua | 43 +- .../luasrc/passwall/util_xray.lua | 2 + sing-box/docs/changelog.md | 26 +- sing-box/docs/configuration/inbound/tun.md | 28 +- sing-box/docs/configuration/inbound/tun.zh.md | 21 +- sing-box/go.mod | 10 +- sing-box/go.sum | 24 +- sing-box/inbound/tun.go | 2 +- sing-box/inbound/tun_auto_redirect.go | 416 +--- .../inbound/tun_auto_redirect_iptables.go | 235 ++ .../inbound/tun_auto_redirect_nftables.go | 231 ++ .../tun_auto_redirect_nftables_expr.go | 153 ++ sing-box/inbound/tun_auto_redirect_stub.go | 23 + small/luci-app-passwall/Makefile | 2 +- .../model/cbi/passwall/client/shunt_rules.lua | 13 +- .../model/cbi/passwall/client/type/ray.lua | 43 +- .../luasrc/passwall/util_xray.lua | 2 + v2rayu/Podfile | 5 +- v2rayu/Podfile.lock | 47 +- v2rayu/V2rayU.xcodeproj/project.pbxproj | 12 +- v2rayu/V2rayU/AppDelegate.swift | 18 +- v2rayu/V2rayU/Info.plist | 2 +- v2rayu/V2rayU/MainMenu.swift | 3 +- .../V2rayU/Preference/PreferenceGeneral.swift | 2 +- v2rayu/V2rayU/Sparkle.swift | 88 + .../transport/internet/udp/dispatcher.go | 2 +- yass/.github/workflows/compiler.yml | 30 +- yass/.github/workflows/releases-mingw-new.yml | 28 +- yass/.github/workflows/releases-mingw.yml | 5 +- yass/.gitignore | 26 +- yass/CMakeLists.txt | 155 +- yass/README.md | 10 +- yass/debian/changelog | 5 + yass/src/cli/cli.cpp | 2 + yass/src/core/utils.cpp | 21 +- yass/src/core/utils_win.cpp | 17 +- yass/src/gtk/yass.cpp | 2 + yass/src/gtk4/yass.cpp | 2 + yass/src/mimalloc.cc | 4 + yass/src/server/server.cpp | 2 + yass/src/win32/yass.cpp | 2 + .../src/windows/mini_disassembler.cc | 2 +- .../gperftools/src/windows/patch_functions.cc | 41 +- .../gperftools/src/windows/port.cc | 4 +- .../gperftools/src/windows/preamble_patcher.h | 4 +- .../src/windows/preamble_patcher_test.cc | 2 +- yass/third_party/mimalloc/CMakeLists.txt | 4 - .../mimalloc/include/mimalloc-new-delete.h | 14 +- .../mimalloc/src/prim/windows/prim.c | 3 + yass/tools/build.go | 16 +- yass/yass.spec.in | 2 + yt-dlp/.github/workflows/build.yml | 28 +- yt-dlp/pyproject.toml | 5 +- yt-dlp/yt_dlp/extractor/patreon.py | 3 +- 167 files changed, 3964 insertions(+), 1161 deletions(-) rename echo/internal/conn/{conn.go => relay_conn.go} (97%) rename echo/internal/conn/{conn_test.go => relay_conn_test.go} (100%) rename echo/internal/{transporter => conn}/ws_conn.go (83%) rename echo/internal/{transporter => conn}/ws_conn_test.go (94%) create mode 100644 mieru/.github/workflows/external_connect.yaml create mode 100644 mieru/test/deploy/externalconnect/client_tcp.json create mode 100644 mieru/test/deploy/externalconnect/client_udp.json create mode 100755 mieru/test/deploy/externalconnect/libtest.sh create mode 100644 mieru/test/deploy/externalconnect/server_tcp.json create mode 100644 mieru/test/deploy/externalconnect/server_udp.json create mode 100755 mieru/test/deploy/externalconnect/test.sh create mode 100755 mieru/test/deploy/externalconnect/test_tcp.sh create mode 100755 mieru/test/deploy/externalconnect/test_udp.sh create mode 100644 sing-box/inbound/tun_auto_redirect_iptables.go create mode 100644 sing-box/inbound/tun_auto_redirect_nftables.go create mode 100644 sing-box/inbound/tun_auto_redirect_nftables_expr.go create mode 100644 sing-box/inbound/tun_auto_redirect_stub.go create mode 100644 v2rayu/V2rayU/Sparkle.swift create mode 100644 yass/src/mimalloc.cc diff --git a/.github/update.log b/.github/update.log index 5aa8b5ca3e..3e52114316 100644 --- a/.github/update.log +++ b/.github/update.log @@ -663,3 +663,4 @@ Update On Mon May 27 20:31:35 CEST 2024 Update On Tue May 28 20:30:03 CEST 2024 Update On Wed May 29 20:30:48 CEST 2024 Update On Thu May 30 20:33:19 CEST 2024 +Update On Fri May 31 20:31:11 CEST 2024 diff --git a/clash-meta/.github/workflows/build.yml b/clash-meta/.github/workflows/build.yml index 42023755e1..9b8e000a12 100644 --- a/clash-meta/.github/workflows/build.yml +++ b/clash-meta/.github/workflows/build.yml @@ -206,6 +206,10 @@ jobs: sudo apt-get install dpkg if [ "${{matrix.jobs.abi}}" = "1" ]; then ARCH=loongarch64 + elif [ "${{matrix.jobs.goarm}}" = "7" ]; then + ARCH=armhf + elif [ "${{matrix.jobs.goarch}}" = "arm" ]; then + ARCH=armel else ARCH=${{matrix.jobs.goarch}} fi diff --git a/clash-meta/adapter/outbound/hysteria2.go b/clash-meta/adapter/outbound/hysteria2.go index 0ad7c2147a..b8abf39cc2 100644 --- a/clash-meta/adapter/outbound/hysteria2.go +++ b/clash-meta/adapter/outbound/hysteria2.go @@ -21,8 +21,8 @@ import ( "github.com/metacubex/sing-quic/hysteria2" + "github.com/metacubex/randv2" M "github.com/sagernet/sing/common/metadata" - "github.com/zhangyunhao116/fastrand" ) func init() { @@ -165,7 +165,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { }) if len(serverAddress) > 0 { clientOptions.ServerAddress = func(ctx context.Context) (*net.UDPAddr, error) { - return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[fastrand.Intn(len(serverAddress))], C.NewDNSPrefer(option.IPVersion)) + return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[randv2.IntN(len(serverAddress))], C.NewDNSPrefer(option.IPVersion)) } if option.HopInterval == 0 { diff --git a/clash-meta/adapter/outbound/ssh.go b/clash-meta/adapter/outbound/ssh.go index a0efabca4e..8b2776a663 100644 --- a/clash-meta/adapter/outbound/ssh.go +++ b/clash-meta/adapter/outbound/ssh.go @@ -17,7 +17,7 @@ import ( "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/crypto/ssh" ) @@ -180,10 +180,10 @@ func NewSsh(option SshOption) (*Ssh, error) { } version := "SSH-2.0-OpenSSH_" - if fastrand.Intn(2) == 0 { - version += "7." + strconv.Itoa(fastrand.Intn(10)) + if randv2.IntN(2) == 0 { + version += "7." + strconv.Itoa(randv2.IntN(10)) } else { - version += "8." + strconv.Itoa(fastrand.Intn(9)) + version += "8." + strconv.Itoa(randv2.IntN(9)) } config.ClientVersion = version diff --git a/clash-meta/common/convert/util.go b/clash-meta/common/convert/util.go index a715b556f5..ab00637493 100644 --- a/clash-meta/common/convert/util.go +++ b/clash-meta/common/convert/util.go @@ -8,8 +8,8 @@ import ( "github.com/metacubex/mihomo/common/utils" + "github.com/metacubex/randv2" "github.com/metacubex/sing-shadowsocks/shadowimpl" - "github.com/zhangyunhao116/fastrand" ) var hostsSuffix = []string{ @@ -302,11 +302,11 @@ func RandHost() string { prefix += string(buf[6:8]) + "-" prefix += string(buf[len(buf)-8:]) - return prefix + hostsSuffix[fastrand.Intn(hostsLen)] + return prefix + hostsSuffix[randv2.IntN(hostsLen)] } func RandUserAgent() string { - return userAgents[fastrand.Intn(uaLen)] + return userAgents[randv2.IntN(uaLen)] } func SetUserAgent(header http.Header) { diff --git a/clash-meta/common/pool/alloc_test.go b/clash-meta/common/pool/alloc_test.go index 0ac72ee05d..c76ff26a0c 100644 --- a/clash-meta/common/pool/alloc_test.go +++ b/clash-meta/common/pool/alloc_test.go @@ -3,8 +3,8 @@ package pool import ( "testing" + "github.com/metacubex/randv2" "github.com/stretchr/testify/assert" - "github.com/zhangyunhao116/fastrand" ) func TestAllocGet(t *testing.T) { @@ -43,6 +43,6 @@ func TestAllocPutThenGet(t *testing.T) { func BenchmarkMSB(b *testing.B) { for i := 0; i < b.N; i++ { - msb(fastrand.Int()) + msb(randv2.Int()) } } diff --git a/clash-meta/common/utils/uuid.go b/clash-meta/common/utils/uuid.go index f559b471fd..d9a8b78948 100644 --- a/clash-meta/common/utils/uuid.go +++ b/clash-meta/common/utils/uuid.go @@ -2,19 +2,39 @@ package utils import ( "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) -type fastRandReader struct{} +type unsafeRandReader struct{} -func (r fastRandReader) Read(p []byte) (int, error) { - return fastrand.Read(p) +func (r unsafeRandReader) Read(p []byte) (n int, err error) { + // modify from https://github.com/golang/go/blob/587c3847da81aa7cfc3b3db2677c8586c94df13a/src/runtime/rand.go#L70-L89 + // Inspired by wyrand. + n = len(p) + v := randv2.Uint64() + for len(p) > 0 { + v ^= 0xa0761d6478bd642f + v *= 0xe7037ed1a0b428db + size := 8 + if len(p) < 8 { + size = len(p) + } + for i := 0; i < size; i++ { + p[i] ^= byte(v >> (8 * i)) + } + p = p[size:] + v = v>>32 | v<<32 + } + + return } -var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(fastRandReader{})) +var UnsafeRandReader = unsafeRandReader{} + +var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(UnsafeRandReader)) func NewUUIDV1() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV1() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV1() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } @@ -23,7 +43,7 @@ func NewUUIDV3(ns uuid.UUID, name string) uuid.UUID { } func NewUUIDV4() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV4() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV4() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } @@ -32,12 +52,12 @@ func NewUUIDV5(ns uuid.UUID, name string) uuid.UUID { } func NewUUIDV6() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV6() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV6() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } func NewUUIDV7() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV7() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV7() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } diff --git a/clash-meta/component/resolver/host.go b/clash-meta/component/resolver/host.go index 53fa5924b8..34da8e9f58 100644 --- a/clash-meta/component/resolver/host.go +++ b/clash-meta/component/resolver/host.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/resolver/hosts" "github.com/metacubex/mihomo/component/trie" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -125,5 +125,5 @@ func (hv HostValue) RandIP() (netip.Addr, error) { if hv.IsDomain { return netip.Addr{}, errors.New("value type is error") } - return hv.IPs[fastrand.Intn(len(hv.IPs))], nil + return hv.IPs[randv2.IntN(len(hv.IPs))], nil } diff --git a/clash-meta/component/resolver/resolver.go b/clash-meta/component/resolver/resolver.go index f9b56e476b..07c68824c3 100644 --- a/clash-meta/component/resolver/resolver.go +++ b/clash-meta/component/resolver/resolver.go @@ -12,8 +12,8 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/trie" + "github.com/metacubex/randv2" "github.com/miekg/dns" - "github.com/zhangyunhao116/fastrand" ) var ( @@ -93,7 +93,7 @@ func ResolveIPv4WithResolver(ctx context.Context, host string, r Resolver) (neti } else if len(ips) == 0 { return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host) } - return ips[fastrand.Intn(len(ips))], nil + return ips[randv2.IntN(len(ips))], nil } // ResolveIPv4 with a host, return ipv4 @@ -149,7 +149,7 @@ func ResolveIPv6WithResolver(ctx context.Context, host string, r Resolver) (neti } else if len(ips) == 0 { return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host) } - return ips[fastrand.Intn(len(ips))], nil + return ips[randv2.IntN(len(ips))], nil } func ResolveIPv6(ctx context.Context, host string) (netip.Addr, error) { @@ -200,9 +200,9 @@ func ResolveIPWithResolver(ctx context.Context, host string, r Resolver) (netip. } ipv4s, ipv6s := SortationAddr(ips) if len(ipv4s) > 0 { - return ipv4s[fastrand.Intn(len(ipv4s))], nil + return ipv4s[randv2.IntN(len(ipv4s))], nil } - return ipv6s[fastrand.Intn(len(ipv6s))], nil + return ipv6s[randv2.IntN(len(ipv6s))], nil } // ResolveIP with a host, return ip and priority return TypeA diff --git a/clash-meta/component/tls/reality.go b/clash-meta/component/tls/reality.go index 48da3e92ac..ff028257f7 100644 --- a/clash-meta/component/tls/reality.go +++ b/clash-meta/component/tls/reality.go @@ -22,8 +22,8 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/ntp" + "github.com/metacubex/randv2" utls "github.com/metacubex/utls" - "github.com/zhangyunhao116/fastrand" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" "golang.org/x/net/http2" @@ -138,13 +138,13 @@ func realityClientFallback(uConn net.Conn, serverName string, fingerprint utls.C return } request.Header.Set("User-Agent", fingerprint.Client) - request.AddCookie(&http.Cookie{Name: "padding", Value: strings.Repeat("0", fastrand.Intn(32)+30)}) + request.AddCookie(&http.Cookie{Name: "padding", Value: strings.Repeat("0", randv2.IntN(32)+30)}) response, err := client.Do(request) if err != nil { return } //_, _ = io.Copy(io.Discard, response.Body) - time.Sleep(time.Duration(5+fastrand.Int63n(10)) * time.Second) + time.Sleep(time.Duration(5+randv2.IntN(10)) * time.Second) response.Body.Close() client.CloseIdleConnections() } diff --git a/clash-meta/dns/client.go b/clash-meta/dns/client.go index 3b4efed105..a6f0a7d492 100644 --- a/clash-meta/dns/client.go +++ b/clash-meta/dns/client.go @@ -14,8 +14,8 @@ import ( C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" + "github.com/metacubex/randv2" D "github.com/miekg/dns" - "github.com/zhangyunhao116/fastrand" ) type client struct { @@ -65,7 +65,7 @@ func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (*D.Msg, error) } else if len(ips) == 0 { return nil, fmt.Errorf("%w: %s", resolver.ErrIPNotFound, c.host) } - ip = ips[fastrand.Intn(len(ips))] + ip = ips[randv2.IntN(len(ips))] } network := "udp" diff --git a/clash-meta/go.mod b/clash-meta/go.mod index 08e5b5aa06..bc32a633bd 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -20,6 +20,7 @@ require ( github.com/mdlayher/netlink v1.7.2 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 + github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 github.com/metacubex/sing-shadowsocks v0.2.6 github.com/metacubex/sing-shadowsocks2 v0.2.0 @@ -44,7 +45,6 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/wk8/go-ordered-map/v2 v2.1.8 - github.com/zhangyunhao116/fastrand v0.4.0 go.uber.org/automaxprocs v1.5.3 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/crypto v0.23.0 diff --git a/clash-meta/go.sum b/clash-meta/go.sum index b9f1af1449..6dbbfd77ae 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -106,6 +106,8 @@ github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJa github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 h1:hsQ0b2A509b6ubnLtLOcUgZ8vOb+d/667zVEJ1T2fao= github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22/go.mod h1:88wAATpevav4xdy5N8oejQ2cbbI6EcLYEklFeo+qywA= +github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= +github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 h1:7hDHLTmjgtRoAp59STwPQpe5Pinwi4cWex+FB3Ohvco= github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1/go.mod h1:+60H3Cm91RnL9dpVGWDPHt0zTQImO9Vfqt9a4rSambI= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew= @@ -210,8 +212,6 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/ github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zhangyunhao116/fastrand v0.4.0 h1:86QB6Y+GGgLZRFRDCjMmAS28QULwspK9sgL5d1Bx3H4= -github.com/zhangyunhao116/fastrand v0.4.0/go.mod h1:vIyo6EyBhjGKpZv6qVlkPl4JVAklpMM4DSKzbAkMguA= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= diff --git a/clash-meta/transport/hysteria/conns/udp/hop.go b/clash-meta/transport/hysteria/conns/udp/hop.go index eb0732f02b..0a88874921 100644 --- a/clash-meta/transport/hysteria/conns/udp/hop.go +++ b/clash-meta/transport/hysteria/conns/udp/hop.go @@ -12,7 +12,7 @@ import ( "github.com/metacubex/mihomo/transport/hysteria/obfs" "github.com/metacubex/mihomo/transport/hysteria/utils" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -86,7 +86,7 @@ func NewObfsUDPHopClientPacketConn(server string, serverPorts string, hopInterva serverAddrs: serverAddrs, hopInterval: hopInterval, obfs: obfs, - addrIndex: fastrand.Intn(len(serverAddrs)), + addrIndex: randv2.IntN(len(serverAddrs)), recvQueue: make(chan *udpPacket, packetQueueSize), closeChan: make(chan struct{}), bufPool: sync.Pool{ @@ -177,7 +177,7 @@ func (c *ObfsUDPHopClientPacketConn) hop(dialer utils.PacketDialer, rAddr net.Ad _ = trySetPacketConnWriteBuffer(c.currentConn, c.writeBufferSize) } go c.recvRoutine(c.currentConn) - c.addrIndex = fastrand.Intn(len(c.serverAddrs)) + c.addrIndex = randv2.IntN(len(c.serverAddrs)) } func (c *ObfsUDPHopClientPacketConn) ReadFrom(b []byte) (int, net.Addr, error) { diff --git a/clash-meta/transport/hysteria/conns/wechat/obfs.go b/clash-meta/transport/hysteria/conns/wechat/obfs.go index 4266d268ca..c5ec47ee91 100644 --- a/clash-meta/transport/hysteria/conns/wechat/obfs.go +++ b/clash-meta/transport/hysteria/conns/wechat/obfs.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/hysteria/obfs" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const udpBufferSize = 65535 @@ -31,7 +31,7 @@ func NewObfsWeChatUDPConn(orig net.PacketConn, obfs obfs.Obfuscator) *ObfsWeChat obfs: obfs, readBuf: make([]byte, udpBufferSize), writeBuf: make([]byte, udpBufferSize), - sn: fastrand.Uint32() & 0xFFFF, + sn: randv2.Uint32() & 0xFFFF, } } diff --git a/clash-meta/transport/hysteria/core/client.go b/clash-meta/transport/hysteria/core/client.go index 97c9225e37..60db8fdf45 100644 --- a/clash-meta/transport/hysteria/core/client.go +++ b/clash-meta/transport/hysteria/core/client.go @@ -19,7 +19,7 @@ import ( "github.com/lunixbochs/struc" "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -405,7 +405,7 @@ func (c *quicPktConn) WriteTo(p []byte, addr string) error { var errSize *quic.DatagramTooLargeError if errors.As(err, &errSize) { // need to frag - msg.MsgID = uint16(fastrand.Intn(0xFFFF)) + 1 // msgID must be > 0 when fragCount > 1 + msg.MsgID = uint16(randv2.IntN(0xFFFF)) + 1 // msgID must be > 0 when fragCount > 1 fragMsgs := fragUDPMessage(msg, int(errSize.MaxDatagramPayloadSize)) for _, fragMsg := range fragMsgs { msgBuf.Reset() diff --git a/clash-meta/transport/hysteria/obfs/xplus.go b/clash-meta/transport/hysteria/obfs/xplus.go index 171bf28186..4d1e3f2944 100644 --- a/clash-meta/transport/hysteria/obfs/xplus.go +++ b/clash-meta/transport/hysteria/obfs/xplus.go @@ -1,9 +1,8 @@ package obfs import ( + "crypto/rand" "crypto/sha256" - - "github.com/zhangyunhao116/fastrand" ) // [salt][obfuscated payload] @@ -35,7 +34,7 @@ func (x *XPlusObfuscator) Deobfuscate(in []byte, out []byte) int { } func (x *XPlusObfuscator) Obfuscate(in []byte, out []byte) int { - _, _ = fastrand.Read(out[:saltLen]) // salt + _, _ = rand.Read(out[:saltLen]) // salt // Obfuscate the payload key := sha256.Sum256(append(x.Key, out[:saltLen]...)) for i, c := range in { diff --git a/clash-meta/transport/simple-obfs/http.go b/clash-meta/transport/simple-obfs/http.go index a38b1d6971..9c3f8e0029 100644 --- a/clash-meta/transport/simple-obfs/http.go +++ b/clash-meta/transport/simple-obfs/http.go @@ -2,6 +2,7 @@ package obfs import ( "bytes" + "crypto/rand" "encoding/base64" "fmt" "io" @@ -10,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // HTTPObfs is shadowsocks http simple-obfs implementation @@ -64,12 +65,12 @@ func (ho *HTTPObfs) Read(b []byte) (int, error) { func (ho *HTTPObfs) Write(b []byte) (int, error) { if ho.firstRequest { randBytes := make([]byte, 16) - fastrand.Read(randBytes) + rand.Read(randBytes) req, err := http.NewRequest("GET", fmt.Sprintf("http://%s/", ho.host), bytes.NewBuffer(b[:])) if err != nil { return 0, err } - req.Header.Set("User-Agent", fmt.Sprintf("curl/7.%d.%d", fastrand.Int()%54, fastrand.Int()%2)) + req.Header.Set("User-Agent", fmt.Sprintf("curl/7.%d.%d", randv2.Int()%54, randv2.Int()%2)) req.Header.Set("Upgrade", "websocket") req.Header.Set("Connection", "Upgrade") req.Host = ho.host diff --git a/clash-meta/transport/simple-obfs/tls.go b/clash-meta/transport/simple-obfs/tls.go index 78317f0a37..a0cbc35038 100644 --- a/clash-meta/transport/simple-obfs/tls.go +++ b/clash-meta/transport/simple-obfs/tls.go @@ -2,14 +2,13 @@ package obfs import ( "bytes" + "crypto/rand" "encoding/binary" "io" "net" "time" "github.com/metacubex/mihomo/common/pool" - - "github.com/zhangyunhao116/fastrand" ) const ( @@ -127,8 +126,8 @@ func NewTLSObfs(conn net.Conn, server string) net.Conn { func makeClientHelloMsg(data []byte, server string) []byte { random := make([]byte, 28) sessionID := make([]byte, 32) - fastrand.Read(random) - fastrand.Read(sessionID) + rand.Read(random) + rand.Read(sessionID) buf := &bytes.Buffer{} diff --git a/clash-meta/transport/ssr/obfs/http_simple.go b/clash-meta/transport/ssr/obfs/http_simple.go index 359ca34272..d59b490d46 100644 --- a/clash-meta/transport/ssr/obfs/http_simple.go +++ b/clash-meta/transport/ssr/obfs/http_simple.go @@ -10,7 +10,7 @@ import ( "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -82,7 +82,7 @@ func (c *httpConn) Write(b []byte) (int, error) { bLength := len(b) headDataLength := bLength if bLength-headLength > 64 { - headDataLength = headLength + fastrand.Intn(65) + headDataLength = headLength + randv2.IntN(65) } headData := b[:headDataLength] b = b[headDataLength:] @@ -100,7 +100,7 @@ func (c *httpConn) Write(b []byte) (int, error) { } } hosts := strings.Split(host, ",") - host = hosts[fastrand.Intn(len(hosts))] + host = hosts[randv2.IntN(len(hosts))] buf := pool.GetBuffer() defer pool.PutBuffer(buf) @@ -119,7 +119,7 @@ func (c *httpConn) Write(b []byte) (int, error) { buf.WriteString(body + "\r\n\r\n") } else { buf.WriteString("User-Agent: ") - buf.WriteString(userAgent[fastrand.Intn(len(userAgent))]) + buf.WriteString(userAgent[randv2.IntN(len(userAgent))]) buf.WriteString("\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\nAccept-Encoding: gzip, deflate\r\n") if c.post { packBoundary(buf) @@ -147,7 +147,7 @@ func packBoundary(buf *bytes.Buffer) { buf.WriteString("Content-Type: multipart/form-data; boundary=") set := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" for i := 0; i < 32; i++ { - buf.WriteByte(set[fastrand.Intn(62)]) + buf.WriteByte(set[randv2.IntN(62)]) } buf.WriteString("\r\n") } diff --git a/clash-meta/transport/ssr/obfs/random_head.go b/clash-meta/transport/ssr/obfs/random_head.go index 9a2072fe44..a5ad2dabc9 100644 --- a/clash-meta/transport/ssr/obfs/random_head.go +++ b/clash-meta/transport/ssr/obfs/random_head.go @@ -1,13 +1,14 @@ package obfs import ( + "crypto/rand" "encoding/binary" "hash/crc32" "net" "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -54,10 +55,10 @@ func (c *randomHeadConn) Write(b []byte) (int, error) { c.buf = append(c.buf, b...) if !c.hasSentHeader { c.hasSentHeader = true - dataLength := fastrand.Intn(96) + 4 + dataLength := randv2.IntN(96) + 4 buf := pool.Get(dataLength + 4) defer pool.Put(buf) - fastrand.Read(buf[:dataLength]) + rand.Read(buf[:dataLength]) binary.LittleEndian.PutUint32(buf[dataLength:], 0xffffffff-crc32.ChecksumIEEE(buf[:dataLength])) _, err := c.Conn.Write(buf) return len(b), err diff --git a/clash-meta/transport/ssr/obfs/tls1.2_ticket_auth.go b/clash-meta/transport/ssr/obfs/tls1.2_ticket_auth.go index d5e3ca8875..d5955edc34 100644 --- a/clash-meta/transport/ssr/obfs/tls1.2_ticket_auth.go +++ b/clash-meta/transport/ssr/obfs/tls1.2_ticket_auth.go @@ -3,6 +3,7 @@ package obfs import ( "bytes" "crypto/hmac" + "crypto/rand" "encoding/binary" "net" "strings" @@ -11,7 +12,7 @@ import ( "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -26,7 +27,7 @@ type tls12Ticket struct { func newTLS12Ticket(b *Base) Obfs { r := &tls12Ticket{Base: b, authData: &authData{}} - fastrand.Read(r.clientID[:]) + rand.Read(r.clientID[:]) return r } @@ -91,7 +92,7 @@ func (c *tls12TicketConn) Write(b []byte) (int, error) { buf := pool.GetBuffer() defer pool.PutBuffer(buf) for len(b) > 2048 { - size := fastrand.Intn(4096) + 100 + size := randv2.IntN(4096) + 100 if len(b) < size { size = len(b) } @@ -197,7 +198,7 @@ func packSNIData(buf *bytes.Buffer, u string) { } func (c *tls12TicketConn) packTicketBuf(buf *bytes.Buffer, u string) { - length := 16 * (fastrand.Intn(17) + 8) + length := 16 * (randv2.IntN(17) + 8) buf.Write([]byte{0, 0x23}) binary.Write(buf, binary.BigEndian, uint16(length)) tools.AppendRandBytes(buf, length) @@ -222,6 +223,6 @@ func (t *tls12Ticket) getHost() string { host = "" } hosts := strings.Split(host, ",") - host = hosts[fastrand.Intn(len(hosts))] + host = hosts[randv2.IntN(len(hosts))] return host } diff --git a/clash-meta/transport/ssr/protocol/auth_aes128_sha1.go b/clash-meta/transport/ssr/protocol/auth_aes128_sha1.go index 6ee4160e33..cfd555102c 100644 --- a/clash-meta/transport/ssr/protocol/auth_aes128_sha1.go +++ b/clash-meta/transport/ssr/protocol/auth_aes128_sha1.go @@ -2,6 +2,7 @@ package protocol import ( "bytes" + "crypto/rand" "encoding/binary" "math" "net" @@ -13,7 +14,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type ( @@ -66,7 +67,7 @@ func (a *authAES128) initUserData() { } if len(a.userKey) == 0 { a.userKey = a.Key - fastrand.Read(a.userID[:]) + rand.Read(a.userID[:]) } } @@ -200,7 +201,7 @@ func (a *authAES128) packData(poolBuf *bytes.Buffer, data []byte, fullDataLength } func trapezoidRandom(max int, d float64) int { - base := fastrand.Float64() + base := randv2.Float64() if d-0 > 1e-6 { a := 1 - d base = (math.Sqrt(a*a+4*d*base) - a) / (2 * d) @@ -221,10 +222,10 @@ func (a *authAES128) getRandDataLengthForPackData(dataLength, fullDataLength int if revLength > -1460 { return trapezoidRandom(revLength+1460, -0.3) } - return fastrand.Intn(32) + return randv2.IntN(32) } if dataLength > 900 { - return fastrand.Intn(revLength) + return randv2.IntN(revLength) } return trapezoidRandom(revLength, -0.3) } @@ -249,7 +250,7 @@ func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { copy(macKey, a.iv) copy(macKey[len(a.iv):], a.Key) - poolBuf.WriteByte(byte(fastrand.Intn(256))) + poolBuf.WriteByte(byte(randv2.IntN(256))) poolBuf.Write(a.hmac(macKey, poolBuf.Bytes())[:6]) poolBuf.Write(a.userID[:]) err := a.authData.putEncryptedData(poolBuf, a.userKey, [2]int{packedAuthDataLength, randDataLength}, a.salt) @@ -265,9 +266,9 @@ func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { func (a *authAES128) getRandDataLengthForPackAuthData(size int) int { if size > 400 { - return fastrand.Intn(512) + return randv2.IntN(512) } - return fastrand.Intn(1024) + return randv2.IntN(1024) } func (a *authAES128) packRandData(poolBuf *bytes.Buffer, size int) { diff --git a/clash-meta/transport/ssr/protocol/auth_sha1_v4.go b/clash-meta/transport/ssr/protocol/auth_sha1_v4.go index ed1a39f189..1c616c3fc2 100644 --- a/clash-meta/transport/ssr/protocol/auth_sha1_v4.go +++ b/clash-meta/transport/ssr/protocol/auth_sha1_v4.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -178,7 +178,7 @@ func (a *authSHA1V4) getRandDataLength(size int) int { return 0 } if size > 400 { - return fastrand.Intn(256) + return randv2.IntN(256) } - return fastrand.Intn(512) + return randv2.IntN(512) } diff --git a/clash-meta/transport/ssr/protocol/base.go b/clash-meta/transport/ssr/protocol/base.go index e26a65875a..798701777e 100644 --- a/clash-meta/transport/ssr/protocol/base.go +++ b/clash-meta/transport/ssr/protocol/base.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/aes" "crypto/cipher" + "crypto/rand" "encoding/base64" "encoding/binary" "sync" @@ -13,7 +14,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/shadowsocks/core" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type Base struct { @@ -38,8 +39,8 @@ func (a *authData) next() *authData { a.mutex.Lock() defer a.mutex.Unlock() if a.connectionID > 0xff000000 || a.connectionID == 0 { - fastrand.Read(a.clientID[:]) - a.connectionID = fastrand.Uint32() & 0xffffff + rand.Read(a.clientID[:]) + a.connectionID = randv2.Uint32() & 0xffffff } a.connectionID++ copy(r.clientID[:], a.clientID[:]) diff --git a/clash-meta/transport/ssr/protocol/protocol.go b/clash-meta/transport/ssr/protocol/protocol.go index a04e6bd4d3..ad6bf6ba77 100644 --- a/clash-meta/transport/ssr/protocol/protocol.go +++ b/clash-meta/transport/ssr/protocol/protocol.go @@ -8,7 +8,7 @@ import ( N "github.com/metacubex/mihomo/common/net" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -71,7 +71,7 @@ func getHeadSize(b []byte, defaultValue int) int { func getDataLength(b []byte) int { bLength := len(b) - dataLength := getHeadSize(b, 30) + fastrand.Intn(32) + dataLength := getHeadSize(b, 30) + randv2.IntN(32) if bLength < dataLength { return bLength } diff --git a/clash-meta/transport/tuic/congestion/bbr_sender.go b/clash-meta/transport/tuic/congestion/bbr_sender.go index 6cea9355fb..5a8633621f 100644 --- a/clash-meta/transport/tuic/congestion/bbr_sender.go +++ b/clash-meta/transport/tuic/congestion/bbr_sender.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -716,7 +716,7 @@ func (b *bbrSender) EnterProbeBandwidthMode(now time.Time) { // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is // excluded because in that case increased gain and decreased gain would not // follow each other. - b.cycleCurrentOffset = fastrand.Int() % (GainCycleLength - 1) + b.cycleCurrentOffset = randv2.Int() % (GainCycleLength - 1) if b.cycleCurrentOffset >= 1 { b.cycleCurrentOffset += 1 } diff --git a/clash-meta/transport/tuic/congestion_v2/bbr_sender.go b/clash-meta/transport/tuic/congestion_v2/bbr_sender.go index 54705978cc..ed29bd7e95 100644 --- a/clash-meta/transport/tuic/congestion_v2/bbr_sender.go +++ b/clash-meta/transport/tuic/congestion_v2/bbr_sender.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // BbrSender implements BBR congestion control algorithm. BBR aims to estimate @@ -620,7 +620,7 @@ func (b *bbrSender) enterProbeBandwidthMode(now time.Time) { // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is // excluded because in that case increased gain and decreased gain would not // follow each other. - b.cycleCurrentOffset = int(fastrand.Int31n(congestion.PacketsPerConnectionID)) % (gainCycleLength - 1) + b.cycleCurrentOffset = int(randv2.Int32N(congestion.PacketsPerConnectionID)) % (gainCycleLength - 1) if b.cycleCurrentOffset >= 1 { b.cycleCurrentOffset += 1 } diff --git a/clash-meta/transport/tuic/v4/client.go b/clash-meta/transport/tuic/v4/client.go index 5c9c889cff..62b419b7a5 100644 --- a/clash-meta/transport/tuic/v4/client.go +++ b/clash-meta/transport/tuic/v4/client.go @@ -20,8 +20,8 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" + "github.com/metacubex/randv2" "github.com/puzpuzpuz/xsync/v3" - "github.com/zhangyunhao116/fastrand" ) type ClientOption struct { @@ -367,7 +367,7 @@ func (t *clientImpl) ListenPacketWithDialer(ctx context.Context, metadata *C.Met pipe1, pipe2 := N.Pipe() var connId uint32 for { - connId = fastrand.Uint32() + connId = randv2.Uint32() _, loaded := t.udpInputMap.LoadOrStore(connId, pipe1) if !loaded { break diff --git a/clash-meta/transport/tuic/v5/client.go b/clash-meta/transport/tuic/v5/client.go index 89454add19..a3c13d2b29 100644 --- a/clash-meta/transport/tuic/v5/client.go +++ b/clash-meta/transport/tuic/v5/client.go @@ -20,8 +20,8 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" + "github.com/metacubex/randv2" "github.com/puzpuzpuz/xsync/v3" - "github.com/zhangyunhao116/fastrand" ) type ClientOption struct { @@ -351,7 +351,7 @@ func (t *clientImpl) ListenPacketWithDialer(ctx context.Context, metadata *C.Met pipe1, pipe2 := N.Pipe() var connId uint16 for { - connId = uint16(fastrand.Intn(0xFFFF)) + connId = uint16(randv2.IntN(0xFFFF)) _, loaded := t.udpInputMap.LoadOrStore(connId, pipe1) if !loaded { break diff --git a/clash-meta/transport/tuic/v5/packet.go b/clash-meta/transport/tuic/v5/packet.go index 5608db81f7..8281a11eff 100644 --- a/clash-meta/transport/tuic/v5/packet.go +++ b/clash-meta/transport/tuic/v5/packet.go @@ -12,7 +12,7 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type quicStreamPacketConn struct { @@ -157,7 +157,7 @@ func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err erro if err != nil { return } - pktId := uint16(fastrand.Uint32()) + pktId := uint16(randv2.Uint32()) packet := NewPacket(q.connId, pktId, 1, 0, uint16(len(p)), address, p) switch q.udpRelayMode { case common.QUIC: diff --git a/clash-meta/transport/vless/vision/padding.go b/clash-meta/transport/vless/vision/padding.go index e5f9dc85e2..dd9cb261a3 100644 --- a/clash-meta/transport/vless/vision/padding.go +++ b/clash-meta/transport/vless/vision/padding.go @@ -8,7 +8,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -25,9 +25,9 @@ func WriteWithPadding(buffer *buf.Buffer, p []byte, command byte, userUUID *uuid if contentLen < 900 { if paddingTLS { //log.Debugln("long padding") - paddingLen = fastrand.Int31n(500) + 900 - contentLen + paddingLen = randv2.Int32N(500) + 900 - contentLen } else { - paddingLen = fastrand.Int31n(256) + paddingLen = randv2.Int32N(256) } } if userUUID != nil { @@ -49,9 +49,9 @@ func ApplyPadding(buffer *buf.Buffer, command byte, userUUID *uuid.UUID, padding if contentLen < 900 { if paddingTLS { //log.Debugln("long padding") - paddingLen = fastrand.Int31n(500) + 900 - contentLen + paddingLen = randv2.Int32N(500) + 900 - contentLen } else { - paddingLen = fastrand.Int31n(256) + paddingLen = randv2.Int32N(256) } } diff --git a/clash-meta/transport/vmess/conn.go b/clash-meta/transport/vmess/conn.go index 292137abc3..b65a447d33 100644 --- a/clash-meta/transport/vmess/conn.go +++ b/clash-meta/transport/vmess/conn.go @@ -6,6 +6,7 @@ import ( "crypto/cipher" "crypto/hmac" "crypto/md5" + "crypto/rand" "crypto/sha256" "encoding/binary" "errors" @@ -14,7 +15,7 @@ import ( "net" "time" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/crypto/chacha20poly1305" ) @@ -72,7 +73,7 @@ func (vc *Conn) sendRequest() error { buf.WriteByte(vc.respV) buf.WriteByte(OptionChunkStream) - p := fastrand.Intn(16) + p := randv2.IntN(16) // P Sec Reserve Cmd buf.WriteByte(byte(p<<4) | byte(vc.security)) buf.WriteByte(0) @@ -90,7 +91,7 @@ func (vc *Conn) sendRequest() error { // padding if p > 0 { padding := make([]byte, p) - fastrand.Read(padding) + rand.Read(padding) buf.Write(padding) } @@ -196,7 +197,7 @@ func hashTimestamp(t time.Time) []byte { // newConn return a Conn instance func newConn(conn net.Conn, id *ID, dst *DstAddr, security Security, isAead bool) (*Conn, error) { randBytes := make([]byte, 33) - fastrand.Read(randBytes) + rand.Read(randBytes) reqBodyIV := make([]byte, 16) reqBodyKey := make([]byte, 16) copy(reqBodyIV[:], randBytes[:16]) diff --git a/clash-meta/transport/vmess/h2.go b/clash-meta/transport/vmess/h2.go index f91c276626..a39ec5d992 100644 --- a/clash-meta/transport/vmess/h2.go +++ b/clash-meta/transport/vmess/h2.go @@ -7,7 +7,7 @@ import ( "net/http" "net/url" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/net/http2" ) @@ -27,7 +27,7 @@ type H2Config struct { func (hc *h2Conn) establishConn() error { preader, pwriter := io.Pipe() - host := hc.cfg.Hosts[fastrand.Intn(len(hc.cfg.Hosts))] + host := hc.cfg.Hosts[randv2.IntN(len(hc.cfg.Hosts))] path := hc.cfg.Path // TODO: connect use VMess Host instead of H2 Host req := http.Request{ diff --git a/clash-meta/transport/vmess/http.go b/clash-meta/transport/vmess/http.go index 4a1b93ecd8..3c66fe6b24 100644 --- a/clash-meta/transport/vmess/http.go +++ b/clash-meta/transport/vmess/http.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/utils" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type httpConn struct { @@ -59,10 +59,10 @@ func (hc *httpConn) Write(b []byte) (int, error) { return -1, errors.New("path is empty") } - path := hc.cfg.Path[fastrand.Intn(len(hc.cfg.Path))] + path := hc.cfg.Path[randv2.IntN(len(hc.cfg.Path))] host := hc.cfg.Host if header := hc.cfg.Headers["Host"]; len(header) != 0 { - host = header[fastrand.Intn(len(header))] + host = header[randv2.IntN(len(header))] } u := fmt.Sprintf("http://%s%s", net.JoinHostPort(host, "80"), path) @@ -71,7 +71,7 @@ func (hc *httpConn) Write(b []byte) (int, error) { return 0, err } for key, list := range hc.cfg.Headers { - req.Header.Set(key, list[fastrand.Intn(len(list))]) + req.Header.Set(key, list[randv2.IntN(len(list))]) } req.ContentLength = int64(len(b)) if err := req.Write(hc.Conn); err != nil { diff --git a/clash-meta/transport/vmess/vmess.go b/clash-meta/transport/vmess/vmess.go index 7c587c6a0e..22c77ab7d5 100644 --- a/clash-meta/transport/vmess/vmess.go +++ b/clash-meta/transport/vmess/vmess.go @@ -8,7 +8,7 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // Version of vmess @@ -78,7 +78,7 @@ type Config struct { // StreamConn return a Conn with net.Conn and DstAddr func (c *Client) StreamConn(conn net.Conn, dst *DstAddr) (net.Conn, error) { - r := fastrand.Intn(len(c.user)) + r := randv2.IntN(len(c.user)) return newConn(conn, c.user[r], dst, c.security, c.isAead) } diff --git a/clash-meta/transport/vmess/websocket.go b/clash-meta/transport/vmess/websocket.go index f69141998a..ca3a57b793 100644 --- a/clash-meta/transport/vmess/websocket.go +++ b/clash-meta/transport/vmess/websocket.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "context" + "crypto/rand" "crypto/sha1" "crypto/tls" "encoding/base64" @@ -25,7 +26,7 @@ import ( "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type websocketConn struct { @@ -150,7 +151,7 @@ func (wsc *websocketConn) WriteBuffer(buffer *buf.Buffer) error { } if wsc.state.ClientSide() { - maskKey := fastrand.Uint32() + maskKey := randv2.Uint32() binary.LittleEndian.PutUint32(header[1+payloadBitLength:], maskKey) N.MaskWebSocket(maskKey, data) } @@ -398,7 +399,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, const nonceKeySize = 16 // NOTE: bts does not escape. bts := make([]byte, nonceKeySize) - if _, err = fastrand.Read(bts); err != nil { + if _, err = rand.Read(bts); err != nil { return nil, fmt.Errorf("rand read error: %w", err) } secKey = base64.StdEncoding.EncodeToString(bts) diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index 776f44b7d8..166c527f75 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -2544,7 +2544,7 @@ dependencies = [ "httpdate", "itoa 1.0.11", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -3091,7 +3091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -6178,9 +6178,9 @@ checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -6197,9 +6197,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 2b0c0c7089..8b1118606f 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -19,7 +19,7 @@ "@mui/icons-material": "5.15.19", "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.15.19", - "@mui/x-data-grid": "7.5.1", + "@mui/x-data-grid": "7.6.0", "@nyanpasu/interface": "workspace:^", "@nyanpasu/ui": "workspace:^", "@tauri-apps/api": "1.5.6", @@ -56,7 +56,7 @@ "@typescript-eslint/eslint-plugin": "7.11.0", "@typescript-eslint/parser": "7.11.0", "@vitejs/plugin-react": "4.3.0", - "sass": "1.77.3", + "sass": "1.77.4", "shiki": "1.6.1", "vite": "5.2.12", "vite-plugin-monaco-editor": "1.1.3", diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index 6c4ce29ba3..b491a1b5e4 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -16,7 +16,7 @@ "react-i18next": "14.1.2" }, "devDependencies": { - "sass": "1.77.3", + "sass": "1.77.4", "typescript-plugin-css-modules": "5.1.0" } } diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 5d244c4b02..d5c7c7e344 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.18.5", - "mihomo_alpha": "alpha-7eb70ae", + "mihomo_alpha": "alpha-d3fea90", "clash_rs": "v0.1.17", "clash_premium": "2023-09-05-gdcc8d87" }, @@ -36,5 +36,5 @@ "darwin-x64": "clash-darwin-amd64-n{}.gz" } }, - "updated_at": "2024-05-28T22:19:49.047Z" + "updated_at": "2024-05-30T22:20:05.828Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 48653ba790..64f5368649 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -109,7 +109,7 @@ "tsx": "4.11.0", "typescript": "5.4.5" }, - "packageManager": "pnpm@9.1.3", + "packageManager": "pnpm@9.1.4", "engines": { "node": "22.2.0" }, diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 131686839d..7a821a65bb 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -150,10 +150,10 @@ importers: version: 1.3.4 react: specifier: npm:react@rc - version: 19.0.0-rc-935180c7e0-20240524 + version: 19.0.0-rc-9d4fba0788-20240530 swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-935180c7e0-20240524) + version: 2.2.5(react@19.0.0-rc-9d4fba0788-20240530) devDependencies: '@types/react': specifier: npm:types-react@rc @@ -163,19 +163,19 @@ importers: dependencies: '@dnd-kit/core': specifier: 6.1.0 - version: 6.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 6.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) '@dnd-kit/sortable': specifier: 8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) '@dnd-kit/utilities': specifier: 3.2.2 - version: 3.2.2(react@19.0.0-rc-935180c7e0-20240524) + version: 3.2.2(react@19.0.0-rc-9d4fba0788-20240530) '@emotion/styled': specifier: 11.11.5 - version: 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@generouted/react-router': specifier: 1.19.5 - version: 1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)) + version: 1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -184,16 +184,16 @@ importers: version: 0.2.7 '@mui/icons-material': specifier: 5.15.19 - version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/lab': specifier: 5.0.0-alpha.170 - version: 5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/material': specifier: 5.15.19 - version: 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/x-data-grid': - specifier: 7.5.1 - version: 7.5.1(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + specifier: 7.6.0 + version: 7.6.0(@babel/core@7.24.5)(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -205,10 +205,10 @@ importers: version: 1.5.6 ahooks: specifier: 3.8.0 - version: 3.8.0(react@19.0.0-rc-935180c7e0-20240524) + version: 3.8.0(react@19.0.0-rc-9d4fba0788-20240530) allotment: specifier: 1.20.2 - version: 1.20.2(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 1.20.2(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) axios: specifier: 1.7.2 version: 1.7.2 @@ -217,65 +217,65 @@ importers: version: 1.11.11 framer-motion: specifier: 11.2.9 - version: 11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) i18next: specifier: 23.11.5 version: 23.11.5 jotai: specifier: 2.8.2 - version: 2.8.2(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 2.8.2(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) monaco-editor: specifier: 0.49.0 version: 0.49.0 mui-color-input: specifier: 2.0.3 - version: 2.0.3(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 2.0.3(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) react: specifier: npm:react@rc - version: 19.0.0-rc-935180c7e0-20240524 + version: 19.0.0-rc-9d4fba0788-20240530 react-dom: specifier: npm:react-dom@rc - version: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + version: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) react-error-boundary: specifier: 4.0.13 - version: 4.0.13(react@19.0.0-rc-935180c7e0-20240524) + version: 4.0.13(react@19.0.0-rc-9d4fba0788-20240530) react-fast-marquee: specifier: 1.6.4 - version: 1.6.4(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 1.6.4(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react-hook-form: specifier: 7.51.5 - version: 7.51.5(react@19.0.0-rc-935180c7e0-20240524) + version: 7.51.5(react@19.0.0-rc-9d4fba0788-20240530) react-hook-form-mui: specifier: 7.0.0 - version: 7.0.0(@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-hook-form@7.51.5(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 7.0.0(@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-hook-form@7.51.5(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react-i18next: specifier: 14.1.2 - version: 14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react-markdown: specifier: 9.0.1 - version: 9.0.1(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 9.0.1(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) react-router-dom: specifier: 6.23.1 - version: 6.23.1(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react-transition-group: specifier: 4.4.5 - version: 4.4.5(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 4.4.5(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react-virtuoso: specifier: 4.7.10 - version: 4.7.10(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 4.7.10(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-935180c7e0-20240524) + version: 2.2.5(react@19.0.0-rc-9d4fba0788-20240530) virtua: specifier: 0.31.0 - version: 0.31.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 0.31.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) devDependencies: '@emotion/babel-plugin': specifier: 11.11.0 version: 11.11.0 '@emotion/react': specifier: 11.11.4 - version: 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@types/js-cookie': specifier: 3.0.6 version: 3.0.6 @@ -296,28 +296,28 @@ importers: version: 7.11.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react': specifier: 4.3.0 - version: 4.3.0(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)) + version: 4.3.0(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) sass: - specifier: 1.77.3 - version: 1.77.3 + specifier: 1.77.4 + version: 1.77.4 shiki: specifier: 1.6.1 version: 1.6.1 vite: specifier: 5.2.12 - version: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + version: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) vite-plugin-monaco-editor: specifier: npm:vite-plugin-monaco-editor-new@1.1.3 version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.49.0) vite-plugin-sass-dts: specifier: 1.3.22 - version: 1.3.22(postcss@8.4.38)(prettier@3.2.5)(sass@1.77.3)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)) + version: 1.3.22(postcss@8.4.38)(prettier@3.2.5)(sass@1.77.4)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)) + version: 4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) vite-tsconfig-paths: specifier: 4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) frontend/ui: dependencies: @@ -326,35 +326,35 @@ importers: version: 0.2.7 '@mui/icons-material': specifier: 5.15.19 - version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/lab': specifier: 5.0.0-alpha.170 - version: 5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/material': specifier: 5.15.19 - version: 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + version: 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@types/react': specifier: npm:types-react@rc version: types-react@19.0.0-rc.0 ahooks: specifier: 3.8.0 - version: 3.8.0(react@19.0.0-rc-935180c7e0-20240524) + version: 3.8.0(react@19.0.0-rc-9d4fba0788-20240530) framer-motion: specifier: 11.2.9 - version: 11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) react: specifier: npm:react@rc - version: 19.0.0-rc-935180c7e0-20240524 + version: 19.0.0-rc-9d4fba0788-20240530 react-error-boundary: specifier: 4.0.13 - version: 4.0.13(react@19.0.0-rc-935180c7e0-20240524) + version: 4.0.13(react@19.0.0-rc-9d4fba0788-20240530) react-i18next: specifier: 14.1.2 - version: 14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + version: 14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) devDependencies: sass: - specifier: 1.77.3 - version: 1.77.3 + specifier: 1.77.4 + version: 1.77.4 typescript-plugin-css-modules: specifier: 5.1.0 version: 5.1.0(typescript@5.4.5) @@ -422,6 +422,10 @@ packages: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.24.4': resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} @@ -434,56 +438,126 @@ packages: resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.6': + resolution: {integrity: sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.24.6': + resolution: {integrity: sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-environment-visitor@7.22.20': resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.24.6': + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} + engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.23.0': resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.24.6': + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} + engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.24.6': + resolution: {integrity: sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.3': resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.24.5': resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.24.6': + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.6': + resolution: {integrity: sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.24.5': resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.24.6': + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.24.6': + resolution: {integrity: sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-simple-access@7.24.5': resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.6': + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': + resolution: {integrity: sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.24.5': resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.24.6': + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.1': resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.5': resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.6': + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.5': resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} @@ -492,11 +566,38 @@ packages: resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.6': + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.6': + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.6': + resolution: {integrity: sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.24.5': resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} engines: {node: '>=6.9.0'} @@ -509,14 +610,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.24.6': + resolution: {integrity: sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.24.6': + resolution: {integrity: sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.24.5': resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} + '@babel/template@7.24.6': + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.5': resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} @@ -525,6 +652,10 @@ packages: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + '@commitlint/cli@19.3.0': resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} engines: {node: '>=v18'} @@ -1066,6 +1197,13 @@ packages: '@material/material-color-utilities@0.2.7': resolution: {integrity: sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==} + '@mnajdova/enzyme-adapter-react-18@0.2.0': + resolution: {integrity: sha512-BOnjlVa7FHI1YUnYe+FdUtQu6szI1wLJ+C1lHyqmF3T9gu/J/WCYqqcD44dPkrU+8eYvvk/gQducsqna4HFiAg==} + peerDependencies: + enzyme: ^3.0.0 + react: npm:react@rc + react-dom: npm:react-dom@rc + '@mui/base@5.0.0-beta.40': resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} engines: {node: '>=12.0.0'} @@ -1091,6 +1229,12 @@ packages: '@types/react': optional: true + '@mui/internal-test-utils@1.0.0-dev.20240529-082515-213b5e33ab': + resolution: {integrity: sha512-4TEDRwZvsTDRpyBLSubiMh1W+UgK4YZ8kRDEp7zWeEKEugr1lOji/fE8yeaWKtJVMKwEW8cTH0QtSlRn3oDzaw==} + peerDependencies: + react: npm:react@rc + react-dom: npm:react-dom@rc + '@mui/lab@5.0.0-alpha.170': resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} engines: {node: '>=12.0.0'} @@ -1183,8 +1327,8 @@ packages: '@types/react': optional: true - '@mui/x-data-grid@7.5.1': - resolution: {integrity: sha512-5GuHg95UcphQ3O4LftUEFkNPP00YKUDZoSxmsNJ2+o6pwhHH4f8XIuuXEZJCyEMUiVYQk6/iYZwxJL6CpvbNCw==} + '@mui/x-data-grid@7.6.0': + resolution: {integrity: sha512-sMtnORdTRkLy+oQ3vkWaQ5c7yUdd6ovdgy3UGsn+QNqbA2hgLafFweH53nKMtNS+aULrJ1p5kCwK+DhqIYVrsA==} engines: {node: '>=14.0.0'} peerDependencies: '@mui/material': ^5.15.14 @@ -1362,6 +1506,24 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@sinonjs/commons@2.0.0': + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@sinonjs/fake-timers@11.2.2': + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + + '@sinonjs/samsam@8.0.0': + resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + + '@sinonjs/text-encoding@0.7.2': + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -1509,9 +1671,27 @@ packages: engines: {node: '>= 10'} hasBin: true + '@testing-library/dom@10.1.0': + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} + + '@testing-library/react@15.0.7': + resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': npm:types-react@rc + react: npm:react@rc + react-dom: npm:react-dom@rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/adm-zip@0.5.5': resolution: {integrity: sha512-YCGstVMjc4LTY5uK9/obvxBya93axZOVOyf2GSUulADzmLhYE45u2nAssCs/fWBs1Ifq5Vat75JTPwd5XZoPJw==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1706,6 +1886,12 @@ packages: peerDependencies: react: npm:react@rc + airbnb-prop-types@2.16.0: + resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} + deprecated: This package has been renamed to 'prop-types-tools' + peerDependencies: + react: npm:react@rc + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1721,6 +1907,10 @@ packages: ansi-align@2.0.0: resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + ansi-escapes@6.2.1: resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} @@ -1745,6 +1935,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -1762,6 +1956,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1777,6 +1974,14 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.filter@1.0.4: + resolution: {integrity: sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==} + engines: {node: '>= 0.4'} + + array.prototype.find@2.2.3: + resolution: {integrity: sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA==} + engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -1803,6 +2008,9 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -1854,6 +2062,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} @@ -1875,6 +2086,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1883,6 +2097,9 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1935,6 +2152,16 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai-dom@1.12.0: + resolution: {integrity: sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==} + engines: {node: '>= 0.12.0'} + peerDependencies: + chai: '>= 3' + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1959,6 +2186,20 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1984,10 +2225,17 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} @@ -2028,10 +2276,16 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -2126,15 +2380,26 @@ packages: resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} engines: {node: '>=12 || >=16'} + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-tree@2.3.1: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2150,6 +2415,10 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -2190,6 +2459,13 @@ packages: supports-color: optional: true + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -2205,6 +2481,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2247,10 +2527,21 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -2262,6 +2553,12 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} @@ -2340,6 +2637,17 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + enzyme-adapter-utils@1.14.2: + resolution: {integrity: sha512-1ZC++RlsYRaiOWE5NRaF5OgsMt7F5rn/VuaJIgc7eW/fmgg8eS1/Ut7EugSPPi7VMdWMLcymRnMF+mJUJ4B8KA==} + peerDependencies: + react: npm:react@rc + + enzyme-shallow-equal@1.0.7: + resolution: {integrity: sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==} + + enzyme@3.11.0: + resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==} + errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -2351,6 +2659,9 @@ packages: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -2636,9 +2947,17 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2655,6 +2974,10 @@ packages: resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} engines: {node: '>=18'} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -2678,6 +3001,9 @@ packages: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + format-util@1.0.5: + resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -2710,6 +3036,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2742,6 +3073,9 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -2790,6 +3124,11 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} @@ -2875,6 +3214,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2885,9 +3228,20 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-element-map@1.3.1: + resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -2910,6 +3264,10 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} @@ -3129,14 +3487,25 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-redirect@1.0.0: resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} engines: {node: '>=0.10.0'} @@ -3169,6 +3538,9 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-subset@0.1.1: + resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -3184,6 +3556,10 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3204,6 +3580,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -3243,6 +3623,15 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdom@24.1.0: + resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -3293,6 +3682,9 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3339,6 +3731,10 @@ packages: resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} engines: {node: '>=18.0.0'} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3359,6 +3755,15 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.escape@4.0.1: + resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} @@ -3392,6 +3797,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} @@ -3403,6 +3812,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -3424,6 +3836,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + make-dir@1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -3593,6 +4009,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -3604,9 +4024,17 @@ packages: resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} engines: {node: '>=16 || 14 >=14.17'} + mocha@10.4.0: + resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} + engines: {node: '>= 14.0.0'} + hasBin: true + monaco-editor@0.49.0: resolution: {integrity: sha512-2I8/T3X/hLxB2oPHgqcNYUVdA/ZEFShT7IAujifIPMfKkNbLOqY8XCoyHCXrsdjb36dW9MwoTwBCFpXKMwNwaQ==} + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -3640,6 +4068,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + needle@3.3.1: resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} @@ -3648,6 +4080,9 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + nise@5.1.9: + resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -3702,6 +4137,12 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nwsapi@2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3713,6 +4154,10 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3767,6 +4212,10 @@ packages: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3775,6 +4224,10 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -3783,6 +4236,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json@4.0.1: resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} engines: {node: '>=4'} @@ -3805,9 +4262,19 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3842,13 +4309,22 @@ packages: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -3877,6 +4353,20 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + playwright-core@1.44.1: + resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.44.1: + resolution: {integrity: sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==} + engines: {node: '>=16'} + hasBin: true + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -4018,10 +4508,18 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + prop-types-exact@1.2.4: + resolution: {integrity: sha512-vKfETKgBHRCLQwZgpl0pGPvMFxCX/06dAkz5jwNYHfrU0I8bgVhryaHA6O/KlqwtQi0IdnjAhDiZqzD+uJuVjA==} + engines: {node: '>= 0.8'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4037,6 +4535,9 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -4044,6 +4545,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4051,6 +4555,19 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + + randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4062,8 +4579,8 @@ packages: resolution: {integrity: sha512-QdVc0OYS8wh19x0J6ZRDHivuTMnoN+i4MziDiRLk5LID3hkraPR3157MybVdYgYVsKg86PCVjTHLZVUyB13ztg==} hasBin: true - react-dom@19.0.0-rc-935180c7e0-20240524: - resolution: {integrity: sha512-17SL+9qxiLUZnaBWr+mO3hpz5ncP5NbJp6jnbA6cFbsWNdV3p4s8iMVALIcfZF1zPIiWQeYrZQK/Z8GY3xjihg==} + react-dom@19.0.0-rc-9d4fba0788-20240530: + resolution: {integrity: sha512-Kgw4vSnJXWkELbQFBWKm/WECPMPA/iWZ+1xeboKeh8KqpB2dG4bAP7WF01Jx6lONp5pagHKKD6UPpyTrp0P5Ew==} peerDependencies: react: npm:react@rc @@ -4118,6 +4635,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -4127,6 +4647,12 @@ packages: '@types/react': npm:types-react@rc react: npm:react@rc + react-reconciler@0.29.2: + resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: npm:react@rc + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -4144,6 +4670,16 @@ packages: peerDependencies: react: npm:react@rc + react-shallow-renderer@16.15.0: + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} + peerDependencies: + react: npm:react@rc + + react-test-renderer@18.3.1: + resolution: {integrity: sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==} + peerDependencies: + react: npm:react@rc + react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -4157,8 +4693,8 @@ packages: react: npm:react@rc react-dom: npm:react-dom@rc - react@19.0.0-rc-935180c7e0-20240524: - resolution: {integrity: sha512-UDaKY7FXO4A2tg4srdLTlkdj5WQCKS9JSrqs21qQvyD4s4qwm3sah5zhfnDHBumzZ3f+PVTcF9PrfDnmu/qKpA==} + react@19.0.0-rc-9d4fba0788-20240530: + resolution: {integrity: sha512-GVIQ8C7A/dMbyyq33VPzsx+08f/5KBvbw1dBjXtI89PoEUfFZqOIM3E8ljJt2FquM14/Ty93NsHfbA9os9aJag==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -4179,6 +4715,9 @@ packages: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} + reflect.ownkeys@1.1.4: + resolution: {integrity: sha512-iUNmtLgzudssL+qnTUosCmnq3eczlrVd1wXrgx/GhiI/8FvwrTYWtCJ9PNvWIRX+4ftupj2WUfB5mu5s9t6LnA==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -4207,6 +4746,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@4.1.8: resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} @@ -4245,6 +4787,10 @@ packages: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4266,6 +4812,15 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + rrweb-cssom@0.7.0: + resolution: {integrity: sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==} + + rst-selector-parser@2.2.3: + resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4283,16 +4838,23 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.77.3: - resolution: {integrity: sha512-WJHo+jmFp0dwRuymPmIovuxHaBntcCyja5hCB0yYY9wWrViEp4kF5Cdai98P72v6FzroPuABqu+ddLMbQWmwzA==} + sass@1.77.4: + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} engines: {node: '>=14.0.0'} hasBin: true sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - scheduler@0.25.0-rc-935180c7e0-20240524: - resolution: {integrity: sha512-YfkorLQDTfVArSlFsSmTFMWW2CoUtNhkveeEzfbyqi5bShsEyQxAPLBGOUoBxaXEcQSJ2bXhkz3ZSTJCO/Th8A==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scheduler@0.25.0-rc-9d4fba0788-20240530: + resolution: {integrity: sha512-FgnludCfIyBWBUApENx+tMalmqphFZ8MDj74iS7vlj2oaL75R4Ws+XdfSIQ5RFXFTD/zfyXVh5wtKHrs6iBkcQ==} screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} @@ -4322,6 +4884,9 @@ packages: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4330,6 +4895,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -4363,6 +4932,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sinon@16.1.3: + resolution: {integrity: sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4397,6 +4969,9 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -4565,6 +5140,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-hyperlinks@3.0.0: resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} engines: {node: '>=14.18'} @@ -4584,6 +5163,9 @@ packages: peerDependencies: react: npm:react@rc + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4633,6 +5215,14 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4685,6 +5275,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -4780,6 +5374,10 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -4805,6 +5403,9 @@ packages: resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} engines: {node: '>=0.10.0'} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-resize-observer@9.1.0: resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} peerDependencies: @@ -4908,14 +5509,34 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + websocket@1.0.35: resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} engines: {node: '>=4.0.0'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -4948,6 +5569,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -4985,10 +5609,29 @@ packages: utf-8-validate: optional: true + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xdg-basedir@3.0.0: resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} engines: {node: '>=4'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5012,10 +5655,22 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -5062,6 +5717,11 @@ snapshots: '@babel/highlight': 7.24.5 picocolors: 1.0.1 + '@babel/code-frame@7.24.6': + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 + '@babel/compat-data@7.24.4': {} '@babel/core@7.24.5': @@ -5077,7 +5737,7 @@ snapshots: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5091,6 +5751,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/helper-annotate-as-pure@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.24.4 @@ -5099,21 +5763,49 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + semver: 6.3.1 + '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.6': {} + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.5 + '@babel/helper-function-name@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.24.5 + '@babel/helper-member-expression-to-functions@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@babel/helper-module-imports@7.24.3': dependencies: '@babel/types': 7.24.5 + '@babel/helper-module-imports@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -5123,22 +5815,62 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + + '@babel/helper-optimise-call-expression@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@babel/helper-plugin-utils@7.24.5': {} + '@babel/helper-plugin-utils@7.24.6': {} + + '@babel/helper-replace-supers@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 + '@babel/helper-simple-access@7.24.5': dependencies: '@babel/types': 7.24.5 + '@babel/helper-simple-access@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@babel/helper-split-export-declaration@7.24.5': dependencies: '@babel/types': 7.24.5 + '@babel/helper-split-export-declaration@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-string-parser@7.24.6': {} + '@babel/helper-validator-identifier@7.24.5': {} + '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.24.6': {} + '@babel/helpers@7.24.5': dependencies: '@babel/template': 7.24.0 @@ -5154,10 +5886,38 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 + '@babel/highlight@7.24.6': + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + '@babel/parser@7.24.5': dependencies: '@babel/types': 7.24.5 + '@babel/parser@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-modules-commonjs@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -5168,16 +5928,52 @@ snapshots: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-transform-typescript@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.5) + + '@babel/preset-typescript@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.5) + '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.24.5) + + '@babel/register@7.24.6(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + '@babel/runtime@7.24.5': dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 + '@babel/template@7.24.6': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + '@babel/traverse@7.24.5': dependencies: '@babel/code-frame': 7.24.2 @@ -5188,7 +5984,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5199,6 +5995,12 @@ snapshots: '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 + '@babel/types@7.24.6': + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + '@commitlint/cli@19.3.0(@types/node@20.12.13)(typescript@5.4.5)': dependencies: '@commitlint/format': 19.3.0 @@ -5329,36 +6131,36 @@ snapshots: '@ctrl/tinycolor@4.1.0': {} - '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-935180c7e0-20240524)': + '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 tslib: 2.6.2 - '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)': + '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-935180c7e0-20240524) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-935180c7e0-20240524) - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-9d4fba0788-20240530) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-9d4fba0788-20240530) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) tslib: 2.6.2 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-935180c7e0-20240524) - react: 19.0.0-rc-935180c7e0-20240524 + '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-9d4fba0788-20240530) + react: 19.0.0-rc-9d4fba0788-20240530 tslib: 2.6.2 - '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-935180c7e0-20240524)': + '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 tslib: 2.6.2 '@dual-bundle/import-meta-resolve@4.1.0': {} '@electron/get@2.0.3': dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -5400,17 +6202,17 @@ snapshots: '@emotion/memoize@0.8.1': {} - '@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0-rc-935180c7e0-20240524) + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0-rc-9d4fba0788-20240530) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 hoist-non-react-statics: 3.3.2 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: '@types/react': types-react@19.0.0-rc.0 @@ -5424,24 +6226,24 @@ snapshots: '@emotion/sheet@1.2.2': {} - '@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0-rc-935180c7e0-20240524) + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0-rc-9d4fba0788-20240530) '@emotion/utils': 1.2.1 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: '@types/react': types-react@19.0.0-rc.0 '@emotion/unitless@0.8.1': {} - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@19.0.0-rc-935180c7e0-20240524)': + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 '@emotion/utils@1.2.1': {} @@ -5595,7 +6397,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -5619,26 +6421,26 @@ snapshots: '@floating-ui/core': 1.6.1 '@floating-ui/utils': 0.2.2 - '@floating-ui/react-dom@2.0.9(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)': + '@floating-ui/react-dom@2.0.9(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: '@floating-ui/dom': 1.6.5 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) '@floating-ui/utils@0.2.2': {} - '@generouted/react-router@1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0))': + '@generouted/react-router@1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': dependencies: fast-glob: 3.3.2 - generouted: 1.19.5(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)) - react: 19.0.0-rc-935180c7e0-20240524 - react-router-dom: 6.23.1(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + generouted: 1.19.5(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + react: 19.0.0-rc-9d4fba0788-20240530 + react-router-dom: 6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) + vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5677,133 +6479,189 @@ snapshots: '@material/material-color-utilities@0.2.7': {} - '@mui/base@5.0.0-beta.40(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mnajdova/enzyme-adapter-react-18@0.2.0(enzyme@3.11.0)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)': + dependencies: + enzyme: 3.11.0 + enzyme-adapter-utils: 1.14.2(react@19.0.0-rc-9d4fba0788-20240530) + enzyme-shallow-equal: 1.0.7 + has: 1.0.4 + object.assign: 4.1.5 + object.values: 1.2.0 + prop-types: 15.8.1 + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) + react-is: 18.3.1 + react-reconciler: 0.29.2(react@19.0.0-rc-9d4fba0788-20240530) + react-test-renderer: 18.3.1(react@19.0.0-rc-9d4fba0788-20240530) + semver: 5.7.2 + + '@mui/base@5.0.0-beta.40(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 - '@floating-ui/react-dom': 2.0.9(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + '@floating-ui/react-dom': 2.0.9(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) '@mui/types': 7.2.14(types-react@19.0.0-rc.0) - '@mui/utils': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) optionalDependencies: '@types/react': types-react@19.0.0-rc.0 '@mui/core-downloads-tracker@5.15.19': {} - '@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 - '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-935180c7e0-20240524 + '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/internal-test-utils@1.0.0-dev.20240529-082515-213b5e33ab(@babel/core@7.24.5)(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10)': + dependencies: + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.5) + '@babel/preset-typescript': 7.24.6(@babel/core@7.24.5) + '@babel/register': 7.24.6(@babel/core@7.24.5) + '@babel/runtime': 7.24.6 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mnajdova/enzyme-adapter-react-18': 0.2.0(enzyme@3.11.0)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) + '@testing-library/dom': 10.1.0 + '@testing-library/react': 15.0.7(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + chai: 4.4.1 + chai-dom: 1.12.0(chai@4.4.1) + dom-accessibility-api: 0.6.3 + enzyme: 3.11.0 + format-util: 1.0.5 + fs-extra: 11.2.0 + jsdom: 24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + mocha: 10.4.0 + playwright: 1.44.1 + prop-types: 15.8.1 + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) + react-test-renderer: 18.3.1(react@19.0.0-rc-9d4fba0788-20240530) + sinon: 16.1.3 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - bufferutil + - canvas + - supports-color + - utf-8-validate + + '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 - '@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/types': 7.2.14(types-react@19.0.0-rc.0) - '@mui/utils': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) optionalDependencies: - '@emotion/react': 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@types/react': types-react@19.0.0-rc.0 - '@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 - '@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/core-downloads-tracker': 5.15.19 - '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@mui/types': 7.2.14(types-react@19.0.0-rc.0) - '@mui/utils': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) optionalDependencies: - '@emotion/react': 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@types/react': types-react@19.0.0-rc.0 - '@mui/private-theming@5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/private-theming@5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 - '@mui/utils': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)': + '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)': dependencies: '@babel/runtime': 7.24.5 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: - '@emotion/react': 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) - '@mui/system@5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/system@5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 - '@mui/private-theming': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524) + '@mui/private-theming': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530) '@mui/types': 7.2.14(types-react@19.0.0-rc.0) - '@mui/utils': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: - '@emotion/react': 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@types/react': types-react@19.0.0-rc.0 '@mui/types@7.2.14(types-react@19.0.0-rc.0)': optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - '@mui/utils@5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/utils@5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': dependencies: '@babel/runtime': 7.24.5 '@types/prop-types': 15.7.12 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - '@mui/x-data-grid@7.5.1(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0)': + '@mui/x-data-grid@7.6.0(@babel/core@7.24.5)(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.24.5 - '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@mui/utils': 5.15.14(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@babel/runtime': 7.24.6 + '@mui/internal-test-utils': 1.0.0-dev.20240529-082515-213b5e33ab(@babel/core@7.24.5)(bufferutil@4.0.8)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)(utf-8-validate@5.0.10) + '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/utils': 5.15.14(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) reselect: 4.1.8 transitivePeerDependencies: + - '@babel/core' - '@emotion/react' - '@emotion/styled' - '@types/react' + - bufferutil + - canvas + - supports-color + - utf-8-validate '@nodelib/fs.scandir@2.1.5': dependencies: @@ -5944,6 +6802,30 @@ snapshots: '@sindresorhus/is@4.6.0': {} + '@sinonjs/commons@2.0.0': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@11.2.2': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/samsam@8.0.0': + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.0.8 + + '@sinonjs/text-encoding@0.7.2': {} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -6069,10 +6951,33 @@ snapshots: '@tauri-apps/cli-win32-ia32-msvc': 1.5.14 '@tauri-apps/cli-win32-x64-msvc': 1.5.14 + '@testing-library/dom@10.1.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/react@15.0.7(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0)': + dependencies: + '@babel/runtime': 7.24.6 + '@testing-library/dom': 10.1.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/adm-zip@0.5.5': dependencies: '@types/node': 20.12.10 + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.5 @@ -6215,7 +7120,7 @@ snapshots: '@typescript-eslint/types': 7.11.0 '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.11.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 @@ -6231,7 +7136,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -6245,7 +7150,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.11.0 '@typescript-eslint/visitor-keys': 7.11.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -6274,14 +7179,14 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0))': + '@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - supports-color @@ -6300,23 +7205,36 @@ snapshots: agent-base@7.1.1: dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - ahooks@3.8.0(react@19.0.0-rc-935180c7e0-20240524): + ahooks@3.8.0(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@babel/runtime': 7.24.5 dayjs: 1.11.11 intersection-observer: 0.12.2 js-cookie: 2.2.1 lodash: 4.17.21 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 react-fast-compare: 3.2.2 resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 tslib: 2.6.2 + airbnb-prop-types@2.16.0(react@19.0.0-rc-9d4fba0788-20240530): + dependencies: + array.prototype.find: 2.2.3 + function.prototype.name: 1.1.6 + is-regex: 1.1.4 + object-is: 1.1.6 + object.assign: 4.1.5 + object.entries: 1.1.8 + prop-types: 15.8.1 + prop-types-exact: 1.2.4 + react: 19.0.0-rc-9d4fba0788-20240530 + react-is: 16.13.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6331,21 +7249,23 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - allotment@1.20.2(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + allotment@1.20.2(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: classnames: 2.5.1 eventemitter3: 5.0.1 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 lodash.isequal: 4.5.0 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) - use-resize-observer: 9.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) + use-resize-observer: 9.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) ansi-align@2.0.0: dependencies: string-width: 2.1.1 + ansi-colors@4.1.1: {} + ansi-escapes@6.2.1: {} ansi-regex@3.0.1: {} @@ -6362,6 +7282,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} any-promise@1.3.0: {} @@ -6375,6 +7297,10 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -6393,6 +7319,23 @@ snapshots: array-union@2.1.0: {} + array.prototype.filter@1.0.4: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-array-method-boxes-properly: 1.0.0 + es-object-atoms: 1.0.0 + is-string: 1.0.7 + + array.prototype.find@2.2.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 @@ -6451,6 +7394,8 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + assertion-error@1.1.0: {} + astral-regex@2.0.0: {} async-mutex@0.3.2: @@ -6501,6 +7446,8 @@ snapshots: binary-extensions@2.3.0: {} + boolbase@1.0.0: {} + boolean@3.2.0: optional: true @@ -6531,6 +7478,8 @@ snapshots: dependencies: fill-range: 7.1.1 + browser-stdout@1.3.1: {} + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001616 @@ -6540,6 +7489,8 @@ snapshots: buffer-crc32@0.2.13: {} + buffer-from@1.1.2: {} + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -6589,6 +7540,20 @@ snapshots: ccount@2.0.1: {} + chai-dom@1.12.0(chai@4.4.1): + dependencies: + chai: 4.4.1 + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -6610,6 +7575,41 @@ snapshots: character-reference-invalid@2.0.1: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -6639,12 +7639,24 @@ snapshots: client-only@0.0.1: {} + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + clone-response@1.0.3: dependencies: mimic-response: 1.0.1 @@ -6677,8 +7689,12 @@ snapshots: commander@12.1.0: {} + commander@2.20.3: {} + commander@4.1.1: {} + commondir@1.0.1: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -6781,13 +7797,27 @@ snapshots: css-functions-list@3.2.2: {} + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.2.0 + css-what@6.1.0: {} + cssesc@3.0.0: {} + cssstyle@4.0.1: + dependencies: + rrweb-cssom: 0.6.0 + csstype@3.1.3: {} d@1.0.2: @@ -6799,6 +7829,11 @@ snapshots: data-uri-to-buffer@4.0.1: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -6827,9 +7862,15 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4: + debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: dependencies: @@ -6843,6 +7884,10 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -6878,10 +7923,16 @@ snapshots: didyoumean@1.2.2: {} + diff@5.0.0: {} + + diff@5.2.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + discontinuous-range@1.0.0: {} + dlv@1.1.3: {} doctrine@2.1.0: @@ -6892,6 +7943,10 @@ snapshots: dependencies: esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.24.5 @@ -6976,6 +8031,47 @@ snapshots: env-paths@2.2.1: {} + enzyme-adapter-utils@1.14.2(react@19.0.0-rc-9d4fba0788-20240530): + dependencies: + airbnb-prop-types: 2.16.0(react@19.0.0-rc-9d4fba0788-20240530) + function.prototype.name: 1.1.6 + hasown: 2.0.2 + object.assign: 4.1.5 + object.fromentries: 2.0.8 + prop-types: 15.8.1 + react: 19.0.0-rc-9d4fba0788-20240530 + semver: 6.3.1 + + enzyme-shallow-equal@1.0.7: + dependencies: + hasown: 2.0.2 + object-is: 1.1.6 + + enzyme@3.11.0: + dependencies: + array.prototype.flat: 1.3.2 + cheerio: 1.0.0-rc.12 + enzyme-shallow-equal: 1.0.7 + function.prototype.name: 1.1.6 + has: 1.0.4 + html-element-map: 1.3.1 + is-boolean-object: 1.1.2 + is-callable: 1.2.7 + is-number-object: 1.0.7 + is-regex: 1.1.4 + is-string: 1.0.7 + is-subset: 0.1.1 + lodash.escape: 4.0.1 + lodash.isequal: 4.5.0 + object-inspect: 1.13.1 + object-is: 1.1.6 + object.assign: 4.1.5 + object.entries: 1.1.8 + object.values: 1.2.0 + raf: 3.4.1 + rst-selector-parser: 2.2.3 + string.prototype.trim: 1.2.9 + errno@0.1.8: dependencies: prr: 1.0.1 @@ -7034,6 +8130,8 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 + es-array-method-boxes-properly@1.0.0: {} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 @@ -7299,7 +8397,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -7395,7 +8493,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -7452,8 +8550,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + find-root@1.1.0: {} + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -7476,6 +8584,8 @@ snapshots: flatted: 3.3.1 keyv: 4.5.4 + flat@5.0.2: {} + flatted@3.3.1: {} follow-redirects@1.15.6: {} @@ -7495,19 +8605,21 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + format-util@1.0.5: {} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 fraction.js@4.3.7: {} - framer-motion@11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + framer-motion@11.2.9(@emotion/is-prop-valid@1.2.2)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 1.2.2 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) fs-extra@11.2.0: dependencies: @@ -7523,6 +8635,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -7537,9 +8652,9 @@ snapshots: functions-have-names@1.2.3: {} - generouted@1.19.5(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)): + generouted@1.19.5(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) gensync@1.0.0-beta.2: {} @@ -7547,6 +8662,8 @@ snapshots: get-east-asian-width@1.2.0: {} + get-func-name@2.0.2: {} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -7608,6 +8725,14 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.0.1 + once: 1.4.0 + global-agent@3.0.0: dependencies: boolean: 3.2.0 @@ -7716,6 +8841,8 @@ snapshots: dependencies: has-symbols: 1.0.3 + has@1.0.4: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -7744,10 +8871,21 @@ snapshots: dependencies: '@types/hast': 3.0.4 + he@1.2.0: {} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 + html-element-map@1.3.1: + dependencies: + array.prototype.filter: 1.0.4 + call-bind: 1.0.7 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 @@ -7779,6 +8917,13 @@ snapshots: http-cache-semantics@4.1.1: {} + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 @@ -7787,7 +8932,7 @@ snapshots: https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7802,7 +8947,6 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - optional: true icss-utils@5.1.0(postcss@8.4.38): dependencies: @@ -7964,10 +9108,18 @@ snapshots: is-path-inside@3.0.3: {} + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-plain-object@5.0.0: {} + is-potential-custom-element-name@1.0.1: {} + is-redirect@1.0.0: {} is-regex@1.1.4: @@ -7991,6 +9143,8 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-subset@0.1.1: {} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 @@ -8005,6 +9159,8 @@ snapshots: is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -8022,6 +9178,8 @@ snapshots: isexe@2.0.0: {} + isobject@3.0.1: {} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 @@ -8038,10 +9196,10 @@ snapshots: jiti@1.21.0: {} - jotai@2.8.2(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0): + jotai@2.8.2(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0): optionalDependencies: '@types/react': types-react@19.0.0-rc.0 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 js-cookie@2.2.1: {} @@ -8055,6 +9213,34 @@ snapshots: jsbn@1.1.0: {} + jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + cssstyle: 4.0.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.10 + parse5: 7.1.2 + rrweb-cssom: 0.7.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@2.5.2: {} json-buffer@3.0.1: {} @@ -8097,6 +9283,8 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 + just-extend@6.2.0: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -8140,7 +9328,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 lilconfig: 3.1.1 listr2: 8.2.1 @@ -8160,6 +9348,11 @@ snapshots: rfdc: 1.3.1 wrap-ansi: 9.0.0 + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -8176,6 +9369,12 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.escape@4.0.1: {} + + lodash.flattendeep@4.4.0: {} + + lodash.get@4.4.2: {} + lodash.isequal@4.5.0: {} lodash.isplainobject@4.0.6: {} @@ -8198,6 +9397,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + log-update@6.0.0: dependencies: ansi-escapes: 6.2.1 @@ -8212,6 +9416,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + lower-case@2.0.2: dependencies: tslib: 2.6.2 @@ -8231,6 +9439,8 @@ snapshots: dependencies: yallist: 3.1.1 + lz-string@1.5.0: {} + make-dir@1.3.0: dependencies: pify: 3.0.0 @@ -8239,7 +9449,6 @@ snapshots: dependencies: pify: 4.0.1 semver: 5.7.2 - optional: true matcher@3.0.0: dependencies: @@ -8463,7 +9672,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -8515,6 +9724,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -8523,22 +9736,47 @@ snapshots: minipass@7.1.0: {} + mocha@10.4.0: + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + monaco-editor@0.49.0: {} + moo@0.5.2: {} + ms@2.0.0: {} ms@2.1.2: {} ms@2.1.3: {} - mui-color-input@2.0.3(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0): + mui-color-input@2.0.3(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0): dependencies: '@ctrl/tinycolor': 4.1.0 - '@emotion/react': 11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + '@emotion/react': 11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) optionalDependencies: '@types/react': types-react@19.0.0-rc.0 @@ -8552,6 +9790,13 @@ snapshots: natural-compare@1.4.0: {} + nearley@2.20.1: + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + needle@3.3.1: dependencies: iconv-lite: 0.6.3 @@ -8560,6 +9805,14 @@ snapshots: next-tick@1.1.0: {} + nise@5.1.9: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 6.2.0 + path-to-regexp: 6.2.2 + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -8609,12 +9862,23 @@ snapshots: dependencies: path-key: 4.0.0 + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nwsapi@2.2.10: {} + object-assign@4.1.1: {} object-hash@3.0.0: {} object-inspect@1.13.1: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + object-keys@1.1.1: {} object.assign@4.1.5: @@ -8686,6 +9950,10 @@ snapshots: p-finally@1.0.0: {} + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -8694,6 +9962,10 @@ snapshots: dependencies: yocto-queue: 1.0.0 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -8702,6 +9974,8 @@ snapshots: dependencies: p-limit: 4.0.0 + p-try@2.2.0: {} + package-json@4.0.1: dependencies: got: 6.7.1 @@ -8735,8 +10009,19 @@ snapshots: parse-node-version@1.0.1: {} + parse5-htmlparser2-tree-adapter@7.0.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + path-browserify@1.0.1: {} + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -8758,10 +10043,16 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.0 + path-to-regexp@6.2.2: {} + path-type@4.0.0: {} + pathval@1.1.1: {} + pend@1.2.0: {} + performance-now@2.1.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -8772,11 +10063,22 @@ snapshots: pify@3.0.0: {} - pify@4.0.1: - optional: true + pify@4.0.1: {} pirates@4.0.6: {} + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + playwright-core@1.44.1: {} + + playwright@1.44.1: + dependencies: + playwright-core: 1.44.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.0.0: {} postcss-html@1.7.0: @@ -8893,8 +10195,22 @@ snapshots: prettier@3.2.5: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + progress@2.0.3: {} + prop-types-exact@1.2.4: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + isarray: 2.0.5 + object.assign: 4.1.5 + reflect.ownkeys: 1.1.4 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -8910,6 +10226,8 @@ snapshots: pseudomap@1.0.2: {} + psl@1.9.0: {} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -8917,10 +10235,27 @@ snapshots: punycode@2.3.1: {} + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + + railroad-diagrams@1.0.0: {} + + randexp@0.4.6: + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -8949,49 +10284,51 @@ snapshots: - supports-color - utf-8-validate - react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524): + react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530): dependencies: - react: 19.0.0-rc-935180c7e0-20240524 - scheduler: 0.25.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 + scheduler: 0.25.0-rc-9d4fba0788-20240530 - react-error-boundary@4.0.13(react@19.0.0-rc-935180c7e0-20240524): + react-error-boundary@4.0.13(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@babel/runtime': 7.24.5 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 react-fast-compare@3.2.2: {} - react-fast-marquee@1.6.4(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + react-fast-marquee@1.6.4(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - ? react-hook-form-mui@7.0.0(@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-hook-form@7.51.5(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524) + ? react-hook-form-mui@7.0.0(@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-hook-form@7.51.5(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) : dependencies: - '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-935180c7e0-20240524 - react-hook-form: 7.51.5(react@19.0.0-rc-935180c7e0-20240524) + '@mui/material': 5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-9d4fba0788-20240530 + react-hook-form: 7.51.5(react@19.0.0-rc-9d4fba0788-20240530) optionalDependencies: - '@mui/icons-material': 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0))(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0) + '@mui/icons-material': 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) - react-hook-form@7.51.5(react@19.0.0-rc-935180c7e0-20240524): + react-hook-form@7.51.5(react@19.0.0-rc-9d4fba0788-20240530): dependencies: - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 - react-i18next@14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + react-i18next@14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@babel/runtime': 7.24.5 html-parse-stringify: 3.0.1 i18next: 23.11.5 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 optionalDependencies: - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) react-is@16.13.1: {} + react-is@17.0.2: {} + react-is@18.3.1: {} - react-markdown@9.0.1(react@19.0.0-rc-935180c7e0-20240524)(types-react@19.0.0-rc.0): + react-markdown@9.0.1(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0): dependencies: '@types/hast': 3.0.4 '@types/react': types-react@19.0.0-rc.0 @@ -8999,7 +10336,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 mdast-util-to-hast: 13.1.0 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 remark-parse: 11.0.0 remark-rehype: 11.1.0 unified: 11.0.4 @@ -9008,35 +10345,54 @@ snapshots: transitivePeerDependencies: - supports-color + react-reconciler@0.29.2(react@19.0.0-rc-9d4fba0788-20240530): + dependencies: + loose-envify: 1.4.0 + react: 19.0.0-rc-9d4fba0788-20240530 + scheduler: 0.23.2 + react-refresh@0.14.2: {} - react-router-dom@6.23.1(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@remix-run/router': 1.16.1 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) - react-router: 6.23.1(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) + react-router: 6.23.1(react@19.0.0-rc-9d4fba0788-20240530) - react-router@6.23.1(react@19.0.0-rc-935180c7e0-20240524): + react-router@6.23.1(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@remix-run/router': 1.16.1 - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 - react-transition-group@4.4.5(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + react-shallow-renderer@16.15.0(react@19.0.0-rc-9d4fba0788-20240530): + dependencies: + object-assign: 4.1.1 + react: 19.0.0-rc-9d4fba0788-20240530 + react-is: 18.3.1 + + react-test-renderer@18.3.1(react@19.0.0-rc-9d4fba0788-20240530): + dependencies: + react: 19.0.0-rc-9d4fba0788-20240530 + react-is: 18.3.1 + react-shallow-renderer: 16.15.0(react@19.0.0-rc-9d4fba0788-20240530) + scheduler: 0.23.2 + + react-transition-group@4.4.5(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@babel/runtime': 7.24.5 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - react-virtuoso@4.7.10(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + react-virtuoso@4.7.10(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - react@19.0.0-rc-935180c7e0-20240524: {} + react@19.0.0-rc-9d4fba0788-20240530: {} read-cache@1.0.0: dependencies: @@ -9063,6 +10419,14 @@ snapshots: globalthis: 1.0.4 which-builtin-type: 1.1.3 + reflect.ownkeys@1.1.4: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-set-tostringtag: 2.0.3 + globalthis: 1.0.4 + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.2: @@ -9102,6 +10466,8 @@ snapshots: require-from-string@2.0.2: {} + requires-port@1.0.0: {} + reselect@4.1.8: {} reserved-words@0.1.2: {} @@ -9137,6 +10503,8 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + ret@0.1.15: {} + reusify@1.0.4: {} rfdc@1.3.1: {} @@ -9177,6 +10545,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 + rrweb-cssom@0.6.0: {} + + rrweb-cssom@0.7.0: {} + + rst-selector-parser@2.2.3: + dependencies: + lodash.flattendeep: 4.4.0 + nearley: 2.20.1 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -9196,10 +10573,9 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 - safer-buffer@2.1.2: - optional: true + safer-buffer@2.1.2: {} - sass@1.77.3: + sass@1.77.4: dependencies: chokidar: 3.6.0 immutable: 4.3.5 @@ -9207,7 +10583,15 @@ snapshots: sax@1.3.0: {} - scheduler@0.25.0-rc-935180c7e0-20240524: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + scheduler@0.25.0-rc-9d4fba0788-20240530: {} screenfull@5.2.0: {} @@ -9229,6 +10613,10 @@ snapshots: type-fest: 0.13.1 optional: true + serialize-javascript@6.0.0: + dependencies: + randombytes: 2.1.0 + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -9245,6 +10633,10 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -9274,6 +10666,15 @@ snapshots: signal-exit@4.1.0: {} + sinon@16.1.3: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/samsam': 8.0.0 + diff: 5.2.0 + nise: 5.1.9 + supports-color: 7.2.0 + slash@3.0.0: {} slice-ansi@4.0.0: @@ -9308,10 +10709,14 @@ snapshots: source-map-js@1.2.0: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.5.7: {} - source-map@0.6.1: - optional: true + source-map@0.6.1: {} source-map@0.7.4: {} @@ -9463,7 +10868,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.4.5) css-functions-list: 3.2.2 css-tree: 2.3.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 file-entry-cache: 9.0.0 @@ -9501,7 +10906,7 @@ snapshots: stylus@0.62.0: dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) glob: 7.2.3 sax: 1.3.0 source-map: 0.7.4 @@ -9520,7 +10925,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -9532,6 +10937,10 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-hyperlinks@3.0.0: dependencies: has-flag: 4.0.0 @@ -9543,11 +10952,13 @@ snapshots: svg-tags@1.0.0: {} - swr@2.2.5(react@19.0.0-rc-935180c7e0-20240524): + swr@2.2.5(react@19.0.0-rc-9d4fba0788-20240530): dependencies: client-only: 0.0.1 - react: 19.0.0-rc-935180c7e0-20240524 - use-sync-external-store: 1.2.2(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + use-sync-external-store: 1.2.2(react@19.0.0-rc-9d4fba0788-20240530) + + symbol-tree@3.2.4: {} synckit@0.8.8: dependencies: @@ -9637,6 +11048,17 @@ snapshots: dependencies: is-number: 7.0.0 + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -9681,6 +11103,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-fest@0.13.1: optional: true @@ -9746,7 +11170,7 @@ snapshots: postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) postcss-modules-scope: 3.2.0(postcss@8.4.38) reserved-words: 0.1.2 - sass: 1.77.3 + sass: 1.77.4 source-map-js: 1.2.0 stylus: 0.62.0 tsconfig-paths: 4.2.0 @@ -9820,6 +11244,8 @@ snapshots: universalify@0.1.2: {} + universalify@0.2.0: {} + universalify@2.0.1: {} unzip-response@2.0.1: {} @@ -9851,15 +11277,20 @@ snapshots: dependencies: prepend-http: 1.0.4 - use-resize-observer@9.1.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-resize-observer@9.1.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): dependencies: '@juggle/resize-observer': 3.4.0 - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) - use-sync-external-store@1.2.2(react@19.0.0-rc-935180c7e0-20240524): + use-sync-external-store@1.2.2(react@19.0.0-rc-9d4fba0788-20240530): dependencies: - react: 19.0.0-rc-935180c7e0-20240524 + react: 19.0.0-rc-9d4fba0788-20240530 utf-8-validate@5.0.10: dependencies: @@ -9878,47 +11309,47 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - virtua@0.31.0(react-dom@19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524))(react@19.0.0-rc-935180c7e0-20240524): + virtua@0.31.0(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530): optionalDependencies: - react: 19.0.0-rc-935180c7e0-20240524 - react-dom: 19.0.0-rc-935180c7e0-20240524(react@19.0.0-rc-935180c7e0-20240524) + react: 19.0.0-rc-9d4fba0788-20240530 + react-dom: 19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530) vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.49.0): dependencies: esbuild: 0.19.12 monaco-editor: 0.49.0 - vite-plugin-sass-dts@1.3.22(postcss@8.4.38)(prettier@3.2.5)(sass@1.77.3)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.22(postcss@8.4.38)(prettier@3.2.5)(sass@1.77.4)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: postcss: 8.4.38 postcss-js: 4.0.1(postcss@8.4.38) prettier: 3.2.5 - sass: 1.77.3 - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + sass: 1.77.4 + vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) - vite-plugin-svgr@4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.17.2) '@svgr/core': 8.1.0(typescript@5.4.5) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0) + vite: 5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - supports-color - typescript - vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.3)(stylus@0.62.0): + vite@5.2.12(@types/node@20.12.13)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 @@ -9927,13 +11358,19 @@ snapshots: '@types/node': 20.12.13 fsevents: 2.3.3 less: 4.2.0 - sass: 1.77.3 + sass: 1.77.4 stylus: 0.62.0 void-elements@3.1.0: {} + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + web-streams-polyfill@3.3.3: {} + webidl-conversions@7.0.0: {} + websocket@1.0.35: dependencies: bufferutil: 4.0.8 @@ -9945,6 +11382,17 @@ snapshots: transitivePeerDependencies: - supports-color + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -9997,6 +11445,8 @@ snapshots: word-wrap@1.2.5: {} + workerpool@6.2.1: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -10039,8 +11489,17 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + xdg-basedir@3.0.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@5.0.8: {} yaeti@0.0.6: {} @@ -10053,8 +11512,27 @@ snapshots: yaml@2.4.2: {} + yargs-parser@20.2.4: {} + yargs-parser@21.1.1: {} + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/echo/examples/config.json b/echo/examples/config.json index c08112a198..e538aa9bdf 100644 --- a/echo/examples/config.json +++ b/echo/examples/config.json @@ -1,111 +1,79 @@ { - "web_port": 9000, - "web_token": "", - "enable_ping": false, - "log_level": "debug", - "reload_interval": 5, - "relay_configs": [ - { - "listen": "127.0.0.1:1234", - "listen_type": "raw", - "transport_type": "raw", - "label": "relay1", - "tcp_remotes": [ - "0.0.0.0:5201" - ], - "udp_remotes": [ - "0.0.0.0:5201" - ] - }, - { - "listen": "127.0.0.1:1235", - "listen_type": "raw", - "transport_type": "ws", - "tcp_remotes": [ - "ws://0.0.0.0:2443" - ], - "udp_remotes": [ - "0.0.0.0:5201" - ] - }, - { - "listen": "127.0.0.1:1236", - "listen_type": "raw", - "transport_type": "wss", - "tcp_remotes": [ - "wss://0.0.0.0:3443" - ], - "udp_remotes": [ - "0.0.0.0:5201" - ] - }, - { - "listen": "127.0.0.1:1237", - "listen_type": "raw", - "transport_type": "mwss", - "tcp_remotes": [ - "wss://0.0.0.0:4443" - ], - "udp_remotes": [ - "0.0.0.0:5201" - ] - }, - { - "listen": "127.0.0.1:1238", - "listen_type": "raw", - "transport_type": "mtcp", - "tcp_remotes": [ - "0.0.0.0:4444" - ], - "udp_remotes": [ - "0.0.0.0:5201" - ] - }, - { - "listen": "127.0.0.1:2443", - "listen_type": "ws", - "transport_type": "raw", - "tcp_remotes": [ - "0.0.0.0:5201" - ], - "udp_remotes": [] - }, - { - "listen": "127.0.0.1:3443", - "listen_type": "wss", - "transport_type": "raw", - "tcp_remotes": [ - "0.0.0.0:5201" - ], - "udp_remotes": [] - }, - { - "listen": "127.0.0.1:4443", - "listen_type": "mwss", - "transport_type": "raw", - "tcp_remotes": [ - "0.0.0.0:5201" - ], - "udp_remotes": [] - }, - { - "listen": "127.0.0.1:4444", - "listen_type": "mtcp", - "transport_type": "raw", - "tcp_remotes": [ - "0.0.0.0:5201" - ], - "udp_remotes": [] - }, - { - "label": "ping_test", - "listen": "127.0.0.1:8888", - "listen_type": "raw", - "transport_type": "raw", - "tcp_remotes": [ - "8.8.8.8:5201", - "google.com:5201" - ] - } - ] -} \ No newline at end of file + "web_port": 9000, + "enable_ping": false, + "log_level": "info", + "reload_interval": 60, + "relay_configs": [ + { + "listen": "127.0.0.1:1234", + "listen_type": "raw", + "transport_type": "raw", + "label": "relay1", + "tcp_remotes": ["0.0.0.0:5201"], + "udp_remotes": ["0.0.0.0:5201"] + }, + { + "listen": "127.0.0.1:1235", + "listen_type": "raw", + "transport_type": "ws", + "tcp_remotes": ["ws://0.0.0.0:2443"], + "udp_remotes": ["0.0.0.0:5201"] + }, + { + "listen": "127.0.0.1:1236", + "listen_type": "raw", + "transport_type": "wss", + "tcp_remotes": ["wss://0.0.0.0:3443"], + "udp_remotes": ["0.0.0.0:5201"] + }, + { + "listen": "127.0.0.1:1237", + "listen_type": "raw", + "transport_type": "mwss", + "tcp_remotes": ["wss://0.0.0.0:4443"], + "udp_remotes": ["0.0.0.0:5201"] + }, + { + "listen": "127.0.0.1:1238", + "listen_type": "raw", + "transport_type": "mtcp", + "tcp_remotes": ["0.0.0.0:4444"], + "udp_remotes": ["0.0.0.0:5201"] + }, + { + "listen": "127.0.0.1:2443", + "listen_type": "ws", + "transport_type": "raw", + "tcp_remotes": ["0.0.0.0:5201"], + "udp_remotes": [] + }, + { + "listen": "127.0.0.1:3443", + "listen_type": "wss", + "transport_type": "raw", + "tcp_remotes": ["0.0.0.0:5201"], + "udp_remotes": [] + }, + { + "listen": "127.0.0.1:4443", + "listen_type": "mwss", + "transport_type": "raw", + "tcp_remotes": ["0.0.0.0:5201"], + "udp_remotes": [] + }, + { + "listen": "127.0.0.1:4444", + "listen_type": "mtcp", + "transport_type": "raw", + "tcp_remotes": ["0.0.0.0:5201"], + "udp_remotes": [] + }, + { + "label": "ping_test", + "listen": "127.0.0.1:8888", + "listen_type": "raw", + "transport_type": "raw", + "tcp_remotes": ["8.8.8.8:5201", "google.com:5201"] + } + ] +} diff --git a/echo/go.mod b/echo/go.mod index c13bbaf988..a9845539e9 100644 --- a/echo/go.mod +++ b/echo/go.mod @@ -5,6 +5,7 @@ go 1.22 toolchain go1.22.1 require ( + github.com/alecthomas/kingpin/v2 v2.4.0 github.com/getsentry/sentry-go v0.27.0 github.com/go-ping/ping v1.1.0 github.com/gobwas/ws v1.3.2 @@ -27,7 +28,6 @@ require ( ) require ( - github.com/alecthomas/kingpin/v2 v2.4.0 // indirect github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect github.com/andybalholm/brotli v1.1.0 // indirect github.com/beevik/ntp v1.4.2 // indirect diff --git a/echo/internal/cli/config.go b/echo/internal/cli/config.go index e9776f7d8e..231e4fec46 100644 --- a/echo/internal/cli/config.go +++ b/echo/internal/cli/config.go @@ -11,6 +11,7 @@ import ( "github.com/Ehco1996/ehco/internal/relay/conf" "github.com/Ehco1996/ehco/internal/tls" "github.com/Ehco1996/ehco/internal/web" + "github.com/Ehco1996/ehco/pkg/buffer" "github.com/Ehco1996/ehco/pkg/log" "github.com/Ehco1996/ehco/pkg/xray" "github.com/getsentry/sentry-go" @@ -77,6 +78,12 @@ func initLogger(cfg *config.Config) error { return nil } +func initGlobalBufferPool() { + if BufferSize > 0 { + buffer.ReplaceBufferPool(BufferSize) + } +} + func InitConfigAndComponents() (*config.Config, error) { cfg, err := loadConfig() if err != nil { @@ -88,7 +95,7 @@ func InitConfigAndComponents() (*config.Config, error) { if err := initSentry(); err != nil { return nil, err } - + initGlobalBufferPool() return cfg, nil } diff --git a/echo/internal/cli/flags.go b/echo/internal/cli/flags.go index 051bd5cd7a..7d7514d0d9 100644 --- a/echo/internal/cli/flags.go +++ b/echo/internal/cli/flags.go @@ -15,6 +15,7 @@ var ( SystemFilePath = "/etc/systemd/system/ehco.service" LogLevel string ConfigReloadInterval int + BufferSize int ) var RootFlags = []cli.Flag{ @@ -91,4 +92,10 @@ var RootFlags = []cli.Flag{ Destination: &ConfigReloadInterval, DefaultText: "60", }, + &cli.IntFlag{ + Name: "buffer_size", + Usage: "set buffer size to when transport data default 20 * 1024(20KB)", + EnvVars: []string{"EHCO_BUFFER_SIZE"}, + Destination: &BufferSize, + }, } diff --git a/echo/internal/conn/conn.go b/echo/internal/conn/relay_conn.go similarity index 97% rename from echo/internal/conn/conn.go rename to echo/internal/conn/relay_conn.go index 3d2f71a010..f8b996218f 100644 --- a/echo/internal/conn/conn.go +++ b/echo/internal/conn/relay_conn.go @@ -9,6 +9,7 @@ import ( "time" "github.com/Ehco1996/ehco/internal/metrics" + "github.com/Ehco1996/ehco/pkg/buffer" "github.com/Ehco1996/ehco/pkg/bytes" "go.uber.org/zap" ) @@ -113,10 +114,12 @@ func connectionName(conn net.Conn) string { } func copyConn(conn1, conn2 *innerConn) error { + buf := buffer.BufferPool.Get() + defer buffer.BufferPool.Put(buf) errCH := make(chan error, 1) // copy conn1 to conn2,read from conn1 and write to conn2 go func() { - _, err := io.Copy(conn2, conn1) + _, err := io.CopyBuffer(conn2, conn1, buf) _ = conn2.CloseWrite() // all data is written to conn2 now, so close the write side of conn2 to send eof errCH <- err }() diff --git a/echo/internal/conn/conn_test.go b/echo/internal/conn/relay_conn_test.go similarity index 100% rename from echo/internal/conn/conn_test.go rename to echo/internal/conn/relay_conn_test.go diff --git a/echo/internal/transporter/ws_conn.go b/echo/internal/conn/ws_conn.go similarity index 83% rename from echo/internal/transporter/ws_conn.go rename to echo/internal/conn/ws_conn.go index a2bc693373..a555852c47 100644 --- a/echo/internal/transporter/ws_conn.go +++ b/echo/internal/conn/ws_conn.go @@ -1,4 +1,4 @@ -package transporter +package conn import ( "fmt" @@ -9,6 +9,7 @@ import ( "github.com/Ehco1996/ehco/pkg/buffer" "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" + "go.uber.org/zap" ) type wsConn struct { @@ -17,7 +18,7 @@ type wsConn struct { buf []byte } -func newWsConn(conn net.Conn, isServer bool) *wsConn { +func NewWSConn(conn net.Conn, isServer bool) *wsConn { return &wsConn{conn: conn, isServer: isServer, buf: buffer.BufferPool.Get()} } @@ -27,6 +28,7 @@ func (c *wsConn) Read(b []byte) (n int, err error) { return 0, err } if header.Length > int64(cap(c.buf)) { + zap.S().Warnf("ws payload size:%d is larger than buffer size:%d", header.Length, cap(c.buf)) c.buf = make([]byte, header.Length) } payload := c.buf[:header.Length] @@ -38,7 +40,7 @@ func (c *wsConn) Read(b []byte) (n int, err error) { ws.Cipher(payload, header.Mask, 0) } if len(payload) > len(b) { - return 0, fmt.Errorf("buffer too small to transport ws msg") + return 0, fmt.Errorf("buffer size:%d too small to transport ws payload size:%d", len(b), len(payload)) } copy(b, payload) return len(payload), nil diff --git a/echo/internal/transporter/ws_conn_test.go b/echo/internal/conn/ws_conn_test.go similarity index 94% rename from echo/internal/transporter/ws_conn_test.go rename to echo/internal/conn/ws_conn_test.go index 0c0dad5590..ec0279287d 100644 --- a/echo/internal/transporter/ws_conn_test.go +++ b/echo/internal/conn/ws_conn_test.go @@ -1,4 +1,4 @@ -package transporter +package conn import ( "context" @@ -23,7 +23,7 @@ func TestClientConn_ReadWrite(t *testing.T) { } go func() { defer conn.Close() - wsc := newWsConn(conn, true) + wsc := NewWSConn(conn, true) buf := make([]byte, 1024) for { @@ -53,7 +53,7 @@ func TestClientConn_ReadWrite(t *testing.T) { } defer conn.Close() - wsClientConn := newWsConn(conn, false) + wsClientConn := NewWSConn(conn, false) for i := 0; i < 3; i++ { // test write n, err := wsClientConn.Write(data) diff --git a/echo/internal/transporter/ws.go b/echo/internal/transporter/ws.go index 3359b79028..37e4d6c313 100644 --- a/echo/internal/transporter/ws.go +++ b/echo/internal/transporter/ws.go @@ -9,6 +9,7 @@ import ( "github.com/gobwas/ws" "github.com/labstack/echo/v4" + "github.com/Ehco1996/ehco/internal/conn" "github.com/Ehco1996/ehco/internal/constant" "github.com/Ehco1996/ehco/internal/metrics" "github.com/Ehco1996/ehco/internal/web" @@ -43,7 +44,7 @@ func (s *WsClient) TCPHandShake(remote *lb.Node) (net.Conn, error) { latency := time.Since(t1) metrics.HandShakeDuration.WithLabelValues(remote.Label).Observe(float64(latency.Milliseconds())) remote.HandShakeDuration = latency - c := newWsConn(wsc, false) + c := conn.NewWSConn(wsc, false) return c, nil } @@ -91,8 +92,8 @@ func (s *WsServer) HandleRequest(w http.ResponseWriter, req *http.Request) { if err != nil { return } - c := newWsConn(wsc, true) - if err := s.RelayTCPConn(c, s.relayer.TCPHandShake); err != nil { + + if err := s.RelayTCPConn(conn.NewWSConn(wsc, true), s.relayer.TCPHandShake); err != nil { s.l.Errorf("RelayTCPConn error: %s", err.Error()) } } diff --git a/echo/internal/transporter/wss_mux.go b/echo/internal/transporter/wss_mux.go index 844a1cbca4..e7af0f9f2e 100644 --- a/echo/internal/transporter/wss_mux.go +++ b/echo/internal/transporter/wss_mux.go @@ -1,3 +1,6 @@ +// NOTE CAN NOT use real ws frame to transport smux frame +// err: accept stream err: buffer size:8 too small to transport ws payload size:45 +// so this transport just use ws protocol to handshake and then use smux protocol to transport package transporter import ( @@ -101,12 +104,12 @@ func (s *MwssServer) ListenAndServe() error { } func (s *MwssServer) HandleRequest(w http.ResponseWriter, r *http.Request) { - conn, _, _, err := ws.UpgradeHTTP(r, w) + c, _, _, err := ws.UpgradeHTTP(r, w) if err != nil { s.l.Error(err) return } - s.mux(conn) + s.mux(c) } func (s *MwssServer) Close() error { diff --git a/echo/pkg/buffer/buffer.go b/echo/pkg/buffer/buffer.go index 8ae9d3ebe0..3336365735 100644 --- a/echo/pkg/buffer/buffer.go +++ b/echo/pkg/buffer/buffer.go @@ -5,7 +5,9 @@ import ( ) // 全局pool -var BufferPool *BytePool +var ( + BufferPool *BytePool +) func init() { BufferPool = NewBytePool(constant.BUFFER_POOL_SIZE, constant.BUFFER_SIZE) @@ -47,3 +49,7 @@ func (bp *BytePool) Put(b []byte) { // buffer didn't go back into pool, just discard } } + +func ReplaceBufferPool(size int) { + BufferPool = NewBytePool(constant.BUFFER_POOL_SIZE, size) +} diff --git a/hysteria/app/internal/http/server.go b/hysteria/app/internal/http/server.go index e5761ce5f1..0b5e411665 100644 --- a/hysteria/app/internal/http/server.go +++ b/hysteria/app/internal/http/server.go @@ -278,6 +278,11 @@ func sendSimpleResponse(conn net.Conn, req *http.Request, statusCode int) error ProtoMinor: req.ProtoMinor, Header: http.Header{}, } + // Remove the "Content-Length: 0" header, some clients (e.g. ffmpeg) may not like it. + resp.ContentLength = -1 + // Also, prevent the "Connection: close" header. + resp.Close = false + resp.Uncompressed = true return resp.Write(conn) } diff --git a/lede/package/kernel/linux/modules/video.mk b/lede/package/kernel/linux/modules/video.mk index 9704bb7ee5..d6412ffad6 100644 --- a/lede/package/kernel/linux/modules/video.mk +++ b/lede/package/kernel/linux/modules/video.mk @@ -79,6 +79,7 @@ define KernelPackage/fb DEPENDS:=@DISPLAY_SUPPORT KCONFIG:= \ CONFIG_FB \ + CONFIG_FB_DEVICE=y \ CONFIG_FB_MXS=n \ CONFIG_FB_SM750=n \ CONFIG_FRAMEBUFFER_CONSOLE=y \ diff --git a/lede/target/linux/x86/64/config-6.6 b/lede/target/linux/x86/64/config-6.6 index 5de48cc8af..a04a3649b8 100644 --- a/lede/target/linux/x86/64/config-6.6 +++ b/lede/target/linux/x86/64/config-6.6 @@ -175,6 +175,7 @@ CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_CMDLINE=y CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DEVICE=y CONFIG_FB_EFI=y CONFIG_FB_HYPERV=y # CONFIG_FB_INTEL is not set diff --git a/lede/target/linux/x86/generic/config-6.6 b/lede/target/linux/x86/generic/config-6.6 index e46fc01eea..5b2ca91dd0 100644 --- a/lede/target/linux/x86/generic/config-6.6 +++ b/lede/target/linux/x86/generic/config-6.6 @@ -136,6 +136,7 @@ CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_CMDLINE=y CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DEVICE=y CONFIG_FB_EFI=y CONFIG_FB_HYPERV=y # CONFIG_FB_I810 is not set diff --git a/lede/target/linux/x86/legacy/config-6.6 b/lede/target/linux/x86/legacy/config-6.6 index f159d79c4c..cd324aaf4b 100644 --- a/lede/target/linux/x86/legacy/config-6.6 +++ b/lede/target/linux/x86/legacy/config-6.6 @@ -98,6 +98,7 @@ CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_CMDLINE=y CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DEVICE=y # CONFIG_FB_I810 is not set CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_FILLRECT=y diff --git a/mieru/.github/workflows/external_connect.yaml b/mieru/.github/workflows/external_connect.yaml new file mode 100644 index 0000000000..0d46b40143 --- /dev/null +++ b/mieru/.github/workflows/external_connect.yaml @@ -0,0 +1,17 @@ +name: 'external connection test' +on: [workflow_dispatch] +jobs: + run-test: + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + - name: Build test binaries + run: make test-binary + - name: Run packet drop test + run: sudo ./test/deploy/externalconnect/test.sh diff --git a/mieru/pkg/congestion/rtt.go b/mieru/pkg/congestion/rtt.go index 1c17e731f7..2a43023389 100644 --- a/mieru/pkg/congestion/rtt.go +++ b/mieru/pkg/congestion/rtt.go @@ -24,6 +24,7 @@ package congestion import ( "math" + "sync" "time" "github.com/enfein/mieru/pkg/mathext" @@ -49,6 +50,8 @@ type RTTStats struct { maxAckDelay time.Duration rtoMultiplier float64 + + mu sync.Mutex } // NewRTTStats makes a properly initialized RTTStats object @@ -78,6 +81,9 @@ func (r *RTTStats) MaxAckDelay() time.Duration { return r.maxAckDelay } // RTO gets the retransmission timeout. func (r *RTTStats) RTO() time.Duration { + r.mu.Lock() + defer r.mu.Unlock() + if r.SmoothedRTT() == 0 { return 2 * defaultInitialRTT } @@ -88,6 +94,9 @@ func (r *RTTStats) RTO() time.Duration { // UpdateRTT updates the RTT based on a new sample. func (r *RTTStats) UpdateRTT(sample time.Duration) { + r.mu.Lock() + defer r.mu.Unlock() + if sample == infDuration || sample <= 0 { return } @@ -109,6 +118,8 @@ func (r *RTTStats) UpdateRTT(sample time.Duration) { // SetMaxAckDelay sets the max_ack_delay func (r *RTTStats) SetMaxAckDelay(mad time.Duration) { + r.mu.Lock() + defer r.mu.Unlock() r.maxAckDelay = mad } @@ -117,12 +128,17 @@ func (r *RTTStats) SetRTOMultiplier(n float64) { if n <= 0 { panic("retransmission timeout multiplier must be greater than 0") } + r.mu.Lock() + defer r.mu.Unlock() r.rtoMultiplier = n } // SetInitialRTT sets the initial RTT. // It is used during the 0-RTT handshake when restoring the RTT stats from the session state. func (r *RTTStats) SetInitialRTT(t time.Duration) { + r.mu.Lock() + defer r.mu.Unlock() + if r.hasMeasurement { panic("initial RTT set after first measurement") } @@ -132,6 +148,9 @@ func (r *RTTStats) SetInitialRTT(t time.Duration) { // Reset is called when connection migrates and rtt measurement needs to be reset. func (r *RTTStats) Reset() { + r.mu.Lock() + defer r.mu.Unlock() + r.latestRTT = 0 r.minRTT = 0 r.smoothedRTT = 0 @@ -142,6 +161,9 @@ func (r *RTTStats) Reset() { // is larger. The mean deviation is increased to the most recent deviation if // it's larger. func (r *RTTStats) ExpireSmoothedMetrics() { + r.mu.Lock() + defer r.mu.Unlock() + r.meanDeviation = mathext.Max(r.meanDeviation, mathext.Abs(r.smoothedRTT-r.latestRTT)) r.smoothedRTT = mathext.Max(r.smoothedRTT, r.latestRTT) } diff --git a/mieru/pkg/protocolv2/underlay_base.go b/mieru/pkg/protocolv2/underlay_base.go index 910aaae5d4..419666421f 100644 --- a/mieru/pkg/protocolv2/underlay_base.go +++ b/mieru/pkg/protocolv2/underlay_base.go @@ -39,8 +39,9 @@ type baseUnderlay struct { sessionMap sync.Map // Map readySessions chan *Session // sessions that completed handshake and ready for consume - sendMutex sync.Mutex // protect writing data to the connection - closeMutex sync.Mutex // protect closing the connection + sendMutex sync.Mutex // protect writing data to the connection + closeMutex sync.Mutex // protect closing the connection + ipVersionMutex sync.Mutex // protect getting and setting IPVersion // ---- client fields ---- scheduler *ScheduleController diff --git a/mieru/pkg/protocolv2/underlay_tcp.go b/mieru/pkg/protocolv2/underlay_tcp.go index 30f3eb5864..258bfc8d9d 100644 --- a/mieru/pkg/protocolv2/underlay_tcp.go +++ b/mieru/pkg/protocolv2/underlay_tcp.go @@ -85,7 +85,6 @@ func NewTCPUnderlay(ctx context.Context, network, laddr, raddr string, mtu int, conn: conn.(*net.TCPConn), candidates: []cipher.BlockCipher{block}, } - log.Debugf("Created new client TCP underlay %v", t) return t, nil } @@ -115,6 +114,8 @@ func (t *TCPUnderlay) Addr() net.Addr { } func (t *TCPUnderlay) IPVersion() util.IPVersion { + t.ipVersionMutex.Lock() + defer t.ipVersionMutex.Unlock() if t.conn == nil { return util.IPVersionUnknown } @@ -278,7 +279,9 @@ func (t *TCPUnderlay) onCloseSession(seg *segment) error { sessionID := ss.sessionID session, found := t.sessionMap.Load(sessionID) if !found { - log.Debugf("%v received close session request or response, but session ID %d is not found", t, sessionID) + if log.IsLevelEnabled(log.TraceLevel) { + log.Tracef("%v received close session request or response, but session ID %d is not found", t, sessionID) + } return nil } s := session.(*Session) diff --git a/mieru/pkg/protocolv2/underlay_udp.go b/mieru/pkg/protocolv2/underlay_udp.go index 044ef21aad..387dc64fcc 100644 --- a/mieru/pkg/protocolv2/underlay_udp.go +++ b/mieru/pkg/protocolv2/underlay_udp.go @@ -102,7 +102,6 @@ func NewUDPUnderlay(ctx context.Context, network, laddr, raddr string, mtu int, serverAddr: remoteAddr, block: block, } - log.Debugf("Created new client UDP underlay %v", u) return u, nil } @@ -133,6 +132,8 @@ func (u *UDPUnderlay) Close() error { } func (u *UDPUnderlay) IPVersion() util.IPVersion { + u.ipVersionMutex.Lock() + defer u.ipVersionMutex.Unlock() if u.conn == nil { return util.IPVersionUnknown } @@ -317,7 +318,9 @@ func (u *UDPUnderlay) onCloseSession(seg *segment) error { sessionID := ss.sessionID session, found := u.sessionMap.Load(sessionID) if !found { - log.Debugf("%v received close session request or response, but session ID %d is not found", u, sessionID) + if log.IsLevelEnabled(log.TraceLevel) { + log.Tracef("%v received close session request or response, but session ID %d is not found", u, sessionID) + } return nil } s := session.(*Session) diff --git a/mieru/pkg/socks5/socks5.go b/mieru/pkg/socks5/socks5.go index ad380d893b..3fc272cb3f 100644 --- a/mieru/pkg/socks5/socks5.go +++ b/mieru/pkg/socks5/socks5.go @@ -154,9 +154,7 @@ func (s *Server) Serve(l net.Listener) error { func (s *Server) ServeConn(conn net.Conn) error { conn = util.WrapHierarchyConn(conn) defer conn.Close() - if log.IsLevelEnabled(log.TraceLevel) { - log.Tracef("socks5 server starts to serve connection [%v - %v]", conn.LocalAddr(), conn.RemoteAddr()) - } + log.Debugf("socks5 server starts to serve connection [%v - %v]", conn.LocalAddr(), conn.RemoteAddr()) if s.config.UseProxy { return s.clientServeConn(conn) diff --git a/mieru/test/deploy/externalconnect/client_tcp.json b/mieru/test/deploy/externalconnect/client_tcp.json new file mode 100644 index 0000000000..6a82dd8cad --- /dev/null +++ b/mieru/test/deploy/externalconnect/client_tcp.json @@ -0,0 +1,41 @@ +{ + "profiles": [ + { + "profileName": "default", + "user": { + "name": "baozi", + "password": "manlianpenfen" + }, + "servers": [ + { + "domainName": "localhost", + "portBindings": [ + { + "portRange": "8964-8965", + "protocol": "TCP" + }, + { + "port": 9648, + "protocol": "TCP" + }, + { + "port": 6489, + "protocol": "TCP" + }, + { + "port": 4896, + "protocol": "TCP" + } + ] + } + ], + "multiplexing": { + "level": "MULTIPLEXING_HIGH" + } + } + ], + "activeProfile": "default", + "rpcPort": 8989, + "socks5Port": 1080, + "loggingLevel": "INFO" +} diff --git a/mieru/test/deploy/externalconnect/client_udp.json b/mieru/test/deploy/externalconnect/client_udp.json new file mode 100644 index 0000000000..d36088a113 --- /dev/null +++ b/mieru/test/deploy/externalconnect/client_udp.json @@ -0,0 +1,42 @@ +{ + "profiles": [ + { + "profileName": "default", + "user": { + "name": "baozi", + "password": "manlianpenfen" + }, + "servers": [ + { + "domainName": "localhost", + "portBindings": [ + { + "portRange": "8964-8965", + "protocol": "UDP" + }, + { + "port": 9648, + "protocol": "UDP" + }, + { + "port": 6489, + "protocol": "UDP" + }, + { + "port": 4896, + "protocol": "UDP" + } + ] + } + ], + "mtu": 1500, + "multiplexing": { + "level": "MULTIPLEXING_HIGH" + } + } + ], + "activeProfile": "default", + "rpcPort": 8989, + "socks5Port": 1080, + "loggingLevel": "INFO" +} diff --git a/mieru/test/deploy/externalconnect/libtest.sh b/mieru/test/deploy/externalconnect/libtest.sh new file mode 100755 index 0000000000..7a0a36494e --- /dev/null +++ b/mieru/test/deploy/externalconnect/libtest.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# Copyright (C) 2024 mieru authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +function run_external_connect_test() { + success_count=0 + failure_count=0 + + for i in {1..1000}; do + ./mieru test + if [[ "$?" -ne 0 ]]; then + ((failure_count++)) + echo "Failed $failure_count times with $i runs." + if [[ "$failure_count" -ge 2 ]]; then + echo "Test failed: too many runs have a non-zero exit code." + exit 1 + fi + else + ((success_count++)) + fi + sleep 1 + done +} + +function print_mieru_client_log() { + echo "========== BEGIN OF MIERU CLIENT LOG ==========" + cat $HOME/.cache/mieru/*.log + echo "========== END OF MIERU CLIENT LOG ==========" +} + +function delete_mieru_client_log() { + rm -rf $HOME/.cache/mieru/*.log +} + +function print_mieru_server_thread_dump() { + echo "========== BEGIN OF MIERU SERVER THREAD DUMP ==========" + ./mita get thread-dump + echo "========== END OF MIERU SERVER THREAD DUMP ==========" +} + +function print_mieru_client_thread_dump() { + echo "========== BEGIN OF MIERU CLIENT THREAD DUMP ==========" + ./mieru get thread-dump + echo "========== END OF MIERU CLIENT THREAD DUMP ==========" +} diff --git a/mieru/test/deploy/externalconnect/server_tcp.json b/mieru/test/deploy/externalconnect/server_tcp.json new file mode 100644 index 0000000000..2352525b10 --- /dev/null +++ b/mieru/test/deploy/externalconnect/server_tcp.json @@ -0,0 +1,30 @@ +{ + "portBindings": [ + { + "portRange": "8964-8965", + "protocol": "TCP" + }, + { + "port": 9648, + "protocol": "TCP" + }, + { + "port": 6489, + "protocol": "TCP" + }, + { + "port": 4896, + "protocol": "TCP" + } + ], + "users": [ + { + "name": "baozi", + "password": "manlianpenfen" + } + ], + "advancedSettings": { + "allowLocalDestination": true + }, + "loggingLevel": "DEBUG" +} diff --git a/mieru/test/deploy/externalconnect/server_udp.json b/mieru/test/deploy/externalconnect/server_udp.json new file mode 100644 index 0000000000..9bdb561853 --- /dev/null +++ b/mieru/test/deploy/externalconnect/server_udp.json @@ -0,0 +1,31 @@ +{ + "portBindings": [ + { + "portRange": "8964-8965", + "protocol": "UDP" + }, + { + "port": 9648, + "protocol": "UDP" + }, + { + "port": 6489, + "protocol": "UDP" + }, + { + "port": 4896, + "protocol": "UDP" + } + ], + "users": [ + { + "name": "baozi", + "password": "manlianpenfen" + } + ], + "advancedSettings": { + "allowLocalDestination": true + }, + "loggingLevel": "DEBUG", + "mtu": 1500 +} diff --git a/mieru/test/deploy/externalconnect/test.sh b/mieru/test/deploy/externalconnect/test.sh new file mode 100755 index 0000000000..bff6a6c943 --- /dev/null +++ b/mieru/test/deploy/externalconnect/test.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Copyright (C) 2024 mieru authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Make sure this script has executable permission: +# git update-index --chmod=+x + +set -e + +# Make sure the current user has root privilege. +uid=$(id -u "$USER") +if [ $uid -ne 0 ]; then + echo "Error: need root to run this test" + exit 1 +fi + +# Start mieru server daemon. +mkdir -p /etc/mita +export MITA_INSECURE_UDS=1 +./mita run & +sleep 1 + +# Run UDP test. +echo "========== BEGIN OF UDP TEST ==========" +./test/deploy/externalconnect/test_udp.sh +echo "========== END OF UDP TEST ==========" + +# Run TCP test. +echo "========== BEGIN OF TCP TEST ==========" +./test/deploy/externalconnect/test_tcp.sh +echo "========== END OF TCP TEST ==========" + +echo "Test is successful." +exit 0 diff --git a/mieru/test/deploy/externalconnect/test_tcp.sh b/mieru/test/deploy/externalconnect/test_tcp.sh new file mode 100755 index 0000000000..44ed557c8d --- /dev/null +++ b/mieru/test/deploy/externalconnect/test_tcp.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# Copyright (C) 2024 mieru authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Make sure this script has executable permission: +# git update-index --chmod=+x + +export PATH_PREFIX="test/deploy/externalconnect" + +# Load test library. +source ./${PATH_PREFIX}/libtest.sh + +# Update mieru server with TCP config. +./mita apply config ${PATH_PREFIX}/server_tcp.json +if [[ "$?" -ne 0 ]]; then + echo "command 'mita apply config server_tcp.json' failed" + exit 1 +fi +echo "mieru server config:" +./mita describe config + +# Start mieru server proxy. +./mita start +if [[ "$?" -ne 0 ]]; then + echo "command 'mita start' failed" + exit 1 +fi + +# Update mieru client with TCP config. +./mieru apply config ${PATH_PREFIX}/client_tcp.json +if [[ "$?" -ne 0 ]]; then + echo "command 'mieru apply config client_tcp.json' failed" + exit 1 +fi +echo "mieru client config:" +./mieru describe config + +# Start mieru client. +./mieru start +if [[ "$?" -ne 0 ]]; then + echo "command 'mieru start' failed" + exit 1 +fi + +# Start testing. +sleep 2 +run_external_connect_test + +# Stop mieru client. +./mieru stop +if [[ "$?" -ne 0 ]]; then + echo "command 'mieru stop' failed" + exit 1 +fi +sleep 1 + +# Stop mieru server proxy. +./mita stop +if [[ "$?" -ne 0 ]]; then + echo "command 'mita stop' failed" + exit 1 +fi +sleep 1 + +print_mieru_client_log +delete_mieru_client_log +sleep 1 diff --git a/mieru/test/deploy/externalconnect/test_udp.sh b/mieru/test/deploy/externalconnect/test_udp.sh new file mode 100755 index 0000000000..dbdff78028 --- /dev/null +++ b/mieru/test/deploy/externalconnect/test_udp.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# Copyright (C) 2024 mieru authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Make sure this script has executable permission: +# git update-index --chmod=+x + +export PATH_PREFIX="test/deploy/externalconnect" + +# Load test library. +source ./${PATH_PREFIX}/libtest.sh + +# Update mieru server with UDP config. +./mita apply config ${PATH_PREFIX}/server_udp.json +if [[ "$?" -ne 0 ]]; then + echo "command 'mita apply config server_udp.json' failed" + exit 1 +fi +echo "mieru server config:" +./mita describe config + +# Start mieru server proxy. +./mita start +if [[ "$?" -ne 0 ]]; then + echo "command 'mita start' failed" + exit 1 +fi + +# Update mieru client with UDP config. +./mieru apply config ${PATH_PREFIX}/client_udp.json +if [[ "$?" -ne 0 ]]; then + echo "command 'mieru apply config client_udp.json' failed" + exit 1 +fi +echo "mieru client config:" +./mieru describe config + +# Start mieru client. +./mieru start +if [[ "$?" -ne 0 ]]; then + echo "command 'mieru start' failed" + exit 1 +fi + +# Start testing. +sleep 2 +run_external_connect_test + +# Stop mieru client. +./mieru stop +if [[ "$?" -ne 0 ]]; then + echo "command 'mieru stop' failed" + exit 1 +fi +sleep 1 + +# Stop mieru server proxy. +./mita stop +if [[ "$?" -ne 0 ]]; then + echo "command 'mita stop' failed" + exit 1 +fi +sleep 1 + +print_mieru_client_log +delete_mieru_client_log +sleep 1 diff --git a/mieru/test/deploy/httptest/Dockerfile b/mieru/test/deploy/httptest/Dockerfile index d7790dfc93..c02a60422b 100644 --- a/mieru/test/deploy/httptest/Dockerfile +++ b/mieru/test/deploy/httptest/Dockerfile @@ -15,7 +15,7 @@ # Assume this file is executed with `docker build -f` from the root dir of mieru project. -FROM ubuntu:22.04 +FROM ubuntu:24.04 WORKDIR /test diff --git a/mieru/test/deploy/proxychain/Dockerfile b/mieru/test/deploy/proxychain/Dockerfile index 275db87a61..78b3f38278 100644 --- a/mieru/test/deploy/proxychain/Dockerfile +++ b/mieru/test/deploy/proxychain/Dockerfile @@ -15,7 +15,7 @@ # Assume this file is executed with `docker build -f` from the root dir of mieru project. -FROM ubuntu:22.04 +FROM ubuntu:24.04 WORKDIR /test diff --git a/mihomo/.github/workflows/build.yml b/mihomo/.github/workflows/build.yml index 42023755e1..9b8e000a12 100644 --- a/mihomo/.github/workflows/build.yml +++ b/mihomo/.github/workflows/build.yml @@ -206,6 +206,10 @@ jobs: sudo apt-get install dpkg if [ "${{matrix.jobs.abi}}" = "1" ]; then ARCH=loongarch64 + elif [ "${{matrix.jobs.goarm}}" = "7" ]; then + ARCH=armhf + elif [ "${{matrix.jobs.goarch}}" = "arm" ]; then + ARCH=armel else ARCH=${{matrix.jobs.goarch}} fi diff --git a/mihomo/adapter/outbound/hysteria2.go b/mihomo/adapter/outbound/hysteria2.go index 0ad7c2147a..b8abf39cc2 100644 --- a/mihomo/adapter/outbound/hysteria2.go +++ b/mihomo/adapter/outbound/hysteria2.go @@ -21,8 +21,8 @@ import ( "github.com/metacubex/sing-quic/hysteria2" + "github.com/metacubex/randv2" M "github.com/sagernet/sing/common/metadata" - "github.com/zhangyunhao116/fastrand" ) func init() { @@ -165,7 +165,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { }) if len(serverAddress) > 0 { clientOptions.ServerAddress = func(ctx context.Context) (*net.UDPAddr, error) { - return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[fastrand.Intn(len(serverAddress))], C.NewDNSPrefer(option.IPVersion)) + return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[randv2.IntN(len(serverAddress))], C.NewDNSPrefer(option.IPVersion)) } if option.HopInterval == 0 { diff --git a/mihomo/adapter/outbound/ssh.go b/mihomo/adapter/outbound/ssh.go index a0efabca4e..8b2776a663 100644 --- a/mihomo/adapter/outbound/ssh.go +++ b/mihomo/adapter/outbound/ssh.go @@ -17,7 +17,7 @@ import ( "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/crypto/ssh" ) @@ -180,10 +180,10 @@ func NewSsh(option SshOption) (*Ssh, error) { } version := "SSH-2.0-OpenSSH_" - if fastrand.Intn(2) == 0 { - version += "7." + strconv.Itoa(fastrand.Intn(10)) + if randv2.IntN(2) == 0 { + version += "7." + strconv.Itoa(randv2.IntN(10)) } else { - version += "8." + strconv.Itoa(fastrand.Intn(9)) + version += "8." + strconv.Itoa(randv2.IntN(9)) } config.ClientVersion = version diff --git a/mihomo/common/convert/util.go b/mihomo/common/convert/util.go index a715b556f5..ab00637493 100644 --- a/mihomo/common/convert/util.go +++ b/mihomo/common/convert/util.go @@ -8,8 +8,8 @@ import ( "github.com/metacubex/mihomo/common/utils" + "github.com/metacubex/randv2" "github.com/metacubex/sing-shadowsocks/shadowimpl" - "github.com/zhangyunhao116/fastrand" ) var hostsSuffix = []string{ @@ -302,11 +302,11 @@ func RandHost() string { prefix += string(buf[6:8]) + "-" prefix += string(buf[len(buf)-8:]) - return prefix + hostsSuffix[fastrand.Intn(hostsLen)] + return prefix + hostsSuffix[randv2.IntN(hostsLen)] } func RandUserAgent() string { - return userAgents[fastrand.Intn(uaLen)] + return userAgents[randv2.IntN(uaLen)] } func SetUserAgent(header http.Header) { diff --git a/mihomo/common/pool/alloc_test.go b/mihomo/common/pool/alloc_test.go index 0ac72ee05d..c76ff26a0c 100644 --- a/mihomo/common/pool/alloc_test.go +++ b/mihomo/common/pool/alloc_test.go @@ -3,8 +3,8 @@ package pool import ( "testing" + "github.com/metacubex/randv2" "github.com/stretchr/testify/assert" - "github.com/zhangyunhao116/fastrand" ) func TestAllocGet(t *testing.T) { @@ -43,6 +43,6 @@ func TestAllocPutThenGet(t *testing.T) { func BenchmarkMSB(b *testing.B) { for i := 0; i < b.N; i++ { - msb(fastrand.Int()) + msb(randv2.Int()) } } diff --git a/mihomo/common/utils/uuid.go b/mihomo/common/utils/uuid.go index f559b471fd..d9a8b78948 100644 --- a/mihomo/common/utils/uuid.go +++ b/mihomo/common/utils/uuid.go @@ -2,19 +2,39 @@ package utils import ( "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) -type fastRandReader struct{} +type unsafeRandReader struct{} -func (r fastRandReader) Read(p []byte) (int, error) { - return fastrand.Read(p) +func (r unsafeRandReader) Read(p []byte) (n int, err error) { + // modify from https://github.com/golang/go/blob/587c3847da81aa7cfc3b3db2677c8586c94df13a/src/runtime/rand.go#L70-L89 + // Inspired by wyrand. + n = len(p) + v := randv2.Uint64() + for len(p) > 0 { + v ^= 0xa0761d6478bd642f + v *= 0xe7037ed1a0b428db + size := 8 + if len(p) < 8 { + size = len(p) + } + for i := 0; i < size; i++ { + p[i] ^= byte(v >> (8 * i)) + } + p = p[size:] + v = v>>32 | v<<32 + } + + return } -var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(fastRandReader{})) +var UnsafeRandReader = unsafeRandReader{} + +var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(UnsafeRandReader)) func NewUUIDV1() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV1() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV1() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } @@ -23,7 +43,7 @@ func NewUUIDV3(ns uuid.UUID, name string) uuid.UUID { } func NewUUIDV4() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV4() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV4() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } @@ -32,12 +52,12 @@ func NewUUIDV5(ns uuid.UUID, name string) uuid.UUID { } func NewUUIDV6() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV6() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV6() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } func NewUUIDV7() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV7() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV7() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } diff --git a/mihomo/component/resolver/host.go b/mihomo/component/resolver/host.go index 53fa5924b8..34da8e9f58 100644 --- a/mihomo/component/resolver/host.go +++ b/mihomo/component/resolver/host.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/resolver/hosts" "github.com/metacubex/mihomo/component/trie" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -125,5 +125,5 @@ func (hv HostValue) RandIP() (netip.Addr, error) { if hv.IsDomain { return netip.Addr{}, errors.New("value type is error") } - return hv.IPs[fastrand.Intn(len(hv.IPs))], nil + return hv.IPs[randv2.IntN(len(hv.IPs))], nil } diff --git a/mihomo/component/resolver/resolver.go b/mihomo/component/resolver/resolver.go index f9b56e476b..07c68824c3 100644 --- a/mihomo/component/resolver/resolver.go +++ b/mihomo/component/resolver/resolver.go @@ -12,8 +12,8 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/trie" + "github.com/metacubex/randv2" "github.com/miekg/dns" - "github.com/zhangyunhao116/fastrand" ) var ( @@ -93,7 +93,7 @@ func ResolveIPv4WithResolver(ctx context.Context, host string, r Resolver) (neti } else if len(ips) == 0 { return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host) } - return ips[fastrand.Intn(len(ips))], nil + return ips[randv2.IntN(len(ips))], nil } // ResolveIPv4 with a host, return ipv4 @@ -149,7 +149,7 @@ func ResolveIPv6WithResolver(ctx context.Context, host string, r Resolver) (neti } else if len(ips) == 0 { return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host) } - return ips[fastrand.Intn(len(ips))], nil + return ips[randv2.IntN(len(ips))], nil } func ResolveIPv6(ctx context.Context, host string) (netip.Addr, error) { @@ -200,9 +200,9 @@ func ResolveIPWithResolver(ctx context.Context, host string, r Resolver) (netip. } ipv4s, ipv6s := SortationAddr(ips) if len(ipv4s) > 0 { - return ipv4s[fastrand.Intn(len(ipv4s))], nil + return ipv4s[randv2.IntN(len(ipv4s))], nil } - return ipv6s[fastrand.Intn(len(ipv6s))], nil + return ipv6s[randv2.IntN(len(ipv6s))], nil } // ResolveIP with a host, return ip and priority return TypeA diff --git a/mihomo/component/tls/reality.go b/mihomo/component/tls/reality.go index 48da3e92ac..ff028257f7 100644 --- a/mihomo/component/tls/reality.go +++ b/mihomo/component/tls/reality.go @@ -22,8 +22,8 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/ntp" + "github.com/metacubex/randv2" utls "github.com/metacubex/utls" - "github.com/zhangyunhao116/fastrand" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" "golang.org/x/net/http2" @@ -138,13 +138,13 @@ func realityClientFallback(uConn net.Conn, serverName string, fingerprint utls.C return } request.Header.Set("User-Agent", fingerprint.Client) - request.AddCookie(&http.Cookie{Name: "padding", Value: strings.Repeat("0", fastrand.Intn(32)+30)}) + request.AddCookie(&http.Cookie{Name: "padding", Value: strings.Repeat("0", randv2.IntN(32)+30)}) response, err := client.Do(request) if err != nil { return } //_, _ = io.Copy(io.Discard, response.Body) - time.Sleep(time.Duration(5+fastrand.Int63n(10)) * time.Second) + time.Sleep(time.Duration(5+randv2.IntN(10)) * time.Second) response.Body.Close() client.CloseIdleConnections() } diff --git a/mihomo/dns/client.go b/mihomo/dns/client.go index 3b4efed105..a6f0a7d492 100644 --- a/mihomo/dns/client.go +++ b/mihomo/dns/client.go @@ -14,8 +14,8 @@ import ( C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" + "github.com/metacubex/randv2" D "github.com/miekg/dns" - "github.com/zhangyunhao116/fastrand" ) type client struct { @@ -65,7 +65,7 @@ func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (*D.Msg, error) } else if len(ips) == 0 { return nil, fmt.Errorf("%w: %s", resolver.ErrIPNotFound, c.host) } - ip = ips[fastrand.Intn(len(ips))] + ip = ips[randv2.IntN(len(ips))] } network := "udp" diff --git a/mihomo/go.mod b/mihomo/go.mod index 08e5b5aa06..bc32a633bd 100644 --- a/mihomo/go.mod +++ b/mihomo/go.mod @@ -20,6 +20,7 @@ require ( github.com/mdlayher/netlink v1.7.2 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 + github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 github.com/metacubex/sing-shadowsocks v0.2.6 github.com/metacubex/sing-shadowsocks2 v0.2.0 @@ -44,7 +45,6 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/wk8/go-ordered-map/v2 v2.1.8 - github.com/zhangyunhao116/fastrand v0.4.0 go.uber.org/automaxprocs v1.5.3 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/crypto v0.23.0 diff --git a/mihomo/go.sum b/mihomo/go.sum index b9f1af1449..6dbbfd77ae 100644 --- a/mihomo/go.sum +++ b/mihomo/go.sum @@ -106,6 +106,8 @@ github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJa github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 h1:hsQ0b2A509b6ubnLtLOcUgZ8vOb+d/667zVEJ1T2fao= github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22/go.mod h1:88wAATpevav4xdy5N8oejQ2cbbI6EcLYEklFeo+qywA= +github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= +github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 h1:7hDHLTmjgtRoAp59STwPQpe5Pinwi4cWex+FB3Ohvco= github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1/go.mod h1:+60H3Cm91RnL9dpVGWDPHt0zTQImO9Vfqt9a4rSambI= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew= @@ -210,8 +212,6 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/ github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zhangyunhao116/fastrand v0.4.0 h1:86QB6Y+GGgLZRFRDCjMmAS28QULwspK9sgL5d1Bx3H4= -github.com/zhangyunhao116/fastrand v0.4.0/go.mod h1:vIyo6EyBhjGKpZv6qVlkPl4JVAklpMM4DSKzbAkMguA= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= diff --git a/mihomo/transport/hysteria/conns/udp/hop.go b/mihomo/transport/hysteria/conns/udp/hop.go index eb0732f02b..0a88874921 100644 --- a/mihomo/transport/hysteria/conns/udp/hop.go +++ b/mihomo/transport/hysteria/conns/udp/hop.go @@ -12,7 +12,7 @@ import ( "github.com/metacubex/mihomo/transport/hysteria/obfs" "github.com/metacubex/mihomo/transport/hysteria/utils" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -86,7 +86,7 @@ func NewObfsUDPHopClientPacketConn(server string, serverPorts string, hopInterva serverAddrs: serverAddrs, hopInterval: hopInterval, obfs: obfs, - addrIndex: fastrand.Intn(len(serverAddrs)), + addrIndex: randv2.IntN(len(serverAddrs)), recvQueue: make(chan *udpPacket, packetQueueSize), closeChan: make(chan struct{}), bufPool: sync.Pool{ @@ -177,7 +177,7 @@ func (c *ObfsUDPHopClientPacketConn) hop(dialer utils.PacketDialer, rAddr net.Ad _ = trySetPacketConnWriteBuffer(c.currentConn, c.writeBufferSize) } go c.recvRoutine(c.currentConn) - c.addrIndex = fastrand.Intn(len(c.serverAddrs)) + c.addrIndex = randv2.IntN(len(c.serverAddrs)) } func (c *ObfsUDPHopClientPacketConn) ReadFrom(b []byte) (int, net.Addr, error) { diff --git a/mihomo/transport/hysteria/conns/wechat/obfs.go b/mihomo/transport/hysteria/conns/wechat/obfs.go index 4266d268ca..c5ec47ee91 100644 --- a/mihomo/transport/hysteria/conns/wechat/obfs.go +++ b/mihomo/transport/hysteria/conns/wechat/obfs.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/hysteria/obfs" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const udpBufferSize = 65535 @@ -31,7 +31,7 @@ func NewObfsWeChatUDPConn(orig net.PacketConn, obfs obfs.Obfuscator) *ObfsWeChat obfs: obfs, readBuf: make([]byte, udpBufferSize), writeBuf: make([]byte, udpBufferSize), - sn: fastrand.Uint32() & 0xFFFF, + sn: randv2.Uint32() & 0xFFFF, } } diff --git a/mihomo/transport/hysteria/core/client.go b/mihomo/transport/hysteria/core/client.go index 97c9225e37..60db8fdf45 100644 --- a/mihomo/transport/hysteria/core/client.go +++ b/mihomo/transport/hysteria/core/client.go @@ -19,7 +19,7 @@ import ( "github.com/lunixbochs/struc" "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -405,7 +405,7 @@ func (c *quicPktConn) WriteTo(p []byte, addr string) error { var errSize *quic.DatagramTooLargeError if errors.As(err, &errSize) { // need to frag - msg.MsgID = uint16(fastrand.Intn(0xFFFF)) + 1 // msgID must be > 0 when fragCount > 1 + msg.MsgID = uint16(randv2.IntN(0xFFFF)) + 1 // msgID must be > 0 when fragCount > 1 fragMsgs := fragUDPMessage(msg, int(errSize.MaxDatagramPayloadSize)) for _, fragMsg := range fragMsgs { msgBuf.Reset() diff --git a/mihomo/transport/hysteria/obfs/xplus.go b/mihomo/transport/hysteria/obfs/xplus.go index 171bf28186..4d1e3f2944 100644 --- a/mihomo/transport/hysteria/obfs/xplus.go +++ b/mihomo/transport/hysteria/obfs/xplus.go @@ -1,9 +1,8 @@ package obfs import ( + "crypto/rand" "crypto/sha256" - - "github.com/zhangyunhao116/fastrand" ) // [salt][obfuscated payload] @@ -35,7 +34,7 @@ func (x *XPlusObfuscator) Deobfuscate(in []byte, out []byte) int { } func (x *XPlusObfuscator) Obfuscate(in []byte, out []byte) int { - _, _ = fastrand.Read(out[:saltLen]) // salt + _, _ = rand.Read(out[:saltLen]) // salt // Obfuscate the payload key := sha256.Sum256(append(x.Key, out[:saltLen]...)) for i, c := range in { diff --git a/mihomo/transport/simple-obfs/http.go b/mihomo/transport/simple-obfs/http.go index a38b1d6971..9c3f8e0029 100644 --- a/mihomo/transport/simple-obfs/http.go +++ b/mihomo/transport/simple-obfs/http.go @@ -2,6 +2,7 @@ package obfs import ( "bytes" + "crypto/rand" "encoding/base64" "fmt" "io" @@ -10,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // HTTPObfs is shadowsocks http simple-obfs implementation @@ -64,12 +65,12 @@ func (ho *HTTPObfs) Read(b []byte) (int, error) { func (ho *HTTPObfs) Write(b []byte) (int, error) { if ho.firstRequest { randBytes := make([]byte, 16) - fastrand.Read(randBytes) + rand.Read(randBytes) req, err := http.NewRequest("GET", fmt.Sprintf("http://%s/", ho.host), bytes.NewBuffer(b[:])) if err != nil { return 0, err } - req.Header.Set("User-Agent", fmt.Sprintf("curl/7.%d.%d", fastrand.Int()%54, fastrand.Int()%2)) + req.Header.Set("User-Agent", fmt.Sprintf("curl/7.%d.%d", randv2.Int()%54, randv2.Int()%2)) req.Header.Set("Upgrade", "websocket") req.Header.Set("Connection", "Upgrade") req.Host = ho.host diff --git a/mihomo/transport/simple-obfs/tls.go b/mihomo/transport/simple-obfs/tls.go index 78317f0a37..a0cbc35038 100644 --- a/mihomo/transport/simple-obfs/tls.go +++ b/mihomo/transport/simple-obfs/tls.go @@ -2,14 +2,13 @@ package obfs import ( "bytes" + "crypto/rand" "encoding/binary" "io" "net" "time" "github.com/metacubex/mihomo/common/pool" - - "github.com/zhangyunhao116/fastrand" ) const ( @@ -127,8 +126,8 @@ func NewTLSObfs(conn net.Conn, server string) net.Conn { func makeClientHelloMsg(data []byte, server string) []byte { random := make([]byte, 28) sessionID := make([]byte, 32) - fastrand.Read(random) - fastrand.Read(sessionID) + rand.Read(random) + rand.Read(sessionID) buf := &bytes.Buffer{} diff --git a/mihomo/transport/ssr/obfs/http_simple.go b/mihomo/transport/ssr/obfs/http_simple.go index 359ca34272..d59b490d46 100644 --- a/mihomo/transport/ssr/obfs/http_simple.go +++ b/mihomo/transport/ssr/obfs/http_simple.go @@ -10,7 +10,7 @@ import ( "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -82,7 +82,7 @@ func (c *httpConn) Write(b []byte) (int, error) { bLength := len(b) headDataLength := bLength if bLength-headLength > 64 { - headDataLength = headLength + fastrand.Intn(65) + headDataLength = headLength + randv2.IntN(65) } headData := b[:headDataLength] b = b[headDataLength:] @@ -100,7 +100,7 @@ func (c *httpConn) Write(b []byte) (int, error) { } } hosts := strings.Split(host, ",") - host = hosts[fastrand.Intn(len(hosts))] + host = hosts[randv2.IntN(len(hosts))] buf := pool.GetBuffer() defer pool.PutBuffer(buf) @@ -119,7 +119,7 @@ func (c *httpConn) Write(b []byte) (int, error) { buf.WriteString(body + "\r\n\r\n") } else { buf.WriteString("User-Agent: ") - buf.WriteString(userAgent[fastrand.Intn(len(userAgent))]) + buf.WriteString(userAgent[randv2.IntN(len(userAgent))]) buf.WriteString("\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\nAccept-Encoding: gzip, deflate\r\n") if c.post { packBoundary(buf) @@ -147,7 +147,7 @@ func packBoundary(buf *bytes.Buffer) { buf.WriteString("Content-Type: multipart/form-data; boundary=") set := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" for i := 0; i < 32; i++ { - buf.WriteByte(set[fastrand.Intn(62)]) + buf.WriteByte(set[randv2.IntN(62)]) } buf.WriteString("\r\n") } diff --git a/mihomo/transport/ssr/obfs/random_head.go b/mihomo/transport/ssr/obfs/random_head.go index 9a2072fe44..a5ad2dabc9 100644 --- a/mihomo/transport/ssr/obfs/random_head.go +++ b/mihomo/transport/ssr/obfs/random_head.go @@ -1,13 +1,14 @@ package obfs import ( + "crypto/rand" "encoding/binary" "hash/crc32" "net" "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -54,10 +55,10 @@ func (c *randomHeadConn) Write(b []byte) (int, error) { c.buf = append(c.buf, b...) if !c.hasSentHeader { c.hasSentHeader = true - dataLength := fastrand.Intn(96) + 4 + dataLength := randv2.IntN(96) + 4 buf := pool.Get(dataLength + 4) defer pool.Put(buf) - fastrand.Read(buf[:dataLength]) + rand.Read(buf[:dataLength]) binary.LittleEndian.PutUint32(buf[dataLength:], 0xffffffff-crc32.ChecksumIEEE(buf[:dataLength])) _, err := c.Conn.Write(buf) return len(b), err diff --git a/mihomo/transport/ssr/obfs/tls1.2_ticket_auth.go b/mihomo/transport/ssr/obfs/tls1.2_ticket_auth.go index d5e3ca8875..d5955edc34 100644 --- a/mihomo/transport/ssr/obfs/tls1.2_ticket_auth.go +++ b/mihomo/transport/ssr/obfs/tls1.2_ticket_auth.go @@ -3,6 +3,7 @@ package obfs import ( "bytes" "crypto/hmac" + "crypto/rand" "encoding/binary" "net" "strings" @@ -11,7 +12,7 @@ import ( "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -26,7 +27,7 @@ type tls12Ticket struct { func newTLS12Ticket(b *Base) Obfs { r := &tls12Ticket{Base: b, authData: &authData{}} - fastrand.Read(r.clientID[:]) + rand.Read(r.clientID[:]) return r } @@ -91,7 +92,7 @@ func (c *tls12TicketConn) Write(b []byte) (int, error) { buf := pool.GetBuffer() defer pool.PutBuffer(buf) for len(b) > 2048 { - size := fastrand.Intn(4096) + 100 + size := randv2.IntN(4096) + 100 if len(b) < size { size = len(b) } @@ -197,7 +198,7 @@ func packSNIData(buf *bytes.Buffer, u string) { } func (c *tls12TicketConn) packTicketBuf(buf *bytes.Buffer, u string) { - length := 16 * (fastrand.Intn(17) + 8) + length := 16 * (randv2.IntN(17) + 8) buf.Write([]byte{0, 0x23}) binary.Write(buf, binary.BigEndian, uint16(length)) tools.AppendRandBytes(buf, length) @@ -222,6 +223,6 @@ func (t *tls12Ticket) getHost() string { host = "" } hosts := strings.Split(host, ",") - host = hosts[fastrand.Intn(len(hosts))] + host = hosts[randv2.IntN(len(hosts))] return host } diff --git a/mihomo/transport/ssr/protocol/auth_aes128_sha1.go b/mihomo/transport/ssr/protocol/auth_aes128_sha1.go index 6ee4160e33..cfd555102c 100644 --- a/mihomo/transport/ssr/protocol/auth_aes128_sha1.go +++ b/mihomo/transport/ssr/protocol/auth_aes128_sha1.go @@ -2,6 +2,7 @@ package protocol import ( "bytes" + "crypto/rand" "encoding/binary" "math" "net" @@ -13,7 +14,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type ( @@ -66,7 +67,7 @@ func (a *authAES128) initUserData() { } if len(a.userKey) == 0 { a.userKey = a.Key - fastrand.Read(a.userID[:]) + rand.Read(a.userID[:]) } } @@ -200,7 +201,7 @@ func (a *authAES128) packData(poolBuf *bytes.Buffer, data []byte, fullDataLength } func trapezoidRandom(max int, d float64) int { - base := fastrand.Float64() + base := randv2.Float64() if d-0 > 1e-6 { a := 1 - d base = (math.Sqrt(a*a+4*d*base) - a) / (2 * d) @@ -221,10 +222,10 @@ func (a *authAES128) getRandDataLengthForPackData(dataLength, fullDataLength int if revLength > -1460 { return trapezoidRandom(revLength+1460, -0.3) } - return fastrand.Intn(32) + return randv2.IntN(32) } if dataLength > 900 { - return fastrand.Intn(revLength) + return randv2.IntN(revLength) } return trapezoidRandom(revLength, -0.3) } @@ -249,7 +250,7 @@ func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { copy(macKey, a.iv) copy(macKey[len(a.iv):], a.Key) - poolBuf.WriteByte(byte(fastrand.Intn(256))) + poolBuf.WriteByte(byte(randv2.IntN(256))) poolBuf.Write(a.hmac(macKey, poolBuf.Bytes())[:6]) poolBuf.Write(a.userID[:]) err := a.authData.putEncryptedData(poolBuf, a.userKey, [2]int{packedAuthDataLength, randDataLength}, a.salt) @@ -265,9 +266,9 @@ func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { func (a *authAES128) getRandDataLengthForPackAuthData(size int) int { if size > 400 { - return fastrand.Intn(512) + return randv2.IntN(512) } - return fastrand.Intn(1024) + return randv2.IntN(1024) } func (a *authAES128) packRandData(poolBuf *bytes.Buffer, size int) { diff --git a/mihomo/transport/ssr/protocol/auth_sha1_v4.go b/mihomo/transport/ssr/protocol/auth_sha1_v4.go index ed1a39f189..1c616c3fc2 100644 --- a/mihomo/transport/ssr/protocol/auth_sha1_v4.go +++ b/mihomo/transport/ssr/protocol/auth_sha1_v4.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -178,7 +178,7 @@ func (a *authSHA1V4) getRandDataLength(size int) int { return 0 } if size > 400 { - return fastrand.Intn(256) + return randv2.IntN(256) } - return fastrand.Intn(512) + return randv2.IntN(512) } diff --git a/mihomo/transport/ssr/protocol/base.go b/mihomo/transport/ssr/protocol/base.go index e26a65875a..798701777e 100644 --- a/mihomo/transport/ssr/protocol/base.go +++ b/mihomo/transport/ssr/protocol/base.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/aes" "crypto/cipher" + "crypto/rand" "encoding/base64" "encoding/binary" "sync" @@ -13,7 +14,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/shadowsocks/core" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type Base struct { @@ -38,8 +39,8 @@ func (a *authData) next() *authData { a.mutex.Lock() defer a.mutex.Unlock() if a.connectionID > 0xff000000 || a.connectionID == 0 { - fastrand.Read(a.clientID[:]) - a.connectionID = fastrand.Uint32() & 0xffffff + rand.Read(a.clientID[:]) + a.connectionID = randv2.Uint32() & 0xffffff } a.connectionID++ copy(r.clientID[:], a.clientID[:]) diff --git a/mihomo/transport/ssr/protocol/protocol.go b/mihomo/transport/ssr/protocol/protocol.go index a04e6bd4d3..ad6bf6ba77 100644 --- a/mihomo/transport/ssr/protocol/protocol.go +++ b/mihomo/transport/ssr/protocol/protocol.go @@ -8,7 +8,7 @@ import ( N "github.com/metacubex/mihomo/common/net" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -71,7 +71,7 @@ func getHeadSize(b []byte, defaultValue int) int { func getDataLength(b []byte) int { bLength := len(b) - dataLength := getHeadSize(b, 30) + fastrand.Intn(32) + dataLength := getHeadSize(b, 30) + randv2.IntN(32) if bLength < dataLength { return bLength } diff --git a/mihomo/transport/tuic/congestion/bbr_sender.go b/mihomo/transport/tuic/congestion/bbr_sender.go index 6cea9355fb..5a8633621f 100644 --- a/mihomo/transport/tuic/congestion/bbr_sender.go +++ b/mihomo/transport/tuic/congestion/bbr_sender.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -716,7 +716,7 @@ func (b *bbrSender) EnterProbeBandwidthMode(now time.Time) { // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is // excluded because in that case increased gain and decreased gain would not // follow each other. - b.cycleCurrentOffset = fastrand.Int() % (GainCycleLength - 1) + b.cycleCurrentOffset = randv2.Int() % (GainCycleLength - 1) if b.cycleCurrentOffset >= 1 { b.cycleCurrentOffset += 1 } diff --git a/mihomo/transport/tuic/congestion_v2/bbr_sender.go b/mihomo/transport/tuic/congestion_v2/bbr_sender.go index 54705978cc..ed29bd7e95 100644 --- a/mihomo/transport/tuic/congestion_v2/bbr_sender.go +++ b/mihomo/transport/tuic/congestion_v2/bbr_sender.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // BbrSender implements BBR congestion control algorithm. BBR aims to estimate @@ -620,7 +620,7 @@ func (b *bbrSender) enterProbeBandwidthMode(now time.Time) { // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is // excluded because in that case increased gain and decreased gain would not // follow each other. - b.cycleCurrentOffset = int(fastrand.Int31n(congestion.PacketsPerConnectionID)) % (gainCycleLength - 1) + b.cycleCurrentOffset = int(randv2.Int32N(congestion.PacketsPerConnectionID)) % (gainCycleLength - 1) if b.cycleCurrentOffset >= 1 { b.cycleCurrentOffset += 1 } diff --git a/mihomo/transport/tuic/v4/client.go b/mihomo/transport/tuic/v4/client.go index 5c9c889cff..62b419b7a5 100644 --- a/mihomo/transport/tuic/v4/client.go +++ b/mihomo/transport/tuic/v4/client.go @@ -20,8 +20,8 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" + "github.com/metacubex/randv2" "github.com/puzpuzpuz/xsync/v3" - "github.com/zhangyunhao116/fastrand" ) type ClientOption struct { @@ -367,7 +367,7 @@ func (t *clientImpl) ListenPacketWithDialer(ctx context.Context, metadata *C.Met pipe1, pipe2 := N.Pipe() var connId uint32 for { - connId = fastrand.Uint32() + connId = randv2.Uint32() _, loaded := t.udpInputMap.LoadOrStore(connId, pipe1) if !loaded { break diff --git a/mihomo/transport/tuic/v5/client.go b/mihomo/transport/tuic/v5/client.go index 89454add19..a3c13d2b29 100644 --- a/mihomo/transport/tuic/v5/client.go +++ b/mihomo/transport/tuic/v5/client.go @@ -20,8 +20,8 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" + "github.com/metacubex/randv2" "github.com/puzpuzpuz/xsync/v3" - "github.com/zhangyunhao116/fastrand" ) type ClientOption struct { @@ -351,7 +351,7 @@ func (t *clientImpl) ListenPacketWithDialer(ctx context.Context, metadata *C.Met pipe1, pipe2 := N.Pipe() var connId uint16 for { - connId = uint16(fastrand.Intn(0xFFFF)) + connId = uint16(randv2.IntN(0xFFFF)) _, loaded := t.udpInputMap.LoadOrStore(connId, pipe1) if !loaded { break diff --git a/mihomo/transport/tuic/v5/packet.go b/mihomo/transport/tuic/v5/packet.go index 5608db81f7..8281a11eff 100644 --- a/mihomo/transport/tuic/v5/packet.go +++ b/mihomo/transport/tuic/v5/packet.go @@ -12,7 +12,7 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type quicStreamPacketConn struct { @@ -157,7 +157,7 @@ func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err erro if err != nil { return } - pktId := uint16(fastrand.Uint32()) + pktId := uint16(randv2.Uint32()) packet := NewPacket(q.connId, pktId, 1, 0, uint16(len(p)), address, p) switch q.udpRelayMode { case common.QUIC: diff --git a/mihomo/transport/vless/vision/padding.go b/mihomo/transport/vless/vision/padding.go index e5f9dc85e2..dd9cb261a3 100644 --- a/mihomo/transport/vless/vision/padding.go +++ b/mihomo/transport/vless/vision/padding.go @@ -8,7 +8,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -25,9 +25,9 @@ func WriteWithPadding(buffer *buf.Buffer, p []byte, command byte, userUUID *uuid if contentLen < 900 { if paddingTLS { //log.Debugln("long padding") - paddingLen = fastrand.Int31n(500) + 900 - contentLen + paddingLen = randv2.Int32N(500) + 900 - contentLen } else { - paddingLen = fastrand.Int31n(256) + paddingLen = randv2.Int32N(256) } } if userUUID != nil { @@ -49,9 +49,9 @@ func ApplyPadding(buffer *buf.Buffer, command byte, userUUID *uuid.UUID, padding if contentLen < 900 { if paddingTLS { //log.Debugln("long padding") - paddingLen = fastrand.Int31n(500) + 900 - contentLen + paddingLen = randv2.Int32N(500) + 900 - contentLen } else { - paddingLen = fastrand.Int31n(256) + paddingLen = randv2.Int32N(256) } } diff --git a/mihomo/transport/vmess/conn.go b/mihomo/transport/vmess/conn.go index 292137abc3..b65a447d33 100644 --- a/mihomo/transport/vmess/conn.go +++ b/mihomo/transport/vmess/conn.go @@ -6,6 +6,7 @@ import ( "crypto/cipher" "crypto/hmac" "crypto/md5" + "crypto/rand" "crypto/sha256" "encoding/binary" "errors" @@ -14,7 +15,7 @@ import ( "net" "time" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/crypto/chacha20poly1305" ) @@ -72,7 +73,7 @@ func (vc *Conn) sendRequest() error { buf.WriteByte(vc.respV) buf.WriteByte(OptionChunkStream) - p := fastrand.Intn(16) + p := randv2.IntN(16) // P Sec Reserve Cmd buf.WriteByte(byte(p<<4) | byte(vc.security)) buf.WriteByte(0) @@ -90,7 +91,7 @@ func (vc *Conn) sendRequest() error { // padding if p > 0 { padding := make([]byte, p) - fastrand.Read(padding) + rand.Read(padding) buf.Write(padding) } @@ -196,7 +197,7 @@ func hashTimestamp(t time.Time) []byte { // newConn return a Conn instance func newConn(conn net.Conn, id *ID, dst *DstAddr, security Security, isAead bool) (*Conn, error) { randBytes := make([]byte, 33) - fastrand.Read(randBytes) + rand.Read(randBytes) reqBodyIV := make([]byte, 16) reqBodyKey := make([]byte, 16) copy(reqBodyIV[:], randBytes[:16]) diff --git a/mihomo/transport/vmess/h2.go b/mihomo/transport/vmess/h2.go index f91c276626..a39ec5d992 100644 --- a/mihomo/transport/vmess/h2.go +++ b/mihomo/transport/vmess/h2.go @@ -7,7 +7,7 @@ import ( "net/http" "net/url" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/net/http2" ) @@ -27,7 +27,7 @@ type H2Config struct { func (hc *h2Conn) establishConn() error { preader, pwriter := io.Pipe() - host := hc.cfg.Hosts[fastrand.Intn(len(hc.cfg.Hosts))] + host := hc.cfg.Hosts[randv2.IntN(len(hc.cfg.Hosts))] path := hc.cfg.Path // TODO: connect use VMess Host instead of H2 Host req := http.Request{ diff --git a/mihomo/transport/vmess/http.go b/mihomo/transport/vmess/http.go index 4a1b93ecd8..3c66fe6b24 100644 --- a/mihomo/transport/vmess/http.go +++ b/mihomo/transport/vmess/http.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/utils" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type httpConn struct { @@ -59,10 +59,10 @@ func (hc *httpConn) Write(b []byte) (int, error) { return -1, errors.New("path is empty") } - path := hc.cfg.Path[fastrand.Intn(len(hc.cfg.Path))] + path := hc.cfg.Path[randv2.IntN(len(hc.cfg.Path))] host := hc.cfg.Host if header := hc.cfg.Headers["Host"]; len(header) != 0 { - host = header[fastrand.Intn(len(header))] + host = header[randv2.IntN(len(header))] } u := fmt.Sprintf("http://%s%s", net.JoinHostPort(host, "80"), path) @@ -71,7 +71,7 @@ func (hc *httpConn) Write(b []byte) (int, error) { return 0, err } for key, list := range hc.cfg.Headers { - req.Header.Set(key, list[fastrand.Intn(len(list))]) + req.Header.Set(key, list[randv2.IntN(len(list))]) } req.ContentLength = int64(len(b)) if err := req.Write(hc.Conn); err != nil { diff --git a/mihomo/transport/vmess/vmess.go b/mihomo/transport/vmess/vmess.go index 7c587c6a0e..22c77ab7d5 100644 --- a/mihomo/transport/vmess/vmess.go +++ b/mihomo/transport/vmess/vmess.go @@ -8,7 +8,7 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // Version of vmess @@ -78,7 +78,7 @@ type Config struct { // StreamConn return a Conn with net.Conn and DstAddr func (c *Client) StreamConn(conn net.Conn, dst *DstAddr) (net.Conn, error) { - r := fastrand.Intn(len(c.user)) + r := randv2.IntN(len(c.user)) return newConn(conn, c.user[r], dst, c.security, c.isAead) } diff --git a/mihomo/transport/vmess/websocket.go b/mihomo/transport/vmess/websocket.go index f69141998a..ca3a57b793 100644 --- a/mihomo/transport/vmess/websocket.go +++ b/mihomo/transport/vmess/websocket.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "context" + "crypto/rand" "crypto/sha1" "crypto/tls" "encoding/base64" @@ -25,7 +26,7 @@ import ( "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type websocketConn struct { @@ -150,7 +151,7 @@ func (wsc *websocketConn) WriteBuffer(buffer *buf.Buffer) error { } if wsc.state.ClientSide() { - maskKey := fastrand.Uint32() + maskKey := randv2.Uint32() binary.LittleEndian.PutUint32(header[1+payloadBitLength:], maskKey) N.MaskWebSocket(maskKey, data) } @@ -398,7 +399,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, const nonceKeySize = 16 // NOTE: bts does not escape. bts := make([]byte, nonceKeySize) - if _, err = fastrand.Read(bts); err != nil { + if _, err = rand.Read(bts); err != nil { return nil, fmt.Errorf("rand read error: %w", err) } secKey = base64.StdEncoding.EncodeToString(bts) diff --git a/openwrt-passwall/luci-app-passwall/Makefile b/openwrt-passwall/luci-app-passwall/Makefile index 1fb70f5b8a..7543450761 100644 --- a/openwrt-passwall/luci-app-passwall/Makefile +++ b/openwrt-passwall/luci-app-passwall/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=4.77-5 +PKG_VERSION:=4.77-6 PKG_RELEASE:= PKG_CONFIG_DEPENDS:= \ diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua index ba7735e6eb..bddc19a630 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua @@ -104,11 +104,13 @@ domain_list.rows = 10 domain_list.wrap = "off" domain_list.validate = function(self, value) local hosts= {} - string.gsub(value, '[^' .. "\r\n" .. ']+', function(w) table.insert(hosts, w) end) + value = value:gsub("^%s+", ""):gsub("%s+$","\n"):gsub("\r\n","\n"):gsub("[ \t]*\n[ \t]*", "\n") + string.gsub(value, "[^\r\n]+", function(w) table.insert(hosts, w) end) for index, host in ipairs(hosts) do local flag = 1 local tmp_host = host - if host:find("regexp:") and host:find("regexp:") == 1 then + if not host:find("#") and host:find("%s") then + elseif host:find("regexp:") and host:find("regexp:") == 1 then flag = 0 elseif host:find("domain:.") and host:find("domain:.") == 1 then tmp_host = host:gsub("domain:", "") @@ -141,10 +143,11 @@ ip_list.rows = 10 ip_list.wrap = "off" ip_list.validate = function(self, value) local ipmasks= {} - string.gsub(value, '[^' .. "\r\n" .. ']+', function(w) table.insert(ipmasks, w) end) + value = value:gsub("^%s+", ""):gsub("%s+$","\n"):gsub("\r\n","\n"):gsub("[ \t]*\n[ \t]*", "\n") + string.gsub(value, "[^\r\n]+", function(w) table.insert(ipmasks, w) end) for index, ipmask in ipairs(ipmasks) do - if ipmask:find("geoip:") and ipmask:find("geoip:") == 1 then - elseif ipmask:find("ext:") and ipmask:find("ext:") == 1 then + if ipmask:find("geoip:") and ipmask:find("geoip:") == 1 and not ipmask:find("%s") then + elseif ipmask:find("ext:") and ipmask:find("ext:") == 1 and not ipmask:find("%s") then elseif ipmask:find("#") and ipmask:find("#") == 1 then else if not (datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask)) then diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index c78de64339..5929f6e527 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -109,11 +109,11 @@ o.default = "leastPing" -- Fallback Node if api.compare_versions(xray_version, ">=", "1.8.10") then local o = s:option(ListValue, option_name("fallback_node"), translate("Fallback Node")) - if api.compare_versions(xray_version, "<", "1.8.12") then + if api.compare_versions(xray_version, ">=", "1.8.12") then + o:depends({ [option_name("protocol")] = "_balancing" }) + else o:depends({ [option_name("balancingStrategy")] = "leastPing" }) end - o:value("",translate("Null")) - o.default = "" local function check_fallback_chain(fb) for k, v in pairs(fallback_table) do if v.fallback == fb then @@ -131,21 +131,34 @@ if api.compare_versions(xray_version, ">=", "1.8.10") then end -- 探测地址 -local o = s:option(Flag, option_name("useCustomProbeUrl"), translate("Use Custome Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) -o:depends({ [option_name("balancingStrategy")] = "leastPing" }) -o:depends({ [option_name("fallback_node")] = "", ["!reverse"] = true }) +local ucpu = s:option(Flag, option_name("useCustomProbeUrl"), translate("Use Custome Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) +ucpu:depends({ [option_name("balancingStrategy")] = "leastPing" }) -local o = s:option(Value, option_name("probeUrl"), translate("Probe URL")) -o:depends({ [option_name("useCustomProbeUrl")] = true }) -o.default = "https://www.google.com/generate_204" -o.description = translate("The URL used to detect the connection status.") +local pu = s:option(Value, option_name("probeUrl"), translate("Probe URL")) +pu:depends({ [option_name("useCustomProbeUrl")] = true }) +pu:value("https://cp.cloudflare.com/", "Cloudflare") +pu:value("https://www.gstatic.com/generate_204", "Gstatic") +pu:value("https://www.google.com/generate_204", "Google") +pu:value("https://www.youtube.com/generate_204", "YouTube") +pu:value("https://connect.rom.miui.com/generate_204", "MIUI (CN)") +pu:value("https://connectivitycheck.platform.hicloud.com/generate_204", "HiCloud (CN)") +pu.default = "https://www.google.com/generate_204" +pu.description = translate("The URL used to detect the connection status.") -- 探测间隔 -local o = s:option(Value, option_name("probeInterval"), translate("Probe Interval")) -o:depends({ [option_name("balancingStrategy")] = "leastPing" }) -o:depends({ [option_name("fallback_node")] = "", ["!reverse"] = true }) -o.default = "1m" -o.description = translate("The interval between initiating probes. Every time this time elapses, a server status check is performed on a server. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are ns, us, ms, s, m, h, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.") +local pi = s:option(Value, option_name("probeInterval"), translate("Probe Interval")) +pi:depends({ [option_name("balancingStrategy")] = "leastPing" }) +pi.default = "1m" +pi.description = translate("The interval between initiating probes. Every time this time elapses, a server status check is performed on a server. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are ns, us, ms, s, m, h, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.") + +if api.compare_versions(xray_version, ">=", "1.8.12") then + ucpu:depends({ [option_name("protocol")] = "_balancing" }) + pi:depends({ [option_name("protocol")] = "_balancing" }) +else + ucpu:depends({ [option_name("balancingStrategy")] = "leastPing" }) + pi:depends({ [option_name("balancingStrategy")] = "leastPing" }) +end + -- [[ 分流模块 ]] if #nodes_table > 0 then diff --git a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua index a0a6f0364b..f80c0d64de 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -947,6 +947,7 @@ function gen_config(var) if w:find("#") == 1 then return end table.insert(domains, w) end) + if #domains == 0 then domains = nil end end local ip = nil if e.ip_list then @@ -955,6 +956,7 @@ function gen_config(var) if w:find("#") == 1 then return end table.insert(ip, w) end) + if #ip == 0 then ip = nil end end local source = nil if e.source then diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index 1fc656b522..4c5b129a29 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -2,17 +2,33 @@ icon: material/alert-decagram --- -#### 1.10.0-alpha.3 +#### 1.10.0-alpha.5 -* Fix auto redirect **1** +* Improve auto-redirect **1** **1**: -Tun inbound with `auto_route` and `auto_redirect` now works as expected on routers without intervention. +nftables support and DNS hijacking has been added. + +Tun inbounds with `auto_route` and `auto_redirect` now works as expected on routers **without intervention**. + +#### 1.10.0-alpha.4 + +* Fix auto-redirect **1** +* Improve auto-route on linux **2** + +**1**: + +Tun inbounds with `auto_route` and `auto_redirect` now works as expected on routers. + +**2**: + +Tun inbounds with `auto_route` and `strict_route` now works as expected on routers and servers, +but the usages of [exclude_interface](/configuration/inbound/tun/#exclude_interface) need to be updated. #### 1.10.0-alpha.2 -* Move auto redirect to Tun **1** +* Move auto-redirect to Tun **1** * Fixes and improvements **1**: @@ -24,7 +40,7 @@ See [Tun](/configuration/inbound/tun/#auto_redirect). #### 1.10.0-alpha.1 * Add tailing comma support in JSON configuration -* Add simple auto redirect for Android **1** +* Add simple auto-redirect for Android **1** * Add BitTorrent sniffer **2** **1**: diff --git a/sing-box/docs/configuration/inbound/tun.md b/sing-box/docs/configuration/inbound/tun.md index 4e475cc448..4bd7106cc4 100644 --- a/sing-box/docs/configuration/inbound/tun.md +++ b/sing-box/docs/configuration/inbound/tun.md @@ -88,8 +88,8 @@ icon: material/new-box "match_domain": [] } }, - ... - // Listen Fields + + ... // Listen Fields } ``` @@ -151,8 +151,9 @@ Enforce strict routing rules when `auto_route` is enabled: * Let unsupported network unreachable * Make ICMP traffic route to tun instead of upstream interfaces +* Route all connections to tun -It prevents address leaks and makes DNS hijacking work on Android. +It prevents IP address leaks and makes DNS hijacking work on Android. *In Windows*: @@ -169,25 +170,16 @@ It may prevent some applications (such as VirtualBox) from working properly in c Only supported on Linux. -Automatically configure iptables to redirect TCP connections. +Automatically configure iptables/nftables to redirect connections. *In Android*: -* Only IPv4 is supported -* Only local connections are forwarded - -To share your VPN connection over hotspot or repeater, use [VPNHotspot](https://github.com/Mygod/VPNHotspot). +Only local connections are forwarded. To share your VPN connection over hotspot or repeater, +use [VPNHotspot](https://github.com/Mygod/VPNHotspot). *In Linux*: -* iptables is required (optional ip6tables) -* `iptables_nat` module is required - -For OpenWrt 23.05, the following additional packages are required: - -```bash -iptables-nft iptables-mod-nat-extra ip6tables-nft -``` +`auto_route` with `auto_redirect` now works as expected on routers **without intervention**. #### inet4_route_address @@ -247,6 +239,10 @@ Conflict with `exclude_interface`. #### exclude_interface +!!! warning "" + + When `strict_route` enabled, return traffic to excluded interfaces will not be automatically excluded, so add them as well (example: `br-lan` and `pppoe-wan`). + Exclude interfaces in route. Conflict with `include_interface`. diff --git a/sing-box/docs/configuration/inbound/tun.zh.md b/sing-box/docs/configuration/inbound/tun.zh.md index 0a916f20bd..ef6543c327 100644 --- a/sing-box/docs/configuration/inbound/tun.zh.md +++ b/sing-box/docs/configuration/inbound/tun.zh.md @@ -151,8 +151,9 @@ tun 接口的 IPv6 前缀。 * 让不支持的网络无法到达 * 使 ICMP 流量路由到 tun 而不是上游接口 +* 将所有连接路由到 tun -它可以防止地址泄漏,并使 DNS 劫持在 Android 上工作。 +它可以防止 IP 地址泄漏,并使 DNS 劫持在 Android 上工作。 *在 Windows 中*: @@ -174,21 +175,11 @@ tun 接口的 IPv6 前缀。 *在 Android 中*: -* 仅支持 IPv4 -* 仅转发本地连接 - -要通过热点或中继共享您的 VPN 连接,请使用 [VPNHotspot](https://github.com/Mygod/VPNHotspot)。 +仅转发本地 IPv4 连接。 要通过热点或中继共享您的 VPN 连接,请使用 [VPNHotspot](https://github.com/Mygod/VPNHotspot)。 *在 Linux 中*: -* 需要 iptables(可选 ip6tables) -* 需要 `iptables_nat` 模块 - -对于 OpenWrt 23.05,需要以下附加软件包: - -```bash -iptables-nft iptables-mod-nat-extra ip6tables-nft -``` +带有 `auto_redirect `的 `auto_route` 现在可以在路由器上按预期工作,**无需干预**。 #### inet4_route_address @@ -244,6 +235,10 @@ TCP/IP 栈。 #### exclude_interface +!!! warning "" + + 当 `strict_route` 启用,到被排除接口的回程流量将不会被自动排除,因此也要添加它们(例:`br-lan` 与 `pppoe-wan`)。 + 排除路由的接口。 与 `include_interface` 冲突。 diff --git a/sing-box/go.mod b/sing-box/go.mod index 1ba6601ad3..daaee0d6b9 100644 --- a/sing-box/go.mod +++ b/sing-box/go.mod @@ -24,6 +24,7 @@ require ( github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 github.com/sagernet/gomobile v0.1.3 github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f + github.com/sagernet/nftables v0.3.0-beta.2 github.com/sagernet/quic-go v0.43.1-beta.1 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 github.com/sagernet/sing v0.5.0-alpha.7 @@ -33,7 +34,7 @@ require ( github.com/sagernet/sing-shadowsocks v0.2.6 github.com/sagernet/sing-shadowsocks2 v0.2.0 github.com/sagernet/sing-shadowtls v0.1.4 - github.com/sagernet/sing-tun v0.4.0-beta.2 + github.com/sagernet/sing-tun v0.4.0-beta.4 github.com/sagernet/sing-vmess v0.1.8 github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 github.com/sagernet/tfo-go v0.0.0-20231209031829-7b5343ac1dc6 @@ -66,6 +67,7 @@ require ( github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/google/btree v1.1.2 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -73,7 +75,8 @@ require ( github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/libdns/libdns v0.2.2 // indirect - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/mdlayher/netlink v1.7.2 // indirect + github.com/mdlayher/socket v0.4.1 // indirect github.com/onsi/ginkgo/v2 v2.9.7 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -82,7 +85,7 @@ require ( github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect - github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect + github.com/vishvananda/netns v0.0.4 // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.17.0 // indirect @@ -91,7 +94,6 @@ require ( golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/sing-box/go.sum b/sing-box/go.sum index 46acbc87fd..ba83799dde 100644 --- a/sing-box/go.sum +++ b/sing-box/go.sum @@ -40,6 +40,7 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a h1:fEBsGL/sjAuJrgah5XqmmYsTLzJp/TO9Lhy39gkverk= github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= @@ -57,9 +58,6 @@ github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6K github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/libdns/alidns v1.0.3 h1:LFHuGnbseq5+HCeGa1aW8awyX/4M2psB9962fdD2+yQ= github.com/libdns/alidns v1.0.3/go.mod h1:e18uAG6GanfRhcJj6/tps2rCMzQJaYVcGKT+ELjdjGE= github.com/libdns/cloudflare v0.1.1 h1:FVPfWwP8zZCqj268LZjmkDleXlHPlFU9KC4OJ3yn054= @@ -69,12 +67,14 @@ github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s= github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= +github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30= github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE= github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= @@ -101,6 +101,8 @@ github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f h1:NkhuupzH5ch7b/Y github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f/go.mod h1:KXmw+ouSJNOsuRpg4wgwwCQuunrGz4yoAqQjsLjc6N0= github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba h1:EY5AS7CCtfmARNv2zXUOrsEMPFDGYxaw65JzA2p51Vk= github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= +github.com/sagernet/nftables v0.3.0-beta.2 h1:yKqMl4Dpb6nKxAmlE6fXjJRlLO2c1f2wyNFBg4hBr8w= +github.com/sagernet/nftables v0.3.0-beta.2/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= github.com/sagernet/quic-go v0.43.1-beta.1 h1:alizUjpvWYcz08dBCQsULOd+1xu0o7UtlyYf6SLbRNg= github.com/sagernet/quic-go v0.43.1-beta.1/go.mod h1:BkrQYeop7Jx3hN3TW8/76CXcdhYiNPyYEBL/BVJ1ifc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= @@ -120,8 +122,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wK github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= -github.com/sagernet/sing-tun v0.4.0-beta.2 h1:Czf5w73shqnbbLFDUyrFkGnm5B2EuYZB5D8bMP2d0lk= -github.com/sagernet/sing-tun v0.4.0-beta.2/go.mod h1:DxLIyhjWU/HwGYoX0vNGg2c5QgTQIakphU1MuERR5tQ= +github.com/sagernet/sing-tun v0.4.0-beta.4 h1:94OB9fQupn0qBPvlDzKRAq1lSIPHAvVBaw69/jEZfgQ= +github.com/sagernet/sing-tun v0.4.0-beta.4/go.mod h1:DxLIyhjWU/HwGYoX0vNGg2c5QgTQIakphU1MuERR5tQ= github.com/sagernet/sing-vmess v0.1.8 h1:XVWad1RpTy9b5tPxdm5MCU8cGfrTGdR8qCq6HV2aCNc= github.com/sagernet/sing-vmess v0.1.8/go.mod h1:vhx32UNzTDUkNwOyIjcZQohre1CaytquC5mPplId8uA= github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ= @@ -146,8 +148,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA= github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= -github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= -github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= +github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= @@ -176,7 +178,6 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -205,9 +206,8 @@ google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/sing-box/inbound/tun.go b/sing-box/inbound/tun.go index 530cb71ec6..2275fa068c 100644 --- a/sing-box/inbound/tun.go +++ b/sing-box/inbound/tun.go @@ -208,7 +208,7 @@ func (t *Tun) Start() error { } if t.autoRedirect != nil { monitor.Start("initiating auto redirect") - err = t.autoRedirect.Start(t.tunOptions.Name) + err = t.autoRedirect.Start() monitor.Finish() if err != nil { return E.Cause(err, "auto redirect") diff --git a/sing-box/inbound/tun_auto_redirect.go b/sing-box/inbound/tun_auto_redirect.go index ed75d1abf8..8ebc04d299 100644 --- a/sing-box/inbound/tun_auto_redirect.go +++ b/sing-box/inbound/tun_auto_redirect.go @@ -1,3 +1,5 @@ +//go:build linux + package inbound import ( @@ -6,51 +8,35 @@ import ( "net/netip" "os" "os/exec" - "strings" + "strconv" + "github.com/sagernet/nftables" "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/common/redir" C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-tun" - "github.com/sagernet/sing/common" - "github.com/sagernet/sing/common/control" E "github.com/sagernet/sing/common/exceptions" - F "github.com/sagernet/sing/common/format" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" - "github.com/sagernet/sing/common/x/list" - "golang.org/x/exp/slices" -) - -const ( - tableNameOutput = "sing-box-output" - tableNameForward = "sing-box-forward" - tableNamePreRouteing = "sing-box-prerouting" + "golang.org/x/sys/unix" ) type tunAutoRedirect struct { myInboundAdapter - tunOptions *tun.Options - interfaceFinder control.InterfaceFinder - networkMonitor tun.NetworkUpdateMonitor - networkCallback *list.Element[tun.NetworkUpdateCallback] - enableIPv4 bool - enableIPv6 bool - localAddresses4 []netip.Prefix - localAddresses6 []netip.Prefix - iptablesPath string - ip6tablesPath string - androidSu bool - suPath string + tunOptions *tun.Options + enableIPv4 bool + enableIPv6 bool + iptablesPath string + ip6tablesPath string + useNfTables bool + androidSu bool + suPath string } func newAutoRedirect(t *Tun) (*tunAutoRedirect, error) { - if !C.IsLinux { - return nil, E.New("only supported on linux") - } - server := &tunAutoRedirect{ + s := &tunAutoRedirect{ myInboundAdapter: myInboundAdapter{ protocol: C.TypeRedirect, network: []string{N.NetworkTCP}, @@ -58,161 +44,109 @@ func newAutoRedirect(t *Tun) (*tunAutoRedirect, error) { router: t.router, logger: t.logger, tag: t.tag, + listenOptions: option.ListenOptions{ + InboundOptions: t.inboundOptions, + }, }, - tunOptions: &t.tunOptions, - interfaceFinder: t.router.InterfaceFinder(), - networkMonitor: t.router.NetworkMonitor(), + tunOptions: &t.tunOptions, } - server.connHandler = server - if len(t.tunOptions.Inet4Address) > 0 { - server.enableIPv4 = true - if C.IsAndroid { - server.iptablesPath = "/system/bin/iptables" - userId := os.Getuid() - if userId != 0 { - var ( - suPath string - err error - ) - if t.platformInterface != nil { - suPath, err = exec.LookPath("/bin/su") - } else { - suPath, err = exec.LookPath("su") - } - if err == nil { - server.androidSu = true - server.suPath = suPath - } else { - return nil, E.Extend(E.Cause(err, "root permission is required for auto redirect"), os.Getenv("PATH")) - } + s.connHandler = s + + if C.IsAndroid { + s.enableIPv4 = true + s.iptablesPath = "/system/bin/iptables" + userId := os.Getuid() + if userId != 0 { + var ( + suPath string + err error + ) + if t.platformInterface != nil { + suPath, err = exec.LookPath("/bin/su") + } else { + suPath, err = exec.LookPath("su") } - } else { - iptablesPath, err := exec.LookPath("iptables") - if err != nil { - return nil, E.Cause(err, "iptables is required") + if err == nil { + s.androidSu = true + s.suPath = suPath + } else { + return nil, E.Extend(E.Cause(err, "root permission is required for auto redirect"), os.Getenv("PATH")) } - server.iptablesPath = iptablesPath } - } - if !C.IsAndroid && len(t.tunOptions.Inet6Address) > 0 { - err := server.initializeIP6Tables() - if err != nil { - t.logger.Debug("device has no ip6tables nat support: ", err) + } else { + err := s.initializeNfTables() + if err != nil && err != os.ErrInvalid { + t.logger.Debug("device has no nftables support: ", err) + } + if len(t.tunOptions.Inet4Address) > 0 { + s.enableIPv4 = true + if !s.useNfTables { + s.iptablesPath, err = exec.LookPath("iptables") + if err != nil { + return nil, E.Cause(err, "iptables is required") + } + } + } + if len(t.tunOptions.Inet6Address) > 0 { + s.enableIPv6 = true + if !s.useNfTables { + s.ip6tablesPath, err = exec.LookPath("ip6tables") + if err != nil { + if !s.enableIPv4 { + return nil, E.Cause(err, "ip6tables is required") + } else { + s.enableIPv6 = false + t.logger.Error("device has no ip6tables nat support: ", err) + } + } + } } } var listenAddr netip.Addr if C.IsAndroid { listenAddr = netip.AddrFrom4([4]byte{127, 0, 0, 1}) - } else if server.enableIPv6 { + } else if s.enableIPv6 { listenAddr = netip.IPv6Unspecified() } else { listenAddr = netip.IPv4Unspecified() } - server.listenOptions.Listen = option.NewListenAddress(listenAddr) - return server, nil + s.listenOptions.Listen = option.NewListenAddress(listenAddr) + return s, nil } -func (t *tunAutoRedirect) initializeIP6Tables() error { - ip6tablesPath, err := exec.LookPath("ip6tables") +func (t *tunAutoRedirect) initializeNfTables() error { + disabled, err := strconv.ParseBool(os.Getenv("AUTO_REDIRECT_DISABLE_NFTABLES")) + if err == nil && disabled { + return os.ErrInvalid + } + nft, err := nftables.New() if err != nil { return err } - /*output, err := exec.Command(ip6tablesPath, "-t nat -L", tableNameOutput).CombinedOutput() - switch exitErr := err.(type) { - case nil: - case *exec.ExitError: - if exitErr.ExitCode() != 1 { - return E.Extend(err, string(output)) - } - default: + defer nft.CloseLasting() + _, err = nft.ListTablesOfFamily(unix.AF_INET) + if err != nil { return err - }*/ - t.ip6tablesPath = ip6tablesPath - t.enableIPv6 = true + } + t.useNfTables = true return nil } -func (t *tunAutoRedirect) Start(tunName string) error { +func (t *tunAutoRedirect) Start() error { err := t.myInboundAdapter.Start() if err != nil { return E.Cause(err, "start redirect server") } - if t.enableIPv4 { - t.cleanupIPTables(t.iptablesPath) - } - if t.enableIPv6 { - t.cleanupIPTables(t.ip6tablesPath) - } - err = t.updateInterfaces(false) + t.cleanupTables() + err = t.setupTables() if err != nil { return err } - if t.enableIPv4 { - err = t.setupIPTables(t.iptablesPath, tunName) - if err != nil { - return err - } - } - if t.enableIPv6 { - err = t.setupIPTables(t.ip6tablesPath, tunName) - if err != nil { - return err - } - } - t.networkCallback = t.networkMonitor.RegisterCallback(func() { - rErr := t.updateInterfaces(true) - if rErr != nil { - t.logger.Error("recreate prerouting rules: ", rErr) - } - }) - return nil -} - -func (t *tunAutoRedirect) updateInterfaces(recreate bool) error { - addresses := common.Filter(common.FlatMap(common.Filter(t.interfaceFinder.Interfaces(), func(it control.Interface) bool { - return it.Name != t.tunOptions.Name - }), func(it control.Interface) []netip.Prefix { - return it.Addresses - }), func(it netip.Prefix) bool { - address := it.Addr() - return !(address.IsLoopback() || address.IsLinkLocalUnicast()) - }) - oldLocalAddresses4 := t.localAddresses4 - oldLocalAddresses6 := t.localAddresses6 - localAddresses4 := common.Filter(addresses, func(it netip.Prefix) bool { return it.Addr().Is4() }) - localAddresses6 := common.Filter(addresses, func(it netip.Prefix) bool { return it.Addr().Is6() }) - t.localAddresses4 = localAddresses4 - t.localAddresses6 = localAddresses6 - if !recreate || t.androidSu { - return nil - } - if t.enableIPv4 { - if !slices.Equal(localAddresses4, oldLocalAddresses4) { - err := t.setupIPTablesPreRouting(t.iptablesPath, true) - if err != nil { - return err - } - } - } - if t.enableIPv6 { - if !slices.Equal(localAddresses6, oldLocalAddresses6) { - err := t.setupIPTablesPreRouting(t.ip6tablesPath, true) - if err != nil { - return err - } - } - } return nil } func (t *tunAutoRedirect) Close() error { - t.networkMonitor.UnregisterCallback(t.networkCallback) - if t.enableIPv4 { - t.cleanupIPTables(t.iptablesPath) - } - if t.enableIPv6 { - t.cleanupIPTables(t.ip6tablesPath) - } + t.cleanupTables() return t.myInboundAdapter.Close() } @@ -225,44 +159,21 @@ func (t *tunAutoRedirect) NewConnection(ctx context.Context, conn net.Conn, meta return t.newConnection(ctx, conn, metadata) } -func (t *tunAutoRedirect) setupIPTables(iptablesPath string, tunName string) error { - // OUTPUT - err := t.runShell(iptablesPath, "-t nat -N", tableNameOutput) - if err != nil { - return err +func (t *tunAutoRedirect) setupTables() error { + var setupTables func(int) error + if t.useNfTables { + setupTables = t.setupNfTables + } else { + setupTables = t.setupIPTables } - err = t.runShell(iptablesPath, "-t nat -A", tableNameOutput, - "-p tcp -o", tunName, - "-j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err + if t.enableIPv4 { + err := setupTables(unix.AF_INET) + if err != nil { + return err + } } - err = t.runShell(iptablesPath, "-t nat -I OUTPUT -j", tableNameOutput) - if err != nil { - return err - } - if !t.androidSu { - // FORWARD - err = t.runShell(iptablesPath, "-N", tableNameForward) - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-A", tableNameForward, - "-i", tunName, "-j", "ACCEPT") - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-A", tableNameForward, - "-o", tunName, "-j", "ACCEPT") - if err != nil { - return err - } - err = t.runShell(iptablesPath, "-I FORWARD -j", tableNameForward) - if err != nil { - return err - } - // PREROUTING - err = t.setupIPTablesPreRouting(iptablesPath, false) + if t.enableIPv6 { + err := setupTables(unix.AF_INET6) if err != nil { return err } @@ -270,134 +181,17 @@ func (t *tunAutoRedirect) setupIPTables(iptablesPath string, tunName string) err return nil } -func (t *tunAutoRedirect) setupIPTablesPreRouting(iptablesPath string, recreate bool) error { - var err error - if !recreate { - err = t.runShell(iptablesPath, "-t nat -N", tableNamePreRouteing) +func (t *tunAutoRedirect) cleanupTables() { + var cleanupTables func(int) + if t.useNfTables { + cleanupTables = t.cleanupNfTables } else { - err = t.runShell(iptablesPath, "-t nat -F", tableNamePreRouteing) + cleanupTables = t.cleanupIPTables } - if err != nil { - return err + if t.enableIPv4 { + cleanupTables(unix.AF_INET) } - var ( - routeAddress []netip.Prefix - routeExcludeAddress []netip.Prefix - ) - if t.iptablesPath == iptablesPath { - routeAddress = t.tunOptions.Inet4RouteAddress - routeExcludeAddress = t.tunOptions.Inet4RouteExcludeAddress - } else { - routeAddress = t.tunOptions.Inet6RouteAddress - routeExcludeAddress = t.tunOptions.Inet6RouteExcludeAddress - } - if len(routeAddress) > 0 && (len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0) { - return E.New("`*_route_address` is conflict with `include_interface` or `include_uid`") - } - if len(routeExcludeAddress) > 0 { - for _, address := range routeExcludeAddress { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-d", address.String(), "-j RETURN") - if err != nil { - return err - } - } - } - if len(t.tunOptions.ExcludeInterface) > 0 { - for _, name := range t.tunOptions.ExcludeInterface { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-i", name, "-j RETURN") - if err != nil { - return err - } - } - } - if len(t.tunOptions.ExcludeUID) > 0 { - for _, uid := range t.tunOptions.ExcludeUID { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-m owner --uid-owner", uid, "-j RETURN") - if err != nil { - return err - } - } - } - var addresses []netip.Prefix - if t.iptablesPath == iptablesPath { - addresses = t.localAddresses4 - } else { - addresses = t.localAddresses6 - } - for _, address := range addresses { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, "-d", address.String(), "-j RETURN") - if err != nil { - return err - } - } - if len(routeAddress) > 0 { - for _, address := range routeAddress { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-d", address.String(), "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - } else if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { - for _, name := range t.tunOptions.IncludeInterface { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-i", name, "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - for _, uidRange := range t.tunOptions.IncludeUID { - for i := uidRange.Start; i <= uidRange.End; i++ { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-m owner --uid-owner", i, "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - } - } else { - err = t.runShell(iptablesPath, "-t nat -A", tableNamePreRouteing, - "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) - if err != nil { - return err - } - } - err = t.runShell(iptablesPath, "-t nat -I PREROUTING -j", tableNamePreRouteing) - if err != nil { - return err - } - return nil -} - -func (t *tunAutoRedirect) cleanupIPTables(iptablesPath string) { - _ = t.runShell(iptablesPath, "-t nat -D OUTPUT -j", tableNameOutput) - _ = t.runShell(iptablesPath, "-t nat -F", tableNameOutput) - _ = t.runShell(iptablesPath, "-t nat -X", tableNameOutput) - if !t.androidSu { - _ = t.runShell(iptablesPath, "-D FORWARD -j", tableNameForward) - _ = t.runShell(iptablesPath, "-F", tableNameForward) - _ = t.runShell(iptablesPath, "-X", tableNameForward) - _ = t.runShell(iptablesPath, "-t nat -D PREROUTING -j", tableNamePreRouteing) - _ = t.runShell(iptablesPath, "-t nat -F", tableNamePreRouteing) - _ = t.runShell(iptablesPath, "-t nat -X", tableNamePreRouteing) + if t.enableIPv6 { + cleanupTables(unix.AF_INET6) } } - -func (t *tunAutoRedirect) runShell(commands ...any) error { - commandStr := strings.Join(F.MapToString(commands), " ") - var command *exec.Cmd - if t.androidSu { - command = exec.Command(t.suPath, "-c", commandStr) - } else { - commandArray := strings.Split(commandStr, " ") - command = exec.Command(commandArray[0], commandArray[1:]...) - } - combinedOutput, err := command.CombinedOutput() - if err != nil { - return E.Extend(err, F.ToString(commandStr, ": ", string(combinedOutput))) - } - return nil -} diff --git a/sing-box/inbound/tun_auto_redirect_iptables.go b/sing-box/inbound/tun_auto_redirect_iptables.go new file mode 100644 index 0000000000..b1aa7dff13 --- /dev/null +++ b/sing-box/inbound/tun_auto_redirect_iptables.go @@ -0,0 +1,235 @@ +//go:build linux + +package inbound + +import ( + "net/netip" + "os/exec" + "strings" + + E "github.com/sagernet/sing/common/exceptions" + F "github.com/sagernet/sing/common/format" + M "github.com/sagernet/sing/common/metadata" + + "golang.org/x/sys/unix" +) + +const ( + iptablesTableNameOutput = "sing-box-output" + iptablesTableNameForward = "sing-box-forward" + iptablesTableNamePreRouteing = "sing-box-prerouting" +) + +func (t *tunAutoRedirect) iptablesPathForFamily(family int) string { + if family == unix.AF_INET { + return t.iptablesPath + } else { + return t.ip6tablesPath + } +} + +func (t *tunAutoRedirect) setupIPTables(family int) error { + iptablesPath := t.iptablesPathForFamily(family) + // OUTPUT + err := t.runShell(iptablesPath, "-t nat -N", iptablesTableNameOutput) + if err != nil { + return err + } + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNameOutput, + "-p tcp -o", t.tunOptions.Name, + "-j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) + if err != nil { + return err + } + err = t.runShell(iptablesPath, "-t nat -I OUTPUT -j", iptablesTableNameOutput) + if err != nil { + return err + } + if !t.androidSu { + // FORWARD + err = t.runShell(iptablesPath, "-N", iptablesTableNameForward) + if err != nil { + return err + } + err = t.runShell(iptablesPath, "-A", iptablesTableNameForward, + "-i", t.tunOptions.Name, "-j", "ACCEPT") + if err != nil { + return err + } + err = t.runShell(iptablesPath, "-A", iptablesTableNameForward, + "-o", t.tunOptions.Name, "-j", "ACCEPT") + if err != nil { + return err + } + err = t.runShell(iptablesPath, "-I FORWARD -j", iptablesTableNameForward) + if err != nil { + return err + } + // PREROUTING + err = t.setupIPTablesPreRouting(family) + if err != nil { + return err + } + } + return nil +} + +func (t *tunAutoRedirect) setupIPTablesPreRouting(family int) error { + iptablesPath := t.iptablesPathForFamily(family) + err := t.runShell(iptablesPath, "-t nat -N", iptablesTableNamePreRouteing) + if err != nil { + return err + } + var ( + routeAddress []netip.Prefix + routeExcludeAddress []netip.Prefix + ) + if family == unix.AF_INET { + routeAddress = t.tunOptions.Inet4RouteAddress + routeExcludeAddress = t.tunOptions.Inet4RouteExcludeAddress + } else { + routeAddress = t.tunOptions.Inet6RouteAddress + routeExcludeAddress = t.tunOptions.Inet6RouteExcludeAddress + } + if len(routeAddress) > 0 && (len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0) { + return E.New("`*_route_address` is conflict with `include_interface` or `include_uid`") + } + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-i", t.tunOptions.Name, "-j RETURN") + if err != nil { + return err + } + for _, address := range routeExcludeAddress { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-d", address.String(), "-j RETURN") + if err != nil { + return err + } + } + for _, name := range t.tunOptions.ExcludeInterface { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-i", name, "-j RETURN") + if err != nil { + return err + } + } + for _, uid := range t.tunOptions.ExcludeUID { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-m owner --uid-owner", uid, "-j RETURN") + if err != nil { + return err + } + } + var dnsServerAddress netip.Addr + if family == unix.AF_INET { + dnsServerAddress = t.tunOptions.Inet4Address[0].Addr().Next() + } else { + dnsServerAddress = t.tunOptions.Inet6Address[0].Addr().Next() + } + if len(routeAddress) > 0 { + for _, address := range routeAddress { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-d", address.String(), "-p udp --dport 53 -j DNAT --to", dnsServerAddress) + if err != nil { + return err + } + } + } else if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { + for _, name := range t.tunOptions.IncludeInterface { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-i", name, "-p udp --dport 53 -j DNAT --to", dnsServerAddress) + if err != nil { + return err + } + } + for _, uidRange := range t.tunOptions.IncludeUID { + for uid := uidRange.Start; uid <= uidRange.End; uid++ { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-m owner --uid-owner", uid, "-p udp --dport 53 -j DNAT --to", dnsServerAddress) + if err != nil { + return err + } + } + } + } else { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-p udp --dport 53 -j DNAT --to", dnsServerAddress) + if err != nil { + return err + } + } + + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, "-m addrtype --dst-type LOCAL -j RETURN") + if err != nil { + return err + } + + if len(routeAddress) > 0 { + for _, address := range routeAddress { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-d", address.String(), "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) + if err != nil { + return err + } + } + } else if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { + for _, name := range t.tunOptions.IncludeInterface { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-i", name, "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) + if err != nil { + return err + } + } + for _, uidRange := range t.tunOptions.IncludeUID { + for uid := uidRange.Start; uid <= uidRange.End; uid++ { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-m owner --uid-owner", uid, "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) + if err != nil { + return err + } + } + } + } else { + err = t.runShell(iptablesPath, "-t nat -A", iptablesTableNamePreRouteing, + "-p tcp -j REDIRECT --to-ports", M.AddrPortFromNet(t.tcpListener.Addr()).Port()) + if err != nil { + return err + } + } + err = t.runShell(iptablesPath, "-t nat -I PREROUTING -j", iptablesTableNamePreRouteing) + if err != nil { + return err + } + return nil +} + +func (t *tunAutoRedirect) cleanupIPTables(family int) { + iptablesPath := t.iptablesPathForFamily(family) + _ = t.runShell(iptablesPath, "-t nat -D OUTPUT -j", iptablesTableNameOutput) + _ = t.runShell(iptablesPath, "-t nat -F", iptablesTableNameOutput) + _ = t.runShell(iptablesPath, "-t nat -X", iptablesTableNameOutput) + if !t.androidSu { + _ = t.runShell(iptablesPath, "-D FORWARD -j", iptablesTableNameForward) + _ = t.runShell(iptablesPath, "-F", iptablesTableNameForward) + _ = t.runShell(iptablesPath, "-X", iptablesTableNameForward) + _ = t.runShell(iptablesPath, "-t nat -D PREROUTING -j", iptablesTableNamePreRouteing) + _ = t.runShell(iptablesPath, "-t nat -F", iptablesTableNamePreRouteing) + _ = t.runShell(iptablesPath, "-t nat -X", iptablesTableNamePreRouteing) + } +} + +func (t *tunAutoRedirect) runShell(commands ...any) error { + commandStr := strings.Join(F.MapToString(commands), " ") + var command *exec.Cmd + if t.androidSu { + command = exec.Command(t.suPath, "-c", commandStr) + } else { + commandArray := strings.Split(commandStr, " ") + command = exec.Command(commandArray[0], commandArray[1:]...) + } + combinedOutput, err := command.CombinedOutput() + if err != nil { + return E.Extend(err, F.ToString(commandStr, ": ", string(combinedOutput))) + } + return nil +} diff --git a/sing-box/inbound/tun_auto_redirect_nftables.go b/sing-box/inbound/tun_auto_redirect_nftables.go new file mode 100644 index 0000000000..ed84adf4c6 --- /dev/null +++ b/sing-box/inbound/tun_auto_redirect_nftables.go @@ -0,0 +1,231 @@ +//go:build linux + +package inbound + +import ( + "net/netip" + + "github.com/sagernet/nftables" + "github.com/sagernet/nftables/binaryutil" + "github.com/sagernet/nftables/expr" + F "github.com/sagernet/sing/common/format" + M "github.com/sagernet/sing/common/metadata" + + "golang.org/x/sys/unix" +) + +const ( + nftablesTableName = "sing-box" + nftablesChainOutput = "output" + nftablesChainForward = "forward" + nftablesChainPreRouting = "prerouting" +) + +func nftablesFamily(family int) nftables.TableFamily { + switch family { + case unix.AF_INET: + return nftables.TableFamilyIPv4 + case unix.AF_INET6: + return nftables.TableFamilyIPv6 + default: + panic(F.ToString("unknown family ", family)) + } +} + +func (t *tunAutoRedirect) setupNfTables(family int) error { + nft, err := nftables.New() + if err != nil { + return err + } + defer nft.CloseLasting() + table := nft.AddTable(&nftables.Table{ + Name: nftablesTableName, + Family: nftablesFamily(family), + }) + chainOutput := nft.AddChain(&nftables.Chain{ + Name: nftablesChainOutput, + Table: table, + Hooknum: nftables.ChainHookOutput, + Priority: nftables.ChainPriorityMangle, + Type: nftables.ChainTypeNAT, + }) + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainOutput, + Exprs: nftablesRuleIfName(expr.MetaKeyOIFNAME, t.tunOptions.Name, nftablesRuleRedirectToPorts(M.AddrPortFromNet(t.tcpListener.Addr()).Port())...), + }) + chainForward := nft.AddChain(&nftables.Chain{ + Name: nftablesChainForward, + Table: table, + Hooknum: nftables.ChainHookForward, + Priority: nftables.ChainPriorityMangle, + }) + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainForward, + Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, t.tunOptions.Name, &expr.Verdict{ + Kind: expr.VerdictAccept, + }), + }) + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainForward, + Exprs: nftablesRuleIfName(expr.MetaKeyOIFNAME, t.tunOptions.Name, &expr.Verdict{ + Kind: expr.VerdictAccept, + }), + }) + t.setupNfTablesPreRouting(nft, table) + return nft.Flush() +} + +func (t *tunAutoRedirect) setupNfTablesPreRouting(nft *nftables.Conn, table *nftables.Table) { + chainPreRouting := nft.AddChain(&nftables.Chain{ + Name: nftablesChainPreRouting, + Table: table, + Hooknum: nftables.ChainHookPrerouting, + Priority: nftables.ChainPriorityMangle, + Type: nftables.ChainTypeNAT, + }) + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, t.tunOptions.Name, &expr.Verdict{ + Kind: expr.VerdictReturn, + }), + }) + var ( + routeAddress []netip.Prefix + routeExcludeAddress []netip.Prefix + ) + if table.Family == nftables.TableFamilyIPv4 { + routeAddress = t.tunOptions.Inet4RouteAddress + routeExcludeAddress = t.tunOptions.Inet4RouteExcludeAddress + } else { + routeAddress = t.tunOptions.Inet6RouteAddress + routeExcludeAddress = t.tunOptions.Inet6RouteExcludeAddress + } + for _, address := range routeExcludeAddress { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleDestinationAddress(address, &expr.Verdict{ + Kind: expr.VerdictReturn, + }), + }) + } + for _, name := range t.tunOptions.ExcludeInterface { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, name, &expr.Verdict{ + Kind: expr.VerdictReturn, + }), + }) + } + for _, uidRange := range t.tunOptions.ExcludeUID { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleMetaUInt32Range(expr.MetaKeySKUID, uidRange, &expr.Verdict{ + Kind: expr.VerdictReturn, + }), + }) + } + + var routeExprs []expr.Any + if len(routeAddress) > 0 { + for _, address := range routeAddress { + routeExprs = append(routeExprs, nftablesRuleDestinationAddress(address)...) + } + } + redirectPort := M.AddrPortFromNet(t.tcpListener.Addr()).Port() + var dnsServerAddress netip.Addr + if table.Family == nftables.TableFamilyIPv4 { + dnsServerAddress = t.tunOptions.Inet4Address[0].Addr().Next() + } else { + dnsServerAddress = t.tunOptions.Inet6Address[0].Addr().Next() + } + + if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { + for _, name := range t.tunOptions.IncludeInterface { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, name, append(routeExprs, nftablesRuleHijackDNS(table.Family, dnsServerAddress)...)...), + }) + } + for _, uidRange := range t.tunOptions.IncludeUID { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleMetaUInt32Range(expr.MetaKeySKUID, uidRange, append(routeExprs, nftablesRuleHijackDNS(table.Family, dnsServerAddress)...)...), + }) + } + } else { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: append(routeExprs, nftablesRuleHijackDNS(table.Family, dnsServerAddress)...), + }) + } + + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: []expr.Any{ + &expr.Fib{ + Register: 1, + FlagDADDR: true, + ResultADDRTYPE: true, + }, + &expr.Cmp{ + Op: expr.CmpOpEq, + Register: 1, + Data: binaryutil.NativeEndian.PutUint32(unix.RTN_LOCAL), + }, + &expr.Verdict{ + Kind: expr.VerdictReturn, + }, + }, + }) + + if len(t.tunOptions.IncludeInterface) > 0 || len(t.tunOptions.IncludeUID) > 0 { + for _, name := range t.tunOptions.IncludeInterface { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleIfName(expr.MetaKeyIIFNAME, name, append(routeExprs, nftablesRuleRedirectToPorts(redirectPort)...)...), + }) + } + for _, uidRange := range t.tunOptions.IncludeUID { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: nftablesRuleMetaUInt32Range(expr.MetaKeySKUID, uidRange, append(routeExprs, nftablesRuleRedirectToPorts(redirectPort)...)...), + }) + } + } else { + nft.AddRule(&nftables.Rule{ + Table: table, + Chain: chainPreRouting, + Exprs: append(routeExprs, nftablesRuleRedirectToPorts(redirectPort)...), + }) + } +} + +func (t *tunAutoRedirect) cleanupNfTables(family int) { + conn, err := nftables.New() + if err != nil { + return + } + defer conn.CloseLasting() + conn.FlushTable(&nftables.Table{ + Name: nftablesTableName, + Family: nftablesFamily(family), + }) + conn.DelTable(&nftables.Table{ + Name: nftablesTableName, + Family: nftablesFamily(family), + }) + _ = conn.Flush() +} diff --git a/sing-box/inbound/tun_auto_redirect_nftables_expr.go b/sing-box/inbound/tun_auto_redirect_nftables_expr.go new file mode 100644 index 0000000000..27c0309f38 --- /dev/null +++ b/sing-box/inbound/tun_auto_redirect_nftables_expr.go @@ -0,0 +1,153 @@ +//go:build linux + +package inbound + +import ( + "net" + "net/netip" + + "github.com/sagernet/nftables" + "github.com/sagernet/nftables/binaryutil" + "github.com/sagernet/nftables/expr" + "github.com/sagernet/sing/common/ranges" + + "golang.org/x/sys/unix" +) + +func nftablesIfname(n string) []byte { + b := make([]byte, 16) + copy(b, n+"\x00") + return b +} + +func nftablesRuleIfName(key expr.MetaKey, value string, exprs ...expr.Any) []expr.Any { + newExprs := []expr.Any{ + &expr.Meta{Key: key, Register: 1}, + &expr.Cmp{ + Op: expr.CmpOpEq, + Register: 1, + Data: nftablesIfname(value), + }, + } + newExprs = append(newExprs, exprs...) + return newExprs +} + +func nftablesRuleMetaUInt32Range(key expr.MetaKey, uidRange ranges.Range[uint32], exprs ...expr.Any) []expr.Any { + newExprs := []expr.Any{ + &expr.Meta{Key: key, Register: 1}, + &expr.Range{ + Op: expr.CmpOpEq, + Register: 1, + FromData: binaryutil.BigEndian.PutUint32(uidRange.Start), + ToData: binaryutil.BigEndian.PutUint32(uidRange.End), + }, + } + newExprs = append(newExprs, exprs...) + return newExprs +} + +func nftablesRuleDestinationAddress(address netip.Prefix, exprs ...expr.Any) []expr.Any { + var newExprs []expr.Any + if address.Addr().Is4() { + newExprs = append(newExprs, &expr.Payload{ + OperationType: expr.PayloadLoad, + DestRegister: 1, + SourceRegister: 0, + Base: expr.PayloadBaseNetworkHeader, + Offset: 16, + Len: 4, + }, &expr.Bitwise{ + SourceRegister: 1, + DestRegister: 1, + Len: 4, + Xor: make([]byte, 4), + Mask: net.CIDRMask(address.Bits(), 32), + }) + } else { + newExprs = append(newExprs, &expr.Payload{ + OperationType: expr.PayloadLoad, + DestRegister: 1, + SourceRegister: 0, + Base: expr.PayloadBaseNetworkHeader, + Offset: 24, + Len: 16, + }, &expr.Bitwise{ + SourceRegister: 1, + DestRegister: 1, + Len: 16, + Xor: make([]byte, 16), + Mask: net.CIDRMask(address.Bits(), 128), + }) + } + newExprs = append(newExprs, &expr.Cmp{ + Op: expr.CmpOpEq, + Register: 1, + Data: address.Masked().Addr().AsSlice(), + }) + newExprs = append(newExprs, exprs...) + return newExprs +} + +func nftablesRuleHijackDNS(family nftables.TableFamily, dnsServerAddress netip.Addr) []expr.Any { + return []expr.Any{ + &expr.Meta{ + Key: expr.MetaKeyL4PROTO, + Register: 1, + }, + &expr.Cmp{ + Op: expr.CmpOpEq, + Register: 1, + Data: []byte{unix.IPPROTO_UDP}, + }, + &expr.Payload{ + OperationType: expr.PayloadLoad, + DestRegister: 1, + SourceRegister: 0, + Base: expr.PayloadBaseTransportHeader, + Offset: 2, + Len: 2, + }, &expr.Cmp{ + Op: expr.CmpOpEq, + Register: 1, + Data: binaryutil.BigEndian.PutUint16(53), + }, &expr.Immediate{ + Register: 1, + Data: dnsServerAddress.AsSlice(), + }, &expr.NAT{ + Type: expr.NATTypeDestNAT, + Family: uint32(family), + RegAddrMin: 1, + }, + } +} + +const ( + NF_NAT_RANGE_MAP_IPS = 1 << iota + NF_NAT_RANGE_PROTO_SPECIFIED + NF_NAT_RANGE_PROTO_RANDOM + NF_NAT_RANGE_PERSISTENT + NF_NAT_RANGE_PROTO_RANDOM_FULLY + NF_NAT_RANGE_PROTO_OFFSET +) + +func nftablesRuleRedirectToPorts(redirectPort uint16) []expr.Any { + return []expr.Any{ + &expr.Meta{ + Key: expr.MetaKeyL4PROTO, + Register: 1, + }, + &expr.Cmp{ + Op: expr.CmpOpEq, + Register: 1, + Data: []byte{unix.IPPROTO_TCP}, + }, + &expr.Immediate{ + Register: 1, + Data: binaryutil.BigEndian.PutUint16(redirectPort), + }, &expr.Redir{ + RegisterProtoMin: 1, + Flags: NF_NAT_RANGE_PROTO_SPECIFIED, + }, + } +} diff --git a/sing-box/inbound/tun_auto_redirect_stub.go b/sing-box/inbound/tun_auto_redirect_stub.go new file mode 100644 index 0000000000..4bfdafa3b2 --- /dev/null +++ b/sing-box/inbound/tun_auto_redirect_stub.go @@ -0,0 +1,23 @@ +//go:build !linux + +package inbound + +import ( + "os" + + E "github.com/sagernet/sing/common/exceptions" +) + +type tunAutoRedirect struct{} + +func newAutoRedirect(t *Tun) (*tunAutoRedirect, error) { + return nil, E.New("only supported on linux") +} + +func (t *tunAutoRedirect) Start() error { + return os.ErrInvalid +} + +func (t *tunAutoRedirect) Close() error { + return os.ErrInvalid +} diff --git a/small/luci-app-passwall/Makefile b/small/luci-app-passwall/Makefile index 1fb70f5b8a..7543450761 100644 --- a/small/luci-app-passwall/Makefile +++ b/small/luci-app-passwall/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=4.77-5 +PKG_VERSION:=4.77-6 PKG_RELEASE:= PKG_CONFIG_DEPENDS:= \ diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua index ba7735e6eb..bddc19a630 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua @@ -104,11 +104,13 @@ domain_list.rows = 10 domain_list.wrap = "off" domain_list.validate = function(self, value) local hosts= {} - string.gsub(value, '[^' .. "\r\n" .. ']+', function(w) table.insert(hosts, w) end) + value = value:gsub("^%s+", ""):gsub("%s+$","\n"):gsub("\r\n","\n"):gsub("[ \t]*\n[ \t]*", "\n") + string.gsub(value, "[^\r\n]+", function(w) table.insert(hosts, w) end) for index, host in ipairs(hosts) do local flag = 1 local tmp_host = host - if host:find("regexp:") and host:find("regexp:") == 1 then + if not host:find("#") and host:find("%s") then + elseif host:find("regexp:") and host:find("regexp:") == 1 then flag = 0 elseif host:find("domain:.") and host:find("domain:.") == 1 then tmp_host = host:gsub("domain:", "") @@ -141,10 +143,11 @@ ip_list.rows = 10 ip_list.wrap = "off" ip_list.validate = function(self, value) local ipmasks= {} - string.gsub(value, '[^' .. "\r\n" .. ']+', function(w) table.insert(ipmasks, w) end) + value = value:gsub("^%s+", ""):gsub("%s+$","\n"):gsub("\r\n","\n"):gsub("[ \t]*\n[ \t]*", "\n") + string.gsub(value, "[^\r\n]+", function(w) table.insert(ipmasks, w) end) for index, ipmask in ipairs(ipmasks) do - if ipmask:find("geoip:") and ipmask:find("geoip:") == 1 then - elseif ipmask:find("ext:") and ipmask:find("ext:") == 1 then + if ipmask:find("geoip:") and ipmask:find("geoip:") == 1 and not ipmask:find("%s") then + elseif ipmask:find("ext:") and ipmask:find("ext:") == 1 and not ipmask:find("%s") then elseif ipmask:find("#") and ipmask:find("#") == 1 then else if not (datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask)) then diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index c78de64339..5929f6e527 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -109,11 +109,11 @@ o.default = "leastPing" -- Fallback Node if api.compare_versions(xray_version, ">=", "1.8.10") then local o = s:option(ListValue, option_name("fallback_node"), translate("Fallback Node")) - if api.compare_versions(xray_version, "<", "1.8.12") then + if api.compare_versions(xray_version, ">=", "1.8.12") then + o:depends({ [option_name("protocol")] = "_balancing" }) + else o:depends({ [option_name("balancingStrategy")] = "leastPing" }) end - o:value("",translate("Null")) - o.default = "" local function check_fallback_chain(fb) for k, v in pairs(fallback_table) do if v.fallback == fb then @@ -131,21 +131,34 @@ if api.compare_versions(xray_version, ">=", "1.8.10") then end -- 探测地址 -local o = s:option(Flag, option_name("useCustomProbeUrl"), translate("Use Custome Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) -o:depends({ [option_name("balancingStrategy")] = "leastPing" }) -o:depends({ [option_name("fallback_node")] = "", ["!reverse"] = true }) +local ucpu = s:option(Flag, option_name("useCustomProbeUrl"), translate("Use Custome Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) +ucpu:depends({ [option_name("balancingStrategy")] = "leastPing" }) -local o = s:option(Value, option_name("probeUrl"), translate("Probe URL")) -o:depends({ [option_name("useCustomProbeUrl")] = true }) -o.default = "https://www.google.com/generate_204" -o.description = translate("The URL used to detect the connection status.") +local pu = s:option(Value, option_name("probeUrl"), translate("Probe URL")) +pu:depends({ [option_name("useCustomProbeUrl")] = true }) +pu:value("https://cp.cloudflare.com/", "Cloudflare") +pu:value("https://www.gstatic.com/generate_204", "Gstatic") +pu:value("https://www.google.com/generate_204", "Google") +pu:value("https://www.youtube.com/generate_204", "YouTube") +pu:value("https://connect.rom.miui.com/generate_204", "MIUI (CN)") +pu:value("https://connectivitycheck.platform.hicloud.com/generate_204", "HiCloud (CN)") +pu.default = "https://www.google.com/generate_204" +pu.description = translate("The URL used to detect the connection status.") -- 探测间隔 -local o = s:option(Value, option_name("probeInterval"), translate("Probe Interval")) -o:depends({ [option_name("balancingStrategy")] = "leastPing" }) -o:depends({ [option_name("fallback_node")] = "", ["!reverse"] = true }) -o.default = "1m" -o.description = translate("The interval between initiating probes. Every time this time elapses, a server status check is performed on a server. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are ns, us, ms, s, m, h, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.") +local pi = s:option(Value, option_name("probeInterval"), translate("Probe Interval")) +pi:depends({ [option_name("balancingStrategy")] = "leastPing" }) +pi.default = "1m" +pi.description = translate("The interval between initiating probes. Every time this time elapses, a server status check is performed on a server. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are ns, us, ms, s, m, h, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.") + +if api.compare_versions(xray_version, ">=", "1.8.12") then + ucpu:depends({ [option_name("protocol")] = "_balancing" }) + pi:depends({ [option_name("protocol")] = "_balancing" }) +else + ucpu:depends({ [option_name("balancingStrategy")] = "leastPing" }) + pi:depends({ [option_name("balancingStrategy")] = "leastPing" }) +end + -- [[ 分流模块 ]] if #nodes_table > 0 then diff --git a/small/luci-app-passwall/luasrc/passwall/util_xray.lua b/small/luci-app-passwall/luasrc/passwall/util_xray.lua index a0a6f0364b..f80c0d64de 100644 --- a/small/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/small/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -947,6 +947,7 @@ function gen_config(var) if w:find("#") == 1 then return end table.insert(domains, w) end) + if #domains == 0 then domains = nil end end local ip = nil if e.ip_list then @@ -955,6 +956,7 @@ function gen_config(var) if w:find("#") == 1 then return end table.insert(ip, w) end) + if #ip == 0 then ip = nil end end local source = nil if e.source then diff --git a/v2rayu/Podfile b/v2rayu/Podfile index a181d5fdeb..c5dec19cb7 100644 --- a/v2rayu/Podfile +++ b/v2rayu/Podfile @@ -8,14 +8,13 @@ target 'V2rayU' do use_frameworks! # Pods for V2rayU - pod 'AppCenter' - pod 'FirebaseAnalytics' + pod 'FirebaseAnalytics', '~> 10.24.0' pod 'FirebaseCrashlytics' pod 'Alamofire' pod 'SwiftyJSON' # master branch pod 'Preferences', :git => 'https://github.com/sindresorhus/Preferences.git' - pod 'Sparkle' + pod 'Sparkle' ,'~> 2.0' pod 'QRCoder' pod 'MASShortcut' pod 'Swifter' diff --git a/v2rayu/Podfile.lock b/v2rayu/Podfile.lock index 363c3e1832..acb7c775e9 100644 --- a/v2rayu/Podfile.lock +++ b/v2rayu/Podfile.lock @@ -1,15 +1,7 @@ PODS: - Alamofire (4.8.2) - - AppCenter (5.0.2): - - AppCenter/Analytics (= 5.0.2) - - AppCenter/Crashes (= 5.0.2) - - AppCenter/Analytics (5.0.2): - - AppCenter/Core - - AppCenter/Core (5.0.2) - - AppCenter/Crashes (5.0.2): - - AppCenter/Core - - FirebaseAnalytics (10.24.0): - - FirebaseAnalytics/AdIdSupport (= 10.24.0) + - FirebaseAnalytics (10.27.0): + - FirebaseAnalytics/AdIdSupport (= 10.27.0) - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) @@ -17,10 +9,10 @@ PODS: - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - nanopb (< 2.30911.0, >= 2.30908.0) - - FirebaseAnalytics/AdIdSupport (10.24.0): + - FirebaseAnalytics/AdIdSupport (10.27.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - - GoogleAppMeasurement (= 10.24.0) + - GoogleAppMeasurement (= 10.27.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) @@ -43,7 +35,7 @@ PODS: - GoogleUtilities/Environment (~> 7.8) - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesObjC (~> 2.1) - - FirebaseInstallations (10.24.0): + - FirebaseInstallations (10.27.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) @@ -57,21 +49,21 @@ PODS: - GoogleUtilities/Environment (~> 7.10) - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesSwift (~> 2.1) - - GoogleAppMeasurement (10.24.0): - - GoogleAppMeasurement/AdIdSupport (= 10.24.0) + - GoogleAppMeasurement (10.27.0): + - GoogleAppMeasurement/AdIdSupport (= 10.27.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - nanopb (< 2.30911.0, >= 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (10.24.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 10.24.0) + - GoogleAppMeasurement/AdIdSupport (10.27.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.27.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) - "GoogleUtilities/NSData+zlib (~> 7.11)" - nanopb (< 2.30911.0, >= 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (10.24.0): + - GoogleAppMeasurement/WithoutAdIdSupport (10.27.0): - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - GoogleUtilities/MethodSwizzler (~> 7.11) - GoogleUtilities/Network (~> 7.11) @@ -120,20 +112,19 @@ PODS: - PromisesSwift (2.4.0): - PromisesObjC (= 2.4.0) - QRCoder (1.1.0) - - Sparkle (1.24.0) + - Sparkle (2.6.2) - Swifter (1.4.7) - SwiftyJSON (5.0.0) - Yams (5.0.6) DEPENDENCIES: - Alamofire - - AppCenter - - FirebaseAnalytics + - FirebaseAnalytics (> 10.24.0) - FirebaseCrashlytics - MASShortcut - Preferences (from `https://github.com/sindresorhus/Preferences.git`) - QRCoder - - Sparkle + - Sparkle (~> 2.0) - Swifter - SwiftyJSON - Yams @@ -141,7 +132,6 @@ DEPENDENCIES: SPEC REPOS: https://github.com/CocoaPods/Specs.git: - Alamofire - - AppCenter - FirebaseAnalytics - FirebaseCore - FirebaseCoreExtension @@ -174,16 +164,15 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Alamofire: ae5c501addb7afdbb13687d7f2f722c78734c2d3 - AppCenter: 355ba776b273d30147c3ac385c558bec60a7d4b1 - FirebaseAnalytics: b5efc493eb0f40ec560b04a472e3e1a15d39ca13 + FirebaseAnalytics: f9211b719db260cc91aebee8bb539cb367d0dfd1 FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894 FirebaseCoreExtension: af5fd85e817ea9d19f9a2659a376cf9cf99f03c0 FirebaseCoreInternal: bcb5acffd4ea05e12a783ecf835f2210ce3dc6af FirebaseCrashlytics: af38ea4adfa606f6e63fcc22091b61e7938fcf66 - FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e + FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 FirebaseRemoteConfigInterop: 6c349a466490aeace3ce9c091c86be1730711634 FirebaseSessions: 2651b464e241c93fd44112f995d5ab663c970487 - GoogleAppMeasurement: f3abf08495ef2cba7829f15318c373b8d9226491 + GoogleAppMeasurement: f65fc137531af9ad647f1c0a42f3b6a4d3a98049 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152 MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa @@ -192,11 +181,11 @@ SPEC CHECKSUMS: PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 QRCoder: cbd2bee531cc86d286df7942334cfed94c803ae4 - Sparkle: 270cd27377bf04e9c128af06e3a22d0f572d6ee3 + Sparkle: a62c7dc4f410ced73beb2169cf1d3cc3f028a295 Swifter: 2327ef5d872c638aebab79646ce494af508b0c8f SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 Yams: e10dae147f517ed57ecae37c5e8681bdf8fcab65 -PODFILE CHECKSUM: f64539699369b56c80c40cf2ac40609ff3753e2c +PODFILE CHECKSUM: 071aabe40b11d56fb50a9b83f6ed47079838bdee COCOAPODS: 1.15.2 diff --git a/v2rayu/V2rayU.xcodeproj/project.pbxproj b/v2rayu/V2rayU.xcodeproj/project.pbxproj index f793950a6e..912cac3482 100755 --- a/v2rayu/V2rayU.xcodeproj/project.pbxproj +++ b/v2rayu/V2rayU.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 6618372E23E9BF74000F7410 /* ToastWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6618372C23E9BF73000F7410 /* ToastWindow.xib */; }; 66193A8623EE45B200289B6A /* PreferenceRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66193A8523EE45B200289B6A /* PreferenceRouting.swift */; }; 66193A8923EE46BC00289B6A /* PreferenceRouting.xib in Resources */ = {isa = PBXBuildFile; fileRef = 66193A8723EE46BC00289B6A /* PreferenceRouting.xib */; }; + 6633A43F2C0A120000C54CA5 /* Sparkle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6633A43E2C0A120000C54CA5 /* Sparkle.swift */; }; 663F040625ED4B2C00687600 /* V2rayLaunch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663F040525ED4B2C00687600 /* V2rayLaunch.swift */; }; 664EB375216C9A5E00B6AE0D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664EB374216C9A5E00B6AE0D /* AppDelegate.swift */; }; 664EB377216C9A5F00B6AE0D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 664EB376216C9A5F00B6AE0D /* Assets.xcassets */; }; @@ -119,6 +120,7 @@ 6625848D2AB745E700DFDC1E /* sign.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = sign.sh; sourceTree = ""; }; 6625848E2AB746D500DFDC1E /* appdmg.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = appdmg.sh; sourceTree = ""; }; 662F0ACE2AB720C700884C17 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = ../en.lproj/PreferenceGeneral.strings; sourceTree = ""; }; + 6633A43E2C0A120000C54CA5 /* Sparkle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sparkle.swift; sourceTree = ""; }; 663F040525ED4B2C00687600 /* V2rayLaunch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = V2rayLaunch.swift; sourceTree = ""; }; 664666A021CBD6C60094F0B7 /* libPods-V2rayUTool.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libPods-V2rayUTool.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 664B95DD217062A500DBC941 /* Alamofire */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Alamofire; path = Pods/Alamofire; sourceTree = ""; }; @@ -282,6 +284,7 @@ 6D6DF7F662C35646734A352E /* install.sh */, 6D6DF11F0983AFCBEF1E347B /* Uri.swift */, 6D6DF79424C83391C205CB9C /* Share.swift */, + 6633A43E2C0A120000C54CA5 /* Sparkle.swift */, ); path = V2rayU; sourceTree = ""; @@ -561,6 +564,7 @@ 6D6DF807BE591BE396221EF3 /* PreferenceAdvance.swift in Sources */, 6D6DFC1D9432F2A60D2156E2 /* PreferenceDns.swift in Sources */, 6D6DF670FFB063EE2360776C /* Uri.swift in Sources */, + 6633A43F2C0A120000C54CA5 /* Sparkle.swift in Sources */, 6D6DF41FA8F7C7B020AC4115 /* Share.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -841,7 +845,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4.1.0; + CURRENT_PROJECT_VERSION = 4.2.0; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; ENABLE_ONLY_ACTIVE_RESOURCES = YES; @@ -852,7 +856,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 4.1.0; + MARKETING_VERSION = 4.2.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = net.yanue.V2rayU; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -875,7 +879,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4.1.0; + CURRENT_PROJECT_VERSION = 4.2.0; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; ENABLE_ONLY_ACTIVE_RESOURCES = YES; @@ -886,7 +890,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 4.1.0; + MARKETING_VERSION = 4.2.0; ONLY_ACTIVE_ARCH = NO; PRODUCT_BUNDLE_IDENTIFIER = net.yanue.V2rayU; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/v2rayu/V2rayU/AppDelegate.swift b/v2rayu/V2rayU/AppDelegate.swift index ac9025b01b..3fd7875645 100644 --- a/v2rayu/V2rayU/AppDelegate.swift +++ b/v2rayu/V2rayU/AppDelegate.swift @@ -8,9 +8,6 @@ import Cocoa import ServiceManagement -import AppCenter -import AppCenterAnalytics -import AppCenterCrashes import MASShortcut import Preferences import Sparkle @@ -18,7 +15,7 @@ import FirebaseCore let launcherAppIdentifier = "net.yanue.V2rayU.Launcher" let appVersion = getAppVersion() -let V2rayUpdater = SUUpdater() +let V2rayUpdater = V2rayUpdaterController() let NOTIFY_TOGGLE_RUNNING_SHORTCUT = Notification.Name(rawValue: "NOTIFY_TOGGLE_RUNNING_SHORTCUT") let NOTIFY_SWITCH_PROXY_MODE_SHORTCUT = Notification.Name(rawValue: "NOTIFY_SWITCH_PROXY_MODE_SHORTCUT") @@ -53,11 +50,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { print("applicationDidFinishLaunching") FirebaseApp.configure() - // appcenter init - AppCenter.start(withAppSecret: "d52dd1a1-7a3a-4143-b159-a30434f87713", services:[ - Analytics.self, - Crashes.self - ]) // default settings self.checkDefault() @@ -100,9 +92,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { // auto check updates if UserDefaults.getBool(forKey: .autoCheckVersion) { - checkV2rayUVersion() - // check version - V2rayUpdater.checkForUpdatesInBackground() + // 初始化更新控制器 + V2rayUpdater.checkForUpdates() } } @@ -149,9 +140,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { } // auto check updates if UserDefaults.getBool(forKey: .autoCheckVersion) { - checkV2rayUVersion() // check version - V2rayUpdater.checkForUpdatesInBackground() + V2rayUpdater.checkForUpdates() } // auto update subscribe servers if UserDefaults.getBool(forKey: .autoUpdateServers) { diff --git a/v2rayu/V2rayU/Info.plist b/v2rayu/V2rayU/Info.plist index 7401a53141..f943f715fa 100644 --- a/v2rayu/V2rayU/Info.plist +++ b/v2rayu/V2rayU/Info.plist @@ -53,7 +53,7 @@ NSPrincipalClass NSApplication SUFeedURL - https://api.appcenter.ms/v0.1/public/sparkle/apps/d52dd1a1-7a3a-4143-b159-a30434f87713 + https://v2rayu-61f76.web.app/appcast.xml SUPublicEDKey PW8pDnr5VZkmC93gZjUDlHI8gkJSspPoDU3DdhsMkps diff --git a/v2rayu/V2rayU/MainMenu.swift b/v2rayu/V2rayU/MainMenu.swift index fcf2025cfe..d0aa946e36 100644 --- a/v2rayu/V2rayU/MainMenu.swift +++ b/v2rayu/V2rayU/MainMenu.swift @@ -283,9 +283,8 @@ class MenuController: NSObject, NSMenuDelegate { } @IBAction func checkForUpdate(_ sender: NSMenuItem) { - checkV2rayUVersion() // need set SUFeedURL into plist - V2rayUpdater.checkForUpdates(sender) + V2rayUpdater.checkForUpdates() } @IBAction func generateQrcode(_ sender: NSMenuItem) { diff --git a/v2rayu/V2rayU/Preference/PreferenceGeneral.swift b/v2rayu/V2rayU/Preference/PreferenceGeneral.swift index d5fabf19e3..0bf18ae3bb 100644 --- a/v2rayu/V2rayU/Preference/PreferenceGeneral.swift +++ b/v2rayu/V2rayU/Preference/PreferenceGeneral.swift @@ -69,7 +69,7 @@ final class PreferenceGeneralViewController: NSViewController, PreferencePane { @IBAction func checkVersion(_ sender: NSButton) { // need set SUFeedURL into plist - V2rayUpdater.checkForUpdates(sender) + V2rayUpdater.checkForUpdates() } } diff --git a/v2rayu/V2rayU/Sparkle.swift b/v2rayu/V2rayU/Sparkle.swift new file mode 100644 index 0000000000..7827bb86c0 --- /dev/null +++ b/v2rayu/V2rayU/Sparkle.swift @@ -0,0 +1,88 @@ +// +// Sparkle.swift +// V2rayU +// +// Created by yanue on 2024/5/31. +// Copyright © 2024 yanue. All rights reserved. +// + +import Foundation +import Sparkle + +class V2rayUpdaterController: NSObject, SPUUpdaterDelegate { + private let primaryFeedURL = "https://v2rayu-61f76.web.app/appcast.xml" + private let backupFeedURL = "https://raw.githubusercontent.com/yanue/V2rayU/master/appcast.xml" + private var usePrimaryFeedURL = true + private var updater: SPUUpdater? + + override init() { + super.init() + let userDriver = SPUStandardUserDriver(hostBundle: Bundle.main, delegate: nil) + updater = SPUUpdater(hostBundle: Bundle.main, applicationBundle: Bundle.main, userDriver: userDriver, delegate: self) + } + + func checkForUpdates() { + // check version by github release + checkV2rayUVersion() + // check by sparkle + fetchAppcast(from: primaryFeedURL) { success in + // 主线程 + DispatchQueue.main.async { + if success { + self.usePrimaryFeedURL = true + self.startUpdateProcess() + } else { + self.fetchAppcast(from: self.backupFeedURL) { success in + // 主线程 + DispatchQueue.main.async { + if success { + self.usePrimaryFeedURL = false + self.startUpdateProcess() + } else { + print("Failed to fetch appcast from both primary and backup URLs.") + } + } + } + } + } + } + } + + private func fetchAppcast(from urlString: String, completion: @escaping (Bool) -> Void) { + guard let url = URL(string: urlString) else { + completion(false) + return + } + + let task = URLSession.shared.dataTask(with: url) { data, response, error in + if let error = error { + print("Failed to fetch appcast: \(error)") + completion(false) + return + } + guard data != nil else { + print("No data received from appcast URL") + completion(false) + return + } + // 解析 appcast 数据,确保它是有效的 + completion(true) + } + task.resume() + } + + private func startUpdateProcess() { + guard let updater = updater else { return } + do { + try updater.start() + updater.checkForUpdates() + } catch { + print("Failed to start updater or check for updates: \(error)") + } + } + + // SPUUpdaterDelegate 方法实现 + func feedURLString(for updater: SPUUpdater) -> String? { + return usePrimaryFeedURL ? primaryFeedURL : backupFeedURL + } +} diff --git a/xray-core/transport/internet/udp/dispatcher.go b/xray-core/transport/internet/udp/dispatcher.go index c29d4b1305..9685213bef 100644 --- a/xray-core/transport/internet/udp/dispatcher.go +++ b/xray-core/transport/internet/udp/dispatcher.go @@ -45,7 +45,7 @@ func (v *Dispatcher) RemoveRay() { v.Lock() defer v.Unlock() if v.conn != nil { - common.Close(v.conn.link.Reader) + common.Interrupt(v.conn.link.Reader) common.Close(v.conn.link.Writer) v.conn = nil } diff --git a/yass/.github/workflows/compiler.yml b/yass/.github/workflows/compiler.yml index effe72a704..a711034433 100644 --- a/yass/.github/workflows/compiler.yml +++ b/yass/.github/workflows/compiler.yml @@ -166,8 +166,8 @@ jobs: uses: actions/cache@v4 with: path: | - third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64 - key: ${{ runner.os }}-mingw64-third_party-llvm-20231128-ucrt + third_party/llvm-mingw-20240518-ucrt-ubuntu-20.04-x86_64 + key: ${{ runner.os }}-mingw64-third_party-llvm-20240518-ucrt - name: Cache mingw64 curl id: curl-cache uses: actions/cache@v4 @@ -203,8 +203,8 @@ jobs: if: ${{ steps.mingw-cache.outputs.cache-hit != 'true' }} run: | pushd third_party - curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64.tar.xz - tar -xf llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64.tar.xz + curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20240518/llvm-mingw-20240518-ucrt-ubuntu-20.04-x86_64.tar.xz + tar -xf llvm-mingw-20240518-ucrt-ubuntu-20.04-x86_64.tar.xz rm -vf llvm-mingw-*.xz popd - name: "Download dependency: curl" @@ -223,26 +223,32 @@ jobs: sudo tar -C /usr/local --strip-components=1 -xf cmake-3.28.5-linux-x86_64.tar.gz cmake --version rm -f *.tar.gz - - name: Build - run: | - ./tools/build --variant gui --arch ${{ matrix.arch }} --system mingw -build-test \ - --clang-path $PWD/third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64 -no-packaging - - name: Populate depedencies (Tests-i686) + - name: Populate depedencies (i686) if: ${{ matrix.arch == 'i686' }} run: | - # copy curl dll required by yass_test - cp -v third_party/curl-8.4.0_7-win32-mingw/bin/libcurl.dll build-mingw-${{ matrix.arch }}/ # fix for missing i386 deb packages from deb.sury.org repository sudo add-apt-repository ppa:ondrej/php # alternative fix is to downgrade overloaded libpcre2 versions with five locally installed packages which are PHP-related and came from deb.sury.org repository. # sudo apt-get install -y --allow-downgrades libpcre2-8-0=10.34-7ubuntu0.1 libpcre2-16-0=10.34-7ubuntu0.1 libpcre2-32-0=10.34-7ubuntu0.1 libpcre2-dev=10.34-7ubuntu0.1 libgd3=2.2.5-5.2ubuntu2.1 sudo dpkg --add-architecture i386 && sudo apt-get update -qq && sudo apt-get install -y wine wine32 + - name: Populate depedencies (x86_64) + if: ${{ matrix.arch == 'x86_64' }} + run: | + sudo apt-get update -qq && sudo apt-get install -y wine wine64 + - name: Build + run: | + ./tools/build --variant gui --arch ${{ matrix.arch }} --system mingw -build-test \ + --clang-path $PWD/third_party/llvm-mingw-20240518-ucrt-ubuntu-20.04-x86_64 -no-packaging + - name: Populate depedencies (Tests-i686) + if: ${{ matrix.arch == 'i686' }} + run: | + # copy curl dll required by yass_test + cp -v third_party/curl-8.4.0_7-win32-mingw/bin/libcurl.dll build-mingw-${{ matrix.arch }}/ - name: Populate depedencies (Tests-x86_64) if: ${{ matrix.arch == 'x86_64' }} run: | # copy curl dll required by yass_test cp -v third_party/curl-8.4.0_7-win64-mingw/bin/libcurl-x64.dll build-mingw-${{ matrix.arch }}/ - sudo apt-get update -qq && sudo apt-get install -y wine wine64 - name: Run tests if: ${{ matrix.arch == 'i686' || matrix.arch == 'x86_64' }} run: | diff --git a/yass/.github/workflows/releases-mingw-new.yml b/yass/.github/workflows/releases-mingw-new.yml index bdf0ba792e..0d308d9b47 100644 --- a/yass/.github/workflows/releases-mingw-new.yml +++ b/yass/.github/workflows/releases-mingw-new.yml @@ -73,8 +73,8 @@ jobs: uses: actions/cache@v4 with: path: | - third_party/llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64 - key: ${{ runner.os }}-mingw64-third_party-llvm-20231128-${{ matrix.variant }} + third_party/llvm-mingw-20240518-${{ matrix.variant }}-ubuntu-20.04-x86_64 + key: ${{ runner.os }}-mingw64-third_party-llvm-20240518-${{ matrix.variant }} - name: Cache mingw64 curl id: curl-cache uses: actions/cache@v4 @@ -110,8 +110,8 @@ jobs: if: ${{ steps.mingw-cache.outputs.cache-hit != 'true' }} run: | pushd third_party - curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz - tar -xf llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz + curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20240518/llvm-mingw-20240518-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz + tar -xf llvm-mingw-20240518-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz rm -vf llvm-mingw-*.xz popd - name: "Download dependency: curl" @@ -130,6 +130,18 @@ jobs: sudo tar -C /usr/local --strip-components=1 -xf cmake-3.28.5-linux-x86_64.tar.gz cmake --version rm -f *.tar.gz + - name: Populate depedencies (i686) + if: ${{ matrix.arch == 'i686' }} + run: | + # fix for missing i386 deb packages from deb.sury.org repository + sudo add-apt-repository ppa:ondrej/php + # alternative fix is to downgrade overloaded libpcre2 versions with five locally installed packages which are PHP-related and came from deb.sury.org repository. + # sudo apt-get install -y --allow-downgrades libpcre2-8-0=10.34-7ubuntu0.1 libpcre2-16-0=10.34-7ubuntu0.1 libpcre2-32-0=10.34-7ubuntu0.1 libpcre2-dev=10.34-7ubuntu0.1 libgd3=2.2.5-5.2ubuntu2.1 + sudo dpkg --add-architecture i386 && sudo apt-get update -qq && sudo apt-get install -y wine wine32 + - name: Populate depedencies (x86_64) + if: ${{ matrix.arch == 'x86_64' || matrix.arch == 'aarch64' }} + run: | + sudo apt-get update -qq && sudo apt-get install -y wine wine64 - name: Patch libcxx for windows xp if: ${{ matrix.arch == 'i686' || matrix.arch == 'x86_64' }} run: | @@ -150,24 +162,18 @@ jobs: export LC_ALL=en_US.UTF-8 ./tools/build --variant gui --arch ${{ matrix.arch }} --system mingw \ -build-test -build-benchmark \ - -mingw-dir $PWD/third_party/llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64 \ + -mingw-dir $PWD/third_party/llvm-mingw-20240518-${{ matrix.variant }}-ubuntu-20.04-x86_64 \ ${{ env.BUILD_OPTIONS }} - name: Populate depedencies (Tests-i686) if: ${{ matrix.arch == 'i686' }} run: | # copy curl dll required by yass_test cp -v third_party/curl-8.4.0_7-win32-mingw/bin/libcurl.dll build-mingw-winxp-${{ matrix.arch }}/ - # fix for missing i386 deb packages from deb.sury.org repository - sudo add-apt-repository ppa:ondrej/php - # alternative fix is to downgrade overloaded libpcre2 versions with five locally installed packages which are PHP-related and came from deb.sury.org repository. - # sudo apt-get install -y --allow-downgrades libpcre2-8-0=10.34-7ubuntu0.1 libpcre2-16-0=10.34-7ubuntu0.1 libpcre2-32-0=10.34-7ubuntu0.1 libpcre2-dev=10.34-7ubuntu0.1 libgd3=2.2.5-5.2ubuntu2.1 - sudo dpkg --add-architecture i386 && sudo apt-get update -qq && sudo apt-get install -y wine wine32 - name: Populate depedencies (Tests-x86_64) if: ${{ matrix.arch == 'x86_64' }} run: | # copy curl dll required by yass_test cp -v third_party/curl-8.4.0_7-win64-mingw/bin/libcurl-x64.dll build-mingw-winxp-${{ matrix.arch }}/ - sudo apt-get update -qq && sudo apt-get install -y wine wine64 - name: Run tests if: ${{ matrix.arch == 'i686' || matrix.arch == 'x86_64' }} run: | diff --git a/yass/.github/workflows/releases-mingw.yml b/yass/.github/workflows/releases-mingw.yml index 5f2bcc5b39..674713935e 100644 --- a/yass/.github/workflows/releases-mingw.yml +++ b/yass/.github/workflows/releases-mingw.yml @@ -63,7 +63,7 @@ jobs: key: ${{ runner.os }}-mingw64-curl-${{ matrix.arch }}-v1 - name: "Download dependency: clang (chocolatey)" run: | - choco upgrade -y llvm --version=17.0.6 + choco upgrade -y llvm --version=18.1.6 clang -v - name: "Download dependency: mingw64" if: ${{ steps.mingw64-cache.outputs.cache-hit != 'true' }} @@ -119,7 +119,7 @@ jobs: REM start to build with workaround mkdir build-mingw cd build-mingw - cmake -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DBUILD_BENCHMARKS=on -DBUILD_TESTS=on -DGUI=on -DMINGW_MSVCRT100=on -DMINGW_WORKAROUND=on .. ${{ env.CMAKE_OPTIONS }} -DCMAKE_C_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_ASM_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_SYSROOT="%CD%\..\third_party\${{ matrix.mingw_dir }}\${{ matrix.arch }}-w64-mingw32" + cmake -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DBUILD_BENCHMARKS=on -DBUILD_TESTS=on -DGUI=on -DMINGW_MSVCRT100=on -DMINGW_WORKAROUND=on .. ${{ env.CMAKE_OPTIONS }} -DCMAKE_C_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_ASM_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_SYSROOT="%CD%\..\third_party\${{ matrix.mingw_dir }}\${{ matrix.arch }}-w64-mingw32" -DUSE_TCMALLOC=on ninja yass yass_benchmark yass_test - name: Packaging shell: bash @@ -138,6 +138,7 @@ jobs: rm -rf $PREFIX mkdir $PREFIX cp -f yass.exe $PREFIX/ + cp -fv *.dll $PREFIX/ "/c/Program Files/7-Zip/7z.exe" a -tzip ../$PREFIX.zip $PREFIX # generate debuginfo archive diff --git a/yass/.gitignore b/yass/.gitignore index 8a36424503..a425f67166 100644 --- a/yass/.gitignore +++ b/yass/.gitignore @@ -18,20 +18,18 @@ sscxx /third_party/libcurl-vc16-x86-release-static-ipv6-sspi-schannel /third_party/libcurl-vc16-x64-release-static-ipv6-sspi-schannel /third_party/libcurl-vc16-arm64-release-static-ipv6-sspi-schannel -/third_party/curl-8.2.0_1-win32-mingw -/third_party/curl-8.2.0_1-win64-mingw -/third_party/curl-8.4.0_7-win32-mingw -/third_party/curl-8.4.0_7-win64-mingw -/third_party/curl-8.4.0_7-win64a-mingw -/third_party/llvm-mingw-20230614-msvcrt-ubuntu-20.04-x86_64 -/third_party/llvm-mingw-20230614-ucrt-ubuntu-20.04-x86_64 -/third_party/llvm-mingw-20230614-ucrt-macos-universal -/third_party/llvm-mingw-20231128-ucrt-i686 -/third_party/llvm-mingw-20231128-ucrt-x86_64 -/third_party/llvm-mingw-20231128-ucrt-aarch64 -/third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-aarch64 -/third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64 -/third_party/llvm-mingw-20231128-ucrt-macos-universal +/third_party/curl-*-win32-mingw +/third_party/curl-*-win64-mingw +/third_party/curl-*-win32-mingw +/third_party/curl-*-win64-mingw +/third_party/curl-*-win64a-mingw +/third_party/llvm-mingw-*-msvcrt-ubuntu-20.04-x86_64 +/third_party/llvm-mingw-*-ucrt-ubuntu-20.04-x86_64 +/third_party/llvm-mingw-*-ucrt-ubuntu-20.04-aarch64 +/third_party/llvm-mingw-*-ucrt-macos-universal +/third_party/llvm-mingw-*-ucrt-i686 +/third_party/llvm-mingw-*-ucrt-x86_64 +/third_party/llvm-mingw-*-ucrt-aarch64 /third_party/crashpad /third_party/depot_tools *.aps diff --git a/yass/CMakeLists.txt b/yass/CMakeLists.txt index 287b47a6ca..46d16360f6 100644 --- a/yass/CMakeLists.txt +++ b/yass/CMakeLists.txt @@ -436,14 +436,14 @@ option(OPTIMIZED_PROTOC "Force protobuf compiler to be built with optimization" cmake_dependent_option( USE_TCMALLOC "Build with tcmalloc" OFF - "LINUX" OFF) + "LINUX OR WIN32" OFF) cmake_dependent_option( USE_SYSTEM_TCMALLOC "Build with system or vendored tcmalloc" OFF USE_TCMALLOC OFF) cmake_dependent_option( USE_MIMALLOC "Use mimalloc" OFF - "NOT USE_TCMALLOC; NOT WIN32; NOT IOS; NOT ANDROID; NOT OHOS" OFF) + "NOT USE_TCMALLOC; NOT IOS; NOT ANDROID; NOT OHOS" OFF) cmake_dependent_option( USE_SYSTEM_MIMALLOC "Use system or vendored mimalloc" OFF @@ -2345,6 +2345,15 @@ if (USE_TCMALLOC AND NOT USE_SYSTEM_TCMALLOC) message(WARNING "tcmalloc: arch ${CMAKE_SYSTEM_PROCESSOR} is not supported, disabling...") set(USE_TCMALLOC OFF) endif() + if (MSVC AND NOT MSVC_CRT_LINKAGE STREQUAL "dynamic") + message(WARNING "tcmalloc: static crt build is not supported, disabling...") + set(USE_TCMALLOC OFF) + endif() + # FIXME untested on an woa machine + if (WIN32 AND OS_AARCH64) + message(WARNING "tcmalloc: aarch64 build on windows is not supported, disabling...") + set(USE_TCMALLOC OFF) + endif() endif() if (USE_SYSTEM_TCMALLOC) @@ -2374,7 +2383,7 @@ if (USE_SYSTEM_TCMALLOC AND USE_TCMALLOC) ${TCMALLOC_LIB} ${SUPPORT_LIBS} ) -elseif (USE_TCMALLOC) +elseif (USE_TCMALLOC AND NOT WIN32) message(STATUS "Compiling with bundled tcmalloc support") set(GPERFTOOLS_BUILD_DEBUGALLOC OFF CACHE BOOL "") @@ -2402,13 +2411,63 @@ elseif (USE_TCMALLOC) ${TCMALLOC_LIB} ${SUPPORT_LIBS} ) +elseif (USE_TCMALLOC AND WIN32) + message(STATUS "Compiling with bundled tcmalloc support") + + set(GPERFTOOLS_BUILD_DEBUGALLOC OFF CACHE BOOL "") + set(gperftools_build_minimal ON CACHE BOOL "") + set(gperftools_build_benchmark OFF CACHE BOOL "") + set(GPERFTOOLS_BUILD_STATIC OFF CACHE BOOL "") + set(GPERFTOOLS_ENABLE_INSTALL OFF CACHE BOOL "") + set(GPERFTOOLS_BUILD_TESTING OFF CACHE BOOL "") + add_subdirectory(third_party/gperftools EXCLUDE_FROM_ALL) + + list(APPEND YASS_APP_FEATURES "tcmalloc_minimal (dll)") + + set(TCMALLOC_LIB tcmalloc_minimal) + + set_target_properties(tcmalloc_minimal PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(tcmalloc_minimal PROPERTIES PREFIX "") + + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(TCMALLOC_DLL_SUFFIX "32") + else() + set(TCMALLOC_DLL_SUFFIX "") + endif() + set_target_properties(tcmalloc_minimal PROPERTIES OUTPUT_NAME "tcmalloc${TCMALLOC_DLL_SUFFIX}") + + set(SUPPORT_DEFINITIONS + HAVE_TCMALLOC + ${SUPPORT_DEFINITIONS} + ) + set(SUPPORT_INCLUDE_DIRS + ${CMAKE_CURRENT_BINARY_DIR}/third_party/gperftools + third_party/gperftools/src + ${SUPPORT_INCLUDE_DIRS} + ) + set(SUPPORT_LIBS + ${TCMALLOC_LIB} + ${SUPPORT_LIBS} + ) + + install(TARGETS tcmalloc_minimal RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # patching manually, see tcmalloc's README_windows.txt if (MSVC) - add_link_options(/INCLUDE:__tcmalloc) + if (OS_X86) + add_link_options(/INCLUDE:__tcmalloc) + else() + add_link_options(/INCLUDE:_tcmalloc) + endif() endif() if (MINGW) - add_link_options(-Wl,-u__tcmalloc) + if (OS_X86) + add_link_options(-Wl,-u__tcmalloc) + else() + add_link_options(-Wl,-u_tcmalloc) + endif() + # reduce the binary size + target_link_options(tcmalloc_minimal PRIVATE "-s") endif() endif() @@ -2416,6 +2475,14 @@ endif() # mimalloc Library # ***************************************************************************************** +# FIXME limitation of mimalloc-redirect library +if (USE_MIMALLOC AND NOT USE_SYSTEM_MIMALLOC) + if (WIN32 AND ALLOW_XP AND OS_X86) + message(WARNING "mimalloc: windows xp is not supported, disabling...") + set(USE_MIMALLOC OFF) + endif() +endif() + if (USE_SYSTEM_MIMALLOC) find_package(PkgConfig) if (PKG_CONFIG_FOUND) @@ -2449,7 +2516,7 @@ if (USE_MIMALLOC AND USE_SYSTEM_MIMALLOC) ${MIMALLOC_LIB} ) -elseif(USE_MIMALLOC) +elseif(USE_MIMALLOC AND NOT WIN32) message(STATUS "Compiling with bundled mimalloc support") set(MI_BUILD_STATIC ON CACHE INTERNAL "") @@ -2462,6 +2529,8 @@ elseif(USE_MIMALLOC) target_compile_definitions(mimalloc-static PRIVATE MI_USE_ENVIRON=0) set(MIMALLOC_LIB mimalloc-static) + add_library(mimalloc_override OBJECT src/mimalloc.cc) + target_link_libraries(mimalloc_override PRIVATE mimalloc-static) set(SUPPORT_DEFINITIONS HAVE_MIMALLOC @@ -2473,8 +2542,77 @@ elseif(USE_MIMALLOC) ) list(APPEND YASS_APP_FEATURES "mimalloc") +elseif(USE_MIMALLOC AND WIN32) + message(STATUS "Compiling with bundled mimalloc support") + + set(MI_BUILD_STATIC OFF CACHE INTERNAL "") + set(MI_BUILD_SHARED ON CACHE INTERNAL "") + set(MI_BUILD_OBJECT OFF CACHE INTERNAL "") + set(MI_BUILD_TESTS OFF CACHE INTERNAL "") + set(MI_ENABLE_INSTALL OFF CACHE INTERNAL "") + set(MI_LIBC_MUSL "${USE_MUSL}" CACHE INTERNAL "") + add_subdirectory(third_party/mimalloc EXCLUDE_FROM_ALL) + target_compile_definitions(mimalloc PRIVATE MI_USE_ENVIRON=0) + target_compile_definitions(mimalloc PRIVATE _DLL=1) + + set(MIMALLOC_LIB mimalloc) + + set_target_properties(mimalloc PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(mimalloc PROPERTIES PREFIX "") + set_target_properties(mimalloc PROPERTIES OUTPUT_NAME "mimalloc-override") + + set(USE_MIMALLOC_MINJECT ON) + + set(SUPPORT_DEFINITIONS + HAVE_MIMALLOC + ${SUPPORT_DEFINITIONS} + ) + set(SUPPORT_LIBS + ${SUPPORT_LIBS} + ${MIMALLOC_LIB} + ) + + add_library(mimalloc_override OBJECT src/mimalloc.cc) + target_link_libraries(mimalloc_override PRIVATE mimalloc) + + install(TARGETS mimalloc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + # On windows, link and copy the mimalloc redirection dll too. + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(MIMALLOC_REDIRECT_SUFFIX "32") + else() + set(MIMALLOC_REDIRECT_SUFFIX "") + endif() + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/third_party/mimalloc/bin/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" DESTINATION ${CMAKE_INSTALL_BINDIR}) + + set(SUPPORT_LIBS + ${SUPPORT_LIBS} + mimalloc_override + ) + + list(APPEND YASS_APP_FEATURES "mimalloc (dll)") endif() +function(minject_patch_exetuable target_name) + if (NOT USE_MIMALLOC_MINJECT) + return() + endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(MINJECT_EXETUABLE "${CMAKE_CURRENT_SOURCE_DIR}/third_party/mimalloc/bin/minject32.exe") + else() + set(MINJECT_EXETUABLE "${CMAKE_CURRENT_SOURCE_DIR}/third_party/mimalloc/bin/minject.exe") + endif() + + if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows") + set(WINE_PREFIX) + else() + set(WINE_PREFIX wine) + endif() + add_custom_command(TARGET ${target_name} POST_BUILD + COMMAND ${WINE_PREFIX} "${MINJECT_EXETUABLE}" --force --inplace $ + COMMENT "minject ${target_name}") +endfunction() + # ***************************************************************************************** # re2 Library # ***************************************************************************************** @@ -3978,6 +4116,7 @@ if (CLI) add_executable(yass_cli src/cli/cli.cpp ) + minject_patch_exetuable(yass_cli) if (WIN32) set(CLI_MSVC_MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/yass_cli.manifest") @@ -4029,6 +4168,7 @@ if (SERVER) add_executable(yass_server src/server/server.cpp ) + minject_patch_exetuable(yass_server) if (WIN32) set(SERVER_MSVC_MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/yass_server.manifest") @@ -4245,6 +4385,7 @@ if (GUI) ${SRC_FILES} ${GUI_USE_FILE} ) + minject_patch_exetuable(${APP_NAME}) endif() target_include_directories(${APP_NAME} PRIVATE @@ -4757,6 +4898,7 @@ if (BUILD_TESTS) endif() else() add_executable(yass_test ${yass_test_SOURCE}) + minject_patch_exetuable(yass_test) endif() if (USE_LEVELDB) target_sources(yass_test PRIVATE third_party/leveldb_test.cc) @@ -4895,6 +5037,7 @@ if (BUILD_BENCHMARKS) else() add_executable(yass_benchmark ${yass_benchmark_SOURCE}) + minject_patch_exetuable(yass_benchmark) endif() target_include_directories(yass_benchmark PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src diff --git a/yass/README.md b/yass/README.md index a1a99e7bff..2cd28b266f 100644 --- a/yass/README.md +++ b/yass/README.md @@ -28,14 +28,14 @@ Post Quantum Kyber Support (not enabled by default) is added on all of supported See [Protecting Chrome Traffic with Hybrid Kyber KEM](https://blog.chromium.org/2023/08/protecting-chrome-traffic-with-hybrid.html) for more. ### Prebuilt binaries -- Android [download apk](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-android-release-arm64-1.10.3.apk) or [download 32-bit apk](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-android-release-arm-1.10.3.apk) +- Android [download apk](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-android-release-arm64-1.10.4.apk) or [download 32-bit apk](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-android-release-arm-1.10.4.apk) - iOS [join via TestFlight](https://testflight.apple.com/join/6AkiEq09) -- Windows [download installer](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-mingw-win7-release-x86_64-1.10.3-system-installer.exe) or [download 32-bit installer](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-mingw-winxp-release-i686-1.10.3-system-installer.exe) [(require vc 2010 runtime)][vs2010_x86] or [download woa arm64 installer](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-mingw-release-aarch64-1.10.3-system-installer.exe) -- macOS [download intel dmg](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-macos-release-x64-1.10.3.dmg) or [download apple silicon dmg](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-macos-release-arm64-1.10.3.dmg) +- Windows [download installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-win7-release-x86_64-1.10.4-system-installer.exe) or [download 32-bit installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-winxp-release-i686-1.10.4-system-installer.exe) [(require vc 2010 runtime)][vs2010_x86] or [download woa arm64 installer](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-mingw-release-aarch64-1.10.4-system-installer.exe) +- macOS [download intel dmg](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-macos-release-x64-1.10.4.dmg) or [download apple silicon dmg](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-macos-release-arm64-1.10.4.dmg) > via homebrew: `brew install --cask yass` -- Linux [download rpm](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass.el7.x86_64.1.10.3.rpm) or [download deb](https://github.com/Chilledheart/yass/releases/download/1.10.3/yass-ubuntu-16.04-xenial_amd64.1.10.3.deb) +- Linux [download rpm](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass.el7.x86_64.1.10.4.rpm) or [download deb](https://github.com/Chilledheart/yass/releases/download/1.10.4/yass-ubuntu-16.04-xenial_amd64.1.10.4.deb) -View more at [Release Page](https://github.com/Chilledheart/yass/releases/tag/1.10.3) +View more at [Release Page](https://github.com/Chilledheart/yass/releases/tag/1.10.4) ### NaïveProxy-Compatible Protocol Support Cipher http2 and https are NaïveProxy-compatible. diff --git a/yass/debian/changelog b/yass/debian/changelog index ce7c2c7517..ee7f99e78d 100644 --- a/yass/debian/changelog +++ b/yass/debian/changelog @@ -1,3 +1,8 @@ +yass (1.10.4-1) UNRELEASED; urgency=medium + + * miscellaneous fixes + + -- Chilledheart Fri, 31 May 2024 17:17:07 +0800 yass (1.10.3-1) UNRELEASED; urgency=medium * net: support https protocol via caddy. diff --git a/yass/src/cli/cli.cpp b/yass/src/cli/cli.cpp index 8fa6499cf8..ff51b94aee 100644 --- a/yass/src/cli/cli.cpp +++ b/yass/src/cli/cli.cpp @@ -212,5 +212,7 @@ int main(int argc, const char* argv[]) { io_context.run(); + PrintMallocStats(); + return 0; } diff --git a/yass/src/core/utils.cpp b/yass/src/core/utils.cpp index 7e06af615e..97032d49b7 100644 --- a/yass/src/core/utils.cpp +++ b/yass/src/core/utils.cpp @@ -15,7 +15,7 @@ #endif #ifdef HAVE_TCMALLOC -#include +#include #endif #ifdef HAVE_MIMALLOC @@ -396,17 +396,20 @@ bool IsProgramConsole(int fd) { void PrintMallocStats() { #ifdef HAVE_TCMALLOC constexpr const char* properties[] = { - "generic.current_allocated_bytes", - "generic.heap_size", - "generic.total_physical_bytes", - "tcmalloc.max_total_thread_cache_bytes", - "tcmalloc.current_total_thread_cache_bytes", - "tcmalloc.pageheap_free_bytes", - "tcmalloc.pageheap_unmapped_bytes", + "generic.current_allocated_bytes", "generic.heap_size", + "generic.total_physical_bytes", "tcmalloc.central_cache_free_bytes", + "tcmalloc.transfer_cache_free_bytes", "tcmalloc.thread_cache_free_bytes", + "tcmalloc.pageheap_free_bytes", "tcmalloc.pageheap_unmapped_bytes", + "tcmalloc.pageheap_committed_bytes", "tcmalloc.pageheap_scavenge_count", + "tcmalloc.pageheap_commit_count", "tcmalloc.pageheap_total_commit_bytes", + "tcmalloc.pageheap_decommit_count", "tcmalloc.pageheap_total_decommit_bytes", + "tcmalloc.pageheap_reserve_count", "tcmalloc.pageheap_total_reserve_bytes", + "tcmalloc.max_total_thread_cache_bytes", "tcmalloc.current_total_thread_cache_bytes", + "tcmalloc.aggressive_memory_decommit", "tcmalloc.heap_limit_mb", }; for (auto property : properties) { size_t size; - if (MallocExtension::instance()->GetNumericProperty(property, &size)) { + if (MallocExtension_GetNumericProperty(property, &size)) { LOG(ERROR) << "TCMALLOC: " << property << " = " << size << " bytes"; } } diff --git a/yass/src/core/utils_win.cpp b/yass/src/core/utils_win.cpp index ba7c18ce4b..b92618239b 100644 --- a/yass/src/core/utils_win.cpp +++ b/yass/src/core/utils_win.cpp @@ -214,6 +214,21 @@ bool IsProgramConsole(HANDLE handle) { } static const wchar_t* kDllWhiteList[] = { +#ifdef HAVE_TCMALLOC +#if defined(_M_X64) || defined(_M_ARM64) + L"tcmalloc.dll", +#else + L"tcmalloc32.dll", +#endif +#endif // HAVE_TCMALLOC +#ifdef HAVE_MIMALLOC + L"mimalloc-override.dll", +#if defined(_M_X64) || defined(_M_ARM64) + L"mimalloc-redirect.dll", +#else + L"mimalloc-redirect32.dll", +#endif +#endif // HAVE_MIMALLOC #ifndef _LIBCPP_MSVCRT // msvc runtime, still searched current directory // under dll search security mode @@ -318,7 +333,7 @@ static void CheckDynamicLibraries() { const auto me = exe.substr(last + 1); if (std::end(kDllWhiteList) != std::find_if(std::begin(kDllWhiteList), std::end(kDllWhiteList), - [&findData](const wchar_t* dll) { return _wcsicmp(dll, findData.cFileName) == 0; })) { + [&findData](const wchar_t* dll) { return dll && _wcsicmp(dll, findData.cFileName) == 0; })) { continue; } std::wostringstream os; diff --git a/yass/src/gtk/yass.cpp b/yass/src/gtk/yass.cpp index 3d90c4f95c..b64c33d389 100644 --- a/yass/src/gtk/yass.cpp +++ b/yass/src/gtk/yass.cpp @@ -179,6 +179,8 @@ int YASSApp::ApplicationRun(int argc, char** argv) { cairo_debug_reset_static_data(); FcFini(); + PrintMallocStats(); + return ret; } diff --git a/yass/src/gtk4/yass.cpp b/yass/src/gtk4/yass.cpp index c11f4daa2c..70a8d3872c 100644 --- a/yass/src/gtk4/yass.cpp +++ b/yass/src/gtk4/yass.cpp @@ -221,6 +221,8 @@ int YASSApp::ApplicationRun(int argc, char** argv) { FcFini(); #endif + PrintMallocStats(); + return ret; } diff --git a/yass/src/mimalloc.cc b/yass/src/mimalloc.cc new file mode 100644 index 0000000000..ba6be25eb1 --- /dev/null +++ b/yass/src/mimalloc.cc @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#include "mimalloc-new-delete.h" diff --git a/yass/src/server/server.cpp b/yass/src/server/server.cpp index 14197c5188..f8219ae646 100644 --- a/yass/src/server/server.cpp +++ b/yass/src/server/server.cpp @@ -244,5 +244,7 @@ int main(int argc, const char* argv[]) { io_context.run(); + PrintMallocStats(); + return 0; } diff --git a/yass/src/win32/yass.cpp b/yass/src/win32/yass.cpp index 67b2320166..854401820c 100644 --- a/yass/src/win32/yass.cpp +++ b/yass/src/win32/yass.cpp @@ -253,6 +253,8 @@ int CYassApp::RunMainLoop() { return ret; } + PrintMallocStats(); + return static_cast(msg.wParam); } diff --git a/yass/third_party/gperftools/src/windows/mini_disassembler.cc b/yass/third_party/gperftools/src/windows/mini_disassembler.cc index 35d7a9d5ff..5a4c66fc14 100644 --- a/yass/third_party/gperftools/src/windows/mini_disassembler.cc +++ b/yass/third_party/gperftools/src/windows/mini_disassembler.cc @@ -101,7 +101,7 @@ InstructionType MiniDisassembler::Disassemble( void MiniDisassembler::Initialize() { operand_is_32_bits_ = operand_default_is_32_bits_; address_is_32_bits_ = address_default_is_32_bits_; -#ifdef _M_X64 +#if defined(_M_X64) || defined(_M_ARM64) operand_default_support_64_bits_ = true; #else operand_default_support_64_bits_ = false; diff --git a/yass/third_party/gperftools/src/windows/patch_functions.cc b/yass/third_party/gperftools/src/windows/patch_functions.cc index 86c4683ff6..4216c1f488 100644 --- a/yass/third_party/gperftools/src/windows/patch_functions.cc +++ b/yass/third_party/gperftools/src/windows/patch_functions.cc @@ -985,6 +985,43 @@ BOOL WINAPI WindowsInfo::Perftools_FreeLibrary(HMODULE hLibModule) { return rv; } +// see https://learn.microsoft.com/en-us/answers/questions/518344/tell-if-process-archtitecture-is-arm64-(x64-compat +typedef BOOL (WINAPI* PFNISWOW64PROCESS2)(HANDLE hProcess, + USHORT *pProcessMachine, + USHORT *pNativeMachine); +#ifndef IMAGE_FILE_MACHINE_UNKNOWN +#define IMAGE_FILE_MACHINE_UNKNOWN 0x0 +#endif // IMAGE_FILE_MACHINE_UNKNOWN +#ifndef IMAGE_FILE_MACHINE_ARM64 +#define IMAGE_FILE_MACHINE_ARM64 0xAA64 +#endif // IMAGE_FILE_MACHINE_ARM64 + +static BOOL IsWow64Process2Wrapper(HANDLE hProcess, + USHORT *pProcessMachine, + USHORT *pNativeMachine) { + HMODULE m = GetModuleHandleW(L"Kernel32.dll"); + assert(m && "kernel32 dll not loaded"); + static const auto fPointer = + reinterpret_cast( + reinterpret_cast(::GetProcAddress(m, "IsWow64Process2"))); + if (fPointer == nullptr) { + ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; + } + return fPointer(hProcess, pProcessMachine, pNativeMachine); +} + +static bool IsArm64NativeMachine() { + USHORT ProcessMachine = IMAGE_FILE_MACHINE_UNKNOWN; + USHORT NativeMachine = IMAGE_FILE_MACHINE_UNKNOWN; + + if (!IsWow64Process2Wrapper(GetCurrentProcess(), + &ProcessMachine, &NativeMachine)) { + return false; + } + return NativeMachine == IMAGE_FILE_MACHINE_ARM64; +} + // --------------------------------------------------------------------- // PatchWindowsFunctions() @@ -999,7 +1036,9 @@ void PatchWindowsFunctions() { disable_env[0] == '1' && disable_env[1] == '\0'; - if (!should_skip) { + const bool is_arm64_native = IsArm64NativeMachine(); + + if (!should_skip && !is_arm64_native) { // This does the libc patching in every module, and the main executable. PatchAllModules(); main_executable_windows.Patch(); diff --git a/yass/third_party/gperftools/src/windows/port.cc b/yass/third_party/gperftools/src/windows/port.cc index f779c8bb9f..18e5a2f04d 100644 --- a/yass/third_party/gperftools/src/windows/port.cc +++ b/yass/third_party/gperftools/src/windows/port.cc @@ -103,7 +103,7 @@ extern "C" PERFTOOLS_DLL_DECL void WriteToStderr(const char* buf, int len) { #pragma comment(linker, "/INCLUDE:__tls_used") #pragma comment(linker, "/INCLUDE:_p_thread_callback_tcmalloc") #pragma comment(linker, "/INCLUDE:_p_process_term_tcmalloc") -#elif defined(_M_X64) +#elif defined(_M_X64) || defined(_M_ARM64) #pragma comment(linker, "/INCLUDE:_tls_used") #pragma comment(linker, "/INCLUDE:p_thread_callback_tcmalloc") #pragma comment(linker, "/INCLUDE:p_process_term_tcmalloc") @@ -161,7 +161,7 @@ void (NTAPI *p_thread_callback_tcmalloc)( int (*p_process_term_tcmalloc)(void) = on_process_term; #pragma data_seg(pop, old_seg) } // extern "C" -#elif defined(_M_X64) +#elif defined(_M_X64) || defined(_M_ARM64) // In x64, the PE loader looks for callbacks in a constant segment #pragma const_seg(push, oldseg) #pragma const_seg(".CRT$XLB") diff --git a/yass/third_party/gperftools/src/windows/preamble_patcher.h b/yass/third_party/gperftools/src/windows/preamble_patcher.h index 701e57068a..ce76a067d7 100644 --- a/yass/third_party/gperftools/src/windows/preamble_patcher.h +++ b/yass/third_party/gperftools/src/windows/preamble_patcher.h @@ -50,7 +50,7 @@ // bytes of the function. Considering the worst case scenario, we need 4 // bytes + the max instruction size + 5 more bytes for our jump back to // the original code. With that in mind, 32 is a good number :) -#ifdef _M_X64 +#if defined(_M_X64) || defined(_M_ARM64) // In 64-bit mode we may need more room. In 64-bit mode all jumps must be // within +/-2GB of RIP. Because of this limitation we may need to use a // trampoline to jump to the replacement function if it is further than 2GB @@ -64,7 +64,7 @@ #endif // Determines if this is a 64-bit binary. -#ifdef _M_X64 +#if defined(_M_X64) || defined(_M_ARM64) static const bool kIs64BitBinary = true; #else static const bool kIs64BitBinary = false; diff --git a/yass/third_party/gperftools/src/windows/preamble_patcher_test.cc b/yass/third_party/gperftools/src/windows/preamble_patcher_test.cc index f3e051131d..9b8a5f582b 100644 --- a/yass/third_party/gperftools/src/windows/preamble_patcher_test.cc +++ b/yass/third_party/gperftools/src/windows/preamble_patcher_test.cc @@ -74,7 +74,7 @@ namespace { // call it within a function, otherwise the compiler will just reuse the // last calculated incremented value. int __declspec(noinline) IncrementNumber(int i) { -#ifdef _M_X64 +#if defined(_M_X64) || defined(_M_ARM64) __int64 i2 = i + 1; return (int) i2; #else diff --git a/yass/third_party/mimalloc/CMakeLists.txt b/yass/third_party/mimalloc/CMakeLists.txt index f41e40616a..5c1733d122 100644 --- a/yass/third_party/mimalloc/CMakeLists.txt +++ b/yass/third_party/mimalloc/CMakeLists.txt @@ -340,10 +340,6 @@ if (MSVC AND MSVC_VERSION GREATER_EQUAL 1914) list(APPEND mi_cflags /Zc:__cplusplus) endif() -if(MINGW) - add_definitions(-D_WIN32_WINNT=0x600) -endif() - # extra needed libraries # we prefer -l test over `find_library` as sometimes core libraries diff --git a/yass/third_party/mimalloc/include/mimalloc-new-delete.h b/yass/third_party/mimalloc/include/mimalloc-new-delete.h index c16f4a6653..a1108189c0 100644 --- a/yass/third_party/mimalloc/include/mimalloc-new-delete.h +++ b/yass/third_party/mimalloc/include/mimalloc-new-delete.h @@ -20,7 +20,7 @@ terms of the MIT license. A copy of the license can be found in the file // --------------------------------------------------------------------------- #if defined(__cplusplus) #include - #include + #include "mimalloc.h" #if defined(_MSC_VER) && defined(_Ret_notnull_) && defined(_Post_writable_byte_size_) // stay consistent with VCRT definitions @@ -31,8 +31,8 @@ terms of the MIT license. A copy of the license can be found in the file #define mi_decl_new_nothrow(n) mi_decl_nodiscard mi_decl_restrict #endif - void operator delete(void* p) noexcept { mi_free(p); }; - void operator delete[](void* p) noexcept { mi_free(p); }; + void operator delete(void* p) noexcept { mi_free(p); } + void operator delete[](void* p) noexcept { mi_free(p); } void operator delete (void* p, const std::nothrow_t&) noexcept { mi_free(p); } void operator delete[](void* p, const std::nothrow_t&) noexcept { mi_free(p); } @@ -44,15 +44,15 @@ terms of the MIT license. A copy of the license can be found in the file mi_decl_new_nothrow(n) void* operator new[](std::size_t n, const std::nothrow_t& tag) noexcept { (void)(tag); return mi_new_nothrow(n); } #if (__cplusplus >= 201402L || _MSC_VER >= 1916) - void operator delete (void* p, std::size_t n) noexcept { mi_free_size(p,n); }; - void operator delete[](void* p, std::size_t n) noexcept { mi_free_size(p,n); }; + void operator delete (void* p, std::size_t n) noexcept { mi_free_size(p,n); } + void operator delete[](void* p, std::size_t n) noexcept { mi_free_size(p,n); } #endif #if (__cplusplus > 201402L || defined(__cpp_aligned_new)) void operator delete (void* p, std::align_val_t al) noexcept { mi_free_aligned(p, static_cast(al)); } void operator delete[](void* p, std::align_val_t al) noexcept { mi_free_aligned(p, static_cast(al)); } - void operator delete (void* p, std::size_t n, std::align_val_t al) noexcept { mi_free_size_aligned(p, n, static_cast(al)); }; - void operator delete[](void* p, std::size_t n, std::align_val_t al) noexcept { mi_free_size_aligned(p, n, static_cast(al)); }; + void operator delete (void* p, std::size_t n, std::align_val_t al) noexcept { mi_free_size_aligned(p, n, static_cast(al)); } + void operator delete[](void* p, std::size_t n, std::align_val_t al) noexcept { mi_free_size_aligned(p, n, static_cast(al)); } void operator delete (void* p, std::align_val_t al, const std::nothrow_t&) noexcept { mi_free_aligned(p, static_cast(al)); } void operator delete[](void* p, std::align_val_t al, const std::nothrow_t&) noexcept { mi_free_aligned(p, static_cast(al)); } diff --git a/yass/third_party/mimalloc/src/prim/windows/prim.c b/yass/third_party/mimalloc/src/prim/windows/prim.c index 5074ad4cbd..b11f1f7d92 100644 --- a/yass/third_party/mimalloc/src/prim/windows/prim.c +++ b/yass/third_party/mimalloc/src/prim/windows/prim.c @@ -13,6 +13,9 @@ terms of the MIT license. A copy of the license can be found in the file #include "mimalloc/prim.h" #include // fputs, stderr +#ifndef ERROR_COMMITMENT_MINIMUM +#define ERROR_COMMITMENT_MINIMUM 635 +#endif //--------------------------------------------- // Dynamically bind Windows API points for portability diff --git a/yass/tools/build.go b/yass/tools/build.go index a9c514a28c..cd450b19a2 100644 --- a/yass/tools/build.go +++ b/yass/tools/build.go @@ -876,6 +876,13 @@ func buildStageGenerateBuildScript() { if msvcTargetArchFlag == "arm" || msvcTargetArchFlag == "arm64" { cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DCMAKE_ASM_FLAGS=--target=%s", targetTriple)) } + + if msvcCrtLinkageFlag == "dynamic" && (msvcTargetArchFlag == "x86" || msvcTargetArchFlag == "x64") { + cmakeArgs = append(cmakeArgs, "-DUSE_TCMALLOC=on") + } + // if msvcCrtLinkageFlag == "dynamic" { + // cmakeArgs = append(cmakeArgs, "-DUSE_MIMALLOC=on") + // } } if systemNameFlag == "darwin" { @@ -945,6 +952,13 @@ func buildStageGenerateBuildScript() { if mingwDir != clangPath { getAndFixMinGWLibunwind(mingwDir) } + + if targetAbi == "i686" || targetAbi == "x86_64" { + cmakeArgs = append(cmakeArgs, "-DUSE_TCMALLOC=on") + } + // if !mingwAllowXpFlag && targetAbi != "i686" { + // cmakeArgs = append(cmakeArgs, "-DUSE_MIMALLOC=on") + // } } if systemNameFlag == "ios" { @@ -2223,7 +2237,7 @@ func postStateArchives() map[string][]string { var dllPaths []string var dbgPaths []string - if systemNameFlag == "windows" { + if systemNameFlag == "windows" || systemNameFlag == "mingw" { entries, _ := ioutil.ReadDir("./") for _, entry := range entries { name := entry.Name() diff --git a/yass/yass.spec.in b/yass/yass.spec.in index c885d4ad6f..84600faac8 100644 --- a/yass/yass.spec.in +++ b/yass/yass.spec.in @@ -259,6 +259,8 @@ for embedded devices and low end boxes. %systemd_postun_with_restart yass-redir.service %changelog +* Fri May 31 2024 Chilledheart - 1.10.4-1 + - miscellaneous fixes * Sun May 26 2024 Chilledheart - 1.10.3-1 - net: support https protocol via caddy. * Thu May 23 2024 Chilledheart - 1.10.2-1 diff --git a/yt-dlp/.github/workflows/build.yml b/yt-dlp/.github/workflows/build.yml index 55cf3b3a27..9a1a22e8f5 100644 --- a/yt-dlp/.github/workflows/build.yml +++ b/yt-dlp/.github/workflows/build.yml @@ -237,7 +237,7 @@ jobs: macos: needs: process if: inputs.macos - runs-on: macos-11 + runs-on: macos-12 steps: - uses: actions/checkout@v4 @@ -260,11 +260,23 @@ jobs: --pre -d curl_cffi_whls \ -r requirements.txt done + ( # Overwrite x86_64-only libs with fat/universal2 libs or else Pyinstaller will do the opposite + # See https://github.com/yt-dlp/yt-dlp/pull/10069 + cd curl_cffi_whls + mkdir -p curl_cffi/.dylibs + python_libdir=$(python3 -c 'import sys; from pathlib import Path; print(Path(sys.path[1]).parent)') + for dylib in lib{ssl,crypto}.3.dylib; do + cp "${python_libdir}/${dylib}" "curl_cffi/.dylibs/${dylib}" + for wheel in curl_cffi*macos*x86_64.whl; do + zip "${wheel}" "curl_cffi/.dylibs/${dylib}" + done + done + ) python3 -m delocate.cmd.delocate_fuse curl_cffi_whls/curl_cffi*.whl -w curl_cffi_universal2 python3 -m delocate.cmd.delocate_fuse curl_cffi_whls/cffi*.whl -w curl_cffi_universal2 cd curl_cffi_universal2 - for wheel in *cffi*.whl; do mv -n -- "${wheel}" "${wheel/x86_64/universal2}"; done - python3 -m pip install -U --user *cffi*.whl + for wheel in ./*cffi*.whl; do mv -n -- "${wheel}" "${wheel/x86_64/universal2}"; done + python3 -m pip install -U --user ./*cffi*.whl - name: Prepare run: | @@ -311,7 +323,7 @@ jobs: # Hack to get the latest patch version. Uncomment if needed #brew install python@3.10 #export PYTHON_VERSION=$( $(brew --prefix)/opt/python@3.10/bin/python3 --version | cut -d ' ' -f 2 ) - curl https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macos11.pkg -o "python.pkg" + curl "https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macos11.pkg" -o "python.pkg" sudo installer -pkg python.pkg -target / python3 --version - name: Install Requirements @@ -361,7 +373,7 @@ jobs: run: | # Custom pyinstaller built with https://github.com/yt-dlp/pyinstaller-builds python devscripts/install_deps.py -o --include build python devscripts/install_deps.py --include curl-cffi - python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-5.8.0-py3-none-any.whl" + python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-6.7.0-py3-none-any.whl" - name: Prepare run: | @@ -421,7 +433,7 @@ jobs: run: | python devscripts/install_deps.py -o --include build python devscripts/install_deps.py - python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-5.8.0-py3-none-any.whl" + python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-6.7.0-py3-none-any.whl" - name: Prepare run: | @@ -475,8 +487,8 @@ jobs: run: | cd ./artifact/ # make sure SHA sums are also printed to stdout - sha256sum * | tee ../SHA2-256SUMS - sha512sum * | tee ../SHA2-512SUMS + sha256sum -- * | tee ../SHA2-256SUMS + sha512sum -- * | tee ../SHA2-512SUMS - name: Make Update spec run: | diff --git a/yt-dlp/pyproject.toml b/yt-dlp/pyproject.toml index 96cb368b6d..b746fbc964 100644 --- a/yt-dlp/pyproject.toml +++ b/yt-dlp/pyproject.toml @@ -62,7 +62,7 @@ build = [ "build", "hatchling", "pip", - "setuptools>=66.1.0,<70", + "setuptools", "wheel", ] dev = [ @@ -78,8 +78,7 @@ test = [ "pytest~=8.1", ] pyinstaller = [ - "pyinstaller>=6.3; sys_platform!='darwin'", - "pyinstaller==5.13.2; sys_platform=='darwin'", # needed for curl_cffi + "pyinstaller>=6.7.0", # for compat with setuptools>=70 ] py2exe = [ "py2exe>=0.12", diff --git a/yt-dlp/yt_dlp/extractor/patreon.py b/yt-dlp/yt_dlp/extractor/patreon.py index 6c441ff34c..efbface4b4 100644 --- a/yt-dlp/yt_dlp/extractor/patreon.py +++ b/yt-dlp/yt_dlp/extractor/patreon.py @@ -486,7 +486,8 @@ class PatreonCampaignIE(PatreonBaseIE): campaign_id, vanity = self._match_valid_url(url).group('campaign_id', 'vanity') if campaign_id is None: webpage = self._download_webpage(url, vanity, headers={'User-Agent': self.USER_AGENT}) - campaign_id = self._search_regex(r'https://www.patreon.com/api/campaigns/(\d+)/?', webpage, 'Campaign ID') + campaign_id = self._search_nextjs_data( + webpage, vanity)['props']['pageProps']['bootstrapEnvelope']['pageBootstrap']['campaign']['data']['id'] params = { 'json-api-use-default-includes': 'false',