Update On Tue Sep 2 20:34:32 CEST 2025

This commit is contained in:
github-action[bot]
2025-09-02 20:34:32 +02:00
parent 67658a70aa
commit 9c4159996c
84 changed files with 2904 additions and 12647 deletions
+1
View File
@@ -1108,3 +1108,4 @@ Update On Fri Aug 29 20:33:46 CEST 2025
Update On Sat Aug 30 20:36:28 CEST 2025
Update On Sun Aug 31 20:34:00 CEST 2025
Update On Mon Sep 1 20:35:55 CEST 2025
Update On Tue Sep 2 20:34:24 CEST 2025
@@ -139,9 +139,10 @@ class ProfileManager(private val context: Context) : IProfileManager,
suspend fun updateFlow(old: Imported) {
val client = OkHttpClient()
try {
val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName
val request = Request.Builder()
.url(old.source)
.header("User-Agent", "ClashforWindows/0.19.23")
.header("User-Agent", "ClashMetaForAndroid/$versionName")
.build()
client.newCall(request).execute().use { response ->
@@ -76,9 +76,10 @@ object ProfileProcessor {
if (snapshot?.type == Profile.Type.Url) {
if (snapshot.source.startsWith("https://", true)) {
val client = OkHttpClient()
val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName
val request = Request.Builder()
.url(snapshot.source)
.header("User-Agent", "ClashforWindows/0.19.23")
.header("User-Agent", "ClashMetaForAndroid/$versionName")
.build()
client.newCall(request).execute().use { response ->
+34 -28
View File
@@ -87,26 +87,26 @@ type WireGuardPeerOption struct {
}
type AmneziaWGOption struct {
JC int `proxy:"jc,omitempty"`
JMin int `proxy:"jmin,omitempty"`
JMax int `proxy:"jmax,omitempty"`
S1 int `proxy:"s1,omitempty"`
S2 int `proxy:"s2,omitempty"`
H1 uint32 `proxy:"h1,omitempty"`
H2 uint32 `proxy:"h2,omitempty"`
H3 uint32 `proxy:"h3,omitempty"`
H4 uint32 `proxy:"h4,omitempty"`
// AmneziaWG v1.5
I1 string `proxy:"i1,omitempty"`
I2 string `proxy:"i2,omitempty"`
I3 string `proxy:"i3,omitempty"`
I4 string `proxy:"i4,omitempty"`
I5 string `proxy:"i5,omitempty"`
J1 string `proxy:"j1,omitempty"`
J2 string `proxy:"j2,omitempty"`
J3 string `proxy:"j3,omitempty"`
Itime int64 `proxy:"itime,omitempty"`
JC int `proxy:"jc,omitempty"`
JMin int `proxy:"jmin,omitempty"`
JMax int `proxy:"jmax,omitempty"`
S1 int `proxy:"s1,omitempty"`
S2 int `proxy:"s2,omitempty"`
S3 int `proxy:"s3,omitempty"` // AmneziaWG v1.5 and v2
S4 int `proxy:"s4,omitempty"` // AmneziaWG v1.5 and v2
H1 string `proxy:"h1,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
H2 string `proxy:"h2,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
H3 string `proxy:"h3,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
H4 string `proxy:"h4,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
I1 string `proxy:"i1,omitempty"` // AmneziaWG v1.5 and v2
I2 string `proxy:"i2,omitempty"` // AmneziaWG v1.5 and v2
I3 string `proxy:"i3,omitempty"` // AmneziaWG v1.5 and v2
I4 string `proxy:"i4,omitempty"` // AmneziaWG v1.5 and v2
I5 string `proxy:"i5,omitempty"` // AmneziaWG v1.5 and v2
J1 string `proxy:"j1,omitempty"` // AmneziaWG v1.5 only (removed in v2)
J2 string `proxy:"j2,omitempty"` // AmneziaWG v1.5 only (removed in v2)
J3 string `proxy:"j3,omitempty"` // AmneziaWG v1.5 only (removed in v2)
Itime int64 `proxy:"itime,omitempty"` // AmneziaWG v1.5 only (removed in v2)
}
type wgSingErrorHandler struct {
@@ -412,17 +412,23 @@ func (w *WireGuard) genIpcConf(ctx context.Context, updateOnly bool) (string, er
if w.option.AmneziaWGOption.S2 != 0 {
ipcConf += "s2=" + strconv.Itoa(w.option.AmneziaWGOption.S2) + "\n"
}
if w.option.AmneziaWGOption.H1 != 0 {
ipcConf += "h1=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H1), 10) + "\n"
if w.option.AmneziaWGOption.S3 != 0 {
ipcConf += "s3=" + strconv.Itoa(w.option.AmneziaWGOption.S3) + "\n"
}
if w.option.AmneziaWGOption.H2 != 0 {
ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n"
if w.option.AmneziaWGOption.S4 != 0 {
ipcConf += "s4=" + strconv.Itoa(w.option.AmneziaWGOption.S4) + "\n"
}
if w.option.AmneziaWGOption.H3 != 0 {
ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n"
if w.option.AmneziaWGOption.H1 != "" {
ipcConf += "h1=" + w.option.AmneziaWGOption.H1 + "\n"
}
if w.option.AmneziaWGOption.H4 != 0 {
ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n"
if w.option.AmneziaWGOption.H2 != "" {
ipcConf += "h2=" + w.option.AmneziaWGOption.H2 + "\n"
}
if w.option.AmneziaWGOption.H3 != "" {
ipcConf += "h3=" + w.option.AmneziaWGOption.H3 + "\n"
}
if w.option.AmneziaWGOption.H4 != "" {
ipcConf += "h4=" + w.option.AmneziaWGOption.H4 + "\n"
}
if w.option.AmneziaWGOption.I1 != "" {
ipcConf += "i1=" + w.option.AmneziaWGOption.I1 + "\n"
+19 -14
View File
@@ -862,20 +862,25 @@ proxies: # socks5
# jmax: 501
# s1: 30
# s2: 40
# h1: 123456
# h2: 67543
# h4: 32345
# h3: 123123
# # AmneziaWG v1.5
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10>
# i2: <b 0xf6ab3267fa><r 100>
# i3: ""
# i4: ""
# i5: ""
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10>
# j2: <c><b 0xf6ab><t><wt 1000>
# j3: <t><b 0xf6ab><c><r 10>
# itime: 60
# s3: 50 # AmneziaWG v1.5 and v2
# s4: 5 # AmneziaWG v1.5 and v2
# h1: 123456 # AmneziaWG v1.0 and v1.5
# h2: 67543 # AmneziaWG v1.0 and v1.5
# h3: 123123 # AmneziaWG v1.0 and v1.5
# h4: 32345 # AmneziaWG v1.0 and v1.5
# h1: 123456-123500 # AmneziaWG v2.0 only
# h2: 67543-67550 # AmneziaWG v2.0 only
# h3: 123123-123200 # AmneziaWG v2.0 only
# h4: 32345-32350 # AmneziaWG v2.0 only
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10> # AmneziaWG v1.5 and v2
# i2: <b 0xf6ab3267fa><r 100> # AmneziaWG v1.5 and v2
# i3: "" # AmneziaWG v1.5 and v2
# i4: "" # AmneziaWG v1.5 and v2
# i5: "" # AmneziaWG v1.5 and v2
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10> # AmneziaWG v1.5 only (removed in v2)
# j2: <c><b 0xf6ab><t><wt 1000> # AmneziaWG v1.5 only (removed in v2)
# j3: <t><b 0xf6ab><c><r 10> # AmneziaWG v1.5 only (removed in v2)
# itime: 60 # AmneziaWG v1.5 only (removed in v2)
# tuic
- name: tuic
+1 -1
View File
@@ -14,7 +14,7 @@ require (
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905
github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20
github.com/mdlayher/netlink v1.7.2
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281
github.com/metacubex/bart v0.20.5
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b
github.com/metacubex/blake3 v0.1.0
+2 -2
View File
@@ -90,8 +90,8 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/
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/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a h1:c1QSGpacSeQdBdWcEKZKGuWLcqIG2wxHEygAcXuDwS4=
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 h1:09EM0sOLb2kfL0KETGhHujsBLB5iy5U/2yHRHsxf/pI=
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM=
github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc=
github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM=
@@ -11,10 +11,10 @@
"build": "tsc"
},
"dependencies": {
"@tanstack/react-query": "5.85.5",
"@tanstack/react-query": "5.85.6",
"@tauri-apps/api": "2.6.0",
"ahooks": "3.9.4",
"dayjs": "1.11.13",
"dayjs": "1.11.18",
"lodash-es": "4.17.21",
"ofetch": "1.4.1",
"react": "19.1.1",
@@ -30,7 +30,7 @@
"allotment": "1.20.4",
"country-code-emoji": "2.3.0",
"country-emoji": "1.5.6",
"dayjs": "1.11.13",
"dayjs": "1.11.18",
"framer-motion": "12.23.12",
"i18next": "25.4.2",
"jotai": "2.13.1",
@@ -58,10 +58,10 @@
"@emotion/react": "11.14.0",
"@iconify/json": "2.2.380",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.85.5",
"@tanstack/react-router": "1.131.31",
"@tanstack/react-router-devtools": "1.131.31",
"@tanstack/router-plugin": "1.131.31",
"@tanstack/react-query": "5.85.6",
"@tanstack/react-router": "1.131.32",
"@tanstack/react-router-devtools": "1.131.32",
"@tanstack/router-plugin": "1.131.32",
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
"@tauri-apps/plugin-dialog": "2.3.0",
"@tauri-apps/plugin-fs": "2.4.0",
+3 -3
View File
@@ -2,10 +2,10 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.13",
"mihomo_alpha": "alpha-33cde65",
"mihomo_alpha": "alpha-3b63fef",
"clash_rs": "v0.9.0",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.9.0-alpha+sha.117a718"
"clash_rs_alpha": "0.9.0-alpha+sha.37539fb"
},
"arch_template": {
"mihomo": {
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-08-31T22:20:48.313Z"
"updated_at": "2025-09-01T22:21:14.176Z"
}
+1 -1
View File
@@ -109,7 +109,7 @@
"typescript": "5.9.2",
"typescript-eslint": "8.41.0"
},
"packageManager": "pnpm@10.15.0",
"packageManager": "pnpm@10.15.1",
"engines": {
"node": "22.18.0"
},
+69 -69
View File
@@ -176,8 +176,8 @@ importers:
frontend/interface:
dependencies:
'@tanstack/react-query':
specifier: 5.85.5
version: 5.85.5(react@19.1.1)
specifier: 5.85.6
version: 5.85.6(react@19.1.1)
'@tauri-apps/api':
specifier: 2.6.0
version: 2.6.0
@@ -185,8 +185,8 @@ importers:
specifier: 3.9.4
version: 3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
dayjs:
specifier: 1.11.13
version: 1.11.13
specifier: 1.11.18
version: 1.11.18
lodash-es:
specifier: 4.17.21
version: 4.17.21
@@ -238,7 +238,7 @@ importers:
version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@mui/x-date-pickers':
specifier: 8.10.2
version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@nyanpasu/interface':
specifier: workspace:^
version: link:../interface
@@ -250,7 +250,7 @@ importers:
version: 4.1.12
'@tanstack/router-zod-adapter':
specifier: 1.81.5
version: 1.81.5(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)
version: 1.81.5(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)
'@tauri-apps/api':
specifier: 2.6.0
version: 2.6.0
@@ -270,8 +270,8 @@ importers:
specifier: 1.5.6
version: 1.5.6
dayjs:
specifier: 1.11.13
version: 1.11.13
specifier: 1.11.18
version: 1.11.18
framer-motion:
specifier: 12.23.12
version: 12.23.12(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
@@ -280,13 +280,13 @@ importers:
version: 25.4.2(typescript@5.9.2)
jotai:
specifier: 2.13.1
version: 2.13.1(@babel/core@7.26.10)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1)
version: 2.13.1(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1)
json-schema:
specifier: 0.4.0
version: 0.4.0
material-react-table:
specifier: npm:@greenhat616/material-react-table@4.0.0
version: '@greenhat616/material-react-table@4.0.0(8c5184cacde5eaa7b33c3b8210f40105)'
version: '@greenhat616/material-react-table@4.0.0(9173903a3b01e6e6c7f2384a2071a1b9)'
monaco-editor:
specifier: 0.52.2
version: 0.52.2
@@ -307,7 +307,7 @@ importers:
version: 1.6.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
react-hook-form-mui:
specifier: 7.6.2
version: 7.6.2(58abb2a4187b63d3bc2ea3bcc4bbaf7a)
version: 7.6.2(82e2072ebaeb0c3b1c2692596120d0e5)
react-i18next:
specifier: 15.7.2
version: 15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)
@@ -349,17 +349,17 @@ importers:
specifier: 4.7.0
version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/react-query':
specifier: 5.85.5
version: 5.85.5(react@19.1.1)
specifier: 5.85.6
version: 5.85.6(react@19.1.1)
'@tanstack/react-router':
specifier: 1.131.31
version: 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
specifier: 1.131.32
version: 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/react-router-devtools':
specifier: 1.131.31
version: 1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.30)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)
specifier: 1.131.32
version: 1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.32)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)
'@tanstack/router-plugin':
specifier: 1.131.31
version: 1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))
specifier: 1.131.32
version: 1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.3.0
version: 2.3.0
@@ -3019,24 +3019,24 @@ packages:
resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==}
engines: {node: '>=12'}
'@tanstack/query-core@5.85.5':
resolution: {integrity: sha512-KO0WTob4JEApv69iYp1eGvfMSUkgw//IpMnq+//cORBzXf0smyRwPLrUvEe5qtAEGjwZTXrjxg+oJNP/C00t6w==}
'@tanstack/query-core@5.85.6':
resolution: {integrity: sha512-hCj0TktzdCv2bCepIdfwqVwUVWb+GSHm1Jnn8w+40lfhQ3m7lCO7ADRUJy+2unxQ/nzjh2ipC6ye69NDW3l73g==}
'@tanstack/react-query@5.85.5':
resolution: {integrity: sha512-/X4EFNcnPiSs8wM2v+b6DqS5mmGeuJQvxBglmDxl6ZQb5V26ouD2SJYAcC3VjbNwqhY2zjxVD15rDA5nGbMn3A==}
'@tanstack/react-query@5.85.6':
resolution: {integrity: sha512-VUAag4ERjh+qlmg0wNivQIVCZUrYndqYu3/wPCVZd4r0E+1IqotbeyGTc+ICroL/PqbpSaGZg02zSWYfcvxbdA==}
peerDependencies:
react: ^18 || ^19
'@tanstack/react-router-devtools@1.131.31':
resolution: {integrity: sha512-M6zWv5d3BAleBFBgqqHGsGOzfaAVCRcLGaWxDdCFEF9RnJU7WvdUiIrAoFwS1Byg6MTd2IW/9LnjOxrR9xlCWQ==}
'@tanstack/react-router-devtools@1.131.32':
resolution: {integrity: sha512-7Pf25kSEJfAUqYlxuQb+Nquy7YUO1rOsrbYeeU1rv0WYSiyB0dOAOZmcRmQ0zl2TCtEkZnepcL5Hbmb5CamMBA==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.131.31
'@tanstack/react-router': ^1.131.32
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-router@1.131.31':
resolution: {integrity: sha512-fN71d3BfRD46fpPwaoTf1hcuVWU9bJV5x6y2yyzaz9qDttwZR5RmPK/oi5zSo7o3kvWp4CND9bVjBzSK1BaUcg==}
'@tanstack/react-router@1.131.32':
resolution: {integrity: sha512-QvT7vV8ic7jOh3U8c2FkzdnHZ7eejPaneNQacJm4Op28aSpkFRwIU3S15pPYqyiLr8DnG5L75ADfSqlJ18ZGpw==}
engines: {node: '>=12'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
@@ -3061,15 +3061,15 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@tanstack/router-core@1.131.30':
resolution: {integrity: sha512-fBHn6MSqodYZfky7Z4UyXaxYdIom2QpwaBmra9eM9SRUHmbSCQJ2CESQzGzxFDENtvtyXGsSpGbe7k7GTJctKw==}
'@tanstack/router-core@1.131.32':
resolution: {integrity: sha512-6pIX4ZS6tyxVTQKAKsGE6xl6S7OekyPPRqEbOTmIxUJ5vBL0iAu3ir7YTk5a7PEM6lDe/nUI2oVV5zkarEEiPQ==}
engines: {node: '>=12'}
'@tanstack/router-devtools-core@1.131.30':
resolution: {integrity: sha512-DA1QwJbH58b4rQEZ3UYyHnOsEfN59yT8Oyl7t4q3orahp4qc0Y1BIFcIeI2sYhVs/+7iMsQ7eLaR1j55vl0TwQ==}
'@tanstack/router-devtools-core@1.131.32':
resolution: {integrity: sha512-VQPAA/B9L68hl16KyIonUEooJOfL75rJJjfashcVGDRsssGCCfCjvHS8Cw0mSYeVJ0iawgKPdIUyCZAqGycYAg==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/router-core': ^1.131.30
'@tanstack/router-core': ^1.131.32
csstype: ^3.0.10
solid-js: '>=1.9.5'
tiny-invariant: ^1.3.3
@@ -3077,16 +3077,16 @@ packages:
csstype:
optional: true
'@tanstack/router-generator@1.131.30':
resolution: {integrity: sha512-6mK+xiQEWn5vgL+EAJkTU7FMvYJstJ+GL0aP/O4YHcxxgQd0kkEaKT4NfwfNKFnBEYE3qIkLbsPi0W2OUK1JaQ==}
'@tanstack/router-generator@1.131.32':
resolution: {integrity: sha512-HQVnytwHBFr4frvsqwl4hLNYtvXp73ttoQOZyLwhxqUdMSoQ4F26sJ1RYKPGGhRaLfBqnGbTX6tLq5hm/ePBVQ==}
engines: {node: '>=12'}
'@tanstack/router-plugin@1.131.31':
resolution: {integrity: sha512-S06efeEC8VM+LkC5JbYgA+aYxe3INwAzVZFU4Omy1yvYNPrYCSLq0gEu8vqC+zjQdJh8y6ReqVEgLse8br4DWw==}
'@tanstack/router-plugin@1.131.32':
resolution: {integrity: sha512-HKrBXnlRkhvXGWYPaRl1ASj3Y++7Y0nGKeTFgHSc2nIzlcuPTHr5DROr3nC2DsfPxAkvUzPVpUNpMb0cbMcqHw==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
'@tanstack/react-router': ^1.131.31
'@tanstack/react-router': ^1.131.32
vite: '>=5.0.0 || >=6.0.0'
vite-plugin-solid: ^2.11.2
webpack: '>=5.92.0'
@@ -4556,8 +4556,8 @@ packages:
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
engines: {node: '>= 0.4'}
dayjs@1.11.13:
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
dayjs@1.11.18:
resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
@@ -10148,13 +10148,13 @@ snapshots:
'@fastify/busboy@2.1.1': {}
'@greenhat616/material-react-table@4.0.0(8c5184cacde5eaa7b33c3b8210f40105)':
'@greenhat616/material-react-table@4.0.0(9173903a3b01e6e6c7f2384a2071a1b9)':
dependencies:
'@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
'@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
'@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/match-sorter-utils': 8.19.4
'@tanstack/react-table': 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/react-virtual': 3.13.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
@@ -10404,7 +10404,7 @@ snapshots:
optionalDependencies:
'@types/react': 19.1.12
'@mui/x-date-pickers@8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
'@mui/x-date-pickers@8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
dependencies:
'@babel/runtime': 7.28.2
'@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
@@ -10420,7 +10420,7 @@ snapshots:
optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
dayjs: 1.11.13
dayjs: 1.11.18
transitivePeerDependencies:
- '@types/react'
@@ -11304,17 +11304,17 @@ snapshots:
dependencies:
remove-accents: 0.5.0
'@tanstack/query-core@5.85.5': {}
'@tanstack/query-core@5.85.6': {}
'@tanstack/react-query@5.85.5(react@19.1.1)':
'@tanstack/react-query@5.85.6(react@19.1.1)':
dependencies:
'@tanstack/query-core': 5.85.5
'@tanstack/query-core': 5.85.6
react: 19.1.1
'@tanstack/react-router-devtools@1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.30)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
'@tanstack/react-router-devtools@1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.32)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/react-router': 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/router-devtools-core': 1.131.30(@tanstack/router-core@1.131.30)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
'@tanstack/react-router': 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/router-devtools-core': 1.131.32(@tanstack/router-core@1.131.32)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
react: 19.1.1
react-dom: 19.1.1(react@19.1.1)
transitivePeerDependencies:
@@ -11323,11 +11323,11 @@ snapshots:
- solid-js
- tiny-invariant
'@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
'@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
dependencies:
'@tanstack/history': 1.131.2
'@tanstack/react-store': 0.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/router-core': 1.131.30
'@tanstack/router-core': 1.131.32
isbot: 5.1.28
react: 19.1.1
react-dom: 19.1.1(react@19.1.1)
@@ -11353,7 +11353,7 @@ snapshots:
react: 19.1.1
react-dom: 19.1.1(react@19.1.1)
'@tanstack/router-core@1.131.30':
'@tanstack/router-core@1.131.32':
dependencies:
'@tanstack/history': 1.131.2
'@tanstack/store': 0.7.0
@@ -11363,9 +11363,9 @@ snapshots:
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
'@tanstack/router-devtools-core@1.131.30(@tanstack/router-core@1.131.30)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
'@tanstack/router-devtools-core@1.131.32(@tanstack/router-core@1.131.32)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/router-core': 1.131.30
'@tanstack/router-core': 1.131.32
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
solid-js: 1.9.5
@@ -11373,9 +11373,9 @@ snapshots:
optionalDependencies:
csstype: 3.1.3
'@tanstack/router-generator@1.131.30':
'@tanstack/router-generator@1.131.32':
dependencies:
'@tanstack/router-core': 1.131.30
'@tanstack/router-core': 1.131.32
'@tanstack/router-utils': 1.131.2
'@tanstack/virtual-file-routes': 1.131.2
prettier: 3.6.2
@@ -11386,7 +11386,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-plugin@1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))':
'@tanstack/router-plugin@1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))':
dependencies:
'@babel/core': 7.28.3
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3)
@@ -11394,8 +11394,8 @@ snapshots:
'@babel/template': 7.27.2
'@babel/traverse': 7.28.3
'@babel/types': 7.28.2
'@tanstack/router-core': 1.131.30
'@tanstack/router-generator': 1.131.30
'@tanstack/router-core': 1.131.32
'@tanstack/router-generator': 1.131.32
'@tanstack/router-utils': 1.131.2
'@tanstack/virtual-file-routes': 1.131.2
babel-dead-code-elimination: 1.0.10
@@ -11403,7 +11403,7 @@ snapshots:
unplugin: 2.3.9
zod: 3.25.76
optionalDependencies:
'@tanstack/react-router': 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/react-router': 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)
transitivePeerDependencies:
- supports-color
@@ -11419,9 +11419,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)':
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)':
dependencies:
'@tanstack/react-router': 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@tanstack/react-router': 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
zod: 4.0.17
'@tanstack/store@0.7.0': {}
@@ -12133,7 +12133,7 @@ snapshots:
ahooks@3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
dependencies:
'@babel/runtime': 7.28.2
dayjs: 1.11.13
dayjs: 1.11.18
intersection-observer: 0.12.2
js-cookie: 3.0.5
lodash: 4.17.21
@@ -13023,7 +13023,7 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.2
dayjs@1.11.13: {}
dayjs@1.11.18: {}
de-indent@1.0.2: {}
@@ -14747,9 +14747,9 @@ snapshots:
jju@1.4.0: {}
jotai@2.13.1(@babel/core@7.26.10)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1):
jotai@2.13.1(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1):
optionalDependencies:
'@babel/core': 7.26.10
'@babel/core': 7.28.3
'@babel/template': 7.27.2
'@types/react': 19.1.12
react: 19.1.1
@@ -16017,14 +16017,14 @@ snapshots:
react: 19.1.1
react-dom: 19.1.1(react@19.1.1)
react-hook-form-mui@7.6.2(58abb2a4187b63d3bc2ea3bcc4bbaf7a):
react-hook-form-mui@7.6.2(82e2072ebaeb0c3b1c2692596120d0e5):
dependencies:
'@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
react: 19.1.1
react-hook-form: 7.52.1(react@19.1.1)
optionalDependencies:
'@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
react-hook-form@7.52.1(react@19.1.1):
dependencies:
@@ -35,7 +35,7 @@ it on BCM4708 family.
/* called during probe() after chip reset completes */
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -162,6 +162,49 @@ int xhci_start(struct xhci_hcd *xhci)
@@ -163,6 +163,49 @@ int xhci_start(struct xhci_hcd *xhci)
return ret;
}
@@ -73,7 +73,7 @@ it on BCM4708 family.
+ }
+
+ /* Free virt device */
+ xhci_free_virt_device(xhci, slot_id);
+ xhci_disable_and_free_slot(xhci, slot_id);
+
+ /* We're done if controller is already running */
+ if (readl(&xhci->op_regs->command) & CMD_RUN)
@@ -85,7 +85,7 @@ it on BCM4708 family.
/*
* Reset a halted HC.
*
@@ -498,6 +541,15 @@ static int xhci_run_finished(struct xhci
@@ -500,6 +543,15 @@ static int xhci_run_finished(struct xhci
return -ENODEV;
}
@@ -28,7 +28,7 @@ Link: https://lore.kernel.org/linux-mtd/20231002140458.147605-1-mmkurbanov@salut
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -940,6 +940,7 @@ static const struct spinand_manufacturer
@@ -943,6 +943,7 @@ static const struct spinand_manufacturer
&alliancememory_spinand_manufacturer,
&ato_spinand_manufacturer,
&esmt_c8_spinand_manufacturer,
@@ -0,0 +1,121 @@
From: wangzijie <wangzijie1@honor.com>
To: <akpm@linux-foundation.org>, <brauner@kernel.org>,
<viro@zeniv.linux.org.uk>, <adobriyan@gmail.com>,
<rick.p.edgecombe@intel.com>, <ast@kernel.org>,
<k.shutemov@gmail.com>, <jirislaby@kernel.org>,
<linux-fsdevel@vger.kernel.org>
Cc: <polynomial-c@gmx.de>, <gregkh@linuxfoundation.org>,
<stable@vger.kernel.org>, <regressions@lists.linux.dev>,
wangzijie <wangzijie1@honor.com>
Subject: [PATCH v3] proc: fix missing pde_set_flags() for net proc files
Date: Thu, 21 Aug 2025 18:58:06 +0800 [thread overview]
Message-ID: <20250821105806.1453833-1-wangzijie1@honor.com> (raw)
To avoid potential UAF issues during module removal races, we use pde_set_flags()
to save proc_ops flags in PDE itself before proc_register(), and then use
pde_has_proc_*() helpers instead of directly dereferencing pde->proc_ops->*.
However, the pde_set_flags() call was missing when creating net related proc files.
This omission caused incorrect behavior which FMODE_LSEEK was being cleared
inappropriately in proc_reg_open() for net proc files. Lars reported it in this link[1].
Fix this by ensuring pde_set_flags() is called when register proc entry, and add
NULL check for proc_ops in pde_set_flags().
[1]: https://lore.kernel.org/all/20250815195616.64497967@chagall.paradoxon.rec/
Fixes: ff7ec8dc1b64 ("proc: use the same treatment to check proc_lseek as ones for proc_read_iter et.al")
Cc: stable@vger.kernel.org
Reported-by: Lars Wendler <polynomial-c@gmx.de>
Signed-off-by: wangzijie <wangzijie1@honor.com>
---
v3:
- followed by Christian's suggestion to stash pde->proc_ops in a local const variable
v2:
- followed by Jiri's suggestion to refractor code and reformat commit message
---
fs/proc/generic.c | 38 +++++++++++++++++++++-----------------
1 file changed, 21 insertions(+), 17 deletions(-)
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -362,6 +362,25 @@ static const struct inode_operations pro
.setattr = proc_notify_change,
};
+static void pde_set_flags(struct proc_dir_entry *pde)
+{
+ const struct proc_ops *proc_ops = pde->proc_ops;
+
+ if (!proc_ops)
+ return;
+
+ if (proc_ops->proc_flags & PROC_ENTRY_PERMANENT)
+ pde->flags |= PROC_ENTRY_PERMANENT;
+ if (proc_ops->proc_read_iter)
+ pde->flags |= PROC_ENTRY_proc_read_iter;
+#ifdef CONFIG_COMPAT
+ if (proc_ops->proc_compat_ioctl)
+ pde->flags |= PROC_ENTRY_proc_compat_ioctl;
+#endif
+ if (proc_ops->proc_lseek)
+ pde->flags |= PROC_ENTRY_proc_lseek;
+}
+
/* returns the registered entry, or frees dp and returns NULL on failure */
struct proc_dir_entry *proc_register(struct proc_dir_entry *dir,
struct proc_dir_entry *dp)
@@ -369,6 +388,8 @@ struct proc_dir_entry *proc_register(str
if (proc_alloc_inum(&dp->low_ino))
goto out_free_entry;
+ pde_set_flags(dp);
+
write_lock(&proc_subdir_lock);
dp->parent = dir;
if (pde_subdir_insert(dir, dp) == false) {
@@ -557,20 +578,6 @@ struct proc_dir_entry *proc_create_reg(c
return p;
}
-static void pde_set_flags(struct proc_dir_entry *pde)
-{
- if (pde->proc_ops->proc_flags & PROC_ENTRY_PERMANENT)
- pde->flags |= PROC_ENTRY_PERMANENT;
- if (pde->proc_ops->proc_read_iter)
- pde->flags |= PROC_ENTRY_proc_read_iter;
-#ifdef CONFIG_COMPAT
- if (pde->proc_ops->proc_compat_ioctl)
- pde->flags |= PROC_ENTRY_proc_compat_ioctl;
-#endif
- if (pde->proc_ops->proc_lseek)
- pde->flags |= PROC_ENTRY_proc_lseek;
-}
-
struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
struct proc_dir_entry *parent,
const struct proc_ops *proc_ops, void *data)
@@ -581,7 +588,6 @@ struct proc_dir_entry *proc_create_data(
if (!p)
return NULL;
p->proc_ops = proc_ops;
- pde_set_flags(p);
return proc_register(parent, p);
}
EXPORT_SYMBOL(proc_create_data);
@@ -632,7 +638,6 @@ struct proc_dir_entry *proc_create_seq_p
p->proc_ops = &proc_seq_ops;
p->seq_ops = ops;
p->state_size = state_size;
- pde_set_flags(p);
return proc_register(parent, p);
}
EXPORT_SYMBOL(proc_create_seq_private);
@@ -663,7 +668,6 @@ struct proc_dir_entry *proc_create_singl
return NULL;
p->proc_ops = &proc_single_ops;
p->single_show = show;
- pde_set_flags(p);
return proc_register(parent, p);
}
EXPORT_SYMBOL(proc_create_single_data);
@@ -24,7 +24,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -3500,6 +3500,10 @@ ppp_connect_channel(struct channel *pch,
@@ -3504,6 +3504,10 @@ ppp_connect_channel(struct channel *pch,
ret = -ENOTCONN;
goto outl;
}
@@ -47,7 +47,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (error) {
--- a/drivers/net/ppp/pptp.c
+++ b/drivers/net/ppp/pptp.c
@@ -465,6 +465,7 @@ static int pptp_connect(struct socket *s
@@ -469,6 +469,7 @@ static int pptp_connect(struct socket *s
po->chan.mtu -= PPTP_HEADER_OVERHEAD;
po->chan.hdrlen = 2 + sizeof(struct pptp_gre_header);
@@ -87,7 +87,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
phy_unlock_mdio_bus(phydev);
--- a/drivers/net/phy/mscc/mscc.h
+++ b/drivers/net/phy/mscc/mscc.h
@@ -416,6 +416,11 @@ struct vsc8531_private {
@@ -428,6 +428,11 @@ struct vsc8531_private {
* gpio_lock: used for PHC operations. Common for all PHYs as the load/save GPIO
* is shared.
*/
@@ -177,7 +177,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return -EOPNOTSUPP;
switch (type) {
@@ -1916,9 +1916,9 @@ void mtk_wed_add_hw(struct device_node *
@@ -1915,9 +1915,9 @@ void mtk_wed_add_hw(struct device_node *
hw->wdma = wdma;
hw->index = index;
hw->irq = irq;
@@ -142,7 +142,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return -ENOMEM;
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
@@ -1930,7 +1937,12 @@ void mtk_wed_add_hw(struct device_node *
@@ -1929,7 +1936,12 @@ void mtk_wed_add_hw(struct device_node *
hw->irq = irq;
hw->version = eth->soc->version;
@@ -156,7 +156,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
hw->mirror = syscon_regmap_lookup_by_phandle(eth_np,
"mediatek,pcie-mirror");
hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np,
@@ -1944,6 +1956,8 @@ void mtk_wed_add_hw(struct device_node *
@@ -1943,6 +1955,8 @@ void mtk_wed_add_hw(struct device_node *
regmap_write(hw->mirror, 0, 0);
regmap_write(hw->mirror, 4, 0);
}
@@ -43,7 +43,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
--- a/crypto/jitterentropy-kcapi.c
+++ b/crypto/jitterentropy-kcapi.c
@@ -245,7 +245,7 @@ static int jent_kcapi_init(struct crypto
@@ -246,7 +246,7 @@ static int jent_kcapi_init(struct crypto
crypto_shash_init(sdesc);
rng->sdesc = sdesc;
@@ -52,7 +52,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
if (!rng->entropy_collector) {
ret = -ENOMEM;
goto err;
@@ -334,7 +334,7 @@ static int __init jent_mod_init(void)
@@ -335,7 +335,7 @@ static int __init jent_mod_init(void)
desc->tfm = tfm;
crypto_shash_init(desc);
@@ -53,7 +53,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
depends on CRYPTO_JITTERENTROPY
--- a/crypto/jitterentropy-kcapi.c
+++ b/crypto/jitterentropy-kcapi.c
@@ -256,7 +256,9 @@ static int jent_kcapi_init(struct crypto
@@ -257,7 +257,9 @@ static int jent_kcapi_init(struct crypto
crypto_shash_init(sdesc);
rng->sdesc = sdesc;
@@ -64,7 +64,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
if (!rng->entropy_collector) {
ret = -ENOMEM;
goto err;
@@ -345,7 +347,7 @@ static int __init jent_mod_init(void)
@@ -346,7 +348,7 @@ static int __init jent_mod_init(void)
desc->tfm = tfm;
crypto_shash_init(desc);
@@ -36,7 +36,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
--- a/crypto/jitterentropy-kcapi.c
+++ b/crypto/jitterentropy-kcapi.c
@@ -347,7 +347,7 @@ static int __init jent_mod_init(void)
@@ -348,7 +348,7 @@ static int __init jent_mod_init(void)
desc->tfm = tfm;
crypto_shash_init(desc);
@@ -102,7 +102,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
endif # MODULES
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -997,6 +997,7 @@ size_t modinfo_attrs_count = ARRAY_SIZE(
@@ -999,6 +999,7 @@ size_t modinfo_attrs_count = ARRAY_SIZE(
static const char vermagic[] = VERMAGIC_STRING;
@@ -110,7 +110,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
int try_to_force_load(struct module *mod, const char *reason)
{
#ifdef CONFIG_MODULE_FORCE_LOAD
@@ -1008,6 +1009,7 @@ int try_to_force_load(struct module *mod
@@ -1010,6 +1011,7 @@ int try_to_force_load(struct module *mod
return -ENOEXEC;
#endif
}
@@ -118,7 +118,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* Parse tag=value strings from .modinfo section */
char *module_next_tag_pair(char *string, unsigned long *secsize)
@@ -2075,9 +2077,11 @@ static void module_augment_kernel_taints
@@ -2077,9 +2079,11 @@ static void module_augment_kernel_taints
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
{
@@ -131,7 +131,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
modmagic = NULL;
@@ -2091,6 +2095,7 @@ static int check_modinfo(struct module *
@@ -2093,6 +2097,7 @@ static int check_modinfo(struct module *
info->name, modmagic, vermagic);
return -ENOEXEC;
}
@@ -42,7 +42,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
skb = codel_dequeue(sch, &sch->qstats.backlog, &q->cparams,
&flow->cvars, &q->cstats, qdisc_pkt_len,
codel_get_enqueue_time, drop_func, dequeue_func);
+
+
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
+ * parent class, dequeue in parent qdisc will do the same if we
+ * return skb. Temporary increment qlen if we have skb.
@@ -42,7 +42,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
skb = codel_dequeue(sch, &sch->qstats.backlog, &q->cparams,
&flow->cvars, &q->cstats, qdisc_pkt_len,
codel_get_enqueue_time, drop_func, dequeue_func);
+
+
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
+ * parent class, dequeue in parent qdisc will do the same if we
+ * return skb. Temporary increment qlen if we have skb.
@@ -42,7 +42,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
skb = codel_dequeue(sch, &sch->qstats.backlog, &q->cparams,
&flow->cvars, &q->cstats, qdisc_pkt_len,
codel_get_enqueue_time, drop_func, dequeue_func);
+
+
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
+ * parent class, dequeue in parent qdisc will do the same if we
+ * return skb. Temporary increment qlen if we have skb.
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#endif /* __KERNEL__ */
/**
@@ -258,6 +260,4 @@ static inline void *offset_to_ptr(const
@@ -250,6 +252,4 @@ static inline void *offset_to_ptr(const
*/
#define prevent_tail_call_optimization() mb()
@@ -49,7 +49,7 @@ Submitted-by: Daniel Danzberger <daniel@dd-wrt.com>
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -940,6 +940,7 @@ static const struct spinand_manufacturer
@@ -943,6 +943,7 @@ static const struct spinand_manufacturer
&alliancememory_spinand_manufacturer,
&ato_spinand_manufacturer,
&esmt_c8_spinand_manufacturer,
@@ -230,7 +230,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
{
--- a/net/ipv6/ip6_offload.c
+++ b/net/ipv6/ip6_offload.c
@@ -319,6 +319,7 @@ out:
@@ -321,6 +321,7 @@ out:
return pp;
}
@@ -238,7 +238,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
static struct sk_buff *sit_ip6ip6_gro_receive(struct list_head *head,
struct sk_buff *skb)
@@ -401,6 +402,7 @@ INDIRECT_CALLABLE_SCOPE int ipv6_gro_com
@@ -403,6 +404,7 @@ INDIRECT_CALLABLE_SCOPE int ipv6_gro_com
out:
return err;
}
@@ -20,7 +20,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/drivers/bus/mhi/host/main.c
+++ b/drivers/bus/mhi/host/main.c
@@ -906,6 +906,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_
@@ -916,6 +916,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_
switch (event) {
case MHI_EE_SBL:
st = DEV_ST_TRANSITION_SBL;
+34 -28
View File
@@ -87,26 +87,26 @@ type WireGuardPeerOption struct {
}
type AmneziaWGOption struct {
JC int `proxy:"jc,omitempty"`
JMin int `proxy:"jmin,omitempty"`
JMax int `proxy:"jmax,omitempty"`
S1 int `proxy:"s1,omitempty"`
S2 int `proxy:"s2,omitempty"`
H1 uint32 `proxy:"h1,omitempty"`
H2 uint32 `proxy:"h2,omitempty"`
H3 uint32 `proxy:"h3,omitempty"`
H4 uint32 `proxy:"h4,omitempty"`
// AmneziaWG v1.5
I1 string `proxy:"i1,omitempty"`
I2 string `proxy:"i2,omitempty"`
I3 string `proxy:"i3,omitempty"`
I4 string `proxy:"i4,omitempty"`
I5 string `proxy:"i5,omitempty"`
J1 string `proxy:"j1,omitempty"`
J2 string `proxy:"j2,omitempty"`
J3 string `proxy:"j3,omitempty"`
Itime int64 `proxy:"itime,omitempty"`
JC int `proxy:"jc,omitempty"`
JMin int `proxy:"jmin,omitempty"`
JMax int `proxy:"jmax,omitempty"`
S1 int `proxy:"s1,omitempty"`
S2 int `proxy:"s2,omitempty"`
S3 int `proxy:"s3,omitempty"` // AmneziaWG v1.5 and v2
S4 int `proxy:"s4,omitempty"` // AmneziaWG v1.5 and v2
H1 string `proxy:"h1,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
H2 string `proxy:"h2,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
H3 string `proxy:"h3,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
H4 string `proxy:"h4,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
I1 string `proxy:"i1,omitempty"` // AmneziaWG v1.5 and v2
I2 string `proxy:"i2,omitempty"` // AmneziaWG v1.5 and v2
I3 string `proxy:"i3,omitempty"` // AmneziaWG v1.5 and v2
I4 string `proxy:"i4,omitempty"` // AmneziaWG v1.5 and v2
I5 string `proxy:"i5,omitempty"` // AmneziaWG v1.5 and v2
J1 string `proxy:"j1,omitempty"` // AmneziaWG v1.5 only (removed in v2)
J2 string `proxy:"j2,omitempty"` // AmneziaWG v1.5 only (removed in v2)
J3 string `proxy:"j3,omitempty"` // AmneziaWG v1.5 only (removed in v2)
Itime int64 `proxy:"itime,omitempty"` // AmneziaWG v1.5 only (removed in v2)
}
type wgSingErrorHandler struct {
@@ -412,17 +412,23 @@ func (w *WireGuard) genIpcConf(ctx context.Context, updateOnly bool) (string, er
if w.option.AmneziaWGOption.S2 != 0 {
ipcConf += "s2=" + strconv.Itoa(w.option.AmneziaWGOption.S2) + "\n"
}
if w.option.AmneziaWGOption.H1 != 0 {
ipcConf += "h1=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H1), 10) + "\n"
if w.option.AmneziaWGOption.S3 != 0 {
ipcConf += "s3=" + strconv.Itoa(w.option.AmneziaWGOption.S3) + "\n"
}
if w.option.AmneziaWGOption.H2 != 0 {
ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n"
if w.option.AmneziaWGOption.S4 != 0 {
ipcConf += "s4=" + strconv.Itoa(w.option.AmneziaWGOption.S4) + "\n"
}
if w.option.AmneziaWGOption.H3 != 0 {
ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n"
if w.option.AmneziaWGOption.H1 != "" {
ipcConf += "h1=" + w.option.AmneziaWGOption.H1 + "\n"
}
if w.option.AmneziaWGOption.H4 != 0 {
ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n"
if w.option.AmneziaWGOption.H2 != "" {
ipcConf += "h2=" + w.option.AmneziaWGOption.H2 + "\n"
}
if w.option.AmneziaWGOption.H3 != "" {
ipcConf += "h3=" + w.option.AmneziaWGOption.H3 + "\n"
}
if w.option.AmneziaWGOption.H4 != "" {
ipcConf += "h4=" + w.option.AmneziaWGOption.H4 + "\n"
}
if w.option.AmneziaWGOption.I1 != "" {
ipcConf += "i1=" + w.option.AmneziaWGOption.I1 + "\n"
+19 -14
View File
@@ -862,20 +862,25 @@ proxies: # socks5
# jmax: 501
# s1: 30
# s2: 40
# h1: 123456
# h2: 67543
# h4: 32345
# h3: 123123
# # AmneziaWG v1.5
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10>
# i2: <b 0xf6ab3267fa><r 100>
# i3: ""
# i4: ""
# i5: ""
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10>
# j2: <c><b 0xf6ab><t><wt 1000>
# j3: <t><b 0xf6ab><c><r 10>
# itime: 60
# s3: 50 # AmneziaWG v1.5 and v2
# s4: 5 # AmneziaWG v1.5 and v2
# h1: 123456 # AmneziaWG v1.0 and v1.5
# h2: 67543 # AmneziaWG v1.0 and v1.5
# h3: 123123 # AmneziaWG v1.0 and v1.5
# h4: 32345 # AmneziaWG v1.0 and v1.5
# h1: 123456-123500 # AmneziaWG v2.0 only
# h2: 67543-67550 # AmneziaWG v2.0 only
# h3: 123123-123200 # AmneziaWG v2.0 only
# h4: 32345-32350 # AmneziaWG v2.0 only
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10> # AmneziaWG v1.5 and v2
# i2: <b 0xf6ab3267fa><r 100> # AmneziaWG v1.5 and v2
# i3: "" # AmneziaWG v1.5 and v2
# i4: "" # AmneziaWG v1.5 and v2
# i5: "" # AmneziaWG v1.5 and v2
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10> # AmneziaWG v1.5 only (removed in v2)
# j2: <c><b 0xf6ab><t><wt 1000> # AmneziaWG v1.5 only (removed in v2)
# j3: <t><b 0xf6ab><c><r 10> # AmneziaWG v1.5 only (removed in v2)
# itime: 60 # AmneziaWG v1.5 only (removed in v2)
# tuic
- name: tuic
+1 -1
View File
@@ -14,7 +14,7 @@ require (
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905
github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20
github.com/mdlayher/netlink v1.7.2
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281
github.com/metacubex/bart v0.20.5
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b
github.com/metacubex/blake3 v0.1.0
+2 -2
View File
@@ -90,8 +90,8 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/
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/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a h1:c1QSGpacSeQdBdWcEKZKGuWLcqIG2wxHEygAcXuDwS4=
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 h1:09EM0sOLb2kfL0KETGhHujsBLB5iy5U/2yHRHsxf/pI=
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM=
github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc=
github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM=
+69
View File
@@ -0,0 +1,69 @@
name: Preview Build
on:
workflow_dispatch:
inputs:
jobs:
libcore:
name: Native Build (LibCore)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Golang Status
run: find buildScript libcore/*.sh | xargs cat | sha1sum > golang_status
- name: Libcore Status
run: git ls-files libcore | xargs cat | sha1sum > libcore_status
- name: LibCore Cache
id: cache
uses: actions/cache@v4
with:
path: |
app/libs/libcore.aar
key: ${{ hashFiles('.github/workflows/*', 'golang_status', 'libcore_status') }}
- name: Install Golang
if: steps.cache.outputs.cache-hit != 'true'
uses: actions/setup-go@v5
with:
go-version: ^1.24
- name: Native Build
if: steps.cache.outputs.cache-hit != 'true'
run: ./run lib core
build:
name: Build OSS APK
runs-on: ubuntu-latest
needs:
- libcore
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Golang Status
run: find buildScript libcore/*.sh | xargs cat | sha1sum > golang_status
- name: Libcore Status
run: git ls-files libcore | xargs cat | sha1sum > libcore_status
- name: LibCore Cache
uses: actions/cache@v4
with:
path: |
app/libs/libcore.aar
key: ${{ hashFiles('.github/workflows/*', 'golang_status', 'libcore_status') }}
- name: Gradle cache
uses: actions/cache@v4
with:
path: ~/.gradle
key: gradle-oss-${{ hashFiles('**/*.gradle.kts') }}
- name: Gradle Build
env:
BUILD_PLUGIN: none
run: |
echo "sdk.dir=${ANDROID_HOME}" > local.properties
echo "ndk.dir=${ANDROID_HOME}/ndk/25.0.8775105" >> local.properties
export LOCAL_PROPERTIES="${{ secrets.LOCAL_PROPERTIES }}"
./run init action gradle
./gradlew app:assemblePreviewRelease
APK=$(find app/build/outputs/apk -name '*arm64-v8a*.apk')
APK=$(dirname $APK)
echo "APK=$APK" >> $GITHUB_ENV
- uses: actions/upload-artifact@v4
with:
name: APKs
path: ${{ env.APK }}
@@ -382,4 +382,9 @@ com.openai.chatgpt
mega.privacy.android.app
com.taptap.global
tw.com.gamer.android.animad
com.microsoft.copilot
com.microsoft.copilot
com.google.android.apps.aiwallpapers
ai.x.grok
com.google.android.apps.weather
com.metrolist.music
com.google.android.apps.youtube.creator
@@ -20,6 +20,8 @@ import go.Seq
import io.nekohasekai.sagernet.bg.SagerConnection
import io.nekohasekai.sagernet.database.DataStore
import io.nekohasekai.sagernet.ktx.Logs
import io.nekohasekai.sagernet.ktx.isOss
import io.nekohasekai.sagernet.ktx.isPreview
import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher
import io.nekohasekai.sagernet.ui.MainActivity
import io.nekohasekai.sagernet.utils.*
@@ -194,6 +196,18 @@ class SagerNet : Application(),
var underlyingNetwork: Network? = null
var appVersionNameForDisplay = lazy {
var n = BuildConfig.VERSION_NAME
if (isPreview) {
n += " " + BuildConfig.PRE_VERSION_NAME
} else if (!isOss) {
n += " ${BuildConfig.FLAVOR}"
}
if (BuildConfig.DEBUG) {
n += " DEBUG"
}
n
}
}
}
@@ -162,12 +162,6 @@ fun buildConfig(
external_controller = "127.0.0.1:9090"
external_ui = "../files/yacd"
}
cache_file = CacheFile().apply {
enabled = true
store_fakeip = true
path = "../cache/clash.db"
}
}
log = LogOptions().apply {
@@ -657,7 +651,27 @@ fun buildConfig(
}
}
// remote dns obj
dns.servers.add(DNSServerOptions().apply {
address = "rcode://success"
tag = "dns-block"
})
dns.servers.add(DNSServerOptions().apply {
address = "local"
tag = "dns-local"
detour = TAG_DIRECT
})
directDNS.firstOrNull().let {
dns.servers.add(DNSServerOptions().apply {
address = it ?: throw Exception("No direct DNS, check your settings!")
tag = "dns-direct"
detour = TAG_DIRECT
address_resolver = "dns-local"
strategy = autoDnsDomainStrategy(SingBoxOptionsUtil.domainStrategy(tag))
})
}
remoteDns.firstOrNull().let {
// Always use direct DNS for urlTest
if (!forTest) dns.servers.add(DNSServerOptions().apply {
@@ -668,25 +682,7 @@ fun buildConfig(
})
}
// add directDNS objects here
directDNS.firstOrNull().let {
dns.servers.add(DNSServerOptions().apply {
address = it ?: throw Exception("No direct DNS, check your settings!")
tag = "dns-direct"
detour = TAG_DIRECT
address_resolver = "dns-local"
strategy = autoDnsDomainStrategy(SingBoxOptionsUtil.domainStrategy(tag))
})
}
dns.servers.add(DNSServerOptions().apply {
address = "local"
tag = "dns-local"
detour = TAG_DIRECT
})
dns.servers.add(DNSServerOptions().apply {
address = "rcode://success"
tag = "dns-block"
})
dns.final_ = if (forTest) "dns-direct" else "dns-remote"
// dns object user rules
if (enableDnsRouting) {
@@ -17,6 +17,7 @@ import io.nekohasekai.sagernet.fmt.v2ray.parseV2Ray
import moe.matsuri.nb4a.proxy.anytls.parseAnytls
import moe.matsuri.nb4a.utils.JavaUtil.gson
import moe.matsuri.nb4a.utils.Util
import okhttp3.HttpUrl
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
@@ -137,6 +138,14 @@ suspend fun parseProxies(text: String): List<AbstractBean> {
entities.add(parseHttp(this))
}.onFailure {
Logs.w(it)
val clashUrl = HttpUrl.Builder()
.scheme("https")
.host("install-config")
.addQueryParameter("url", this)
.build()
.toString()
.replaceFirst("https://", "clash://")
throw (SubscriptionFoundException(clashUrl))
}
} else if (startsWith("vmess://")) {
Logs.d("Try parse v2ray link: $this")
@@ -271,11 +271,9 @@ fun Context.getColorAttr(@AttrRes resId: Int): Int {
}
val isExpert: Boolean by lazy { BuildConfig.DEBUG || DataStore.isExpert }
val isExpertFlavor = ((BuildConfig.FLAVOR == "expert") || BuildConfig.DEBUG)
const val isOss = BuildConfig.FLAVOR == "oss"
const val isFdroid = BuildConfig.FLAVOR == "fdroid"
const val isPlay = BuildConfig.FLAVOR == "play"
const val isPreview = BuildConfig.FLAVOR == "preview"
fun <T> Continuation<T>.tryResume(value: T) {
try {
@@ -10,6 +10,7 @@ import android.os.PowerManager
import android.provider.Settings
import android.text.util.Linkify
import android.view.View
import android.widget.Toast
import androidx.activity.result.component1
import androidx.activity.result.component2
import androidx.activity.result.contract.ActivityResultContracts
@@ -28,6 +29,12 @@ import io.nekohasekai.sagernet.utils.PackageCache
import io.nekohasekai.sagernet.widget.ListListener
import libcore.Libcore
import moe.matsuri.nb4a.plugin.Plugins
import androidx.core.net.toUri
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import io.nekohasekai.sagernet.SagerNet
import io.nekohasekai.sagernet.database.DataStore
import moe.matsuri.nb4a.utils.Util
import org.json.JSONObject
class AboutFragment : ToolbarFragment(R.layout.layout_about) {
@@ -65,128 +72,133 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
}
override fun getMaterialAboutList(activityContext: Context): MaterialAboutList {
var versionName = BuildConfig.VERSION_NAME
if (!isOss) {
versionName += " ${BuildConfig.FLAVOR}"
}
if (BuildConfig.DEBUG) {
versionName += " DEBUG"
}
return MaterialAboutList.Builder()
.addCard(
MaterialAboutCard.Builder()
.outline(false)
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_update_24)
.text(R.string.app_version)
.subText(versionName)
.setOnClickAction {
requireContext().launchCustomTab(
"https://github.com/MatsuriDayo/NekoBoxForAndroid/releases"
)
}
.build())
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_layers_24)
.text(getString(R.string.version_x, "sing-box"))
.subText(Libcore.versionBox())
.setOnClickAction { }
.build())
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_card_giftcard_24)
.text(R.string.donate)
.subText(R.string.donate_info)
.setOnClickAction {
requireContext().launchCustomTab(
"https://matsuridayo.github.io/index_docs/#donate"
)
}
.build())
.apply {
PackageCache.awaitLoadSync()
for ((_, pkg) in PackageCache.installedPluginPackages) {
try {
val pluginId =
pkg.providers?.get(0)?.loadString(Plugins.METADATA_KEY_ID)
if (pluginId.isNullOrBlank()) continue
addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_nfc_24)
.text(
getString(
R.string.version_x,
pluginId
) + " (${Plugins.displayExeProvider(pkg.packageName)})"
.outline(false)
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_update_24)
.text(R.string.app_version)
.subText(SagerNet.appVersionNameForDisplay.value)
.setOnClickAction {
requireContext().launchCustomTab(
"https://github.com/MatsuriDayo/NekoBoxForAndroid/releases"
)
.subText("v" + pkg.versionName)
.setOnClickAction {
startActivity(Intent().apply {
action =
Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts(
"package", pkg.packageName, null
}
.build())
.addItem(
MaterialAboutActionItem.Builder()
.text(R.string.check_update_release)
.setOnClickAction {
checkUpdate(false)
}
.build())
.addItem(
MaterialAboutActionItem.Builder()
.text(R.string.check_update_preview)
.setOnClickAction {
checkUpdate(true)
}
.build())
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_layers_24)
.text(getString(R.string.version_x, "sing-box"))
.subText(Libcore.versionBox())
.setOnClickAction { }
.build())
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_card_giftcard_24)
.text(R.string.donate)
.subText(R.string.donate_info)
.setOnClickAction {
requireContext().launchCustomTab(
"https://matsuridayo.github.io/index_docs/#donate"
)
}
.build())
.apply {
PackageCache.awaitLoadSync()
for ((_, pkg) in PackageCache.installedPluginPackages) {
try {
val pluginId =
pkg.providers?.get(0)?.loadString(Plugins.METADATA_KEY_ID)
if (pluginId.isNullOrBlank()) continue
addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_nfc_24)
.text(
getString(
R.string.version_x,
pluginId
) + " (${Plugins.displayExeProvider(pkg.packageName)})"
)
})
}
.build())
} catch (e: Exception) {
Logs.w(e)
.subText("v" + pkg.versionName)
.setOnClickAction {
startActivity(Intent().apply {
action =
Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts(
"package", pkg.packageName, null
)
})
}
.build())
} catch (e: Exception) {
Logs.w(e)
}
}
}
}
.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val pm = app.getSystemService(Context.POWER_SERVICE) as PowerManager
if (!pm.isIgnoringBatteryOptimizations(app.packageName)) {
addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_running_with_errors_24)
.text(R.string.ignore_battery_optimizations)
.subText(R.string.ignore_battery_optimizations_sum)
.setOnClickAction {
requestIgnoreBatteryOptimizations.launch(
Intent(
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
Uri.parse("package:${app.packageName}")
)
)
}
.build())
.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val pm = app.getSystemService(Context.POWER_SERVICE) as PowerManager
if (!pm.isIgnoringBatteryOptimizations(app.packageName)) {
addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_running_with_errors_24)
.text(R.string.ignore_battery_optimizations)
.subText(R.string.ignore_battery_optimizations_sum)
.setOnClickAction {
requestIgnoreBatteryOptimizations.launch(
Intent(
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
"package:${app.packageName}".toUri()
)
)
}
.build())
}
}
}
}
.build())
.build())
.addCard(
MaterialAboutCard.Builder()
.outline(false)
.title(R.string.project)
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_sanitizer_24)
.text(R.string.github)
.setOnClickAction {
requireContext().launchCustomTab(
"https://github.com/MatsuriDayo/NekoBoxForAndroid"
.outline(false)
.title(R.string.project)
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_baseline_sanitizer_24)
.text(R.string.github)
.setOnClickAction {
requireContext().launchCustomTab(
"https://github.com/MatsuriDayo/NekoBoxForAndroid"
)
}
)
}
.build())
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_qu_shadowsocks_foreground)
.text(R.string.telegram)
.setOnClickAction {
requireContext().launchCustomTab(
"https://t.me/MatsuriDayo"
)
}
.build())
.build())
.addItem(
MaterialAboutActionItem.Builder()
.icon(R.drawable.ic_qu_shadowsocks_foreground)
.text(R.string.telegram)
.setOnClickAction {
requireContext().launchCustomTab(
"https://t.me/MatsuriDayo"
)
}
.build())
.build())
.build()
}
@@ -199,6 +211,69 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
}
}
fun checkUpdate(checkPreview: Boolean) {
runOnIoDispatcher {
try {
val client = Libcore.newHttpClient().apply {
modernTLS()
keepAlive()
trySocks5(DataStore.mixedPort)
}
val response = client.newRequest().apply {
if (checkPreview) {
setURL("https://api.github.com/repos/MatsuriDayo/NekoBoxForAndroid/releases/tags/preview")
} else {
setURL("https://api.github.com/repos/MatsuriDayo/NekoBoxForAndroid/releases/latest")
}
}.execute()
val release = JSONObject(Util.getStringBox(response.contentString))
val releaseName = release.getString("name")
val releaseUrl = release.getString("html_url")
var haveUpdate = releaseName.isNotBlank()
haveUpdate = if (isPreview) {
if (checkPreview) {
haveUpdate && releaseName != BuildConfig.PRE_VERSION_NAME
} else {
// User: 1.3.9 pre-1.4.0 Stable: 1.3.9 -> No update
haveUpdate && releaseName != BuildConfig.VERSION_NAME
}
} else {
// User: 1.4.0 Preview: pre-1.4.0 -> No update
// User: 1.4.0 Preview: pre-1.4.1 -> Update
// User: 1.4.0 Stable: 1.4.0 -> No update
// User: 1.4.0 Stable: 1.4.1 -> Update
haveUpdate && !releaseName.contains(BuildConfig.VERSION_NAME)
}
runOnMainDispatcher {
if (haveUpdate) {
val context = requireContext()
MaterialAlertDialogBuilder(context)
.setTitle(R.string.update_dialog_title)
.setMessage(
context.getString(
R.string.update_dialog_message,
SagerNet.appVersionNameForDisplay.value,
releaseName
)
)
.setPositiveButton(R.string.yes) { _, _ ->
val intent = Intent(Intent.ACTION_VIEW, releaseUrl.toUri())
context.startActivity(intent)
}
.setNegativeButton(R.string.no, null)
.show()
} else {
Toast.makeText(app, R.string.check_update_no, Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
runOnMainDispatcher {
Toast.makeText(app, e.readableMessage, Toast.LENGTH_SHORT).show()
}
}
}
}
}
}
@@ -41,6 +41,7 @@ import io.nekohasekai.sagernet.group.GroupInterfaceAdapter
import io.nekohasekai.sagernet.group.GroupUpdater
import io.nekohasekai.sagernet.ktx.alert
import io.nekohasekai.sagernet.ktx.isPlay
import io.nekohasekai.sagernet.ktx.isPreview
import io.nekohasekai.sagernet.ktx.launchCustomTab
import io.nekohasekai.sagernet.ktx.onMainDispatcher
import io.nekohasekai.sagernet.ktx.parseProxies
@@ -114,6 +115,13 @@ class MainActivity : ThemedActivity(),
)
}
}
if (isPreview) {
MaterialAlertDialogBuilder(this).setTitle(R.string.preview_version)
.setMessage(R.string.preview_version_hint)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}
fun refreshNavMenu(clashApi: Boolean) {
@@ -4,7 +4,6 @@ import android.Manifest
import android.content.Intent
import android.content.pm.ShortcutManager
import android.graphics.ImageDecoder
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
@@ -13,6 +12,7 @@ import android.view.MenuItem
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import com.google.zxing.Result
import com.king.zxing.CameraScan
import com.king.zxing.DefaultCameraScan
@@ -138,7 +138,7 @@ class ScannerActivity : ThemedActivity(),
} catch (e: SubscriptionFoundException) {
startActivity(Intent(this@ScannerActivity, MainActivity::class.java).apply {
action = Intent.ACTION_VIEW
data = Uri.parse(e.link)
data = e.link.toUri()
})
} catch (e: Throwable) {
Logs.w(e)
@@ -6,6 +6,7 @@ import android.os.Build
import android.util.Log
import com.jakewharton.processphoenix.ProcessPhoenix
import io.nekohasekai.sagernet.BuildConfig
import io.nekohasekai.sagernet.SagerNet
import io.nekohasekai.sagernet.database.preference.PublicDatabase
import io.nekohasekai.sagernet.ktx.Logs
import io.nekohasekai.sagernet.ktx.app
@@ -61,7 +62,7 @@ object CrashHandler : Thread.UncaughtExceptionHandler {
fun buildReportHeader(): String {
var report = ""
report += "NekoBox for Andoird ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE}) ${BuildConfig.FLAVOR.uppercase()}\n"
report += "NekoBox for Android ${SagerNet.appVersionNameForDisplay} (${BuildConfig.VERSION_CODE})\n"
report += "Date: ${getCurrentMilliSecondUTCTimeStamp()}\n\n"
report += "OS_VERSION: ${getSystemPropertyWithAndroidAPI("os.version")}\n"
report += "SDK_INT: ${Build.VERSION.SDK_INT}\n"
@@ -102,7 +103,7 @@ object CrashHandler : Thread.UncaughtExceptionHandler {
report += "\n"
report += pair.key + ": " + pair.toString()
}
}catch (e: Exception) {
} catch (e: Exception) {
report += "Export settings failed: " + formatThrowable(e)
}
@@ -136,7 +137,8 @@ object CrashHandler : Thread.UncaughtExceptionHandler {
if (matcher.matches()) {
key = matcher.group(1)
value = matcher.group(2)
if (key != null && value != null && !key.isEmpty() && !value.isEmpty()) systemProperties[key] = value
if (key != null && value != null && !key.isEmpty() && !value.isEmpty()) systemProperties[key] =
value
}
}
bufferedReader.close()
@@ -20,7 +20,6 @@ import androidx.preference.PreferenceViewHolder
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import io.nekohasekai.sagernet.R
import io.nekohasekai.sagernet.ktx.getColorAttr
import io.nekohasekai.sagernet.ktx.isExpertFlavor
import kotlin.math.roundToInt
class ColorPickerPreference
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="abc_search_hint">Введите запрос</string>
<string name="abc_searchview_description_clear">Удалить запрос</string>
<string name="abc_searchview_description_search">Поиск</string>
<string name="abc_searchview_description_submit">Отправить запрос</string>
<string name="abc_searchview_description_voice">Голосовой поиск</string>
<string name="abc_shareactionprovider_share_with">Поделиться с помощью</string>
<string name="abc_toolbar_collapse_description">Свернуть</string>
<string name="acquire_wake_lock">Использовать WakeLock</string>
<string name="acquire_wake_lock_summary">Сохранять CPU включенным</string>
<string name="action_download">СКАЧАТЬ</string>
@@ -28,6 +35,8 @@
<string name="always_show_address">Всегда показывать адрес</string>
<string name="always_show_address_sum">Всегда отображать адрес сервера на карте конфигурации</string>
<string name="app_desc">Универсальный набор инструментов прокси для Android, написанный на Kotlin.</string>
<string name="app_name">NekoBox</string>
<string name="app_name_long">NekoBox для Android</string>
<string name="app_tls_version">Минимальная версия TLS протокола</string>
<string name="app_version">Версия</string>
<string name="append_http_proxy">Добавить HTTP-прокси к VPN</string>
@@ -38,6 +47,8 @@
<string name="auto">Авто</string>
<string name="auto_connect">Автоматическое подключение</string>
<string name="auto_connect_summary">Включить прокси при запуске/обновлении приложения, если он был запущен до этого</string>
<string name="auto_select_proxy_apps">Автоматический выбор прокси-приложений</string>
<string name="auto_select_proxy_apps_message">Автоматический выбор прокси-приложений приведет к очистке текущего выбора.</string>
<string name="auto_update">Автоматическое обновление</string>
<string name="auto_update_delay">Задержка автоматического обновления (в минутах)</string>
<string name="backup">Бэкап</string>
@@ -66,10 +77,10 @@
<string name="character_counter_overflowed_content_description">Превышено ограничение на количество символов (%1$d из %2$d)</string>
<string name="circular_reference">Циклическая ссылка</string>
<string name="circular_reference_sum">Маршрут не может содержать сам себя.</string>
<string name="clear_logcat">Очистить Logcat</string>
<string name="clear_logcat">Очистить журнал</string>
<string name="clear_profiles">Очистить</string>
<string name="clear_profiles_message">Вы уверены, что хотите очистить эту группу?</string>
<string name="clear_selections">Очистить выбор</string>
<string name="clear_selections">Очистить выбранное</string>
<string name="clear_text_end_icon_content_description">Очистить текстовое поле</string>
<string name="clear_traffic_statistics">Очистить статистику трафика</string>
<string name="cleartext_http_warning">Передача HTTP-трафика в виде открытого текста небезопасна</string>
@@ -79,9 +90,8 @@
<string name="confirm">Подтвердить</string>
<string name="connect">Подключиться</string>
<string name="connecting">Подключение…</string>
<string name="connection_test">Тест подключения</string>
<string name="connection_test_available">Успех: соединение HTTP заняло %d мс</string>
<string name="connection_test_available_http">Успех: соединение HTTP заняло %d мс</string>
<string name="connection_test_available">HTTPS-соединение установлено за %d мс</string>
<string name="connection_test_available_http">HTTP-соединение установлено за %d мс</string>
<string name="connection_test_clear_results">Очистить результаты теста</string>
<string name="connection_test_delete_unavailable">Удалить недоступные</string>
<string name="connection_test_domain_not_found">Домен не найден</string>
@@ -139,6 +149,7 @@
<string name="enable_mux">Включить мультиплексор</string>
<string name="enc_method">Метод шифрования</string>
<string name="encryption">Шифрование</string>
<string name="error_a11y_label">Ошибка: недопустимое значение</string>
<string name="error_icon_content_description">Ошибка</string>
<string name="error_title">Ошибка</string>
<string name="expand_button_title">Дополнительно</string>
@@ -155,20 +166,20 @@
<string name="generating">Создание…</string>
<string name="github">Исходный код</string>
<string name="global_allow_insecure">Всегда разрешать небезопасные</string>
<string name="group_added">"\"Создано:
%s\""</string>
<string name="group_added">Добавлено:
%s</string>
<string name="group_basic">Базовый</string>
<string name="group_changed">"\"Обновлено:
%s\""</string>
<string name="group_changed">Обновлено:
%s</string>
<string name="group_create">Создать группу</string>
<string name="group_create_subscription">Создать подписку</string>
<string name="group_default">Разгруппировано</string>
<string name="group_delete_confirm_prompt">Вы уверены, что хотите удалить эту группу?</string>
<string name="group_deleted">"\"Удалено:
%s\""</string>
<string name="group_deleted">Удалено:
%s</string>
<string name="group_diff">различия (%s)</string>
<string name="group_duplicate">"\"Дубликат:
%s\""</string>
<string name="group_duplicate">Дубликат:
%s</string>
<string name="group_edit">Редактировать группу</string>
<string name="group_edit_subscription">Редактировать подписку</string>
<string name="group_filter">Фильтр</string>
@@ -185,15 +196,18 @@
<string name="group_status_empty">Пустая группа</string>
<string name="group_status_empty_subscription">Еще не обновлено</string>
<string name="group_status_proxies">%d прокси</string>
<string name="group_status_proxies_subscription" formatted="false">%d Прокси | Обновлено %s</string>
<string name="group_status_proxies_subscription">%d прокси | Обновлено %s</string>
<string name="group_subscription_link">Ссылка для подписки</string>
<string name="group_type">Тип группы</string>
<string name="group_update">Обновить</string>
<string name="group_updated" formatted="false">%s: Обновлено %d прокси</string>
<string name="group_updated">%s: обновлено %d прокси</string>
<string name="grpc_service_name">Имя службы gRPC</string>
<string name="header_type">Тип заголовка</string>
<string name="hop_interval">Интервал переключения портов(второй)</string>
<string name="http_host">HTTP-хост</string>
<string name="http_path">HTTP-путь</string>
<string name="http_upgrade_host">HTTP-хост обновления</string>
<string name="http_upgrade_path">HTTP-путь обновления</string>
<string name="hysteria_auth_payload">Полезные данные аутентификации</string>
<string name="hysteria_auth_type">Тип аутентификации</string>
<string name="hysteria_connection_receive_window">Окно получения соединения QUIC</string>
@@ -211,8 +225,9 @@
<string name="install_from_play_store">Установить из Play Store</string>
<string name="invalid_backup_file">Недействительный файл резервной копии</string>
<string name="invalid_server">Неверное имя сервера</string>
<string name="invert_selections">Инвертировать выбор</string>
<string name="invert_selections">Инвертировать выбранное</string>
<string name="ipv6">Маршрут IPv6</string>
<string name="is_outbound_only">Сделать JSON исходящим</string>
<string name="item_view_role_description">Вкладка</string>
<string name="key_opt">Ключ (необязательно)</string>
<string name="landing_proxy">Обратный прокси</string>
@@ -221,11 +236,13 @@
<string name="log_level">Тип журнала</string>
<string name="log_level_help">Удерживайте для настройки размера буфера.</string>
<string name="logcat">Экспорт отладочной информации</string>
<string name="mal_close">Закрыть</string>
<string name="material_clock_toggle_content_description">Выберите AM (до полудня) или PM (после полудня)</string>
<string name="material_timepicker_am">AM</string>
<string name="material_timepicker_pm">PM</string>
<string name="menu_about">О приложении</string>
<string name="menu_configuration">Конфигурация</string>
<string name="menu_dashboard">Панель sing-box</string>
<string name="menu_group">Группы</string>
<string name="menu_log">Журналы</string>
<string name="menu_route">Маршруты</string>
@@ -236,31 +253,38 @@
<string name="missing_plugin">Отсутствующий плагин</string>
<string name="move">Переместить</string>
<string name="mtrl_badge_numberless_content_description">Новое уведомление</string>
<string name="mtrl_chip_close_icon_content_description">Удалить \"%1$s\"</string>
<string name="mtrl_checkbox_state_description_checked">Флажок установлен.</string>
<string name="mtrl_checkbox_state_description_indeterminate">Флажки установлены частично.</string>
<string name="mtrl_checkbox_state_description_unchecked">Флажок не установлен.</string>
<string name="mtrl_chip_close_icon_content_description">Удалить "%1$s"</string>
<string name="mtrl_exceed_max_badge_number_content_description">Новых уведомлений больше %1$d</string>
<string name="mtrl_picker_a11y_next_month">Перейти к следующему месяцу</string>
<string name="mtrl_picker_a11y_prev_month">Перейти к предыдущему месяцу</string>
<string name="mtrl_picker_cancel">Отмена</string>
<string name="mtrl_picker_confirm">ОК</string>
<string name="mtrl_picker_day_of_week_column_header">Столбец со днями недели: %1$s</string>
<string name="mtrl_picker_navigate_to_current_year_description">Перейти к текущему году: %1$d</string>
<string name="mtrl_picker_navigate_to_year_description">Перейти к %1$s году</string>
<string name="mtrl_picker_save">Сохранить</string>
<string name="mtrl_picker_toggle_to_calendar_input_mode">Перейти в режим выбора дней</string>
<string name="mtrl_picker_toggle_to_day_selection">Нажмите, чтобы перейти к выбору дня</string>
<string name="mtrl_picker_toggle_to_text_input_mode">Перейти в режим ввода текста</string>
<string name="mtrl_picker_toggle_to_year_selection">Нажмите, чтобы перейти к выбору года</string>
<string name="mtu_help">Удерживайте для настройки своего MTU.</string>
<string name="mux_concurrency">Число одновременных подключений Mux</string>
<string name="mux_preference">Мультиплекс</string>
<string name="mux_sum">Протокол мультиплексирования предназначен для уменьшения задержки соединения TCP, а не для увеличения пропускной способности. Использование мультиплексирования для просмотра видео, загрузки или проверки скорости обычно неэффективно. Если сервер не поддерживает мультиплексирование, вы не сможете получить доступ к Интернету.</string>
<string name="mux_type">Протокол мультиплексирования</string>
<string name="naive_insecure_concurrency">Небезопасный параллелизм</string>
<string name="naive_insecure_concurrency_summary">"\"Использовать N параллельных соединений для повышения отказоустойчивости в условиях ненадёжной сети. Большее число соединений увеличивает риск обнаружения туннелей и снижает безопасность. Этот проект стремится к максимальной защите от анализа трафика, следовательно, использование его небезопасным образом противоречит данной цели.
<string name="naive_insecure_concurrency_summary">Использовать N параллельных соединений для повышения отказоустойчивости в условиях ненадёжной сети. Большее число соединений увеличивает риск обнаружения туннелей и снижает безопасность. Этот проект стремится к максимальной защите от анализа трафика, следовательно, использование его небезопасным образом противоречит данной цели.
Если придётся использовать данную функцию, попробуйте N=2, чтобы проверить, решит ли это проблему. Настоятельно не рекомендуется использовать более 4 соединений.\""</string>
Если придётся использовать данную функцию, попробуйте N=2, чтобы проверить, решит ли это проблему. Настоятельно не рекомендуется использовать более 4 соединений.</string>
<string name="nat_result_hint">Провести проверку NAT</string>
<string name="nat_stun_server_hint">STUN сервер</string>
<string name="need_reload">Перезагрузите прокси-сервис, чтобы применить изменения</string>
<string name="need_restart">Перезапустите приложение для применения изменений</string>
<string name="network">Сеть</string>
<string name="network_change_reset_connections">Сбрасывать исходящие соединения при изменении сети</string>
<string name="network_change_reset_connections">Сбросить исходящие соединения при изменении сети</string>
<string name="night_mode">Ночной режим</string>
<string name="no">Нет</string>
<string name="no_proxies_found">В ссылке не найдено прокси-серверов</string>
@@ -286,7 +310,7 @@
<string name="plugin_auto_connect_unlock_only">Этот плагин может не работать с автоподключением</string>
<string name="plugin_configure">Настроить…</string>
<string name="plugin_disabled">Отключено</string>
<string name="plugin_exists_but_on_shit_system" formatted="false">Профиль %s требует плагин %s, но поставщик вашего проприетарного оборудования (обычно это большие компании, занимающиеся слежкой и производители вредоносного ПО) изменил ваш Android, сделав плагин непригодным для использования.</string>
<string name="plugin_exists_but_on_shit_system">Профиль %s требует плагин %s, но поставщик вашего проприетарного оборудования (обычно это большие компании, занимающиеся слежкой и производители вредоносного ПО) изменил ваш Android, сделав плагин непригодным для использования.</string>
<string name="plugin_unknown">Неизвестный плагин %s</string>
<string name="plugin_untrusted">Предупреждение: похоже, что этот плагин не из известного надежного источника.</string>
<string name="port_http">Порт прокси HTTP</string>
@@ -294,25 +318,27 @@
<string name="port_proxy">Порт прокси SOCKS5</string>
<string name="port_transproxy">Транспрокси-порт</string>
<string name="prefer">Предпочитать</string>
<string name="preference_copied">Текст \"%1$s\" скопирован в буфер обмена</string>
<string name="preference_copied">Текст "%1$s" скопирован в буфер обмена</string>
<string name="profile_config">Конфигурация профиля</string>
<string name="profile_empty">Пожалуйста, выберите профиль</string>
<string name="profile_import">Импортировать профиль</string>
<string name="profile_import_message">Подтвердите, что хотите импортировать профиль %s?</string>
<string name="profile_name">Имя профиля</string>
<string name="profile_requiring_plugin" formatted="false">Профиль %s требует установки подключаемого модуля %s, но он не найден.</string>
<string name="profile_requiring_plugin">Профиль %s требует установки подключаемого модуля %s, но он не найден.</string>
<string name="profile_traffic_statistics">Статистика трафика профиля</string>
<string name="profile_traffic_statistics_summary">Когда отключено, использованный трафик не будет отображаться</string>
<string name="project">Проект</string>
<string name="protocol">Протокол</string>
<string name="protocol_param">Параметры протокола</string>
<string name="protocol_settings">Настройки протокола</string>
<string name="protocol_version">Версия протокола</string>
<string name="proxied_apps">Режим VPN для приложений</string>
<string name="proxied_apps_summary">Настроить режим VPN для выбранных приложений</string>
<string name="proxy_cat">Настройки сервера</string>
<string name="proxy_chain">Прокси-цепочка</string>
<string name="quick_toggle">Переключить</string>
<string name="reboot_required">Не удалось запустить службу VPN. Возможно, вам потребуется перезагрузить устройство.</string>
<string name="release_wake_lock">Отключить WakeLock</string>
<string name="remote_dns">Удаленный DNS</string>
<string name="remove_duplicate">Удалить дубликаты серверов</string>
<string name="reset_connections">Сбросить соединения</string>
@@ -334,6 +360,7 @@
<string name="route_not_asset">Не файл ресурса: ожидался .db, а не %s</string>
<string name="route_opt_block_ads">Блокировать рекламу</string>
<string name="route_opt_block_analysis">Блокировать аналитику</string>
<string name="route_opt_block_quic">Блокировать QUIC</string>
<string name="route_opt_bypass_lan">Обход LAN</string>
<string name="route_play_store">Правило Play Store для %s</string>
<string name="route_profile">Выбрать профиль…</string>
@@ -345,6 +372,8 @@
<string name="scanning">Сканирование…</string>
<string name="search_apps">Поиск…</string>
<string name="search_menu_title">Поиск</string>
<string name="searchview_clear_text_content_description">Очистить текстовое поле</string>
<string name="searchview_navigation_content_description">Назад</string>
<string name="security">Шифрование транспортного уровня</string>
<string name="security_settings">Настройки безопасности</string>
<string name="select_apps">Выберите приложения</string>
@@ -357,21 +386,25 @@
<string name="service_proxy">Прокси-сервис</string>
<string name="service_subscription">Служба обновления подписки</string>
<string name="service_vpn">VPN-сервис</string>
<string name="set_panel_url">Установить URL панель</string>
<string name="settings">Настройки</string>
<string name="shadowsocks_plugin_simple_obfs">Simple Obfs (плагин Shadowsocks для Android)</string>
<string name="shadowsocks_plugin_v2ray">V2Ray (плагин Shadowsocks для Android)</string>
<string name="share">Поделиться</string>
<string name="share_qr_nfc">QR-код</string>
<string name="share_subscription">Поделиться подпиской</string>
<string name="show_bottom_bar">Показать нижнюю панель, как в SagerNet</string>
<string name="show_direct_speed">Показать прямую скорость</string>
<string name="show_direct_speed_sum">Также в уведомлении показывать скорость трафика без прокси</string>
<string name="show_group_in_notification">Показывать название группы в уведомлении</string>
<string name="show_system_apps">Показать системные приложения</string>
<string name="sni">Server Name Indication (SNI)</string>
<string name="side_sheet_accessibility_pane_title">Боковая панель</string>
<string name="sni">SNI (индикация имени сервера)</string>
<string name="sniff_override">Результат проверки для адрес назначения</string>
<string name="sniff_routing">Перехватывать результат для Маршрутизации</string>
<string name="speed">%s/с</string>
<string name="speed_detail">"Прокси :%1$s↑ %2$s↓
Прямой %3$s↑%4$s↓"</string>
<string name="speed_detail">Прокси :%1$s↑ %2$s↓
Прямой %3$s↑%4$s↓</string>
<string name="speed_interval">Интервал обновления уведомлений о скорости</string>
<string name="ss_cat">Настройки Shadowsocks</string>
<string name="ssh_auth_type_none">Без аутентификации</string>
@@ -380,40 +413,45 @@
<string name="ssh_public_key">Открытый ключ</string>
<string name="standard">Стандарт</string>
<string name="start">Старт</string>
<string name="status_bar_notification_info_overflow">>999</string>
<string name="status_bar_notification_info_overflow">&gt;999</string>
<string name="stop">Остановить</string>
<string name="stopping">Выключение…</string>
<string name="stun_attest_loading">Пожалуйста, подождите…</string>
<string name="stun_test">Обнаружение поведения NAT</string>
<string name="stun_test_summary">Определить поведение сопоставления адресов NAT и поведение фильтрации NAT в соответствии с RFC 5780 при помощи STUN.</string>
<string name="subscription">Подписка</string>
<string name="subscription_expire">Истекает: %s</string>
<string name="subscription_import">Импортировать подписку</string>
<string name="subscription_import_message">Подтвердите, что хотите импортировать подписку %s? Если вы импортируете из ненадежного источника, это может привести к утечке вашего IP-адреса и такого поведения.</string>
<string name="subscription_settings">Настройки подписки</string>
<string name="subscription_traffic" formatted="false">%s Использовано / %s Осталось</string>
<string name="subscription_traffic">%s Использовано / %s Осталось</string>
<string name="subscription_type">Тип подписки</string>
<string name="subscription_update">Обновление подписки</string>
<string name="subscription_update_message">Обновление %s …</string>
<string name="subscription_used">%s Использовано</string>
<string name="subscription_user_agent">UserAgent</string>
<string name="subscriptions">Подписки</string>
<string name="summary_collapsed_preference_list">%1$s, %2$s</string>
<string name="tcp_connections">%d TCP-соединений</string>
<string name="tcp_keep_alive_interval">Интервал доставки пакетов TCP keep-alive</string>
<string name="telegram">Канал обновлений в Telegram</string>
<string name="test_concurrency">Число параллельных подключений</string>
<string name="theme">Тема</string>
<string name="tile_title">Переключатель</string>
<string name="tls">Использовать TLS</string>
<string name="tls_camouflage_settings">Настройки защиты TLS</string>
<string name="tools_network">Сеть</string>
<string name="traffic">%1$s↑ %2$s↓</string>
<string name="traffic_sniffing">Включить анализ трафика</string>
<string name="trojan_provider">Провайдер Trojan</string>
<string name="tuic_congestion_controller">Контроллер перегрузки</string>
<string name="tuic_disable_sni">Отключить SNI</string>
<string name="tuic_reduce_rtt">Включить 0-RTT QUIC-соединение</string>
<string name="tuic_udp_relay_mode">Режим UDP-ретранслятора</string>
<string name="tun_implementation">Реализация TUN</string>
<string name="udp_connections">%d UDP-соединений</string>
<string name="unavailable">Недоступен</string>
<string name="undo">Отменить</string>
<string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить?</string>
<string name="update_all_subscription">Обновить все подписки</string>
<string name="update_current_subscription">Обновить подписку текущей группы</string>
<string name="update_settings">Обновить настройки</string>
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string>
@@ -428,17 +466,17 @@
<string name="v7_preference_on">ВКЛ.</string>
<string name="version_x">Версия (%s)</string>
<string name="vpn_connected">Подключено, нажмите для проверки подключения</string>
<string name="vpn_error">%s</string>
<string name="vpn_permission_denied">Отказано в разрешении на создание службы VPN</string>
<string name="wake_reset_connections">Сбрасывать исходящие соединения, при выходе из спящего режима</string>
<string name="wake_reset_connections">Сбросить исходящие соединения при выходе из спящего режима</string>
<string name="warp_generate">Создать конфигурацию</string>
<string name="warp_license">CloudFlare Warp - это бесплатный VPN-провайдер Wire Guard. Используя его, вы соглашаетесь с условиями использования.</string>
<string name="warp_license">CloudFlare Warp - это бесплатный VPN-провайдер WireGuard. Используя его, вы соглашаетесь с условиями использования.</string>
<string name="wireguard_local_address">Частный адрес</string>
<string name="wireguard_psk">Пароль сервера</string>
<string name="wireguard_public_key">Открытый ключ сервера</string>
<string name="ws_browser_forwarding">Пересылка через браузер</string>
<string name="ws_browser_forwarding_sum">Перенаправьте соответствующие веб-сокеты через браузер.</string>
<string name="ws_host">Хост WebSocket</string>
<string name="ws_max_early_data">Максимальный объём данных</string>
<string name="ws_path">Путь к WebSocket</string>
<string name="xtls_flow">Flow (подпротокол VLESS)</string>
<string name="yes">Да</string>
@@ -1,130 +1,523 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="port_local_dns">Локальний порт DNS</string>
<string name="dns_hosts">Переписування домену</string>
<string name="fakedns_message">Може призвести до перезапуску інших програм для повторного підключення до мережі після зупинки проксі</string>
<string name="enable_fakedns">Увімкніть FakeDNS</string>
<string name="dns_routing_message">Вирішуйте домени в обхідних маршрутах за допомогою Direct DNS. Будьте в курсі можливих витоків DNS</string>
<string name="enable_dns_routing">Увімкнути маршрутизацію DNS</string>
<string name="direct_dns">Прямий DNS</string>
<string name="remote_dns">Віддалений DNS</string>
<string name="cag_dns">Налаштування DNS</string>
<string name="connection_test_error_status_code">Код помилки: #%d</string>
<string name="connection_test_fail">Інтернет недоступний</string>
<string name="connection_test_error">Не вдалося: %s</string>
<string name="connection_test_available_http">Успішно: рукостискання HTTP зайняло %dms</string>
<string name="connection_test_available">Успіх: рукостискання HTTPS зайняло %dms</string>
<string name="connection_test_testing">Тестування…</string>
<string name="speed_detail">Проксі: %1$s↑ %2$s↓
\nПрямий: %3$s↑ %4$s↓</string>
<string name="allow_insecure_sum">Вимкнути перевірку сертифікатів. Якщо ввімкнено, ця конфігурація є такою ж безпечною, як і відкритий текст</string>
<string name="allow_insecure">Дозволити незахищене</string>
<string name="security_settings">Налаштування безпеки</string>
<string name="show_direct_speed_sum">У сповіщенні також покажіть швидкість трафіку без проксі -сервера</string>
<string name="show_direct_speed">Показати пряму швидкість</string>
<string name="show_stop_sum">Якщо ви не хочете використовувати Quick Tile як перемикач</string>
<string name="show_stop">Показати кнопку зупинки</string>
<string name="cag_misc">Різні налаштування</string>
<string name="speed_interval">Інтервал оновлення сповіщення про швидкість</string>
<string name="ws_browser_forwarding_sum">Пересилайте відповідні WebSockets через браузер.</string>
<string name="ws_browser_forwarding">Переадресація браузера</string>
<string name="cag_ws">Налаштування WebSocket</string>
<string name="require_http">Увімкнути вхідний протокол HTTP</string>
<string name="general_settings">Налаштування програми</string>
<string name="inbound_settings">Вхідні налаштування</string>
<string name="allow_access_sum">Прив’язати вхідні сервери до 0.0.0.0</string>
<string name="allow_access">Дозволити підключення з локальної мережі</string>
<string name="cag_route">Налаштування маршруту</string>
<string name="port_transproxy">Транспроксі -порт</string>
<string name="port_http">Проксі -порт HTTP</string>
<string name="port_proxy">Порт проксі -сервера SOCKS5</string>
<string name="service_mode_proxy">Тільки проксі</string>
<string name="service_mode">Режим обслуговування</string>
<string name="group_duplicate">Дублікат:
\n%s</string>
<string name="group_deleted">Видалено:
\n%s</string>
<string name="group_changed">Оновлено:
\n%s</string>
<string name="group_added">Додано:
\n%s</string>
<string name="group_delete_confirm_prompt">Ви впевнені, що хочете видалити цю групу\?</string>
<string name="group_diff">Різниця (%s)</string>
<string name="group_show_diff">Різниця</string>
<string name="group_updated">%s: Оновлено %d проксі</string>
<string name="group_no_difference">%s: Різниці немає</string>
<string name="group_status_proxies_subscription">%d проксі | Оновлено на %s</string>
<string name="group_status_proxies">%d проксі</string>
<string name="group_status_empty_subscription">Ще не оновлено</string>
<string name="group_status_empty">Порожня група</string>
<string name="group_edit_subscription">Редагувати підписку</string>
<string name="group_edit">Редагувати групу</string>
<string name="group_create_subscription">Створити підписку</string>
<string name="group_create">Створити групу</string>
<string name="group_name_required">Потрібна назва групи</string>
<string name="group_subscription_link">Посилання на підписку</string>
<string name="group_update">Оновлення</string>
<string name="group_name">Назва групи</string>
<string name="tile_title">Перемикач</string>
<string name="quick_toggle">Переключити</string>
<string name="group_default">Розгрупований</string>
<string name="document">Документ</string>
<string name="theme">Тема</string>
<string name="menu_about">Про</string>
<string name="menu_group">Група</string>
<string name="menu_configuration">Конфігурація</string>
<string name="logcat">Експорт інформації про налагодження</string>
<string name="version_x">Версія (%s)</string>
<string name="app_version">Версія</string>
<string name="oss_licenses">Ліцензії з відкритим кодом</string>
<string name="telegram">Канал оновлення Telegram</string>
<string name="github">Вихідний код</string>
<string name="project">Проєкт</string>
<string name="app_name" translatable="false">NekoBox</string>
<string name="app_name_long" translatable="false">NekoBox for Android</string>
<string name="app_desc">Універсальний набір інструментів проксі для Android, написаний на Kotlin.</string>
<string name="route_name">Назва маршруту</string>
<string name="delete_route_prompt">Ви впевнені, що хочете видалити цей маршрут\?</string>
<string name="route_add">Створити маршрут</string>
<string name="menu_route">Маршрут</string>
<string name="metered_summary">Система підказок щодо розгляду VPN як лічильника</string>
<string name="metered">Підказка з дозуванням</string>
<string name="only">Тільки</string>
<string name="prefer">Краще</string>
<string name="ipv6">Маршрут IPv6</string>
<string name="edit_config">Редагувати конфігурацію</string>
<string name="config_type">Тип конфігурації</string>
<string name="extra_headers">Додаткові заголовки</string>
<string name="encryption">Шифрування</string>
<string name="early_data_header_name">Назва раннього заголовка даних</string>
<string name="certificates">Сертифікати</string>
<string name="alpn">Переговори про протокол шару додатків</string>
<string name="sni">Індикація імені сервера</string>
<string name="tls">Використовуйте TLS</string>
<string name="grpc_service_name">ім\'я служби gRPC</string>
<string name="http_path">Шлях HTTP</string>
<string name="http_host">Хост HTTP</string>
<string name="ws_path">Шлях WebSocket</string>
<string name="ws_host">Хост WebSocket</string>
<string name="header_type">Тип заголовка</string>
<string name="network">Мережа</string>
<string name="security">Шифрування транспортного рівня</string>
<string name="alter_id">Змінити ідентифікатор</string>
<string name="uuid">ідентифікатор користувача</string>
<string name="protocol_param">Протокол Param</string>
<string name="protocol">Протокол</string>
<string name="enc_method">Метод шифрування</string>
<string name="password">Пароль</string>
<string name="key_opt">Ключ (необов’язково)</string>
<string name="password_opt">Пароль (необов’язково)</string>
<string name="username_opt">Ім\'я користувача (необов’язково)</string>
<string name="username">Ім\'я користувача</string>
<string name="server_port">Віддалений порт</string>
<string name="server_address">Сервер</string>
<string name="profile_name">Імя профілю</string>
<string name="connection_test_url">URL -адреса перевірки з\'єднання</string>
<string name="transproxy_mode">Режим Transproxy</string>
<string name="project">Проєкт</string>
<string name="github">Вихідний код</string>
<string name="telegram">Канал оновлень в Telegram</string>
<string name="oss_licenses">Ліцензії з відкритим кодом</string>
<string name="app_version">Версія</string>
<string name="version_x">Версія (%s)</string>
<string name="logcat">Експорт інформації про налагодження</string>
<string name="menu_configuration">Конфігурація</string>
<string name="menu_group">Група</string>
<string name="menu_about">Про додаток</string>
<string name="theme">Тема</string>
<string name="document">Документація</string>
<string name="group_default">Без групи</string>
<string name="quick_toggle">Перемикач</string>
<string name="tile_title">Перемикач</string>
<string name="menu_traffic">Трафік</string>
<string name="menu_dashboard">Панель керування sing-box</string>
<!-- externel -->
<string name="action_copy">Копіювати</string>
<string name="action_open">Відкрити</string>
<!-- group -->
<string name="group_name">Назва групи</string>
<string name="group_update">Оновити</string>
<string name="group_subscription_link">Посилання на підписку</string>
<string name="group_name_required">Потрібна назва групи</string>
<string name="group_create">Створити групу</string>
<string name="group_create_subscription">Створити підписку</string>
<string name="update_all_subscription">Оновити всі підписки</string>
<string name="group_edit">Редагувати групу</string>
<string name="group_edit_subscription">Редагувати підписку</string>
<string name="group_status_empty">Порожня група</string>
<string name="group_status_empty_subscription">Ще не оновлено</string>
<string name="group_status_proxies">%d проксі</string>
<string name="group_status_proxies_subscription">%d проксі | Оновлено %s</string>
<string name="group_no_difference">%s: Немає різниці</string>
<string name="group_updated">%s: Оновлено %d проксі</string>
<string name="group_show_diff">Різниця</string>
<string name="group_diff">Різниця (%s)</string>
<string name="group_delete_confirm_prompt">Ви впевнені, що хочете видалити цю групу?</string>
<string name="group_added">Додано: \n%s</string>
<string name="group_changed">Оновлено: \n%s</string>
<string name="group_deleted">Видалено: \n%s</string>
<string name="group_duplicate">Дублікат: \n%s</string>
<!-- misc -->
<string name="service_mode">Режим роботи</string>
<string name="service_mode_proxy">Тільки проксі</string>
<string name="service_mode_vpn" translatable="false">VPN</string>
<string name="port_proxy">Порт проксі-сервера SOCKS5</string>
<string name="port_http">Проксі-порт HTTP</string>
<string name="port_transproxy">Транспроксі-порт</string>
<string name="cag_route">Налаштування маршруту</string>
<string name="allow_access">Дозволити підключення з локальної мережі</string>
<string name="allow_access_sum">Прив’язати вхідні сервери до 0.0.0.0</string>
<string name="inbound_settings">Вхідні налаштування</string>
<string name="general_settings">Налаштування програми</string>
<string name="require_http">Увімкнути вхідний протокол HTTP</string>
<string name="cag_ws">Налаштування WebSocket</string>
<string name="ws_max_early_data" translatable="false">Max early data</string>
<string name="ws_browser_forwarding">Переадресація браузера</string>
<string name="ws_browser_forwarding_sum">Пересилайте відповідні WebSockets через браузер.</string>
<string name="speed_interval">Інтервал оновлення сповіщення про швидкість</string>
<string name="cag_misc">Різні налаштування</string>
<string name="show_stop">Показати кнопку зупинки</string>
<string name="show_stop_sum">Якщо ви не хочете використовувати Quick Tile як перемикач</string>
<string name="show_direct_speed">Показати пряму швидкість</string>
<string name="show_direct_speed_sum">У сповіщенні також покажіть швидкість трафіку без проксі-сервера</string>
<string name="security_settings">Налаштування безпеки TLS</string>
<string name="allow_insecure">Дозволити незахищене</string>
<string name="allow_insecure_sum">Вимкнути перевірку сертифікатів. Якщо ввімкнено, ця конфігурація є такою ж безпечною, як і відкритий текст</string>
<string name="traffic" translatable="false">%1$s↑ %2$s↓</string>
<string name="speed_detail">Проксі: %1$s↑ %2$s↓\nПрямий: %3$s↑ %4$s↓</string>
<string name="speed">%s/с</string>
<string name="connection_test_testing">Тестування…</string>
<string name="connection_test_available">Успіх: рукостискання HTTPS зайняло %dмс</string>
<string name="connection_test_available_http">Успіх: рукостискання HTTP зайняло %dмс</string>
<string name="connection_test_error">Не вдалося: %s</string>
<string name="connection_test_fail">Інтернет недоступний</string>
<string name="connection_test_error_status_code">Код помилки: #%d</string>
<string name="cag_dns">Налаштування DNS</string>
<string name="remote_dns">Віддалений DNS</string>
<string name="direct_dns">Прямий DNS</string>
<string name="enable_dns_routing">Увімкнути маршрутизацію DNS</string>
<string name="dns_routing_message">Вирішуйте домени в обхідних маршрутах за допомогою Direct DNS. Будьте в курсі можливих витоків DNS</string>
<string name="enable_fakedns">Увімкнути FakeDNS</string>
<string name="fakedns_message">Може призвести до перезапуску інших програм для повторного підключення до мережі після зупинки проксі</string>
<string name="dns_hosts">Переписування домену</string>
<string name="port_local_dns">Локальний порт DNS</string>
<string name="require_transproxy">Увімкнути вхідний сигнал Transproxy</string>
<string name="obfs_param">Obfs Парам</string>
<string name="transproxy_mode">Режим Transproxy</string>
<string name="connection_test_url">URL-адреса перевірки з\'єднання</string>
<!-- proxy category -->
<string name="profile_name">Ім\'я профілю</string>
<string name="server_address">Сервер</string>
<string name="server_port">Віддалений порт</string>
<string name="username">Ім\'я користувача</string>
<string name="username_opt">Ім\'я користувача (необов’язково)</string>
<string name="password_opt">Пароль (необов’язково)</string>
<string name="key_opt">Ключ (необов’язково)</string>
<string name="password">Пароль</string>
<string name="enc_method">Метод шифрування</string>
<string name="protocol">Протокол</string>
<string name="protocol_param">Параметр протоколу</string>
<string name="obfs">Obfs</string>
<string name="speed">%s/s</string>
<string name="menu_traffic">трафіку</string>
</resources>
<string name="obfs_param">Параметр Obfs</string>
<string name="uuid">ідентифікатор користувача</string>
<string name="alter_id">Змінити ідентифікатор</string>
<string name="security">Шифрування транспортного рівня</string>
<string name="network">Мережа</string>
<string name="header_type">Тип заголовка</string>
<string name="ws_host">Хост WebSocket</string>
<string name="ws_path">Шлях WebSocket</string>
<string name="http_host">Хост HTTP</string>
<string name="http_path">Шлях HTTP</string>
<string name="grpc_service_name">ім\'я служби gRPC</string>
<string name="tls">Використовувати TLS</string>
<string name="sni">Індикація імені сервера</string>
<string name="alpn">Переговори про протокол шару додатків</string>
<string name="certificates">Сертифікати</string>
<string name="early_data_header_name">Назва раннього заголовка даних</string>
<string name="encryption">Шифрування</string>
<string name="extra_headers">Додаткові заголовки</string>
<string name="config_type">Тип конфігурації</string>
<string name="edit_config">Редагувати конфігурацію</string>
<!-- feature category -->
<string name="ipv6">Маршрут IPv6</string>
<string name="prefer">Віддавати перевагу</string>
<string name="only">Тільки</string>
<string name="metered">Лімітне підключення</string>
<string name="metered_summary">Повідомляти системі, що VPN-з\'єднання є лімітним</string>
<string name="menu_route">Маршрут</string>
<string name="route_add">Створити маршрут</string>
<string name="delete_route_prompt">Ви впевнені, що хочете видалити цей маршрут?</string>
<string name="route_name">Назва маршруту</string>
<string name="route_proxy">Проксі</string>
<string name="route_bypass">В обхід</string>
<string name="route_block">Блокувати</string>
<string name="route_profile">Вибрати профіль…</string>
<string name="empty_route">Порожній маршрут</string>
<string name="empty_route_notice">Встановіть правила перед збереженням</string>
<string name="route_bypass_domain">Правило домену для %s</string>
<string name="route_play_store">Правило Play Store для %s</string>
<string name="route_bypass_ip">Правило IP для %s</string>
<string name="route_reset">Скинути</string>
<string name="route_manage_assets">Керування ресурсами маршрутів</string>
<string name="route_assets">Ресурси</string>
<string name="route_rules_provider">Постачальник ресурсів правил</string>
<string name="route_rules_official">Офіційний</string>
<string name="route_asset_status">Локальна версія: %s</string>
<string name="route_asset_no_update">Немає оновлень</string>
<string name="route_asset_updated">Оновлено</string>
<string name="route_not_asset">Це не файл ресурсів: очікувався .db, але отримано %s</string>
<string name="route_opt_bypass_lan">Обходити локальну мережу</string>
<string name="route_opt_block_ads">Блокувати рекламу</string>
<string name="route_opt_block_analysis">Блокувати аналітику</string>
<string name="route_opt_block_quic">Блокувати QUIC</string>
<string name="domain_strategy">Стратегія визначення доменів</string>
<string name="traffic_sniffing">Увімкнути аналіз трафіку</string>
<string name="enable_mux">Увімкнути мультиплексор</string>
<string name="mux_sum">Mux призначений для зменшення затримки рукостискання TCP, а не для збільшення пропускної здатності з\'єднання. Використання Mux для перегляду відео, завантаження або тестування швидкості зазвичай є контрпродуктивним. Якщо сервер його не підтримує, ви не зможете отримати доступ до Інтернету.</string>
<string name="mux_concurrency">Паралельні з\'єднання Mux</string>
<string name="tcp_keep_alive_interval">Інтервал доставки пакетів TCP keep-alive</string>
<string name="proxied_apps">Програми в режимі VPN</string>
<string name="proxied_apps_summary">Налаштувати режим VPN для вибраних програм</string>
<string name="on">Увімк</string>
<string name="off">Вимк</string>
<string name="search_apps">Пошук…</string>
<string name="scanning">Сканування…</string>
<string name="invert_selections">Інвертувати вибір</string>
<string name="clear_selections">Очистити вибір</string>
<string name="bypass_apps">В обхід</string>
<string name="show_system_apps">Показувати системні програми</string>
<string name="auto_connect">Автоматичне підключення</string>
<string name="auto_connect_summary">Вмикати проксі під час запуску/оновлення програми, якщо він працював раніше</string>
<string name="direct_boot_aware">Дозволити перемикання на екрані блокування</string>
<string name="direct_boot_aware_summary">Інформація про ваш вибраний профіль буде менш захищеною</string>
<!-- notification category -->
<string name="service_vpn">Служба VPN</string>
<string name="service_proxy">Служба проксі</string>
<string name="forward_success">Проксі запущено.</string>
<string name="invalid_server">Неправильне ім\'я сервера</string>
<string name="service_failed">Не вдалося: </string>
<string name="stop">Зупинити</string>
<string name="stopping">Зупинка…</string>
<string name="vpn_error">%s</string>
<string name="vpn_permission_denied">Дозвіл на створення служби VPN відхилено</string>
<string name="reboot_required">Не вдалося запустити службу VPN. Можливо, вам доведеться перезавантажити пристрій.</string>
<!-- alert category -->
<string name="profile_empty">Будь ласка, виберіть профіль</string>
<string name="connect">Підключити</string>
<string name="clipboard_empty">Буфер обміну порожній</string>
<!-- menu category -->
<string name="settings">Налаштування</string>
<string name="edit">Редагувати</string>
<string name="share">Поділитися</string>
<string name="add_profile">Додати профіль</string>
<string name="select_profile">Вибрати профіль</string>
<string name="action_socks" translatable="false">SOCKS</string>
<string name="action_http" translatable="false">HTTP</string>
<string name="action_shadowsocks" translatable="false">Shadowsocks</string>
<string name="action_shadowsocksr" translatable="false">ShadowsocksR</string>
<string name="action_vmess" translatable="false">VMess</string>
<string name="action_trojan" translatable="false">Trojan</string>
<string name="action_trojan_go" translatable="false">Trojan Go</string>
<string name="action_mieru" translatable="false">Mieru</string>
<string name="action_naive" translatable="false">Naïve</string>
<string name="action_anytls" translatable="false">AnyTLS</string>
<string name="action_hysteria" translatable="false">Hysteria</string>
<string name="action_ssh" translatable="false">SSH</string>
<string name="action_wireguard" translatable="false">WireGuard</string>
<string name="action_tuic" translatable="false">TUIC</string>
<string name="proxy_chain">Ланцюжок проксі</string>
<string name="custom_config">Власна конфігурація</string>
<string name="balancer">Балансувальник</string>
<string name="balancer_settings">Налаштування балансувальника</string>
<string name="balancer_type">Тип</string>
<string name="balancer_strategy">Стратегія</string>
<string name="chain_settings">Налаштування ланцюжка</string>
<string name="config_settings">Налаштування конфігурації</string>
<string name="circular_reference">Циклічне посилання</string>
<string name="circular_reference_sum">Маршрут не може містити самого себе.</string>
<string name="clear_profiles">Очистити</string>
<string name="action_create_group">Порожня група</string>
<string name="action_from_link">З підписки</string>
<string name="action_scan_china_apps">Сканувати китайські програми</string>
<string name="action_export_file">Експортувати у файл</string>
<string name="action_export_clipboard">Експортувати в буфер обміну</string>
<string name="action_export">Експорт</string>
<string name="action_import">Імпортувати з буфера обміну</string>
<string name="action_import_file">Імпортувати з файлу</string>
<string name="action_export_msg">Експортовано успішно!</string>
<string name="action_export_err">Не вдалося експортувати.</string>
<string name="action_import_msg">Імпортовано успішно!</string>
<string name="action_import_err">Не вдалося імпортувати.</string>
<string name="file_manager_missing">На вашому пристрої відсутній стандартний файловий менеджер Android, будь ласка, встановіть його, наприклад, Material Files.</string>
<!-- share -->
<!-- profile -->
<string name="profile_config">Конфігурація профілю</string>
<string name="delete">Видалити</string>
<string name="delete_confirm_prompt">Ви впевнені, що хочете видалити цей профіль?</string>
<string name="share_qr_nfc">QR-код</string>
<string name="add_profile_methods_scan_qr_code">Сканувати QR-код</string>
<string name="add_profile_methods_manual_settings">Ручні налаштування</string>
<plurals name="removed">
<item quantity="one">Видалено</item>
<item quantity="few">Видалено %d елементи</item>
<item quantity="many">Видалено %d елементів</item>
<item quantity="other">Видалено %d елемента</item>
</plurals>
<plurals name="added">
<item quantity="one">Додано</item>
<item quantity="few">Додано %d проксі</item>
<item quantity="many">Додано %d проксі</item>
<item quantity="other">Додано %d проксі</item>
</plurals>
<string name="undo">Скасувати</string>
<string name="insecure">Незахищений</string>
<string name="deprecated">Застарілий</string>
<!-- tasker -->
<!-- status -->
<string name="connecting">Підключення…</string>
<string name="vpn_connected">Підключено, торкніться, щоб перевірити з\'єднання</string>
<string name="not_connected">Не підключено</string>
<!-- subscriptions -->
<string name="subscriptions">Підписки</string>
<string name="cleartext_http_warning">HTTP-трафік у відкритому вигляді є незахищеним</string>
<string name="error_title">Помилка</string>
<string name="no_proxies_found">Проксі за посиланням не знайдено</string>
<string name="no_proxies_found_in_subscription">У підписці не знайдено проксі</string>
<string name="no_proxies_found_in_file">У файлі не знайдено проксі</string>
<string name="no_proxies_found_in_clipboard">У буфері обміну не знайдено проксі</string>
<string name="deduplication">Дедуплікація</string>
<string name="donate">Пожертвувати</string>
<string name="donate_info">Я люблю гроші</string>
<string name="ignore_battery_optimizations">Ігнорувати оптимізацію батареї</string>
<string name="ignore_battery_optimizations_sum">Зняти деякі обмеження</string>
<!-- plugin -->
<string name="plugin">Плагін</string>
<string name="plugin_configure">Налаштувати…</string>
<string name="plugin_disabled">Вимкнено</string>
<string name="plugin_unknown">Невідомий плагін %s</string>
<string name="plugin_untrusted">Попередження: цей плагін, здається, не з надійного джерела.</string>
<string name="plugin_auto_connect_unlock_only">Цей плагін може не працювати з автоматичним підключенням</string>
<string name="proxy_cat">Налаштування сервера</string>
<string name="ss_cat">Налаштування Shadowsocks</string>
<string name="unsaved_changes_prompt">Зміни не збережено. Ви хочете зберегти?</string>
<string name="yes">Так</string>
<string name="no">Ні</string>
<string name="apply">Застосувати</string>
<string name="need_reload">Перезавантажте службу проксі, щоб застосувати зміни</string>
<string name="license">Ліцензія</string>
<string name="route_warn">Переконайтеся, що ви прочитали документацію перед додаванням власних правил, інакше ви можете не підключитися до Інтернету.</string>
<string name="lines">%d рядків</string>
<string name="night_mode">Нічний режим</string>
<string name="follow_system">Як у системі</string>
<string name="enable">Увімкнути</string>
<string name="disable">Вимкнути</string>
<string name="auto">Авто</string>
<string name="enable_log">Увімкнути журнал</string>
<string name="enable_log_sum">Для налагодження</string>
<string name="list">Список</string>
<string name="random">Випадковий</string>
<string name="leastPing" translatable="false">Ping</string>
<string name="api_port">Порт API</string>
<string name="probe_interval">Інтервал спостереження балансувальника</string>
<string name="standard">Стандартний</string>
<string name="v2rayn" translatable="false">V2RayN</string>
<string name="available" translatable="false">%dмс</string>
<string name="unavailable">Недоступний</string>
<string name="always_show_address">Завжди показувати адресу</string>
<string name="always_show_address_sum">Завжди відображати адресу сервера на картці конфігурації</string>
<string name="clear_traffic_statistics">Очистити статистику трафіку</string>
<string name="connection_test">Тест з\'єднання</string>
<string name="connection_test_clear_results">Очистити результати тесту</string>
<string name="connection_test_tcp_ping" translatable="false">TCPing</string>
<string name="connection_test_tcp_ping_unavailable">TCPing недоступний</string>
<string name="connection_test_icmp_ping" translatable="false">ICMPing</string>
<string name="connection_test_icmp_ping_unavailable">ICMPing недоступний</string>
<string name="connection_test_url_test" translatable="false">URL Test</string>
<string name="connection_test_domain_not_found">Домен не знайдено</string>
<string name="connection_test_refused">З\'єднання відхилено</string>
<string name="connection_test_unreachable">Недоступний</string>
<string name="connection_test_timeout">Час очікування минув</string>
<string name="append_http_proxy">Додати HTTP-проксі до VPN</string>
<string name="append_http_proxy_sum">HTTP-проксі буде використовуватися безпосередньо (браузером / деякими підтримуваними програмами), не проходячи через віртуальний мережевий пристрій (Android 10+)</string>
<string name="protocol_settings">Налаштування протоколу</string>
<string name="trojan_provider">Постачальник Trojan</string>
<string name="group_basic">Основні</string>
<string name="group_settings">Налаштування групи</string>
<string name="subscription">Підписка</string>
<string name="subscription_settings">Налаштування підписки</string>
<string name="group_type">Тип групи</string>
<string name="subscription_type">Тип підписки</string>
<string name="delete_group_prompt">Ви впевнені, що хочете видалити цю групу?</string>
<string name="force_resolve">Примусове визначення</string>
<string name="force_resolve_sum">Визначати всі доменні імена в IP-адреси під час оновлення. Хост і SNI будуть автоматично додані, якщо це можливо</string>
<string name="deduplication_sum">Видаляти дублікати конфігурацій під час оновлення</string>
<string name="raw">Raw</string>
<string name="update_settings">Налаштування оновлення</string>
<string name="auto_update">Автоматичне оновлення</string>
<string name="auto_update_delay">Затримка автооновлення (у хвилинах)</string>
<string name="update_when_connected_only">Оновлювати лише при підключенні</string>
<string name="update_when_connected_only_sum">Запобігати витоку IP-адреси</string>
<string name="subscription_user_agent">UserAgent</string>
<string name="confirm">Підтвердити</string>
<string name="missing_plugin">Відсутній плагін</string>
<string name="profile_requiring_plugin">Профіль %s вимагає встановлення плагіна %s, але його не знайдено.</string>
<string name="action_learn_more">ДІЗНАТИСЯ БІЛЬШЕ</string>
<string name="action_download">ЗАВАНТАЖИТИ</string>
<string name="install_from_play_store">Встановити з Play Store</string>
<string name="install_from_fdroid">Встановити з F-Droid</string>
<string name="download">Завантажити</string>
<string name="ooc_subscription_token" translatable="false">OOCv1 API Token</string>
<string name="ooc_subscription_token_invalid">Неправильний токен OOCv1</string>
<string name="update_subscription_warning">Проксі не підключено, ви впевнені, що хочете продовжити оновлення?</string>
<string name="ooc_warning">Попередження</string>
<string name="ooc_missing_protocol">Підписка вимагає підтримки протоколу %s, але його не знайдено. Непідтримувані профілі будуть проігноровані.</string>
<string name="service_subscription">Служба оновлення підписок</string>
<string name="subscription_update">Оновлення підписки</string>
<string name="subscription_update_message">Оновлення %s …</string>
<string name="group_filter">Фільтр</string>
<string name="subscription_used">Використано %s</string>
<string name="subscription_traffic">Використано %s / Залишилося %s</string>
<string name="subscription_expire">Закінчується: %s</string>
<string name="subscription_import">Імпортувати підписку</string>
<string name="subscription_import_message">Підтвердьте, що ви хочете імпортувати підписку %s? Якщо ви робите це з ненадійного джерела, це може призвести до витоку вашої IP-адреси та даних про цю дію.</string>
<string name="profile_import">Імпортувати профіль</string>
<string name="profile_import_message">Підтвердьте, що ви хочете імпортувати профіль %s?</string>
<string name="clear_profiles_message">Ви впевнені, що хочете очистити цю групу?</string>
<string name="apps">Програми</string>
<string name="select_apps">Вибрати програми</string>
<string name="apps_message">%d програм</string>
<string name="hysteria_obfs">Пароль обфускації</string>
<string name="hysteria_auth_type">Тип автентифікації</string>
<string name="hysteria_auth_payload">Дані автентифікації</string>
<string name="hysteria_upload_mbps">Макс. швидкість вивантаження (у Мбіт/с)</string>
<string name="hysteria_download_mbps">Макс. швидкість завантаження (у Мбіт/с)</string>
<string name="experimental_settings">Експериментальні</string>
<string name="hysteria_stream_receive_window">Вікно прийому потоку QUIC</string>
<string name="hysteria_connection_receive_window">Вікно прийому з\'єднання QUIC</string>
<string name="hysteria_disable_mtu_discovery">Вимкнути виявлення Path MTU</string>
<string name="group_order">Порядок</string>
<string name="group_order_origin">За замовчуванням</string>
<string name="group_order_by_name">За назвою</string>
<string name="group_order_by_delay">За затримкою</string>
<string name="plugin_exists_but_on_shit_system">Профіль %s вимагає плагін %s, але ваш виробник обладнання (зазвичай гіганти-капіталісти зі спостереження та виробники шкідливого ПЗ) змінив вашу систему Android, зробивши плагін непридатним для використання.</string>
<string name="shadowsocks_plugin_simple_obfs">Simple Obfs (плагін для Shadowsocks)</string>
<string name="shadowsocks_plugin_v2ray">V2Ray (плагін для Shadowsocks)</string>
<string name="traffic_uplink" translatable="false">%s | %s/с</string>
<string name="traffic_downlink" translatable="false">%s | %s/с</string>
<string name="traffic_uplink_total" translatable="false">Всього %s ↑</string>
<string name="traffic_downlink_total" translatable="false">Всього %s ↓</string>
<string name="tcp_connections">%d TCP-з\'єднань</string>
<string name="udp_connections">%d UDP-з\'єднань</string>
<string name="copy_label">Копіювати назву</string>
<string name="copy_package_name">Копіювати назву пакета</string>
<string name="open_app">Відкрити програму</string>
<string name="open_settings">Відкрити налаштування</string>
<string name="open_market">Відкрити в маркеті</string>
<string name="create_rule">Створити правило</string>
<string name="copy_success">Скопійовано успішно!</string>
<string name="copy_failed">Не вдалося скопіювати.</string>
<string name="app_no_launcher">Програма не має інтерфейсу.</string>
<string name="route_for">Правило для %s</string>
<string name="route_need_vpn">Правило маршрутизації %s залежить від VPN, щоб набути чинності, тому воно ігнорується.</string>
<string name="profile_traffic_statistics">Статистика трафіку профілю</string>
<string name="profile_traffic_statistics_summary">Якщо вимкнено, використаний трафік не буде враховуватися</string>
<string name="no_statistics">Статистики ще немає</string>
<string name="app_statistics_disabled">Статистика трафіку програм вимкнена</string>
<string name="ssh_auth_type_none">Немає</string>
<string name="ssh_public_key">Публічний ключ</string>
<string name="ssh_private_key">Приватний ключ</string>
<string name="ssh_private_key_passphrase">Парольна фраза приватного ключа</string>
<string name="translate_platform">Платформа для перекладу</string>
<string name="menu_tools">Інструменти</string>
<string name="menu_log">Журнали</string>
<string name="clear_logcat">Очистити Logcat</string>
<string name="wireguard_local_address">Локальна адреса</string>
<string name="wireguard_public_key">Публічний ключ піра</string>
<string name="wireguard_psk">Pre-Shared Key піра</string>
<string name="cloudflare_wrap" translatable="false">Cloudflare Warp</string>
<string name="warp_license">CloudFlare Warp це безкоштовний VPN-провайдер, що використовує WireGuard. Використовуючи його, ви погоджуєтеся з Умовами надання послуг.</string>
<string name="warp_generate">Згенерувати конфігурацію</string>
<string name="generating">Генерація…</string>
<string name="tun_implementation">Реалізація TUN</string>
<string name="destination_override">Перевизначити призначення</string>
<string name="destination_override_summary">Використовувати перехоплений домен для перезапису адреси призначення, а не лише для маршрутизації</string>
<string name="resolve_destination">Визначати призначення</string>
<string name="resolve_destination_summary">Якщо адреса призначення є доменом, вона передається далі на основі стратегії IPv6 (конфліктує з FakeDNS)</string>
<string name="pcap" translatable="false">Pcap</string>
<string name="pcap_notice">Файли Pcap будуть збережені в %s</string>
<string name="naive_insecure_concurrency">Небезпечна паралельність</string>
<string name="naive_insecure_concurrency_summary">Використовуйте N паралельних тунельних з\'єднань для більшої стійкості в поганих мережевих умовах. Більша кількість з\'єднань полегшує виявлення тунелювання та робить його менш безпечним. Цей проєкт прагне до найсильнішого захисту від аналізу трафіку. Використання його небезпечним способом суперечить його меті. \n\nЯкщо ви все ж таки повинні це використовувати, спробуйте спочатку N=2, щоб побачити, чи це вирішить ваші проблеми. Наполегливо не рекомендується використовувати більше 4 з\'єднань.</string>
<string name="stun_test">Виявлення поведінки NAT</string>
<string name="stun_test_summary">Визначити поведінку відображення NAT клієнта та поведінку фільтрації NAT, визначену в RFC 3478, за допомогою STUN.</string>
<string name="start">Почати</string>
<string name="stun_attest_loading">Це може зайняти кілька хвилин…</string>
<string name="nat_stun_server_hint">STUN-сервер</string>
<string name="nat_result_hint">Результат перевірки NAT</string>
<string name="tools_network">Мережа</string>
<string name="mtu" translatable="false">MTU</string>
<string name="backup">Резервне копіювання</string>
<string name="backup_groups_and_configurations">Групи та конфігурації</string>
<string name="backup_rules">Правила маршрутизації</string>
<string name="backup_settings">Налаштування</string>
<string name="backup_summary">Якщо налаштування маршрутизації не будуть збережені разом з конфігураціями, власні вихідні з\'єднання будуть втрачені.</string>
<string name="backup_not_file">Не є файлом резервної копії: очікувався .json, але отримано %s</string>
<string name="invalid_backup_file">Неправильний файл резервної копії</string>
<string name="backup_import">Імпорт</string>
<string name="backup_import_summary">Імпортування перезапише наявні дані.</string>
<string name="backup_importing">Імпортування…</string>
<string name="packet_encoding">Кодування пакетів</string>
<string name="acquire_wake_lock">Захоплювати WakeLock</string>
<string name="release_wake_lock">Відпускати WakeLock</string>
<string name="acquire_wake_lock_summary">Не давати процесору заснути</string>
<string name="action_switch">Перемкнути</string>
<string name="tuic_udp_relay_mode">Режим ретрансляції UDP</string>
<string name="tuic_congestion_controller">Контролер перевантаження</string>
<string name="tuic_disable_sni">Вимкнути SNI</string>
<string name="tuic_reduce_rtt">Увімкнути 0-RTT QUIC рукостискання</string>
<string name="please_update">Ваша програма занадто стара (%s) і перестане працювати %s. Будь ласка, оновіть її!</string>
<string name="please_update_force">Ваша програма занадто стара (%s) і перестала працювати %s. Будь ласка, оновіть її!</string>
<string name="connection_test_delete_unavailable">Очистити недоступні</string>
<string name="move">Перемістити</string>
<string name="exe_prefer_provider">Пріоритетний постачальник плагіна</string>
<string name="create_shortcut">Створити ярлик</string>
<string name="app_tls_version">Мінімальна версія TLS для підписки</string>
<string name="hop_interval">Інтервал зміни портів (секунди)</string>
<string name="domain_strategy_for_remote">Стратегія доменів для віддаленого</string>
<string name="domain_strategy_for_direct">Стратегія доменів для прямого</string>
<string name="domain_strategy_for_server">Стратегія доменів для адреси сервера</string>
<string name="show_bottom_bar">Показувати нижню панель, як у SagerNet</string>
<string name="utls_fingerprint">Відбиток uTLS</string>
<string name="custom_outbound_json">Власний JSON вихідного з\'єднання</string>
<string name="custom_config_json">Власний JSON конфігурації</string>
<string name="is_outbound_only">Встановлений JSON є лише вихідним з\'єднанням</string>
<string name="save">Зберегти</string>
<string name="set_panel_url">Встановити URL панелі</string>
<string name="enable_clash_api">Увімкнути Clash API</string>
<string name="log_level">Рівень журналу</string>
<string name="enable_clash_api_summary">Надати Clash API та панель yacd за адресою 127.0.0.1:9090</string>
<string name="xtls_flow">Flow (підпротокол VLESS)</string>
<string name="ads">Реклама</string>
<string name="bypass_lan_in_core">Обходити ЛВС в ядрі</string>
<string name="need_restart">Перезапустіть програму, щоб застосувати зміни</string>
<string name="use_selector">Використовувати селектор</string>
<string name="front_proxy">Передній проксі</string>
<string name="landing_proxy">Проксі-призначення</string>
<string name="action_shadowtls" translatable="false">ShadowTLS</string>
<string name="protocol_version">Версія протоколу</string>
<string name="share_subscription">Поділитися підпискою</string>
<string name="show_group_in_notification">Показувати назву групи у сповіщенні</string>
<string name="reset_connections">Скинути з\'єднання</string>
<string name="remove_duplicate">Видалити дублікати серверів</string>
<string name="mtu_help">Довге натискання на налаштування, щоб встановити власний MTU.</string>
<string name="log_level_help">Довге натискання на налаштування, щоб встановити розмір буфера.</string>
<string name="tls_camouflage_settings">Налаштування маскування TLS</string>
<string name="test_concurrency">Паралелізм тесту</string>
<string name="mux_type">Протокол Mux</string>
<string name="sniff_routing">Результат аналізу для маршрутизації</string>
<string name="sniff_override">Результат аналізу для призначення</string>
<string name="resolve_server">Визначати адресу сервера відповідно до політики IPv6</string>
<string name="auto_select_proxy_apps">Автоматичний вибір програм для проксі</string>
<string name="auto_select_proxy_apps_message">Автоматично вибрати програми для проксі, це очистить ваш поточний вибір.</string>
<string name="enable_ech">Увімкнути ECH</string>
<string name="enable_ech_sum">Увімкнути Encrypted Client Hello</string>
<string name="ech_settings">Налаштування ECH</string>
<string name="ech_config">Конфігурація ECH</string>
<string name="http_upgrade_host">Хост HTTPUpgrade</string>
<string name="http_upgrade_path">Шлях HTTPUpgrade</string>
<string name="update_current_subscription">Оновити підписку поточної групи</string>
<string name="group_not_subscription">Тип групи не є підпискою</string>
<string name="allow_insecure_on_request_sum">Вимкнути перевірку сертифіката під час оновлення підписок</string>
<string name="global_allow_insecure">Завжди дозволяти незахищене</string>
<string name="mux_preference">Мультиплексування</string>
<string name="padding">Заповнення (Padding)</string>
<string name="network_change_reset_connections">Скидати вихідні з\'єднання при зміні мережі</string>
<string name="wake_reset_connections">Скидати вихідні з\'єднання при виході пристрою зі сну</string>
</resources>
@@ -486,4 +486,11 @@
<string name="global_allow_insecure">总是跳过 TLS 证书验证</string>
<string name="network_change_reset_connections">当网络发生变化时重置出站连接</string>
<string name="wake_reset_connections">当设备从睡眠状态唤醒时重置出站连接</string>
<string name="preview_version">预览版</string>
<string name="preview_version_hint">本应用为预览版,可能存在诸多问题。若您不愿参与测试,请前往GitHub下载正式发布版本!</string>
<string name="check_update_preview">检查预览版更新</string>
<string name="check_update_release">检查正式版</string>
<string name="update_dialog_title">发现新版本</string>
<string name="update_dialog_message">当前版本:%1$s\n可升级版本:%2$s\n是否前往下载?</string>
<string name="check_update_no">检查成功,但没有更新。</string>
</resources>
@@ -566,4 +566,11 @@
<string name="padding">Padding</string>
<string name="network_change_reset_connections">Reset outbound connections when network changes</string>
<string name="wake_reset_connections">Reset outbound connections when device wake from sleep</string>
<string name="preview_version">Preview version</string>
<string name="preview_version_hint">This application is a preview version and may contain many problems. If you do not want to test it, please go to GitHub to download the Release version!</string>
<string name="check_update_preview">Check for preview version updates</string>
<string name="check_update_release">Check for release version updates</string>
<string name="update_dialog_title">New version available</string>
<string name="update_dialog_message">Current version: %1$s\nAvailable version: %2$s\nDo you want to download it?</string>
<string name="check_update_no">Check successful, but no updates.</string>
</resources>
@@ -1,2 +1,2 @@
export COMMIT_SING_BOX="01b72e129794acae89e1c7929d0ba5a63b0e67f8"
export COMMIT_SING_BOX="cc3a8000fdc0c9ddf9aa1ab4d6aacdfec91d8e73"
export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b"
@@ -14,33 +14,6 @@ private val Project.android get() = extensions.getByName<ApplicationExtension>("
private lateinit var metadata: Properties
private lateinit var localProperties: Properties
private lateinit var flavor: String
fun Project.requireFlavor(): String {
if (::flavor.isInitialized) return flavor
if (gradle.startParameter.taskNames.isNotEmpty()) {
val taskName = gradle.startParameter.taskNames[0]
when {
taskName.contains("assemble") -> {
flavor = taskName.substringAfter("assemble")
return flavor
}
taskName.contains("install") -> {
flavor = taskName.substringAfter("install")
return flavor
}
taskName.contains("bundle") -> {
flavor = taskName.substringAfter("bundle")
return flavor
}
}
}
flavor = ""
return flavor
}
fun Project.requireMetadata(): Properties {
if (!::metadata.isInitialized) {
@@ -156,8 +129,6 @@ fun Project.setupAppCommon() {
keyPassword = pwd
}
}
} else if (requireFlavor().contains("(Oss|Expert|Play)Release".toRegex())) {
exitProcess(0)
}
buildTypes {
val key = signingConfigs.findByName("release")
@@ -178,6 +149,7 @@ fun Project.setupApp() {
applicationId = pkgName
versionCode = verCode
versionName = verName
buildConfigField("String", "PRE_VERSION_NAME", "\"\"")
}
}
setupAppCommon()
@@ -209,6 +181,13 @@ fun Project.setupApp() {
create("oss")
create("fdroid")
create("play")
create("preview") {
buildConfigField(
"String",
"PRE_VERSION_NAME",
"\"${requireMetadata().getProperty("PRE_VERSION_NAME")}\""
)
}
}
applicationVariants.all {
+25 -6
View File
@@ -14,6 +14,7 @@ import (
"github.com/matsuridayo/libneko/protect_server"
"github.com/matsuridayo/libneko/speedtest"
"github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/boxapi"
"github.com/sagernet/sing-box/experimental/libbox/platform"
"github.com/sagernet/sing-box/protocol/group"
@@ -83,7 +84,7 @@ func NewSingBoxInstance(config string) (b *BoxInstance, err error) {
// create box context
ctx, cancel := context.WithCancel(context.Background())
ctx = box.Context(ctx, nekoboxAndroidInboundRegistry(), nekoboxAndroidOutboundRegistry(), nekoboxAndroidEndpointRegistry())
ctx = box.Context(ctx, nekoboxAndroidInboundRegistry(), nekoboxAndroidOutboundRegistry(), nekoboxAndroidEndpointRegistry(), nekoboxAndroidDNSTransportRegistry(), nekoboxAndroidServiceRegistry())
ctx = service.ContextWithDefaultRegistry(ctx)
service.MustRegister[platform.Interface](ctx, boxPlatformInterfaceInstance)
@@ -182,11 +183,17 @@ func (b *BoxInstance) SetAsMain() {
}
func (b *BoxInstance) SetV2rayStats(outbounds string) {
b.access.Lock()
defer b.access.Unlock()
if b.v2api != nil {
log.Println("duplicate call of SetV2rayStats")
return
}
b.v2api = boxapi.NewSbV2rayServer(option.V2RayStatsServiceOptions{
Enabled: true,
Outbounds: strings.Split(outbounds, "\n"),
})
b.Box.Router().SetNekoTracker(b.v2api.StatsService())
b.Box.Router().AppendTracker(b.v2api.StatsService())
}
func (b *BoxInstance) QueryStats(tag, direct string) int64 {
@@ -205,11 +212,23 @@ func (b *BoxInstance) SelectOutbound(tag string) bool {
func UrlTest(i *BoxInstance, link string, timeout int32) (latency int32, err error) {
defer device.DeferPanicToError("box.UrlTest", func(err_ error) { err = err_ })
if i == nil {
// test current
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(mainInstance.Box), link, timeout, speedtest.UrlTestStandard_RTT)
var connectionTracker adapter.ConnectionTracker
// test i
if i != nil {
if i.v2api != nil {
connectionTracker = i.v2api.StatsService()
}
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(i.Box, connectionTracker), link, timeout, speedtest.UrlTestStandard_RTT)
}
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(i.Box), link, timeout, speedtest.UrlTestStandard_RTT)
// test direct
if mainInstance == nil {
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(nil, nil), link, timeout, speedtest.UrlTestStandard_RTT)
}
// test mainInstance
if mainInstance.v2api != nil {
connectionTracker = mainInstance.v2api.StatsService()
}
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(mainInstance.Box, connectionTracker), link, timeout, speedtest.UrlTestStandard_RTT)
}
var protectCloser io.Closer
+33 -20
View File
@@ -4,10 +4,17 @@ import (
"github.com/sagernet/sing-box/adapter/endpoint"
"github.com/sagernet/sing-box/adapter/inbound"
"github.com/sagernet/sing-box/adapter/outbound"
"github.com/sagernet/sing-box/adapter/service"
"github.com/sagernet/sing-box/dns"
"github.com/sagernet/sing-box/dns/transport"
"github.com/sagernet/sing-box/dns/transport/fakeip"
"github.com/sagernet/sing-box/dns/transport/hosts"
"github.com/sagernet/sing-box/dns/transport/local"
"github.com/sagernet/sing-box/dns/transport/quic"
"github.com/sagernet/sing-box/protocol/anytls"
"github.com/sagernet/sing-box/protocol/block"
"github.com/sagernet/sing-box/protocol/direct"
"github.com/sagernet/sing-box/protocol/dns"
protocolDns "github.com/sagernet/sing-box/protocol/dns"
"github.com/sagernet/sing-box/protocol/group"
"github.com/sagernet/sing-box/protocol/http"
"github.com/sagernet/sing-box/protocol/hysteria"
@@ -52,7 +59,7 @@ func nekoboxAndroidOutboundRegistry() *outbound.Registry {
direct.RegisterOutbound(registry)
block.RegisterOutbound(registry)
dns.RegisterOutbound(registry)
protocolDns.RegisterOutbound(registry)
group.RegisterSelector(registry)
group.RegisterURLTest(registry)
@@ -68,8 +75,11 @@ func nekoboxAndroidOutboundRegistry() *outbound.Registry {
vless.RegisterOutbound(registry)
anytls.RegisterOutbound(registry)
registerQUICOutbounds(registry)
registerWireGuardOutbound(registry)
hysteria.RegisterOutbound(registry)
tuic.RegisterOutbound(registry)
hysteria2.RegisterOutbound(registry)
wireguard.RegisterOutbound(registry)
return registry
}
@@ -77,27 +87,30 @@ func nekoboxAndroidOutboundRegistry() *outbound.Registry {
func nekoboxAndroidEndpointRegistry() *endpoint.Registry {
registry := endpoint.NewRegistry()
registerWireGuardEndpoint(registry)
wireguard.RegisterEndpoint(registry)
return registry
}
func registerQUICInbounds(registry *inbound.Registry) {
hysteria.RegisterInbound(registry)
tuic.RegisterInbound(registry)
hysteria2.RegisterInbound(registry)
func nekoboxAndroidDNSTransportRegistry() *dns.TransportRegistry {
registry := dns.NewTransportRegistry()
transport.RegisterTCP(registry)
transport.RegisterUDP(registry)
transport.RegisterTLS(registry)
transport.RegisterHTTPS(registry)
hosts.RegisterTransport(registry)
local.RegisterTransport(registry)
fakeip.RegisterTransport(registry)
quic.RegisterTransport(registry)
quic.RegisterHTTP3Transport(registry)
return registry
}
func registerQUICOutbounds(registry *outbound.Registry) {
hysteria.RegisterOutbound(registry)
tuic.RegisterOutbound(registry)
hysteria2.RegisterOutbound(registry)
}
func nekoboxAndroidServiceRegistry() *service.Registry {
registry := service.NewRegistry()
func registerWireGuardOutbound(registry *outbound.Registry) {
wireguard.RegisterOutbound(registry)
}
func registerWireGuardEndpoint(registry *endpoint.Registry) {
wireguard.RegisterEndpoint(registry)
return registry
}
+2 -1
View File
@@ -14,7 +14,8 @@ if [ -z "$GOPATH" ]; then
GOPATH=$(go env GOPATH)
fi
"$GOPATH"/bin/gomobile-matsuri bind -v -androidapi 21 -cache "$(realpath $BUILD)" -trimpath -ldflags='-s -w' -tags='with_conntrack,with_gvisor,with_quic,with_wireguard,with_utls,with_clash_api,with_ech' . || exit 1
export GOBIND=gobind-matsuri
"$GOPATH"/bin/gomobile-matsuri bind -v -androidapi 21 -cache "$(realpath $BUILD)" -trimpath -ldflags='-s -w' -tags='with_conntrack,with_gvisor,with_quic,with_wireguard,with_utls,with_clash_api' . || exit 1
rm -r libcore-sources.jar
proj=../app/libs
+45 -51
View File
@@ -6,86 +6,80 @@ toolchain go1.23.6
require (
github.com/matsuridayo/libneko v1.0.0 // replaced
github.com/miekg/dns v1.1.63
github.com/oschwald/maxminddb-golang v1.12.0
github.com/sagernet/sing v0.6.6-0.20250406121928-926a5a1e8bb7
github.com/miekg/dns v1.1.67
github.com/oschwald/maxminddb-golang v1.13.1
github.com/sagernet/sing v0.7.6-0.20250825114712-2aeec120ce28
github.com/sagernet/sing-box v1.0.0 // replaced
github.com/sagernet/sing-dns v0.4.1
github.com/sagernet/sing-tun v0.6.1
github.com/sagernet/sing-tun v0.7.0-beta.1
github.com/ulikunitz/xz v0.5.11
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da
golang.org/x/sys v0.30.0
golang.org/x/sys v0.35.0
)
require (
github.com/ajg/form v1.5.1 // indirect
github.com/andybalholm/brotli v1.0.6 // indirect
github.com/andybalholm/brotli v1.1.0 // indirect
github.com/anytls/sing-anytls v0.0.8 // indirect
github.com/caddyserver/certmagic v0.20.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/caddyserver/certmagic v0.23.0 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cretz/bine v0.2.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-chi/chi/v5 v5.2.1 // indirect
github.com/go-chi/chi/v5 v5.2.2 // indirect
github.com/go-chi/render v1.0.3 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gofrs/uuid/v5 v5.3.2 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/hashicorp/yamux v0.1.2 // indirect
github.com/josharian/native v1.1.0 // indirect
github.com/klauspost/compress v1.17.4 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/libdns/alidns v1.0.3 // indirect
github.com/libdns/cloudflare v0.1.1 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/libdns/alidns v1.0.5-libdns.v1.beta1 // indirect
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6 // indirect
github.com/libdns/libdns v1.1.0 // indirect
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
github.com/mdlayher/netlink v1.7.2 // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 // indirect
github.com/mholt/acmez v1.2.0 // indirect
github.com/onsi/ginkgo/v2 v2.9.7 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect
github.com/mdlayher/socket v0.5.1 // indirect
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 // indirect
github.com/metacubex/utls v1.8.0 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect
github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 // indirect
github.com/sagernet/cors v1.2.1 // indirect
github.com/sagernet/fswatch v0.1.1 // indirect
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff // indirect
github.com/sagernet/gvisor v0.0.0-20250325023245-7a9c0f5725fb // indirect
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
github.com/sagernet/quic-go v0.49.0-beta.1 // indirect
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 // indirect
github.com/sagernet/sing-mux v0.3.1 // indirect
github.com/sagernet/sing-quic v0.4.1 // indirect
github.com/sagernet/sing-shadowsocks v0.2.7 // indirect
github.com/sagernet/sing-shadowsocks2 v0.2.0 // indirect
github.com/sagernet/sing-shadowtls v0.2.0 // indirect
github.com/sagernet/sing-vmess v0.2.0 // indirect
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
github.com/sagernet/utls v1.6.7 // indirect
github.com/sagernet/wireguard-go v0.0.1-beta.5 // indirect
github.com/sagernet/quic-go v0.52.0-beta.1 // indirect
github.com/sagernet/sing-mux v0.3.3 // indirect
github.com/sagernet/sing-quic v0.5.0 // indirect
github.com/sagernet/sing-shadowsocks v0.2.8 // indirect
github.com/sagernet/sing-shadowsocks2 v0.2.1 // indirect
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 // indirect
github.com/sagernet/sing-vmess v0.2.7 // indirect
github.com/sagernet/smux v1.5.34-mod.2 // indirect
github.com/sagernet/wireguard-go v0.0.1-beta.7 // indirect
github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854 // indirect
github.com/vishvananda/netns v0.0.4 // indirect
github.com/zeebo/blake3 v0.2.3 // indirect
github.com/vishvananda/netns v0.0.5 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.20.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/tools v0.24.0 // indirect
golang.org/x/crypto v0.41.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.9.0 // indirect
golang.org/x/tools v0.36.0 // indirect
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect
google.golang.org/grpc v1.63.2 // indirect
google.golang.org/protobuf v1.33.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect
google.golang.org/grpc v1.73.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
lukechampine.com/blake3 v1.3.0 // indirect
)
+124 -116
View File
@@ -1,30 +1,31 @@
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/anytls/sing-anytls v0.0.8 h1:1u/fnH1HoeeMV5mX7/eUOjLBvPdkd1UJRmXiRi6Vymc=
github.com/anytls/sing-anytls v0.0.8/go.mod h1:7rjN6IukwysmdusYsrV51Fgu1uW6vsrdd6ctjnEAln8=
github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc=
github.com/caddyserver/certmagic v0.20.0/go.mod h1:N4sXgpICQUskEWpj7zVzvWD41p3NYacrNoZYiRM2jTg=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
@@ -35,161 +36,168 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
github.com/google/btree v1.1.3/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/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
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/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=
github.com/libdns/cloudflare v0.1.1/go.mod h1:9VK91idpOjg6v7/WbjkEW49bSCxj00ALesIFDhJ8PBU=
github.com/libdns/libdns v0.2.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40=
github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/libdns/alidns v1.0.5-libdns.v1.beta1 h1:txHK7UxDed3WFBDjrTZPuMn8X+WmhjBTTAMW5xdy5pQ=
github.com/libdns/alidns v1.0.5-libdns.v1.beta1/go.mod h1:ystHmPwcGoWjPrGpensQSMY9VoCx4cpR2hXNlwk9H/g=
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6 h1:3MGrVWs2COjMkQR17oUw1zMIPbm2YAzxDC3oGVZvQs8=
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6/go.mod h1:w9uTmRCDlAoafAsTPnn2nJ0XHK/eaUMh86DUk8BWi60=
github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libdns/libdns v1.1.0 h1:9ze/tWvt7Df6sbhOJRB8jT33GHEHpEQXdtkE3hPthbU=
github.com/libdns/libdns v1.1.0/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/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 h1:zGeQt3UyNydIVrMRB97AA5WsYEau/TyCnRtTf1yUmJY=
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
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.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
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=
github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4=
github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs=
github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 h1:A1Cq6Ysb0GM0tpKMbdCXCIfBclan4oHk1Jb+Hrejirg=
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o=
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 h1:j1VRTiC9JLR4nUbSikx9OGdu/3AgFDqgcLj4GoqyQkc=
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
github.com/metacubex/utls v1.8.0 h1:mSYi6FMnmc5riARl5UZDmWVy710z+P5b7xuGW0lV9ac=
github.com/metacubex/utls v1.8.0/go.mod h1:FdjYzVfCtgtna19hX0ER1Xsa5uJInwdQ4IcaaI98lEQ=
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE=
github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a h1:+NkI2670SQpQWvkkD2QgdTuzQG263YZ+2emfpeyGqW0=
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a/go.mod h1:63s7jpZqcDAIpj8oI/1v4Izok+npJOHACFCU6+huCkM=
github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 h1:YbmpqPQEMdlk9oFSKYWRqVuu9qzNiOayIonKmv1gCXY=
github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1/go.mod h1:J2yAxTFPDjrDPhuAi9aWFz2L3ox9it4qAluBBbN0H5k=
github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ=
github.com/sagernet/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI=
github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs=
github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o=
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff h1:mlohw3360Wg1BNGook/UHnISXhUx4Gd/3tVLs5T0nSs=
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff/go.mod h1:ehZwnT2UpmOWAHFL48XdBhnd4Qu4hN2O3Ji0us3ZHMw=
github.com/sagernet/gvisor v0.0.0-20250325023245-7a9c0f5725fb h1:pprQtDqNgqXkRsXn+0E8ikKOemzmum8bODjSfDene38=
github.com/sagernet/gvisor v0.0.0-20250325023245-7a9c0f5725fb/go.mod h1:QkkPEJLw59/tfxgapHta14UL5qMUah5NXhO0Kw2Kan4=
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
github.com/sagernet/quic-go v0.49.0-beta.1 h1:3LdoCzVVfYRibZns1tYWSIoB65fpTmrwy+yfK8DQ8Jk=
github.com/sagernet/quic-go v0.49.0-beta.1/go.mod h1:uesWD1Ihrldq1M3XtjuEvIUqi8WHNsRs71b3Lt1+p/U=
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc=
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU=
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
github.com/sagernet/sing v0.6.6-0.20250406121928-926a5a1e8bb7 h1:ZJauxLmH12Gzv3nucfjsSBQw9UA8t7Sxu8pYHBSP2TU=
github.com/sagernet/sing v0.6.6-0.20250406121928-926a5a1e8bb7/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/quic-go v0.52.0-beta.1 h1:hWkojLg64zjV+MJOvJU/kOeWndm3tiEfBLx5foisszs=
github.com/sagernet/quic-go v0.52.0-beta.1/go.mod h1:OV+V5kEBb8kJS7k29MzDu6oj9GyMc7HA07sE1tedxz4=
github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing v0.7.6-0.20250825114712-2aeec120ce28 h1:C8Lnqd0Q+C15kwaMiDsfq5S45rhhaQMBG91TT+6oFVo=
github.com/sagernet/sing v0.7.6-0.20250825114712-2aeec120ce28/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing-dns v0.4.1 h1:nozS7iqpxZ7aV73oHbkD/8haOvf3XXDCgT//8NdYirk=
github.com/sagernet/sing-dns v0.4.1/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8=
github.com/sagernet/sing-mux v0.3.1 h1:kvCc8HyGAskDHDQ0yQvoTi/7J4cZPB/VJMsAM3MmdQI=
github.com/sagernet/sing-mux v0.3.1/go.mod h1:Mkdz8LnDstthz0HWuA/5foncnDIdcNN5KZ6AdJX+x78=
github.com/sagernet/sing-quic v0.4.1 h1:pxlMa4efZu/M07RgGagNNDDyl6ZUwpmNUjRTpgHOWK4=
github.com/sagernet/sing-quic v0.4.1/go.mod h1:tqPa0/Wqa19MkkSlKVZZX5sHxtiDR9BROcn4ufcbVdY=
github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8=
github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE=
github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg=
github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
github.com/sagernet/sing-shadowtls v0.2.0 h1:cLKe4OAOFwuhmAIuPLj//CIL7Q9js+pIDardhJ+/osk=
github.com/sagernet/sing-shadowtls v0.2.0/go.mod h1:agU+Fw5X+xnWVyRHyFthoZCX3MfWKCFPm4JUf+1oaxo=
github.com/sagernet/sing-tun v0.6.1 h1:4l0+gnEKcGjlWfUVTD+W0BRApqIny/lU2ZliurE+VMo=
github.com/sagernet/sing-tun v0.6.1/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
github.com/sagernet/sing-vmess v0.2.0 h1:pCMGUXN2k7RpikQV65/rtXtDHzb190foTfF9IGTMZrI=
github.com/sagernet/sing-vmess v0.2.0/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA=
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
github.com/sagernet/utls v1.6.7 h1:Ep3+aJ8FUGGta+II2IEVNUc3EDhaRCZINWkj/LloIA8=
github.com/sagernet/utls v1.6.7/go.mod h1:Uua1TKO/FFuAhLr9rkaVnnrTmmiItzDjv1BUb2+ERwM=
github.com/sagernet/wireguard-go v0.0.1-beta.5 h1:aBEsxJUMEONwOZqKPIkuAcv4zJV5p6XlzEN04CF0FXc=
github.com/sagernet/wireguard-go v0.0.1-beta.5/go.mod h1:jGXij2Gn2wbrWuYNUmmNhf1dwcZtvyAvQoe8Xd8MbUo=
github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw=
github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
github.com/sagernet/sing-quic v0.5.0 h1:jNLIyVk24lFPvu8A4x+ZNEnZdI+Tg1rp7eCJ6v0Csak=
github.com/sagernet/sing-quic v0.5.0/go.mod h1:SAv/qdeDN+75msGG5U5ZIwG+3Ua50jVIKNrRSY8pkx0=
github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE=
github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI=
github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo=
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
github.com/sagernet/sing-tun v0.7.0-beta.1 h1:mBIFXYAnGO5ey/HcCYanqnBx61E7yF8zTFGRZonGYmY=
github.com/sagernet/sing-tun v0.7.0-beta.1/go.mod h1:AHJuRrLbNRJuivuFZ2VhXwDj4ViYp14szG5EkkKAqRQ=
github.com/sagernet/sing-vmess v0.2.7 h1:2ee+9kO0xW5P4mfe6TYVWf9VtY8k1JhNysBqsiYj0sk=
github.com/sagernet/sing-vmess v0.2.7/go.mod h1:5aYoOtYksAyS0NXDm0qKeTYW1yoE1bJVcv+XLcVoyJs=
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
github.com/sagernet/smux v1.5.34-mod.2/go.mod h1:0KW0+R+ycvA2INW4gbsd7BNyg+HEfLIAxa5N02/28Zc=
github.com/sagernet/wireguard-go v0.0.1-beta.7 h1:ltgBwYHfr+9Wz1eG59NiWnHrYEkDKHG7otNZvu85DXI=
github.com/sagernet/wireguard-go v0.0.1-beta.7/go.mod h1:jGXij2Gn2wbrWuYNUmmNhf1dwcZtvyAvQoe8Xd8MbUo=
github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854 h1:6uUiZcDRnZSAegryaUGwPC/Fj13JSHwiTftrXhMmYOc=
github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854/go.mod h1:LtfoSK3+NG57tvnVEHgcuBW9ujgE8enPSgzgwStwCAA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
github.com/vishvananda/netns v0.0.5/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=
github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ=
github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da h1:gS9sVMAeHM+gVBmM9bTM6vUi/NHv58O3QzJ3vjjN84M=
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da/go.mod h1:IEceR0jfVklLJXrbUe90rfdAFAYDW0SQwKl4qvO1GBQ=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY=
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=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+2 -1
View File
@@ -10,6 +10,7 @@ fi
# Install gomobile
if [ ! -f "$GOPATH/bin/gomobile-matsuri" ]; then
git clone https://github.com/MatsuriDayo/gomobile.git
git checkout origin/master2
pushd gomobile/cmd
pushd gomobile
go install -v
@@ -23,4 +24,4 @@ if [ ! -f "$GOPATH/bin/gomobile-matsuri" ]; then
mv "$GOPATH/bin/gobind" "$GOPATH/bin/gobind-matsuri"
fi
gomobile-matsuri init
GOBIND=gobind-matsuri gomobile-matsuri init
+26 -30
View File
@@ -1,8 +1,6 @@
package libcore
import (
"net/netip"
tun "github.com/sagernet/sing-tun"
"github.com/sagernet/sing/common/control"
"github.com/sagernet/sing/common/x/list"
@@ -10,40 +8,38 @@ import (
// wtf
type interfaceMonitor struct {
}
type interfaceMonitorStub struct{}
func (i *interfaceMonitor) Start() error {
func (s *interfaceMonitorStub) Start() error {
return nil
}
func (i *interfaceMonitor) Close() error {
func (s *interfaceMonitorStub) Close() error {
return nil
}
func (i *interfaceMonitor) DefaultInterfaceName(destination netip.Addr) string {
func (s *interfaceMonitorStub) DefaultInterface() *control.Interface {
return nil
}
func (s *interfaceMonitorStub) OverrideAndroidVPN() bool {
return false
}
func (s *interfaceMonitorStub) AndroidVPNEnabled() bool {
return false
}
func (s *interfaceMonitorStub) RegisterCallback(callback tun.DefaultInterfaceUpdateCallback) *list.Element[tun.DefaultInterfaceUpdateCallback] {
return nil
}
func (s *interfaceMonitorStub) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) {
}
func (s *interfaceMonitorStub) RegisterMyInterface(interfaceName string) {
}
func (s *interfaceMonitorStub) MyInterface() string {
return ""
}
func (i *interfaceMonitor) DefaultInterfaceIndex(destination netip.Addr) int {
return 0
}
func (i *interfaceMonitor) DefaultInterface() *control.Interface {
return nil
}
func (i *interfaceMonitor) OverrideAndroidVPN() bool {
return false
}
func (i *interfaceMonitor) AndroidVPNEnabled() bool {
return false
}
func (i *interfaceMonitor) RegisterCallback(callback tun.DefaultInterfaceUpdateCallback) *list.Element[tun.DefaultInterfaceUpdateCallback] {
return nil
}
func (i *interfaceMonitor) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) {
}
+5 -1
View File
@@ -85,7 +85,7 @@ func (w *boxPlatformInterfaceWrapper) UsePlatformDefaultInterfaceMonitor() bool
}
func (w *boxPlatformInterfaceWrapper) CreateDefaultInterfaceMonitor(l logger.Logger) tun.DefaultInterfaceMonitor {
return &interfaceMonitor{}
return &interfaceMonitorStub{}
}
func (w *boxPlatformInterfaceWrapper) UsePlatformInterfaceGetter() bool {
@@ -104,6 +104,10 @@ func (w *boxPlatformInterfaceWrapper) SendNotification(notification *platform.No
return nil
}
func (s *boxPlatformInterfaceWrapper) SystemCertificates() []string {
return nil
}
// Android not using
func (w *boxPlatformInterfaceWrapper) UnderNetworkExtension() bool {
+1
View File
@@ -1,3 +1,4 @@
PACKAGE_NAME=moe.nb4a
VERSION_NAME=1.3.9
PRE_VERSION_NAME=pre-1.4.0-20250902-1
VERSION_CODE=43
+2 -2
View File
@@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_quickstart:=$(ARCH)
PKG_NAME:=quickstart
PKG_VERSION:=0.11.3
PKG_VERSION:=0.11.4
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/
PKG_HASH:=fee17158398f7867eb20bf187fbfb2d12d46e44d2f9e882376173392a8979d14
PKG_HASH:=4eb507924da586f974819755a9b1620808457da70563b0dbfb92c1460f28a8b3
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)
+1 -1
View File
@@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=25.8.26
PKG_VERSION:=25.9.3
PKG_RELEASE:=1
PKG_CONFIG_DEPENDS:= \
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -510,6 +510,7 @@ bestvpnusa.com
bet365.com
betaclouds.net
betfair.com
betterhash.net
betternet.co
bettervpn.com
bettween.com
@@ -536,6 +537,7 @@ bild.de
biliworld.com
billypan.com
binance.com
binance.org
binancezh.cc
binux.me
bird.so
@@ -547,6 +549,7 @@ bitchute.com
bitcointalk.org
bitcoinworld.com
bitfinex.com
bitget.com
bithumb.com
bitmex.com
bitshare.com
@@ -1042,6 +1045,7 @@ clipconverter.cc
clipfish.de
cloud.dify.ai
cloud.mail.ru
cloudflare-dns.com
cloudflare-ipfs.com
cloudfunctions.net
club1069.com
@@ -1126,6 +1130,7 @@ costco.com
cotweet.com
counter.social
coursehero.com
covenantswatch.org.tw
coze.com
cpj.org
cpu-monkey.com
@@ -1264,6 +1269,7 @@ delicious.com
demo.unlock-music.dev
democrats.org
demosisto.hk
deno.dev
depositphotos.com
desc.se
desipro.de
@@ -1332,6 +1338,7 @@ dnvod.tv
doc.new
docker.com
docker.io
docs.deno.com
docs.new
doctorvoice.org
documentingreality.com
@@ -1671,6 +1678,7 @@ fdc64.org
fdc89.jp
feedburner.com
feeder.co
feedly.com
feeds.fileforum.com
feedx.net
feelssh.com
@@ -1841,6 +1849,8 @@ ftvnews.com.tw
ftx.com
fucd.com
fuchsia.dev
fuckccp.com
fuckccp.xyz
fuckgfw.org
fulione.com
fullerconsideration.com
@@ -1852,6 +1862,7 @@ fuq.com
furbo.org
furhhdl.org
furinkan.com
furrybar.com
futurechinaforum.org
futuremessage.org
fux.com
@@ -2360,6 +2371,7 @@ hentaivideoworld.com
heqinglian.net
heritage.org
herokuapp.com
herominers.com
hexieshe.com
hexieshe.xyz
hexxeh.net
@@ -2656,6 +2668,7 @@ indiatoday.in
indiemerch.com
inews-api.tvb.com
info-graf.fr
infura.io
inherit.live
initiativesforchina.org
inkbunny.net
@@ -2729,9 +2742,11 @@ isupportuyghurs.org
itaiwan.gov.tw
italiatibet.org
itasoftware.com
itch.io
itemdb.com
itemfix.com
ithelp.ithome.com.tw
itiger.com
itsaol.com
itshidden.com
itsky.it
@@ -3080,6 +3095,8 @@ lsmwebcast.com
lsxszzg.com
ltn.com.tw
luckydesigner.space
luckymobile.ca
ludepress.com
luke54.com
luke54.org
lupm.org
@@ -3152,6 +3169,7 @@ matters.news
matters.town
matthewdgreen.wordpress.com
mattwilcox.net
maven.neoforged.net
maxing.jp
mayimayi.com
mcadforums.com
@@ -3200,6 +3218,7 @@ mesotw.com
messenger.com
meta.com
metafilter.com
metamask.io
metart.com
metarthunter.com
meteorshowersonline.com
@@ -3286,6 +3305,7 @@ mofos.com
mog.com
mohu.club
mohu.rocks
moj.gov.tw
mojim.com
mol.gov.tw
molihua.org
@@ -3422,6 +3442,7 @@ nationalreview.com
nationsonline.org
nationwide.com
naughtyamerica.com
naver.com
navyfamily.navy.mil
navyreserve.navy.mil
naweeklytimes.com
@@ -3746,6 +3767,7 @@ palacemoon.com
paljorpublications.com
paltalk.com
panamapapers.sueddeutsche.de
pancakeswap.finance
pandafan.pub
pandapow.co
pandapow.net
@@ -3812,6 +3834,7 @@ periscope.tv
perplexity.ai
persecutionblog.com
persiankitty.com
pewresearch.org
phapluan.org
phayul.com
philborges.com
@@ -3939,6 +3962,7 @@ prism-break.org
prisoneralert.com
pritunl.com
privacybox.de
privacyguides.org
private.com
privateinternetaccess.com
privatepaste.com
@@ -4592,6 +4616,7 @@ suroot.com
surrenderat20.net
svsfx.com
swagbucks.com
swapspace.co
swissinfo.ch
swissvpn.net
switch1.jp
@@ -5120,6 +5145,7 @@ uderzo.it
udn.com
udn.com.tw
udnbkk.com
udomain.hk
uforadio.com.tw
ufreevpn.com
ugo.com
@@ -5160,6 +5186,7 @@ unseen.is
unstable.icu
unwire.hk
uocn.org
upbit.com
updates.tdesktop.com
upghsbc.com
upholdjustice.org
@@ -5366,6 +5393,7 @@ waffle1999.com
wahas.com
waikeung.org
wainao.me
walletconnect.com
wallmama.com
wallpapercasa.com
wallproxy.com
@@ -5577,7 +5605,6 @@ www.monlamit.org
www.moztw.org
www.msn.com
www.nbc.com
www.nodeloc.com
www.owind.com
www.oxid.it
www.powerpointninja.com
@@ -5590,12 +5617,15 @@ www.taiwanonline.cc
www.thechinastory.org
www.wan-press.org
www.websnapr.com
www.xicons.org
www.zensur.freerk.com
www1.american.edu
www1.biz
www2.ohchr.org
www2.rocketbbs.com
wwwhost.biz
wxw.cat
wxw.moe
wzyboy.im
x-art.com
x-berry.com
@@ -5694,6 +5724,7 @@ yam.com
yam.org.tw
yande.re
yanghengjun.com
yangzhi.org
yasni.co.uk
yasukuni.or.jp
yayabay.com
+11 -11
View File
@@ -7,7 +7,7 @@ toolchain go1.24.2
require (
github.com/adrg/xdg v0.5.3
github.com/apernet/quic-go v0.48.2-0.20241104191913-cb103fcecfe7
github.com/go-chi/chi/v5 v5.2.2
github.com/go-chi/chi/v5 v5.2.3
github.com/go-chi/render v1.0.3
github.com/go-playground/validator/v10 v10.27.0
github.com/golang-collections/go-datastructures v0.0.0-20150211160725-59788d5eb259
@@ -27,7 +27,7 @@ require (
github.com/quic-go/quic-go v0.54.0
github.com/refraction-networking/utls v1.8.0
github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb
github.com/stretchr/testify v1.10.0
github.com/stretchr/testify v1.11.1
github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08
github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848
github.com/v2fly/hysteria/core/v2 v2.0.0-20250113081444-b0a0747ac7ab
@@ -37,12 +37,12 @@ require (
github.com/xiaokangwang/VLite v0.0.0-20220418190619-cff95160a432
go.starlark.net v0.0.0-20230612165344-9532f5667272
go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35
golang.org/x/crypto v0.40.0
golang.org/x/net v0.42.0
golang.org/x/crypto v0.41.0
golang.org/x/net v0.43.0
golang.org/x/sync v0.16.0
golang.org/x/sys v0.34.0
google.golang.org/grpc v1.74.2
google.golang.org/protobuf v1.36.6
golang.org/x/sys v0.35.0
google.golang.org/grpc v1.75.0
google.golang.org/protobuf v1.36.8
gopkg.in/yaml.v3 v3.0.1
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1
h12.io/socks v1.0.3
@@ -87,10 +87,10 @@ require (
github.com/xtaci/smux v1.5.24 // indirect
go.uber.org/mock v0.5.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.34.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
golang.org/x/tools v0.35.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
nhooyr.io/websocket v1.8.6 // indirect
)
+34 -32
View File
@@ -114,8 +114,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE=
github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -503,8 +503,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -550,16 +550,16 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.starlark.net v0.0.0-20230612165344-9532f5667272 h1:2/wtqS591wZyD2OsClsVBKRPEvBsQt/Js+fsCiYhwu8=
go.starlark.net v0.0.0-20230612165344-9532f5667272/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -590,8 +590,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -620,8 +620,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -653,8 +653,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -717,8 +717,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -738,8 +738,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -775,12 +775,14 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
@@ -805,8 +807,8 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
@@ -821,8 +823,8 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -833,8 +835,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -15,7 +15,6 @@ public enum EViewAction
ShowHideWindow,
ScanScreenTask,
ScanImageTask,
Shutdown,
BrowseServer,
ImportRulesFromFile,
InitSettingFont,
@@ -13,6 +13,8 @@ public static class AppEvents
public static readonly Subject<Unit> AppExitRequested = new();
public static readonly Subject<bool> ShutdownRequested = new();
public static readonly Subject<Unit> AdjustMainLvColWidthRequested = new();
public static readonly Subject<ServerSpeedItem> DispatcherStatisticsRequested = new();
+37 -2
View File
@@ -1,3 +1,5 @@
using System.Reactive;
namespace ServiceLib.Manager;
public sealed class AppManager
@@ -34,7 +36,7 @@ public sealed class AppManager
#endregion Property
#region Init
#region App
public bool InitApp()
{
@@ -87,7 +89,40 @@ public sealed class AppManager
return true;
}
#endregion Init
public async Task AppExitAsync(bool needShutdown)
{
try
{
Logging.SaveLog("AppExitAsync Begin");
await SysProxyHandler.UpdateSysProxy(_config, true);
AppEvents.AppExitRequested.OnNext(Unit.Default);
await Task.Delay(50); //Wait for AppExitRequested to be processed
await ConfigHandler.SaveConfig(_config);
await ProfileExManager.Instance.SaveTo();
await StatisticsManager.Instance.SaveTo();
await CoreManager.Instance.CoreStop();
StatisticsManager.Instance.Close();
Logging.SaveLog("AppExitAsync End");
}
catch { }
finally
{
if (needShutdown)
{
Shutdown(false);
}
}
}
public void Shutdown(bool byUser)
{
AppEvents.ShutdownRequested.OnNext(byUser);
}
#endregion App
#region Config
@@ -136,8 +136,7 @@ public class BackupAndRestoreViewModel : MyReactiveObject
var result = await CreateZipFileFromDirectory(fileBackup);
if (result)
{
var service = Locator.Current.GetService<MainWindowViewModel>();
await service?.MyAppExitAsync(true);
await AppManager.Instance.AppExitAsync(false);
await SQLiteHelper.Instance.DisposeDbConnectionAsync();
var toPath = Utils.GetConfigPath();
@@ -154,7 +153,7 @@ public class BackupAndRestoreViewModel : MyReactiveObject
_ = ProcUtils.ProcessStart(upgradeFileName, Global.RebootAs, Utils.StartupPath());
}
}
service?.Shutdown(true);
AppManager.Instance.Shutdown(true);
}
else
{
@@ -236,12 +236,19 @@ public class CheckUpdateViewModel : MyReactiveObject
{
return;
}
if (!Utils.UpgradeAppExists(out _))
if (!Utils.UpgradeAppExists(out var upgradeFileName))
{
await UpdateView(_v2rayN, ResUI.UpgradeAppNotExistTip);
NoticeManager.Instance.SendMessageAndEnqueue(ResUI.UpgradeAppNotExistTip);
Logging.SaveLog("UpgradeApp does not exist");
return;
}
Locator.Current.GetService<MainWindowViewModel>()?.UpgradeApp(fileName);
var id = ProcUtils.ProcessStart(upgradeFileName, fileName, Utils.StartupPath());
if (id > 0)
{
await AppManager.Instance.AppExitAsync(true);
}
}
catch (Exception ex)
{
@@ -282,59 +282,11 @@ public class MainWindowViewModel : MyReactiveObject
AppEvents.DispatcherStatisticsRequested.OnNext(update);
}
public async Task MyAppExitAsync(bool blWindowsShutDown)
{
try
{
Logging.SaveLog("MyAppExitAsync Begin");
await SysProxyHandler.UpdateSysProxy(_config, true);
AppEvents.AppExitRequested.OnNext(Unit.Default);
await ConfigHandler.SaveConfig(_config);
await ProfileExManager.Instance.SaveTo();
await StatisticsManager.Instance.SaveTo();
await CoreManager.Instance.CoreStop();
StatisticsManager.Instance.Close();
Logging.SaveLog("MyAppExitAsync End");
}
catch { }
finally
{
if (!blWindowsShutDown)
{
_updateView?.Invoke(EViewAction.Shutdown, false);
}
}
}
public async Task UpgradeApp(string arg)
{
if (!Utils.UpgradeAppExists(out var upgradeFileName))
{
NoticeManager.Instance.SendMessageAndEnqueue(ResUI.UpgradeAppNotExistTip);
Logging.SaveLog("UpgradeApp does not exist");
return;
}
var id = ProcUtils.ProcessStart(upgradeFileName, arg, Utils.StartupPath());
if (id > 0)
{
await MyAppExitAsync(false);
}
}
public void ShowHideWindow(bool? blShow)
{
_updateView?.Invoke(EViewAction.ShowHideWindow, blShow);
}
public void Shutdown(bool byUser)
{
_updateView?.Invoke(EViewAction.Shutdown, byUser);
}
#endregion Actions
#region Servers && Groups
@@ -517,7 +469,7 @@ public class MainWindowViewModel : MyReactiveObject
public async Task RebootAsAdmin()
{
ProcUtils.RebootAsAdmin();
await MyAppExitAsync(false);
await AppManager.Instance.AppExitAsync(true);
}
private async Task ClearServerStatistics()
+2 -6
View File
@@ -74,11 +74,7 @@ public partial class App : Application
private async void MenuExit_Click(object? sender, EventArgs e)
{
var service = Locator.Current.GetService<MainWindowViewModel>();
if (service != null)
{
await service.MyAppExitAsync(true);
}
service?.Shutdown(true);
await AppManager.Instance.AppExitAsync(false);
AppManager.Instance.Shutdown(true);
}
}
@@ -148,6 +148,12 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => StorageUI())
.DisposeWith(disposables);
AppEvents.ShutdownRequested
.AsObservable()
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(content => Shutdown(content))
.DisposeWith(disposables);
});
if (Utils.IsWindows())
@@ -222,19 +228,6 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
DispatcherPriority.Default);
break;
case EViewAction.Shutdown:
if (obj != null && _blCloseByUser == false)
{
_blCloseByUser = (bool)obj;
}
StorageUI();
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
HotkeyManager.Instance.Dispose();
desktop.Shutdown();
}
break;
case EViewAction.ScanScreenTask:
await ScanScreenTaskAsync();
break;
@@ -289,10 +282,7 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
break;
case WindowCloseReason.ApplicationShutdown or WindowCloseReason.OSShutdown:
if (ViewModel != null)
{
await ViewModel.MyAppExitAsync(true);
}
await AppManager.Instance.AppExitAsync(false);
break;
}
@@ -387,9 +377,21 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
_blCloseByUser = true;
StorageUI();
if (ViewModel != null)
await AppManager.Instance.AppExitAsync(true);
}
private void Shutdown(bool obj)
{
if (obj is bool b && _blCloseByUser == false)
{
await ViewModel.MyAppExitAsync(false);
_blCloseByUser = b;
}
StorageUI();
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
HotkeyManager.Instance.Dispose();
desktop.Shutdown();
}
}
+12 -8
View File
@@ -145,6 +145,12 @@ public partial class MainWindow
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => StorageUI())
.DisposeWith(disposables);
AppEvents.ShutdownRequested
.AsObservable()
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(content => Shutdown(content))
.DisposeWith(disposables);
});
this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
@@ -212,13 +218,6 @@ public partial class MainWindow
}), DispatcherPriority.Normal);
break;
case EViewAction.Shutdown:
Application.Current?.Dispatcher.Invoke((() =>
{
Application.Current.Shutdown();
}), DispatcherPriority.Normal);
break;
case EViewAction.ScanScreenTask:
await ScanScreenTaskAsync();
break;
@@ -266,7 +265,12 @@ public partial class MainWindow
{
Logging.SaveLog("Current_SessionEnding");
StorageUI();
await ViewModel?.MyAppExitAsync(true);
await AppManager.Instance.AppExitAsync(false);
}
private void Shutdown(bool obj)
{
Application.Current.Shutdown();
}
private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
@@ -97,9 +97,7 @@ public partial class StatusBarView
private async void menuExit_Click(object sender, RoutedEventArgs e)
{
tbNotify.Dispose();
var service = Locator.Current.GetService<MainWindowViewModel>();
if (service != null)
await service.MyAppExitAsync(false);
await AppManager.Instance.AppExitAsync(true);
}
private void txtRunningInfoDisplay_MouseDoubleClick(object sender, MouseButtonEventArgs e)
+1 -1
View File
@@ -211,7 +211,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
responseDone := func() error {
defer timer.SetTimeout(plcy.Timeouts.UplinkOnly)
if destination.Network == net.Network_TCP && useSplice && proxy.IsRAWTransport(conn) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
if destination.Network == net.Network_TCP && useSplice && proxy.IsRAWTransportWithoutSecurity(conn) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
var writeConn net.Conn
var inTimer *signal.ActivityTimer
if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Conn != nil {
+1 -1
View File
@@ -96,7 +96,7 @@ func (s *Server) ProcessWithFirstbyte(ctx context.Context, network net.Network,
inbound.User = &protocol.MemoryUser{
Level: s.config.UserLevel,
}
if !proxy.IsRAWTransport(conn) {
if !proxy.IsRAWTransportWithoutSecurity(conn) {
inbound.CanSpliceCopy = 3
}
var reader *bufio.Reader
+2 -2
View File
@@ -337,7 +337,7 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
w.directWriteCounter = writerCounter
*switchToDirectCopy = false
}
if !mb.IsEmpty() && w.directWriteCounter != nil {
if !mb.IsEmpty() && w.directWriteCounter != nil {
w.directWriteCounter.Add(int64(mb.Len()))
}
@@ -725,7 +725,7 @@ func readV(ctx context.Context, reader buf.Reader, writer buf.Writer, timer sign
return nil
}
func IsRAWTransport(conn stat.Connection) bool {
func IsRAWTransportWithoutSecurity(conn stat.Connection) bool {
iConn := conn
if statConn, ok := iConn.(*stat.CounterConnection); ok {
iConn = statConn.Connection
+1 -1
View File
@@ -75,7 +75,7 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
inbound.User = &protocol.MemoryUser{
Level: s.config.UserLevel,
}
if !proxy.IsRAWTransport(conn) {
if !proxy.IsRAWTransportWithoutSecurity(conn) {
inbound.CanSpliceCopy = 3
}
+2 -2
View File
@@ -506,8 +506,8 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
var t reflect.Type
var p uintptr
if commonConn, ok := connection.(*encryption.CommonConn); ok {
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransport(iConn) {
inbound.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport can not use Linux Splice
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransportWithoutSecurity(iConn) {
inbound.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport / another securityConn should not be penetrated
}
t = reflect.TypeOf(commonConn).Elem()
p = uintptr(unsafe.Pointer(commonConn))
+2 -2
View File
@@ -166,8 +166,8 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
var t reflect.Type
var p uintptr
if commonConn, ok := conn.(*encryption.CommonConn); ok {
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransport(iConn) {
ob.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport can not use Linux Splice
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransportWithoutSecurity(iConn) {
ob.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport / another securityConn should not be penetrated
}
t = reflect.TypeOf(commonConn).Elem()
p = uintptr(unsafe.Pointer(commonConn))