Skip to content

Commit 086a855

Browse files
committed
add warp endpoints, disable warp tricks temporarly, fix bugs and improvements
1 parent a8d9a93 commit 086a855

File tree

12 files changed

+319
-228
lines changed

12 files changed

+319
-228
lines changed

cmd/cmd_warp.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99

1010
"github.com/hiddify/hiddify-core/v2/config"
11+
"github.com/sagernet/sing-box/option"
1112
T "github.com/sagernet/sing-box/option"
1213
"github.com/spf13/cobra"
1314
)
@@ -115,7 +116,7 @@ func generateWarp() (*T.Outbound, error) {
115116
_, _, wg, err := config.GenerateWarpInfo("", "", "")
116117

117118
// fmt.Printf("%v", wgConfig)
118-
singboxConfig, err := config.GenerateWarpSingbox(*wg, "", 0, "", "", "", "")
119+
singboxConfig, err := config.GenerateWarpSingbox(*wg, "", 0, &option.WireGuardHiddify{})
119120
singboxJSON, err := json.MarshalIndent(singboxConfig, "", " ")
120121
if err != nil {
121122
fmt.Println("Error marshaling Singbox configuration:", err)

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ require (
5252
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect
5353
github.com/dustin/go-humanize v1.0.0 // indirect
5454
github.com/ebitengine/purego v0.9.1 // indirect
55-
github.com/enfein/mieru/v3 v3.17.1 // indirect
55+
github.com/enfein/mieru/v3 v3.27.0 // indirect
5656
github.com/florianl/go-nfqueue/v2 v2.0.2 // indirect
5757
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
5858
github.com/gaissmai/bart v0.18.0 // indirect
@@ -173,7 +173,7 @@ require (
173173
github.com/sagernet/sing-shadowsocks v0.2.8 // indirect
174174
github.com/sagernet/sing-shadowsocks2 v0.2.1 // indirect
175175
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 // indirect
176-
github.com/sagernet/sing-tun v0.8.0-beta.12 // indirect
176+
github.com/sagernet/sing-tun v0.8.0-beta.12
177177
github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 // indirect
178178
github.com/sagernet/smux v1.5.50-sing-box-mod.1 // indirect
179179
github.com/sagernet/wireguard-go v0.0.2-beta.1.0.20250917110311-16510ac47288 // indirect
@@ -203,11 +203,11 @@ require (
203203
)
204204

205205
require (
206-
github.com/hiddify/ray2sing v0.0.0-20260130174649-d7749fb915f8
206+
github.com/hiddify/ray2sing v0.0.0-20260131164420-b2c6a6892ca6
207207
github.com/sagernet/sing-box v1.13.0
208208
)
209209

210-
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20260130182859-20bac4443a70
210+
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20260131205637-f075aba2dbc7
211211

212212
// replace github.com/sagernet/sing-box => ../../h-sing-box
213213

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP
125125
github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A=
126126
github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
127127
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
128-
github.com/enfein/mieru/v3 v3.17.1 h1:pIKbspsKRYNyUrORVI33t1/yz2syaaUkIanskAbGBHY=
129-
github.com/enfein/mieru/v3 v3.17.1/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM=
128+
github.com/enfein/mieru/v3 v3.27.0 h1:+E/1TF7OfimS2h582atEXQxPtJMyvqUTFBJUgzn1rxg=
129+
github.com/enfein/mieru/v3 v3.27.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM=
130130
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
131131
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
132132
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -287,10 +287,10 @@ github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N
287287
github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo=
288288
github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb h1:PGufWXXDq9yaev6xX1YQauaO1MV90e6Mpoq1I7Lz/VM=
289289
github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E=
290-
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260130182859-20bac4443a70 h1:kgeG4mnISEohryFUhm8UgsQTGcrNH3NErNZpMg9OJIc=
291-
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260130182859-20bac4443a70/go.mod h1:w7rpn9RizlfaMj8aB8nj8jSYQCVQNepLwX0bpU9SatY=
292-
github.com/hiddify/ray2sing v0.0.0-20260130174649-d7749fb915f8 h1:BdLn8zZPcM8k77EjKPWqvsB756sA6E0bZZ/g6eKBozs=
293-
github.com/hiddify/ray2sing v0.0.0-20260130174649-d7749fb915f8/go.mod h1:dLOM5DLdKZ/G/ag3BdLHei+brdfqLUUHpeQKrZMV6Sg=
290+
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260131205637-f075aba2dbc7 h1:iPU6L3P7RIs60G4NxVBQAdt3QMiBfyPthK71T6oxHA8=
291+
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260131205637-f075aba2dbc7/go.mod h1:cXDQteIVhnQMAQUL2Bh7EZ0e3rkyyMV/ad05i4Rio/o=
292+
github.com/hiddify/ray2sing v0.0.0-20260131164420-b2c6a6892ca6 h1:Pjaa53eZgaCPD92PiiHmCTMwbAIG4oJgLvD6iS6d4tA=
293+
github.com/hiddify/ray2sing v0.0.0-20260131164420-b2c6a6892ca6/go.mod h1:YzE/PUCa+UjE6pGYbtUrFNQfXZ9aOj7IpulYgvSyFUw=
294294
github.com/hiddify/warp-plus v0.0.0-20240717223357-4f3122e0d11d h1:vRGKh9ou+/vQGfVYa8MczhbIVjHxlP52OWwrDWO77RA=
295295
github.com/hiddify/warp-plus v0.0.0-20240717223357-4f3122e0d11d/go.mod h1:uSRUbr1CcvFrEV69FTvuJFwpzEmwO8N4knb6+Zq3Ys4=
296296
github.com/hiddify/xray-core v0.0.0-20260124181826-59e6569c13e9 h1:VsDNLON3v+dg8Z0Nupt+EZMD6Gw/GZGqAZiru94RuzM=

v2/config/builder.go

Lines changed: 112 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
C "github.com/sagernet/sing-box/constant"
1616
mdns "github.com/sagernet/sing-box/dns"
17+
"github.com/sagernet/sing-box/hiddify/ipinfo"
1718
"github.com/sagernet/sing-box/option"
1819
dns "github.com/sagernet/sing-dns"
1920
"github.com/sagernet/sing/common/json/badoption"
@@ -62,11 +63,6 @@ func BuildConfig(ctx context.Context, hopts *HiddifyOptions, inputOpt *ReadOptio
6263
options.Route = input.Route
6364
}
6465

65-
if hopts.Warp.EnableWarp && hopts.Warp.Mode == "warp_over_proxy" {
66-
OutboundMainProxyTag = WARPConfigTag
67-
} else {
68-
OutboundMainProxyTag = OutboundSelectTag
69-
}
7066
setClashAPI(&options, hopts)
7167
setLog(&options, hopts)
7268
setInbound(&options, hopts)
@@ -107,46 +103,37 @@ func getHostnameIfNotIP(inp string) (string, error) {
107103

108104
func setOutbounds(options *option.Options, input *option.Options, opt *HiddifyOptions, staticIPs *map[string][]string) error {
109105
var outbounds []option.Outbound
106+
var endpoints []option.Endpoint
110107
var tags []string
111108
// OutboundMainProxyTag = OutboundSelectTag
112109
// inbound==warp over proxies
113110
// outbound==proxies over warp
114-
if opt.Warp.EnableWarp {
115-
for _, out := range input.Outbounds {
116-
if out.Type == C.TypeCustom {
117-
opts := out.Options.(map[string]any)
118-
if warp, ok := opts["warp"].(map[string]any); ok {
119-
key, _ := warp["key"].(string)
120-
if key == "p1" {
121-
opt.Warp.EnableWarp = false
122-
break
123-
}
124-
}
125-
}
126-
if out.Type == C.TypeWireGuard {
127-
opts := out.Options.(option.WireGuardEndpointOptions)
128-
if opts.PrivateKey == opt.Warp.WireguardConfig.PrivateKey || opts.PrivateKey == "p1" {
129-
opt.Warp.EnableWarp = false
130-
break
131-
}
132-
}
133-
}
134-
}
111+
OutboundMainProxyTag = OutboundSelectTag
135112
if opt.Warp.EnableWarp && (opt.Warp.Mode == "warp_over_proxy" || opt.Warp.Mode == "proxy_over_warp") {
136-
wg := getOrGenerateWarpLocallyIfNeeded(&opt.Warp)
137-
out, err := GenerateWarpSingbox(wg, opt.Warp.CleanIP, opt.Warp.CleanPort, opt.Warp.FakePackets, opt.Warp.FakePacketSize, opt.Warp.FakePacketDelay, opt.Warp.FakePacketMode)
113+
// wg := getOrGenerateWarpLocallyIfNeeded(&opt.Warp)
114+
115+
// out, err := GenerateWarpSingbox(wg, opt.Warp.CleanIP, opt.Warp.CleanPort, &option.WireGuardHiddify{
116+
// FakePackets: opt.Warp.FakePackets,
117+
// FakePacketsSize: opt.Warp.FakePacketSize,
118+
// FakePacketsDelay: opt.Warp.FakePacketDelay,
119+
// FakePacketsMode: opt.Warp.FakePacketMode,
120+
// })
121+
out, err := GenerateWarpSingboxNew("p1", &option.WireGuardHiddify{})
138122
if err != nil {
139123
return fmt.Errorf("failed to generate warp config: %v", err)
140124
}
141125
out.Tag = WARPConfigTag
142-
opts := out.Options.(option.WireGuardEndpointOptions)
143-
if opt.Warp.Mode == "warp_over_proxy" {
144-
opts.Detour = OutboundSelectTag
145-
} else {
146-
opts.Detour = OutboundDirectTag
126+
if opts, ok := out.Options.(*option.WireGuardEndpointOptions); ok {
127+
if opt.Warp.Mode == "warp_over_proxy" {
128+
opts.Detour = OutboundSelectTag
129+
} else {
130+
opts.Detour = OutboundDirectTag
131+
}
147132
}
148-
patchWarp(out, opt, true, nil)
149-
outbounds = append(outbounds, *out)
133+
134+
OutboundMainProxyTag = WARPConfigTag
135+
// patchWarp(out, opt, true, nil)
136+
endpoints = append(endpoints, *out)
150137
}
151138
for _, out := range input.Outbounds {
152139
if contains(PredefinedOutboundTags, out.Tag) {
@@ -166,30 +153,62 @@ func setOutbounds(options *option.Options, input *option.Options, opt *HiddifyOp
166153
case C.TypeCustom:
167154
continue
168155
default:
169-
if opt.Warp.EnableWarp && opt.Warp.Mode == "warp_over_proxy" && out.Tag == WARPConfigTag {
170-
continue
171-
}
156+
172157
if contains([]string{"direct", "bypass", "block"}, out.Tag) {
173158
continue
174159
}
175160
if !strings.Contains(out.Tag, "§hide§") {
176161
tags = append(tags, out.Tag)
177162
}
178-
out = patchHiddifyWarpFromConfig(out, *opt)
163+
out = *patchHiddifyWarpFromConfig(&out, *opt)
179164
outbounds = append(outbounds, out)
180165
}
181166
}
182-
testurls := []string{opt.ConnectionTestUrl, "http://captive.apple.com/generate_204", "https://cp.cloudflare.com", "https://google.com/generate_204"}
183-
if isBlockedConnectionTestUrl(opt.ConnectionTestUrl) {
184-
testurls = []string{opt.ConnectionTestUrl}
167+
for _, end := range input.Endpoints {
168+
if opt.Warp.EnableWarp {
169+
if end.Type == C.TypeWARP {
170+
if opts, ok := end.Options.(*option.WireGuardWARPEndpointOptions); ok {
171+
if opts.UniqueIdentifier == "p1" {
172+
continue
173+
}
174+
}
175+
}
176+
if end.Type == C.TypeWireGuard {
177+
if opts, ok := end.Options.(*option.WireGuardEndpointOptions); ok {
178+
if opts.PrivateKey == opt.Warp.WireguardConfig.PrivateKey {
179+
continue
180+
}
181+
}
182+
}
183+
if opt.Warp.Mode == "warp_over_proxy" && end.Tag == WARPConfigTag {
184+
continue
185+
}
186+
}
187+
188+
out, err := patchEndpoint(end, *opt, staticIPs)
189+
if err != nil {
190+
return err
191+
}
192+
193+
if !strings.Contains(out.Tag, "§hide§") {
194+
tags = append(tags, out.Tag)
195+
}
196+
197+
endpoints = append(endpoints, *out)
198+
}
199+
if len(opt.ConnectionTestUrls) == 0 {
200+
opt.ConnectionTestUrls = []string{opt.ConnectionTestUrl, "http://captive.apple.com/generate_204", "https://cp.cloudflare.com", "https://google.com/generate_204"}
201+
if isBlockedConnectionTestUrl(opt.ConnectionTestUrl) {
202+
opt.ConnectionTestUrls = []string{opt.ConnectionTestUrl}
203+
}
185204
}
186205
urlTest := option.Outbound{
187206
Type: C.TypeURLTest,
188207
Tag: OutboundURLTestTag,
189208
Options: &option.URLTestOutboundOptions{
190209
Outbounds: tags,
191210
URL: opt.ConnectionTestUrl,
192-
URLs: testurls,
211+
URLs: opt.ConnectionTestUrls,
193212
Interval: badoption.Duration(opt.URLTestInterval.Duration()),
194213
// IdleTimeout: badoption.Duration(opt.URLTestIdleTimeout.Duration()),
195214
Tolerance: 1,
@@ -215,7 +234,7 @@ func setOutbounds(options *option.Options, input *option.Options, opt *HiddifyOp
215234
}
216235

217236
outbounds = append([]option.Outbound{selector, urlTest}, outbounds...)
218-
237+
options.Endpoints = endpoints
219238
options.Outbounds = append(
220239
outbounds,
221240
[]option.Outbound{
@@ -277,8 +296,9 @@ func setClashAPI(options *option.Options, opt *HiddifyOptions) {
277296
},
278297

279298
CacheFile: &option.CacheFileOptions{
280-
Enabled: true,
281-
Path: "data/clash.db",
299+
Enabled: true,
300+
StoreWARPConfig: true,
301+
Path: "data/clash.db",
282302
},
283303
}
284304
}
@@ -418,22 +438,57 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
418438
// // )
419439
// }
420440

421-
dnsRules = append(dnsRules, option.DefaultDNSRule{
422-
RawDefaultDNSRule: option.RawDefaultDNSRule{},
423-
DNSRuleAction: option.DNSRuleAction{
424-
Action: C.RuleActionTypeRoute,
425-
RouteOptions: option.DNSRouteActionOptions{
426-
Server: DNSStaticTag,
427-
},
428-
},
429-
},
430-
)
441+
// dnsRules = append(dnsRules, option.DefaultDNSRule{
442+
// RawDefaultDNSRule: option.RawDefaultDNSRule{},
443+
// DNSRuleAction: option.DNSRuleAction{
444+
// Action: C.RuleActionTypeRoute,
445+
// RouteOptions: option.DNSRouteActionOptions{
446+
// Server: DNSStaticTag,
447+
// },
448+
// },
449+
// },
450+
// )
431451
forceDirectRules, err := addForceDirect(options, hopt)
432452
if err != nil {
433453
return err
434454
}
435455
dnsRules = append(dnsRules, forceDirectRules...)
436456

457+
if len(hopt.ConnectionTestUrls) > 0 { //To avoid dns bug when using urltest
458+
domains := []string{}
459+
for _, url := range hopt.ConnectionTestUrls {
460+
if host, err := getHostnameIfNotIP(url); err == nil {
461+
domains = append(domains, host)
462+
}
463+
}
464+
if len(domains) > 0 {
465+
dnsRules = append(dnsRules, option.DefaultDNSRule{
466+
RawDefaultDNSRule: option.RawDefaultDNSRule{
467+
Domain: domains,
468+
},
469+
DNSRuleAction: option.DNSRuleAction{
470+
Action: C.RuleActionTypeRoute,
471+
RouteOptions: option.DNSRouteActionOptions{
472+
Server: DNSDirectTag,
473+
},
474+
},
475+
})
476+
}
477+
}
478+
if ipinfoDomains := ipinfo.GetAllIPCheckerDomainsDomains(); len(ipinfoDomains) > 0 { //To avoid dns bug when using urltest
479+
dnsRules = append(dnsRules, option.DefaultDNSRule{
480+
RawDefaultDNSRule: option.RawDefaultDNSRule{
481+
Domain: ipinfoDomains,
482+
},
483+
DNSRuleAction: option.DNSRuleAction{
484+
Action: C.RuleActionTypeRoute,
485+
RouteOptions: option.DNSRouteActionOptions{
486+
Server: DNSDirectTag,
487+
},
488+
},
489+
})
490+
}
491+
437492
routeRules = append(routeRules, option.Rule{
438493
Type: C.RuleTypeDefault,
439494
DefaultOptions: option.DefaultRule{
@@ -871,7 +926,7 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
871926
return nil
872927
}
873928

874-
func patchHiddifyWarpFromConfig(out option.Outbound, opt HiddifyOptions) option.Outbound {
929+
func patchHiddifyWarpFromConfig(out *option.Outbound, opt HiddifyOptions) *option.Outbound {
875930
if opt.Warp.EnableWarp && opt.Warp.Mode == "proxy_over_warp" {
876931
if opts, ok := out.Options.(option.DialerOptionsWrapper); ok {
877932
dialer := opts.TakeDialerOptions()

v2/config/hiddify_option.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ type InboundOptions struct {
5858
}
5959

6060
type URLTestOptions struct {
61-
ConnectionTestUrl string `json:"connection-test-url,omitempty" overridable:"true"`
62-
URLTestInterval DurationInSeconds `json:"url-test-interval,omitempty" overridable:"true"`
61+
ConnectionTestUrl string `json:"connection-test-url,omitempty" overridable:"true"`
62+
ConnectionTestUrls []string `json:"connection-test-urls,omitempty" overridable:"true"`
63+
URLTestInterval DurationInSeconds `json:"url-test-interval,omitempty" overridable:"true"`
6364
// URLTestIdleTimeout DurationInSeconds `json:"url-test-idle-timeout"`
6465
}
6566

v2/config/outbound.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func patchOutboundTLSTricks(base option.Outbound, configOpt HiddifyOptions) opti
6565
}
6666
tls.TLSTricks.MixedCaseSNI = tls.TLSTricks.MixedCaseSNI || configOpt.TLSTricks.MixedSNICase
6767

68-
if configOpt.TLSTricks.EnablePadding {
68+
if false && configOpt.TLSTricks.EnablePadding {
6969
tls.TLSTricks.PaddingMode = "random"
7070
tls.TLSTricks.PaddingSize = configOpt.TLSTricks.PaddingSize
7171
tls.UTLS = &option.OutboundUTLSOptions{
@@ -124,14 +124,17 @@ func isOutboundReality(base option.Outbound) bool {
124124
return tls.Reality.Enabled
125125
}
126126

127-
func patchOutbound(base option.Outbound, configOpt HiddifyOptions, staticIPs *map[string][]string) (*option.Outbound, error) {
127+
func patchEndpoint(base option.Endpoint, configOpt HiddifyOptions, staticIPs *map[string][]string) (*option.Endpoint, error) {
128128
formatErr := func(err error) error {
129129
return fmt.Errorf("error patching outbound[%s][%s]: %w", base.Tag, base.Type, err)
130130
}
131131
err := patchWarp(&base, &configOpt, true, *staticIPs)
132132
if err != nil {
133133
return nil, formatErr(err)
134134
}
135+
return &base, nil
136+
}
137+
func patchOutbound(base option.Outbound, configOpt HiddifyOptions, staticIPs *map[string][]string) (*option.Outbound, error) {
135138

136139
base = patchOutboundTLSTricks(base, configOpt)
137140

v2/config/parser.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ func patchConfigStr(ctx context.Context, content []byte, name string, configOpt
119119
return patchConfigOptions(ctx, &options, name, configOpt)
120120
}
121121
func patchConfigOptions(ctx context.Context, options *option.Options, name string, configOpt *HiddifyOptions) (*option.Options, error) {
122-
b, _ := batch.New(ctx, batch.WithConcurrencyNum[*option.Outbound](2))
123-
for _, base := range options.Outbounds {
122+
b, _ := batch.New(ctx, batch.WithConcurrencyNum[*option.Endpoint](2))
123+
for _, base := range options.Endpoints {
124124
out := base
125-
b.Go(base.Tag, func() (*option.Outbound, error) {
125+
b.Go(base.Tag, func() (*option.Endpoint, error) {
126126
err := patchWarp(&out, configOpt, false, nil)
127127
if err != nil {
128128
return nil, fmt.Errorf("[Warp] patch warp error: %w", err)
@@ -134,8 +134,8 @@ func patchConfigOptions(ctx context.Context, options *option.Options, name strin
134134
if res, err := b.WaitAndGetResult(); err != nil {
135135
return nil, err
136136
} else {
137-
for i, base := range options.Outbounds {
138-
options.Outbounds[i] = *res[base.Tag].Value
137+
for i, base := range options.Endpoints {
138+
options.Endpoints[i] = *res[base.Tag].Value
139139
}
140140
}
141141

0 commit comments

Comments
 (0)