diff --git a/v2rayN/.gitattributes b/v2rayN/.gitattributes
new file mode 100644
index 00000000..1ff0c423
--- /dev/null
+++ b/v2rayN/.gitattributes
@@ -0,0 +1,63 @@
+###############################################################################
+# Set default behavior to automatically normalize line endings.
+###############################################################################
+* text=auto
+
+###############################################################################
+# Set default behavior for command prompt diff.
+#
+# This is need for earlier builds of msysgit that does not have it on by
+# default for csharp files.
+# Note: This is only used by command line
+###############################################################################
+#*.cs diff=csharp
+
+###############################################################################
+# Set the merge driver for project and solution files
+#
+# Merging from the command prompt will add diff markers to the files if there
+# are conflicts (Merging from VS is not affected by the settings below, in VS
+# the diff markers are never inserted). Diff markers may cause the following
+# file extensions to fail to load in VS. An alternative would be to treat
+# these files as binary and thus will always conflict and require user
+# intervention with every merge. To do so, just uncomment the entries below
+###############################################################################
+#*.sln merge=binary
+#*.csproj merge=binary
+#*.vbproj merge=binary
+#*.vcxproj merge=binary
+#*.vcproj merge=binary
+#*.dbproj merge=binary
+#*.fsproj merge=binary
+#*.lsproj merge=binary
+#*.wixproj merge=binary
+#*.modelproj merge=binary
+#*.sqlproj merge=binary
+#*.wwaproj merge=binary
+
+###############################################################################
+# behavior for image files
+#
+# image files are treated as binary by default.
+###############################################################################
+#*.jpg binary
+#*.png binary
+#*.gif binary
+
+###############################################################################
+# diff behavior for common document formats
+#
+# Convert binary document formats to text before diffing them. This feature
+# is only available from the command line. Turn it on by uncommenting the
+# entries below.
+###############################################################################
+#*.doc diff=astextplain
+#*.DOC diff=astextplain
+#*.docx diff=astextplain
+#*.DOCX diff=astextplain
+#*.dot diff=astextplain
+#*.DOT diff=astextplain
+#*.pdf diff=astextplain
+#*.PDF diff=astextplain
+#*.rtf diff=astextplain
+#*.RTF diff=astextplain
diff --git a/v2rayN/.gitignore b/v2rayN/.gitignore
new file mode 100644
index 00000000..9491a2fd
--- /dev/null
+++ b/v2rayN/.gitignore
@@ -0,0 +1,363 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Oo]ut/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
\ No newline at end of file
diff --git a/v2rayN/PacLib/PacHandler.cs b/v2rayN/PacLib/PacHandler.cs
new file mode 100644
index 00000000..ee95d4e1
--- /dev/null
+++ b/v2rayN/PacLib/PacHandler.cs
@@ -0,0 +1,112 @@
+using System;
+using System.IO;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace PacLib;
+
+public class PacHandler
+{
+ private static string _configPath;
+ private static int _httpPort;
+ private static int _pacPort;
+ private static TcpListener? _tcpListener;
+ private static string _pacText;
+ private static bool _isRunning;
+ private static bool _needRestart = true;
+
+
+ public static void Start(string configPath, int httpPort, int pacPort)
+ {
+ if (configPath.Equals(_configPath)
+ && httpPort.Equals(_httpPort)
+ && pacPort.Equals(_pacPort)
+ && _isRunning)
+ {
+ _needRestart = false;
+ }
+
+ _configPath = configPath;
+ _httpPort = httpPort;
+ _pacPort = pacPort;
+
+ InitText();
+
+ if (_needRestart)
+ {
+ Stop();
+ RunListener();
+ }
+ }
+
+ private static void InitText()
+ {
+ var path = Path.Combine(_configPath, "pac.txt");
+ if (!File.Exists(path))
+ {
+ File.AppendAllText(path, Resources.ResourceManager.GetString("pac"));
+ }
+
+ _pacText = File.ReadAllText(path).Replace("__PROXY__", $"PROXY 127.0.0.1:{_httpPort};DIRECT;");
+ }
+
+ private static void RunListener()
+ {
+ _tcpListener = TcpListener.Create(_pacPort);
+ _isRunning = true;
+ _tcpListener.Start();
+ Task.Factory.StartNew(() =>
+ {
+ while (_isRunning)
+ {
+ try
+ {
+ if (!_tcpListener.Pending())
+ {
+ Thread.Sleep(10);
+ continue;
+ }
+
+ var client = _tcpListener.AcceptTcpClient();
+ Task.Run(() =>
+ {
+ var stream = client.GetStream();
+ var sb = new StringBuilder();
+ sb.AppendLine("HTTP/1.0 200 OK");
+ sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig");
+ sb.AppendLine("Connection:close");
+ sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(_pacText));
+ sb.AppendLine();
+ sb.Append(_pacText);
+ var content = Encoding.UTF8.GetBytes(sb.ToString());
+ stream.Write(content, 0, content.Length);
+ stream.Flush();
+ });
+ }
+ catch (Exception e)
+ {
+ }
+ }
+
+ }, TaskCreationOptions.LongRunning);
+
+ }
+
+ public static void Stop()
+ {
+ if (_tcpListener != null)
+ {
+ try
+ {
+ _isRunning = false;
+ _tcpListener.Stop();
+ _tcpListener = null;
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/PacLib/PacLib.csproj b/v2rayN/PacLib/PacLib.csproj
new file mode 100644
index 00000000..ed5be34b
--- /dev/null
+++ b/v2rayN/PacLib/PacLib.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net6.0-windows
+ enable
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
diff --git a/v2rayN/PacLib/Resources.Designer.cs b/v2rayN/PacLib/Resources.Designer.cs
new file mode 100644
index 00000000..e7bfd02c
--- /dev/null
+++ b/v2rayN/PacLib/Resources.Designer.cs
@@ -0,0 +1,95 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace PacLib {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PacLib.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 查找类似 var proxy = '__PROXY__';
+ ///var rules = [
+ /// [
+ /// [],
+ /// []
+ /// ],
+ /// [
+ /// [
+ /// "aftygh.gov.tw",
+ /// "aide.gov.tw",
+ /// "aliyun.com",
+ /// "arte.gov.tw",
+ /// "baidu.com",
+ /// "chinaso.com",
+ /// "chinaz.com",
+ /// "chukuang.gov.tw",
+ /// "cycab.gov.tw",
+ /// "dbnsa.gov.tw",
+ /// "df.gov.tw",
+ /// "eastcoast-nsa.gov.tw",
+ /// "erv-nsa.gov.tw",
+ /// "grb.gov.tw",
+ /// "haosou.com",
+ /// [字符串的其余部分被截断]"; 的本地化字符串。
+ ///
+ internal static string pac {
+ get {
+ return ResourceManager.GetString("pac", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx b/v2rayN/PacLib/Resources.resx
similarity index 93%
rename from v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx
rename to v2rayN/PacLib/Resources.resx
index 1af7de15..1fffd5af 100644
--- a/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx
+++ b/v2rayN/PacLib/Resources.resx
@@ -117,4 +117,8 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Resources\pac.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312
+
\ No newline at end of file
diff --git a/v2rayN/PacLib/Resources/pac.txt b/v2rayN/PacLib/Resources/pac.txt
new file mode 100644
index 00000000..0a76407e
--- /dev/null
+++ b/v2rayN/PacLib/Resources/pac.txt
@@ -0,0 +1,6023 @@
+var proxy = '__PROXY__';
+var rules = [
+ [
+ [],
+ []
+ ],
+ [
+ [
+ "aftygh.gov.tw",
+ "aide.gov.tw",
+ "aliyun.com",
+ "arte.gov.tw",
+ "baidu.com",
+ "chinaso.com",
+ "chinaz.com",
+ "chukuang.gov.tw",
+ "cycab.gov.tw",
+ "dbnsa.gov.tw",
+ "df.gov.tw",
+ "eastcoast-nsa.gov.tw",
+ "erv-nsa.gov.tw",
+ "grb.gov.tw",
+ "haosou.com",
+ "haygo.com",
+ "hchcc.gov.tw",
+ "hsinchu-cc.gov.tw",
+ "iner.gov.tw",
+ "ip.cn",
+ "jike.com",
+ "jpush.cn",
+ "klsio.gov.tw",
+ "kmseh.gov.tw",
+ "locql.com",
+ "lungtanhr.gov.tw",
+ "maolin-nsa.gov.tw",
+ "matsu-news.gov.tw",
+ "matsu-nsa.gov.tw",
+ "matsucc.gov.tw",
+ "moe.gov.tw",
+ "nankan.gov.tw",
+ "ncree.gov.tw",
+ "necoast-nsa.gov.tw",
+ "ner.gov.tw",
+ "nmmba.gov.tw",
+ "nmp.gov.tw",
+ "nmvttc.gov.tw",
+ "northguan-nsa.gov.tw",
+ "npm.gov.tw",
+ "nstm.gov.tw",
+ "ntdmh.gov.tw",
+ "ntl.gov.tw",
+ "ntsec.gov.tw",
+ "ntuh.gov.tw",
+ "nvri.gov.tw",
+ "nyc.gov.tw",
+ "penghu-nsa.gov.tw",
+ "post.gov.tw",
+ "qq.com",
+ "simplecd.me",
+ "sina.cn",
+ "sina.com.cn",
+ "siraya-nsa.gov.tw",
+ "sl-reverse.com",
+ "so.com",
+ "sogou.com",
+ "soso.com",
+ "stdtime.gov.tw",
+ "sunmoonlake.gov.tw",
+ "syniumsoftware.com",
+ "taitung-house.gov.tw",
+ "taoyuan.gov.tw",
+ "tphcc.gov.tw",
+ "trimt-nsa.gov.tw",
+ "uluai.com.cn",
+ "vghks.gov.tw",
+ "vghtc.gov.tw",
+ "vghtpe.gov.tw",
+ "wallproxy.com.cn",
+ "wanfang.gov.tw",
+ "weibo.com",
+ "yahoo.cn",
+ "yatsen.gov.tw",
+ "yda.gov.tw",
+ "youdao.com",
+ "zhongsou.com"
+ ],
+ [
+ "000webhost.com",
+ "030buy.com",
+ "0rz.tw",
+ "1-apple.com.tw",
+ "10.tt",
+ "1000giri.net",
+ "100ke.org",
+ "10beasts.net",
+ "10conditionsoflove.com",
+ "10musume.com",
+ "123rf.com",
+ "12bet.com",
+ "12vpn.com",
+ "12vpn.net",
+ "1337x.to",
+ "138.com",
+ "141hongkong.com",
+ "141jj.com",
+ "141tube.com",
+ "1688.com.au",
+ "173ng.com",
+ "177pic.info",
+ "17t17p.com",
+ "18board.com",
+ "18board.info",
+ "18onlygirls.com",
+ "18p2p.com",
+ "18virginsex.com",
+ "1949er.org",
+ "1984.city",
+ "1984bbs.com",
+ "1984bbs.org",
+ "1991way.com",
+ "1998cdp.org",
+ "1bao.org",
+ "1dumb.com",
+ "1e100.net",
+ "1eew.com",
+ "1mobile.com",
+ "1mobile.tw",
+ "1pondo.tv",
+ "2-hand.info",
+ "2000fun.com",
+ "2008xianzhang.info",
+ "2017.hk",
+ "2021hkcharter.com",
+ "2047.name",
+ "21andy.com",
+ "21join.com",
+ "21pron.com",
+ "21sextury.com",
+ "228.net.tw",
+ "233abc.com",
+ "24hrs.ca",
+ "24smile.org",
+ "25u.com",
+ "2lipstube.com",
+ "2shared.com",
+ "2waky.com",
+ "3-a.net",
+ "30boxes.com",
+ "315lz.com",
+ "32red.com",
+ "36rain.com",
+ "3a5a.com",
+ "3arabtv.com",
+ "3boys2girls.com",
+ "3d-game.com",
+ "3proxy.ru",
+ "3ren.ca",
+ "3tui.net",
+ "404museum.com",
+ "43110.cf",
+ "466453.com",
+ "4bluestones.biz",
+ "4chan.com",
+ "4dq.com",
+ "4everproxy.com",
+ "4irc.com",
+ "4mydomain.com",
+ "4pu.com",
+ "4rbtv.com",
+ "4shared.com",
+ "4sqi.net",
+ "50webs.com",
+ "51.ca",
+ "51jav.org",
+ "51luoben.com",
+ "5278.cc",
+ "5299.tv",
+ "5aimiku.com",
+ "5i01.com",
+ "5isotoi5.org",
+ "5maodang.com",
+ "63i.com",
+ "64museum.org",
+ "64tianwang.com",
+ "64wiki.com",
+ "66.ca",
+ "666kb.com",
+ "6do.news",
+ "6park.com",
+ "6parkbbs.com",
+ "6parker.com",
+ "6parknews.com",
+ "7-zip.org",
+ "7capture.com",
+ "7cow.com",
+ "8-d.com",
+ "85cc.net",
+ "85cc.us",
+ "85st.com",
+ "881903.com",
+ "888.com",
+ "888poker.com",
+ "89-64.org",
+ "8964museum.com",
+ "8news.com.tw",
+ "8z1.net",
+ "9001700.com",
+ "908taiwan.org",
+ "91porn.com",
+ "91vps.club",
+ "92ccav.com",
+ "991.com",
+ "99btgc01.com",
+ "99cn.info",
+ "9bis.com",
+ "9bis.net",
+ "9cache.com",
+ "9gag.com",
+ "9news.com.au",
+ "a-normal-day.com",
+ "aamacau.com",
+ "abc.com",
+ "abc.net.au",
+ "abc.xyz",
+ "abchinese.com",
+ "abclite.net",
+ "abebooks.com",
+ "ablwang.com",
+ "aboluowang.com",
+ "about.google",
+ "aboutgfw.com",
+ "abs.edu",
+ "acast.com",
+ "accim.org",
+ "accountkit.com",
+ "aceros-de-hispania.com",
+ "acevpn.com",
+ "acg18.me",
+ "acgbox.org",
+ "acgkj.com",
+ "acgnx.se",
+ "acmedia365.com",
+ "acmetoy.com",
+ "acnw.com.au",
+ "actfortibet.org",
+ "actimes.com.au",
+ "activpn.com",
+ "aculo.us",
+ "adcex.com",
+ "addictedtocoffee.de",
+ "addyoutube.com",
+ "adelaidebbs.com",
+ "admob.com",
+ "adpl.org.hk",
+ "ads-twitter.com",
+ "adsense.com",
+ "adult-sex-games.com",
+ "adultfriendfinder.com",
+ "adultkeep.net",
+ "advanscene.com",
+ "advertfan.com",
+ "advertisercommunity.com",
+ "ae.org",
+ "aenhancers.com",
+ "aex.com",
+ "af.mil",
+ "afantibbs.com",
+ "afr.com",
+ "afreecatv.com",
+ "agnesb.fr",
+ "agoogleaday.com",
+ "agro.hk",
+ "ai-kan.net",
+ "ai-wen.net",
+ "ai.google",
+ "aiph.net",
+ "airasia.com",
+ "airconsole.com",
+ "aircrack-ng.org",
+ "airvpn.org",
+ "aisex.com",
+ "ait.org.tw",
+ "aiweiwei.com",
+ "aiweiweiblog.com",
+ "ajsands.com",
+ "akademiye.org",
+ "akamai.net",
+ "akamaihd.net",
+ "akamaistream.net",
+ "akamaized.net",
+ "akiba-online.com",
+ "akiba-web.com",
+ "akow.org",
+ "al-islam.com",
+ "al-qimmah.net",
+ "alabout.com",
+ "alanhou.com",
+ "alarab.qa",
+ "alasbarricadas.org",
+ "alexlur.org",
+ "alforattv.net",
+ "alhayat.com",
+ "alicejapan.co.jp",
+ "aliengu.com",
+ "alive.bar",
+ "alkasir.com",
+ "all4mom.org",
+ "allcoin.com",
+ "allconnected.co",
+ "alldrawnsex.com",
+ "allervpn.com",
+ "allfinegirls.com",
+ "allgirlmassage.com",
+ "allgirlsallowed.org",
+ "allgravure.com",
+ "alliance.org.hk",
+ "allinfa.com",
+ "alljackpotscasino.com",
+ "allmovie.com",
+ "allowed.org",
+ "almasdarnews.com",
+ "almostmy.com",
+ "alphaporno.com",
+ "alternate-tools.com",
+ "alternativeto.net",
+ "altrec.com",
+ "alvinalexander.com",
+ "alwaysdata.com",
+ "alwaysdata.net",
+ "alwaysvpn.com",
+ "am730.com.hk",
+ "amazon.co.jp",
+ "amazon.com",
+ "amazonaws.com",
+ "ameblo.jp",
+ "america.gov",
+ "american.edu",
+ "americangreencard.com",
+ "americanunfinished.com",
+ "americorps.gov",
+ "amiblockedornot.com",
+ "amigobbs.net",
+ "amitabhafoundation.us",
+ "amnesty.org",
+ "amnesty.org.hk",
+ "amnesty.tw",
+ "amnestyusa.org",
+ "amnyemachen.org",
+ "amoiist.com",
+ "ampproject.org",
+ "amtb-taipei.org",
+ "anchor.fm",
+ "anchorfree.com",
+ "ancsconf.org",
+ "andfaraway.net",
+ "android-x86.org",
+ "android.com",
+ "androidify.com",
+ "androidplus.co",
+ "androidtv.com",
+ "andygod.com",
+ "angela-merkel.de",
+ "angelfire.com",
+ "angola.org",
+ "angularjs.org",
+ "animecrazy.net",
+ "aniscartujo.com",
+ "annatam.com",
+ "anobii.com",
+ "anontext.com",
+ "anonymitynetwork.com",
+ "anonymizer.com",
+ "anonymouse.org",
+ "anpopo.com",
+ "answering-islam.org",
+ "antd.org",
+ "anthonycalzadilla.com",
+ "anti1984.com",
+ "antichristendom.com",
+ "antiwave.net",
+ "anws.gov.tw",
+ "anyporn.com",
+ "anysex.com",
+ "ao3.org",
+ "aobo.com.au",
+ "aofriend.com",
+ "aofriend.com.au",
+ "aojiao.org",
+ "aol.ca",
+ "aol.co.uk",
+ "aol.com",
+ "aolnews.com",
+ "aomiwang.com",
+ "ap.org",
+ "apartmentratings.com",
+ "apartments.com",
+ "apat1989.org",
+ "apetube.com",
+ "api.ai",
+ "apiary.io",
+ "apigee.com",
+ "apk-dl.com",
+ "apk.support",
+ "apkcombo.com",
+ "apkmirror.com",
+ "apkmonk.com",
+ "apkplz.com",
+ "apkpure.com",
+ "aplusvpn.com",
+ "appbrain.com",
+ "appdownloader.net",
+ "appledaily.com",
+ "appledaily.com.hk",
+ "appledaily.com.tw",
+ "appshopper.com",
+ "appsocks.net",
+ "appspot.com",
+ "appsto.re",
+ "aptoide.com",
+ "archive.fo",
+ "archive.is",
+ "archive.li",
+ "archive.org",
+ "archive.ph",
+ "archive.today",
+ "archiveofourown.com",
+ "archiveofourown.org",
+ "archives.gov",
+ "archives.gov.tw",
+ "arctosia.com",
+ "areca-backup.org",
+ "arena.taipei",
+ "arethusa.su",
+ "arlingtoncemetery.mil",
+ "army.mil",
+ "art4tibet1998.org",
+ "arte.tv",
+ "artofpeacefoundation.org",
+ "artstation.com",
+ "artsy.net",
+ "asacp.org",
+ "asdfg.jp",
+ "asg.to",
+ "asia-gaming.com",
+ "asiaharvest.org",
+ "asianage.com",
+ "asianews.it",
+ "asianfreeforum.com",
+ "asiansexdiary.com",
+ "asianspiss.com",
+ "asianwomensfilm.de",
+ "asiaone.com",
+ "asiatgp.com",
+ "asiatoday.us",
+ "askstudent.com",
+ "askynz.net",
+ "aspi.org.au",
+ "aspistrategist.org.au",
+ "assembla.com",
+ "assimp.org",
+ "astrill.com",
+ "atc.org.au",
+ "atchinese.com",
+ "atdmt.com",
+ "atgfw.org",
+ "athenaeizou.com",
+ "atlanta168.com",
+ "atlaspost.com",
+ "atnext.com",
+ "audionow.com",
+ "authorizeddns.net",
+ "authorizeddns.org",
+ "authorizeddns.us",
+ "autodraw.com",
+ "av-e-body.com",
+ "av.com",
+ "av.movie",
+ "avaaz.org",
+ "avbody.tv",
+ "avcity.tv",
+ "avcool.com",
+ "avdb.in",
+ "avdb.tv",
+ "avfantasy.com",
+ "avg.com",
+ "avgle.com",
+ "avidemux.org",
+ "avmo.pw",
+ "avmoo.com",
+ "avmoo.net",
+ "avmoo.pw",
+ "avoision.com",
+ "avyahoo.com",
+ "axios.com",
+ "axureformac.com",
+ "azerbaycan.tv",
+ "azerimix.com",
+ "azubu.tv",
+ "azurewebsites.net",
+ "b-ok.cc",
+ "b0ne.com",
+ "baby-kingdom.com",
+ "babylonbee.com",
+ "babynet.com.hk",
+ "backchina.com",
+ "backpackers.com.tw",
+ "backtotiananmen.com",
+ "badiucao.com",
+ "badjojo.com",
+ "badoo.com",
+ "baidu.jp",
+ "baijie.org",
+ "bailandaily.com",
+ "baixing.me",
+ "bakgeekhome.tk",
+ "banana-vpn.com",
+ "band.us",
+ "bandcamp.com",
+ "bandwagonhost.com",
+ "bangbrosnetwork.com",
+ "bangchen.net",
+ "bangdream.space",
+ "bangkokpost.com",
+ "bangyoulater.com",
+ "bankmobilevibe.com",
+ "bannedbook.org",
+ "bannednews.org",
+ "banorte.com",
+ "baramangaonline.com",
+ "barenakedislam.com",
+ "barnabu.co.uk",
+ "barton.de",
+ "bastillepost.com",
+ "bayvoice.net",
+ "baywords.com",
+ "bb-chat.tv",
+ "bbc.co.uk",
+ "bbc.com",
+ "bbc.in",
+ "bbcchinese.com",
+ "bbchat.tv",
+ "bbci.co.uk",
+ "bbg.gov",
+ "bbkz.com",
+ "bbnradio.org",
+ "bbs-tw.com",
+ "bbsdigest.com",
+ "bbsfeed.com",
+ "bbsland.com",
+ "bbsmo.com",
+ "bbsone.com",
+ "bbtoystore.com",
+ "bcast.co.nz",
+ "bcc.com.tw",
+ "bcchinese.net",
+ "bcex.ca",
+ "bcmorning.com",
+ "bdsmvideos.net",
+ "beaconevents.com",
+ "bebo.com",
+ "beeg.com",
+ "beevpn.com",
+ "behance.net",
+ "behindkink.com",
+ "beijing1989.com",
+ "beijing2022.art",
+ "beijingspring.com",
+ "beijingzx.org",
+ "belamionline.com",
+ "bell.wiki",
+ "bemywife.cc",
+ "beric.me",
+ "berlinerbericht.de",
+ "berlintwitterwall.com",
+ "berm.co.nz",
+ "bestforchina.org",
+ "bestgore.com",
+ "bestpornstardb.com",
+ "bestvpn.com",
+ "bestvpnanalysis.com",
+ "bestvpnserver.com",
+ "bestvpnservice.com",
+ "bestvpnusa.com",
+ "bet365.com",
+ "betfair.com",
+ "betternet.co",
+ "bettervpn.com",
+ "bettween.com",
+ "betvictor.com",
+ "bewww.net",
+ "beyondfirewall.com",
+ "bfnn.org",
+ "bfsh.hk",
+ "bgvpn.com",
+ "bianlei.com",
+ "biantailajiao.com",
+ "biantailajiao.in",
+ "biblesforamerica.org",
+ "bibox.com",
+ "bic2011.org",
+ "biedian.me",
+ "big.one",
+ "bigfools.com",
+ "bigjapanesesex.com",
+ "bigmoney.biz",
+ "bignews.org",
+ "bigone.com",
+ "bigsound.org",
+ "bild.de",
+ "biliworld.com",
+ "billypan.com",
+ "binance.com",
+ "bing.com",
+ "binux.me",
+ "binwang.me",
+ "bird.so",
+ "bit-z.com",
+ "bit.do",
+ "bit.ly",
+ "bitbay.net",
+ "bitchute.com",
+ "bitcointalk.org",
+ "bitcoinworld.com",
+ "bitfinex.com",
+ "bithumb.com",
+ "bitinka.com.ar",
+ "bitmex.com",
+ "bitshare.com",
+ "bitsnoop.com",
+ "bitterwinter.org",
+ "bitvise.com",
+ "bitz.ai",
+ "bizhat.com",
+ "bjnewlife.org",
+ "bjs.org",
+ "bjzc.org",
+ "bl-doujinsouko.com",
+ "blacklogic.com",
+ "blackvpn.com",
+ "blewpass.com",
+ "blingblingsquad.net",
+ "blinkx.com",
+ "blinw.com",
+ "blip.tv",
+ "blockcast.it",
+ "blockcn.com",
+ "blockedbyhk.com",
+ "blockless.com",
+ "blog.de",
+ "blog.google",
+ "blog.jp",
+ "blogblog.com",
+ "blogcatalog.com",
+ "blogcity.me",
+ "blogdns.org",
+ "blogger.com",
+ "blogimg.jp",
+ "bloglines.com",
+ "bloglovin.com",
+ "blogs.com",
+ "blogspot.com",
+ "blogspot.hk",
+ "blogspot.jp",
+ "blogspot.tw",
+ "blogtd.net",
+ "blogtd.org",
+ "bloodshed.net",
+ "bloomberg.cn",
+ "bloomberg.com",
+ "bloomberg.de",
+ "bloombergview.com",
+ "bloomfortune.com",
+ "blubrry.com",
+ "blueangellive.com",
+ "bmfinn.com",
+ "bnews.co",
+ "bnext.com.tw",
+ "bnn.co",
+ "bnrmetal.com",
+ "boardreader.com",
+ "bod.asia",
+ "bodog88.com",
+ "bolehvpn.net",
+ "bonbonme.com",
+ "bonbonsex.com",
+ "bonfoundation.org",
+ "bongacams.com",
+ "boobstagram.com",
+ "book.com.tw",
+ "bookdepository.com",
+ "bookepub.com",
+ "books.com.tw",
+ "booktopia.com.au",
+ "boomssr.com",
+ "borgenmagazine.com",
+ "bot.nu",
+ "botanwang.com",
+ "bowenpress.com",
+ "box.com",
+ "box.net",
+ "boxpn.com",
+ "boxun.com",
+ "boxun.tv",
+ "boxunblog.com",
+ "boxunclub.com",
+ "boyangu.com",
+ "boyfriendtv.com",
+ "boysfood.com",
+ "boysmaster.com",
+ "br.st",
+ "brainyquote.com",
+ "brandonhutchinson.com",
+ "braumeister.org",
+ "brave.com",
+ "bravotube.net",
+ "brazzers.com",
+ "breached.to",
+ "break.com",
+ "breakgfw.com",
+ "breaking911.com",
+ "breakingtweets.com",
+ "breakwall.net",
+ "briefdream.com",
+ "briian.com",
+ "brill.com",
+ "brizzly.com",
+ "brkmd.com",
+ "broadbook.com",
+ "broadpressinc.com",
+ "brockbbs.com",
+ "brookings.edu",
+ "brucewang.net",
+ "brutaltgp.com",
+ "bt2mag.com",
+ "bt95.com",
+ "btaia.com",
+ "btbtav.com",
+ "btc98.com",
+ "btcbank.bank",
+ "btctrade.im",
+ "btdigg.org",
+ "btku.me",
+ "btku.org",
+ "btspread.com",
+ "btsynckeys.com",
+ "budaedu.org",
+ "buddhanet.com.tw",
+ "buddhistchannel.tv",
+ "buffered.com",
+ "bullguard.com",
+ "bullog.org",
+ "bullogger.com",
+ "bunbunhk.com",
+ "busayari.com",
+ "business-humanrights.org",
+ "business.page",
+ "businessinsider.com",
+ "businessinsider.com.au",
+ "businesstoday.com.tw",
+ "businessweek.com",
+ "busu.org",
+ "busytrade.com",
+ "buugaa.com",
+ "buzzhand.com",
+ "buzzhand.net",
+ "buzzorange.com",
+ "bvpn.com",
+ "bwbx.io",
+ "bwgyhw.com",
+ "bwh1.net",
+ "bwsj.hk",
+ "bx.in.th",
+ "bx.tl",
+ "bybit.com",
+ "bynet.co.il",
+ "bypasscensorship.org",
+ "byrut.org",
+ "c-est-simple.com",
+ "c-span.org",
+ "c-spanvideo.org",
+ "c100tibet.org",
+ "c2cx.com",
+ "cablegatesearch.net",
+ "cachinese.com",
+ "cacnw.com",
+ "cactusvpn.com",
+ "cafepress.com",
+ "cahr.org.tw",
+ "caijinglengyan.com",
+ "calameo.com",
+ "calebelston.com",
+ "calgarychinese.ca",
+ "calgarychinese.com",
+ "calgarychinese.net",
+ "calibre-ebook.com",
+ "caltech.edu",
+ "cam4.com",
+ "cam4.jp",
+ "cam4.sg",
+ "camfrog.com",
+ "campaignforuyghurs.org",
+ "cams.com",
+ "cams.org.sg",
+ "canadameet.com",
+ "canalporno.com",
+ "cantonese.asia",
+ "canyu.org",
+ "cao.im",
+ "caobian.info",
+ "caochangqing.com",
+ "cap.org.hk",
+ "carabinasypistolas.com",
+ "cardinalkungfoundation.org",
+ "careerengine.us",
+ "carfax.com",
+ "cari.com.my",
+ "caribbeancom.com",
+ "carmotorshow.com",
+ "carrd.co",
+ "carryzhou.com",
+ "cartoonmovement.com",
+ "casadeltibetbcn.org",
+ "casatibet.org.mx",
+ "casinobellini.com",
+ "casinoking.com",
+ "casinoriva.com",
+ "castbox.fm",
+ "catch22.net",
+ "catchgod.com",
+ "catfightpayperview.xxx",
+ "catholic.org.hk",
+ "catholic.org.tw",
+ "cathvoice.org.tw",
+ "cato.org",
+ "cattt.com",
+ "cbc.ca",
+ "cbsnews.com",
+ "cbtc.org.hk",
+ "cc.com",
+ "cccat.cc",
+ "cccat.co",
+ "ccdtr.org",
+ "cchere.com",
+ "ccim.org",
+ "cclife.ca",
+ "cclife.org",
+ "cclifefl.org",
+ "ccthere.com",
+ "ccthere.net",
+ "cctmweb.net",
+ "cctongbao.com",
+ "ccue.ca",
+ "ccue.com",
+ "ccvoice.ca",
+ "ccw.org.tw",
+ "cdbook.org",
+ "cdcparty.com",
+ "cdef.org",
+ "cdig.info",
+ "cdjp.org",
+ "cdnews.com.tw",
+ "cdninstagram.com",
+ "cdp1989.org",
+ "cdp1998.org",
+ "cdp2006.org",
+ "cdpeu.org",
+ "cdpusa.org",
+ "cdpweb.org",
+ "cdpwu.org",
+ "cdw.com",
+ "cecc.gov",
+ "cellulo.info",
+ "cenews.eu",
+ "centauro.com.br",
+ "centerforhumanreprod.com",
+ "centralnation.com",
+ "centurys.net",
+ "certificate-transparency.org",
+ "cfhks.org.hk",
+ "cfos.de",
+ "cfr.org",
+ "cftfc.com",
+ "cgdepot.org",
+ "cgst.edu",
+ "change.org",
+ "changeip.name",
+ "changeip.net",
+ "changeip.org",
+ "changp.com",
+ "changsa.net",
+ "channelnewsasia.com",
+ "chaoex.com",
+ "chapm25.com",
+ "chatnook.com",
+ "chaturbate.com",
+ "checkgfw.com",
+ "chengmingmag.com",
+ "chenguangcheng.com",
+ "chenpokong.com",
+ "chenpokong.net",
+ "chenpokongvip.com",
+ "cherrysave.com",
+ "chhongbi.org",
+ "chicagoncmtv.com",
+ "china-mmm.net",
+ "china-review.com.ua",
+ "china-week.com",
+ "china101.com",
+ "china18.org",
+ "china21.com",
+ "china21.org",
+ "china5000.us",
+ "chinaaffairs.org",
+ "chinaaid.me",
+ "chinaaid.net",
+ "chinaaid.org",
+ "chinaaid.us",
+ "chinachange.org",
+ "chinachannel.hk",
+ "chinacitynews.be",
+ "chinacomments.org",
+ "chinadialogue.net",
+ "chinadigitaltimes.net",
+ "chinaelections.org",
+ "chinaeweekly.com",
+ "chinafreepress.org",
+ "chinagate.com",
+ "chinageeks.org",
+ "chinagfw.org",
+ "chinagonet.com",
+ "chinagreenparty.org",
+ "chinahorizon.org",
+ "chinahush.com",
+ "chinainperspective.com",
+ "chinainterimgov.org",
+ "chinalaborwatch.org",
+ "chinalawandpolicy.com",
+ "chinalawtranslate.com",
+ "chinamule.com",
+ "chinamz.org",
+ "chinanewscenter.com",
+ "chinapost.com.tw",
+ "chinapress.com.my",
+ "chinarightsia.org",
+ "chinasmile.net",
+ "chinasocialdemocraticparty.com",
+ "chinasoul.org",
+ "chinasucks.net",
+ "chinatimes.com",
+ "chinatopsex.com",
+ "chinatown.com.au",
+ "chinatweeps.com",
+ "chinaway.org",
+ "chinaworker.info",
+ "chinaxchina.com",
+ "chinayouth.org.hk",
+ "chinayuanmin.org",
+ "chinese-hermit.net",
+ "chinese-leaders.org",
+ "chinese-memorial.org",
+ "chinesedaily.com",
+ "chinesedailynews.com",
+ "chinesedemocracy.com",
+ "chinesegay.org",
+ "chinesen.de",
+ "chinesenews.net.au",
+ "chinesepen.org",
+ "chineseradioseattle.com",
+ "chinesetalks.net",
+ "chineseupress.com",
+ "chingcheong.com",
+ "chinman.net",
+ "chithu.org",
+ "chobit.cc",
+ "chosun.com",
+ "chrdnet.com",
+ "christianfreedom.org",
+ "christianstudy.com",
+ "christiantimes.org.hk",
+ "christusrex.org",
+ "chrlawyers.hk",
+ "chrome.com",
+ "chromecast.com",
+ "chromeenterprise.google",
+ "chromeexperiments.com",
+ "chromercise.com",
+ "chromestatus.com",
+ "chromium.org",
+ "chuang-yen.org",
+ "chubold.com",
+ "chubun.com",
+ "churchinhongkong.org",
+ "chushigangdrug.ch",
+ "cienen.com",
+ "cineastentreff.de",
+ "cipfg.org",
+ "circlethebayfortibet.org",
+ "cirosantilli.com",
+ "citizencn.com",
+ "citizenlab.ca",
+ "citizenlab.org",
+ "citizenscommission.hk",
+ "citizensradio.org",
+ "city365.ca",
+ "city9x.com",
+ "citypopulation.de",
+ "citytalk.tw",
+ "civicparty.hk",
+ "civildisobediencemovement.org",
+ "civilhrfront.org",
+ "civiliangunner.com",
+ "civilmedia.tw",
+ "civisec.org",
+ "cjb.net",
+ "ck101.com",
+ "clarionproject.org",
+ "classicalguitarblog.net",
+ "clb.org.hk",
+ "cleansite.biz",
+ "cleansite.info",
+ "cleansite.us",
+ "clearharmony.net",
+ "clearsurance.com",
+ "clearwisdom.net",
+ "clementine-player.org",
+ "clinica-tibet.ru",
+ "clipfish.de",
+ "cloakpoint.com",
+ "cloudcone.com",
+ "cloudflare-ipfs.com",
+ "cloudfront.net",
+ "club1069.com",
+ "clubhouseapi.com",
+ "clyp.it",
+ "cmcn.org",
+ "cmi.org.tw",
+ "cmoinc.org",
+ "cms.gov",
+ "cmu.edu",
+ "cmule.com",
+ "cmule.org",
+ "cmx.im",
+ "cn-proxy.com",
+ "cn.com",
+ "cn6.eu",
+ "cna.com.tw",
+ "cnabc.com",
+ "cnd.org",
+ "cnet.com",
+ "cnex.org.cn",
+ "cnineu.com",
+ "cnitter.com",
+ "cnn.com",
+ "cnpolitics.org",
+ "cnproxy.com",
+ "cnyes.com",
+ "co.tv",
+ "coat.co.jp",
+ "cobinhood.com",
+ "cochina.co",
+ "cochina.org",
+ "code1984.com",
+ "codeplex.com",
+ "codeshare.io",
+ "codeskulptor.org",
+ "coin2co.in",
+ "coinbene.com",
+ "coinegg.com",
+ "coinex.com",
+ "coingecko.com",
+ "coingi.com",
+ "coinmarketcap.com",
+ "coinrail.co.kr",
+ "cointiger.com",
+ "cointobe.com",
+ "coinut.com",
+ "collateralmurder.com",
+ "collateralmurder.org",
+ "com.google",
+ "com.ru",
+ "com.uk",
+ "comedycentral.com",
+ "comefromchina.com",
+ "comic-mega.me",
+ "comico.tw",
+ "commandarms.com",
+ "commentshk.com",
+ "communistcrimes.org",
+ "communitychoicecu.com",
+ "comparitech.com",
+ "compileheart.com",
+ "compress.to",
+ "compython.net",
+ "conoha.jp",
+ "constitutionalism.solutions",
+ "contactmagazine.net",
+ "convio.net",
+ "coobay.com",
+ "cool18.com",
+ "coolaler.com",
+ "coolder.com",
+ "coolloud.org.tw",
+ "coolncute.com",
+ "coolstuffinc.com",
+ "corumcollege.com",
+ "cos-moe.com",
+ "cosplayjav.pl",
+ "costco.com",
+ "cotweet.com",
+ "counter.social",
+ "coursehero.com",
+ "cpj.org",
+ "cq99.us",
+ "crackle.com",
+ "crazys.cc",
+ "crazyshit.com",
+ "crbug.com",
+ "crchina.org",
+ "crd-net.org",
+ "creaders.net",
+ "creadersnet.com",
+ "creativelab5.com",
+ "crisisresponse.google",
+ "cristyli.com",
+ "crocotube.com",
+ "crossfire.co.kr",
+ "crossthewall.net",
+ "crossvpn.net",
+ "croxyproxy.com",
+ "crrev.com",
+ "crucial.com",
+ "crunchyroll.com",
+ "cryptographyengineering.com",
+ "csdparty.com",
+ "csis.org",
+ "csmonitor.com",
+ "csuchen.de",
+ "csw.org.uk",
+ "ct.org.tw",
+ "ctao.org",
+ "ctfriend.net",
+ "ctitv.com.tw",
+ "ctowc.org",
+ "cts.com.tw",
+ "ctwant.com",
+ "cuhk.edu.hk",
+ "cuhkacs.org",
+ "cuihua.org",
+ "cuiweiping.net",
+ "culture.tw",
+ "cumlouder.com",
+ "curvefish.com",
+ "cusp.hk",
+ "cusu.hk",
+ "cutscenes.net",
+ "cw.com.tw",
+ "cwb.gov.tw",
+ "cyberctm.com",
+ "cyberghostvpn.com",
+ "cynscribe.com",
+ "cytode.us",
+ "cz.cc",
+ "d-fukyu.com",
+ "d0z.net",
+ "d100.net",
+ "d2bay.com",
+ "d2pass.com",
+ "dabr.co.uk",
+ "dabr.eu",
+ "dabr.me",
+ "dabr.mobi",
+ "dadazim.com",
+ "dadi360.com",
+ "dafabet.com",
+ "dafagood.com",
+ "dafahao.com",
+ "dafoh.org",
+ "daftporn.com",
+ "dagelijksestandaard.nl",
+ "daidostup.ru",
+ "dailidaili.com",
+ "dailymail.co.uk",
+ "dailymotion.com",
+ "dailysabah.com",
+ "dailyview.tw",
+ "daiphapinfo.net",
+ "dajiyuan.com",
+ "dajiyuan.de",
+ "dajiyuan.eu",
+ "dalailama-archives.org",
+ "dalailama.com",
+ "dalailama.mn",
+ "dalailama.ru",
+ "dalailama80.org",
+ "dalailamacenter.org",
+ "dalailamafellows.org",
+ "dalailamafilm.com",
+ "dalailamafoundation.org",
+ "dalailamahindi.com",
+ "dalailamainaustralia.org",
+ "dalailamajapanese.com",
+ "dalailamaprotesters.info",
+ "dalailamaquotes.org",
+ "dalailamatrust.org",
+ "dalailamavisit.org.nz",
+ "dalailamaworld.com",
+ "dalianmeng.org",
+ "daliulian.org",
+ "danke4china.net",
+ "daolan.net",
+ "darktech.org",
+ "darktoy.net",
+ "darpa.mil",
+ "darrenliuwei.com",
+ "dastrassi.org",
+ "data-vocabulary.org",
+ "data.gov.tw",
+ "daum.net",
+ "david-kilgour.com",
+ "dawangidc.com",
+ "daxa.cn",
+ "dayabook.com",
+ "daylife.com",
+ "db.tt",
+ "dbc.hk",
+ "dbgjd.com",
+ "dcard.tw",
+ "dcmilitary.com",
+ "ddc.com.tw",
+ "ddhw.info",
+ "ddns.info",
+ "ddns.me.uk",
+ "ddns.mobi",
+ "ddns.ms",
+ "ddns.name",
+ "ddns.net",
+ "ddns.us",
+ "de-sci.org",
+ "deadline.com",
+ "deaftone.com",
+ "debug.com",
+ "deck.ly",
+ "decodet.co",
+ "deepmind.com",
+ "deezer.com",
+ "definebabe.com",
+ "deja.com",
+ "delcamp.net",
+ "delicious.com",
+ "democrats.org",
+ "demosisto.hk",
+ "depositphotos.com",
+ "desc.se",
+ "design.google",
+ "desipro.de",
+ "dessci.com",
+ "destroy-china.jp",
+ "deutsche-welle.de",
+ "deviantart.com",
+ "deviantart.net",
+ "devio.us",
+ "devpn.com",
+ "dfas.mil",
+ "dfn.org",
+ "dharamsalanet.com",
+ "dharmakara.net",
+ "dhcp.biz",
+ "diaoyuislands.org",
+ "difangwenge.org",
+ "digiland.tw",
+ "digisfera.com",
+ "digitalnomadsproject.org",
+ "diigo.com",
+ "dilber.se",
+ "dingchin.com.tw",
+ "dipity.com",
+ "directcreative.com",
+ "discoins.com",
+ "disconnect.me",
+ "discord.com",
+ "discord.gg",
+ "discordapp.com",
+ "discordapp.net",
+ "discuss.com.hk",
+ "discuss4u.com",
+ "dish.com",
+ "disp.cc",
+ "disqus.com",
+ "dit-inc.us",
+ "dizhidizhi.com",
+ "dizhuzhishang.com",
+ "djangosnippets.org",
+ "djorz.com",
+ "dl-laby.jp",
+ "dlive.tv",
+ "dlsite.com",
+ "dlsite.jp",
+ "dlyoutube.com",
+ "dm530.net",
+ "dmc.nico",
+ "dmcdn.net",
+ "dmhy.org",
+ "dmm.co.jp",
+ "dmm.com",
+ "dns-dns.com",
+ "dns-stuff.com",
+ "dns.google",
+ "dns04.com",
+ "dns05.com",
+ "dns1.us",
+ "dns2.us",
+ "dns2go.com",
+ "dnscrypt.org",
+ "dnset.com",
+ "dnsrd.com",
+ "dnssec.net",
+ "dnvod.tv",
+ "doctorvoice.org",
+ "documentingreality.com",
+ "dogfartnetwork.com",
+ "dojin.com",
+ "dok-forum.net",
+ "dolc.de",
+ "dolf.org.hk",
+ "dollf.com",
+ "domain.club.tw",
+ "domains.google",
+ "domaintoday.com.au",
+ "donga.com",
+ "dongtaiwang.com",
+ "dongtaiwang.net",
+ "dongyangjing.com",
+ "donmai.us",
+ "dontfilter.us",
+ "dontmovetochina.com",
+ "dorjeshugden.com",
+ "dotplane.com",
+ "dotsub.com",
+ "dotvpn.com",
+ "doub.io",
+ "doubibackup.com",
+ "doubmirror.cf",
+ "dougscripts.com",
+ "douhokanko.net",
+ "doujincafe.com",
+ "dowei.org",
+ "dowjones.com",
+ "dphk.org",
+ "dpp.org.tw",
+ "dpr.info",
+ "dragonex.io",
+ "dragonsprings.org",
+ "dreamamateurs.com",
+ "drepung.org",
+ "drgan.net",
+ "drmingxia.org",
+ "dropbooks.tv",
+ "dropbox.com",
+ "dropboxapi.com",
+ "dropboxusercontent.com",
+ "drsunacademy.com",
+ "drtuber.com",
+ "dscn.info",
+ "dsmtp.com",
+ "dstk.dk",
+ "dtdns.net",
+ "dtiblog.com",
+ "dtic.mil",
+ "dtwang.org",
+ "duanzhihu.com",
+ "dubox.com",
+ "duck.com",
+ "duckdns.org",
+ "duckduckgo.com",
+ "duckload.com",
+ "duckmylife.com",
+ "duga.jp",
+ "duihua.org",
+ "duihuahrjournal.org",
+ "dumb1.com",
+ "dunyabulteni.net",
+ "duoweitimes.com",
+ "duping.net",
+ "duplicati.com",
+ "dupola.com",
+ "dupola.net",
+ "dushi.ca",
+ "duyaoss.com",
+ "dvdpac.com",
+ "dvorak.org",
+ "dw-world.com",
+ "dw-world.de",
+ "dw.com",
+ "dw.de",
+ "dwheeler.com",
+ "dwnews.com",
+ "dwnews.net",
+ "dxiong.com",
+ "dynamic-dns.net",
+ "dynamicdns.biz",
+ "dynamicdns.co.uk",
+ "dynamicdns.me.uk",
+ "dynamicdns.org.uk",
+ "dynawebinc.com",
+ "dyndns-ip.com",
+ "dyndns-pics.com",
+ "dyndns.org",
+ "dyndns.pro",
+ "dynssl.com",
+ "dynu.com",
+ "dynu.net",
+ "dysfz.cc",
+ "dzze.com",
+ "e-classical.com.tw",
+ "e-gold.com",
+ "e-hentai.org",
+ "e-hentaidb.com",
+ "e-info.org.tw",
+ "e-traderland.net",
+ "e-zone.com.hk",
+ "e123.hk",
+ "earlytibet.com",
+ "earthcam.com",
+ "earthvpn.com",
+ "eastern-ark.com",
+ "easternlightning.org",
+ "eastturkestan.com",
+ "eastturkistan-gov.org",
+ "eastturkistan.net",
+ "eastturkistancc.org",
+ "eastturkistangovernmentinexile.us",
+ "easyca.ca",
+ "easypic.com",
+ "ebc.net.tw",
+ "ebony-beauty.com",
+ "ebookbrowse.com",
+ "ebookee.com",
+ "ebtcbank.com",
+ "ecfa.org.tw",
+ "echainhost.com",
+ "echofon.com",
+ "ecimg.tw",
+ "ecministry.net",
+ "economist.com",
+ "ecstart.com",
+ "edgecastcdn.net",
+ "edgesuite.net",
+ "edicypages.com",
+ "edmontonchina.cn",
+ "edmontonservice.com",
+ "edns.biz",
+ "edoors.com",
+ "edubridge.com",
+ "edupro.org",
+ "eesti.ee",
+ "eevpn.com",
+ "efcc.org.hk",
+ "effers.com",
+ "efksoft.com",
+ "efukt.com",
+ "eic-av.com",
+ "eireinikotaerukai.com",
+ "eisbb.com",
+ "eksisozluk.com",
+ "electionsmeter.com",
+ "elgoog.im",
+ "ellawine.org",
+ "elpais.com",
+ "eltondisney.com",
+ "emaga.com",
+ "emanna.com",
+ "emilylau.org.hk",
+ "emory.edu",
+ "empfil.com",
+ "emule-ed2k.com",
+ "emulefans.com",
+ "emuparadise.me",
+ "enanyang.my",
+ "encrypt.me",
+ "encyclopedia.com",
+ "enewstree.com",
+ "enfal.de",
+ "engadget.com",
+ "engagedaily.org",
+ "englishforeveryone.org",
+ "englishfromengland.co.uk",
+ "englishpen.org",
+ "enlighten.org.tw",
+ "entermap.com",
+ "environment.google",
+ "epa.gov.tw",
+ "epac.to",
+ "episcopalchurch.org",
+ "epochhk.com",
+ "epochtimes-bg.com",
+ "epochtimes-romania.com",
+ "epochtimes.co.il",
+ "epochtimes.co.kr",
+ "epochtimes.com",
+ "epochtimes.cz",
+ "epochtimes.de",
+ "epochtimes.fr",
+ "epochtimes.ie",
+ "epochtimes.it",
+ "epochtimes.jp",
+ "epochtimes.ru",
+ "epochtimes.se",
+ "epochtimestr.com",
+ "epochweek.com",
+ "epochweekly.com",
+ "eporner.com",
+ "equinenow.com",
+ "erabaru.net",
+ "eracom.com.tw",
+ "eraysoft.com.tr",
+ "erepublik.com",
+ "erights.net",
+ "eriversoft.com",
+ "erktv.com",
+ "ernestmandel.org",
+ "erodaizensyu.com",
+ "erodoujinlog.com",
+ "erodoujinworld.com",
+ "eromanga-kingdom.com",
+ "eromangadouzin.com",
+ "eromon.net",
+ "eroprofile.com",
+ "eroticsaloon.net",
+ "eslite.com",
+ "esmtp.biz",
+ "esu.dog",
+ "esu.im",
+ "esurance.com",
+ "etaa.org.au",
+ "etadult.com",
+ "etaiwannews.com",
+ "etherdelta.com",
+ "etherscan.io",
+ "etizer.org",
+ "etokki.com",
+ "etowns.net",
+ "etowns.org",
+ "etsy.com",
+ "ettoday.net",
+ "etvonline.hk",
+ "eu.org",
+ "eucasino.com",
+ "eulam.com",
+ "eurekavpt.com",
+ "euronews.com",
+ "europa.eu",
+ "evozi.com",
+ "evschool.net",
+ "exblog.co.jp",
+ "exblog.jp",
+ "exchristian.hk",
+ "excite.co.jp",
+ "exhentai.org",
+ "exmo.com",
+ "exmormon.org",
+ "expatshield.com",
+ "expecthim.com",
+ "expekt.com",
+ "experts-univers.com",
+ "exploader.net",
+ "expofutures.com",
+ "expressvpn.com",
+ "exrates.me",
+ "extmatrix.com",
+ "extremetube.com",
+ "exx.com",
+ "eyevio.jp",
+ "eyny.com",
+ "ezpc.tk",
+ "ezpeer.com",
+ "ezua.com",
+ "f8.com",
+ "fa.gov.tw",
+ "facebook.br",
+ "facebook.com",
+ "facebook.design",
+ "facebook.hu",
+ "facebook.in",
+ "facebook.net",
+ "facebook.nl",
+ "facebook.se",
+ "facebookmail.com",
+ "facebookquotes4u.com",
+ "faceless.me",
+ "facesofnyfw.com",
+ "facesoftibetanselfimmolators.info",
+ "factpedia.org",
+ "fail.hk",
+ "faith100.org",
+ "faithfuleye.com",
+ "faiththedog.info",
+ "fakku.net",
+ "fallenark.com",
+ "falsefire.com",
+ "falun-co.org",
+ "falun-ny.net",
+ "falunart.org",
+ "falunasia.info",
+ "falunau.org",
+ "falunaz.net",
+ "falundafa-dc.org",
+ "falundafa-florida.org",
+ "falundafa-nc.org",
+ "falundafa-pa.net",
+ "falundafa-sacramento.org",
+ "falundafa.org",
+ "falundafaindia.org",
+ "falundafamuseum.org",
+ "falungong.club",
+ "falungong.de",
+ "falungong.org.uk",
+ "falunhr.org",
+ "faluninfo.de",
+ "faluninfo.net",
+ "falunpilipinas.net",
+ "falunworld.net",
+ "familyfed.org",
+ "famunion.com",
+ "fan-qiang.com",
+ "fandom.com",
+ "fangbinxing.com",
+ "fangeming.com",
+ "fangeqiang.com",
+ "fanglizhi.info",
+ "fangmincn.org",
+ "fangong.org",
+ "fangongheike.com",
+ "fanhaodang.com",
+ "fanhaolou.com",
+ "fanqiang.network",
+ "fanqiang.tk",
+ "fanqiangdang.com",
+ "fanqianghou.com",
+ "fanqiangyakexi.net",
+ "fanqiangzhe.com",
+ "fanswong.com",
+ "fantv.hk",
+ "fanyue.info",
+ "fapdu.com",
+ "faproxy.com",
+ "faqserv.com",
+ "fartit.com",
+ "farwestchina.com",
+ "fastestvpn.com",
+ "fastly.net",
+ "fastpic.ru",
+ "fastssh.com",
+ "faststone.org",
+ "fatbtc.com",
+ "favotter.net",
+ "favstar.fm",
+ "fawanghuihui.org",
+ "faydao.com",
+ "faz.net",
+ "fb.com",
+ "fb.me",
+ "fb.watch",
+ "fbaddins.com",
+ "fbcdn.net",
+ "fbsbx.com",
+ "fbworkmail.com",
+ "fc2.com",
+ "fc2blog.net",
+ "fc2china.com",
+ "fc2cn.com",
+ "fc2web.com",
+ "fda.gov.tw",
+ "fdbox.com",
+ "fdc64.de",
+ "fdc64.org",
+ "fdc89.jp",
+ "feedburner.com",
+ "feeder.co",
+ "feedly.com",
+ "feedx.net",
+ "feelssh.com",
+ "feer.com",
+ "feifeiss.com",
+ "feitian-california.org",
+ "feitianacademy.org",
+ "feixiaohao.com",
+ "feministteacher.com",
+ "fengzhenghu.com",
+ "fengzhenghu.net",
+ "fevernet.com",
+ "ff.im",
+ "fffff.at",
+ "fflick.com",
+ "ffvpn.com",
+ "fgmtv.net",
+ "fgmtv.org",
+ "fhreports.net",
+ "figprayer.com",
+ "fileflyer.com",
+ "fileforum.com",
+ "files2me.com",
+ "fileserve.com",
+ "filesor.com",
+ "fillthesquare.org",
+ "filmingfortibet.org",
+ "filthdump.com",
+ "financetwitter.com",
+ "finchvpn.com",
+ "findmespot.com",
+ "findyoutube.com",
+ "findyoutube.net",
+ "fingerdaily.com",
+ "finler.net",
+ "firearmsworld.net",
+ "firebaseio.com",
+ "firefox.com",
+ "fireofliberty.org",
+ "firetweet.io",
+ "firstfivefollowers.com",
+ "firstpost.com",
+ "firstrade.com",
+ "fizzik.com",
+ "flagsonline.it",
+ "flecheinthepeche.fr",
+ "fleshbot.com",
+ "fleursdeslettres.com",
+ "flgg.us",
+ "flgjustice.org",
+ "flickr.com",
+ "flickrhivemind.net",
+ "flickriver.com",
+ "fling.com",
+ "flipboard.com",
+ "flipkart.com",
+ "flitto.com",
+ "flnet.org",
+ "flog.tw",
+ "flurry.com",
+ "flyvpn.com",
+ "flyzy2005.com",
+ "fmnnow.com",
+ "fnac.be",
+ "fnac.com",
+ "fochk.org",
+ "focustaiwan.tw",
+ "focusvpn.com",
+ "fofg-europe.net",
+ "fofg.org",
+ "fofldfradio.org",
+ "foolsmountain.com",
+ "fooooo.com",
+ "foreignaffairs.com",
+ "foreignpolicy.com",
+ "forum4hk.com",
+ "forums-free.com",
+ "fotile.me",
+ "fourthinternational.org",
+ "foxbusiness.com",
+ "foxdie.us",
+ "foxgay.com",
+ "foxsub.com",
+ "foxtang.com",
+ "fpmt-osel.org",
+ "fpmt.org",
+ "fpmt.tw",
+ "fpmtmexico.org",
+ "fqok.org",
+ "fqrouter.com",
+ "franklc.com",
+ "freakshare.com",
+ "free-gate.org",
+ "free-hada-now.org",
+ "free-proxy.cz",
+ "free-ss.site",
+ "free-ssh.com",
+ "free.fr",
+ "free4u.com.ar",
+ "freealim.com",
+ "freebeacon.com",
+ "freebearblog.org",
+ "freebrowser.org",
+ "freechal.com",
+ "freechina.net",
+ "freechina.news",
+ "freechinaforum.org",
+ "freechinaweibo.com",
+ "freeddns.com",
+ "freeddns.org",
+ "freedomchina.info",
+ "freedomcollection.org",
+ "freedomhouse.org",
+ "freedomsherald.org",
+ "freeforums.org",
+ "freefq.com",
+ "freefuckvids.com",
+ "freegao.com",
+ "freehongkong.org",
+ "freeilhamtohti.org",
+ "freekazakhs.org",
+ "freekwonpyong.org",
+ "freelotto.com",
+ "freeman2.com",
+ "freemoren.com",
+ "freemorenews.com",
+ "freemuse.org",
+ "freenet-china.org",
+ "freenetproject.org",
+ "freenewscn.com",
+ "freeones.com",
+ "freeopenvpn.com",
+ "freeoz.org",
+ "freerk.com",
+ "freessh.us",
+ "freetcp.com",
+ "freetibet.net",
+ "freetibet.org",
+ "freetibetanheroes.org",
+ "freetribe.me",
+ "freeviewmovies.com",
+ "freevpn.me",
+ "freevpn.nl",
+ "freewallpaper4.me",
+ "freewebs.com",
+ "freewechat.com",
+ "freeweibo.com",
+ "freewww.biz",
+ "freewww.info",
+ "freexinwen.com",
+ "freeyellow.com",
+ "freeyoutubeproxy.net",
+ "frienddy.com",
+ "friendfeed-media.com",
+ "friendfeed.com",
+ "friendfinder.com",
+ "friends-of-tibet.org",
+ "friendsoftibet.org",
+ "fring.com",
+ "fringenetwork.com",
+ "from-pr.com",
+ "from-sd.com",
+ "fromchinatousa.net",
+ "frommel.net",
+ "frontlinedefenders.org",
+ "frootvpn.com",
+ "fscked.org",
+ "fsurf.com",
+ "ftchinese.com",
+ "ftp1.biz",
+ "ftpserver.biz",
+ "ftv.com.tw",
+ "ftvnews.com.tw",
+ "ftx.com",
+ "fucd.com",
+ "fuckcnnic.net",
+ "fuckgfw.org",
+ "fuckgfw233.org",
+ "fulione.com",
+ "fullerconsideration.com",
+ "fulue.com",
+ "funf.tw",
+ "funkyimg.com",
+ "funp.com",
+ "fuq.com",
+ "furbo.org",
+ "furhhdl.org",
+ "furinkan.com",
+ "furl.net",
+ "futurechinaforum.org",
+ "futuremessage.org",
+ "fux.com",
+ "fuyin.net",
+ "fuyindiantai.org",
+ "fuyu.org.tw",
+ "fw.cm",
+ "fxcm-chinese.com",
+ "fxnetworks.com",
+ "fzh999.com",
+ "fzh999.net",
+ "fzlm.com",
+ "g-area.org",
+ "g-queen.com",
+ "g.co",
+ "g0v.social",
+ "g6hentai.com",
+ "gab.com",
+ "gabocorp.com",
+ "gaeproxy.com",
+ "gaforum.org",
+ "gagaoolala.com",
+ "galaxymacau.com",
+ "galenwu.com",
+ "galstars.net",
+ "game735.com",
+ "gamebase.com.tw",
+ "gamejolt.com",
+ "gamer.com.tw",
+ "gamerp.jp",
+ "gamez.com.tw",
+ "gamousa.com",
+ "ganges.com",
+ "ganjingworld.com",
+ "gaoming.net",
+ "gaopi.net",
+ "gaozhisheng.net",
+ "gaozhisheng.org",
+ "gardennetworks.com",
+ "gardennetworks.org",
+ "gartlive.com",
+ "gate-project.com",
+ "gate.io",
+ "gatecoin.com",
+ "gather.com",
+ "gatherproxy.com",
+ "gati.org.tw",
+ "gaybubble.com",
+ "gaycn.net",
+ "gayhub.com",
+ "gaymap.cc",
+ "gaymenring.com",
+ "gaytube.com",
+ "gaywatch.com",
+ "gazotube.com",
+ "gcc.org.hk",
+ "gclooney.com",
+ "gclubs.com",
+ "gcmasia.com",
+ "gcpnews.com",
+ "gcr.io",
+ "gdbt.net",
+ "gdzf.org",
+ "geek-art.net",
+ "geekerhome.com",
+ "geekheart.info",
+ "gekikame.com",
+ "gelbooru.com",
+ "genius.com",
+ "geocities.co.jp",
+ "geocities.com",
+ "geocities.jp",
+ "geph.io",
+ "gerefoundation.org",
+ "get.app",
+ "get.dev",
+ "get.how",
+ "get.page",
+ "getastrill.com",
+ "getchu.com",
+ "getcloak.com",
+ "getfoxyproxy.org",
+ "getfreedur.com",
+ "getgom.com",
+ "geti2p.net",
+ "getiton.com",
+ "getjetso.com",
+ "getlantern.org",
+ "getmalus.com",
+ "getmdl.io",
+ "getoutline.org",
+ "getsocialscope.com",
+ "getsync.com",
+ "gettr.com",
+ "gettrials.com",
+ "gettyimages.com",
+ "getuploader.com",
+ "gfbv.de",
+ "gfgold.com.hk",
+ "gfsale.com",
+ "gfw.org.ua",
+ "gfw.press",
+ "gfw.report",
+ "ggpht.com",
+ "ggssl.com",
+ "ghidra-sre.org",
+ "ghostpath.com",
+ "ghut.org",
+ "giantessnight.com",
+ "gifree.com",
+ "giga-web.jp",
+ "gigacircle.com",
+ "giganews.com",
+ "gigporno.ru",
+ "girlbanker.com",
+ "git.io",
+ "gitbooks.io",
+ "githack.com",
+ "github.blog",
+ "github.com",
+ "github.io",
+ "githubassets.com",
+ "githubusercontent.com",
+ "gizlen.net",
+ "gjczz.com",
+ "glass8.eu",
+ "globaljihad.net",
+ "globalmediaoutreach.com",
+ "globalmuseumoncommunism.org",
+ "globalrescue.net",
+ "globaltm.org",
+ "globalvoices.org",
+ "globalvoicesonline.org",
+ "globalvpn.net",
+ "glock.com",
+ "gloryhole.com",
+ "glorystar.me",
+ "gluckman.com",
+ "glype.com",
+ "gmail.com",
+ "gmgard.com",
+ "gmhz.org",
+ "gmiddle.com",
+ "gmiddle.net",
+ "gmll.org",
+ "gmodules.com",
+ "gmx.net",
+ "gnci.org.hk",
+ "gnews.org",
+ "go-pki.com",
+ "go141.com",
+ "goagent.biz",
+ "goagentplus.com",
+ "gobet.cc",
+ "godfootsteps.org",
+ "godns.work",
+ "godoc.org",
+ "godsdirectcontact.co.uk",
+ "godsdirectcontact.org",
+ "godsdirectcontact.org.tw",
+ "godsimmediatecontact.com",
+ "gofundme.com",
+ "gogotunnel.com",
+ "gohappy.com.tw",
+ "gokbayrak.com",
+ "golang.org",
+ "goldbet.com",
+ "goldbetsports.com",
+ "golden-ages.org",
+ "goldeneyevault.com",
+ "goldenfrog.com",
+ "goldjizz.com",
+ "goldstep.net",
+ "goldwave.com",
+ "gongm.in",
+ "gongmeng.info",
+ "gongminliliang.com",
+ "gongwt.com",
+ "goo.gl",
+ "goo.gle",
+ "goo.ne.jp",
+ "gooday.xyz",
+ "gooddns.info",
+ "goodhope.school",
+ "goodreaders.com",
+ "goodreads.com",
+ "goodtv.com.tw",
+ "goodtv.tv",
+ "goofind.com",
+ "google.ac",
+ "google.ad",
+ "google.ae",
+ "google.af",
+ "google.ai",
+ "google.al",
+ "google.am",
+ "google.as",
+ "google.at",
+ "google.az",
+ "google.ba",
+ "google.be",
+ "google.bf",
+ "google.bg",
+ "google.bi",
+ "google.bj",
+ "google.bs",
+ "google.bt",
+ "google.by",
+ "google.ca",
+ "google.cat",
+ "google.cd",
+ "google.cf",
+ "google.cg",
+ "google.ch",
+ "google.ci",
+ "google.cl",
+ "google.cm",
+ "google.cn",
+ "google.co.ao",
+ "google.co.bw",
+ "google.co.ck",
+ "google.co.cr",
+ "google.co.id",
+ "google.co.il",
+ "google.co.in",
+ "google.co.jp",
+ "google.co.ke",
+ "google.co.kr",
+ "google.co.ls",
+ "google.co.ma",
+ "google.co.mz",
+ "google.co.nz",
+ "google.co.th",
+ "google.co.tz",
+ "google.co.ug",
+ "google.co.uk",
+ "google.co.uz",
+ "google.co.ve",
+ "google.co.vi",
+ "google.co.za",
+ "google.co.zm",
+ "google.co.zw",
+ "google.com",
+ "google.com.af",
+ "google.com.ag",
+ "google.com.ai",
+ "google.com.ar",
+ "google.com.au",
+ "google.com.bd",
+ "google.com.bh",
+ "google.com.bn",
+ "google.com.bo",
+ "google.com.br",
+ "google.com.bz",
+ "google.com.co",
+ "google.com.cu",
+ "google.com.cy",
+ "google.com.do",
+ "google.com.ec",
+ "google.com.eg",
+ "google.com.et",
+ "google.com.fj",
+ "google.com.gh",
+ "google.com.gi",
+ "google.com.gt",
+ "google.com.hk",
+ "google.com.jm",
+ "google.com.kh",
+ "google.com.kw",
+ "google.com.lb",
+ "google.com.ly",
+ "google.com.mm",
+ "google.com.mt",
+ "google.com.mx",
+ "google.com.my",
+ "google.com.na",
+ "google.com.nf",
+ "google.com.ng",
+ "google.com.ni",
+ "google.com.np",
+ "google.com.om",
+ "google.com.pa",
+ "google.com.pe",
+ "google.com.pg",
+ "google.com.ph",
+ "google.com.pk",
+ "google.com.pr",
+ "google.com.py",
+ "google.com.qa",
+ "google.com.sa",
+ "google.com.sb",
+ "google.com.sg",
+ "google.com.sl",
+ "google.com.sv",
+ "google.com.tj",
+ "google.com.tr",
+ "google.com.tw",
+ "google.com.ua",
+ "google.com.uy",
+ "google.com.vc",
+ "google.com.vn",
+ "google.cv",
+ "google.cz",
+ "google.de",
+ "google.dev",
+ "google.dj",
+ "google.dk",
+ "google.dm",
+ "google.dz",
+ "google.ee",
+ "google.es",
+ "google.eu",
+ "google.fi",
+ "google.fm",
+ "google.fr",
+ "google.ga",
+ "google.ge",
+ "google.gg",
+ "google.gl",
+ "google.gm",
+ "google.gp",
+ "google.gr",
+ "google.gy",
+ "google.hk",
+ "google.hn",
+ "google.hr",
+ "google.ht",
+ "google.hu",
+ "google.ie",
+ "google.im",
+ "google.iq",
+ "google.is",
+ "google.it",
+ "google.it.ao",
+ "google.je",
+ "google.jo",
+ "google.kg",
+ "google.ki",
+ "google.kz",
+ "google.la",
+ "google.li",
+ "google.lk",
+ "google.lt",
+ "google.lu",
+ "google.lv",
+ "google.md",
+ "google.me",
+ "google.mg",
+ "google.mk",
+ "google.ml",
+ "google.mn",
+ "google.ms",
+ "google.mu",
+ "google.mv",
+ "google.mw",
+ "google.mx",
+ "google.ne",
+ "google.nl",
+ "google.no",
+ "google.nr",
+ "google.nu",
+ "google.org",
+ "google.pl",
+ "google.pn",
+ "google.ps",
+ "google.pt",
+ "google.ro",
+ "google.rs",
+ "google.ru",
+ "google.rw",
+ "google.sc",
+ "google.se",
+ "google.sh",
+ "google.si",
+ "google.sk",
+ "google.sm",
+ "google.sn",
+ "google.so",
+ "google.sr",
+ "google.st",
+ "google.td",
+ "google.tg",
+ "google.tk",
+ "google.tl",
+ "google.tm",
+ "google.tn",
+ "google.to",
+ "google.tt",
+ "google.us",
+ "google.vg",
+ "google.vn",
+ "google.vu",
+ "google.ws",
+ "googleapis.cn",
+ "googleapis.com",
+ "googleapps.com",
+ "googlearth.com",
+ "googleartproject.com",
+ "googleblog.com",
+ "googlebot.com",
+ "googlechinawebmaster.com",
+ "googlecode.com",
+ "googlecommerce.com",
+ "googledomains.com",
+ "googledrive.com",
+ "googleearth.com",
+ "googlefiber.net",
+ "googlegroups.com",
+ "googlehosted.com",
+ "googleideas.com",
+ "googleinsidesearch.com",
+ "googlelabs.com",
+ "googlemail.com",
+ "googlemashups.com",
+ "googlepagecreator.com",
+ "googleplay.com",
+ "googleplus.com",
+ "googlesile.com",
+ "googlesource.com",
+ "googleusercontent.com",
+ "googlevideo.com",
+ "googleweblight.com",
+ "googlezip.net",
+ "gopetition.com",
+ "goproxing.net",
+ "goreforum.com",
+ "goregrish.com",
+ "gospelherald.com",
+ "got-game.org",
+ "gotdns.ch",
+ "gotgeeks.com",
+ "gotrusted.com",
+ "gotw.ca",
+ "gov.taipei",
+ "gr8domain.biz",
+ "gr8name.biz",
+ "gradconnection.com",
+ "grammaly.com",
+ "grandtrial.org",
+ "grangorz.org",
+ "graphis.ne.jp",
+ "graphql.org",
+ "gravatar.com",
+ "greasespot.net",
+ "great-firewall.com",
+ "great-roc.org",
+ "greatfire.org",
+ "greatfirewall.biz",
+ "greatfirewallofchina.net",
+ "greatfirewallofchina.org",
+ "greatroc.org",
+ "greatroc.tw",
+ "greatzhonghua.org",
+ "greenfieldbookstore.com.hk",
+ "greenparty.org.tw",
+ "greenpeace.com.tw",
+ "greenpeace.org",
+ "greenreadings.com",
+ "greenvpn.net",
+ "greenvpn.org",
+ "grotty-monday.com",
+ "grow.google",
+ "gs-discuss.com",
+ "gsearch.media",
+ "gstatic.com",
+ "gtricks.com",
+ "gts-vpn.com",
+ "gtv.org",
+ "gtv1.org",
+ "gu-chu-sum.org",
+ "guaguass.com",
+ "guaguass.org",
+ "guancha.org",
+ "guaneryu.com",
+ "guangming.com.my",
+ "guangnianvpn.com",
+ "guardster.com",
+ "guishan.org",
+ "gumroad.com",
+ "gun-world.net",
+ "gunsamerica.com",
+ "gunsandammo.com",
+ "guo.media",
+ "guruonline.hk",
+ "gutteruncensored.com",
+ "gvlib.com",
+ "gvm.com.tw",
+ "gvt0.com",
+ "gvt1.com",
+ "gvt3.com",
+ "gwins.org",
+ "gwtproject.org",
+ "gyalwarinpoche.com",
+ "gyatsostudio.com",
+ "gzm.tv",
+ "gzone-anime.info",
+ "h-china.org",
+ "h-moe.com",
+ "h1n1china.org",
+ "h528.com",
+ "h5dm.com",
+ "h5galgame.me",
+ "hacg.club",
+ "hacg.in",
+ "hacg.li",
+ "hacg.me",
+ "hacg.red",
+ "hacken.cc",
+ "hacker.org",
+ "hackmd.io",
+ "hackthatphone.net",
+ "hahlo.com",
+ "hakkatv.org.tw",
+ "handcraftedsoftware.org",
+ "hanime.tv",
+ "hanminzu.org",
+ "hanunyi.com",
+ "hao.news",
+ "hao123.com",
+ "hao123img.com",
+ "happy-vpn.com",
+ "haproxy.org",
+ "hardsextube.com",
+ "harunyahya.com",
+ "hasi.wang",
+ "hautelook.com",
+ "hautelookcdn.com",
+ "have8.com",
+ "hbg.com",
+ "hbo.com",
+ "hclips.com",
+ "hdlt.me",
+ "hdtvb.net",
+ "hdzog.com",
+ "he.net",
+ "heartyit.com",
+ "heavy-r.com",
+ "hec.su",
+ "hecaitou.net",
+ "hechaji.com",
+ "heeact.edu.tw",
+ "hegre-art.com",
+ "helixstudios.net",
+ "helloandroid.com",
+ "helloqueer.com",
+ "helloss.pw",
+ "hellotxt.com",
+ "hellouk.org",
+ "helpeachpeople.com",
+ "helplinfen.com",
+ "helpster.de",
+ "helpuyghursnow.org",
+ "helpzhuling.org",
+ "hentai.to",
+ "hentaitube.tv",
+ "hentaivideoworld.com",
+ "heqinglian.net",
+ "here.com",
+ "heritage.org",
+ "heroku.com",
+ "heungkongdiscuss.com",
+ "hexieshe.com",
+ "hexieshe.xyz",
+ "hexxeh.net",
+ "heyuedi.com",
+ "heywire.com",
+ "heyzo.com",
+ "hgseav.com",
+ "hhdcb3office.org",
+ "hhthesakyatrizin.org",
+ "hi-on.org.tw",
+ "hidden-advent.org",
+ "hide.me",
+ "hidecloud.com",
+ "hidein.net",
+ "hideipvpn.com",
+ "hideman.net",
+ "hideme.nl",
+ "hidemy.name",
+ "hidemyass.com",
+ "hidemycomp.com",
+ "higfw.com",
+ "highpeakspureearth.com",
+ "highrockmedia.com",
+ "hightail.com",
+ "hihiforum.com",
+ "hihistory.net",
+ "hiitch.com",
+ "hikinggfw.org",
+ "hilive.tv",
+ "himalayan-foundation.org",
+ "himalayanglacier.com",
+ "himemix.com",
+ "himemix.net",
+ "hinet.net",
+ "hitbtc.com",
+ "hitomi.la",
+ "hiwifi.com",
+ "hizb-ut-tahrir.info",
+ "hizb-ut-tahrir.org",
+ "hizbuttahrir.org",
+ "hjclub.info",
+ "hk-pub.com",
+ "hk01.com",
+ "hk32168.com",
+ "hkacg.com",
+ "hkacg.net",
+ "hkatvnews.com",
+ "hkbc.net",
+ "hkbf.org",
+ "hkbookcity.com",
+ "hkchronicles.com",
+ "hkchurch.org",
+ "hkci.org.hk",
+ "hkcmi.edu",
+ "hkcnews.com",
+ "hkcoc.com",
+ "hkctu.org.hk",
+ "hkdailynews.com.hk",
+ "hkday.net",
+ "hkdc.us",
+ "hkdf.org",
+ "hkej.com",
+ "hkepc.com",
+ "hket.com",
+ "hkfaa.com",
+ "hkfreezone.com",
+ "hkfront.org",
+ "hkgalden.com",
+ "hkgolden.com",
+ "hkgpao.com",
+ "hkgreenradio.org",
+ "hkheadline.com",
+ "hkhkhk.com",
+ "hkhrc.org.hk",
+ "hkhrm.org.hk",
+ "hkip.org.uk",
+ "hkja.org.hk",
+ "hkjc.com",
+ "hkjp.org",
+ "hklft.com",
+ "hklts.org.hk",
+ "hkmap.live",
+ "hkopentv.com",
+ "hkpeanut.com",
+ "hkptu.org",
+ "hkreporter.com",
+ "hku.hk",
+ "hkusu.net",
+ "hkvwet.com",
+ "hkwcc.org.hk",
+ "hkzone.org",
+ "hmoegirl.com",
+ "hmonghot.com",
+ "hmv.co.jp",
+ "hmvdigital.ca",
+ "hmvdigital.com",
+ "hnjhj.com",
+ "hnntube.com",
+ "hola.com",
+ "hola.org",
+ "holymountaincn.com",
+ "holyspiritspeaks.org",
+ "homedepot.com",
+ "homeip.net",
+ "homeperversion.com",
+ "homeservershow.com",
+ "honeynet.org",
+ "hongkongfp.com",
+ "hongmeimei.com",
+ "hongzhi.li",
+ "honven.xyz",
+ "hootsuite.com",
+ "hoover.org",
+ "hoovers.com",
+ "hopedialogue.org",
+ "hopto.org",
+ "hornygamer.com",
+ "hornytrip.com",
+ "horrorporn.com",
+ "hotair.com",
+ "hotav.tv",
+ "hotels.cn",
+ "hotfrog.com.tw",
+ "hotgoo.com",
+ "hotpornshow.com",
+ "hotpot.hk",
+ "hotshame.com",
+ "hotspotshield.com",
+ "hottg.com",
+ "hotvpn.com",
+ "hougaige.com",
+ "howtoforge.com",
+ "hoxx.com",
+ "hpa.gov.tw",
+ "hqcdp.org",
+ "hqjapanesesex.com",
+ "hqmovies.com",
+ "hrcchina.org",
+ "hrcir.com",
+ "hrea.org",
+ "hrichina.org",
+ "hrtsea.com",
+ "hrw.org",
+ "hrweb.org",
+ "hsjp.net",
+ "hsselite.com",
+ "hst.net.tw",
+ "hstern.net",
+ "hstt.net",
+ "ht.ly",
+ "htkou.net",
+ "htl.li",
+ "html5rocks.com",
+ "https443.net",
+ "https443.org",
+ "hua-yue.net",
+ "huaglad.com",
+ "huanghuagang.org",
+ "huangyiyu.com",
+ "huaren.us",
+ "huaren4us.com",
+ "huashangnews.com",
+ "huasing.org",
+ "huaxia-news.com",
+ "huaxiabao.org",
+ "huaxin.ph",
+ "huayuworld.org",
+ "hudatoriq.web.id",
+ "hudson.org",
+ "huffingtonpost.com",
+ "hugoroy.eu",
+ "huhaitai.com",
+ "huhamhire.com",
+ "huhangfei.com",
+ "huiyi.in",
+ "hulkshare.com",
+ "hulu.com",
+ "huluim.com",
+ "hung-ya.com",
+ "hungerstrikeforaids.org",
+ "huobi.co",
+ "huobi.com",
+ "huobi.me",
+ "huobi.pro",
+ "huobi.sc",
+ "huobipro.com",
+ "huping.net",
+ "hurgokbayrak.com",
+ "hurriyet.com.tr",
+ "hustler.com",
+ "hustlercash.com",
+ "hut2.ru",
+ "hutianyi.net",
+ "hutong9.net",
+ "huyandex.com",
+ "hwadzan.tw",
+ "hwayue.org.tw",
+ "hwinfo.com",
+ "hxwk.org",
+ "hxwq.org",
+ "hybrid-analysis.com",
+ "hyperrate.com",
+ "hyread.com.tw",
+ "i-cable.com",
+ "i-part.com.tw",
+ "i-scmp.com",
+ "i1.hk",
+ "i2p2.de",
+ "i2runner.com",
+ "i818hk.com",
+ "iam.soy",
+ "iamtopone.com",
+ "iask.bz",
+ "iask.ca",
+ "iav19.com",
+ "ibiblio.org",
+ "ibit.am",
+ "iblist.com",
+ "iblogserv-f.net",
+ "ibros.org",
+ "ibtimes.com",
+ "ibvpn.com",
+ "icams.com",
+ "icerocket.com",
+ "icij.org",
+ "icl-fi.org",
+ "icoco.com",
+ "iconfactory.net",
+ "iconpaper.org",
+ "icu-project.org",
+ "idaiwan.com",
+ "idemocracy.asia",
+ "identi.ca",
+ "idiomconnection.com",
+ "idlcoyote.com",
+ "idouga.com",
+ "idreamx.com",
+ "idsam.com",
+ "ieasy5.com",
+ "ied2k.net",
+ "ienergy1.com",
+ "iepl.us",
+ "ifanqiang.com",
+ "ifcss.org",
+ "ifjc.org",
+ "ifreewares.com",
+ "ift.tt",
+ "igcd.net",
+ "igfw.net",
+ "igfw.tech",
+ "igmg.de",
+ "ignitedetroit.net",
+ "igoogle.com",
+ "igotmail.com.tw",
+ "igvita.com",
+ "ihakka.net",
+ "ihao.org",
+ "iicns.com",
+ "ikstar.com",
+ "ikwb.com",
+ "ilbe.com",
+ "ilhamtohtiinstitute.org",
+ "illusionfactory.com",
+ "ilove80.be",
+ "ilovelongtoes.com",
+ "im.tv",
+ "im88.tw",
+ "imageab.com",
+ "imagefap.com",
+ "imageflea.com",
+ "images-gaytube.com",
+ "imageshack.us",
+ "imagevenue.com",
+ "imagezilla.net",
+ "imb.org",
+ "imdb.com",
+ "img.ly",
+ "imgchili.net",
+ "imgmega.com",
+ "imgur.com",
+ "imkev.com",
+ "imlive.com",
+ "immigration.gov.tw",
+ "immoral.jp",
+ "impact.org.au",
+ "impp.mn",
+ "in-disguise.com",
+ "in.com",
+ "in99.org",
+ "incapdns.net",
+ "incloak.com",
+ "incredibox.fr",
+ "independent.co.uk",
+ "indiablooms.com",
+ "indianarrative.com",
+ "indiandefensenews.in",
+ "indiatimes.com",
+ "indiemerch.com",
+ "info-graf.fr",
+ "informer.com",
+ "initiativesforchina.org",
+ "inkui.com",
+ "inmediahk.net",
+ "innermongolia.org",
+ "inoreader.com",
+ "inote.tw",
+ "insecam.org",
+ "inside.com.tw",
+ "insidevoa.com",
+ "instagram.com",
+ "instanthq.com",
+ "institut-tibetain.org",
+ "internet.org",
+ "internetdefenseleague.org",
+ "internetfreedom.org",
+ "internetpopculture.com",
+ "inthenameofconfuciusmovie.com",
+ "inxian.com",
+ "iownyour.biz",
+ "iownyour.org",
+ "ipalter.com",
+ "ipfire.org",
+ "ipfs.io",
+ "iphone4hongkong.com",
+ "iphonehacks.com",
+ "iphonetaiwan.org",
+ "iphonix.fr",
+ "ipicture.ru",
+ "ipjetable.net",
+ "ipobar.com",
+ "ipoock.com",
+ "iportal.me",
+ "ippotv.com",
+ "ipredator.se",
+ "iptv.com.tw",
+ "iptvbin.com",
+ "ipvanish.com",
+ "iqiyi.com",
+ "iredmail.org",
+ "irib.ir",
+ "ironpython.net",
+ "ironsocket.com",
+ "is-a-hunter.com",
+ "is.gd",
+ "isaacmao.com",
+ "isasecret.com",
+ "isgreat.org",
+ "islahhaber.net",
+ "islam.org.hk",
+ "islamawareness.net",
+ "islamhouse.com",
+ "islamicity.com",
+ "islamicpluralism.org",
+ "islamtoday.net",
+ "ismaelan.com",
+ "ismalltits.com",
+ "ismprofessional.net",
+ "isohunt.com",
+ "israbox.com",
+ "issuu.com",
+ "istars.co.nz",
+ "istarshine.com",
+ "istef.info",
+ "istiqlalhewer.com",
+ "istockphoto.com",
+ "isunaffairs.com",
+ "isuntv.com",
+ "isupportuyghurs.org",
+ "itaboo.info",
+ "itaiwan.gov.tw",
+ "italiatibet.org",
+ "itasoftware.com",
+ "itemdb.com",
+ "ithome.com.tw",
+ "itsaol.com",
+ "itshidden.com",
+ "itsky.it",
+ "itweet.net",
+ "iu45.com",
+ "iuhrdf.org",
+ "iuksky.com",
+ "ivacy.com",
+ "iverycd.com",
+ "ivpn.net",
+ "ixquick.com",
+ "ixxx.com",
+ "iyouport.com",
+ "iyouport.org",
+ "izaobao.us",
+ "izihost.org",
+ "izles.net",
+ "izlesem.org",
+ "j.mp",
+ "jable.tv",
+ "jackjia.com",
+ "jamaat.org",
+ "jamestown.org",
+ "jamyangnorbu.com",
+ "jandyx.com",
+ "janwongphoto.com",
+ "japan-whores.com",
+ "japantimes.co.jp",
+ "jav.com",
+ "jav101.com",
+ "jav2be.com",
+ "jav68.tv",
+ "javakiba.org",
+ "javbus.com",
+ "javfor.me",
+ "javhd.com",
+ "javhip.com",
+ "javhub.net",
+ "javhuge.com",
+ "javlibrary.com",
+ "javmobile.net",
+ "javmoo.com",
+ "javmoo.xyz",
+ "javseen.com",
+ "javtag.com",
+ "javzoo.com",
+ "jbtalks.cc",
+ "jbtalks.com",
+ "jbtalks.my",
+ "jcpenney.com",
+ "jdwsy.com",
+ "jeanyim.com",
+ "jetos.com",
+ "jex.com",
+ "jfqu36.club",
+ "jfqu37.xyz",
+ "jgoodies.com",
+ "jiangweiping.com",
+ "jiaoyou8.com",
+ "jichangtj.com",
+ "jiehua.cz",
+ "jiepang.com",
+ "jieshibaobao.com",
+ "jigglegifs.com",
+ "jigong1024.com",
+ "jigsy.com",
+ "jihadology.net",
+ "jiji.com",
+ "jims.net",
+ "jinbushe.org",
+ "jingpin.org",
+ "jingsim.org",
+ "jinhai.de",
+ "jinpianwang.com",
+ "jinroukong.com",
+ "jintian.net",
+ "jinx.com",
+ "jiruan.net",
+ "jitouch.com",
+ "jizzthis.com",
+ "jjgirls.com",
+ "jkb.cc",
+ "jkforum.net",
+ "jkub.com",
+ "jma.go.jp",
+ "jmscult.com",
+ "joachims.org",
+ "jobso.tv",
+ "joinbbs.net",
+ "joinclubhouse.com",
+ "joinmastodon.org",
+ "joins.com",
+ "jornaldacidadeonline.com.br",
+ "journalchretien.net",
+ "journalofdemocracy.org",
+ "joymiihub.com",
+ "joyourself.com",
+ "jp.net",
+ "jpopforum.net",
+ "jqueryui.com",
+ "jsdelivr.net",
+ "jshell.net",
+ "jtvnw.net",
+ "jubushoushen.com",
+ "juhuaren.com",
+ "jukujo-club.com",
+ "juliepost.com",
+ "juliereyc.com",
+ "junauza.com",
+ "june4commemoration.org",
+ "junefourth-20.net",
+ "jungleheart.com",
+ "junglobal.net",
+ "juoaa.com",
+ "justdied.com",
+ "justfreevpn.com",
+ "justicefortenzin.org",
+ "justmysocks1.net",
+ "justpaste.it",
+ "justtristan.com",
+ "juyuange.org",
+ "juziyue.com",
+ "jwmusic.org",
+ "jyxf.net",
+ "k-doujin.net",
+ "ka-wai.com",
+ "kadokawa.co.jp",
+ "kagyu.org",
+ "kagyu.org.za",
+ "kagyumonlam.org",
+ "kagyunews.com.hk",
+ "kagyuoffice.org",
+ "kagyuoffice.org.tw",
+ "kaiyuan.de",
+ "kakao.com",
+ "kalachakralugano.org",
+ "kangye.org",
+ "kankan.today",
+ "kannewyork.com",
+ "kanshifang.com",
+ "kantie.org",
+ "kanzhongguo.com",
+ "kanzhongguo.eu",
+ "kaotic.com",
+ "karayou.com",
+ "karkhung.com",
+ "karmapa-teachings.org",
+ "karmapa.org",
+ "kawaiikawaii.jp",
+ "kawase.com",
+ "kba-tx.org",
+ "kcoolonline.com",
+ "kebrum.com",
+ "kechara.com",
+ "keepandshare.com",
+ "keezmovies.com",
+ "kendatire.com",
+ "kendincos.net",
+ "kenengba.com",
+ "keontech.net",
+ "kepard.com",
+ "keso.cn",
+ "kex.com",
+ "keycdn.com",
+ "khabdha.org",
+ "khatrimaza.org",
+ "khmusic.com.tw",
+ "kichiku-doujinko.com",
+ "kik.com",
+ "killwall.com",
+ "kimy.com.tw",
+ "kindleren.com",
+ "kingdomsalvation.org",
+ "kinghost.com",
+ "kingstone.com.tw",
+ "kink.com",
+ "kinmen.org.tw",
+ "kinmen.travel",
+ "kinokuniya.com",
+ "kir.jp",
+ "kissbbao.cn",
+ "kiwi.kz",
+ "kk-whys.co.jp",
+ "kkbox.com",
+ "kknews.cc",
+ "klip.me",
+ "kmuh.org.tw",
+ "knowledgerush.com",
+ "knowyourmeme.com",
+ "kobo.com",
+ "kobobooks.com",
+ "kodingen.com",
+ "kompozer.net",
+ "konachan.com",
+ "kone.com",
+ "koolsolutions.com",
+ "koornk.com",
+ "koranmandarin.com",
+ "korenan2.com",
+ "kqes.net",
+ "krtco.com.tw",
+ "ksdl.org",
+ "ksnews.com.tw",
+ "kspcoin.com",
+ "ktzhk.com",
+ "kucoin.com",
+ "kui.name",
+ "kukuku.uk",
+ "kun.im",
+ "kurashsultan.com",
+ "kurtmunger.com",
+ "kusocity.com",
+ "kwcg.ca",
+ "kwok7.com",
+ "kwongwah.com.my",
+ "kxsw.life",
+ "kyofun.com",
+ "kyohk.net",
+ "kyoyue.com",
+ "kyzyhello.com",
+ "kzeng.info",
+ "la-forum.org",
+ "labiennale.org",
+ "ladbrokes.com",
+ "lagranepoca.com",
+ "lala.im",
+ "lalulalu.com",
+ "lama.com.tw",
+ "lamayeshe.com",
+ "lamenhu.com",
+ "lamnia.co.uk",
+ "lamrim.com",
+ "landofhope.tv",
+ "lanterncn.cn",
+ "lantosfoundation.org",
+ "laod.cn",
+ "laogai.org",
+ "laogairesearch.org",
+ "laomiu.com",
+ "laoyang.info",
+ "laptoplockdown.com",
+ "laqingdan.net",
+ "larsgeorge.com",
+ "lastcombat.com",
+ "lastfm.es",
+ "latelinenews.com",
+ "lausan.hk",
+ "law.com",
+ "lbank.info",
+ "le-vpn.com",
+ "leafyvpn.net",
+ "lecloud.net",
+ "leeao.com.cn",
+ "lefora.com",
+ "left21.hk",
+ "legalporno.com",
+ "legsjapan.com",
+ "leirentv.ca",
+ "leisurecafe.ca",
+ "leisurepro.com",
+ "lematin.ch",
+ "lemonde.fr",
+ "lenwhite.com",
+ "leorockwell.com",
+ "lerosua.org",
+ "lers.google",
+ "lesoir.be",
+ "lester850.info",
+ "letou.com",
+ "letscorp.net",
+ "letsencrypt.org",
+ "levyhsu.com",
+ "lflink.com",
+ "lflinkup.com",
+ "lflinkup.net",
+ "lflinkup.org",
+ "lfpcontent.com",
+ "lhakar.org",
+ "lhasocialwork.org",
+ "liangyou.net",
+ "liangzhichuanmei.com",
+ "lianyue.net",
+ "liaowangxizang.net",
+ "liberal.org.hk",
+ "libertytimes.com.tw",
+ "libraryinformationtechnology.com",
+ "libredd.it",
+ "lifemiles.com",
+ "lighten.org.tw",
+ "lighti.me",
+ "lightnovel.cn",
+ "lightyearvpn.com",
+ "lihkg.com",
+ "like.com",
+ "limiao.net",
+ "line-apps.com",
+ "line-scdn.net",
+ "line.me",
+ "linglingfa.com",
+ "lingvodics.com",
+ "link-o-rama.com",
+ "linkedin.com",
+ "linkideo.com",
+ "linksalpha.com",
+ "linkuswell.com",
+ "linpie.com",
+ "linux.org.hk",
+ "linuxtoy.org",
+ "lionsroar.com",
+ "lipuman.com",
+ "liquiditytp.com",
+ "liquidvpn.com",
+ "list-manage.com",
+ "listennotes.com",
+ "listentoyoutube.com",
+ "listorious.com",
+ "lithium.com",
+ "liu-xiaobo.org",
+ "liudejun.com",
+ "liuhanyu.com",
+ "liujianshu.com",
+ "liuxiaobo.net",
+ "liuxiaotong.com",
+ "live.com",
+ "livecoin.net",
+ "livedoor.jp",
+ "liveleak.com",
+ "livemint.com",
+ "livestation.com",
+ "livestream.com",
+ "livevideo.com",
+ "livingonline.us",
+ "livingstream.com",
+ "liwangyang.com",
+ "lizhizhuangbi.com",
+ "lkcn.net",
+ "llss.me",
+ "lncn.org",
+ "load.to",
+ "lobsangwangyal.com",
+ "localbitcoins.com",
+ "localdomain.ws",
+ "localpresshk.com",
+ "lockestek.com",
+ "logbot.net",
+ "logiqx.com",
+ "logmein.com",
+ "logos.com.hk",
+ "londonchinese.ca",
+ "longhair.hk",
+ "longmusic.com",
+ "longtermly.net",
+ "longtoes.com",
+ "lookpic.com",
+ "looktoronto.com",
+ "lotsawahouse.org",
+ "lotuslight.org.hk",
+ "lotuslight.org.tw",
+ "loved.hk",
+ "lovetvshow.com",
+ "lpsg.com",
+ "lrfz.com",
+ "lrip.org",
+ "lsd.org.hk",
+ "lsforum.net",
+ "lsm.org",
+ "lsmchinese.org",
+ "lsmkorean.org",
+ "lsmradio.com",
+ "lsmwebcast.com",
+ "lsxszzg.com",
+ "ltn.com.tw",
+ "luckydesigner.space",
+ "luke54.com",
+ "luke54.org",
+ "lupm.org",
+ "lushstories.com",
+ "luxebc.com",
+ "lvhai.org",
+ "lvv2.com",
+ "lyfhk.net",
+ "lzjscript.com",
+ "lzmtnews.org",
+ "m-sport.co.uk",
+ "m-team.cc",
+ "m.me",
+ "macgamestore.com",
+ "macrovpn.com",
+ "macts.com.tw",
+ "mad-ar.ch",
+ "madewithcode.com",
+ "madonna-av.com",
+ "madrau.com",
+ "madthumbs.com",
+ "magic-net.info",
+ "mahabodhi.org",
+ "maiio.net",
+ "mail-archive.com",
+ "mail.ru",
+ "mailchimp.com",
+ "maildns.xyz",
+ "maiplus.com",
+ "maizhong.org",
+ "makemymood.com",
+ "makkahnewspaper.com",
+ "malaysiakini.com",
+ "mamingzhe.com",
+ "manchukuo.net",
+ "mandiant.com",
+ "mangafox.com",
+ "mangafox.me",
+ "maniash.com",
+ "manicur4ik.ru",
+ "mansion.com",
+ "mansionpoker.com",
+ "manta.com",
+ "manyvoices.news",
+ "maplew.com",
+ "marc.info",
+ "marguerite.su",
+ "martau.com",
+ "martincartoons.com",
+ "martinoei.com",
+ "martsangkagyuofficial.org",
+ "maruta.be",
+ "marxist.com",
+ "marxist.net",
+ "marxists.org",
+ "mash.to",
+ "maskedip.com",
+ "mastodon.cloud",
+ "mastodon.host",
+ "mastodon.social",
+ "mastodon.xyz",
+ "matainja.com",
+ "material.io",
+ "mathable.io",
+ "mathiew-badimon.com",
+ "matome-plus.com",
+ "matome-plus.net",
+ "matrix.org",
+ "matsushimakaede.com",
+ "matters.news",
+ "mattwilcox.net",
+ "maturejp.com",
+ "maxing.jp",
+ "mayimayi.com",
+ "mcadforums.com",
+ "mcaf.ee",
+ "mcfog.com",
+ "mcreasite.com",
+ "md-t.org",
+ "me.me",
+ "meansys.com",
+ "media.org.hk",
+ "mediachinese.com",
+ "mediafire.com",
+ "mediafreakcity.com",
+ "medium.com",
+ "meetav.com",
+ "meetup.com",
+ "mefeedia.com",
+ "meforum.org",
+ "mefound.com",
+ "mega.co.nz",
+ "mega.io",
+ "mega.nz",
+ "megaproxy.com",
+ "megarotic.com",
+ "megavideo.com",
+ "megurineluka.com",
+ "meizhong.blog",
+ "meizhong.report",
+ "meltoday.com",
+ "memehk.com",
+ "memorybbs.com",
+ "memri.org",
+ "memrijttm.org",
+ "mercatox.com",
+ "mercdn.net",
+ "mercyprophet.org",
+ "mergersandinquisitions.org",
+ "meridian-trust.org",
+ "meripet.biz",
+ "meripet.com",
+ "merit-times.com.tw",
+ "meshrep.com",
+ "mesotw.com",
+ "messenger.com",
+ "metacafe.com",
+ "metafilter.com",
+ "metart.com",
+ "metarthunter.com",
+ "meteorshowersonline.com",
+ "metro.taipei",
+ "metrohk.com.hk",
+ "metrolife.ca",
+ "metroradio.com.hk",
+ "mewe.com",
+ "meyou.jp",
+ "meyul.com",
+ "mfxmedia.com",
+ "mgoon.com",
+ "mgstage.com",
+ "mh4u.org",
+ "mhradio.org",
+ "michaelanti.com",
+ "michaelmarketl.com",
+ "microvpn.com",
+ "middle-way.net",
+ "mihk.hk",
+ "mihr.com",
+ "mihua.org",
+ "mikesoltys.com",
+ "mikocon.com",
+ "milph.net",
+ "milsurps.com",
+ "mimiai.net",
+ "mimivip.com",
+ "mimivv.com",
+ "mindrolling.org",
+ "mingdemedia.org",
+ "minghui-a.org",
+ "minghui-b.org",
+ "minghui-school.org",
+ "minghui.or.kr",
+ "minghui.org",
+ "mingjinglishi.com",
+ "mingjingnews.com",
+ "mingjingtimes.com",
+ "mingpao.com",
+ "mingpaocanada.com",
+ "mingpaomonthly.com",
+ "mingpaonews.com",
+ "mingpaony.com",
+ "mingpaosf.com",
+ "mingpaotor.com",
+ "mingpaovan.com",
+ "mingshengbao.com",
+ "minhhue.net",
+ "miniforum.org",
+ "ministrybooks.org",
+ "minzhuhua.net",
+ "minzhuzhanxian.com",
+ "minzhuzhongguo.org",
+ "miroguide.com",
+ "mirrorbooks.com",
+ "mirrormedia.mg",
+ "mist.vip",
+ "mit.edu",
+ "mitao.com.tw",
+ "mitbbs.com",
+ "mitbbsau.com",
+ "mixero.com",
+ "mixi.jp",
+ "mixpod.com",
+ "mixx.com",
+ "mizzmona.com",
+ "mjib.gov.tw",
+ "mk5000.com",
+ "mlcool.com",
+ "mlzs.work",
+ "mm-cg.com",
+ "mmaaxx.com",
+ "mmmca.com",
+ "mnewstv.com",
+ "mobatek.net",
+ "mobile01.com",
+ "mobileways.de",
+ "moby.to",
+ "mobypicture.com",
+ "mod.io",
+ "modernchinastudies.org",
+ "moeaic.gov.tw",
+ "moeerolibrary.com",
+ "moegirl.org",
+ "mofa.gov.tw",
+ "mofaxiehui.com",
+ "mofos.com",
+ "mog.com",
+ "mohu.club",
+ "mohu.ml",
+ "mohu.rocks",
+ "mojim.com",
+ "mol.gov.tw",
+ "molihua.org",
+ "monar.ch",
+ "mondex.org",
+ "money-link.com.tw",
+ "moneyhome.biz",
+ "monitorchina.org",
+ "monitorware.com",
+ "monlamit.org",
+ "monster.com",
+ "moodyz.com",
+ "moon.fm",
+ "moonbbs.com",
+ "moonbingo.com",
+ "moptt.tw",
+ "morbell.com",
+ "morningsun.org",
+ "moroneta.com",
+ "mos.ru",
+ "motherless.com",
+ "motiyun.com",
+ "motor4ik.ru",
+ "mousebreaker.com",
+ "movements.org",
+ "moviefap.com",
+ "moztw.org",
+ "mp3buscador.com",
+ "mpettis.com",
+ "mpfinance.com",
+ "mpinews.com",
+ "mponline.hk",
+ "mqxd.org",
+ "mrbasic.com",
+ "mrbonus.com",
+ "mrface.com",
+ "mrslove.com",
+ "mrtweet.com",
+ "msa-it.org",
+ "msguancha.com",
+ "msha.gov",
+ "msn.com",
+ "msn.com.tw",
+ "mswe1.org",
+ "mthruf.com",
+ "mtw.tl",
+ "mubi.com",
+ "muchosucko.com",
+ "mullvad.net",
+ "multiply.com",
+ "multiproxy.org",
+ "multiupload.com",
+ "mummysgold.com",
+ "murmur.tw",
+ "musicade.net",
+ "muslimvideo.com",
+ "muzi.com",
+ "muzi.net",
+ "muzu.tv",
+ "mvdis.gov.tw",
+ "mvg.jp",
+ "mx981.com",
+ "my-formosa.com",
+ "my-private-network.co.uk",
+ "my-proxy.com",
+ "my03.com",
+ "my903.com",
+ "myactimes.com",
+ "myanniu.com",
+ "myaudiocast.com",
+ "myav.com.tw",
+ "mybbs.us",
+ "mybet.com",
+ "myca168.com",
+ "mycanadanow.com",
+ "mychat.to",
+ "mychinamyhome.com",
+ "mychinanet.com",
+ "mychinanews.com",
+ "mychinese.news",
+ "mycnnews.com",
+ "mycould.com",
+ "mydad.info",
+ "myddns.com",
+ "myeasytv.com",
+ "myeclipseide.com",
+ "myforum.com.hk",
+ "myfreecams.com",
+ "myfreepaysite.com",
+ "myfreshnet.com",
+ "myftp.info",
+ "myftp.name",
+ "myiphide.com",
+ "mykomica.org",
+ "mylftv.com",
+ "mymaji.com",
+ "mymediarom.com",
+ "mymoe.moe",
+ "mymom.info",
+ "mymusic.net.tw",
+ "mynetav.net",
+ "mynetav.org",
+ "mynumber.org",
+ "myparagliding.com",
+ "mypicture.info",
+ "mypikpak.com",
+ "mypop3.net",
+ "mypop3.org",
+ "mypopescu.com",
+ "myradio.hk",
+ "myreadingmanga.info",
+ "mysecondarydns.com",
+ "mysinablog.com",
+ "myspace.com",
+ "myspacecdn.com",
+ "mytalkbox.com",
+ "mytizi.com",
+ "mywww.biz",
+ "myz.info",
+ "naacoalition.org",
+ "nabble.com",
+ "naitik.net",
+ "nakido.com",
+ "nakuz.com",
+ "nalandabodhi.org",
+ "nalandawest.org",
+ "namgyal.org",
+ "namgyalmonastery.org",
+ "namsisi.com",
+ "nanyang.com",
+ "nanyangpost.com",
+ "nanzao.com",
+ "naol.ca",
+ "naol.cc",
+ "narod.ru",
+ "nasa.gov",
+ "nat.gov.tw",
+ "nat.moe",
+ "natado.com",
+ "national-lottery.co.uk",
+ "nationalawakening.org",
+ "nationalgeographic.com",
+ "nationalinterest.org",
+ "nationalreview.com",
+ "nationsonline.org",
+ "nationwide.com",
+ "naughtyamerica.com",
+ "naver.jp",
+ "navy.mil",
+ "naweeklytimes.com",
+ "nbc.com",
+ "nbcnews.com",
+ "nbtvpn.com",
+ "nccwatch.org.tw",
+ "nch.com.tw",
+ "nchrd.org",
+ "ncn.org",
+ "ncol.com",
+ "nde.de",
+ "ndi.org",
+ "ndr.de",
+ "ned.org",
+ "nekoslovakia.net",
+ "neo-miracle.com",
+ "neowin.net",
+ "nepusoku.com",
+ "nesnode.com",
+ "net-fits.pro",
+ "netalert.me",
+ "netbig.com",
+ "netbirds.com",
+ "netcolony.com",
+ "netfirms.com",
+ "netflav.com",
+ "netflix.com",
+ "netflix.net",
+ "netme.cc",
+ "netsarang.com",
+ "netsneak.com",
+ "network54.com",
+ "networkedblogs.com",
+ "networktunnel.net",
+ "neverforget8964.org",
+ "new-3lunch.net",
+ "new-akiba.com",
+ "new96.ca",
+ "newcenturymc.com",
+ "newcenturynews.com",
+ "newchen.com",
+ "newgrounds.com",
+ "newhighlandvision.com",
+ "newipnow.com",
+ "newlandmagazine.com.au",
+ "newnews.ca",
+ "news100.com.tw",
+ "newsancai.com",
+ "newschinacomment.org",
+ "newscn.org",
+ "newsdetox.ca",
+ "newsdh.com",
+ "newsmagazine.asia",
+ "newsmax.com",
+ "newspeak.cc",
+ "newstamago.com",
+ "newstapa.org",
+ "newstarnet.com",
+ "newstatesman.com",
+ "newsweek.com",
+ "newtaiwan.com.tw",
+ "newtalk.tw",
+ "newyorker.com",
+ "newyorktimes.com",
+ "nexon.com",
+ "next11.co.jp",
+ "nextdigital.com.hk",
+ "nextmag.com.tw",
+ "nextmedia.com",
+ "nexton-net.jp",
+ "nexttv.com.tw",
+ "nf.id.au",
+ "nfjtyd.com",
+ "nflxext.com",
+ "nflximg.com",
+ "nflximg.net",
+ "nflxso.net",
+ "nflxvideo.net",
+ "ng.mil",
+ "nga.mil",
+ "ngensis.com",
+ "ngodupdongchung.com",
+ "nhentai.net",
+ "nhi.gov.tw",
+ "nhk-ondemand.jp",
+ "nic.google",
+ "nic.gov",
+ "nicovideo.jp",
+ "nighost.org",
+ "nightlife141.com",
+ "nike.com",
+ "nikkei.com",
+ "ninecommentaries.com",
+ "ning.com",
+ "ninjacloak.com",
+ "ninjaproxy.ninja",
+ "nintendium.com",
+ "ninth.biz",
+ "nitter.cc",
+ "nitter.net",
+ "niu.moe",
+ "niusnews.com",
+ "njactb.org",
+ "njuice.com",
+ "nlfreevpn.com",
+ "nmsl.website",
+ "nnews.eu",
+ "no-ip.com",
+ "no-ip.org",
+ "nobel.se",
+ "nobelprize.org",
+ "nobodycanstop.us",
+ "nodesnoop.com",
+ "nofile.io",
+ "nokogiri.org",
+ "nokola.com",
+ "noodlevpn.com",
+ "norbulingka.org",
+ "nordstrom.com",
+ "nordstromimage.com",
+ "nordstromrack.com",
+ "nordvpn.com",
+ "notepad-plus-plus.org",
+ "nottinghampost.com",
+ "novelasia.com",
+ "now.com",
+ "now.im",
+ "nownews.com",
+ "nowtorrents.com",
+ "noxinfluencer.com",
+ "noypf.com",
+ "npa.go.jp",
+ "npa.gov.tw",
+ "npnt.me",
+ "nps.gov",
+ "npsboost.com",
+ "nradio.me",
+ "nrk.no",
+ "ns01.biz",
+ "ns01.info",
+ "ns01.us",
+ "ns02.biz",
+ "ns02.info",
+ "ns02.us",
+ "ns1.name",
+ "ns2.name",
+ "ns3.name",
+ "nsc.gov.tw",
+ "ntbk.gov.tw",
+ "ntbna.gov.tw",
+ "ntbt.gov.tw",
+ "ntd.tv",
+ "ntdtv.ca",
+ "ntdtv.co.kr",
+ "ntdtv.com",
+ "ntdtv.com.tw",
+ "ntdtv.cz",
+ "ntdtv.org",
+ "ntdtv.ru",
+ "ntdtvla.com",
+ "ntrfun.com",
+ "ntsna.gov.tw",
+ "ntu.edu.tw",
+ "nu.nl",
+ "nubiles.net",
+ "nudezz.com",
+ "nuexpo.com",
+ "nukistream.com",
+ "nurgo-software.com",
+ "nusatrip.com",
+ "nutaku.net",
+ "nutsvpn.work",
+ "nuuvem.com",
+ "nuvid.com",
+ "nuzcom.com",
+ "nvdst.com",
+ "nvquan.org",
+ "nvtongzhisheng.org",
+ "nwtca.org",
+ "nyaa.eu",
+ "nyaa.si",
+ "nybooks.com",
+ "nydus.ca",
+ "nylon-angel.com",
+ "nylonstockingsonline.com",
+ "nypost.com",
+ "nyt.com",
+ "nytchina.com",
+ "nytcn.me",
+ "nytco.com",
+ "nyti.ms",
+ "nytimes.com",
+ "nytimg.com",
+ "nytlog.com",
+ "nytstyle.com",
+ "nzchinese.com",
+ "nzchinese.net.nz",
+ "oanda.com",
+ "oann.com",
+ "oauth.net",
+ "observechina.net",
+ "obutu.com",
+ "ocaspro.com",
+ "occupytiananmen.com",
+ "oclp.hk",
+ "ocreampies.com",
+ "ocry.com",
+ "october-review.org",
+ "oculus.com",
+ "oculuscdn.com",
+ "odysee.com",
+ "oex.com",
+ "offbeatchina.com",
+ "officeoftibet.com",
+ "ofile.org",
+ "ogaoga.org",
+ "ogate.org",
+ "ohchr.org",
+ "ohmyrss.com",
+ "oikos.com.tw",
+ "oiktv.com",
+ "oizoblog.com",
+ "ok.ru",
+ "okayfreedom.com",
+ "okex.com",
+ "okk.tw",
+ "okx.com",
+ "olabloga.pl",
+ "old-cat.net",
+ "olevod.com",
+ "olumpo.com",
+ "olympicwatch.org",
+ "omct.org",
+ "omgili.com",
+ "omni7.jp",
+ "omnitalk.com",
+ "omnitalk.org",
+ "omny.fm",
+ "omy.sg",
+ "on.cc",
+ "on2.com",
+ "onapp.com",
+ "onedumb.com",
+ "onejav.com",
+ "onion.city",
+ "onion.ly",
+ "onlinecha.com",
+ "onlineyoutube.com",
+ "onlygayvideo.com",
+ "onlytweets.com",
+ "onmoon.com",
+ "onmoon.net",
+ "onmypc.biz",
+ "onmypc.info",
+ "onmypc.net",
+ "onmypc.org",
+ "onmypc.us",
+ "onthehunt.com",
+ "ontrac.com",
+ "oopsforum.com",
+ "open.com.hk",
+ "openallweb.com",
+ "opendemocracy.net",
+ "opendn.xyz",
+ "openervpn.in",
+ "openid.net",
+ "openleaks.org",
+ "opensea.io",
+ "opensource.google",
+ "opentech.fund",
+ "openvpn.net",
+ "openvpn.org",
+ "openwebster.com",
+ "openwrt.org.cn",
+ "opera-mini.net",
+ "opera.com",
+ "opus-gaming.com",
+ "orchidbbs.com",
+ "organcare.org.tw",
+ "organharvestinvestigation.net",
+ "organiccrap.com",
+ "orgasm.com",
+ "orgfree.com",
+ "oricon.co.jp",
+ "orient-doll.com",
+ "orientaldaily.com.my",
+ "orn.jp",
+ "orzdream.com",
+ "orzistic.org",
+ "osfoora.com",
+ "otcbtc.com",
+ "otnd.org",
+ "otto.de",
+ "otzo.com",
+ "ourdearamy.com",
+ "ourhobby.com",
+ "oursogo.com",
+ "oursteps.com.au",
+ "oursweb.net",
+ "ourtv.hk",
+ "over-blog.com",
+ "overcast.fm",
+ "overdaily.org",
+ "overplay.net",
+ "ovi.com",
+ "ovpn.com",
+ "ow.ly",
+ "owind.com",
+ "owl.li",
+ "owltail.com",
+ "oxfordscholarship.com",
+ "oxid.it",
+ "oyax.com",
+ "oyghan.com",
+ "ozchinese.com",
+ "ozvoice.org",
+ "ozxw.com",
+ "ozyoyo.com",
+ "pachosting.com",
+ "pacificpoker.com",
+ "packetix.net",
+ "pacopacomama.com",
+ "padmanet.com",
+ "page.tl",
+ "page2rss.com",
+ "pages.dev",
+ "pagodabox.com",
+ "palacemoon.com",
+ "paldengyal.com",
+ "paljorpublications.com",
+ "palmislife.com",
+ "paltalk.com",
+ "pandapow.co",
+ "pandapow.net",
+ "pandavpn-jp.com",
+ "pandavpnpro.com",
+ "pandora.com",
+ "pandora.tv",
+ "panluan.net",
+ "panoramio.com",
+ "pao-pao.net",
+ "paper.li",
+ "paperb.us",
+ "paradisehill.cc",
+ "paradisepoker.com",
+ "parkansky.com",
+ "parler.com",
+ "parse.com",
+ "parsevideo.com",
+ "partycasino.com",
+ "partypoker.com",
+ "passion.com",
+ "passiontimes.hk",
+ "paste.ee",
+ "pastebin.com",
+ "pastie.org",
+ "pathtosharepoint.com",
+ "patreon.com",
+ "paxful.com",
+ "pbs.org",
+ "pbwiki.com",
+ "pbworks.com",
+ "pbxes.com",
+ "pbxes.org",
+ "pcanywhere.net",
+ "pcc.gov.tw",
+ "pcdvd.com.tw",
+ "pchome.com.tw",
+ "pcij.org",
+ "pcloud.com",
+ "pcstore.com.tw",
+ "pct.org.tw",
+ "pdetails.com",
+ "pdproxy.com",
+ "peace.ca",
+ "peacefire.org",
+ "peacehall.com",
+ "pearlher.org",
+ "peeasian.com",
+ "peing.net",
+ "pekingduck.org",
+ "pemulihan.or.id",
+ "pen.io",
+ "penchinese.com",
+ "penchinese.net",
+ "pengyulong.com",
+ "penisbot.com",
+ "pentalogic.net",
+ "penthouse.com",
+ "pentoy.hk",
+ "peoplebookcafe.com",
+ "peoplenews.tw",
+ "peopo.org",
+ "percy.in",
+ "perfect-privacy.com",
+ "perfectgirls.net",
+ "periscope.tv",
+ "persecutionblog.com",
+ "persiankitty.com",
+ "phapluan.org",
+ "phayul.com",
+ "philborges.com",
+ "philly.com",
+ "phmsociety.org",
+ "phncdn.com",
+ "phonegap.com",
+ "photodharma.net",
+ "photofocus.com",
+ "phuquocservices.com",
+ "picacomic.com",
+ "picacomiccn.com",
+ "picasaweb.com",
+ "picidae.net",
+ "picturedip.com",
+ "picturesocial.com",
+ "pimg.tw",
+ "pin-cong.com",
+ "pin6.com",
+ "pincong.rocks",
+ "ping.fm",
+ "pinimg.com",
+ "pinkrod.com",
+ "pinoy-n.com",
+ "pinterest.at",
+ "pinterest.ca",
+ "pinterest.co.kr",
+ "pinterest.co.uk",
+ "pinterest.com",
+ "pinterest.com.mx",
+ "pinterest.de",
+ "pinterest.dk",
+ "pinterest.fr",
+ "pinterest.jp",
+ "pinterest.nl",
+ "pinterest.se",
+ "pipii.tv",
+ "piposay.com",
+ "piraattilahti.org",
+ "piring.com",
+ "pixelqi.com",
+ "pixiv.net",
+ "pixnet.in",
+ "pixnet.net",
+ "pk.com",
+ "pki.goog",
+ "placemix.com",
+ "playboy.com",
+ "playboyplus.com",
+ "player.fm",
+ "playno1.com",
+ "playpcesor.com",
+ "plays.com.tw",
+ "plexvpn.pro",
+ "plixi.com",
+ "plm.org.hk",
+ "plunder.com",
+ "plurk.com",
+ "plus.codes",
+ "plus28.com",
+ "plusbb.com",
+ "pmatehunter.com",
+ "pmates.com",
+ "po2b.com",
+ "pobieramy.top",
+ "podbean.com",
+ "podcast.co",
+ "podictionary.com",
+ "pokerstars.com",
+ "pokerstars.net",
+ "pokerstrategy.com",
+ "politicalchina.org",
+ "politicalconsultation.org",
+ "politiscales.net",
+ "poloniex.com",
+ "polymer-project.org",
+ "polymerhk.com",
+ "poolin.com",
+ "popo.tw",
+ "popvote.hk",
+ "popxi.click",
+ "popyard.com",
+ "popyard.org",
+ "porn.com",
+ "porn2.com",
+ "porn5.com",
+ "pornbase.org",
+ "pornerbros.com",
+ "pornhd.com",
+ "pornhost.com",
+ "pornhub.com",
+ "pornhubdeutsch.net",
+ "pornmm.net",
+ "pornoxo.com",
+ "pornrapidshare.com",
+ "pornsharing.com",
+ "pornsocket.com",
+ "pornstarclub.com",
+ "porntube.com",
+ "porntubenews.com",
+ "porntvblog.com",
+ "pornvisit.com",
+ "port25.biz",
+ "portablevpn.nl",
+ "poskotanews.com",
+ "post01.com",
+ "post76.com",
+ "post852.com",
+ "postadult.com",
+ "postimg.org",
+ "potato.im",
+ "potvpn.com",
+ "power.com",
+ "powerapple.com",
+ "powercx.com",
+ "powerphoto.org",
+ "powerpointninja.com",
+ "pp.ru",
+ "prayforchina.net",
+ "premeforwindows7.com",
+ "premproxy.com",
+ "presentationzen.com",
+ "presidentlee.tw",
+ "prestige-av.com",
+ "pride.google",
+ "printfriendly.com",
+ "prism-break.org",
+ "prisoneralert.com",
+ "pritunl.com",
+ "privacybox.de",
+ "private.com",
+ "privateinternetaccess.com",
+ "privatepaste.com",
+ "privatetunnel.com",
+ "privatevpn.com",
+ "privoxy.org",
+ "procopytips.com",
+ "project-syndicate.org",
+ "prosiben.de",
+ "proton.me",
+ "protonvpn.com",
+ "provideocoalition.com",
+ "provpnaccounts.com",
+ "proxfree.com",
+ "proxifier.com",
+ "proxlet.com",
+ "proxomitron.info",
+ "proxpn.com",
+ "proxyanonimo.es",
+ "proxydns.com",
+ "proxylist.org.uk",
+ "proxynetwork.org.uk",
+ "proxypy.net",
+ "proxyroad.com",
+ "proxytunnel.net",
+ "proyectoclubes.com",
+ "prozz.net",
+ "psblog.name",
+ "pscp.tv",
+ "pshvpn.com",
+ "psiphon.ca",
+ "psiphon3.com",
+ "psiphontoday.com",
+ "pt.im",
+ "pts.org.tw",
+ "ptt.cc",
+ "pttgame.com",
+ "pttvan.org",
+ "pubu.com.tw",
+ "puffinbrowser.com",
+ "puffstore.com",
+ "pullfolio.com",
+ "punyu.com",
+ "pure18.com",
+ "pureapk.com",
+ "pureconcepts.net",
+ "pureinsight.org",
+ "purepdf.com",
+ "purevpn.com",
+ "purplelotus.org",
+ "pursuestar.com",
+ "pushchinawall.com",
+ "pussthecat.org",
+ "pussyspace.com",
+ "putihome.org",
+ "putlocker.com",
+ "putty.org",
+ "puuko.com",
+ "pwned.com",
+ "pximg.net",
+ "python.com",
+ "python.com.tw",
+ "pythonhackers.com",
+ "pythonic.life",
+ "pytorch.org",
+ "qanote.com",
+ "qgirl.com.tw",
+ "qhigh.com",
+ "qi-gong.me",
+ "qianbai.tw",
+ "qiandao.today",
+ "qiangwaikan.com",
+ "qiangyou.org",
+ "qidian.ca",
+ "qienkuen.org",
+ "qiwen.lu",
+ "qixianglu.cn",
+ "qkshare.com",
+ "qmzdd.com",
+ "qoos.com",
+ "qooza.hk",
+ "qpoe.com",
+ "qq.co.za",
+ "qstatus.com",
+ "qtrac.eu",
+ "qtweeter.com",
+ "quannengshen.org",
+ "quantumbooter.net",
+ "questvisual.com",
+ "quitccp.net",
+ "quitccp.org",
+ "quora.com",
+ "quoracdn.net",
+ "quran.com",
+ "quranexplorer.com",
+ "qusi8.net",
+ "qvodzy.org",
+ "qx.net",
+ "qxbbs.org",
+ "qz.com",
+ "r0.ru",
+ "r18.com",
+ "ra.gg",
+ "radicalparty.org",
+ "radiko.jp",
+ "radio.garden",
+ "radioaustralia.net.au",
+ "radiohilight.net",
+ "radioline.co",
+ "radiotime.com",
+ "radiovaticana.org",
+ "radiovncr.com",
+ "rael.org",
+ "raggedbanner.com",
+ "raidcall.com.tw",
+ "raidtalk.com.tw",
+ "rainbowplan.org",
+ "raindrop.io",
+ "raizoji.or.jp",
+ "ramcity.com.au",
+ "rangwang.biz",
+ "rangzen.com",
+ "rangzen.net",
+ "rangzen.org",
+ "ranxiang.com",
+ "ranyunfei.com",
+ "rapbull.net",
+ "rapidgator.net",
+ "rapidmoviez.com",
+ "rapidvpn.com",
+ "rarbgprx.org",
+ "raremovie.cc",
+ "raremovie.net",
+ "rateyourmusic.com",
+ "rationalwiki.org",
+ "rawgit.com",
+ "rawgithub.com",
+ "raxcdn.com",
+ "razyboard.com",
+ "rcinet.ca",
+ "rd.com",
+ "rdio.com",
+ "read01.com",
+ "read100.com",
+ "readingtimes.com.tw",
+ "readmoo.com",
+ "readydown.com",
+ "realcourage.org",
+ "realitykings.com",
+ "realraptalk.com",
+ "realsexpass.com",
+ "reason.com",
+ "rebatesrule.net",
+ "recaptcha.net",
+ "recordhistory.org",
+ "recovery.org.tw",
+ "recoveryversion.com.tw",
+ "recoveryversion.org",
+ "red-lang.org",
+ "redballoonsolidarity.org",
+ "redbubble.com",
+ "redchinacn.net",
+ "redchinacn.org",
+ "redd.it",
+ "reddit.com",
+ "redditlist.com",
+ "redditmedia.com",
+ "redditstatic.com",
+ "redhotlabs.com",
+ "redtube.com",
+ "referer.us",
+ "reflectivecode.com",
+ "registry.google",
+ "relaxbbs.com",
+ "relay.com.tw",
+ "releaseinternational.org",
+ "religionnews.com",
+ "religioustolerance.org",
+ "renminbao.com",
+ "renyurenquan.org",
+ "rerouted.org",
+ "research.google",
+ "resilio.com",
+ "resistchina.org",
+ "retweeteffect.com",
+ "retweetist.com",
+ "retweetrank.com",
+ "reuters.com",
+ "reutersmedia.net",
+ "revleft.com",
+ "revocationcheck.com",
+ "revver.com",
+ "rfa.org",
+ "rfachina.com",
+ "rfamobile.org",
+ "rfaweb.org",
+ "rferl.org",
+ "rfi.fr",
+ "rfi.my",
+ "rightbtc.com",
+ "rightster.com",
+ "rigpa.org",
+ "riku.me",
+ "rileyguide.com",
+ "riseup.net",
+ "ritouki.jp",
+ "ritter.vg",
+ "rixcloud.com",
+ "rixcloud.us",
+ "rlwlw.com",
+ "rmjdw.com",
+ "rmjdw132.info",
+ "roadshow.hk",
+ "roboforex.com",
+ "robustnessiskey.com",
+ "rocket-inc.net",
+ "rocketbbs.com",
+ "rocksdb.org",
+ "rojo.com",
+ "rolfoundation.org",
+ "rolia.net",
+ "rolsociety.org",
+ "ronjoneswriter.com",
+ "roodo.com",
+ "rosechina.net",
+ "rotten.com",
+ "rsdlmonitor.com",
+ "rsf-chinese.org",
+ "rsf.org",
+ "rsgamen.org",
+ "rsshub.app",
+ "rssing.com",
+ "rssmeme.com",
+ "rtalabel.org",
+ "rthk.hk",
+ "rthk.org.hk",
+ "rti.org.tw",
+ "rti.tw",
+ "rtycminnesota.org",
+ "ruanyifeng.com",
+ "rukor.org",
+ "rule34.xxx",
+ "runbtx.com",
+ "rushbee.com",
+ "rusvpn.com",
+ "ruten.com.tw",
+ "rutracker.net",
+ "rutube.ru",
+ "ruyiseek.com",
+ "rxhj.net",
+ "s-cute.com",
+ "s-dragon.org",
+ "s1heng.com",
+ "s1s1s1.com",
+ "s4miniarchive.com",
+ "s8forum.com",
+ "sa.com",
+ "saboom.com",
+ "sacks.com",
+ "sacom.hk",
+ "sadistic-v.com",
+ "sadpanda.us",
+ "safechat.com",
+ "safeguarddefenders.com",
+ "safervpn.com",
+ "safety.google",
+ "saintyculture.com",
+ "saiq.me",
+ "sakuralive.com",
+ "sakya.org",
+ "salvation.org.hk",
+ "samair.ru",
+ "sambhota.org",
+ "sandscotaicentral.com",
+ "sankei.com",
+ "sanmin.com.tw",
+ "sans.edu",
+ "sapikachu.net",
+ "saveliuxiaobo.com",
+ "savemedia.com",
+ "savethedate.foo",
+ "savethesounds.info",
+ "savetibet.de",
+ "savetibet.fr",
+ "savetibet.nl",
+ "savetibet.org",
+ "savetibet.ru",
+ "savetibetstore.org",
+ "saveuighur.org",
+ "savevid.com",
+ "say2.info",
+ "sbme.me",
+ "sbs.com.au",
+ "scasino.com",
+ "schema.org",
+ "sciencemag.org",
+ "sciencenets.com",
+ "scieron.com",
+ "scmp.com",
+ "scmpchinese.com",
+ "scramble.io",
+ "scribd.com",
+ "scriptspot.com",
+ "search.com",
+ "search.xxx",
+ "searchtruth.com",
+ "searx.me",
+ "seatguru.com",
+ "seattlefdc.com",
+ "secretchina.com",
+ "secretgarden.no",
+ "secretsline.biz",
+ "secureservercdn.net",
+ "securetunnel.com",
+ "securityinabox.org",
+ "securitykiss.com",
+ "seed4.me",
+ "seehua.com",
+ "seesmic.com",
+ "seevpn.com",
+ "seezone.net",
+ "sejie.com",
+ "sellclassics.com",
+ "sendsmtp.com",
+ "sendspace.com",
+ "sensortower.com",
+ "seraph.me",
+ "servehttp.com",
+ "serveuser.com",
+ "serveusers.com",
+ "sesawe.net",
+ "sesawe.org",
+ "sethwklein.net",
+ "setn.com",
+ "settv.com.tw",
+ "setty.com.tw",
+ "sevenload.com",
+ "sex-11.com",
+ "sex.com",
+ "sex3.com",
+ "sex8.cc",
+ "sexandsubmission.com",
+ "sexbot.com",
+ "sexhu.com",
+ "sexhuang.com",
+ "sexidude.com",
+ "sexinsex.net",
+ "sextvx.com",
+ "sexxxy.biz",
+ "sf.net",
+ "sfileydy.com",
+ "sfshibao.com",
+ "sftindia.org",
+ "sftuk.org",
+ "shadeyouvpn.com",
+ "shadow.ma",
+ "shadowsky.xyz",
+ "shadowsocks-r.com",
+ "shadowsocks.asia",
+ "shadowsocks.be",
+ "shadowsocks.com",
+ "shadowsocks.com.hk",
+ "shadowsocks.org",
+ "shadowsocks9.com",
+ "shafaqna.com",
+ "shahit.biz",
+ "shambalapost.com",
+ "shambhalasun.com",
+ "shangfang.org",
+ "shapeservices.com",
+ "sharebee.com",
+ "sharecool.org",
+ "sharpdaily.com.hk",
+ "sharpdaily.hk",
+ "sharpdaily.tw",
+ "shat-tibet.com",
+ "shattered.io",
+ "sheikyermami.com",
+ "shellfire.de",
+ "shemalez.com",
+ "shenshou.org",
+ "shenyun.com",
+ "shenyunperformingarts.org",
+ "shenyunshop.com",
+ "shenzhoufilm.com",
+ "shenzhouzhengdao.org",
+ "sherabgyaltsen.com",
+ "shiatv.net",
+ "shicheng.org",
+ "shiksha.com",
+ "shinychan.com",
+ "shipcamouflage.com",
+ "shireyishunjian.com",
+ "shitaotv.org",
+ "shixiao.org",
+ "shizhao.org",
+ "shkspr.mobi",
+ "shodanhq.com",
+ "shooshtime.com",
+ "shop2000.com.tw",
+ "shopee.tw",
+ "shopping.com",
+ "showhaotu.com",
+ "showtime.jp",
+ "showwe.tw",
+ "shutterstock.com",
+ "shvoong.com",
+ "shwchurch.org",
+ "shwchurch3.com",
+ "siddharthasintent.org",
+ "sidelinesnews.com",
+ "sidelinessportseatery.com",
+ "sierrafriendsoftibet.org",
+ "signal.org",
+ "sijihuisuo.club",
+ "sijihuisuo.com",
+ "silkbook.com",
+ "simbolostwitter.com",
+ "simplecd.org",
+ "simpleproductivityblog.com",
+ "sina.com",
+ "sina.com.hk",
+ "sina.com.tw",
+ "sinchew.com.my",
+ "singaporepools.com.sg",
+ "singfortibet.com",
+ "singpao.com.hk",
+ "singtao.ca",
+ "singtao.com",
+ "singtaousa.com",
+ "sino-monthly.com",
+ "sinoants.com",
+ "sinoca.com",
+ "sinocast.com",
+ "sinocism.com",
+ "sinoinsider.com",
+ "sinomontreal.ca",
+ "sinonet.ca",
+ "sinopitt.info",
+ "sinoquebec.com",
+ "sipml5.org",
+ "sis.xxx",
+ "sis001.com",
+ "sis001.us",
+ "site2unblock.com",
+ "site90.net",
+ "sitebro.tw",
+ "sitekreator.com",
+ "sitemaps.org",
+ "six-degrees.io",
+ "sixth.biz",
+ "sjrt.org",
+ "sjum.cn",
+ "sketchappsources.com",
+ "skimtube.com",
+ "skk.moe",
+ "skybet.com",
+ "skyking.com.tw",
+ "skykiwi.com",
+ "skynet.be",
+ "skype.com",
+ "skyvegas.com",
+ "skyxvpn.com",
+ "slacker.com",
+ "slandr.net",
+ "slaytizle.com",
+ "sleazydream.com",
+ "slheng.com",
+ "slickvpn.com",
+ "slideshare.net",
+ "slime.com.tw",
+ "slinkset.com",
+ "slutload.com",
+ "slutmoonbeam.com",
+ "slyip.com",
+ "slyip.net",
+ "sm-miracle.com",
+ "smartdnsproxy.com",
+ "smarthide.com",
+ "smartmailcloud.com",
+ "smchbooks.com",
+ "smh.com.au",
+ "smhric.org",
+ "smith.edu",
+ "smyxy.org",
+ "snapchat.com",
+ "snaptu.com",
+ "sndcdn.com",
+ "sneakme.net",
+ "snowlionpub.com",
+ "so-net.net.tw",
+ "sobees.com",
+ "soc.mil",
+ "socialblade.com",
+ "socialwhale.com",
+ "socks-proxy.net",
+ "sockscap64.com",
+ "sockslist.net",
+ "socrec.org",
+ "sod.co.jp",
+ "softether-download.com",
+ "softether.co.jp",
+ "softether.org",
+ "softfamous.com",
+ "softlayer.net",
+ "softnology.biz",
+ "softsmirror.cf",
+ "softwarebychuck.com",
+ "sogclub.com",
+ "sogoo.org",
+ "sogrady.me",
+ "soh.tw",
+ "sohcradio.com",
+ "sohfrance.org",
+ "soifind.com",
+ "sokamonline.com",
+ "sokmil.com",
+ "solana.com",
+ "solidaritetibet.org",
+ "solidfiles.com",
+ "solv.finance",
+ "somee.com",
+ "songjianjun.com",
+ "sonicbbs.cc",
+ "sonidodelaesperanza.org",
+ "sopcast.com",
+ "sopcast.org",
+ "sophos.com",
+ "sorazone.net",
+ "sorting-algorithms.com",
+ "sos.org",
+ "sosreader.com",
+ "sostibet.org",
+ "sou-tong.org",
+ "soubory.com",
+ "soul-plus.net",
+ "soulcaliburhentai.net",
+ "soumo.info",
+ "soundcloud.com",
+ "soundofhope.kr",
+ "soundofhope.org",
+ "soup.io",
+ "soupofmedia.com",
+ "sourceforge.net",
+ "sourcewadio.com",
+ "south-plus.org",
+ "southnews.com.tw",
+ "sowers.org.hk",
+ "sowiki.net",
+ "soylent.com",
+ "soylentnews.org",
+ "spankbang.com",
+ "spankingtube.com",
+ "spankwire.com",
+ "spb.com",
+ "speakerdeck.com",
+ "speedify.com",
+ "spem.at",
+ "spencertipping.com",
+ "spendee.com",
+ "spicevpn.com",
+ "spideroak.com",
+ "spike.com",
+ "spotflux.com",
+ "spotify.com",
+ "spreadshirt.es",
+ "spring4u.info",
+ "springboardplatform.com",
+ "sprite.org",
+ "sproutcore.com",
+ "sproxy.info",
+ "squirly.info",
+ "squirrelvpn.com",
+ "srocket.us",
+ "ss-link.com",
+ "ssglobal.co",
+ "ssglobal.me",
+ "ssh91.com",
+ "ssl443.org",
+ "sspanel.net",
+ "sspro.ml",
+ "ssr.tools",
+ "ssrshare.com",
+ "sss.camp",
+ "sstm.moe",
+ "sstmlt.moe",
+ "sstmlt.net",
+ "stackoverflow.com",
+ "stage64.hk",
+ "standupfortibet.org",
+ "standwithhk.org",
+ "stanford.edu",
+ "starfishfx.com",
+ "starp2p.com",
+ "startpage.com",
+ "startuplivingchina.com",
+ "stat.gov.tw",
+ "state.gov",
+ "static-economist.com",
+ "staticflickr.com",
+ "statueofdemocracy.org",
+ "stboy.net",
+ "stc.com.sa",
+ "steamcommunity.com",
+ "steampowered.com",
+ "steel-storm.com",
+ "steemit.com",
+ "steganos.com",
+ "steganos.net",
+ "stepchina.com",
+ "stephaniered.com",
+ "stgloballink.com",
+ "stheadline.com",
+ "sthoo.com",
+ "stickam.com",
+ "stickeraction.com",
+ "stileproject.com",
+ "sto.cc",
+ "stoporganharvesting.org",
+ "stoptibetcrisis.net",
+ "storagenewsletter.com",
+ "stories.google",
+ "storify.com",
+ "storm.mg",
+ "stormmediagroup.com",
+ "stoweboyd.com",
+ "straitstimes.com",
+ "stranabg.com",
+ "straplessdildo.com",
+ "streamable.com",
+ "streamate.com",
+ "streamingthe.net",
+ "streema.com",
+ "streetvoice.com",
+ "strikingly.com",
+ "strongvpn.com",
+ "strongwindpress.com",
+ "student.tw",
+ "studentsforafreetibet.org",
+ "stumbleupon.com",
+ "stupidvideos.com",
+ "substack.com",
+ "successfn.com",
+ "sueddeutsche.de",
+ "sugarsync.com",
+ "sugobbs.com",
+ "sugumiru18.com",
+ "suissl.com",
+ "sulian.me",
+ "summify.com",
+ "sumrando.com",
+ "sun1911.com",
+ "sundayguardianlive.com",
+ "sunmedia.ca",
+ "sunporno.com",
+ "sunskyforum.com",
+ "sunta.com.tw",
+ "sunvpn.net",
+ "suoluo.org",
+ "supchina.com",
+ "superfreevpn.com",
+ "superokayama.com",
+ "superpages.com",
+ "supervpn.net",
+ "superzooi.com",
+ "suppig.net",
+ "suprememastertv.com",
+ "surfeasy.com",
+ "surfeasy.com.au",
+ "surfshark.com",
+ "suroot.com",
+ "surrenderat20.net",
+ "sustainability.google",
+ "svsfx.com",
+ "swagbucks.com",
+ "swissinfo.ch",
+ "swissvpn.net",
+ "switch1.jp",
+ "switchvpn.net",
+ "sydneytoday.com",
+ "sylfoundation.org",
+ "syncback.com",
+ "synergyse.com",
+ "sysresccd.org",
+ "sytes.net",
+ "syx86.cn",
+ "syx86.com",
+ "szbbs.net",
+ "szetowah.org.hk",
+ "t-g.com",
+ "t.co",
+ "t.me",
+ "t35.com",
+ "t66y.com",
+ "t91y.com",
+ "taa-usa.org",
+ "taaze.tw",
+ "tablesgenerator.com",
+ "tabtter.jp",
+ "tacem.org",
+ "taconet.com.tw",
+ "taedp.org.tw",
+ "tafm.org",
+ "tagwa.org.au",
+ "tagwalk.com",
+ "tahr.org.tw",
+ "taipei.gov.tw",
+ "taipeisociety.org",
+ "taipeitimes.com",
+ "taiwan-sex.com",
+ "taiwanbible.com",
+ "taiwancon.com",
+ "taiwandaily.net",
+ "taiwandc.org",
+ "taiwanhot.net",
+ "taiwanjobs.gov.tw",
+ "taiwanjustice.com",
+ "taiwanjustice.net",
+ "taiwankiss.com",
+ "taiwannation.com",
+ "taiwannation.com.tw",
+ "taiwanncf.org.tw",
+ "taiwannews.com.tw",
+ "taiwanonline.cc",
+ "taiwantp.net",
+ "taiwantt.org.tw",
+ "taiwanus.net",
+ "taiwanyes.com",
+ "talk853.com",
+ "talkboxapp.com",
+ "talkcc.com",
+ "talkonly.net",
+ "tamiaode.tk",
+ "tampabay.com",
+ "tanc.org",
+ "tangben.com",
+ "tangren.us",
+ "taoism.net",
+ "taolun.info",
+ "tapanwap.com",
+ "tapatalk.com",
+ "taragana.com",
+ "target.com",
+ "tascn.com.au",
+ "taup.net",
+ "taup.org.tw",
+ "taweet.com",
+ "tbcollege.org",
+ "tbi.org.hk",
+ "tbicn.org",
+ "tbjyt.org",
+ "tbpic.info",
+ "tbrc.org",
+ "tbs-rainbow.org",
+ "tbsec.org",
+ "tbsmalaysia.org",
+ "tbsn.org",
+ "tbsseattle.org",
+ "tbssqh.org",
+ "tbswd.org",
+ "tbtemple.org.uk",
+ "tbthouston.org",
+ "tccwonline.org",
+ "tcewf.org",
+ "tchrd.org",
+ "tcnynj.org",
+ "tcpspeed.co",
+ "tcpspeed.com",
+ "tcsofbc.org",
+ "tcsovi.org",
+ "tdesktop.com",
+ "tdm.com.mo",
+ "teachparentstech.org",
+ "teamamericany.com",
+ "technews.tw",
+ "techspot.com",
+ "techviz.net",
+ "teck.in",
+ "teco-hk.org",
+ "teco-mo.org",
+ "teddysun.com",
+ "teeniefuck.net",
+ "teensinasia.com",
+ "tehrantimes.com",
+ "telecomspace.com",
+ "telegra.ph",
+ "telegram.dog",
+ "telegram.me",
+ "telegram.org",
+ "telegramdownload.com",
+ "telegraph.co.uk",
+ "telesco.pe",
+ "tellme.pw",
+ "tenacy.com",
+ "tensorflow.org",
+ "tenzinpalmo.com",
+ "terabox.com",
+ "tew.org",
+ "textnow.me",
+ "tfhub.dev",
+ "tfiflve.com",
+ "thaicn.com",
+ "thb.gov.tw",
+ "theatlantic.com",
+ "theatrum-belli.com",
+ "theaustralian.com.au",
+ "thebcomplex.com",
+ "theblaze.com",
+ "theblemish.com",
+ "thebobs.com",
+ "thebodyshop-usa.com",
+ "thechinabeat.org",
+ "thechinacollection.org",
+ "thechinastory.org",
+ "theconversation.com",
+ "thedalailamamovie.com",
+ "thediplomat.com",
+ "thedw.us",
+ "theepochtimes.com",
+ "thefacebook.com",
+ "thefrontier.hk",
+ "thegay.com",
+ "thegioitinhoc.vn",
+ "thegly.com",
+ "theguardian.com",
+ "thehots.info",
+ "thehousenews.com",
+ "thehun.net",
+ "theinitium.com",
+ "themoviedb.org",
+ "thenewslens.com",
+ "thepiratebay.org",
+ "theporndude.com",
+ "theportalwiki.com",
+ "theprint.in",
+ "thereallove.kr",
+ "therock.net.nz",
+ "thesaturdaypaper.com.au",
+ "thestandnews.com",
+ "thetibetcenter.org",
+ "thetibetconnection.org",
+ "thetibetmuseum.org",
+ "thetibetpost.com",
+ "thetinhat.com",
+ "thetrotskymovie.com",
+ "thetvdb.com",
+ "thevivekspot.com",
+ "thewgo.org",
+ "theync.com",
+ "thinkgeek.com",
+ "thinkingtaiwan.com",
+ "thinkwithgoogle.com",
+ "thisav.com",
+ "thlib.org",
+ "thomasbernhard.org",
+ "thongdreams.com",
+ "threatchaos.com",
+ "throughnightsfire.com",
+ "thumbzilla.com",
+ "thywords.com",
+ "thywords.com.tw",
+ "tiananmenduizhi.com",
+ "tiananmenmother.org",
+ "tiananmenuniv.com",
+ "tiananmenuniv.net",
+ "tiandixing.org",
+ "tianhuayuan.com",
+ "tianlawoffice.com",
+ "tianti.io",
+ "tiantibooks.org",
+ "tianyantong.org.cn",
+ "tianzhu.org",
+ "tibet-envoy.eu",
+ "tibet-foundation.org",
+ "tibet-house-trust.co.uk",
+ "tibet-initiative.de",
+ "tibet-munich.de",
+ "tibet.a.se",
+ "tibet.at",
+ "tibet.ca",
+ "tibet.com",
+ "tibet.fr",
+ "tibet.net",
+ "tibet.nu",
+ "tibet.org",
+ "tibet.org.tw",
+ "tibet.sk",
+ "tibet.to",
+ "tibet3rdpole.org",
+ "tibetaction.net",
+ "tibetaid.org",
+ "tibetalk.com",
+ "tibetan-alliance.org",
+ "tibetan.fr",
+ "tibetanaidproject.org",
+ "tibetanarts.org",
+ "tibetanbuddhistinstitute.org",
+ "tibetancommunity.org",
+ "tibetancommunityuk.net",
+ "tibetanculture.org",
+ "tibetanentrepreneurs.org",
+ "tibetanfeministcollective.org",
+ "tibetanhealth.org",
+ "tibetanjournal.com",
+ "tibetanlanguage.org",
+ "tibetanliberation.org",
+ "tibetanpaintings.com",
+ "tibetanphotoproject.com",
+ "tibetanpoliticalreview.org",
+ "tibetanreview.net",
+ "tibetansports.org",
+ "tibetanwomen.org",
+ "tibetanyouth.org",
+ "tibetanyouthcongress.org",
+ "tibetcharity.dk",
+ "tibetcharity.in",
+ "tibetchild.org",
+ "tibetcity.com",
+ "tibetcollection.com",
+ "tibetcorps.org",
+ "tibetexpress.net",
+ "tibetfocus.com",
+ "tibetfund.org",
+ "tibetgermany.com",
+ "tibetgermany.de",
+ "tibethaus.com",
+ "tibetheritagefund.org",
+ "tibethouse.jp",
+ "tibethouse.org",
+ "tibethouse.us",
+ "tibetinfonet.net",
+ "tibetjustice.org",
+ "tibetkomite.dk",
+ "tibetmuseum.org",
+ "tibetnetwork.org",
+ "tibetoffice.ch",
+ "tibetoffice.com.au",
+ "tibetoffice.eu",
+ "tibetoffice.org",
+ "tibetonline.com",
+ "tibetonline.tv",
+ "tibetoralhistory.org",
+ "tibetpolicy.eu",
+ "tibetrelieffund.co.uk",
+ "tibetsites.com",
+ "tibetsociety.com",
+ "tibetsun.com",
+ "tibetsupportgroup.org",
+ "tibetswiss.ch",
+ "tibettelegraph.com",
+ "tibettimes.net",
+ "tibetwrites.org",
+ "ticket.com.tw",
+ "tigervpn.com",
+ "tiktok.com",
+ "tiltbrush.com",
+ "timdir.com",
+ "time.com",
+ "timesnownews.com",
+ "timsah.com",
+ "timtales.com",
+ "tinc-vpn.org",
+ "tiney.com",
+ "tineye.com",
+ "tintuc101.com",
+ "tiny.cc",
+ "tinychat.com",
+ "tinypaste.com",
+ "tipas.net",
+ "tipo.gov.tw",
+ "tistory.com",
+ "tkcs-collins.com",
+ "tl.gd",
+ "tma.co.jp",
+ "tmagazine.com",
+ "tmdfish.com",
+ "tmi.me",
+ "tmpp.org",
+ "tnaflix.com",
+ "tngrnow.com",
+ "tngrnow.net",
+ "tnp.org",
+ "to-porno.com",
+ "togetter.com",
+ "toh.info",
+ "tokyo-247.com",
+ "tokyo-hot.com",
+ "tokyo-porn-tube.com",
+ "tokyocn.com",
+ "tomonews.net",
+ "tongil.or.kr",
+ "tono-oka.jp",
+ "tonyyan.net",
+ "toodoc.com",
+ "toonel.net",
+ "top.tv",
+ "top10vpn.com",
+ "top81.ws",
+ "topbtc.com",
+ "topnews.in",
+ "toppornsites.com",
+ "topshareware.com",
+ "topsy.com",
+ "toptip.ca",
+ "tora.to",
+ "torcn.com",
+ "torguard.net",
+ "torlock.com",
+ "torproject.org",
+ "torrentkitty.tv",
+ "torrentprivacy.com",
+ "torrentproject.se",
+ "torrenty.org",
+ "torrentz.eu",
+ "torvpn.com",
+ "totalvpn.com",
+ "toutiaoabc.com",
+ "towngain.com",
+ "toypark.in",
+ "toythieves.com",
+ "toytractorshow.com",
+ "tparents.org",
+ "tpi.org.tw",
+ "tracfone.com",
+ "tradingview.com",
+ "translate.goog",
+ "translate.google",
+ "transparency.org",
+ "treemall.com.tw",
+ "trendsmap.com",
+ "trialofccp.org",
+ "trickip.net",
+ "trickip.org",
+ "trimondi.de",
+ "tronscan.org",
+ "trouw.nl",
+ "trt.net.tr",
+ "trtc.com.tw",
+ "truebuddha-md.org",
+ "trulyergonomic.com",
+ "truthontour.org",
+ "truthsocial.com",
+ "truveo.com",
+ "tryheart.jp",
+ "tsctv.net",
+ "tsemtulku.com",
+ "tsquare.tv",
+ "tsu.org.tw",
+ "tsunagarumon.com",
+ "tt1069.com",
+ "tttan.com",
+ "ttv.com.tw",
+ "ttvnw.net",
+ "tu8964.com",
+ "tubaholic.com",
+ "tube.com",
+ "tube8.com",
+ "tube911.com",
+ "tubecup.com",
+ "tubegals.com",
+ "tubeislam.com",
+ "tubepornclassic.com",
+ "tubestack.com",
+ "tubewolf.com",
+ "tuibeitu.net",
+ "tuidang.net",
+ "tuidang.org",
+ "tuidang.se",
+ "tuitui.info",
+ "tuitwit.com",
+ "tumblr.com",
+ "tumutanzi.com",
+ "tumview.com",
+ "tunein.com",
+ "tunnelbear.com",
+ "tunnelblick.net",
+ "tunnelr.com",
+ "tunsafe.com",
+ "turansam.org",
+ "turbobit.net",
+ "turbohide.com",
+ "turbotwitter.com",
+ "turkistantimes.com",
+ "turntable.fm",
+ "tushycash.com",
+ "tutanota.com",
+ "tuvpn.com",
+ "tuzaijidi.com",
+ "tv.com",
+ "tv.google",
+ "tvants.com",
+ "tvb.com",
+ "tvboxnow.com",
+ "tvbs.com.tw",
+ "tvider.com",
+ "tvmost.com.hk",
+ "tvplayvideos.com",
+ "tvunetworks.com",
+ "tw-blog.com",
+ "tw-npo.org",
+ "tw01.org",
+ "twaitter.com",
+ "twapperkeeper.com",
+ "twaud.io",
+ "twavi.com",
+ "twbbs.net.tw",
+ "twbbs.org",
+ "twbbs.tw",
+ "twblogger.com",
+ "tweepguide.com",
+ "tweeplike.me",
+ "tweepmag.com",
+ "tweepml.org",
+ "tweetbackup.com",
+ "tweetboard.com",
+ "tweetboner.biz",
+ "tweetcs.com",
+ "tweetdeck.com",
+ "tweetedtimes.com",
+ "tweetmylast.fm",
+ "tweetphoto.com",
+ "tweetrans.com",
+ "tweetree.com",
+ "tweettunnel.com",
+ "tweetwally.com",
+ "tweetymail.com",
+ "tweez.net",
+ "twelve.today",
+ "twerkingbutt.com",
+ "twftp.org",
+ "twgreatdaily.com",
+ "twibase.com",
+ "twibble.de",
+ "twibbon.com",
+ "twibs.com",
+ "twicountry.org",
+ "twicsy.com",
+ "twiends.com",
+ "twifan.com",
+ "twiffo.com",
+ "twiggit.org",
+ "twilightsex.com",
+ "twilio.com",
+ "twilog.org",
+ "twimbow.com",
+ "twimg.com",
+ "twindexx.com",
+ "twip.me",
+ "twipple.jp",
+ "twishort.com",
+ "twistar.cc",
+ "twister.net.co",
+ "twisterio.com",
+ "twisternow.com",
+ "twistory.net",
+ "twit2d.com",
+ "twitbrowser.net",
+ "twitcause.com",
+ "twitch.tv",
+ "twitchcdn.net",
+ "twitgether.com",
+ "twitgoo.com",
+ "twitiq.com",
+ "twitlonger.com",
+ "twitmania.com",
+ "twitoaster.com",
+ "twitonmsn.com",
+ "twitpic.com",
+ "twitstat.com",
+ "twittbot.net",
+ "twitter.com",
+ "twitter.jp",
+ "twitter4j.org",
+ "twittercounter.com",
+ "twitterfeed.com",
+ "twittergadget.com",
+ "twitterkr.com",
+ "twittermail.com",
+ "twitterrific.com",
+ "twittertim.es",
+ "twitthat.com",
+ "twitturk.com",
+ "twitturly.com",
+ "twitvid.com",
+ "twitzap.com",
+ "twiyia.com",
+ "twnorth.org.tw",
+ "twreporter.org",
+ "twskype.com",
+ "twstar.net",
+ "twt.tl",
+ "twtkr.com",
+ "twtrland.com",
+ "twttr.com",
+ "twurl.nl",
+ "twyac.org",
+ "txxx.com",
+ "tycool.com",
+ "typepad.com",
+ "typora.io",
+ "u15.info",
+ "u9un.com",
+ "ub0.cc",
+ "ubddns.org",
+ "uberproxy.net",
+ "uc-japan.org",
+ "ucam.org",
+ "ucanews.com",
+ "ucdc1998.org",
+ "uchicago.edu",
+ "uderzo.it",
+ "udn.com",
+ "udn.com.tw",
+ "udnbkk.com",
+ "uforadio.com.tw",
+ "ufreevpn.com",
+ "ugo.com",
+ "uhdwallpapers.org",
+ "uhrp.org",
+ "uighur.nl",
+ "uighurbiz.net",
+ "uk.to",
+ "ukcdp.co.uk",
+ "ukliferadio.co.uk",
+ "uku.im",
+ "ulike.net",
+ "ulop.net",
+ "ultravpn.fr",
+ "ultraxs.com",
+ "umich.edu",
+ "unblock-us.com",
+ "unblockdmm.com",
+ "unblocker.yt",
+ "unblocksit.es",
+ "uncyclomedia.org",
+ "uncyclopedia.hk",
+ "uncyclopedia.tw",
+ "underwoodammo.com",
+ "unholyknight.com",
+ "uni.cc",
+ "unicode.org",
+ "unification.net",
+ "unification.org.tw",
+ "unirule.cloud",
+ "unitedsocialpress.com",
+ "unix100.com",
+ "unknownspace.org",
+ "unodedos.com",
+ "unpo.org",
+ "unseen.is",
+ "unstable.icu",
+ "untraceable.us",
+ "uocn.org",
+ "updatestar.com",
+ "upghsbc.com",
+ "upholdjustice.org",
+ "upload4u.info",
+ "uploaded.net",
+ "uploaded.to",
+ "uploadstation.com",
+ "upmedia.mg",
+ "upornia.com",
+ "uproxy.org",
+ "uptodown.com",
+ "upwill.org",
+ "ur7s.com",
+ "uraban.me",
+ "urbandictionary.com",
+ "urbansurvival.com",
+ "urchin.com",
+ "url.com.tw",
+ "url.tw",
+ "urlborg.com",
+ "urlparser.com",
+ "us.to",
+ "usacn.com",
+ "usaip.eu",
+ "usc.edu",
+ "uscnpm.org",
+ "usembassy.gov",
+ "usfk.mil",
+ "usma.edu",
+ "usmc.mil",
+ "usocctn.com",
+ "uspto.gov",
+ "ustibetcommittee.org",
+ "ustream.tv",
+ "usus.cc",
+ "utopianpal.com",
+ "uu-gg.com",
+ "uukanshu.com",
+ "uvwxyz.xyz",
+ "uwants.com",
+ "uwants.net",
+ "uyghur-j.org",
+ "uyghur.co.uk",
+ "uyghuraa.org",
+ "uyghuramerican.org",
+ "uyghurbiz.org",
+ "uyghurcanadian.ca",
+ "uyghurcongress.org",
+ "uyghurpen.org",
+ "uyghurpress.com",
+ "uyghurstudies.org",
+ "uyghurtribunal.com",
+ "uygur.org",
+ "uymaarip.com",
+ "v2ex.com",
+ "v2fly.org",
+ "v2ray.com",
+ "v2raycn.com",
+ "v2raytech.com",
+ "valeursactuelles.com",
+ "van001.com",
+ "van698.com",
+ "vanemu.cn",
+ "vanilla-jp.com",
+ "vanpeople.com",
+ "vansky.com",
+ "vaticannews.va",
+ "vatn.org",
+ "vcf-online.org",
+ "vcfbuilder.org",
+ "vegasred.com",
+ "velkaepocha.sk",
+ "venbbs.com",
+ "venchina.com",
+ "venetianmacao.com",
+ "ventureswell.com",
+ "veoh.com",
+ "vercel.app",
+ "verizon.net",
+ "vermonttibet.org",
+ "versavpn.com",
+ "verybs.com",
+ "vevo.com",
+ "vft.com.tw",
+ "viber.com",
+ "vica.info",
+ "victimsofcommunism.org",
+ "vid.me",
+ "vidble.com",
+ "videobam.com",
+ "videodetective.com",
+ "videomega.tv",
+ "videomo.com",
+ "videopediaworld.com",
+ "videopress.com",
+ "vidinfo.org",
+ "vietdaikynguyen.com",
+ "vijayatemple.org",
+ "vilavpn.com",
+ "vimeo.com",
+ "vimperator.org",
+ "vincnd.com",
+ "vine.co",
+ "vinniev.com",
+ "vip-enterprise.com",
+ "virginia.edu",
+ "virtualrealporn.com",
+ "visibletweets.com",
+ "visiontimes.com",
+ "vital247.org",
+ "viu.com",
+ "viu.tv",
+ "vivahentai4u.net",
+ "vivaldi.com",
+ "vivatube.com",
+ "vivthomas.com",
+ "vizvaz.com",
+ "vjav.com",
+ "vjmedia.com.hk",
+ "vllcs.org",
+ "vmixcore.com",
+ "vmpsoft.com",
+ "vnet.link",
+ "voa.mobi",
+ "voacambodia.com",
+ "voacantonese.com",
+ "voachinese.com",
+ "voachineseblog.com",
+ "voagd.com",
+ "voaindonesia.com",
+ "voanews.com",
+ "voatibetan.com",
+ "voatibetanenglish.com",
+ "vocativ.com",
+ "vocn.tv",
+ "vocus.cc",
+ "voicettank.org",
+ "vot.org",
+ "vovo2000.com",
+ "voxer.com",
+ "voy.com",
+ "vpn.ac",
+ "vpn4all.com",
+ "vpnaccount.org",
+ "vpnaccounts.com",
+ "vpnbook.com",
+ "vpncomparison.org",
+ "vpncoupons.com",
+ "vpncup.com",
+ "vpndada.com",
+ "vpnfan.com",
+ "vpnfire.com",
+ "vpnfires.biz",
+ "vpnforgame.net",
+ "vpngate.jp",
+ "vpngate.net",
+ "vpngratis.net",
+ "vpnhq.com",
+ "vpnhub.com",
+ "vpninja.net",
+ "vpnintouch.com",
+ "vpnintouch.net",
+ "vpnjack.com",
+ "vpnmaster.com",
+ "vpnmentor.com",
+ "vpnpick.com",
+ "vpnpop.com",
+ "vpnpronet.com",
+ "vpnreactor.com",
+ "vpnreviewz.com",
+ "vpnsecure.me",
+ "vpnshazam.com",
+ "vpnshieldapp.com",
+ "vpnsp.com",
+ "vpntraffic.com",
+ "vpntunnel.com",
+ "vpnuk.info",
+ "vpnunlimitedapp.com",
+ "vpnvip.com",
+ "vpnworldwide.com",
+ "vporn.com",
+ "vpser.net",
+ "vraiesagesse.net",
+ "vrmtr.com",
+ "vrsmash.com",
+ "vs.com",
+ "vtunnel.com",
+ "vuku.cc",
+ "vultryhw.com",
+ "vzw.com",
+ "w3.org",
+ "w3schools.com",
+ "waffle1999.com",
+ "wahas.com",
+ "waigaobu.com",
+ "waikeung.org",
+ "wailaike.net",
+ "wainao.me",
+ "waiwaier.com",
+ "wallmama.com",
+ "wallornot.org",
+ "wallpapercasa.com",
+ "wallproxy.com",
+ "wallsttv.com",
+ "waltermartin.com",
+ "waltermartin.org",
+ "wan-press.org",
+ "wanderinghorse.net",
+ "wangafu.net",
+ "wangjinbo.org",
+ "wanglixiong.com",
+ "wango.org",
+ "wangruoshui.net",
+ "wangruowang.org",
+ "want-daily.com",
+ "wanz-factory.com",
+ "wapedia.mobi",
+ "warehouse333.com",
+ "warroom.org",
+ "waselpro.com",
+ "washeng.net",
+ "washingtonpost.com",
+ "watch8x.com",
+ "watchinese.com",
+ "watchmygf.net",
+ "watchout.tw",
+ "wattpad.com",
+ "wav.tv",
+ "waveprotocol.org",
+ "waymo.com",
+ "wda.gov.tw",
+ "wdf5.com",
+ "wealth.com.tw",
+ "wearehairy.com",
+ "wearn.com",
+ "weather.com.hk",
+ "web.dev",
+ "web2project.net",
+ "webbang.net",
+ "webevader.org",
+ "webfreer.com",
+ "webjb.org",
+ "weblagu.com",
+ "webmproject.org",
+ "webpack.de",
+ "webrtc.org",
+ "webrush.net",
+ "webs-tv.net",
+ "websitepulse.com",
+ "websnapr.com",
+ "webwarper.net",
+ "webworkerdaily.com",
+ "wechatlawsuit.com",
+ "weekmag.info",
+ "wefightcensorship.org",
+ "wefong.com",
+ "weiboleak.com",
+ "weihuo.org",
+ "weijingsheng.org",
+ "weiming.info",
+ "weiquanwang.org",
+ "weisuo.ws",
+ "welovecock.com",
+ "welt.de",
+ "wemigrate.org",
+ "wengewang.com",
+ "wengewang.org",
+ "wenhui.ch",
+ "wenweipo.com",
+ "wenxuecity.com",
+ "wenyunchao.com",
+ "wenzhao.ca",
+ "westca.com",
+ "westernshugdensociety.org",
+ "westernwolves.com",
+ "westkit.net",
+ "westpoint.edu",
+ "wetplace.com",
+ "wetpussygames.com",
+ "wexiaobo.org",
+ "wezhiyong.org",
+ "wezone.net",
+ "wforum.com",
+ "wha.la",
+ "whatblocked.com",
+ "whatbrowser.org",
+ "whatsapp.com",
+ "whatsapp.net",
+ "whatsonweibo.com",
+ "wheatseeds.org",
+ "wheelockslatin.com",
+ "whereiswerner.com",
+ "wheretowatch.com",
+ "whippedass.com",
+ "whispersystems.org",
+ "whodns.xyz",
+ "whoer.net",
+ "whotalking.com",
+ "whylover.com",
+ "whyx.org",
+ "widevine.com",
+ "wikaba.com",
+ "wikia.com",
+ "wikileaks-forum.com",
+ "wikileaks.ch",
+ "wikileaks.com",
+ "wikileaks.de",
+ "wikileaks.eu",
+ "wikileaks.lu",
+ "wikileaks.org",
+ "wikileaks.pl",
+ "wikilivres.info",
+ "wikimapia.org",
+ "wikimedia.org",
+ "wikinews.org",
+ "wikipedia.org",
+ "wikiquote.org",
+ "wikisource.org",
+ "wikiwand.com",
+ "wikiwiki.jp",
+ "wildammo.com",
+ "williamhill.com",
+ "willw.net",
+ "windowsphoneme.com",
+ "windscribe.com",
+ "windy.com",
+ "wingamestore.com",
+ "wingy.site",
+ "winning11.com",
+ "winwhispers.info",
+ "wionews.com",
+ "wire.com",
+ "wiredbytes.com",
+ "wiredpen.com",
+ "wireguard.com",
+ "wisdompubs.org",
+ "wisevid.com",
+ "wistia.com",
+ "withgoogle.com",
+ "withyoutube.com",
+ "witnessleeteaching.com",
+ "witopia.net",
+ "wizcrafts.net",
+ "wjbk.org",
+ "wn.com",
+ "wnacg.com",
+ "wnacg.org",
+ "wo.tc",
+ "woeser.com",
+ "woesermiddle-way.net",
+ "wokar.org",
+ "wolfax.com",
+ "wombo.ai",
+ "woolyss.com",
+ "woopie.jp",
+ "woopie.tv",
+ "wordpress.com",
+ "workatruna.com",
+ "workerdemo.org.hk",
+ "workerempowerment.org",
+ "workers.dev",
+ "workersthebig.net",
+ "workflow.is",
+ "worldcat.org",
+ "worldjournal.com",
+ "worldvpn.net",
+ "wow-life.net",
+ "wow.com",
+ "wowgirls.com",
+ "wowhead.com",
+ "wowlegacy.ml",
+ "wowporn.com",
+ "wowrk.com",
+ "woxinghuiguo.com",
+ "woyaolian.org",
+ "wozy.in",
+ "wp.com",
+ "wpoforum.com",
+ "wqyd.org",
+ "wrchina.org",
+ "wretch.cc",
+ "wsj.com",
+ "wsj.net",
+ "wsjhk.com",
+ "wtbn.org",
+ "wtfpeople.com",
+ "wuerkaixi.com",
+ "wufafangwen.com",
+ "wufi.org.tw",
+ "wuguoguang.com",
+ "wujie.net",
+ "wujieliulan.com",
+ "wukangrui.net",
+ "wuw.red",
+ "wuyanblog.com",
+ "wwe.com",
+ "wwitv.com",
+ "www1.biz",
+ "wwwhost.biz",
+ "wzyboy.im",
+ "x-art.com",
+ "x-berry.com",
+ "x-wall.org",
+ "x.co",
+ "x.company",
+ "x1949x.com",
+ "x24hr.com",
+ "x365x.com",
+ "xanga.com",
+ "xbabe.com",
+ "xbookcn.com",
+ "xbtce.com",
+ "xcafe.in",
+ "xcity.jp",
+ "xcritic.com",
+ "xda-developers.com",
+ "xerotica.com",
+ "xfiles.to",
+ "xfinity.com",
+ "xgmyd.com",
+ "xhamster.com",
+ "xianba.net",
+ "xianchawang.net",
+ "xianjian.tw",
+ "xianqiao.net",
+ "xiaobaiwu.com",
+ "xiaochuncnjp.com",
+ "xiaod.in",
+ "xiaohexie.com",
+ "xiaolan.me",
+ "xiaoma.org",
+ "xiaxiaoqiang.net",
+ "xiezhua.com",
+ "xihua.es",
+ "xinbao.de",
+ "xing.com",
+ "xinhuanet.org",
+ "xinjiangpolicefiles.org",
+ "xinmiao.com.hk",
+ "xinsheng.net",
+ "xinshijue.com",
+ "xinyubbs.net",
+ "xiongpian.com",
+ "xiuren.org",
+ "xixicui.icu",
+ "xizang-zhiye.org",
+ "xjp.cc",
+ "xjtravelguide.com",
+ "xkiwi.tk",
+ "xlfmtalk.com",
+ "xlfmwz.info",
+ "xm.com",
+ "xml-training-guide.com",
+ "xmovies.com",
+ "xn--4gq171p.com",
+ "xn--9pr62r24a.com",
+ "xn--czq75pvv1aj5c.org",
+ "xn--i2ru8q2qg.com",
+ "xn--ngstr-lra8j.com",
+ "xn--oiq.cc",
+ "xn--p8j9a0d9c9a.xn--q9jyb4c",
+ "xnxx.com",
+ "xpdo.net",
+ "xpud.org",
+ "xrentdvd.com",
+ "xsden.info",
+ "xskywalker.com",
+ "xskywalker.net",
+ "xtube.com",
+ "xuchao.net",
+ "xuchao.org",
+ "xuehua.us",
+ "xuite.net",
+ "xuzhiyong.net",
+ "xvbelink.com",
+ "xvideo.cc",
+ "xvideos-cdn.com",
+ "xvideos.com",
+ "xvideos.es",
+ "xvinlink.com",
+ "xxbbx.com",
+ "xxlmovies.com",
+ "xxuz.com",
+ "xxx.com",
+ "xxx.xxx",
+ "xxxfuckmom.com",
+ "xxxx.com.au",
+ "xxxy.biz",
+ "xxxy.info",
+ "xxxymovies.com",
+ "xys.org",
+ "xysblogs.org",
+ "xyy69.com",
+ "xyy69.info",
+ "y2mate.com",
+ "yadi.sk",
+ "yahoo.co.jp",
+ "yahoo.com",
+ "yahoo.com.hk",
+ "yahoo.com.tw",
+ "yahoo.net",
+ "yakbutterblues.com",
+ "yam.com",
+ "yam.org.tw",
+ "yande.re",
+ "yandex.com",
+ "yanghengjun.com",
+ "yangjianli.com",
+ "yasni.co.uk",
+ "yayabay.com",
+ "ycombinator.com",
+ "ydy.com",
+ "yeahteentube.com",
+ "yecl.net",
+ "yeelou.com",
+ "yeeyi.com",
+ "yegle.net",
+ "yes-news.com",
+ "yes.xxx",
+ "yes123.com.tw",
+ "yesasia.com",
+ "yesasia.com.hk",
+ "yespornplease.com",
+ "yeyeclub.com",
+ "ygto.com",
+ "yhcw.net",
+ "yibada.com",
+ "yibaochina.com",
+ "yidio.com",
+ "yigeni.com",
+ "yilubbs.com",
+ "yimg.com",
+ "yingsuoss.com",
+ "yinlei.org",
+ "yipub.com",
+ "yiyechat.com",
+ "yizhihongxing.com",
+ "yobit.net",
+ "yobt.com",
+ "yobt.tv",
+ "yogichen.org",
+ "yolasite.com",
+ "yomiuri.co.jp",
+ "yong.hu",
+ "yorkbbs.ca",
+ "you-get.org",
+ "youdontcare.com",
+ "youjizz.com",
+ "youmaker.com",
+ "youngpornvideos.com",
+ "youngspiration.hk",
+ "youpai.org",
+ "youporn.com",
+ "youporngay.com",
+ "your-freedom.net",
+ "yourepeat.com",
+ "yourlisten.com",
+ "yourlust.com",
+ "yourprivatevpn.com",
+ "yourtrap.com",
+ "yousendit.com",
+ "youshun12.com",
+ "youthforfreechina.org",
+ "youthnetradio.org",
+ "youthwant.com.tw",
+ "youtu.be",
+ "youtube-nocookie.com",
+ "youtube.com",
+ "youtubecn.com",
+ "youtubeeducation.com",
+ "youtubegaming.com",
+ "youtubekids.com",
+ "youversion.com",
+ "youwin.com",
+ "youxu.info",
+ "yt.be",
+ "ytht.net",
+ "ytimg.com",
+ "ytn.co.kr",
+ "yuanming.net",
+ "yuanzhengtang.org",
+ "yulghun.com",
+ "yunchao.net",
+ "yuntipub.com",
+ "yuvutu.com",
+ "yvesgeleyn.com",
+ "ywpw.com",
+ "yx51.net",
+ "yyii.org",
+ "yyjlymb.xyz",
+ "yzzk.com",
+ "z-lib.org",
+ "zacebook.com",
+ "zalmos.com",
+ "zannel.com",
+ "zaobao.com",
+ "zaobao.com.sg",
+ "zaozon.com",
+ "zapto.org",
+ "zattoo.com",
+ "zb.com",
+ "zdnet.com.tw",
+ "zello.com",
+ "zengjinyan.org",
+ "zenmate.com",
+ "zerohedge.com",
+ "zeronet.io",
+ "zeutch.com",
+ "zfreet.com",
+ "zgsddh.com",
+ "zgzcjj.net",
+ "zhanbin.net",
+ "zhangboli.net",
+ "zhangtianliang.com",
+ "zhanlve.org",
+ "zhenghui.org",
+ "zhengjian.org",
+ "zhengwunet.org",
+ "zhenlibu.info",
+ "zhenlibu1984.com",
+ "zhenxiang.biz",
+ "zhinengluyou.com",
+ "zhongguo.ca",
+ "zhongguorenquan.org",
+ "zhongguotese.net",
+ "zhongmeng.org",
+ "zhoushuguang.com",
+ "zhreader.com",
+ "zhuangbi.me",
+ "zhuanxing.cn",
+ "zhuatieba.com",
+ "zhuichaguoji.org",
+ "zi.media",
+ "zi5.me",
+ "ziddu.com",
+ "zillionk.com",
+ "zim.vn",
+ "zinio.com",
+ "ziporn.com",
+ "zippyshare.com",
+ "zkaip.com",
+ "zkiz.com",
+ "zmw.cn",
+ "zodgame.us",
+ "zoho.com",
+ "zomobo.net",
+ "zonaeuropa.com",
+ "zonghexinwen.com",
+ "zonghexinwen.net",
+ "zoogvpn.com",
+ "zootool.com",
+ "zoozle.net",
+ "zophar.net",
+ "zorrovpn.com",
+ "zozotown.com",
+ "zpn.im",
+ "zspeeder.me",
+ "zsrhao.com",
+ "zuo.la",
+ "zuobiao.me",
+ "zuola.com",
+ "zvereff.com",
+ "zynaima.com",
+ "zynamics.com",
+ "zyns.com",
+ "zyxel.com",
+ "zyzc9.com",
+ "zzcartoon.com",
+ "zzcloud.me",
+ "zzux.com"
+ ]
+ ]
+];
+
+var lastRule = '';
+
+function FindProxyForURL(url, host) {
+ for (var i = 0; i < rules.length; i++) {
+ ret = testHost(host, i);
+ if (ret != undefined)
+ return ret;
+ }
+ return 'DIRECT';
+}
+
+function testHost(host, index) {
+ for (var i = 0; i < rules[index].length; i++) {
+ for (var j = 0; j < rules[index][i].length; j++) {
+ lastRule = rules[index][i][j];
+ if (host == lastRule || host.endsWith('.' + lastRule))
+ return i % 2 == 0 ? 'DIRECT' : proxy;
+ }
+ }
+ lastRule = '';
+}
+
+// REF: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
+if (!String.prototype.endsWith) {
+ String.prototype.endsWith = function(searchString, position) {
+ var subjectString = this.toString();
+ if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
+ position = subjectString.length;
+ }
+ position -= searchString.length;
+ var lastIndex = subjectString.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+ };
+}
diff --git a/v2rayN/ProtosLib/ProtosLib.csproj b/v2rayN/ProtosLib/ProtosLib.csproj
new file mode 100644
index 00000000..3ea21a73
--- /dev/null
+++ b/v2rayN/ProtosLib/ProtosLib.csproj
@@ -0,0 +1,24 @@
+
+
+ net6.0-windows
+ enable
+
+
+
+
+
+
+
+
+ 3.21.9
+
+
+ 2.46.5
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/v2rayN/v2rayN/Protos/Statistics.proto b/v2rayN/ProtosLib/Statistics.proto
similarity index 94%
rename from v2rayN/v2rayN/Protos/Statistics.proto
rename to v2rayN/ProtosLib/Statistics.proto
index 1dd4f2b0..db96ac02 100644
--- a/v2rayN/v2rayN/Protos/Statistics.proto
+++ b/v2rayN/ProtosLib/Statistics.proto
@@ -1,7 +1,7 @@
syntax = "proto3";
package v2ray.core.app.stats.command;
-option csharp_namespace = "v2rayN.Protos.Statistics";
+option csharp_namespace = "ProtosLib.Statistics";
message GetStatsRequest {
// Name of the stat counter.
diff --git a/v2rayN/ProtosLib/Tests.cs b/v2rayN/ProtosLib/Tests.cs
new file mode 100644
index 00000000..e6eabcff
--- /dev/null
+++ b/v2rayN/ProtosLib/Tests.cs
@@ -0,0 +1,15 @@
+using ProtosLib.Statistics;
+
+namespace ProtosLib
+{
+ public class Tests
+ {
+ private StatsService.StatsServiceClient client_;
+
+ public Tests()
+ {
+
+
+ }
+ }
+}
diff --git a/v2rayN/v2rayN.sln b/v2rayN/v2rayN.sln
index 64cf71f4..df0929a5 100644
--- a/v2rayN/v2rayN.sln
+++ b/v2rayN/v2rayN.sln
@@ -1,41 +1,43 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28010.2050
+# Visual Studio Version 17
+VisualStudioVersion = 17.3.32811.315
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayN", "v2rayN\v2rayN.csproj", "{6DE127CA-1763-4236-B297-D2EF9CB2EC9B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{F82BE52A-155C-492C-9E0A-1E917EC62C78}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtosLib", "ProtosLib\ProtosLib.csproj", "{C5F24BB0-9CC1-44DD-82FF-D545F081819B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacLib", "PacLib\PacLib.csproj", "{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
- Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
- Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.Build.0 = Debug|Any CPU
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.Build.0 = Release|Any CPU
- {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|x86.ActiveCfg = Release|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|x86.Build.0 = Debug|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|Any CPU.Build.0 = Release|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|x86.ActiveCfg = Release|Any CPU
- {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|x86.Build.0 = Release|Any CPU
+ {6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
- RESX_SortFileContentOnSave = True
- SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E}
+ SolutionGuid = {43E06CBD-3DA9-40A3-8E4D-F0943CB0DD32}
EndGlobalSection
EndGlobal
diff --git a/v2rayN/v2rayN.v11.suo b/v2rayN/v2rayN.v11.suo
deleted file mode 100644
index 91d8fcf0..00000000
Binary files a/v2rayN/v2rayN.v11.suo and /dev/null differ
diff --git a/v2rayN/v2rayN/App.xaml b/v2rayN/v2rayN/App.xaml
new file mode 100644
index 00000000..56a04a3a
--- /dev/null
+++ b/v2rayN/v2rayN/App.xaml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+ 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/v2rayN/v2rayN/App.xaml.cs b/v2rayN/v2rayN/App.xaml.cs
new file mode 100644
index 00000000..edba4acf
--- /dev/null
+++ b/v2rayN/v2rayN/App.xaml.cs
@@ -0,0 +1,85 @@
+using System.Windows;
+using System.Windows.Threading;
+using v2rayN.Handler;
+using v2rayN.Mode;
+using v2rayN.Tool;
+
+namespace v2rayN
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ public static EventWaitHandle ProgramStarted;
+ private static Config _config;
+
+ public App()
+ {
+ // Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly());
+ this.DispatcherUnhandledException += App_DispatcherUnhandledException;
+ AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+ TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
+ }
+
+ ///
+ /// 只打开一个进程
+ ///
+ ///
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ Global.ExePathKey = Utils.GetMD5(Utils.GetExePath());
+
+ ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, Global.ExePathKey, out bool bCreatedNew);
+ if (!bCreatedNew)
+ {
+ ProgramStarted.Set();
+ Current.Shutdown();
+ Environment.Exit(0);
+ return;
+ }
+
+ Global.processJob = new Job();
+
+ Logging.Setup();
+ Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}");
+ Logging.ClearLogs();
+
+ Init();
+
+ Thread.CurrentThread.CurrentUICulture = new(_config.uiItem.currentLanguage);
+
+ base.OnStartup(e);
+ }
+
+
+ private void Init()
+ {
+ if (ConfigHandler.LoadConfig(ref _config) != 0)
+ {
+ UI.ShowWarning($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用");
+ Application.Current.Shutdown();
+ Environment.Exit(0);
+ return;
+ }
+ }
+ private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
+ {
+ Utils.SaveLog("App_DispatcherUnhandledException", e.Exception);
+ e.Handled = true;
+ }
+
+ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ if (e.ExceptionObject != null)
+ {
+ Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!);
+ }
+ }
+
+ private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
+ {
+ Utils.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception);
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/AssemblyInfo.cs b/v2rayN/v2rayN/AssemblyInfo.cs
new file mode 100644
index 00000000..8b5504ec
--- /dev/null
+++ b/v2rayN/v2rayN/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs
index a3bacb5d..4fbbc400 100644
--- a/v2rayN/v2rayN/Base/HttpClientHelper.cs
+++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs
@@ -1,12 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Net;
+using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
-using System.Threading;
-using System.Threading.Tasks;
namespace v2rayN.Base
{
@@ -58,7 +52,7 @@ namespace v2rayN.Base
HttpResponseMessage response = await client.GetAsync(url, token);
if (!response.IsSuccessStatusCode)
{
- throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode));
+ throw new Exception(string.Format("{0}", response.StatusCode));
}
return await response.Content.ReadAsStringAsync();
}
@@ -92,7 +86,7 @@ namespace v2rayN.Base
if (!response.IsSuccessStatusCode)
{
- throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode));
+ throw new Exception(string.Format("{0}", response.StatusCode));
}
var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L;
@@ -159,7 +153,7 @@ namespace v2rayN.Base
if (!response.IsSuccessStatusCode)
{
- throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode));
+ throw new Exception(string.Format("{0}", response.StatusCode));
}
//var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L;
@@ -172,6 +166,7 @@ namespace v2rayN.Base
var isMoreToRead = true;
string progressSpeed = string.Empty;
DateTime totalDatetime = DateTime.Now;
+ int totalSecond = 0;
do
{
@@ -202,9 +197,10 @@ namespace v2rayN.Base
totalRead += read;
TimeSpan ts = (DateTime.Now - totalDatetime);
- var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0");
- if (progress != null)
+ if (progress != null && ts.Seconds > totalSecond)
{
+ totalSecond = ts.Seconds;
+ var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0");
if (progressSpeed != speed)
{
progressSpeed = speed;
diff --git a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs
deleted file mode 100644
index 94e803e9..00000000
--- a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace v2rayN.Base
-{
- class ListViewFlickerFree : ListView
- {
- Action _updateFunc;
-
- public ListViewFlickerFree()
- {
- SetStyle(ControlStyles.OptimizedDoubleBuffer
- | ControlStyles.AllPaintingInWmPaint
- , true);
- UpdateStyles();
- }
-
- public void RegisterDragEvent(Action update)
- {
- _updateFunc = update;
- AllowDrop = true;
-
- ItemDrag += lv_ItemDrag;
- DragDrop += lv_DragDrop;
- DragEnter += lv_DragEnter;
- DragOver += lv_DragOver;
- DragLeave += lv_DragLeave;
- }
-
- private void lv_DragDrop(object sender, DragEventArgs e)
- {
- int targetIndex = InsertionMark.Index;
- if (targetIndex == -1)
- {
- return;
- }
- if (InsertionMark.AppearsAfterItem)
- {
- targetIndex++;
- }
-
-
- if (SelectedIndices.Count <= 0)
- {
- return;
- }
-
- _updateFunc(SelectedIndices[0], targetIndex);
-
- //ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
- //this.BeginUpdate();
- //this.Items.Insert(targetIndex, (ListViewItem)draggedItem.Clone());
- //this.Items.Remove(draggedItem);
- //this.EndUpdate();
- }
-
-
- private void lv_DragEnter(object sender, DragEventArgs e)
- {
- e.Effect = e.AllowedEffect;
- }
-
- private void lv_DragLeave(object sender, EventArgs e)
- {
- InsertionMark.Index = -1;
- }
-
- private void lv_DragOver(object sender, DragEventArgs e)
- {
- Point targetPoint = PointToClient(new Point(e.X, e.Y));
- int targetIndex = InsertionMark.NearestIndex(targetPoint);
-
- if (targetIndex > -1)
- {
- Rectangle itemBounds = GetItemRect(targetIndex);
- EnsureVisible(targetIndex);
-
- if (targetPoint.Y > itemBounds.Top + (itemBounds.Height / 2))
- {
- InsertionMark.AppearsAfterItem = true;
- }
- else
- {
- InsertionMark.AppearsAfterItem = false;
- }
- }
- InsertionMark.Index = targetIndex;
- }
-
- private void lv_ItemDrag(object sender, ItemDragEventArgs e)
- {
- DoDragDrop(e.Item, DragDropEffects.Move);
- InsertionMark.Index = -1;
- }
- public void SetScrollPosition(int pos)
- {
- pos = Math.Min(Items.Count - 1, pos);
-
- if (pos < 0 || pos >= Items.Count)
- return;
-
- EnsureVisible(pos);
-
- for (int i = 0; i < 10; i++)
- {
- if (TopItem != null && TopItem.Index != pos)
- TopItem = Items[pos];
- }
- }
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Base/SqliteHandler.cs b/v2rayN/v2rayN/Base/SqliteHandler.cs
new file mode 100644
index 00000000..eeb7b8e5
--- /dev/null
+++ b/v2rayN/v2rayN/Base/SqliteHandler.cs
@@ -0,0 +1,91 @@
+
+using SQLite;
+using System.Collections;
+
+namespace v2rayN.Base
+{
+ public sealed class SqliteHelper
+ {
+ private static readonly Lazy _instance = new Lazy(() => new());
+ public static SqliteHelper Instance => _instance.Value;
+ private string _connstr;
+ public SQLiteConnection _db;
+ public SQLiteAsyncConnection _dbAsync;
+
+ public SqliteHelper()
+ {
+ _connstr = Utils.GetConfigPath(Global.ConfigDB);
+ _db = new SQLiteConnection(_connstr, false);
+ _dbAsync = new SQLiteAsyncConnection(_connstr, false);
+ }
+
+ public CreateTableResult CreateTable()
+ {
+ return _db.CreateTable();
+ }
+
+ public int Add(object model)
+ {
+ return _db.Insert(model);
+ }
+ public async Task AddAsync(object model)
+ {
+ return await _dbAsync.InsertAsync(model);
+ }
+ public int Replace(object model)
+ {
+ return _db.InsertOrReplace(model);
+ }
+ public async Task Replacesync(object model)
+ {
+ return await _dbAsync.InsertOrReplaceAsync(model);
+ }
+
+ public int Update(object model)
+ {
+ return _db.Update(model);
+ }
+ public async Task UpdateAsync(object model)
+ {
+ return await _dbAsync.UpdateAsync(model);
+ }
+ public int UpdateAll(IEnumerable models)
+ {
+ return _db.UpdateAll(models);
+ }
+
+ public int Delete(object model)
+ {
+ return _db.Delete(model);
+ }
+ public async Task DeleteAsync(object model)
+ {
+ return await _dbAsync.DeleteAsync(model);
+ }
+ public List Query(string sql) where T : new()
+ {
+ return _db.Query(sql);
+ }
+ public async Task> QueryAsync(string sql) where T : new()
+ {
+ return await _dbAsync.QueryAsync(sql);
+ }
+ public int Execute(string sql)
+ {
+ return _db.Execute(sql);
+ }
+ public async Task ExecuteAsync(string sql)
+ {
+ return await _dbAsync.ExecuteAsync(sql);
+ }
+
+ public TableQuery Table() where T : new()
+ {
+ return _db.Table();
+ }
+ public AsyncTableQuery TableAsync() where T : new()
+ {
+ return _dbAsync.Table();
+ }
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Base/StringEx.cs b/v2rayN/v2rayN/Base/StringEx.cs
index 40544106..8e5c8dbb 100644
--- a/v2rayN/v2rayN/Base/StringEx.cs
+++ b/v2rayN/v2rayN/Base/StringEx.cs
@@ -1,6 +1,4 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
+using System.IO;
namespace v2rayN.Base
{
diff --git a/v2rayN/v2rayN/Converters/DelayColorConverter.cs b/v2rayN/v2rayN/Converters/DelayColorConverter.cs
new file mode 100644
index 00000000..ab43c991
--- /dev/null
+++ b/v2rayN/v2rayN/Converters/DelayColorConverter.cs
@@ -0,0 +1,25 @@
+using System.Windows.Data;
+using System.Windows.Media;
+
+namespace v2rayN.Converters
+{
+ public class DelayColorConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ int.TryParse(value.ToString(), out var delay);
+
+ if (delay <= 0)
+ return new SolidColorBrush(Colors.Red);
+ if (delay <= 200)
+ return new SolidColorBrush(Colors.Green);
+ else
+ return new SolidColorBrush(Colors.IndianRed);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ return null;
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/FodyWeavers.xml b/v2rayN/v2rayN/FodyWeavers.xml
new file mode 100644
index 00000000..63fc1484
--- /dev/null
+++ b/v2rayN/v2rayN/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs
deleted file mode 100644
index cff9eca2..00000000
--- a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs
+++ /dev/null
@@ -1,202 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class AddServer2Form
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form));
- this.btnClose = new System.Windows.Forms.Button();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.label3 = new System.Windows.Forms.Label();
- this.label2 = new System.Windows.Forms.Label();
- this.txtPreSocksPort = new System.Windows.Forms.TextBox();
- this.btnEdit = new System.Windows.Forms.Button();
- this.cmbCoreType = new System.Windows.Forms.ComboBox();
- this.labCoreType = new System.Windows.Forms.Label();
- this.btnBrowse = new System.Windows.Forms.Button();
- this.txtAddress = new System.Windows.Forms.TextBox();
- this.label13 = new System.Windows.Forms.Label();
- this.txtRemarks = new System.Windows.Forms.TextBox();
- this.label6 = new System.Windows.Forms.Label();
- this.label1 = new System.Windows.Forms.Label();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel1 = new System.Windows.Forms.Panel();
- this.groupBox1.SuspendLayout();
- this.panel2.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // groupBox1
- //
- resources.ApplyResources(this.groupBox1, "groupBox1");
- this.groupBox1.Controls.Add(this.label3);
- this.groupBox1.Controls.Add(this.label2);
- this.groupBox1.Controls.Add(this.txtPreSocksPort);
- this.groupBox1.Controls.Add(this.btnEdit);
- this.groupBox1.Controls.Add(this.cmbCoreType);
- this.groupBox1.Controls.Add(this.labCoreType);
- this.groupBox1.Controls.Add(this.btnBrowse);
- this.groupBox1.Controls.Add(this.txtAddress);
- this.groupBox1.Controls.Add(this.label13);
- this.groupBox1.Controls.Add(this.txtRemarks);
- this.groupBox1.Controls.Add(this.label6);
- this.groupBox1.Controls.Add(this.label1);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.TabStop = false;
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // txtPreSocksPort
- //
- resources.ApplyResources(this.txtPreSocksPort, "txtPreSocksPort");
- this.txtPreSocksPort.Name = "txtPreSocksPort";
- //
- // btnEdit
- //
- resources.ApplyResources(this.btnEdit, "btnEdit");
- this.btnEdit.Name = "btnEdit";
- this.btnEdit.UseVisualStyleBackColor = true;
- this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
- //
- // cmbCoreType
- //
- resources.ApplyResources(this.cmbCoreType, "cmbCoreType");
- this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType.FormattingEnabled = true;
- this.cmbCoreType.Name = "cmbCoreType";
- //
- // labCoreType
- //
- resources.ApplyResources(this.labCoreType, "labCoreType");
- this.labCoreType.Name = "labCoreType";
- //
- // btnBrowse
- //
- resources.ApplyResources(this.btnBrowse, "btnBrowse");
- this.btnBrowse.Name = "btnBrowse";
- this.btnBrowse.UseVisualStyleBackColor = true;
- this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
- //
- // txtAddress
- //
- resources.ApplyResources(this.txtAddress, "txtAddress");
- this.txtAddress.Name = "txtAddress";
- //
- // label13
- //
- resources.ApplyResources(this.label13, "label13");
- this.label13.Name = "label13";
- //
- // txtRemarks
- //
- resources.ApplyResources(this.txtRemarks, "txtRemarks");
- this.txtRemarks.Name = "txtRemarks";
- //
- // label6
- //
- resources.ApplyResources(this.label6, "label6");
- this.label6.Name = "label6";
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // panel2
- //
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- this.panel2.Name = "panel2";
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panel1
- //
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Name = "panel1";
- //
- // AddServer2Form
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.panel2);
- this.Controls.Add(this.panel1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "AddServer2Form";
- this.Load += new System.EventHandler(this.AddServer2Form_Load);
- this.groupBox1.ResumeLayout(false);
- this.groupBox1.PerformLayout();
- this.panel2.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.TextBox txtRemarks;
- private System.Windows.Forms.Label label6;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Label label13;
- private System.Windows.Forms.TextBox txtAddress;
- private System.Windows.Forms.Button btnBrowse;
- private System.Windows.Forms.ComboBox cmbCoreType;
- private System.Windows.Forms.Label labCoreType;
- private System.Windows.Forms.Button btnEdit;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox txtPreSocksPort;
- private System.Windows.Forms.Label label3;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs
deleted file mode 100644
index 823f0137..00000000
--- a/v2rayN/v2rayN/Forms/AddServer2Form.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Windows.Forms;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class AddServer2Form : BaseServerForm
- {
-
- public AddServer2Form()
- {
- InitializeComponent();
- }
-
- private void AddServer2Form_Load(object sender, EventArgs e)
- {
- List coreTypes = new List();
- foreach (ECoreType it in Enum.GetValues(typeof(ECoreType)))
- {
- if (it == ECoreType.v2rayN)
- continue;
- coreTypes.Add(it.ToString());
- }
-
- cmbCoreType.Items.AddRange(coreTypes.ToArray());
- cmbCoreType.Items.Add(string.Empty);
-
- txtAddress.ReadOnly = true;
- if (vmessItem != null)
- {
- BindingServer();
- }
- else
- {
- vmessItem = new VmessItem
- {
- groupId = groupId
- };
- ClearServer();
- }
- }
-
- ///
- /// 绑定数据
- ///
- private void BindingServer()
- {
- txtRemarks.Text = vmessItem.remarks;
- txtAddress.Text = vmessItem.address;
- txtPreSocksPort.Text = vmessItem.preSocksPort.ToString();
-
- cmbCoreType.Text = vmessItem.coreType == null ? string.Empty : vmessItem.coreType.ToString();
- }
-
-
- ///
- /// 清除设置
- ///
- private void ClearServer()
- {
- txtRemarks.Text = "";
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- string remarks = txtRemarks.Text;
- if (Utils.IsNullOrEmpty(remarks))
- {
- UI.Show(ResUI.PleaseFillRemarks);
- return;
- }
- if (Utils.IsNullOrEmpty(txtAddress.Text))
- {
- UI.Show(ResUI.FillServerAddressCustom);
- return;
- }
- vmessItem.remarks = remarks;
- vmessItem.preSocksPort = Utils.ToInt(txtPreSocksPort.Text);
-
- if (Utils.IsNullOrEmpty(cmbCoreType.Text))
- {
- vmessItem.coreType = null;
- }
- else
- {
- vmessItem.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), cmbCoreType.Text);
- }
-
- if (ConfigHandler.EditCustomServer(ref config, vmessItem) == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = Utils.IsNullOrEmpty(vmessItem.indexId) ? DialogResult.Cancel : DialogResult.OK;
- }
-
- private void btnBrowse_Click(object sender, EventArgs e)
- {
- UI.Show(ResUI.CustomServerTips);
-
- OpenFileDialog fileDialog = new OpenFileDialog
- {
- Multiselect = false,
- Filter = "Config|*.json|YAML|*.yaml;*.yml|All|*.*"
- };
- if (fileDialog.ShowDialog() != DialogResult.OK)
- {
- return;
- }
- string fileName = fileDialog.FileName;
- if (Utils.IsNullOrEmpty(fileName))
- {
- return;
- }
-
- vmessItem.address = fileName;
- vmessItem.remarks = txtRemarks.Text;
-
- if (ConfigHandler.AddCustomServer(ref config, vmessItem, false) == 0)
- {
- BindingServer();
- UI.Show(ResUI.SuccessfullyImportedCustomServer);
- }
- else
- {
- UI.ShowWarning(ResUI.FailedImportedCustomServer);
- }
- }
-
- private void btnEdit_Click(object sender, EventArgs e)
- {
- var address = txtAddress.Text;
- if (Utils.IsNullOrEmpty(address))
- {
- UI.Show(ResUI.FillServerAddressCustom);
- return;
- }
-
- address = Utils.GetConfigPath(address);
- Process.Start(address);
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx
deleted file mode 100644
index 0935b393..00000000
--- a/v2rayN/v2rayN/Forms/AddServer2Form.resx
+++ /dev/null
@@ -1,573 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 113, 12
-
-
- 370, 41
-
-
- label6
-
-
-
- True
-
-
- panel2
-
-
- 11
-
-
- 59, 12
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- Bottom
-
-
- panel1
-
-
- 3
-
-
- * After setting this value, an socks service will be started using V2ray to provide functions such as speed display
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 5
-
-
- NoControl
-
-
- 75, 23
-
-
- groupBox1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Fill
-
-
- 127, 157
-
-
- 127, 62
-
-
- 8
-
-
- True
-
-
- Custom configuration server
-
-
- 127, 110
-
-
- NoControl
-
-
- 11
-
-
- 357, 17
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 46
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 0
-
-
- 432, 37
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 2
-
-
- 450, 17
-
-
- 43
-
-
- 1
-
-
- txtPreSocksPort
-
-
- label1
-
-
- 611, 60
-
-
- 0, 0
-
-
- 45
-
-
- groupBox1
-
-
- True
-
-
- 22
-
-
- 75, 23
-
-
- 208, 110
-
-
- &Edit
-
-
- 2
-
-
- panel2
-
-
- 5
-
-
- Alias (remarks)
-
-
- 313, 21
-
-
- groupBox1
-
-
- NoControl
-
-
- 41
-
-
- 12, 62
-
-
- groupBox1
-
-
- 1
-
-
- AddServer2Form
-
-
- 446, 26
-
-
- groupBox1
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- labCoreType
-
-
- 0
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- btnOK
-
-
- $this
-
-
- 89, 12
-
-
- 89, 20
-
-
- $this
-
-
- groupBox1
-
-
- 42
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 89, 21
-
-
- 611, 10
-
-
- 0, 10
-
-
- Core Type
-
-
- 127, 195
-
-
- 75, 23
-
-
- groupBox1
-
-
- 6
-
-
- btnEdit
-
-
- &OK
-
-
- btnClose
-
-
- $this
-
-
- 0
-
-
- 229, 189
-
-
- 44
-
-
- True
-
-
- groupBox1
-
-
- 12, 161
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 23
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 6
-
-
- 1
-
-
- 7
-
-
- cmbCoreType
-
-
- &Browse
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- label3
-
-
- Pre-Socks Port
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Top
-
-
- 0, 259
-
-
- 7
-
-
- NoControl
-
-
- groupBox1
-
-
- 47, 12
-
-
- True
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 6, 12
-
-
- Address
-
-
- 3
-
-
- 127, 23
-
-
- 95, 12
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4
-
-
- * Fill in manually
-
-
- label2
-
-
- groupBox1
-
-
- 12, 199
-
-
- 611, 319
-
-
- btnBrowse
-
-
- 611, 249
-
-
- 40
-
-
- 10
-
-
- 75, 23
-
-
- 0
-
-
- label13
-
-
- &Cancel
-
-
- NoControl
-
-
- 4
-
-
- 9
-
-
- groupBox1
-
-
- txtAddress
-
-
- groupBox1
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Server
-
-
- txtRemarks
-
-
- 10
-
-
- 12, 27
-
-
- True
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx
deleted file mode 100644
index ba37ebc6..00000000
--- a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 取消(&C)
-
-
- 服务器
-
-
-
- 337, 41
-
-
- * 自定义配置的Socks端口值,可不设置;当设置此值后,将使用V2ray-core额外启动一个前置Socks服务,提供分流和速度显示等功能
-
-
- 59, 12
-
-
- Socks端口
-
-
- 编辑(&E)
-
-
- 53, 12
-
-
- Core类型
-
-
- 浏览(&B)
-
-
- *手填,方便识别管理
-
-
- 83, 12
-
-
- 别名(remarks)
-
-
- 83, 12
-
-
- 地址(address)
-
-
- 确定(&O)
-
-
- 自定义配置
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs
deleted file mode 100644
index ae575f01..00000000
--- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs
+++ /dev/null
@@ -1,488 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class AddServerForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServerForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.panSocks = new System.Windows.Forms.Panel();
- this.label17 = new System.Windows.Forms.Label();
- this.txtSecurity4 = new System.Windows.Forms.TextBox();
- this.label18 = new System.Windows.Forms.Label();
- this.txtId4 = new System.Windows.Forms.TextBox();
- this.panSs = new System.Windows.Forms.Panel();
- this.txtId3 = new System.Windows.Forms.TextBox();
- this.label15 = new System.Windows.Forms.Label();
- this.cmbSecurity3 = new System.Windows.Forms.ComboBox();
- this.label16 = new System.Windows.Forms.Label();
- this.panTrojan = new System.Windows.Forms.Panel();
- this.label12 = new System.Windows.Forms.Label();
- this.cmbFlow6 = new System.Windows.Forms.ComboBox();
- this.txtId6 = new System.Windows.Forms.TextBox();
- this.label14 = new System.Windows.Forms.Label();
- this.panVless = new System.Windows.Forms.Panel();
- this.label7 = new System.Windows.Forms.Label();
- this.cmbFlow5 = new System.Windows.Forms.ComboBox();
- this.txtId5 = new System.Windows.Forms.TextBox();
- this.label9 = new System.Windows.Forms.Label();
- this.label10 = new System.Windows.Forms.Label();
- this.btnGUID5 = new System.Windows.Forms.Button();
- this.cmbSecurity5 = new System.Windows.Forms.ComboBox();
- this.label11 = new System.Windows.Forms.Label();
- this.panVmess = new System.Windows.Forms.Panel();
- this.label3 = new System.Windows.Forms.Label();
- this.txtId = new System.Windows.Forms.TextBox();
- this.btnGUID = new System.Windows.Forms.Button();
- this.label4 = new System.Windows.Forms.Label();
- this.label8 = new System.Windows.Forms.Label();
- this.txtAlterId = new System.Windows.Forms.TextBox();
- this.cmbSecurity = new System.Windows.Forms.ComboBox();
- this.label5 = new System.Windows.Forms.Label();
- this.panAddr = new System.Windows.Forms.Panel();
- this.cmbCoreType = new System.Windows.Forms.ComboBox();
- this.labCoreType = new System.Windows.Forms.Label();
- this.label6 = new System.Windows.Forms.Label();
- this.label1 = new System.Windows.Forms.Label();
- this.txtAddress = new System.Windows.Forms.TextBox();
- this.label2 = new System.Windows.Forms.Label();
- this.txtPort = new System.Windows.Forms.TextBox();
- this.txtRemarks = new System.Windows.Forms.TextBox();
- this.panBottom = new System.Windows.Forms.Panel();
- this.btnOK = new System.Windows.Forms.Button();
- this.panTop = new System.Windows.Forms.Panel();
- this.panTran = new System.Windows.Forms.Panel();
- this.transportControl = new v2rayN.Forms.ServerTransportControl();
- this.groupBox1.SuspendLayout();
- this.panSocks.SuspendLayout();
- this.panSs.SuspendLayout();
- this.panTrojan.SuspendLayout();
- this.panVless.SuspendLayout();
- this.panVmess.SuspendLayout();
- this.panAddr.SuspendLayout();
- this.panBottom.SuspendLayout();
- this.panTran.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // groupBox1
- //
- this.groupBox1.Controls.Add(this.panSocks);
- this.groupBox1.Controls.Add(this.panSs);
- this.groupBox1.Controls.Add(this.panTrojan);
- this.groupBox1.Controls.Add(this.panVless);
- this.groupBox1.Controls.Add(this.panVmess);
- this.groupBox1.Controls.Add(this.panAddr);
- resources.ApplyResources(this.groupBox1, "groupBox1");
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.TabStop = false;
- //
- // panSocks
- //
- this.panSocks.Controls.Add(this.label17);
- this.panSocks.Controls.Add(this.txtSecurity4);
- this.panSocks.Controls.Add(this.label18);
- this.panSocks.Controls.Add(this.txtId4);
- resources.ApplyResources(this.panSocks, "panSocks");
- this.panSocks.Name = "panSocks";
- //
- // label17
- //
- resources.ApplyResources(this.label17, "label17");
- this.label17.Name = "label17";
- //
- // txtSecurity4
- //
- resources.ApplyResources(this.txtSecurity4, "txtSecurity4");
- this.txtSecurity4.Name = "txtSecurity4";
- //
- // label18
- //
- resources.ApplyResources(this.label18, "label18");
- this.label18.Name = "label18";
- //
- // txtId4
- //
- resources.ApplyResources(this.txtId4, "txtId4");
- this.txtId4.Name = "txtId4";
- //
- // panSs
- //
- this.panSs.Controls.Add(this.txtId3);
- this.panSs.Controls.Add(this.label15);
- this.panSs.Controls.Add(this.cmbSecurity3);
- this.panSs.Controls.Add(this.label16);
- resources.ApplyResources(this.panSs, "panSs");
- this.panSs.Name = "panSs";
- //
- // txtId3
- //
- resources.ApplyResources(this.txtId3, "txtId3");
- this.txtId3.Name = "txtId3";
- //
- // label15
- //
- resources.ApplyResources(this.label15, "label15");
- this.label15.Name = "label15";
- //
- // cmbSecurity3
- //
- this.cmbSecurity3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbSecurity3.FormattingEnabled = true;
- resources.ApplyResources(this.cmbSecurity3, "cmbSecurity3");
- this.cmbSecurity3.Name = "cmbSecurity3";
- //
- // label16
- //
- resources.ApplyResources(this.label16, "label16");
- this.label16.Name = "label16";
- //
- // panTrojan
- //
- this.panTrojan.Controls.Add(this.label12);
- this.panTrojan.Controls.Add(this.cmbFlow6);
- this.panTrojan.Controls.Add(this.txtId6);
- this.panTrojan.Controls.Add(this.label14);
- resources.ApplyResources(this.panTrojan, "panTrojan");
- this.panTrojan.Name = "panTrojan";
- //
- // label12
- //
- resources.ApplyResources(this.label12, "label12");
- this.label12.Name = "label12";
- //
- // cmbFlow6
- //
- this.cmbFlow6.FormattingEnabled = true;
- resources.ApplyResources(this.cmbFlow6, "cmbFlow6");
- this.cmbFlow6.Name = "cmbFlow6";
- //
- // txtId6
- //
- resources.ApplyResources(this.txtId6, "txtId6");
- this.txtId6.Name = "txtId6";
- //
- // label14
- //
- resources.ApplyResources(this.label14, "label14");
- this.label14.Name = "label14";
- //
- // panVless
- //
- this.panVless.Controls.Add(this.label7);
- this.panVless.Controls.Add(this.cmbFlow5);
- this.panVless.Controls.Add(this.txtId5);
- this.panVless.Controls.Add(this.label9);
- this.panVless.Controls.Add(this.label10);
- this.panVless.Controls.Add(this.btnGUID5);
- this.panVless.Controls.Add(this.cmbSecurity5);
- this.panVless.Controls.Add(this.label11);
- resources.ApplyResources(this.panVless, "panVless");
- this.panVless.Name = "panVless";
- //
- // label7
- //
- resources.ApplyResources(this.label7, "label7");
- this.label7.Name = "label7";
- //
- // cmbFlow5
- //
- this.cmbFlow5.FormattingEnabled = true;
- resources.ApplyResources(this.cmbFlow5, "cmbFlow5");
- this.cmbFlow5.Name = "cmbFlow5";
- //
- // txtId5
- //
- resources.ApplyResources(this.txtId5, "txtId5");
- this.txtId5.Name = "txtId5";
- //
- // label9
- //
- resources.ApplyResources(this.label9, "label9");
- this.label9.Name = "label9";
- //
- // label10
- //
- resources.ApplyResources(this.label10, "label10");
- this.label10.Name = "label10";
- //
- // btnGUID5
- //
- resources.ApplyResources(this.btnGUID5, "btnGUID5");
- this.btnGUID5.Name = "btnGUID5";
- this.btnGUID5.UseVisualStyleBackColor = true;
- this.btnGUID5.Click += new System.EventHandler(this.btnGUID_Click);
- //
- // cmbSecurity5
- //
- this.cmbSecurity5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple;
- this.cmbSecurity5.FormattingEnabled = true;
- this.cmbSecurity5.Items.AddRange(new object[] {
- resources.GetString("cmbSecurity5.Items")});
- resources.ApplyResources(this.cmbSecurity5, "cmbSecurity5");
- this.cmbSecurity5.Name = "cmbSecurity5";
- //
- // label11
- //
- resources.ApplyResources(this.label11, "label11");
- this.label11.Name = "label11";
- //
- // panVmess
- //
- this.panVmess.Controls.Add(this.label3);
- this.panVmess.Controls.Add(this.txtId);
- this.panVmess.Controls.Add(this.btnGUID);
- this.panVmess.Controls.Add(this.label4);
- this.panVmess.Controls.Add(this.label8);
- this.panVmess.Controls.Add(this.txtAlterId);
- this.panVmess.Controls.Add(this.cmbSecurity);
- this.panVmess.Controls.Add(this.label5);
- resources.ApplyResources(this.panVmess, "panVmess");
- this.panVmess.Name = "panVmess";
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // txtId
- //
- resources.ApplyResources(this.txtId, "txtId");
- this.txtId.Name = "txtId";
- //
- // btnGUID
- //
- resources.ApplyResources(this.btnGUID, "btnGUID");
- this.btnGUID.Name = "btnGUID";
- this.btnGUID.UseVisualStyleBackColor = true;
- this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click);
- //
- // label4
- //
- resources.ApplyResources(this.label4, "label4");
- this.label4.Name = "label4";
- //
- // label8
- //
- resources.ApplyResources(this.label8, "label8");
- this.label8.Name = "label8";
- //
- // txtAlterId
- //
- resources.ApplyResources(this.txtAlterId, "txtAlterId");
- this.txtAlterId.Name = "txtAlterId";
- //
- // cmbSecurity
- //
- this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbSecurity.FormattingEnabled = true;
- resources.ApplyResources(this.cmbSecurity, "cmbSecurity");
- this.cmbSecurity.Name = "cmbSecurity";
- //
- // label5
- //
- resources.ApplyResources(this.label5, "label5");
- this.label5.Name = "label5";
- //
- // panAddr
- //
- this.panAddr.Controls.Add(this.cmbCoreType);
- this.panAddr.Controls.Add(this.labCoreType);
- this.panAddr.Controls.Add(this.label6);
- this.panAddr.Controls.Add(this.label1);
- this.panAddr.Controls.Add(this.txtAddress);
- this.panAddr.Controls.Add(this.label2);
- this.panAddr.Controls.Add(this.txtPort);
- this.panAddr.Controls.Add(this.txtRemarks);
- resources.ApplyResources(this.panAddr, "panAddr");
- this.panAddr.Name = "panAddr";
- //
- // cmbCoreType
- //
- this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType, "cmbCoreType");
- this.cmbCoreType.Name = "cmbCoreType";
- //
- // labCoreType
- //
- resources.ApplyResources(this.labCoreType, "labCoreType");
- this.labCoreType.Name = "labCoreType";
- //
- // label6
- //
- resources.ApplyResources(this.label6, "label6");
- this.label6.Name = "label6";
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // txtAddress
- //
- resources.ApplyResources(this.txtAddress, "txtAddress");
- this.txtAddress.Name = "txtAddress";
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // txtPort
- //
- resources.ApplyResources(this.txtPort, "txtPort");
- this.txtPort.Name = "txtPort";
- //
- // txtRemarks
- //
- resources.ApplyResources(this.txtRemarks, "txtRemarks");
- this.txtRemarks.Name = "txtRemarks";
- //
- // panBottom
- //
- this.panBottom.Controls.Add(this.btnClose);
- this.panBottom.Controls.Add(this.btnOK);
- resources.ApplyResources(this.panBottom, "panBottom");
- this.panBottom.Name = "panBottom";
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panTop
- //
- resources.ApplyResources(this.panTop, "panTop");
- this.panTop.Name = "panTop";
- //
- // panTran
- //
- this.panTran.Controls.Add(this.transportControl);
- resources.ApplyResources(this.panTran, "panTran");
- this.panTran.Name = "panTran";
- //
- // transportControl
- //
- this.transportControl.AllowXtls = false;
- resources.ApplyResources(this.transportControl, "transportControl");
- this.transportControl.Name = "transportControl";
- //
- // AddServerForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.panTran);
- this.Controls.Add(this.panBottom);
- this.Controls.Add(this.panTop);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "AddServerForm";
- this.Load += new System.EventHandler(this.AddServerForm_Load);
- this.groupBox1.ResumeLayout(false);
- this.panSocks.ResumeLayout(false);
- this.panSocks.PerformLayout();
- this.panSs.ResumeLayout(false);
- this.panSs.PerformLayout();
- this.panTrojan.ResumeLayout(false);
- this.panTrojan.PerformLayout();
- this.panVless.ResumeLayout(false);
- this.panVless.PerformLayout();
- this.panVmess.ResumeLayout(false);
- this.panVmess.PerformLayout();
- this.panAddr.ResumeLayout(false);
- this.panAddr.PerformLayout();
- this.panBottom.ResumeLayout(false);
- this.panTran.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.TextBox txtRemarks;
- private System.Windows.Forms.Label label6;
- private System.Windows.Forms.Label label5;
- private System.Windows.Forms.TextBox txtAlterId;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.TextBox txtId;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.TextBox txtPort;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox txtAddress;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.ComboBox cmbSecurity;
- private System.Windows.Forms.Label label8;
- private System.Windows.Forms.Panel panTop;
- private System.Windows.Forms.Panel panBottom;
- private System.Windows.Forms.Button btnGUID;
- private System.Windows.Forms.Panel panTran;
- private ServerTransportControl transportControl;
- private System.Windows.Forms.Panel panAddr;
- private System.Windows.Forms.Panel panVmess;
- private System.Windows.Forms.Panel panVless;
- private System.Windows.Forms.Label label7;
- private System.Windows.Forms.ComboBox cmbFlow5;
- private System.Windows.Forms.TextBox txtId5;
- private System.Windows.Forms.Label label9;
- private System.Windows.Forms.Label label10;
- private System.Windows.Forms.Button btnGUID5;
- private System.Windows.Forms.ComboBox cmbSecurity5;
- private System.Windows.Forms.Label label11;
- private System.Windows.Forms.Panel panTrojan;
- private System.Windows.Forms.Label label12;
- private System.Windows.Forms.ComboBox cmbFlow6;
- private System.Windows.Forms.TextBox txtId6;
- private System.Windows.Forms.Label label14;
- private System.Windows.Forms.Panel panSs;
- private System.Windows.Forms.TextBox txtId3;
- private System.Windows.Forms.Label label15;
- private System.Windows.Forms.ComboBox cmbSecurity3;
- private System.Windows.Forms.Label label16;
- private System.Windows.Forms.Panel panSocks;
- private System.Windows.Forms.Label label17;
- private System.Windows.Forms.TextBox txtSecurity4;
- private System.Windows.Forms.Label label18;
- private System.Windows.Forms.TextBox txtId4;
- private System.Windows.Forms.ComboBox cmbCoreType;
- private System.Windows.Forms.Label labCoreType;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs
deleted file mode 100644
index c0f4459f..00000000
--- a/v2rayN/v2rayN/Forms/AddServerForm.cs
+++ /dev/null
@@ -1,285 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class AddServerForm : BaseServerForm
- {
- public AddServerForm()
- {
- InitializeComponent();
- }
-
- private void AddServerForm_Load(object sender, EventArgs e)
- {
- Text = (eConfigType).ToString();
-
- cmbCoreType.Items.AddRange(Global.coreTypes.ToArray());
- cmbCoreType.Items.Add(string.Empty);
-
- switch (eConfigType)
- {
- case EConfigType.VMess:
- panVmess.Dock = DockStyle.Fill;
- panVmess.Visible = true;
-
- cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray());
- break;
- case EConfigType.Shadowsocks:
- panSs.Dock = DockStyle.Fill;
- panSs.Visible = true;
- //panTran.Visible = false;
- //this.Height = this.Height - panTran.Height;
-
- cmbSecurity3.Items.AddRange(LazyConfig.Instance.GetShadowsocksSecuritys(vmessItem).ToArray());
- break;
- case EConfigType.Socks:
- panSocks.Dock = DockStyle.Fill;
- panSocks.Visible = true;
- panTran.Visible = false;
- Height = Height - panTran.Height;
- break;
- case EConfigType.VLESS:
- panVless.Dock = DockStyle.Fill;
- panVless.Visible = true;
- transportControl.AllowXtls = true;
-
- cmbFlow5.Items.AddRange(Global.xtlsFlows.ToArray());
- break;
- case EConfigType.Trojan:
- panTrojan.Dock = DockStyle.Fill;
- panTrojan.Visible = true;
- transportControl.AllowXtls = true;
-
- cmbFlow6.Items.AddRange(Global.xtlsFlows.ToArray());
- break;
- }
-
- if (vmessItem != null)
- {
- BindingServer();
- }
- else
- {
- vmessItem = new VmessItem
- {
- groupId = groupId
- };
- ClearServer();
- }
- }
-
- ///
- /// 绑定数据
- ///
- private void BindingServer()
- {
- txtRemarks.Text = vmessItem.remarks;
- txtAddress.Text = vmessItem.address;
- txtPort.Text = vmessItem.port.ToString();
-
- switch (eConfigType)
- {
- case EConfigType.VMess:
- txtId.Text = vmessItem.id;
- txtAlterId.Text = vmessItem.alterId.ToString();
- cmbSecurity.Text = vmessItem.security;
- break;
- case EConfigType.Shadowsocks:
- txtId3.Text = vmessItem.id;
- cmbSecurity3.Text = vmessItem.security;
- break;
- case EConfigType.Socks:
- txtId4.Text = vmessItem.id;
- txtSecurity4.Text = vmessItem.security;
- break;
- case EConfigType.VLESS:
- txtId5.Text = vmessItem.id;
- cmbFlow5.Text = vmessItem.flow;
- cmbSecurity5.Text = vmessItem.security;
- break;
- case EConfigType.Trojan:
- txtId6.Text = vmessItem.id;
- cmbFlow6.Text = vmessItem.flow;
- break;
- }
-
- cmbCoreType.Text = vmessItem.coreType == null ? string.Empty : vmessItem.coreType.ToString();
-
- transportControl.BindingServer(vmessItem);
- }
-
- ///
- /// 清除设置
- ///
- private void ClearServer()
- {
- txtRemarks.Text = "";
- txtAddress.Text = "";
- txtPort.Text = "";
-
- switch (eConfigType)
- {
- case EConfigType.VMess:
- txtId.Text = "";
- txtAlterId.Text = "0";
- cmbSecurity.Text = Global.DefaultSecurity;
- break;
- case EConfigType.Shadowsocks:
- txtId3.Text = "";
- cmbSecurity3.Text = Global.DefaultSecurity;
- break;
- case EConfigType.Socks:
- txtId4.Text = "";
- txtSecurity4.Text = "";
- break;
- case EConfigType.VLESS:
- txtId5.Text = "";
- cmbFlow5.Text = "";
- cmbSecurity5.Text = Global.None;
- break;
- case EConfigType.Trojan:
- txtId6.Text = "";
- cmbFlow6.Text = "";
- break;
- }
-
- transportControl.ClearServer(vmessItem);
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- string remarks = txtRemarks.Text;
- string address = txtAddress.Text;
- string port = txtPort.Text;
-
- string id = string.Empty;
- string alterId = string.Empty;
- string security = string.Empty;
- string flow = string.Empty;
-
- switch (eConfigType)
- {
- case EConfigType.VMess:
- id = txtId.Text;
- alterId = txtAlterId.Text;
- security = cmbSecurity.Text;
- break;
- case EConfigType.Shadowsocks:
- id = txtId3.Text;
- security = cmbSecurity3.Text;
- break;
- case EConfigType.Socks:
- id = txtId4.Text;
- security = txtSecurity4.Text;
- break;
- case EConfigType.VLESS:
- id = txtId5.Text;
- flow = cmbFlow5.Text;
- security = cmbSecurity5.Text;
- break;
- case EConfigType.Trojan:
- id = txtId6.Text;
- flow = cmbFlow6.Text;
- break;
- }
-
- if (Utils.IsNullOrEmpty(address))
- {
- UI.Show(ResUI.FillServerAddress);
- return;
- }
- if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port))
- {
- UI.Show(ResUI.FillCorrectServerPort);
- return;
- }
- if (eConfigType == EConfigType.Shadowsocks)
- {
- if (Utils.IsNullOrEmpty(id))
- {
- UI.Show(ResUI.FillPassword);
- return;
- }
- if (Utils.IsNullOrEmpty(security))
- {
- UI.Show(ResUI.PleaseSelectEncryption);
- return;
- }
- }
- if (eConfigType != EConfigType.Socks)
- {
- if (Utils.IsNullOrEmpty(id))
- {
- UI.Show(ResUI.FillUUID);
- return;
- }
- }
-
- transportControl.EndBindingServer();
-
- vmessItem.remarks = remarks;
- vmessItem.address = address;
- vmessItem.port = Utils.ToInt(port);
- vmessItem.id = id;
- vmessItem.alterId = Utils.ToInt(alterId);
- vmessItem.security = security;
-
- if (Utils.IsNullOrEmpty(cmbCoreType.Text))
- {
- vmessItem.coreType = null;
- }
- else
- {
- vmessItem.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), cmbCoreType.Text);
- }
-
- int ret = -1;
- switch (eConfigType)
- {
- case EConfigType.VMess:
- ret = ConfigHandler.AddServer(ref config, vmessItem);
- break;
- case EConfigType.Shadowsocks:
- ret = ConfigHandler.AddShadowsocksServer(ref config, vmessItem);
- break;
- case EConfigType.Socks:
- ret = ConfigHandler.AddSocksServer(ref config, vmessItem);
- break;
- case EConfigType.VLESS:
- vmessItem.flow = flow;
- ret = ConfigHandler.AddVlessServer(ref config, vmessItem);
- break;
- case EConfigType.Trojan:
- vmessItem.flow = flow;
- ret = ConfigHandler.AddTrojanServer(ref config, vmessItem);
- break;
- }
-
- if (ret == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
-
- }
-
- private void btnGUID_Click(object sender, EventArgs e)
- {
- txtId.Text =
- txtId5.Text = Utils.GetGUID();
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx
deleted file mode 100644
index e3643990..00000000
--- a/v2rayN/v2rayN/Forms/AddServerForm.resx
+++ /dev/null
@@ -1,1812 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 396, 17
-
-
- 75, 23
-
-
-
- 4
-
-
- &Cancel
-
-
- btnClose
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panBottom
-
-
- 0
-
-
- label17
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 0
-
-
- txtSecurity4
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 1
-
-
- label18
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 2
-
-
- txtId4
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 3
-
-
- 303, 163
-
-
- 82, 39
-
-
- 31
-
-
- False
-
-
- panSocks
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 0
-
-
- txtId3
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 0
-
-
- label15
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 1
-
-
- cmbSecurity3
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 2
-
-
- label16
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 3
-
-
- 142, 163
-
-
- 82, 39
-
-
- 30
-
-
- False
-
-
- panSs
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 1
-
-
- label12
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 0
-
-
- cmbFlow6
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 1
-
-
- txtId6
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 2
-
-
- label14
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 3
-
-
- 534, 163
-
-
- 82, 39
-
-
- 29
-
-
- False
-
-
- panTrojan
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 2
-
-
- label7
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 0
-
-
- cmbFlow5
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 1
-
-
- txtId5
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 2
-
-
- label9
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 3
-
-
- label10
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 4
-
-
- btnGUID5
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 5
-
-
- cmbSecurity5
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 6
-
-
- label11
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 7
-
-
- 396, 166
-
-
- 92, 36
-
-
- 27
-
-
- False
-
-
- panVless
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 3
-
-
- label3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 0
-
-
- txtId
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 1
-
-
- btnGUID
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 2
-
-
- label4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 3
-
-
- label8
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 4
-
-
- txtAlterId
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 5
-
-
- cmbSecurity
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 6
-
-
- label5
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 7
-
-
- 16, 163
-
-
- 82, 39
-
-
- 25
-
-
- False
-
-
- panVmess
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 4
-
-
- cmbCoreType
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 0
-
-
- labCoreType
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 1
-
-
- label6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 2
-
-
- label1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 3
-
-
- txtAddress
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 4
-
-
- label2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 5
-
-
- txtPort
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 6
-
-
- txtRemarks
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 7
-
-
-
- Top
-
-
- 3, 17
-
-
- 723, 100
-
-
- 24
-
-
- panAddr
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 5
-
-
- Fill
-
-
- 0, 10
-
-
- 729, 226
-
-
- 3
-
-
- Server
-
-
- groupBox1
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 11, 11
-
-
- 89, 12
-
-
- 25
-
-
- User(Optional)
-
-
- label17
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 0
-
-
- 126, 7
-
-
- 278, 21
-
-
- 2
-
-
- txtSecurity4
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 1
-
-
- True
-
-
- NoControl
-
-
- 11, 42
-
-
- 113, 12
-
-
- 23
-
-
- Password(Optional)
-
-
- label18
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 2
-
-
- 126, 38
-
-
- 278, 21
-
-
- 3
-
-
- txtId4
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSocks
-
-
- 3
-
-
- 126, 7
-
-
- 278, 21
-
-
- 2
-
-
- txtId3
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 11, 9
-
-
- 53, 12
-
-
- 4
-
-
- Password
-
-
- label15
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 1
-
-
- 126, 39
-
-
- 278, 20
-
-
- 3
-
-
- cmbSecurity3
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 11, 40
-
-
- 65, 12
-
-
- 8
-
-
- Encryption
-
-
- label16
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panSs
-
-
- 3
-
-
- True
-
-
- NoControl
-
-
- 12, 9
-
-
- 53, 12
-
-
- 4
-
-
- Password
-
-
- label12
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 0
-
-
- 127, 39
-
-
- 211, 20
-
-
- 3
-
-
- cmbFlow6
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 1
-
-
- 127, 7
-
-
- 265, 21
-
-
- 2
-
-
- txtId6
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 12, 43
-
-
- 29, 12
-
-
- 27
-
-
- Flow
-
-
- label14
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panTrojan
-
-
- 3
-
-
- True
-
-
- NoControl
-
-
- 11, 11
-
-
- 53, 12
-
-
- 4
-
-
- UUID(id)
-
-
- label7
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 0
-
-
- 126, 39
-
-
- 211, 20
-
-
- 3
-
-
- cmbFlow5
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 1
-
-
- 126, 7
-
-
- 278, 21
-
-
- 2
-
-
- txtId5
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 11, 43
-
-
- 29, 12
-
-
- 25
-
-
- Flow
-
-
- label9
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 3
-
-
- True
-
-
- NoControl
-
-
- 11, 74
-
-
- 65, 12
-
-
- 8
-
-
- Encryption
-
-
- label10
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 4
-
-
- NoControl
-
-
- 410, 7
-
-
- 75, 23
-
-
- 23
-
-
- Generate
-
-
- btnGUID5
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 5
-
-
- none
-
-
- 126, 70
-
-
- 211, 20
-
-
- 4
-
-
- cmbSecurity5
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 6
-
-
- True
-
-
- NoControl
-
-
- 352, 73
-
-
- 119, 12
-
-
- 14
-
-
- *Recommended (none)
-
-
- label11
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVless
-
-
- 7
-
-
- True
-
-
- 11, 11
-
-
- 53, 12
-
-
- 4
-
-
- UUID(id)
-
-
- label3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 0
-
-
- 126, 7
-
-
- 278, 21
-
-
- 2
-
-
- txtId
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 1
-
-
- 410, 5
-
-
- 75, 23
-
-
- 23
-
-
- &Generate
-
-
- btnGUID
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 2
-
-
- True
-
-
- 11, 40
-
-
- 47, 12
-
-
- 6
-
-
- AlterId
-
-
- label4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 3
-
-
- True
-
-
- 410, 69
-
-
- 119, 12
-
-
- 14
-
-
- *Recommended (auto)
-
-
- label8
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 4
-
-
- 126, 36
-
-
- 143, 21
-
-
- 3
-
-
- txtAlterId
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 5
-
-
- 194, 65
-
-
- 210, 20
-
-
- 4
-
-
- cmbSecurity
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 6
-
-
- True
-
-
- 11, 69
-
-
- 173, 12
-
-
- 8
-
-
- Encryption method (security)
-
-
- label5
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panVmess
-
-
- 7
-
-
- 625, 8
-
-
- 89, 20
-
-
- 38
-
-
- cmbCoreType
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 553, 12
-
-
- 59, 12
-
-
- 39
-
-
- Core Type
-
-
- labCoreType
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 1
-
-
- True
-
-
- 11, 12
-
-
- 95, 12
-
-
- 10
-
-
- Alias (remarks)
-
-
- label6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 2
-
-
- True
-
-
- 11, 43
-
-
- 47, 12
-
-
- 0
-
-
- Address
-
-
- label1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 3
-
-
- 126, 39
-
-
- 359, 21
-
-
- 1
-
-
- txtAddress
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 4
-
-
- True
-
-
- 11, 72
-
-
- 29, 12
-
-
- 2
-
-
- Port
-
-
- label2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 5
-
-
- 126, 68
-
-
- 143, 21
-
-
- 2
-
-
- txtPort
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 6
-
-
- 126, 8
-
-
- 278, 21
-
-
- 0
-
-
- txtRemarks
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panAddr
-
-
- 7
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panBottom
-
-
- 1
-
-
- Bottom
-
-
- 0, 501
-
-
- 729, 60
-
-
- 7
-
-
- panBottom
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 2
-
-
- 303, 17
-
-
- 75, 23
-
-
- 5
-
-
- &OK
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panBottom
-
-
- 1
-
-
- Top
-
-
- 0, 0
-
-
- 729, 10
-
-
- 6
-
-
- panTop
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 3
-
-
- Fill
-
-
- 0, 0
-
-
- 729, 265
-
-
- 0
-
-
- transportControl
-
-
- v2rayN.Forms.ServerTransportControl, v2rayN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- panTran
-
-
- 0
-
-
- Bottom
-
-
- 0, 236
-
-
- 729, 265
-
-
- 9
-
-
- panTran
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- True
-
-
- 25
-
-
- 6, 12
-
-
- 729, 561
-
-
- Edit or add a [VMess] server
-
-
- AddServerForm
-
-
- v2rayN.Forms.BaseServerForm, v2rayN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx
deleted file mode 100644
index b9c81218..00000000
--- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx
+++ /dev/null
@@ -1,275 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 取消(&C)
-
-
- 服务器
-
-
-
- None
-
-
-
- 270, 156
-
-
- 115, 61
-
-
- 77, 12
-
-
- 用户名(可选)
-
-
- 65, 12
-
-
- 密码(可选)
-
-
- None
-
-
- 142, 147
-
-
- 137, 78
-
-
- 89, 12
-
-
- 密码(password)
-
-
- 125, 12
-
-
- 加密方式(encryption)
-
-
- 89, 12
-
-
- 密码(password)
-
-
- 65, 12
-
-
- 流控(flow)
-
-
- 110, 52
-
-
- 65, 12
-
-
- 用户ID(id)
-
-
- 65, 12
-
-
- 流控(flow)
-
-
- 101, 12
-
-
- 加密(encryption)
-
-
- 生成
-
-
- 71, 12
-
-
- *非空(none)
-
-
- 65, 12
-
-
- 用户ID(id)
-
-
- 生成(&G)
-
-
- 95, 12
-
-
- 额外ID(alterId)
-
-
- 113, 12
-
-
- *随便选,建议(auto)
-
-
- 126, 65
-
-
- 211, 20
-
-
- 113, 12
-
-
- 加密方式(security)
-
-
- 83, 12
-
-
- 别名(remarks)
-
-
- 83, 12
-
-
- 地址(address)
-
-
- 65, 12
-
-
- 端口(port)
-
-
- 确定(&O)
-
-
- 编辑或添加[VMess]服务器
-
-
- 生成
-
-
- Core类型
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/BaseForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseForm.Designer.cs
deleted file mode 100644
index f23103bb..00000000
--- a/v2rayN/v2rayN/Forms/BaseForm.Designer.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class BaseForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BaseForm));
- this.SuspendLayout();
- //
- // BaseForm
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(292, 273);
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "BaseForm";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "BaseForm";
- this.ResumeLayout(false);
-
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/BaseForm.cs b/v2rayN/v2rayN/Forms/BaseForm.cs
deleted file mode 100644
index a307c13a..00000000
--- a/v2rayN/v2rayN/Forms/BaseForm.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Windows.Forms;
-using v2rayN.Mode;
-
-namespace v2rayN.Forms
-{
- public partial class BaseForm : Form
- {
- protected static Config config;
-
- public BaseForm()
- {
- InitializeComponent();
- LoadCustomIcon();
- }
-
- private void LoadCustomIcon()
- {
- try
- {
- string file = Utils.GetPath(Global.CustomIconName);
- if (System.IO.File.Exists(file))
- {
- Icon = new System.Drawing.Icon(file);
- return;
- }
-
- Icon = Properties.Resources.NotifyIcon1;
- }
- catch (Exception e)
- {
- Utils.SaveLog($"Loading custom icon failed: {e.Message}");
- }
- }
-
- }
-}
diff --git a/v2rayN/v2rayN/Forms/BaseForm.resx b/v2rayN/v2rayN/Forms/BaseForm.resx
deleted file mode 100644
index 1af7de15..00000000
--- a/v2rayN/v2rayN/Forms/BaseForm.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs
deleted file mode 100644
index 4a9b49d4..00000000
--- a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class BaseServerForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BaseServerForm));
- this.SuspendLayout();
- //
- // BaseServerForm
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(292, 273);
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "BaseServerForm";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "BaseServerForm";
- this.ResumeLayout(false);
-
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.cs b/v2rayN/v2rayN/Forms/BaseServerForm.cs
deleted file mode 100644
index 9618c480..00000000
--- a/v2rayN/v2rayN/Forms/BaseServerForm.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Windows.Forms;
-using v2rayN.Mode;
-
-namespace v2rayN.Forms
-{
- public partial class BaseServerForm : BaseForm
- {
- public VmessItem vmessItem = null;
- public string groupId;
- public EConfigType eConfigType;
-
- public BaseServerForm()
- {
- InitializeComponent();
- }
-
- }
-}
diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.resx b/v2rayN/v2rayN/Forms/BaseServerForm.resx
deleted file mode 100644
index c5e46818..00000000
--- a/v2rayN/v2rayN/Forms/BaseServerForm.resx
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs
deleted file mode 100644
index ba25fdee..00000000
--- a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class GlobalHotkeySettingForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GlobalHotkeySettingForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnReset = new System.Windows.Forms.Button();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel1 = new System.Windows.Forms.Panel();
- this.label6 = new System.Windows.Forms.Label();
- this.label5 = new System.Windows.Forms.Label();
- this.txtGlobalHotkey3 = new System.Windows.Forms.TextBox();
- this.label4 = new System.Windows.Forms.Label();
- this.txtGlobalHotkey2 = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.txtGlobalHotkey1 = new System.Windows.Forms.TextBox();
- this.label1 = new System.Windows.Forms.Label();
- this.txtGlobalHotkey0 = new System.Windows.Forms.TextBox();
- this.label2 = new System.Windows.Forms.Label();
- this.panel2.SuspendLayout();
- this.panel1.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // panel2
- //
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Controls.Add(this.btnReset);
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- this.panel2.Name = "panel2";
- //
- // btnReset
- //
- resources.ApplyResources(this.btnReset, "btnReset");
- this.btnReset.Name = "btnReset";
- this.btnReset.UseVisualStyleBackColor = true;
- this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panel1
- //
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Controls.Add(this.label6);
- this.panel1.Controls.Add(this.label5);
- this.panel1.Controls.Add(this.txtGlobalHotkey3);
- this.panel1.Controls.Add(this.label4);
- this.panel1.Controls.Add(this.txtGlobalHotkey2);
- this.panel1.Controls.Add(this.label3);
- this.panel1.Controls.Add(this.txtGlobalHotkey1);
- this.panel1.Controls.Add(this.label1);
- this.panel1.Controls.Add(this.txtGlobalHotkey0);
- this.panel1.Controls.Add(this.label2);
- this.panel1.Name = "panel1";
- //
- // label6
- //
- resources.ApplyResources(this.label6, "label6");
- this.label6.ForeColor = System.Drawing.Color.Red;
- this.label6.Name = "label6";
- //
- // label5
- //
- resources.ApplyResources(this.label5, "label5");
- this.label5.ForeColor = System.Drawing.Color.Red;
- this.label5.Name = "label5";
- //
- // txtGlobalHotkey3
- //
- resources.ApplyResources(this.txtGlobalHotkey3, "txtGlobalHotkey3");
- this.txtGlobalHotkey3.Name = "txtGlobalHotkey3";
- this.txtGlobalHotkey3.ReadOnly = true;
- //
- // label4
- //
- resources.ApplyResources(this.label4, "label4");
- this.label4.Name = "label4";
- //
- // txtGlobalHotkey2
- //
- resources.ApplyResources(this.txtGlobalHotkey2, "txtGlobalHotkey2");
- this.txtGlobalHotkey2.Name = "txtGlobalHotkey2";
- this.txtGlobalHotkey2.ReadOnly = true;
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // txtGlobalHotkey1
- //
- resources.ApplyResources(this.txtGlobalHotkey1, "txtGlobalHotkey1");
- this.txtGlobalHotkey1.Name = "txtGlobalHotkey1";
- this.txtGlobalHotkey1.ReadOnly = true;
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // txtGlobalHotkey0
- //
- resources.ApplyResources(this.txtGlobalHotkey0, "txtGlobalHotkey0");
- this.txtGlobalHotkey0.Name = "txtGlobalHotkey0";
- this.txtGlobalHotkey0.ReadOnly = true;
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // GlobalHotkeySettingForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.panel1);
- this.Controls.Add(this.panel2);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "GlobalHotkeySettingForm";
- this.Load += new System.EventHandler(this.GlobalHotkeySettingForm_Load);
- this.panel2.ResumeLayout(false);
- this.panel1.ResumeLayout(false);
- this.panel1.PerformLayout();
- this.ResumeLayout(false);
-
- }
-
- #endregion
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.TextBox txtGlobalHotkey0;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox txtGlobalHotkey3;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.TextBox txtGlobalHotkey2;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.TextBox txtGlobalHotkey1;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Label label5;
- private System.Windows.Forms.Button btnReset;
- private System.Windows.Forms.Label label6;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx
deleted file mode 100644
index 62c49a4f..00000000
--- a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx
+++ /dev/null
@@ -1,537 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Clear system proxy
-
-
-
- NoControl
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Bottom
-
-
- 1
-
-
-
- 75, 23
-
-
- panel2
-
-
- panel1
-
-
- &Reset
-
-
-
- True
-
-
- 0
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- NoControl
-
-
- btnOK
-
-
- panel2
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 5
-
-
- GlobalHotkeySettingForm
-
-
- label1
-
-
- 189, 138
-
-
- 34
-
-
- 37
-
-
- panel2
-
-
- 18, 215
-
-
- 6
-
-
- 101, 12
-
-
- 8
-
-
- 75, 23
-
-
- NoControl
-
-
- NoControl
-
-
- Take effect after restart
-
-
- 278, 21
-
-
- 189, 18
-
-
- 11
-
-
- 7
-
-
- panel1
-
-
- 18, 103
-
-
- 18, 190
-
-
- panel1
-
-
- 278, 21
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 527, 60
-
-
- 113, 12
-
-
- 32
-
-
- txtGlobalHotkey2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- label5
-
-
- 527, 242
-
-
- 211, 17
-
-
- 9
-
-
- 40
-
-
- 71, 12
-
-
- panel1
-
-
- panel1
-
-
- 75, 23
-
-
- 1
-
-
- panel1
-
-
- 18, 22
-
-
- label4
-
-
- txtGlobalHotkey1
-
-
- 33
-
-
- Do not change system proxy
-
-
- Set system proxy
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- NoControl
-
-
- txtGlobalHotkey0
-
-
- 39
-
-
- btnClose
-
-
- 303, 17
-
-
- 0, 242
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- Fill
-
-
- 3
-
-
- btnReset
-
-
- 6, 12
-
-
- 6
-
-
- 189, 58
-
-
- 0
-
-
- 7
-
-
- panel1
-
-
- NoControl
-
-
- 36
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- 31
-
-
- NoControl
-
-
- True
-
-
- 278, 21
-
-
- True
-
-
- NoControl
-
-
- 189, 99
-
-
- label2
-
-
- label3
-
-
- True
-
-
- Set directly by pressing the keyboard
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 0
-
-
- &Cancel
-
-
- 18, 62
-
-
- &OK
-
-
- 1
-
-
- Display GUI
-
-
- 35
-
-
- NoControl
-
-
- True
-
-
- panel1
-
-
- 18, 142
-
-
- 2
-
-
- $this
-
-
- 161, 12
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 227, 12
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- 0, 0
-
-
- panel2
-
-
- 4
-
-
- 155, 12
-
-
- GlobalHotkey Setting
-
-
- 2
-
-
- 5
-
-
- 527, 302
-
-
- 4
-
-
- 38
-
-
- txtGlobalHotkey3
-
-
- 278, 21
-
-
- $this
-
-
- 396, 17
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- label6
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- True
-
-
- 25
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx
deleted file mode 100644
index 06a7a69c..00000000
--- a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 取消(&C)
-
-
- 重置(&R)
-
-
- 确定(&O)
-
-
-
- 65, 12
-
-
- 重启后生效
-
-
- 113, 12
-
-
- 直接按键盘进行设置
-
-
- 89, 12
-
-
- 不改变系统代理
-
-
- 自动配置系统代理
-
-
- 77, 12
-
-
- 清除系统代理
-
-
- 65, 12
-
-
- 显示主界面
-
-
- 全局热键设置
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs
deleted file mode 100644
index 9dfcc635..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class GroupSettingControl
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region 组件设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要修改
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingControl));
- this.grbMain = new System.Windows.Forms.GroupBox();
- this.btnRemove = new System.Windows.Forms.Button();
- this.txtRemarks = new System.Windows.Forms.TextBox();
- this.label2 = new System.Windows.Forms.Label();
- this.numSort = new System.Windows.Forms.NumericUpDown();
- this.label1 = new System.Windows.Forms.Label();
- this.grbMain.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numSort)).BeginInit();
- this.SuspendLayout();
- //
- // grbMain
- //
- this.grbMain.Controls.Add(this.label1);
- this.grbMain.Controls.Add(this.numSort);
- this.grbMain.Controls.Add(this.btnRemove);
- this.grbMain.Controls.Add(this.txtRemarks);
- this.grbMain.Controls.Add(this.label2);
- resources.ApplyResources(this.grbMain, "grbMain");
- this.grbMain.Name = "grbMain";
- this.grbMain.TabStop = false;
- //
- // btnRemove
- //
- resources.ApplyResources(this.btnRemove, "btnRemove");
- this.btnRemove.Name = "btnRemove";
- this.btnRemove.UseVisualStyleBackColor = true;
- this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
- //
- // txtRemarks
- //
- resources.ApplyResources(this.txtRemarks, "txtRemarks");
- this.txtRemarks.Name = "txtRemarks";
- this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // numSort
- //
- resources.ApplyResources(this.numSort, "numSort");
- this.numSort.Name = "numSort";
- this.numSort.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // GroupSettingControl
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.grbMain);
- this.Name = "GroupSettingControl";
- this.Load += new System.EventHandler(this.GroupSettingControl_Load);
- this.grbMain.ResumeLayout(false);
- this.grbMain.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numSort)).EndInit();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox grbMain;
- private System.Windows.Forms.TextBox txtRemarks;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Button btnRemove;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.NumericUpDown numSort;
- }
-}
diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.cs
deleted file mode 100644
index 07abc73d..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingControl.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Handler;
-using v2rayN.Mode;
-
-namespace v2rayN.Forms
-{
- public partial class GroupSettingControl : UserControl
- {
- public event ChangeEventHandler OnButtonClicked;
-
-
- public GroupItem groupItem
- {
- get; set;
- }
-
- public GroupSettingControl()
- {
- InitializeComponent();
- }
-
- private void GroupSettingControl_Load(object sender, EventArgs e)
- {
- Height = grbMain.Height;
- BindingSub();
- }
-
- private void BindingSub()
- {
- if (groupItem != null)
- {
- txtRemarks.Text = groupItem.remarks.ToString();
- numSort.Value = groupItem.sort;
- }
- }
- private void EndBindingSub()
- {
- if (groupItem != null)
- {
- groupItem.remarks = txtRemarks.Text.TrimEx();
- groupItem.sort = Convert.ToInt32(numSort.Value);
- }
- }
- private void txtRemarks_Leave(object sender, EventArgs e)
- {
- EndBindingSub();
- }
-
- private void btnRemove_Click(object sender, EventArgs e)
- {
- if (groupItem != null)
- {
- groupItem.remarks = string.Empty;
- }
-
- OnButtonClicked?.Invoke(sender, e);
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.resx
deleted file mode 100644
index 75f7057e..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingControl.resx
+++ /dev/null
@@ -1,294 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- True
-
-
-
- NoControl
-
-
-
- 12, 61
-
-
- 71, 12
-
-
- 26
-
-
- Sort number
-
-
- label1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- grbMain
-
-
- 0
-
-
- 127, 57
-
-
- 120, 21
-
-
- 25
-
-
- numSort
-
-
- System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- grbMain
-
-
- 1
-
-
- NoControl
-
-
- 525, 21
-
-
- 75, 23
-
-
- 24
-
-
- Remove
-
-
- btnRemove
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- grbMain
-
-
- 2
-
-
- 127, 21
-
-
- 292, 21
-
-
- 1
-
-
- txtRemarks
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- grbMain
-
-
- 3
-
-
- True
-
-
- NoControl
-
-
- 12, 25
-
-
- 47, 12
-
-
- 10
-
-
- Remarks
-
-
- label2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- grbMain
-
-
- 4
-
-
- Fill
-
-
- 0, 0
-
-
- 619, 91
-
-
- 10
-
-
- Group details
-
-
- grbMain
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- True
-
-
- 6, 12
-
-
- 619, 91
-
-
- GroupSettingControl
-
-
- System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx
deleted file mode 100644
index 34dd0092..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 移除
-
-
-
- 29, 12
-
-
- 备注
-
-
- 分组详情
-
-
- 排序编号
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs
deleted file mode 100644
index 1eedb2ee..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class GroupSettingForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.panCon = new System.Windows.Forms.Panel();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnAdd = new System.Windows.Forms.Button();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel2.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // panCon
- //
- resources.ApplyResources(this.panCon, "panCon");
- this.panCon.Name = "panCon";
- //
- // panel2
- //
- this.panel2.Controls.Add(this.btnAdd);
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Name = "panel2";
- //
- // btnAdd
- //
- resources.ApplyResources(this.btnAdd, "btnAdd");
- this.btnAdd.Name = "btnAdd";
- this.btnAdd.UseVisualStyleBackColor = true;
- this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // GroupSettingForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.panCon);
- this.Controls.Add(this.panel2);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "GroupSettingForm";
- this.Load += new System.EventHandler(this.GroupSettingForm_Load);
- this.panel2.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Button btnAdd;
- private System.Windows.Forms.Panel panCon;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs
deleted file mode 100644
index 77860153..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingForm.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class GroupSettingForm : BaseForm
- {
- List lstControls = new List();
-
- public GroupSettingForm()
- {
- InitializeComponent();
- }
-
- private void GroupSettingForm_Load(object sender, EventArgs e)
- {
- if (config.groupItem == null)
- {
- config.groupItem = new List();
- }
-
- RefreshGroupsView();
- }
-
- ///
- /// 刷新列表
- ///
- private void RefreshGroupsView()
- {
- panCon.Controls.Clear();
- lstControls.Clear();
-
- for (int k = config.groupItem.Count - 1; k >= 0; k--)
- {
- GroupItem item = config.groupItem[k];
- if (Utils.IsNullOrEmpty(item.remarks))
- {
- if (!Utils.IsNullOrEmpty(item.id))
- {
- ConfigHandler.RemoveGroupItem(ref config, item.id);
- }
- config.groupItem.RemoveAt(k);
- }
- }
-
- foreach (GroupItem item in config.groupItem)
- {
- GroupSettingControl control = new GroupSettingControl();
- control.OnButtonClicked += Control_OnButtonClicked;
- control.groupItem = item;
- control.Dock = DockStyle.Top;
-
- panCon.Controls.Add(control);
- panCon.Controls.SetChildIndex(control, 0);
-
- lstControls.Add(control);
- }
- }
-
- private void Control_OnButtonClicked(object sender, EventArgs e)
- {
- RefreshGroupsView();
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- if (ConfigHandler.SaveGroupItem(ref config) == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
-
- private void btnAdd_Click(object sender, EventArgs e)
- {
- AddGroup();
-
- RefreshGroupsView();
- }
-
-
- private void AddGroup()
- {
- GroupItem groupItem = new GroupItem
- {
- id = string.Empty,
- remarks = "Group"
- };
- config.groupItem.Add(groupItem);
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.resx
deleted file mode 100644
index 043f3152..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingForm.resx
+++ /dev/null
@@ -1,273 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- NoControl
-
-
-
- 448, 17
-
-
- 75, 23
-
-
-
- 4
-
-
- &Cancel
-
-
- btnClose
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 1
-
-
- True
-
-
- Fill
-
-
- 0, 0
-
-
- 614, 351
-
-
- 10
-
-
- panCon
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- NoControl
-
-
- 47, 17
-
-
- 75, 23
-
-
- 6
-
-
- &Add
-
-
- btnAdd
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 0
-
-
- NoControl
-
-
- 355, 17
-
-
- 75, 23
-
-
- 5
-
-
- &OK
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 2
-
-
- Bottom
-
-
- 0, 351
-
-
- 614, 60
-
-
- 7
-
-
- panel2
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- True
-
-
- 6, 12
-
-
- 614, 411
-
-
- Group settings
-
-
- GroupSettingForm
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx
deleted file mode 100644
index 0d4dba82..00000000
--- a/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 取消(&C)
-
-
- 添加(&A)
-
-
- 确定(&O)
-
-
- 服务器分组设置
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs
deleted file mode 100644
index f0cb9d9c..00000000
--- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs
+++ /dev/null
@@ -1,1013 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class MainForm
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows 窗体设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
- this.scServers = new System.Windows.Forms.SplitContainer();
- this.lvServers = new v2rayN.Base.ListViewFlickerFree();
- this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.menuAddVmessServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuAddVlessServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuAddShadowsocksServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuAddSocksServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuAddTrojanServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuAddCustomServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuAddServers = new System.Windows.Forms.ToolStripMenuItem();
- this.menuScanScreen = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
- this.menuServerFilter = new System.Windows.Forms.ToolStripMenuItem();
- this.menuRemoveServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuRemoveDuplicateServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
- this.menuMoveToGroup = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveEvent = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
- this.menuPingServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSortServerResult = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem();
- this.menuClearServerStatistics = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
- this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem();
- this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem();
- this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem();
- this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton();
- this.tabGroup = new System.Windows.Forms.TabControl();
- this.qrCodeControl = new v2rayN.Forms.QRCodeControl();
- this.scBig = new System.Windows.Forms.SplitContainer();
- this.gbServers = new System.Windows.Forms.GroupBox();
- this.mainMsgControl = new v2rayN.Forms.MainMsgControl();
- this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components);
- this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem();
- this.menuKeepClear = new System.Windows.Forms.ToolStripMenuItem();
- this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem();
- this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem();
- this.menuRoutings = new System.Windows.Forms.ToolStripMenuItem();
- this.menuServers = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();
- this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem();
- this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem();
- this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem();
- this.menuUpdateSubViaProxy = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
- this.menuExit = new System.Windows.Forms.ToolStripMenuItem();
- this.panel1 = new System.Windows.Forms.Panel();
- this.tsMain = new System.Windows.Forms.ToolStrip();
- this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton();
- this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbSubUpdateViaProxy = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbSubGroupUpdate = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbSubGroupUpdateViaProxy = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbQRCodeSwitch = new System.Windows.Forms.ToolStripButton();
- this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton();
- this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbGlobalHotkeySetting = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbGroupSetting = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbBackupGuiNConfig = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbRestoreGuiNConfig = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbReload = new System.Windows.Forms.ToolStripButton();
- this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton();
- this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbCheckUpdateSagerNetCore = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbCheckUpdateXrayCore = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbCheckUpdateClashCore = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbCheckUpdateClashMetaCore = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbCheckUpdateGeo = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton();
- this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbV2rayWebsite = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbLanguageDef = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbLanguageZhHans = new System.Windows.Forms.ToolStripMenuItem();
- this.tsbPromotion = new System.Windows.Forms.ToolStripButton();
- this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
- this.tsbClose = new System.Windows.Forms.ToolStripButton();
- ((System.ComponentModel.ISupportInitialize)(this.scServers)).BeginInit();
- this.scServers.Panel1.SuspendLayout();
- this.scServers.Panel2.SuspendLayout();
- this.scServers.SuspendLayout();
- this.cmsLv.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.scBig)).BeginInit();
- this.scBig.Panel1.SuspendLayout();
- this.scBig.Panel2.SuspendLayout();
- this.scBig.SuspendLayout();
- this.gbServers.SuspendLayout();
- this.cmsMain.SuspendLayout();
- this.tsMain.SuspendLayout();
- this.SuspendLayout();
- //
- // scServers
- //
- resources.ApplyResources(this.scServers, "scServers");
- this.scServers.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
- this.scServers.Name = "scServers";
- //
- // scServers.Panel1
- //
- this.scServers.Panel1.Controls.Add(this.lvServers);
- this.scServers.Panel1.Controls.Add(this.tabGroup);
- //
- // scServers.Panel2
- //
- this.scServers.Panel2.Controls.Add(this.qrCodeControl);
- this.scServers.TabStop = false;
- //
- // lvServers
- //
- this.lvServers.ContextMenuStrip = this.cmsLv;
- resources.ApplyResources(this.lvServers, "lvServers");
- this.lvServers.FullRowSelect = true;
- this.lvServers.GridLines = true;
- this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.lvServers.HideSelection = false;
- this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
- ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))});
- this.lvServers.MultiSelect = false;
- this.lvServers.Name = "lvServers";
- this.lvServers.UseCompatibleStateImageBehavior = false;
- this.lvServers.View = System.Windows.Forms.View.Details;
- this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick);
- this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged);
- this.lvServers.Click += new System.EventHandler(this.lvServers_Click);
- this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
- this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
- //
- // cmsLv
- //
- this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20);
- this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuAddVmessServer,
- this.menuAddVlessServer,
- this.menuAddShadowsocksServer,
- this.menuAddSocksServer,
- this.menuAddTrojanServer,
- this.menuAddCustomServer,
- this.menuAddServers,
- this.menuScanScreen,
- this.toolStripSeparator1,
- this.menuServerFilter,
- this.menuRemoveServer,
- this.menuRemoveDuplicateServer,
- this.menuCopyServer,
- this.menuSetDefaultServer,
- this.toolStripSeparator3,
- this.menuMoveToGroup,
- this.menuMoveEvent,
- this.menuSelectAll,
- this.toolStripSeparator9,
- this.menuPingServer,
- this.menuTcpingServer,
- this.menuRealPingServer,
- this.menuSpeedServer,
- this.menuSortServerResult,
- this.tsbTestMe,
- this.menuClearServerStatistics,
- this.toolStripSeparator6,
- this.menuExport2ClientConfig,
- this.menuExport2ServerConfig,
- this.menuExport2ShareUrl,
- this.menuExport2SubContent});
- this.cmsLv.Name = "cmsLv";
- this.cmsLv.OwnerItem = this.tsbServer;
- resources.ApplyResources(this.cmsLv, "cmsLv");
- //
- // menuAddVmessServer
- //
- this.menuAddVmessServer.Name = "menuAddVmessServer";
- resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer");
- this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click);
- //
- // menuAddVlessServer
- //
- this.menuAddVlessServer.Name = "menuAddVlessServer";
- resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer");
- this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click);
- //
- // menuAddShadowsocksServer
- //
- this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer";
- resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer");
- this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click);
- //
- // menuAddSocksServer
- //
- this.menuAddSocksServer.Name = "menuAddSocksServer";
- resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer");
- this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click);
- //
- // menuAddTrojanServer
- //
- this.menuAddTrojanServer.Name = "menuAddTrojanServer";
- resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer");
- this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click);
- //
- // menuAddCustomServer
- //
- this.menuAddCustomServer.Name = "menuAddCustomServer";
- resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer");
- this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click);
- //
- // menuAddServers
- //
- this.menuAddServers.Name = "menuAddServers";
- resources.ApplyResources(this.menuAddServers, "menuAddServers");
- this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click);
- //
- // menuScanScreen
- //
- this.menuScanScreen.Name = "menuScanScreen";
- resources.ApplyResources(this.menuScanScreen, "menuScanScreen");
- this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click);
- //
- // toolStripSeparator1
- //
- this.toolStripSeparator1.Name = "toolStripSeparator1";
- resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
- //
- // menuServerFilter
- //
- this.menuServerFilter.Name = "menuServerFilter";
- resources.ApplyResources(this.menuServerFilter, "menuServerFilter");
- this.menuServerFilter.Click += new System.EventHandler(this.menuServerFilter_Click);
- //
- // menuRemoveServer
- //
- this.menuRemoveServer.Name = "menuRemoveServer";
- resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer");
- this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click);
- //
- // menuRemoveDuplicateServer
- //
- this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer";
- resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer");
- this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click);
- //
- // menuCopyServer
- //
- this.menuCopyServer.Name = "menuCopyServer";
- resources.ApplyResources(this.menuCopyServer, "menuCopyServer");
- this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click);
- //
- // menuSetDefaultServer
- //
- this.menuSetDefaultServer.Name = "menuSetDefaultServer";
- resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer");
- this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click);
- //
- // toolStripSeparator3
- //
- this.toolStripSeparator3.Name = "toolStripSeparator3";
- resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
- //
- // menuMoveToGroup
- //
- this.menuMoveToGroup.Name = "menuMoveToGroup";
- resources.ApplyResources(this.menuMoveToGroup, "menuMoveToGroup");
- this.menuMoveToGroup.Click += new System.EventHandler(this.menuMoveToGroup_Click);
- //
- // menuMoveEvent
- //
- this.menuMoveEvent.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuMoveTop,
- this.menuMoveUp,
- this.menuMoveDown,
- this.menuMoveBottom});
- this.menuMoveEvent.Name = "menuMoveEvent";
- resources.ApplyResources(this.menuMoveEvent, "menuMoveEvent");
- //
- // menuMoveTop
- //
- this.menuMoveTop.Name = "menuMoveTop";
- resources.ApplyResources(this.menuMoveTop, "menuMoveTop");
- this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click);
- //
- // menuMoveUp
- //
- this.menuMoveUp.Name = "menuMoveUp";
- resources.ApplyResources(this.menuMoveUp, "menuMoveUp");
- this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click);
- //
- // menuMoveDown
- //
- this.menuMoveDown.Name = "menuMoveDown";
- resources.ApplyResources(this.menuMoveDown, "menuMoveDown");
- this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click);
- //
- // menuMoveBottom
- //
- this.menuMoveBottom.Name = "menuMoveBottom";
- resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom");
- this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click);
- //
- // menuSelectAll
- //
- this.menuSelectAll.Name = "menuSelectAll";
- resources.ApplyResources(this.menuSelectAll, "menuSelectAll");
- this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click);
- //
- // toolStripSeparator9
- //
- this.toolStripSeparator9.Name = "toolStripSeparator9";
- resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9");
- //
- // menuPingServer
- //
- this.menuPingServer.Name = "menuPingServer";
- resources.ApplyResources(this.menuPingServer, "menuPingServer");
- this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click);
- //
- // menuTcpingServer
- //
- this.menuTcpingServer.Name = "menuTcpingServer";
- resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer");
- this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click);
- //
- // menuRealPingServer
- //
- this.menuRealPingServer.Name = "menuRealPingServer";
- resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer");
- this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click);
- //
- // menuSpeedServer
- //
- this.menuSpeedServer.Name = "menuSpeedServer";
- resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer");
- this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click);
- //
- // menuSortServerResult
- //
- this.menuSortServerResult.Name = "menuSortServerResult";
- resources.ApplyResources(this.menuSortServerResult, "menuSortServerResult");
- this.menuSortServerResult.Click += new System.EventHandler(this.menuSortServerResult_Click);
- //
- // tsbTestMe
- //
- this.tsbTestMe.Name = "tsbTestMe";
- resources.ApplyResources(this.tsbTestMe, "tsbTestMe");
- this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click);
- //
- // menuClearServerStatistics
- //
- this.menuClearServerStatistics.Name = "menuClearServerStatistics";
- resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics");
- this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click);
- //
- // toolStripSeparator6
- //
- this.toolStripSeparator6.Name = "toolStripSeparator6";
- resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6");
- //
- // menuExport2ClientConfig
- //
- this.menuExport2ClientConfig.Name = "menuExport2ClientConfig";
- resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig");
- this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click);
- //
- // menuExport2ServerConfig
- //
- this.menuExport2ServerConfig.Name = "menuExport2ServerConfig";
- resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig");
- this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click);
- //
- // menuExport2ShareUrl
- //
- this.menuExport2ShareUrl.Name = "menuExport2ShareUrl";
- resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl");
- this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click);
- //
- // menuExport2SubContent
- //
- this.menuExport2SubContent.Name = "menuExport2SubContent";
- resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent");
- this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click);
- //
- // tsbServer
- //
- this.tsbServer.DropDown = this.cmsLv;
- this.tsbServer.Image = global::v2rayN.Properties.Resources.server;
- resources.ApplyResources(this.tsbServer, "tsbServer");
- this.tsbServer.Name = "tsbServer";
- //
- // tabGroup
- //
- resources.ApplyResources(this.tabGroup, "tabGroup");
- this.tabGroup.Name = "tabGroup";
- this.tabGroup.SelectedIndex = 0;
- this.tabGroup.SelectedIndexChanged += new System.EventHandler(this.tabGroup_SelectedIndexChanged);
- //
- // qrCodeControl
- //
- resources.ApplyResources(this.qrCodeControl, "qrCodeControl");
- this.qrCodeControl.Name = "qrCodeControl";
- //
- // scBig
- //
- resources.ApplyResources(this.scBig, "scBig");
- this.scBig.Name = "scBig";
- //
- // scBig.Panel1
- //
- this.scBig.Panel1.Controls.Add(this.gbServers);
- //
- // scBig.Panel2
- //
- this.scBig.Panel2.Controls.Add(this.mainMsgControl);
- //
- // gbServers
- //
- this.gbServers.Controls.Add(this.scServers);
- resources.ApplyResources(this.gbServers, "gbServers");
- this.gbServers.Name = "gbServers";
- this.gbServers.TabStop = false;
- //
- // mainMsgControl
- //
- resources.ApplyResources(this.mainMsgControl, "mainMsgControl");
- this.mainMsgControl.Name = "mainMsgControl";
- //
- // notifyMain
- //
- this.notifyMain.ContextMenuStrip = this.cmsMain;
- resources.ApplyResources(this.notifyMain, "notifyMain");
- this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick);
- //
- // cmsMain
- //
- this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20);
- resources.ApplyResources(this.cmsMain, "cmsMain");
- this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuSysAgentMode,
- this.menuRoutings,
- this.menuServers,
- this.toolStripSeparator13,
- this.menuAddServers2,
- this.menuScanScreen2,
- this.menuUpdateSubscriptions,
- this.menuUpdateSubViaProxy,
- this.toolStripSeparator2,
- this.menuExit});
- this.cmsMain.Name = "contextMenuStrip1";
- this.cmsMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
- this.cmsMain.ShowCheckMargin = true;
- this.cmsMain.ShowImageMargin = false;
- //
- // menuSysAgentMode
- //
- this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuKeepClear,
- this.menuGlobal,
- this.menuKeepNothing});
- this.menuSysAgentMode.Name = "menuSysAgentMode";
- resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode");
- //
- // menuKeepClear
- //
- this.menuKeepClear.Name = "menuKeepClear";
- resources.ApplyResources(this.menuKeepClear, "menuKeepClear");
- this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click);
- //
- // menuGlobal
- //
- this.menuGlobal.Name = "menuGlobal";
- resources.ApplyResources(this.menuGlobal, "menuGlobal");
- this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click);
- //
- // menuKeepNothing
- //
- this.menuKeepNothing.Name = "menuKeepNothing";
- resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing");
- this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click);
- //
- // menuRoutings
- //
- this.menuRoutings.Name = "menuRoutings";
- resources.ApplyResources(this.menuRoutings, "menuRoutings");
- //
- // menuServers
- //
- this.menuServers.Name = "menuServers";
- resources.ApplyResources(this.menuServers, "menuServers");
- //
- // toolStripSeparator13
- //
- this.toolStripSeparator13.Name = "toolStripSeparator13";
- resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13");
- //
- // menuAddServers2
- //
- this.menuAddServers2.Name = "menuAddServers2";
- resources.ApplyResources(this.menuAddServers2, "menuAddServers2");
- this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click);
- //
- // menuScanScreen2
- //
- this.menuScanScreen2.Name = "menuScanScreen2";
- resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2");
- this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click);
- //
- // menuUpdateSubscriptions
- //
- this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions";
- resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions");
- this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click);
- //
- // menuUpdateSubViaProxy
- //
- this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy";
- resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy");
- this.menuUpdateSubViaProxy.Click += new System.EventHandler(this.menuUpdateSubViaProxy_Click);
- //
- // toolStripSeparator2
- //
- this.toolStripSeparator2.Name = "toolStripSeparator2";
- resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
- //
- // menuExit
- //
- this.menuExit.Name = "menuExit";
- resources.ApplyResources(this.menuExit, "menuExit");
- this.menuExit.Click += new System.EventHandler(this.menuExit_Click);
- //
- // panel1
- //
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Name = "panel1";
- //
- // tsMain
- //
- this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32);
- this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.tsbServer,
- this.toolStripSeparator4,
- this.tsbSub,
- this.tsbQRCodeSwitch,
- this.toolStripSeparator8,
- this.tsbSetting,
- this.toolStripSeparator5,
- this.tsbReload,
- this.toolStripSeparator7,
- this.tsbCheckUpdate,
- this.toolStripSeparator10,
- this.tsbHelp,
- this.tsbPromotion,
- this.toolStripSeparator11,
- this.tsbClose});
- resources.ApplyResources(this.tsMain, "tsMain");
- this.tsMain.Name = "tsMain";
- this.tsMain.TabStop = true;
- //
- // toolStripSeparator4
- //
- this.toolStripSeparator4.Name = "toolStripSeparator4";
- resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4");
- //
- // tsbSub
- //
- this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.tsbSubSetting,
- this.tsbSubUpdate,
- this.tsbSubUpdateViaProxy,
- this.tsbSubGroupUpdate,
- this.tsbSubGroupUpdateViaProxy});
- this.tsbSub.Image = global::v2rayN.Properties.Resources.sub;
- resources.ApplyResources(this.tsbSub, "tsbSub");
- this.tsbSub.Name = "tsbSub";
- //
- // tsbSubSetting
- //
- this.tsbSubSetting.Name = "tsbSubSetting";
- resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting");
- this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click);
- //
- // tsbSubUpdate
- //
- this.tsbSubUpdate.Name = "tsbSubUpdate";
- resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate");
- this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click);
- //
- // tsbSubUpdateViaProxy
- //
- this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy";
- resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy");
- this.tsbSubUpdateViaProxy.Click += new System.EventHandler(this.tsbSubUpdateViaProxy_Click);
- //
- // tsbSubGroupUpdate
- //
- this.tsbSubGroupUpdate.Name = "tsbSubGroupUpdate";
- resources.ApplyResources(this.tsbSubGroupUpdate, "tsbSubGroupUpdate");
- this.tsbSubGroupUpdate.Click += new System.EventHandler(this.tsbSubGroupUpdate_Click);
- //
- // tsbSubGroupUpdateViaProxy
- //
- this.tsbSubGroupUpdateViaProxy.Name = "tsbSubGroupUpdateViaProxy";
- resources.ApplyResources(this.tsbSubGroupUpdateViaProxy, "tsbSubGroupUpdateViaProxy");
- this.tsbSubGroupUpdateViaProxy.Click += new System.EventHandler(this.tsbSubGroupUpdateViaProxy_Click);
- //
- // tsbQRCodeSwitch
- //
- this.tsbQRCodeSwitch.CheckOnClick = true;
- this.tsbQRCodeSwitch.ForeColor = System.Drawing.Color.Black;
- this.tsbQRCodeSwitch.Image = global::v2rayN.Properties.Resources.share;
- resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch");
- this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch";
- this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged);
- //
- // toolStripSeparator8
- //
- this.toolStripSeparator8.Name = "toolStripSeparator8";
- resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8");
- //
- // tsbSetting
- //
- this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.tsbOptionSetting,
- this.tsbRoutingSetting,
- this.tsbGlobalHotkeySetting,
- this.tsbGroupSetting,
- this.toolStripSeparator14,
- this.tsbBackupGuiNConfig,
- this.tsbRestoreGuiNConfig});
- this.tsbSetting.Image = global::v2rayN.Properties.Resources.option;
- resources.ApplyResources(this.tsbSetting, "tsbSetting");
- this.tsbSetting.Name = "tsbSetting";
- //
- // tsbOptionSetting
- //
- this.tsbOptionSetting.Name = "tsbOptionSetting";
- resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting");
- this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click);
- //
- // tsbRoutingSetting
- //
- this.tsbRoutingSetting.Name = "tsbRoutingSetting";
- resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting");
- this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click);
- //
- // tsbGlobalHotkeySetting
- //
- this.tsbGlobalHotkeySetting.Name = "tsbGlobalHotkeySetting";
- resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting");
- this.tsbGlobalHotkeySetting.Click += new System.EventHandler(this.tsbGlobalHotkeySetting_Click);
- //
- // tsbGroupSetting
- //
- this.tsbGroupSetting.Name = "tsbGroupSetting";
- resources.ApplyResources(this.tsbGroupSetting, "tsbGroupSetting");
- this.tsbGroupSetting.Click += new System.EventHandler(this.tsbGroupSetting_Click);
- //
- // toolStripSeparator14
- //
- this.toolStripSeparator14.Name = "toolStripSeparator14";
- resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14");
- //
- // tsbBackupGuiNConfig
- //
- this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig";
- resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig");
- this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click);
- //
- // tsbRestoreGuiNConfig
- //
- this.tsbRestoreGuiNConfig.Name = "tsbRestoreGuiNConfig";
- resources.ApplyResources(this.tsbRestoreGuiNConfig, "tsbRestoreGuiNConfig");
- this.tsbRestoreGuiNConfig.Click += new System.EventHandler(this.tsbRestoreGuiNConfig_Click);
- //
- // toolStripSeparator5
- //
- this.toolStripSeparator5.Name = "toolStripSeparator5";
- resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5");
- //
- // tsbReload
- //
- this.tsbReload.Image = global::v2rayN.Properties.Resources.restart;
- resources.ApplyResources(this.tsbReload, "tsbReload");
- this.tsbReload.Name = "tsbReload";
- this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click);
- //
- // toolStripSeparator7
- //
- this.toolStripSeparator7.Name = "toolStripSeparator7";
- resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7");
- //
- // tsbCheckUpdate
- //
- this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.tsbCheckUpdateN,
- this.tsbCheckUpdateCore,
- this.tsbCheckUpdateSagerNetCore,
- this.tsbCheckUpdateXrayCore,
- this.toolStripSeparator16,
- this.tsbCheckUpdateClashCore,
- this.tsbCheckUpdateClashMetaCore,
- this.toolStripSeparator15,
- this.tsbCheckUpdateGeo});
- this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate;
- resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate");
- this.tsbCheckUpdate.Name = "tsbCheckUpdate";
- //
- // tsbCheckUpdateN
- //
- this.tsbCheckUpdateN.Name = "tsbCheckUpdateN";
- resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN");
- this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click);
- //
- // tsbCheckUpdateCore
- //
- this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore";
- resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore");
- this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click);
- //
- // tsbCheckUpdateSagerNetCore
- //
- this.tsbCheckUpdateSagerNetCore.Name = "tsbCheckUpdateSagerNetCore";
- resources.ApplyResources(this.tsbCheckUpdateSagerNetCore, "tsbCheckUpdateSagerNetCore");
- this.tsbCheckUpdateSagerNetCore.Click += new System.EventHandler(this.tsbCheckUpdateSagerNetCore_Click);
- //
- // tsbCheckUpdateXrayCore
- //
- this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore";
- resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore");
- this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click);
- //
- // toolStripSeparator16
- //
- this.toolStripSeparator16.Name = "toolStripSeparator16";
- resources.ApplyResources(this.toolStripSeparator16, "toolStripSeparator16");
- //
- // tsbCheckUpdateClashCore
- //
- this.tsbCheckUpdateClashCore.Name = "tsbCheckUpdateClashCore";
- resources.ApplyResources(this.tsbCheckUpdateClashCore, "tsbCheckUpdateClashCore");
- this.tsbCheckUpdateClashCore.Click += new System.EventHandler(this.tsbCheckUpdateClashCore_Click);
- //
- // tsbCheckUpdateClashMetaCore
- //
- this.tsbCheckUpdateClashMetaCore.Name = "tsbCheckUpdateClashMetaCore";
- resources.ApplyResources(this.tsbCheckUpdateClashMetaCore, "tsbCheckUpdateClashMetaCore");
- this.tsbCheckUpdateClashMetaCore.Click += new System.EventHandler(this.tsbCheckUpdateClashMetaCore_Click);
- //
- // toolStripSeparator15
- //
- this.toolStripSeparator15.Name = "toolStripSeparator15";
- resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15");
- //
- // tsbCheckUpdateGeo
- //
- this.tsbCheckUpdateGeo.Name = "tsbCheckUpdateGeo";
- resources.ApplyResources(this.tsbCheckUpdateGeo, "tsbCheckUpdateGeo");
- this.tsbCheckUpdateGeo.Click += new System.EventHandler(this.tsbCheckUpdateGeo_Click);
- //
- // toolStripSeparator10
- //
- this.toolStripSeparator10.Name = "toolStripSeparator10";
- resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10");
- //
- // tsbHelp
- //
- this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.tsbAbout,
- this.tsbV2rayWebsite,
- this.toolStripSeparator12,
- this.tsbLanguageDef,
- this.tsbLanguageZhHans});
- this.tsbHelp.Image = global::v2rayN.Properties.Resources.help;
- resources.ApplyResources(this.tsbHelp, "tsbHelp");
- this.tsbHelp.Name = "tsbHelp";
- //
- // tsbAbout
- //
- this.tsbAbout.Name = "tsbAbout";
- resources.ApplyResources(this.tsbAbout, "tsbAbout");
- this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click);
- //
- // tsbV2rayWebsite
- //
- this.tsbV2rayWebsite.Name = "tsbV2rayWebsite";
- resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite");
- this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click);
- //
- // toolStripSeparator12
- //
- this.toolStripSeparator12.Name = "toolStripSeparator12";
- resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12");
- //
- // tsbLanguageDef
- //
- this.tsbLanguageDef.Name = "tsbLanguageDef";
- resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef");
- this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click);
- //
- // tsbLanguageZhHans
- //
- this.tsbLanguageZhHans.Name = "tsbLanguageZhHans";
- resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans");
- this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click);
- //
- // tsbPromotion
- //
- this.tsbPromotion.ForeColor = System.Drawing.Color.Black;
- this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion;
- resources.ApplyResources(this.tsbPromotion, "tsbPromotion");
- this.tsbPromotion.Name = "tsbPromotion";
- this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click);
- //
- // toolStripSeparator11
- //
- this.toolStripSeparator11.Name = "toolStripSeparator11";
- resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11");
- //
- // tsbClose
- //
- this.tsbClose.Image = global::v2rayN.Properties.Resources.minimize;
- resources.ApplyResources(this.tsbClose, "tsbClose");
- this.tsbClose.Name = "tsbClose";
- this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click);
- //
- // MainForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.scBig);
- this.Controls.Add(this.panel1);
- this.Controls.Add(this.tsMain);
- this.MaximizeBox = true;
- this.MinimizeBox = true;
- this.Name = "MainForm";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
- this.Load += new System.EventHandler(this.MainForm_Load);
- this.Shown += new System.EventHandler(this.MainForm_Shown);
- this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged);
- this.Resize += new System.EventHandler(this.MainForm_Resize);
- this.scServers.Panel1.ResumeLayout(false);
- this.scServers.Panel2.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.scServers)).EndInit();
- this.scServers.ResumeLayout(false);
- this.cmsLv.ResumeLayout(false);
- this.scBig.Panel1.ResumeLayout(false);
- this.scBig.Panel2.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.scBig)).EndInit();
- this.scBig.ResumeLayout(false);
- this.gbServers.ResumeLayout(false);
- this.cmsMain.ResumeLayout(false);
- this.tsMain.ResumeLayout(false);
- this.tsMain.PerformLayout();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
-#endregion
-
- private System.Windows.Forms.GroupBox gbServers;
- private v2rayN.Base.ListViewFlickerFree lvServers;
- private System.Windows.Forms.NotifyIcon notifyMain;
- private System.Windows.Forms.ContextMenuStrip cmsMain;
- private System.Windows.Forms.ToolStripMenuItem menuExit;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.ToolStripMenuItem menuServers;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
- private System.Windows.Forms.ContextMenuStrip cmsLv;
- private System.Windows.Forms.ToolStripMenuItem menuAddVmessServer;
- private System.Windows.Forms.ToolStripMenuItem menuRemoveServer;
- private System.Windows.Forms.ToolStripMenuItem menuSetDefaultServer;
- private System.Windows.Forms.ToolStripMenuItem menuCopyServer;
- private System.Windows.Forms.ToolStripMenuItem menuPingServer;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
- private System.Windows.Forms.ToolStripMenuItem menuExport2ClientConfig;
- private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig;
- private System.Windows.Forms.ToolStrip tsMain;
- private System.Windows.Forms.ToolStripDropDownButton tsbServer;
- private System.Windows.Forms.ToolStripButton tsbClose;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
- private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode;
- private System.Windows.Forms.ToolStripMenuItem menuGlobal;
- private System.Windows.Forms.ToolStripMenuItem menuKeepClear;
- private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
- private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer;
- private System.Windows.Forms.SplitContainer scServers;
- private QRCodeControl qrCodeControl;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
- private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore;
- private System.Windows.Forms.ToolStripMenuItem menuAddServers;
- private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl;
- private System.Windows.Forms.ToolStripMenuItem menuSpeedServer;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
- private System.Windows.Forms.ToolStripDropDownButton tsbHelp;
- private System.Windows.Forms.ToolStripMenuItem tsbAbout;
- private System.Windows.Forms.ToolStripMenuItem menuAddServers2;
- private System.Windows.Forms.ToolStripMenuItem menuScanScreen;
- private System.Windows.Forms.ToolStripMenuItem menuScanScreen2;
- private System.Windows.Forms.ToolStripDropDownButton tsbSub;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
- private System.Windows.Forms.ToolStripMenuItem tsbSubSetting;
- private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate;
- private System.Windows.Forms.ToolStripMenuItem menuSelectAll;
- private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;
- private System.Windows.Forms.ToolStripMenuItem tsbLanguageDef;
- private System.Windows.Forms.ToolStripMenuItem tsbLanguageZhHans;
- private System.Windows.Forms.ToolStripButton tsbPromotion;
- private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer;
- private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer;
- private System.Windows.Forms.ToolStripMenuItem menuTcpingServer;
- private System.Windows.Forms.ToolStripMenuItem menuRealPingServer;
- private System.Windows.Forms.ToolStripMenuItem menuUpdateSubscriptions;
- private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite;
- private System.Windows.Forms.ToolStripMenuItem menuKeepNothing;
- private System.Windows.Forms.ToolStripMenuItem tsbTestMe;
- private System.Windows.Forms.ToolStripButton tsbReload;
- private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch;
- private System.Windows.Forms.ToolStripMenuItem menuAddVlessServer;
- private System.Windows.Forms.ToolStripMenuItem menuAddTrojanServer;
- private System.Windows.Forms.ToolStripDropDownButton tsbSetting;
- private System.Windows.Forms.ToolStripMenuItem tsbOptionSetting;
- private System.Windows.Forms.ToolStripMenuItem tsbRoutingSetting;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateXrayCore;
- private System.Windows.Forms.ToolStripMenuItem menuClearServerStatistics;
- private System.Windows.Forms.ToolStripMenuItem menuRoutings;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator13;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator14;
- private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator15;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeo;
- private System.Windows.Forms.SplitContainer scBig;
- private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy;
- private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy;
- private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting;
- private System.Windows.Forms.TabControl tabGroup;
- private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting;
- private System.Windows.Forms.ToolStripMenuItem menuMoveToGroup;
- private MainMsgControl mainMsgControl;
- private System.Windows.Forms.ToolStripMenuItem menuMoveEvent;
- private System.Windows.Forms.ToolStripMenuItem menuMoveTop;
- private System.Windows.Forms.ToolStripMenuItem menuMoveUp;
- private System.Windows.Forms.ToolStripMenuItem menuMoveDown;
- private System.Windows.Forms.ToolStripMenuItem menuMoveBottom;
- private System.Windows.Forms.ToolStripMenuItem menuServerFilter;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashCore;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashMetaCore;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator16;
- private System.Windows.Forms.ToolStripMenuItem menuSortServerResult;
- private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateSagerNetCore;
- private System.Windows.Forms.ToolStripMenuItem tsbSubGroupUpdate;
- private System.Windows.Forms.ToolStripMenuItem tsbSubGroupUpdateViaProxy;
- private System.Windows.Forms.ToolStripMenuItem tsbRestoreGuiNConfig;
- }
-}
-
diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs
deleted file mode 100644
index 12f5000b..00000000
--- a/v2rayN/v2rayN/Forms/MainForm.cs
+++ /dev/null
@@ -1,1606 +0,0 @@
-using NHotkey;
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-using v2rayN.Tool;
-
-namespace v2rayN.Forms
-{
- public partial class MainForm : BaseForm
- {
- private V2rayHandler v2rayHandler;
- private List lstSelecteds = new List();
- private StatisticsHandler statistics;
- private List lstVmess;
- private string _groupId = string.Empty;
- private string serverFilter = string.Empty;
-
- #region Window 事件
-
- public MainForm()
- {
- InitializeComponent();
- ShowInTaskbar = false;
- WindowState = FormWindowState.Minimized;
- HideForm();
- Text = Utils.GetVersion();
- Global.processJob = new Job();
-
- Application.ApplicationExit += (sender, args) =>
- {
- MyAppExit(false);
- };
- }
-
- private void MainForm_Load(object sender, EventArgs e)
- {
- if (ConfigHandler.LoadConfig(ref config) != 0)
- {
- UI.ShowWarning($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用");
- Environment.Exit(0);
- return;
- }
-
- ConfigHandler.InitBuiltinRouting(ref config);
- MainFormHandler.Instance.BackupGuiNConfig(config, true);
- v2rayHandler = new V2rayHandler();
- v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent;
-
- if (config.enableStatistics)
- {
- statistics = new StatisticsHandler(config, UpdateStatisticsHandler);
- }
- }
-
- private void MainForm_VisibleChanged(object sender, EventArgs e)
- {
- if (statistics == null || !statistics.Enable) return;
- if ((sender as Form).Visible)
- {
- statistics.UpdateUI = true;
- }
- else
- {
- statistics.UpdateUI = false;
- }
- }
-
- private void MainForm_Shown(object sender, EventArgs e)
- {
- InitGroupView();
- InitServersView();
- RefreshServers();
- RefreshRoutingsMenu();
- RestoreUI();
-
- HideForm();
-
- MainFormHandler.Instance.UpdateTask(config, UpdateTaskHandler);
- MainFormHandler.Instance.RegisterGlobalHotkey(config, OnHotkeyHandler, UpdateTaskHandler);
-
- _ = LoadV2ray();
-
- if (!Utils.CheckForDotNetVersion())
- {
- UI.ShowWarning(ResUI.NetFrameworkRequirementsTip);
- AppendText(false, ResUI.NetFrameworkRequirementsTip);
- }
- }
-
- private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- switch (e.CloseReason)
- {
- case CloseReason.UserClosing:
- StorageUI();
- e.Cancel = true;
- HideForm();
- break;
- case CloseReason.ApplicationExitCall:
- case CloseReason.FormOwnerClosing:
- case CloseReason.TaskManagerClosing:
- MyAppExit(false);
- break;
- case CloseReason.WindowsShutDown:
- MyAppExit(true);
- break;
- }
- }
-
- private void MainForm_Resize(object sender, EventArgs e)
- {
- //if (this.WindowState == FormWindowState.Minimized)
- //{
- // HideForm();
- //}
- //else
- //{
-
- //}
- }
- private void MyAppExit(bool blWindowsShutDown)
- {
- try
- {
- Utils.SaveLog("MyAppExit Begin");
-
- StorageUI();
- ConfigHandler.SaveConfig(ref config);
-
- //HttpProxyHandle.CloseHttpAgent(config);
- if (blWindowsShutDown)
- {
- SysProxyHandle.ResetIEProxy4WindowsShutDown();
- }
- else
- {
- SysProxyHandle.UpdateSysProxy(config, true);
- }
-
- statistics?.SaveToFile();
- statistics?.Close();
-
- v2rayHandler.V2rayStop();
- Utils.SaveLog("MyAppExit End");
- }
- catch { }
- }
-
- private void RestoreUI()
- {
- scServers.Panel2Collapsed = true;
-
- //if (!config.uiItem.mainLocation.IsEmpty)
- //{
- // if (config.uiItem.mainLocation.X >= SystemInformation.WorkingArea.Width
- // || config.uiItem.mainLocation.Y >= SystemInformation.WorkingArea.Height)
- // {
- // Location = new Point(0, 0);
- // }
- // else
- // {
- // Location = config.uiItem.mainLocation;
- // }
- //}
- if (!config.uiItem.mainSize.IsEmpty)
- {
- Width = config.uiItem.mainSize.Width;
- Height = config.uiItem.mainSize.Height;
- }
-
-
- for (int k = 0; k < lvServers.Columns.Count; k++)
- {
- var width = ConfigHandler.GetformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width);
- lvServers.Columns[k].Width = width;
- }
- }
-
- private void StorageUI()
- {
- config.uiItem.mainLocation = Location;
-
- config.uiItem.mainSize = new Size(Width, Height);
-
- for (int k = 0; k < lvServers.Columns.Count; k++)
- {
- ConfigHandler.AddformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width);
- }
- }
-
- private void OnHotkeyHandler(object sender, HotkeyEventArgs e)
- {
- switch (Utils.ToInt(e.Name))
- {
- case (int)EGlobalHotkey.ShowForm:
- if (ShowInTaskbar) HideForm(); else ShowForm();
- break;
- case (int)EGlobalHotkey.SystemProxyClear:
- SetListenerType(ESysProxyType.ForcedClear);
- break;
- case (int)EGlobalHotkey.SystemProxySet:
- SetListenerType(ESysProxyType.ForcedChange);
- break;
- case (int)EGlobalHotkey.SystemProxyUnchanged:
- SetListenerType(ESysProxyType.Unchanged);
- break;
- }
- e.Handled = true;
- }
-
- #endregion
-
- #region 显示服务器 listview 和 menu
-
- ///
- /// 刷新服务器
- ///
- private void RefreshServers()
- {
- lstVmess = config.vmess
- .Where(it => Utils.IsNullOrEmpty(_groupId) || it.groupId == _groupId)
- .Where(it => Utils.IsNullOrEmpty(serverFilter) || it.remarks.Contains(serverFilter))
- .OrderBy(it => it.sort)
- .ToList();
-
- ConfigHandler.SetDefaultServer(config, lstVmess);
- BeginInvoke(new Action(() =>
- {
- RefreshServersView();
- }));
-
- RefreshServersMenu();
- }
-
- ///
- /// 初始化服务器列表
- ///
- private void InitServersView()
- {
- lvServers.BeginUpdate();
- lvServers.Items.Clear();
-
- lvServers.GridLines = true;
- lvServers.FullRowSelect = true;
- lvServers.View = View.Details;
- lvServers.Scrollable = true;
- lvServers.MultiSelect = true;
- lvServers.HeaderStyle = ColumnHeaderStyle.Clickable;
- lvServers.RegisterDragEvent(UpdateDragEventHandler);
-
- lvServers.Columns.Add("", 30);
- lvServers.Columns.Add(ResUI.LvServiceType, 80);
- lvServers.Columns.Add(ResUI.LvAlias, 100);
- lvServers.Columns.Add(ResUI.LvAddress, 120);
- lvServers.Columns.Add(ResUI.LvPort, 100);
- lvServers.Columns.Add(ResUI.LvEncryptionMethod, 120);
- lvServers.Columns.Add(ResUI.LvTransportProtocol, 120);
- lvServers.Columns.Add(ResUI.LvTLS, 100);
- lvServers.Columns.Add(ResUI.LvSubscription, 100);
- lvServers.Columns.Add(ResUI.LvTestResults, 120, HorizontalAlignment.Right);
-
- if (statistics != null && statistics.Enable)
- {
- lvServers.Columns.Add(ResUI.LvTodayDownloadDataAmount, 70);
- lvServers.Columns.Add(ResUI.LvTodayUploadDataAmount, 70);
- lvServers.Columns.Add(ResUI.LvTotalDownloadDataAmount, 70);
- lvServers.Columns.Add(ResUI.LvTotalUploadDataAmount, 70);
- }
- lvServers.EndUpdate();
- }
-
- private void UpdateDragEventHandler(int index, int targetIndex)
- {
- if (index < 0 || targetIndex < 0)
- {
- return;
- }
- if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, EMove.Position, targetIndex) == 0)
- {
- RefreshServers();
- }
- }
-
- ///
- /// 刷新服务器列表
- ///
- private void RefreshServersView()
- {
- int index = GetLvSelectedIndex(false);
-
- lvServers.BeginUpdate();
- lvServers.Items.Clear();
-
- for (int k = 0; k < lstVmess.Count; k++)
- {
- string def = (k + 1).ToString();
- VmessItem item = lstVmess[k];
- if (config.IsActiveNode(item))
- {
- def = Global.CheckMark;
- }
-
- ListViewItem lvItem = new ListViewItem(def);
- Utils.AddSubItem(lvItem, EServerColName.configType.ToString(), (item.configType).ToString());
- Utils.AddSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks);
- Utils.AddSubItem(lvItem, EServerColName.address.ToString(), item.address);
- Utils.AddSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString());
- Utils.AddSubItem(lvItem, EServerColName.security.ToString(), item.security);
- Utils.AddSubItem(lvItem, EServerColName.network.ToString(), item.network);
- Utils.AddSubItem(lvItem, EServerColName.streamSecurity.ToString(), item.streamSecurity);
- Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.GetSubRemarks(config));
- Utils.AddSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult);
-
- if (statistics != null && statistics.Enable)
- {
- string totalUp = string.Empty,
- totalDown = string.Empty,
- todayUp = string.Empty,
- todayDown = string.Empty;
- ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.indexId);
- if (sItem != null)
- {
- totalUp = Utils.HumanFy(sItem.totalUp);
- totalDown = Utils.HumanFy(sItem.totalDown);
- todayUp = Utils.HumanFy(sItem.todayUp);
- todayDown = Utils.HumanFy(sItem.todayDown);
- }
-
- Utils.AddSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown);
- Utils.AddSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp);
- Utils.AddSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown);
- Utils.AddSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp);
- }
-
- if (k % 2 == 1) // 隔行着色
- {
- lvItem.BackColor = Color.WhiteSmoke;
- }
- if (config.IsActiveNode(item))
- {
- //lvItem.Checked = true;
- lvItem.ForeColor = Color.DodgerBlue;
- lvItem.Font = new Font(lvItem.Font, FontStyle.Bold);
- }
-
- if (lvItem != null) lvServers.Items.Add(lvItem);
- }
- lvServers.EndUpdate();
-
- if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0)
- {
- lvServers.Items[index].Selected = true;
- lvServers.SetScrollPosition(index);
- }
- }
-
- ///
- /// 刷新托盘服务器菜单
- ///
- private void RefreshServersMenu()
- {
- menuServers.DropDownItems.Clear();
-
- if (lstVmess.Count > config.trayMenuServersLimit)
- {
- menuServers.DropDownItems.Add(new ToolStripMenuItem(ResUI.TooManyServersTip));
- return;
- }
-
- List lst = new List();
- for (int k = 0; k < lstVmess.Count; k++)
- {
- VmessItem item = lstVmess[k];
- string name = item.GetSummary();
-
- ToolStripMenuItem ts = new ToolStripMenuItem(name)
- {
- Tag = k
- };
- if (config.IsActiveNode(item))
- {
- ts.Checked = true;
- }
- ts.Click += ts_Click;
- lst.Add(ts);
- }
- menuServers.DropDownItems.AddRange(lst.ToArray());
- menuServers.Visible = true;
- }
-
- private void ts_Click(object sender, EventArgs e)
- {
- try
- {
- ToolStripItem ts = (ToolStripItem)sender;
- int index = Utils.ToInt(ts.Tag);
- SetDefaultServer(index);
- }
- catch
- {
- }
- }
-
- private void lvServers_SelectedIndexChanged(object sender, EventArgs e)
- {
- }
-
-
- private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e)
- {
- if (e.Column < 0)
- {
- return;
- }
-
- try
- {
- if ((EServerColName)e.Column == EServerColName.def)
- {
- foreach (ColumnHeader it in lvServers.Columns)
- {
- it.Width = -2;
- }
- return;
- }
-
- var tag = lvServers.Columns[e.Column].Tag?.ToString();
- bool asc = Utils.IsNullOrEmpty(tag) || !Convert.ToBoolean(tag);
- if (ConfigHandler.SortServers(ref config, ref lstVmess, (EServerColName)e.Column, asc) != 0)
- {
- return;
- }
- lvServers.Columns[e.Column].Tag = Convert.ToString(asc);
- RefreshServers();
- }
- catch (Exception ex)
- {
- Utils.SaveLog(ex.Message, ex);
- }
-
- if (e.Column < 0)
- {
- return;
- }
-
- }
-
- private void InitGroupView()
- {
- tabGroup.TabPages.Clear();
-
- string title = $" {ResUI.AllGroupServers} ";
- var tabPage = new TabPage(title);
- tabPage.Name = "";
- tabGroup.TabPages.Add(tabPage);
-
- foreach (var item in config.groupItem.OrderBy(t => t.sort))
- {
- var tabPage2 = new TabPage($" {item.remarks} ");
- tabPage2.Name = item.id;
- tabGroup.TabPages.Add(tabPage2);
- }
-
- tabGroup.SelectedIndex = 0;
-
- //menuMoveToGroup
- menuMoveToGroup.DropDownItems.Clear();
-
- List lst = new List();
- foreach (var item in config.groupItem)
- {
- string name = item.remarks;
-
- ToolStripMenuItem ts = new ToolStripMenuItem(name)
- {
- Tag = item.id,
- };
- ts.Click += ts_Group_Click;
- lst.Add(ts);
- }
- menuMoveToGroup.DropDownItems.AddRange(lst.ToArray());
- }
-
- private void tabGroup_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (tabGroup.SelectedIndex < 0)
- {
- return;
- }
- _groupId = string.Empty;
- //groupId = tabGroup.TabPages[tabGroup.SelectedIndex].Name;
- _groupId = tabGroup.SelectedTab.Name;
-
- RefreshServers();
-
- lvServers.Focus();
- }
-
- private void ts_Group_Click(object sender, EventArgs e)
- {
- try
- {
- ToolStripItem ts = (ToolStripItem)sender;
- var groupIdSelected = Utils.ToString(ts.Tag);
-
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
-
- if (ConfigHandler.MoveServerToGroup(config, lstSelecteds, groupIdSelected) == 0)
- {
- RefreshServers();
- }
- }
- catch
- {
- }
- }
- #endregion
-
- #region v2ray 操作
- ///
- /// 载入V2ray
- ///
- async Task LoadV2ray()
- {
- BeginInvoke(new Action(() =>
- {
- tsbReload.Enabled = false;
- }));
-
- if (Global.reloadV2ray)
- {
- mainMsgControl.ClearMsg();
- }
- await Task.Run(() =>
- {
- v2rayHandler.LoadV2ray(config);
- });
-
- Global.reloadV2ray = false;
- ConfigHandler.SaveConfig(ref config, false);
- statistics?.SaveToFile();
-
- ChangePACButtonStatus(config.sysProxyType);
-
- BeginInvoke(new Action(() =>
- {
- tsbReload.Enabled = true;
- }));
- }
-
- ///
- /// 关闭V2ray
- ///
- private void CloseV2ray()
- {
- ConfigHandler.SaveConfig(ref config, false);
- statistics?.SaveToFile();
-
- ChangePACButtonStatus(ESysProxyType.ForcedClear);
-
- v2rayHandler.V2rayStop();
- }
-
- #endregion
-
- #region 功能按钮
-
- private void lvServers_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex(false);
- if (index < 0)
- {
- return;
- }
- qrCodeControl.showQRCode(lstVmess[index]);
- }
-
- private void lvServers_DoubleClick(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- ShowServerForm(lstVmess[index].configType, index);
- }
- private void ShowServerForm(EConfigType configType, int index)
- {
- BaseServerForm fm;
- if (configType == EConfigType.Custom)
- {
- fm = new AddServer2Form();
- }
- else
- {
- fm = new AddServerForm();
- }
- fm.vmessItem = index >= 0 ? lstVmess[index] : null;
- fm.groupId = _groupId;
- fm.eConfigType = configType;
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshServers();
- _ = LoadV2ray();
- }
- }
-
-
- private void lvServers_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.Control)
- {
- switch (e.KeyCode)
- {
- case Keys.A:
- menuSelectAll_Click(null, null);
- break;
- case Keys.C:
- menuExport2ShareUrl_Click(null, null);
- break;
- case Keys.V:
- menuAddServers_Click(null, null);
- break;
- case Keys.P:
- menuPingServer_Click(null, null);
- break;
- case Keys.O:
- menuTcpingServer_Click(null, null);
- break;
- case Keys.R:
- menuRealPingServer_Click(null, null);
- break;
- case Keys.S:
- menuScanScreen_Click(null, null);
- break;
- case Keys.T:
- menuSpeedServer_Click(null, null);
- break;
- case Keys.F:
- menuServerFilter_Click(null, null);
- break;
- case Keys.E:
- menuSortServerResult_Click(null, null);
- break;
- }
- }
- else
- {
- switch (e.KeyCode)
- {
- case Keys.Enter:
- menuSetDefaultServer_Click(null, null);
- break;
- case Keys.Delete:
- menuRemoveServer_Click(null, null);
- break;
- case Keys.T:
- menuMoveTop_Click(null, null);
- break;
- case Keys.B:
- menuMoveBottom_Click(null, null);
- break;
- case Keys.U:
- menuMoveUp_Click(null, null);
- break;
- case Keys.D:
- menuMoveDown_Click(null, null);
- break;
- }
- }
- }
-
- private void menuAddVmessServer_Click(object sender, EventArgs e)
- {
- ShowServerForm(EConfigType.VMess, -1);
- }
-
- private void menuAddVlessServer_Click(object sender, EventArgs e)
- {
- ShowServerForm(EConfigType.VLESS, -1);
- }
-
- private void menuRemoveServer_Click(object sender, EventArgs e)
- {
-
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- if (UI.ShowYesNo(ResUI.RemoveServer) == DialogResult.No)
- {
- return;
- }
-
- ConfigHandler.RemoveServer(config, lstSelecteds);
-
- RefreshServers();
- _ = LoadV2ray();
- }
-
- private void menuRemoveDuplicateServer_Click(object sender, EventArgs e)
- {
- int oldCount = lstVmess.Count;
- int newCount = ConfigHandler.DedupServerList(ref config, ref lstVmess);
- RefreshServers();
- _ = LoadV2ray();
- UI.Show(string.Format(ResUI.RemoveDuplicateServerResult, oldCount, newCount));
- }
-
- private void menuCopyServer_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- if (ConfigHandler.CopyServer(ref config, lstSelecteds) == 0)
- {
- RefreshServers();
- }
- }
-
- private void menuSetDefaultServer_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- SetDefaultServer(index);
- }
-
- private void menuServerFilter_Click(object sender, EventArgs e)
- {
- var fm = new MsgFilterSetForm();
- fm.MsgFilter = serverFilter;
- if (fm.ShowDialog() == DialogResult.OK)
- {
- serverFilter = fm.MsgFilter;
- gbServers.Text = string.Format(ResUI.MsgServerTitle, serverFilter);
- RefreshServers();
- }
- }
-
- private void menuPingServer_Click(object sender, EventArgs e)
- {
- Speedtest(ESpeedActionType.Ping);
- }
- private void menuTcpingServer_Click(object sender, EventArgs e)
- {
- Speedtest(ESpeedActionType.Tcping);
- }
-
- private void menuRealPingServer_Click(object sender, EventArgs e)
- {
- //if (!config.sysAgentEnabled)
- //{
- // UI.Show(ResUI.NeedHttpGlobalProxy"));
- // return;
- //}
-
- //UI.Show(ResUI.SpeedServerTips"));
-
- Speedtest(ESpeedActionType.Realping);
- }
-
- private void menuSpeedServer_Click(object sender, EventArgs e)
- {
- //if (!config.sysAgentEnabled)
- //{
- // UI.Show(ResUI.NeedHttpGlobalProxy"));
- // return;
- //}
-
- //UI.Show(ResUI.SpeedServerTips"));
-
- Speedtest(ESpeedActionType.Speedtest);
- }
- private void Speedtest(ESpeedActionType actionType)
- {
- if (GetLvSelectedIndex() < 0) return;
- ClearTestResult();
- SpeedtestHandler statistics = new SpeedtestHandler(config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler);
- }
- private void menuSortServerResult_Click(object sender, EventArgs e)
- {
- lvServers_ColumnClick(null, new ColumnClickEventArgs((int)EServerColName.testResult));
- }
-
- private void tsbTestMe_Click(object sender, EventArgs e)
- {
- var updateHandle = new UpdateHandle();
- updateHandle.RunAvailabilityCheck(UpdateTaskHandler);
- }
-
- private void menuClearStatistic_Click(object sender, EventArgs e)
- {
- if (statistics != null)
- {
- statistics.ClearAllServerStatistics();
- RefreshServers();
- }
- }
-
- private void menuExport2ClientConfig_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- MainFormHandler.Instance.Export2ClientConfig(lstVmess[index], config);
- }
-
- private void menuExport2ServerConfig_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- MainFormHandler.Instance.Export2ServerConfig(lstVmess[index], config);
- }
-
- private void menuExport2ShareUrl_Click(object sender, EventArgs e)
- {
- GetLvSelectedIndex();
-
- StringBuilder sb = new StringBuilder();
- foreach (var it in lstSelecteds)
- {
- string url = ShareHandler.GetShareUrl(it);
- if (Utils.IsNullOrEmpty(url))
- {
- continue;
- }
- sb.Append(url);
- sb.AppendLine();
- }
- if (sb.Length > 0)
- {
- Utils.SetClipboardData(sb.ToString());
- AppendText(false, ResUI.BatchExportURLSuccessfully);
- //UI.Show(ResUI.BatchExportURLSuccessfully"));
- }
- }
-
- private void menuExport2SubContent_Click(object sender, EventArgs e)
- {
- GetLvSelectedIndex();
-
- StringBuilder sb = new StringBuilder();
- foreach (var it in lstSelecteds)
- {
- string url = ShareHandler.GetShareUrl(it);
- if (Utils.IsNullOrEmpty(url))
- {
- continue;
- }
- sb.Append(url);
- sb.AppendLine();
- }
- if (sb.Length > 0)
- {
- Utils.SetClipboardData(Utils.Base64Encode(sb.ToString()));
- UI.Show(ResUI.BatchExportSubscriptionSuccessfully);
- }
- }
-
- private void tsbOptionSetting_Click(object sender, EventArgs e)
- {
- OptionSettingForm fm = new OptionSettingForm();
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshServers();
- _ = LoadV2ray();
- }
- }
-
- private void tsbRoutingSetting_Click(object sender, EventArgs e)
- {
- var fm = new RoutingSettingForm();
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshRoutingsMenu();
- RefreshServers();
- _ = LoadV2ray();
- }
- }
-
- private void tsbGlobalHotkeySetting_Click(object sender, EventArgs e)
- {
- var fm = new GlobalHotkeySettingForm();
- if (fm.ShowDialog() == DialogResult.OK)
- {
- //RefreshRoutingsMenu();
- //RefreshServers();
- //_ = LoadV2ray();
- }
-
- }
-
- private void tsbGroupSetting_Click(object sender, EventArgs e)
- {
- var fm = new GroupSettingForm();
- if (fm.ShowDialog() == DialogResult.OK)
- {
- InitGroupView();
- RefreshServers();
- }
-
- }
-
- private void tsbReload_Click(object sender, EventArgs e)
- {
- Global.reloadV2ray = true;
- _ = LoadV2ray();
- }
-
- private void tsbClose_Click(object sender, EventArgs e)
- {
- StorageUI();
- HideForm();
- //this.WindowState = FormWindowState.Minimized;
- }
-
- ///
- /// 设置活动服务器
- ///
- ///
- ///
- private int SetDefaultServer(int index)
- {
- if (index < 0)
- {
- UI.Show(ResUI.PleaseSelectServer);
- return -1;
- }
- if (ConfigHandler.SetDefaultServer(ref config, lstVmess[index]) == 0)
- {
- //RefreshServers();
- for (int k = 0; k < lstVmess.Count; k++)
- {
- if (config.IsActiveNode(lstVmess[k]))
- {
- lvServers.Items[k].SubItems[0].Text = Global.CheckMark;
- lvServers.Items[k].ForeColor = Color.DodgerBlue;
- lvServers.Items[k].Font = new Font(lvServers.Font, FontStyle.Bold);
- }
- else
- {
- lvServers.Items[k].SubItems[0].Text = (k + 1).ToString();
- lvServers.Items[k].ForeColor = lvServers.ForeColor;
- lvServers.Items[k].Font = new Font(lvServers.Font, FontStyle.Regular);
- }
- }
- RefreshServersMenu();
- _ = LoadV2ray();
- }
- return 0;
- }
-
- ///
- /// 取得ListView选中的行
- ///
- ///
- private int GetLvSelectedIndex(bool show = true)
- {
- int index = -1;
- lstSelecteds.Clear();
- try
- {
- if (lvServers.SelectedIndices.Count <= 0)
- {
- if (show)
- {
- UI.Show(ResUI.PleaseSelectServer);
- }
- return index;
- }
-
- index = lvServers.SelectedIndices[0];
- foreach (int i in lvServers.SelectedIndices)
- {
- lstSelecteds.Add(lstVmess[i]);
- }
- return index;
- }
- catch
- {
- return index;
- }
- }
-
- private void menuAddCustomServer_Click(object sender, EventArgs e)
- {
- ShowServerForm(EConfigType.Custom, -1);
- }
-
- private void menuAddShadowsocksServer_Click(object sender, EventArgs e)
- {
- ShowServerForm(EConfigType.Shadowsocks, -1);
- ShowForm();
- }
-
- private void menuAddSocksServer_Click(object sender, EventArgs e)
- {
- ShowServerForm(EConfigType.Socks, -1);
- ShowForm();
- }
-
- private void menuAddTrojanServer_Click(object sender, EventArgs e)
- {
- ShowServerForm(EConfigType.Trojan, -1);
- ShowForm();
- }
-
- private void menuAddServers_Click(object sender, EventArgs e)
- {
- string clipboardData = Utils.GetClipboardData();
- int ret = ConfigHandler.AddBatchServers(ref config, clipboardData, "", _groupId);
- if (ret > 0)
- {
- RefreshServers();
- UI.Show(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret));
- }
- }
-
- private void menuScanScreen_Click(object sender, EventArgs e)
- {
- _ = ScanScreenTaskAsync();
- }
-
- public async Task ScanScreenTaskAsync()
- {
- HideForm();
-
- string result = await Task.Run(() =>
- {
- return Utils.ScanScreen();
- });
-
- ShowForm();
-
- if (Utils.IsNullOrEmpty(result))
- {
- UI.ShowWarning(ResUI.NoValidQRcodeFound);
- }
- else
- {
- int ret = ConfigHandler.AddBatchServers(ref config, result, "", _groupId);
- if (ret > 0)
- {
- RefreshServers();
- UI.Show(ResUI.SuccessfullyImportedServerViaScan);
- }
- }
- }
-
- private void menuUpdateSubscriptions_Click(object sender, EventArgs e)
- {
- UpdateSubscriptionProcess("", false);
- }
- private void menuUpdateSubViaProxy_Click(object sender, EventArgs e)
- {
- UpdateSubscriptionProcess("", true);
- }
-
- private void tsbBackupGuiNConfig_Click(object sender, EventArgs e)
- {
- MainFormHandler.Instance.BackupGuiNConfig(config);
- }
-
- private void tsbRestoreGuiNConfig_Click(object sender, EventArgs e)
- {
- if (MainFormHandler.Instance.RestoreGuiNConfig(ref config))
- {
- RefreshServers();
- }
- }
- #endregion
-
-
- #region 提示信息
-
- ///
- /// 消息委托
- ///
- ///
- ///
- void v2rayHandler_ProcessEvent(bool notify, string msg)
- {
- AppendText(notify, msg);
- }
-
- void AppendText(bool notify, string msg)
- {
- try
- {
- mainMsgControl.AppendText(msg);
- if (notify)
- {
- notifyMsg(msg);
- }
- }
- catch { }
- }
-
- ///
- /// 托盘信息
- ///
- ///
- private void notifyMsg(string msg)
- {
- notifyMain.Text = (msg.Length <= 63 ? msg : msg.Substring(1, 63));
- }
-
- #endregion
-
-
- #region 托盘事件
-
- private void notifyMain_MouseClick(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left)
- {
- ShowForm();
- }
- }
-
- private void menuExit_Click(object sender, EventArgs e)
- {
- Visible = false;
- Close();
-
- Application.Exit();
- }
-
-
- private void ShowForm()
- {
- Show();
- if (WindowState == FormWindowState.Minimized)
- {
- WindowState = FormWindowState.Normal;
- }
- Activate();
- ShowInTaskbar = true;
- //this.notifyIcon1.Visible = false;
- mainMsgControl.ScrollToCaret();
-
- int index = GetLvSelectedIndex(false);
- if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0)
- {
- lvServers.Items[index].Selected = true;
- lvServers.SetScrollPosition(index);
- }
-
- SetVisibleCore(true);
- }
-
- private void HideForm()
- {
- //this.WindowState = FormWindowState.Minimized;
- Hide();
- //this.notifyMain.Icon = this.Icon;
- notifyMain.Visible = true;
- ShowInTaskbar = false;
-
- SetVisibleCore(false);
-
- //write Handle to reg
- if (IsHandleCreated)
- {
- Utils.RegWriteValue(Global.MyRegPath, Utils.WindowHwndKey, Convert.ToString((long)Handle));
- }
- }
-
- #endregion
-
- #region 后台测速
- private void SetTestResult(string indexId, string txt)
- {
- int k = lstVmess.FindIndex(it => it.indexId == indexId);
- if (k >= 0 && k < lvServers.Items.Count)
- {
- lstVmess[k].testResult = txt;
- lvServers.Items[k].SubItems["testResult"].Text = txt;
- }
- else
- {
- AppendText(false, txt);
- }
- }
- private void SetTestResult(int k, string txt)
- {
- if (k < lvServers.Items.Count)
- {
- lstVmess[k].testResult = txt;
- lvServers.Items[k].SubItems["testResult"].Text = txt;
- }
- }
- private void ClearTestResult()
- {
- foreach (var it in lstSelecteds)
- {
- SetTestResult(it.indexId, "");
- }
- }
- private void UpdateSpeedtestHandler(string indexId, string msg)
- {
- lvServers.Invoke((MethodInvoker)delegate
- {
- SetTestResult(indexId, msg);
- });
- }
-
- private void UpdateStatisticsHandler(ulong up, ulong down, List statistics)
- {
- try
- {
- up /= (ulong)(config.statisticsFreshRate);
- down /= (ulong)(config.statisticsFreshRate);
- mainMsgControl.SetToolSslInfo("speed", string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)));
-
- foreach (var it in statistics)
- {
- int index = lstVmess.FindIndex(item => item.indexId == it.itemId);
- if (index < 0)
- {
- continue;
- }
- lvServers.Invoke((MethodInvoker)delegate
- {
- lvServers.BeginUpdate();
-
- lvServers.Items[index].SubItems["todayDown"].Text = Utils.HumanFy(it.todayDown);
- lvServers.Items[index].SubItems["todayUp"].Text = Utils.HumanFy(it.todayUp);
- lvServers.Items[index].SubItems["totalDown"].Text = Utils.HumanFy(it.totalDown);
- lvServers.Items[index].SubItems["totalUp"].Text = Utils.HumanFy(it.totalUp);
-
- lvServers.EndUpdate();
- });
- }
-
- }
- catch (Exception ex)
- {
- Utils.SaveLog(ex.Message, ex);
- }
- }
-
- private async void UpdateTaskHandler(bool success, string msg)
- {
- AppendText(false, msg);
- if (success)
- {
- RefreshServers();
- Global.reloadV2ray = true;
- await LoadV2ray();
- }
- }
- #endregion
-
- #region 移动服务器
-
- private void menuMoveTop_Click(object sender, EventArgs e)
- {
- MoveServer(EMove.Top);
- }
-
- private void menuMoveUp_Click(object sender, EventArgs e)
- {
- MoveServer(EMove.Up);
- }
-
- private void menuMoveDown_Click(object sender, EventArgs e)
- {
- MoveServer(EMove.Down);
- }
-
- private void menuMoveBottom_Click(object sender, EventArgs e)
- {
- MoveServer(EMove.Bottom);
- }
-
- private void MoveServer(EMove eMove)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, eMove) == 0)
- {
- //TODO: reload is not good.
- RefreshServers();
- //LoadV2ray();
- }
- }
- private void menuSelectAll_Click(object sender, EventArgs e)
- {
- foreach (ListViewItem item in lvServers.Items)
- {
- item.Selected = true;
- }
- }
- private void menuMoveToGroup_Click(object sender, EventArgs e)
- {
- }
- #endregion
-
- #region 系统代理相关
- private void menuKeepClear_Click(object sender, EventArgs e)
- {
- SetListenerType(ESysProxyType.ForcedClear);
- }
- private void menuGlobal_Click(object sender, EventArgs e)
- {
- SetListenerType(ESysProxyType.ForcedChange);
- }
-
- private void menuKeepNothing_Click(object sender, EventArgs e)
- {
- SetListenerType(ESysProxyType.Unchanged);
- }
- private void SetListenerType(ESysProxyType type)
- {
- config.sysProxyType = type;
- ChangePACButtonStatus(type);
- }
-
- private void ChangePACButtonStatus(ESysProxyType type)
- {
- SysProxyHandle.UpdateSysProxy(config, false);
-
- for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++)
- {
- ToolStripMenuItem item = ((ToolStripMenuItem)menuSysAgentMode.DropDownItems[k]);
- item.Checked = ((int)type == k);
- }
-
- ConfigHandler.SaveConfig(ref config, false);
-
- mainMsgControl.DisplayToolStatus(config);
-
- BeginInvoke(new Action(() =>
- {
- notifyMain.Icon = Icon = MainFormHandler.Instance.GetNotifyIcon(config, Icon);
- }));
- }
-
- #endregion
-
-
- #region CheckUpdate
-
- private void tsbCheckUpdateN_Click(object sender, EventArgs e)
- {
- Process.Start(Global.UpdateUrl);
-
- //void _updateUI(bool success, string msg)
- //{
- // AppendText(false, msg);
- // if (success)
- // {
- // menuExit_Click(null, null);
- // }
- //};
- //(new UpdateHandle()).CheckUpdateGuiN(config, _updateUI, config.checkPreReleaseUpdate);
- }
-
- private void tsbCheckUpdateCore_Click(object sender, EventArgs e)
- {
- CheckUpdateCore(ECoreType.v2fly_v5);
- }
-
- private void tsbCheckUpdateSagerNetCore_Click(object sender, EventArgs e)
- {
- CheckUpdateCore(ECoreType.SagerNet);
- }
-
- private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e)
- {
- CheckUpdateCore(ECoreType.Xray);
- }
-
- private void tsbCheckUpdateClashCore_Click(object sender, EventArgs e)
- {
- CheckUpdateCore(ECoreType.clash);
- }
-
- private void tsbCheckUpdateClashMetaCore_Click(object sender, EventArgs e)
- {
- CheckUpdateCore(ECoreType.clash_meta);
- }
-
- private void CheckUpdateCore(ECoreType type)
- {
- void _updateUI(bool success, string msg)
- {
- AppendText(false, msg);
- if (success)
- {
- CloseV2ray();
-
- string fileName = Utils.GetPath(Utils.GetDownloadFileName(msg));
- FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : "");
-
- AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfullyMore);
-
- Global.reloadV2ray = true;
- _ = LoadV2ray();
-
- AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfully);
- }
- };
- (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI, config.checkPreReleaseUpdate);
- }
-
- private void tsbCheckUpdateGeo_Click(object sender, EventArgs e)
- {
- Task.Run(() =>
- {
- var updateHandle = new UpdateHandle();
- updateHandle.UpdateGeoFile("geosite", config, UpdateTaskHandler);
- updateHandle.UpdateGeoFile("geoip", config, UpdateTaskHandler);
- });
- }
-
- #endregion
-
- #region Help
-
-
- private void tsbAbout_Click(object sender, EventArgs e)
- {
- Process.Start(Global.AboutUrl);
- }
-
- private void tsbV2rayWebsite_Click(object sender, EventArgs e)
- {
- Process.Start(Global.v2rayWebsiteUrl);
- }
-
- private void tsbPromotion_Click(object sender, EventArgs e)
- {
- Process.Start($"{Utils.Base64Decode(Global.PromotionUrl)}?t={DateTime.Now.Ticks}");
- }
- #endregion
-
- #region 订阅
- private void tsbSubSetting_Click(object sender, EventArgs e)
- {
- SubSettingForm fm = new SubSettingForm();
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshServers();
- }
- }
-
- private void tsbSubUpdate_Click(object sender, EventArgs e)
- {
- UpdateSubscriptionProcess("", false);
- }
-
- private void tsbSubUpdateViaProxy_Click(object sender, EventArgs e)
- {
- UpdateSubscriptionProcess("", true);
- }
- private void tsbSubGroupUpdate_Click(object sender, EventArgs e)
- {
- UpdateSubscriptionProcess(_groupId, true);
- }
-
- private void tsbSubGroupUpdateViaProxy_Click(object sender, EventArgs e)
- {
- UpdateSubscriptionProcess(_groupId, true);
- }
-
- ///
- /// the subscription update process
- ///
- private void UpdateSubscriptionProcess(string groupId, bool blProxy)
- {
- void _updateUI(bool success, string msg)
- {
- AppendText(false, msg);
- if (success)
- {
- RefreshServers();
- if (config.uiItem.enableAutoAdjustMainLvColWidth)
- {
- foreach (ColumnHeader it in lvServers.Columns)
- {
- it.Width = -2;
- }
- }
- }
- };
-
- (new UpdateHandle()).UpdateSubscriptionProcess(config, groupId, blProxy, _updateUI);
- }
-
- private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e)
- {
- bool bShow = tsbQRCodeSwitch.Checked;
- scServers.Panel2Collapsed = !bShow;
- }
- #endregion
-
- #region Language
-
- private void tsbLanguageDef_Click(object sender, EventArgs e)
- {
- SetCurrentLanguage("en");
- }
-
- private void tsbLanguageZhHans_Click(object sender, EventArgs e)
- {
- SetCurrentLanguage("zh-Hans");
- }
- private void SetCurrentLanguage(string value)
- {
- Utils.RegWriteValue(Global.MyRegPath, Global.MyRegKeyLanguage, value);
- //Application.Restart();
- }
-
- #endregion
-
-
- #region RoutingsMenu
-
- ///
- ///
- ///
- private void RefreshRoutingsMenu()
- {
- menuRoutings.Visible = config.enableRoutingAdvanced;
- if (!config.enableRoutingAdvanced)
- {
- mainMsgControl.SetToolSslInfo("routing", string.Empty);
- return;
- }
-
- menuRoutings.DropDownItems.Clear();
-
- List lst = new List();
- for (int k = 0; k < config.routings.Count; k++)
- {
- var item = config.routings[k];
- if (item.locked == true)
- {
- continue;
- }
- string name = item.remarks;
-
- ToolStripMenuItem ts = new ToolStripMenuItem(name)
- {
- Tag = k
- };
- if (config.routingIndex.Equals(k))
- {
- ts.Checked = true;
- mainMsgControl.SetToolSslInfo("routing", item.remarks);
- }
- ts.Click += ts_Routing_Click;
- lst.Add(ts);
- }
- menuRoutings.DropDownItems.AddRange(lst.ToArray());
- }
-
- private void ts_Routing_Click(object sender, EventArgs e)
- {
- try
- {
- ToolStripItem ts = (ToolStripItem)sender;
- int index = Utils.ToInt(ts.Tag);
-
- if (ConfigHandler.SetDefaultRouting(ref config, index) == 0)
- {
- RefreshRoutingsMenu();
- _ = LoadV2ray();
- }
- }
- catch
- {
- }
- }
- #endregion
-
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx
deleted file mode 100644
index 7e89ef32..00000000
--- a/v2rayN/v2rayN/Forms/MainForm.resx
+++ /dev/null
@@ -1,1568 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- Fill
-
-
-
- 3, 21
-
-
- 226, 19
-
-
- 423, 24
-
-
- Add [VMess] server
-
-
- 423, 24
-
-
- Add [VLESS] server
-
-
- 423, 24
-
-
- Add [Shadowsocks] server
-
-
- 423, 24
-
-
- Add [Socks] server
-
-
- 423, 24
-
-
- Add [Trojan] server
-
-
- 423, 24
-
-
- Add a custom configuration server
-
-
- 423, 24
-
-
- Import bulk URL from clipboard (Ctrl+V)
-
-
- 423, 24
-
-
- Scan QR code on the screen (Ctrl+S)
-
-
- 420, 6
-
-
- 423, 24
-
-
- Set server filter (Ctrl+F)
-
-
- 423, 24
-
-
- Remove selected servers (Delete)
-
-
- 423, 24
-
-
- Remove duplicate servers
-
-
- 423, 24
-
-
- Clone selected server
-
-
- 423, 24
-
-
- Set as active server (Enter)
-
-
- 420, 6
-
-
- 423, 24
-
-
- Move to Group
-
-
- 237, 26
-
-
- Move to top (T)
-
-
- 237, 26
-
-
- Up (U)
-
-
- 237, 26
-
-
- Down (D)
-
-
- 237, 26
-
-
- Move to bottom (B)
-
-
- 423, 24
-
-
- Move to
-
-
- 423, 24
-
-
- Select All (Ctrl+A)
-
-
- 420, 6
-
-
- 423, 24
-
-
- Test servers ping (Ctrl+P)
-
-
- 423, 24
-
-
- Test servers with tcping (Ctrl+O)
-
-
- 423, 24
-
-
- Test servers real delay (Ctrl+R)
-
-
- 423, 24
-
-
- Test servers download speed (Ctrl+T)
-
-
- 423, 24
-
-
- Sort by test result (Ctrl+E)
-
-
- 423, 24
-
-
- Test current service status
-
-
- 423, 24
-
-
- Clear all service statistics
-
-
- 420, 6
-
-
- 423, 24
-
-
- Export selected server for client configuration
-
-
- 423, 24
-
-
- Export selected server for server configuration
-
-
- 423, 24
-
-
- Export share URLs to clipboard (Ctrl+C)
-
-
- 423, 24
-
-
- Export subscription (base64) share to clipboard
-
-
- Magenta
-
-
- 77, 56
-
-
- Servers
-
-
- ImageAboveText
-
-
- 424, 676
-
-
- cmsLv
-
-
- System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Fill
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
- 0, 24
-
-
- 1003, 334
-
-
-
- 0
-
-
- lvServers
-
-
- v2rayN.Base.ListViewFlickerFree, v2rayN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- scServers.Panel1
-
-
- 0
-
-
- Top
-
-
- 0, 0
-
-
- 1003, 24
-
-
- 0
-
-
- tabGroup
-
-
- System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- scServers.Panel1
-
-
- 1
-
-
- scServers.Panel1
-
-
- System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- scServers
-
-
- 0
-
-
- Fill
-
-
- 0, 0
-
-
- 4, 4, 4, 4
-
-
- 256, 358
-
-
- 2
-
-
- qrCodeControl
-
-
- v2rayN.Forms.QRCodeControl, v2rayN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- scServers.Panel2
-
-
- 0
-
-
- scServers.Panel2
-
-
- System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- scServers
-
-
- 1
-
-
- 100
-
-
- 1263, 358
-
-
- 1003
-
-
- 0
-
-
- scServers
-
-
- System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- gbServers
-
-
- 0
-
-
- Fill
-
-
- 0, 69
-
-
- Horizontal
-
-
- Fill
-
-
- 0, 0
-
-
- 1269, 382
-
-
- 0
-
-
- gbServers
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- scBig.Panel1
-
-
- 0
-
-
- scBig.Panel1
-
-
- System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- scBig
-
-
- 0
-
-
- Fill
-
-
- 0, 0
-
-
- 4, 4, 4, 4
-
-
- 1269, 286
-
-
- 0
-
-
- mainMsgControl
-
-
- v2rayN.Forms.MainMsgControl, v2rayN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- scBig.Panel2
-
-
- 0
-
-
- scBig.Panel2
-
-
- System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- scBig
-
-
- 1
-
-
- 1269, 672
-
-
- 382
-
-
- 5
-
-
- scBig
-
-
- System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 2
-
-
- 17, 17
-
-
- 137, 17
-
-
- NoControl
-
-
- 300, 26
-
-
- Clear system proxy
-
-
- 300, 26
-
-
- Set system proxy
-
-
- 300, 26
-
-
- Do not change system proxy
-
-
- 332, 24
-
-
- System proxy
-
-
- 332, 24
-
-
- Routing
-
-
- 332, 24
-
-
- Server
-
-
- 329, 6
-
-
- 332, 24
-
-
- Import bulk URL from clipboard
-
-
- 332, 24
-
-
- Scan QR code on the screen
-
-
- 332, 24
-
-
- Update subscription without proxy
-
-
- 332, 24
-
-
- Update subscriptions via proxy
-
-
- 329, 6
-
-
- 332, 24
-
-
- Exit
-
-
- 333, 208
-
-
- cmsMain
-
-
- System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- v2rayN
-
-
- True
-
-
- Top
-
-
- 0, 59
-
-
- 1269, 10
-
-
- 2
-
-
- panel1
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 3
-
-
- 315, 17
-
-
- 6, 59
-
-
- 395, 26
-
-
- Settings
-
-
- 395, 26
-
-
- Update subscription without proxy
-
-
- 395, 26
-
-
- Update subscription with proxy
-
-
- 395, 26
-
-
- Update group subscription without proxy
-
-
- 395, 26
-
-
- Update group subscription with proxy
-
-
- Magenta
-
-
- 122, 56
-
-
- Subscriptions
-
-
- ImageAboveText
-
-
- Magenta
-
-
- 54, 56
-
-
- Share
-
-
- BottomCenter
-
-
- ImageAboveText
-
-
- 6, 59
-
-
- 245, 26
-
-
- OptionSetting
-
-
- 245, 26
-
-
- RoutingSetting
-
-
- 245, 26
-
-
- GlobalHotkeySetting
-
-
- 245, 26
-
-
- GroupSetting
-
-
- 242, 6
-
-
- 245, 26
-
-
- BackupGuiConfig
-
-
- 245, 26
-
-
- RestoreGuiNConfig
-
-
- Magenta
-
-
- 83, 56
-
-
- Settings
-
-
- ImageAboveText
-
-
- 6, 59
-
-
- BottomCenter
-
-
- Magenta
-
-
- 120, 56
-
-
- Restart service
-
-
- ImageAboveText
-
-
- 6, 59
-
-
- 269, 26
-
-
- v2rayN (this software)
-
-
- 269, 26
-
-
- Update v2fly_v5 Core
-
-
- 269, 26
-
-
- Update SagerNet Core
-
-
- 269, 26
-
-
- Update Xray Core
-
-
- 266, 6
-
-
- 269, 26
-
-
- Update clash Core
-
-
- 269, 26
-
-
- Update Clash.Meta Core
-
-
- 266, 6
-
-
- 269, 26
-
-
- Update Geo files
-
-
- Magenta
-
-
- 155, 56
-
-
- Check for updates
-
-
- ImageAboveText
-
-
- 6, 59
-
-
- 230, 26
-
-
- v2rayN Project
-
-
- 230, 26
-
-
- V2Ray Website
-
-
- 227, 6
-
-
- 230, 26
-
-
- Language-[English]
-
-
- 230, 26
-
-
- 语言-[中文简体]
-
-
- Magenta
-
-
- 58, 56
-
-
- Help
-
-
- ImageAboveText
-
-
- Magenta
-
-
- 107, 56
-
-
- Promotion
-
-
- ImageAboveText
-
-
- 6, 59
-
-
- Magenta
-
-
- 61, 56
-
-
- Close
-
-
- ImageAboveText
-
-
- 0, 0
-
-
- 1269, 59
-
-
- 1
-
-
- tsMain
-
-
- System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 4
-
-
- True
-
-
- 64
-
-
- 8, 15
-
-
- 1269, 741
-
-
- 5, 5, 5, 5
-
-
- v2rayN
-
-
- menuAddVmessServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddVlessServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddShadowsocksServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddSocksServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddTrojanServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddCustomServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddServers
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuScanScreen
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator1
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuServerFilter
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuRemoveServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuRemoveDuplicateServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuCopyServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSetDefaultServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator3
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveToGroup
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveEvent
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveTop
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveUp
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveDown
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveBottom
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSelectAll
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator9
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuPingServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuTcpingServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuRealPingServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSpeedServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSortServerResult
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbTestMe
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuClearServerStatistics
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator6
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuExport2ClientConfig
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuExport2ServerConfig
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuExport2ShareUrl
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuExport2SubContent
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbServer
-
-
- System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- notifyMain
-
-
- System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSysAgentMode
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuKeepClear
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuGlobal
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuKeepNothing
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuRoutings
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuServers
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator13
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuAddServers2
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuScanScreen2
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuUpdateSubscriptions
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuUpdateSubViaProxy
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator2
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuExit
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator4
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSub
-
-
- System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSubSetting
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSubUpdate
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSubUpdateViaProxy
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSubGroupUpdate
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSubGroupUpdateViaProxy
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbQRCodeSwitch
-
-
- System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator8
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbSetting
-
-
- System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbOptionSetting
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbRoutingSetting
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbGlobalHotkeySetting
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbGroupSetting
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator14
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbBackupGuiNConfig
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbRestoreGuiNConfig
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator5
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbReload
-
-
- System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator7
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdate
-
-
- System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateN
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateCore
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateSagerNetCore
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateXrayCore
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator16
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateClashCore
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateClashMetaCore
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator15
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbCheckUpdateGeo
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator10
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbHelp
-
-
- System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbAbout
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbV2rayWebsite
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator12
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbLanguageDef
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbLanguageZhHans
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbPromotion
-
-
- System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator11
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tsbClose
-
-
- System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- MainForm
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx
deleted file mode 100644
index 7cbc3ae7..00000000
--- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx
+++ /dev/null
@@ -1,585 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 300, 22
-
-
- 添加[VMess]服务器
-
-
- 300, 22
-
-
- 添加[VLESS]服务器
-
-
- 300, 22
-
-
- 添加[Shadowsocks]服务器
-
-
- 300, 22
-
-
- 添加[Socks]服务器
-
-
- 300, 22
-
-
- 添加[Trojan]服务器
-
-
- 300, 22
-
-
- 添加自定义配置服务器
-
-
- 300, 22
-
-
- 从剪贴板导入批量URL (Ctrl+V)
-
-
- 300, 22
-
-
- 扫描屏幕上的二维码 (Ctrl+S)
-
-
- 297, 6
-
-
- 300, 22
-
-
- 移除所选服务器(多选) (Delete)
-
-
- 300, 22
-
-
- 移除重复的服务器
-
-
- 300, 22
-
-
- 克隆所选服务器
-
-
- 300, 22
-
-
- 设为活动服务器 (Enter)
-
-
- 297, 6
-
-
- 300, 22
-
-
- 上移至顶 (T)
-
-
- 300, 22
-
-
- 上移 (U)
-
-
- 300, 22
-
-
- 下移 (D)
-
-
- 300, 22
-
-
- 下移至底 (B)
-
-
- 300, 22
-
-
- 全选 (Ctrl+A)
-
-
- 297, 6
-
-
- 300, 22
-
-
- 测试服务器延迟Ping(多选) (Ctrl+P)
-
-
- 300, 22
-
-
- 测试服务器延迟Tcping(多选) (Ctrl+O)
-
-
- 300, 22
-
-
- 测试服务器真连接延迟(多选) (Ctrl+R)
-
-
- 300, 22
-
-
- 测试服务器速度(多选) (Ctrl+T)
-
-
- 300, 22
-
-
- 测试当前服务状态
-
-
- 300, 22
-
-
- 清除所有服务统计数据
-
-
- 297, 6
-
-
- 300, 22
-
-
- 导出所选服务器为客户端配置
-
-
- 300, 22
-
-
- 导出所选服务器为服务端配置
-
-
- 300, 22
-
-
- 批量导出分享URL至剪贴板(多选) (Ctrl+C)
-
-
- 300, 22
-
-
- 批量导出订阅内容至剪贴板(多选)
-
-
- 73, 53
-
-
- 服务器
-
-
- 301, 622
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
- 221, 22
-
-
- 221, 22
-
-
- 221, 22
-
-
- 221, 22
-
-
- 221, 22
-
-
- 221, 22
-
-
- 222, 136
-
-
- 网速显示未启用
-
-
- 172, 22
-
-
- 清除系统代理
-
-
- 172, 22
-
-
- 自动配置系统代理
-
-
- 172, 22
-
-
- 不改变系统代理
-
-
- 260, 22
-
-
- 系统代理
-
-
- 260, 22
-
-
- 路由
-
-
- 260, 22
-
-
- 服务器
-
-
- 服务器
-
-
- 257, 6
-
-
- 260, 22
-
-
- 从剪贴板导入批量URL
-
-
- 260, 22
-
-
- 扫描屏幕上的二维码
-
-
- 260, 22
-
-
- 更新订阅(不通过代理)
-
-
- 260, 22
-
-
- 更新订阅(通过代理)
-
-
- 257, 6
-
-
- 260, 22
-
-
- 退出
-
-
- 261, 221
-
-
- 180, 22
-
-
- 订阅设置
-
-
- 180, 22
-
-
- 更新订阅(不通过代理)
-
-
- 180, 22
-
-
- 更新订阅(通过代理)
-
-
- 61, 53
-
-
- 订阅
-
-
- 52, 53
-
-
- 分享
-
-
- 189, 22
-
-
- 参数设置
-
-
- 189, 22
-
-
- 路由设置
-
-
- 189, 22
-
-
- 全局热键设置
-
-
- 189, 22
-
-
- 服务器分组设置
-
-
- 186, 6
-
-
- 189, 22
-
-
- 备份v2rayN配置文件
-
-
- 61, 53
-
-
- 设置
-
-
- 76, 53
-
-
- 重启服务
-
-
- 168, 22
-
-
- v2rayN
-
-
- 168, 22
-
-
- v2fly_v5-Core
-
-
- 168, 22
-
-
- Xray-Core
-
-
- 165, 6
-
-
- 168, 22
-
-
- 168, 22
-
-
- 85, 53
-
-
- 检查更新
-
-
- v2rayN 项目
-
-
- V2Ray 官网
-
-
- 69, 53
-
-
- 帮助
-
-
- 68, 53
-
-
- 推广
-
-
- 76, 53
-
-
- 关闭窗口
-
-
- 移至分组
-
-
- 上下移至
-
-
- 设置服务器过滤器 (Ctrl+F)
-
-
- Update clash Core
-
-
- Update Clash.Meta Core
-
-
- 按测试结果排序 (Ctrl+E)
-
-
- SagerNet-Core
-
-
- 更新当前分组订阅(不通过代理)
-
-
- 更新当前分组订阅(通过代理)
-
-
- 恢复v2rayN配置文件
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs
deleted file mode 100644
index d23bd9f9..00000000
--- a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs
+++ /dev/null
@@ -1,204 +0,0 @@
-
-namespace v2rayN.Forms
-{
- partial class MainMsgControl
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region 组件设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要修改
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainMsgControl));
- this.txtMsgBox = new System.Windows.Forms.TextBox();
- this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMsgBoxClear = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem();
- this.gbMsgTitle = new System.Windows.Forms.GroupBox();
- this.ssMain = new System.Windows.Forms.StatusStrip();
- this.toolSslInboundInfo = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel();
- this.cmsMsgBox.SuspendLayout();
- this.gbMsgTitle.SuspendLayout();
- this.ssMain.SuspendLayout();
- this.SuspendLayout();
- //
- // txtMsgBox
- //
- resources.ApplyResources(this.txtMsgBox, "txtMsgBox");
- this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52)))));
- this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
- this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox;
- this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228)))));
- this.txtMsgBox.Name = "txtMsgBox";
- this.txtMsgBox.ReadOnly = true;
- this.txtMsgBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtMsgBox_KeyDown);
- //
- // cmsMsgBox
- //
- resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox");
- this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuMsgBoxSelectAll,
- this.menuMsgBoxCopy,
- this.menuMsgBoxCopyAll,
- this.menuMsgBoxClear,
- this.menuMsgBoxAddRoutingRule,
- this.menuMsgBoxFilter});
- this.cmsMsgBox.Name = "cmsMsgBox";
- //
- // menuMsgBoxSelectAll
- //
- resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll");
- this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll";
- this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click);
- //
- // menuMsgBoxCopy
- //
- resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy");
- this.menuMsgBoxCopy.Name = "menuMsgBoxCopy";
- this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click);
- //
- // menuMsgBoxCopyAll
- //
- resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll");
- this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll";
- this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click);
- //
- // menuMsgBoxClear
- //
- resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear");
- this.menuMsgBoxClear.Name = "menuMsgBoxClear";
- this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click);
- //
- // menuMsgBoxAddRoutingRule
- //
- resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule");
- this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule";
- this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click);
- //
- // menuMsgBoxFilter
- //
- resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter");
- this.menuMsgBoxFilter.Name = "menuMsgBoxFilter";
- this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click);
- //
- // gbMsgTitle
- //
- resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle");
- this.gbMsgTitle.Controls.Add(this.txtMsgBox);
- this.gbMsgTitle.Controls.Add(this.ssMain);
- this.gbMsgTitle.Name = "gbMsgTitle";
- this.gbMsgTitle.TabStop = false;
- //
- // ssMain
- //
- resources.ApplyResources(this.ssMain, "ssMain");
- this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20);
- this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.toolSslInboundInfo,
- this.toolSslBlank1,
- this.toolSslRoutingRule,
- this.toolSslBlank2,
- this.toolSslServerSpeed,
- this.toolSslBlank4});
- this.ssMain.Name = "ssMain";
- this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked);
- //
- // toolSslInboundInfo
- //
- resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo");
- this.toolSslInboundInfo.Name = "toolSslInboundInfo";
- //
- // toolSslBlank1
- //
- resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1");
- this.toolSslBlank1.Name = "toolSslBlank1";
- this.toolSslBlank1.Spring = true;
- //
- // toolSslRoutingRule
- //
- resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule");
- this.toolSslRoutingRule.Name = "toolSslRoutingRule";
- //
- // toolSslBlank2
- //
- resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2");
- this.toolSslBlank2.Name = "toolSslBlank2";
- this.toolSslBlank2.Spring = true;
- //
- // toolSslServerSpeed
- //
- resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed");
- this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
- this.toolSslServerSpeed.Name = "toolSslServerSpeed";
- //
- // toolSslBlank4
- //
- resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4");
- this.toolSslBlank4.Name = "toolSslBlank4";
- //
- // MainMsgControl
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.gbMsgTitle);
- this.Name = "MainMsgControl";
- this.Load += new System.EventHandler(this.MainMsgControl_Load);
- this.cmsMsgBox.ResumeLayout(false);
- this.gbMsgTitle.ResumeLayout(false);
- this.gbMsgTitle.PerformLayout();
- this.ssMain.ResumeLayout(false);
- this.ssMain.PerformLayout();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.TextBox txtMsgBox;
- private System.Windows.Forms.ContextMenuStrip cmsMsgBox;
- private System.Windows.Forms.ToolStripMenuItem menuMsgBoxSelectAll;
- private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopy;
- private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll;
- private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear;
- private System.Windows.Forms.ToolStripMenuItem menuMsgBoxAddRoutingRule;
- private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter;
- private System.Windows.Forms.GroupBox gbMsgTitle;
- private System.Windows.Forms.StatusStrip ssMain;
- private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo;
- private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1;
- private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule;
- private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2;
- private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed;
- private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4;
- }
-}
diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs
deleted file mode 100644
index 6696573c..00000000
--- a/v2rayN/v2rayN/Forms/MainMsgControl.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class MainMsgControl : UserControl
- {
- private string _msgFilter = string.Empty;
- delegate void AppendTextDelegate(string text);
-
- public MainMsgControl()
- {
- InitializeComponent();
- }
-
- private void MainMsgControl_Load(object sender, EventArgs e)
- {
- _msgFilter = Utils.RegReadValue(Global.MyRegPath, Utils.MainMsgFilterKey, "");
- if (!Utils.IsNullOrEmpty(_msgFilter))
- {
- gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, _msgFilter);
- }
- }
-
- #region 提示信息
-
- public void AppendText(string text)
- {
- if (txtMsgBox.InvokeRequired)
- {
- Invoke(new AppendTextDelegate(AppendText), text);
- }
- else
- {
- if (!Utils.IsNullOrEmpty(_msgFilter))
- {
- if (!Regex.IsMatch(text, _msgFilter))
- {
- return;
- }
- }
- //this.txtMsgBox.AppendText(text);
- ShowMsg(text);
- }
- }
-
- ///
- /// 提示信息
- ///
- ///
- private void ShowMsg(string msg)
- {
- if (txtMsgBox.Lines.Length > 999)
- {
- ClearMsg();
- }
- txtMsgBox.AppendText(msg);
- if (!msg.EndsWith(Environment.NewLine))
- {
- txtMsgBox.AppendText(Environment.NewLine);
- }
- }
-
- ///
- /// 清除信息
- ///
- public void ClearMsg()
- {
- txtMsgBox.Invoke((Action)delegate
- {
- txtMsgBox.Clear();
- });
- }
-
- public void DisplayToolStatus(Config config)
- {
- StringBuilder sb = new StringBuilder();
- sb.Append($"{ResUI.LabLocal}:");
- sb.Append($"[{Global.InboundSocks}:{config.GetLocalPort(Global.InboundSocks)}]");
- sb.Append(" | ");
- if (config.sysProxyType == ESysProxyType.ForcedChange)
- {
- sb.Append($"[{Global.InboundHttp}({ResUI.SystemProxy}):{config.GetLocalPort(Global.InboundHttp)}]");
- }
- else
- {
- sb.Append($"[{Global.InboundHttp}:{config.GetLocalPort(Global.InboundHttp)}]");
- }
-
- if (config.inbound[0].allowLANConn)
- {
- sb.Append($" {ResUI.LabLAN}:");
- sb.Append($"[{Global.InboundSocks}:{config.GetLocalPort(Global.InboundSocks2)}]");
- sb.Append(" | ");
- sb.Append($"[{Global.InboundHttp}:{config.GetLocalPort(Global.InboundHttp2)}]");
- }
-
- SetToolSslInfo("inbound", sb.ToString());
- }
-
- public void SetToolSslInfo(string type, string value)
- {
- switch (type)
- {
- case "speed":
- toolSslServerSpeed.Text = value;
- break;
- case "inbound":
- toolSslInboundInfo.Text = value;
- break;
- case "routing":
- toolSslRoutingRule.Text = value;
- break;
- }
-
- }
-
- public void ScrollToCaret()
- {
- txtMsgBox.ScrollToCaret();
- }
- #endregion
-
-
- #region MsgBoxMenu
- private void menuMsgBoxSelectAll_Click(object sender, EventArgs e)
- {
- txtMsgBox.Focus();
- txtMsgBox.SelectAll();
- }
-
- private void menuMsgBoxCopy_Click(object sender, EventArgs e)
- {
- var data = txtMsgBox.SelectedText.TrimEx();
- Utils.SetClipboardData(data);
- }
-
- private void menuMsgBoxCopyAll_Click(object sender, EventArgs e)
- {
- var data = txtMsgBox.Text;
- Utils.SetClipboardData(data);
- }
- private void menuMsgBoxClear_Click(object sender, EventArgs e)
- {
- txtMsgBox.Clear();
- }
- private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e)
- {
- menuMsgBoxCopy_Click(null, null);
- var fm = new RoutingSettingForm();
- fm.ShowDialog();
-
- }
-
- private void txtMsgBox_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.Control)
- {
- switch (e.KeyCode)
- {
- case Keys.A:
- menuMsgBoxSelectAll_Click(null, null);
- break;
- case Keys.C:
- menuMsgBoxCopy_Click(null, null);
- break;
- case Keys.V:
- menuMsgBoxAddRoutingRule_Click(null, null);
- break;
-
- }
- }
-
- }
- private void menuMsgBoxFilter_Click(object sender, EventArgs e)
- {
- var fm = new MsgFilterSetForm();
- fm.MsgFilter = _msgFilter;
- fm.ShowDefFilter = true;
- if (fm.ShowDialog() == DialogResult.OK)
- {
- _msgFilter = fm.MsgFilter;
- gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, _msgFilter);
- Utils.RegWriteValue(Global.MyRegPath, Utils.MainMsgFilterKey, _msgFilter);
- }
- }
-
- private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
- {
- if (!Utils.IsNullOrEmpty(e.ClickedItem.Text))
- {
- Utils.SetClipboardData(e.ClickedItem.Text);
- }
- }
- #endregion
-
-
- }
-}
diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.resx b/v2rayN/v2rayN/Forms/MainMsgControl.resx
deleted file mode 100644
index 80eab070..00000000
--- a/v2rayN/v2rayN/Forms/MainMsgControl.resx
+++ /dev/null
@@ -1,384 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolSslRoutingRule
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Select All (Ctrl+A)
-
-
- ssMain
-
-
- menuMsgBoxSelectAll
-
-
-
- False
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolSslServerSpeed
-
-
-
- 227, 22
-
-
- menuMsgBoxCopyAll
-
-
- 0
-
-
- 1
-
-
- 3, 221
-
-
- 227, 22
-
-
- 227, 22
-
-
- System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 0, 17
-
-
- 80, 17
-
-
- toolSslInboundInfo
-
-
- txtMsgBox
-
-
- 0, 17
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 微软雅黑, 8pt
-
-
- 227, 22
-
-
- gbMsgTitle
-
-
- 227, 22
-
-
- System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Add Routing Rule (Ctrl+V)
-
-
- MiddleRight
-
-
- 微软雅黑, 8pt
-
-
- 696, 246
-
-
- InboundInfo
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMsgBoxClear
-
-
- 4
-
-
- 5
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 3, 17
-
-
- toolSslBlank4
-
-
- gbMsgTitle
-
-
- Informations
-
-
- 0
-
-
- 172, 17
-
-
- True
-
-
- Clear All
-
-
- 6, 12
-
-
-
- Vertical
-
-
- $this
-
-
- 690, 22
-
-
- cmsMsgBox
-
-
- Fill
-
-
- System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Fill
-
-
- 690, 204
-
-
- 227, 22
-
-
- 172, 17
-
-
- System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- MainMsgControl
-
-
- 0, 0
-
-
- 696, 246
-
-
- toolSslBlank1
-
-
- No
-
-
- Copy All
-
-
- 250, 17
-
-
- statusStrip1
-
-
- menuMsgBoxAddRoutingRule
-
-
- toolSslBlank2
-
-
- Set message filters
-
-
- SPEED Disabled
-
-
- 0
-
-
- gbMsgTitle
-
-
- menuMsgBoxFilter
-
-
- 1
-
-
- System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMsgBoxCopy
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Copy (Ctrl+C)
-
-
- 228, 136
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 131, 18
-
-
- True
-
-
- 17, 17
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx
deleted file mode 100644
index d54a14f8..00000000
--- a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 221, 22
-
-
- 全选 (Ctrl+A)
-
-
- 221, 22
-
-
- 复制 (Ctrl+C)
-
-
- 221, 22
-
-
- 复制所有
-
-
- 221, 22
-
-
- 清除所有
-
-
- 221, 22
-
-
- 快速添加路由规则 (Ctrl+V)
-
-
- 221, 22
-
-
- 设置信息过滤器
-
-
- 222, 136
-
-
- 157, 17
-
-
- 157, 17
-
-
- 信息
-
-
- 网速显示未启用
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs
deleted file mode 100644
index ff3ca4f8..00000000
--- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class MsgFilterSetForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MsgFilterSetForm));
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.btnFilderProxy = new System.Windows.Forms.Button();
- this.btnFilterDirect = new System.Windows.Forms.Button();
- this.txtMsgFilter = new System.Windows.Forms.TextBox();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnClose = new System.Windows.Forms.Button();
- this.btnOK = new System.Windows.Forms.Button();
- this.btnClear = new System.Windows.Forms.Button();
- this.groupBox1.SuspendLayout();
- this.panel2.SuspendLayout();
- this.SuspendLayout();
- //
- // groupBox1
- //
- this.groupBox1.Controls.Add(this.btnFilderProxy);
- this.groupBox1.Controls.Add(this.btnFilterDirect);
- this.groupBox1.Controls.Add(this.txtMsgFilter);
- resources.ApplyResources(this.groupBox1, "groupBox1");
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.TabStop = false;
- //
- // btnFilderProxy
- //
- resources.ApplyResources(this.btnFilderProxy, "btnFilderProxy");
- this.btnFilderProxy.Name = "btnFilderProxy";
- this.btnFilderProxy.UseVisualStyleBackColor = true;
- this.btnFilderProxy.Click += new System.EventHandler(this.btnFilderProxy_Click);
- //
- // btnFilterDirect
- //
- resources.ApplyResources(this.btnFilterDirect, "btnFilterDirect");
- this.btnFilterDirect.Name = "btnFilterDirect";
- this.btnFilterDirect.UseVisualStyleBackColor = true;
- this.btnFilterDirect.Click += new System.EventHandler(this.btnFilterDirect_Click);
- //
- // txtMsgFilter
- //
- resources.ApplyResources(this.txtMsgFilter, "txtMsgFilter");
- this.txtMsgFilter.Name = "txtMsgFilter";
- //
- // panel2
- //
- this.panel2.Controls.Add(this.btnClear);
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Name = "panel2";
- //
- // btnClose
- //
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // btnClear
- //
- resources.ApplyResources(this.btnClear, "btnClear");
- this.btnClear.Name = "btnClear";
- this.btnClear.UseVisualStyleBackColor = true;
- this.btnClear.Click += new System.EventHandler(this.btnClear_Click);
- //
- // MsgFilterSetForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.panel2);
- this.Name = "MsgFilterSetForm";
- this.Load += new System.EventHandler(this.MsgFilterSetForm_Load);
- this.groupBox1.ResumeLayout(false);
- this.groupBox1.PerformLayout();
- this.panel2.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.TextBox txtMsgFilter;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Button btnFilderProxy;
- private System.Windows.Forms.Button btnFilterDirect;
- private System.Windows.Forms.Button btnClear;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs
deleted file mode 100644
index 926b00cb..00000000
--- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace v2rayN.Forms
-{
- public partial class MsgFilterSetForm : BaseForm
- {
- public string MsgFilter { get; set; }
- public bool ShowDefFilter { get; set; }
-
- public MsgFilterSetForm()
- {
- InitializeComponent();
- }
-
- private void MsgFilterSetForm_Load(object sender, EventArgs e)
- {
- txtMsgFilter.Text = MsgFilter;
- btnFilderProxy.Visible =
- btnFilterDirect.Visible = ShowDefFilter;
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- MsgFilter = txtMsgFilter.Text;
- DialogResult = DialogResult.OK;
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
-
- private void btnFilderProxy_Click(object sender, EventArgs e)
- {
- txtMsgFilter.Text = "^(?!.*proxy).*$";
- }
-
- private void btnFilterDirect_Click(object sender, EventArgs e)
- {
- txtMsgFilter.Text = "^(?!.*direct).*$";
- }
-
- private void btnClear_Click(object sender, EventArgs e)
- {
- MsgFilter = string.Empty;
- DialogResult = DialogResult.OK;
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx
deleted file mode 100644
index 82cacfe0..00000000
--- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx
+++ /dev/null
@@ -1,381 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- btnFilderProxy
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 0
-
-
- btnFilterDirect
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 1
-
-
- txtMsgFilter
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 2
-
-
-
- Fill
-
-
-
- 0, 0
-
-
- 490, 76
-
-
-
- 8
-
-
- Filter
-
-
- groupBox1
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- 157, 47
-
-
- 95, 23
-
-
- 13
-
-
- Filter Proxy
-
-
- btnFilderProxy
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 0
-
-
- NoControl
-
-
- 41, 47
-
-
- 95, 23
-
-
- 12
-
-
- Filter Direct
-
-
- btnFilterDirect
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 1
-
-
- 41, 20
-
-
- 409, 21
-
-
- 11
-
-
- txtMsgFilter
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 2
-
-
- NoControl
-
-
- 211, 17
-
-
- 75, 23
-
-
- 14
-
-
- Clear
-
-
- btnClear
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 0
-
-
- NoControl
-
-
- 396, 17
-
-
- 75, 23
-
-
- 4
-
-
- &Cancel
-
-
- btnClose
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 1
-
-
- NoControl
-
-
- 303, 17
-
-
- 75, 23
-
-
- 5
-
-
- &OK
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 2
-
-
- Bottom
-
-
- 0, 76
-
-
- 490, 60
-
-
- 9
-
-
- panel2
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- True
-
-
- 6, 12
-
-
- 490, 136
-
-
- MsgFilterSetForm
-
-
- MsgFilterSetForm
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx
deleted file mode 100644
index 3ec9e0e7..00000000
--- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 过滤器
-
-
- 取消(&C)
-
-
- 确定(&O)
-
-
- 设置过滤器
-
-
- 过滤Proxy
-
-
- 过滤Direct
-
-
- 清空
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs
deleted file mode 100644
index 29189e81..00000000
--- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs
+++ /dev/null
@@ -1,782 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class OptionSettingForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.tabControl1 = new System.Windows.Forms.TabControl();
- this.tabPage1 = new System.Windows.Forms.TabPage();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.label16 = new System.Windows.Forms.Label();
- this.label4 = new System.Windows.Forms.Label();
- this.txtpass = new System.Windows.Forms.TextBox();
- this.txtuser = new System.Windows.Forms.TextBox();
- this.chkdefAllowInsecure = new System.Windows.Forms.CheckBox();
- this.chkAllowLANConn = new System.Windows.Forms.CheckBox();
- this.chksniffingEnabled = new System.Windows.Forms.CheckBox();
- this.chkmuxEnabled = new System.Windows.Forms.CheckBox();
- this.cmbprotocol = new System.Windows.Forms.ComboBox();
- this.label1 = new System.Windows.Forms.Label();
- this.chkudpEnabled = new System.Windows.Forms.CheckBox();
- this.chklogEnabled = new System.Windows.Forms.CheckBox();
- this.cmbloglevel = new System.Windows.Forms.ComboBox();
- this.label5 = new System.Windows.Forms.Label();
- this.txtlocalPort = new System.Windows.Forms.TextBox();
- this.label2 = new System.Windows.Forms.Label();
- this.tabPage2 = new System.Windows.Forms.TabPage();
- this.cmbdomainStrategy4Freedom = new System.Windows.Forms.ComboBox();
- this.label19 = new System.Windows.Forms.Label();
- this.linkDnsObjectDoc = new System.Windows.Forms.LinkLabel();
- this.txtremoteDNS = new System.Windows.Forms.TextBox();
- this.label14 = new System.Windows.Forms.Label();
- this.tabPage6 = new System.Windows.Forms.TabPage();
- this.chkKcpcongestion = new System.Windows.Forms.CheckBox();
- this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox();
- this.label10 = new System.Windows.Forms.Label();
- this.txtKcpreadBufferSize = new System.Windows.Forms.TextBox();
- this.label11 = new System.Windows.Forms.Label();
- this.txtKcpdownlinkCapacity = new System.Windows.Forms.TextBox();
- this.label8 = new System.Windows.Forms.Label();
- this.txtKcpuplinkCapacity = new System.Windows.Forms.TextBox();
- this.label9 = new System.Windows.Forms.Label();
- this.txtKcptti = new System.Windows.Forms.TextBox();
- this.label7 = new System.Windows.Forms.Label();
- this.txtKcpmtu = new System.Windows.Forms.TextBox();
- this.label6 = new System.Windows.Forms.Label();
- this.tabPage7 = new System.Windows.Forms.TabPage();
- this.numStatisticsFreshRate = new System.Windows.Forms.NumericUpDown();
- this.txttrayMenuServersLimit = new System.Windows.Forms.TextBox();
- this.label17 = new System.Windows.Forms.Label();
- this.txtautoUpdateSubInterval = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.chkEnableSecurityProtocolTls13 = new System.Windows.Forms.CheckBox();
- this.chkEnableAutoAdjustMainLvColWidth = new System.Windows.Forms.CheckBox();
- this.btnSetLoopback = new System.Windows.Forms.Button();
- this.txtautoUpdateInterval = new System.Windows.Forms.TextBox();
- this.label15 = new System.Windows.Forms.Label();
- this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox();
- this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox();
- this.lbFreshrate = new System.Windows.Forms.Label();
- this.chkEnableStatistics = new System.Windows.Forms.CheckBox();
- this.chkAutoRun = new System.Windows.Forms.CheckBox();
- this.tabPageCoreType = new System.Windows.Forms.TabPage();
- this.cmbCoreType6 = new System.Windows.Forms.ComboBox();
- this.labCoreType6 = new System.Windows.Forms.Label();
- this.cmbCoreType5 = new System.Windows.Forms.ComboBox();
- this.labCoreType5 = new System.Windows.Forms.Label();
- this.cmbCoreType4 = new System.Windows.Forms.ComboBox();
- this.labCoreType4 = new System.Windows.Forms.Label();
- this.cmbCoreType3 = new System.Windows.Forms.ComboBox();
- this.labCoreType3 = new System.Windows.Forms.Label();
- this.cmbCoreType2 = new System.Windows.Forms.ComboBox();
- this.labCoreType2 = new System.Windows.Forms.Label();
- this.cmbCoreType1 = new System.Windows.Forms.ComboBox();
- this.labCoreType1 = new System.Windows.Forms.Label();
- this.tabPage3 = new System.Windows.Forms.TabPage();
- this.groupBox2 = new System.Windows.Forms.GroupBox();
- this.label18 = new System.Windows.Forms.Label();
- this.cmbSystemProxyAdvancedProtocol = new System.Windows.Forms.ComboBox();
- this.label13 = new System.Windows.Forms.Label();
- this.label12 = new System.Windows.Forms.Label();
- this.txtsystemProxyExceptions = new System.Windows.Forms.TextBox();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel1 = new System.Windows.Forms.Panel();
- this.chkEnableCheckPreReleaseUpdate = new System.Windows.Forms.CheckBox();
- this.tabControl1.SuspendLayout();
- this.tabPage1.SuspendLayout();
- this.groupBox1.SuspendLayout();
- this.tabPage2.SuspendLayout();
- this.tabPage6.SuspendLayout();
- this.tabPage7.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numStatisticsFreshRate)).BeginInit();
- this.tabPageCoreType.SuspendLayout();
- this.tabPage3.SuspendLayout();
- this.groupBox2.SuspendLayout();
- this.panel2.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // tabControl1
- //
- this.tabControl1.Controls.Add(this.tabPage1);
- this.tabControl1.Controls.Add(this.tabPage2);
- this.tabControl1.Controls.Add(this.tabPage6);
- this.tabControl1.Controls.Add(this.tabPage7);
- this.tabControl1.Controls.Add(this.tabPageCoreType);
- this.tabControl1.Controls.Add(this.tabPage3);
- resources.ApplyResources(this.tabControl1, "tabControl1");
- this.tabControl1.Name = "tabControl1";
- this.tabControl1.SelectedIndex = 0;
- //
- // tabPage1
- //
- this.tabPage1.Controls.Add(this.groupBox1);
- resources.ApplyResources(this.tabPage1, "tabPage1");
- this.tabPage1.Name = "tabPage1";
- this.tabPage1.UseVisualStyleBackColor = true;
- //
- // groupBox1
- //
- this.groupBox1.Controls.Add(this.label16);
- this.groupBox1.Controls.Add(this.label4);
- this.groupBox1.Controls.Add(this.txtpass);
- this.groupBox1.Controls.Add(this.txtuser);
- this.groupBox1.Controls.Add(this.chkdefAllowInsecure);
- this.groupBox1.Controls.Add(this.chkAllowLANConn);
- this.groupBox1.Controls.Add(this.chksniffingEnabled);
- this.groupBox1.Controls.Add(this.chkmuxEnabled);
- this.groupBox1.Controls.Add(this.cmbprotocol);
- this.groupBox1.Controls.Add(this.label1);
- this.groupBox1.Controls.Add(this.chkudpEnabled);
- this.groupBox1.Controls.Add(this.chklogEnabled);
- this.groupBox1.Controls.Add(this.cmbloglevel);
- this.groupBox1.Controls.Add(this.label5);
- this.groupBox1.Controls.Add(this.txtlocalPort);
- this.groupBox1.Controls.Add(this.label2);
- resources.ApplyResources(this.groupBox1, "groupBox1");
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.TabStop = false;
- //
- // label16
- //
- resources.ApplyResources(this.label16, "label16");
- this.label16.Name = "label16";
- //
- // label4
- //
- resources.ApplyResources(this.label4, "label4");
- this.label4.Name = "label4";
- //
- // txtpass
- //
- resources.ApplyResources(this.txtpass, "txtpass");
- this.txtpass.Name = "txtpass";
- //
- // txtuser
- //
- resources.ApplyResources(this.txtuser, "txtuser");
- this.txtuser.Name = "txtuser";
- //
- // chkdefAllowInsecure
- //
- resources.ApplyResources(this.chkdefAllowInsecure, "chkdefAllowInsecure");
- this.chkdefAllowInsecure.Name = "chkdefAllowInsecure";
- this.chkdefAllowInsecure.UseVisualStyleBackColor = true;
- //
- // chkAllowLANConn
- //
- resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn");
- this.chkAllowLANConn.Name = "chkAllowLANConn";
- this.chkAllowLANConn.UseVisualStyleBackColor = true;
- //
- // chksniffingEnabled
- //
- resources.ApplyResources(this.chksniffingEnabled, "chksniffingEnabled");
- this.chksniffingEnabled.Name = "chksniffingEnabled";
- this.chksniffingEnabled.UseVisualStyleBackColor = true;
- //
- // chkmuxEnabled
- //
- resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled");
- this.chkmuxEnabled.Name = "chkmuxEnabled";
- this.chkmuxEnabled.UseVisualStyleBackColor = true;
- //
- // cmbprotocol
- //
- this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- resources.ApplyResources(this.cmbprotocol, "cmbprotocol");
- this.cmbprotocol.FormattingEnabled = true;
- this.cmbprotocol.Items.AddRange(new object[] {
- resources.GetString("cmbprotocol.Items"),
- resources.GetString("cmbprotocol.Items1")});
- this.cmbprotocol.Name = "cmbprotocol";
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // chkudpEnabled
- //
- resources.ApplyResources(this.chkudpEnabled, "chkudpEnabled");
- this.chkudpEnabled.Name = "chkudpEnabled";
- this.chkudpEnabled.UseVisualStyleBackColor = true;
- //
- // chklogEnabled
- //
- resources.ApplyResources(this.chklogEnabled, "chklogEnabled");
- this.chklogEnabled.Name = "chklogEnabled";
- this.chklogEnabled.UseVisualStyleBackColor = true;
- //
- // cmbloglevel
- //
- this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbloglevel.FormattingEnabled = true;
- this.cmbloglevel.Items.AddRange(new object[] {
- resources.GetString("cmbloglevel.Items"),
- resources.GetString("cmbloglevel.Items1"),
- resources.GetString("cmbloglevel.Items2"),
- resources.GetString("cmbloglevel.Items3"),
- resources.GetString("cmbloglevel.Items4")});
- resources.ApplyResources(this.cmbloglevel, "cmbloglevel");
- this.cmbloglevel.Name = "cmbloglevel";
- //
- // label5
- //
- resources.ApplyResources(this.label5, "label5");
- this.label5.Name = "label5";
- //
- // txtlocalPort
- //
- resources.ApplyResources(this.txtlocalPort, "txtlocalPort");
- this.txtlocalPort.Name = "txtlocalPort";
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // tabPage2
- //
- this.tabPage2.Controls.Add(this.cmbdomainStrategy4Freedom);
- this.tabPage2.Controls.Add(this.label19);
- this.tabPage2.Controls.Add(this.linkDnsObjectDoc);
- this.tabPage2.Controls.Add(this.txtremoteDNS);
- this.tabPage2.Controls.Add(this.label14);
- resources.ApplyResources(this.tabPage2, "tabPage2");
- this.tabPage2.Name = "tabPage2";
- this.tabPage2.UseVisualStyleBackColor = true;
- //
- // cmbdomainStrategy4Freedom
- //
- this.cmbdomainStrategy4Freedom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbdomainStrategy4Freedom.FormattingEnabled = true;
- this.cmbdomainStrategy4Freedom.Items.AddRange(new object[] {
- resources.GetString("cmbdomainStrategy4Freedom.Items"),
- resources.GetString("cmbdomainStrategy4Freedom.Items1"),
- resources.GetString("cmbdomainStrategy4Freedom.Items2"),
- resources.GetString("cmbdomainStrategy4Freedom.Items3")});
- resources.ApplyResources(this.cmbdomainStrategy4Freedom, "cmbdomainStrategy4Freedom");
- this.cmbdomainStrategy4Freedom.Name = "cmbdomainStrategy4Freedom";
- //
- // label19
- //
- resources.ApplyResources(this.label19, "label19");
- this.label19.Name = "label19";
- //
- // linkDnsObjectDoc
- //
- resources.ApplyResources(this.linkDnsObjectDoc, "linkDnsObjectDoc");
- this.linkDnsObjectDoc.Name = "linkDnsObjectDoc";
- this.linkDnsObjectDoc.TabStop = true;
- this.linkDnsObjectDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkDnsObjectDoc_LinkClicked);
- //
- // txtremoteDNS
- //
- resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS");
- this.txtremoteDNS.Name = "txtremoteDNS";
- //
- // label14
- //
- resources.ApplyResources(this.label14, "label14");
- this.label14.Name = "label14";
- //
- // tabPage6
- //
- this.tabPage6.Controls.Add(this.chkKcpcongestion);
- this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize);
- this.tabPage6.Controls.Add(this.label10);
- this.tabPage6.Controls.Add(this.txtKcpreadBufferSize);
- this.tabPage6.Controls.Add(this.label11);
- this.tabPage6.Controls.Add(this.txtKcpdownlinkCapacity);
- this.tabPage6.Controls.Add(this.label8);
- this.tabPage6.Controls.Add(this.txtKcpuplinkCapacity);
- this.tabPage6.Controls.Add(this.label9);
- this.tabPage6.Controls.Add(this.txtKcptti);
- this.tabPage6.Controls.Add(this.label7);
- this.tabPage6.Controls.Add(this.txtKcpmtu);
- this.tabPage6.Controls.Add(this.label6);
- resources.ApplyResources(this.tabPage6, "tabPage6");
- this.tabPage6.Name = "tabPage6";
- this.tabPage6.UseVisualStyleBackColor = true;
- //
- // chkKcpcongestion
- //
- resources.ApplyResources(this.chkKcpcongestion, "chkKcpcongestion");
- this.chkKcpcongestion.Name = "chkKcpcongestion";
- this.chkKcpcongestion.UseVisualStyleBackColor = true;
- //
- // txtKcpwriteBufferSize
- //
- resources.ApplyResources(this.txtKcpwriteBufferSize, "txtKcpwriteBufferSize");
- this.txtKcpwriteBufferSize.Name = "txtKcpwriteBufferSize";
- //
- // label10
- //
- resources.ApplyResources(this.label10, "label10");
- this.label10.Name = "label10";
- //
- // txtKcpreadBufferSize
- //
- resources.ApplyResources(this.txtKcpreadBufferSize, "txtKcpreadBufferSize");
- this.txtKcpreadBufferSize.Name = "txtKcpreadBufferSize";
- //
- // label11
- //
- resources.ApplyResources(this.label11, "label11");
- this.label11.Name = "label11";
- //
- // txtKcpdownlinkCapacity
- //
- resources.ApplyResources(this.txtKcpdownlinkCapacity, "txtKcpdownlinkCapacity");
- this.txtKcpdownlinkCapacity.Name = "txtKcpdownlinkCapacity";
- //
- // label8
- //
- resources.ApplyResources(this.label8, "label8");
- this.label8.Name = "label8";
- //
- // txtKcpuplinkCapacity
- //
- resources.ApplyResources(this.txtKcpuplinkCapacity, "txtKcpuplinkCapacity");
- this.txtKcpuplinkCapacity.Name = "txtKcpuplinkCapacity";
- //
- // label9
- //
- resources.ApplyResources(this.label9, "label9");
- this.label9.Name = "label9";
- //
- // txtKcptti
- //
- resources.ApplyResources(this.txtKcptti, "txtKcptti");
- this.txtKcptti.Name = "txtKcptti";
- //
- // label7
- //
- resources.ApplyResources(this.label7, "label7");
- this.label7.Name = "label7";
- //
- // txtKcpmtu
- //
- resources.ApplyResources(this.txtKcpmtu, "txtKcpmtu");
- this.txtKcpmtu.Name = "txtKcpmtu";
- //
- // label6
- //
- resources.ApplyResources(this.label6, "label6");
- this.label6.Name = "label6";
- //
- // tabPage7
- //
- this.tabPage7.Controls.Add(this.chkEnableCheckPreReleaseUpdate);
- this.tabPage7.Controls.Add(this.numStatisticsFreshRate);
- this.tabPage7.Controls.Add(this.txttrayMenuServersLimit);
- this.tabPage7.Controls.Add(this.label17);
- this.tabPage7.Controls.Add(this.txtautoUpdateSubInterval);
- this.tabPage7.Controls.Add(this.label3);
- this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13);
- this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth);
- this.tabPage7.Controls.Add(this.btnSetLoopback);
- this.tabPage7.Controls.Add(this.txtautoUpdateInterval);
- this.tabPage7.Controls.Add(this.label15);
- this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore);
- this.tabPage7.Controls.Add(this.chkKeepOlderDedupl);
- this.tabPage7.Controls.Add(this.lbFreshrate);
- this.tabPage7.Controls.Add(this.chkEnableStatistics);
- this.tabPage7.Controls.Add(this.chkAutoRun);
- resources.ApplyResources(this.tabPage7, "tabPage7");
- this.tabPage7.Name = "tabPage7";
- this.tabPage7.UseVisualStyleBackColor = true;
- //
- // numStatisticsFreshRate
- //
- resources.ApplyResources(this.numStatisticsFreshRate, "numStatisticsFreshRate");
- this.numStatisticsFreshRate.Name = "numStatisticsFreshRate";
- //
- // txttrayMenuServersLimit
- //
- resources.ApplyResources(this.txttrayMenuServersLimit, "txttrayMenuServersLimit");
- this.txttrayMenuServersLimit.Name = "txttrayMenuServersLimit";
- //
- // label17
- //
- resources.ApplyResources(this.label17, "label17");
- this.label17.Name = "label17";
- //
- // txtautoUpdateSubInterval
- //
- resources.ApplyResources(this.txtautoUpdateSubInterval, "txtautoUpdateSubInterval");
- this.txtautoUpdateSubInterval.Name = "txtautoUpdateSubInterval";
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // chkEnableSecurityProtocolTls13
- //
- resources.ApplyResources(this.chkEnableSecurityProtocolTls13, "chkEnableSecurityProtocolTls13");
- this.chkEnableSecurityProtocolTls13.Name = "chkEnableSecurityProtocolTls13";
- this.chkEnableSecurityProtocolTls13.UseVisualStyleBackColor = true;
- //
- // chkEnableAutoAdjustMainLvColWidth
- //
- resources.ApplyResources(this.chkEnableAutoAdjustMainLvColWidth, "chkEnableAutoAdjustMainLvColWidth");
- this.chkEnableAutoAdjustMainLvColWidth.Name = "chkEnableAutoAdjustMainLvColWidth";
- this.chkEnableAutoAdjustMainLvColWidth.UseVisualStyleBackColor = true;
- //
- // btnSetLoopback
- //
- resources.ApplyResources(this.btnSetLoopback, "btnSetLoopback");
- this.btnSetLoopback.Name = "btnSetLoopback";
- this.btnSetLoopback.UseVisualStyleBackColor = true;
- this.btnSetLoopback.Click += new System.EventHandler(this.btnSetLoopback_Click);
- //
- // txtautoUpdateInterval
- //
- resources.ApplyResources(this.txtautoUpdateInterval, "txtautoUpdateInterval");
- this.txtautoUpdateInterval.Name = "txtautoUpdateInterval";
- //
- // label15
- //
- resources.ApplyResources(this.label15, "label15");
- this.label15.Name = "label15";
- //
- // chkIgnoreGeoUpdateCore
- //
- resources.ApplyResources(this.chkIgnoreGeoUpdateCore, "chkIgnoreGeoUpdateCore");
- this.chkIgnoreGeoUpdateCore.Name = "chkIgnoreGeoUpdateCore";
- this.chkIgnoreGeoUpdateCore.UseVisualStyleBackColor = true;
- //
- // chkKeepOlderDedupl
- //
- resources.ApplyResources(this.chkKeepOlderDedupl, "chkKeepOlderDedupl");
- this.chkKeepOlderDedupl.Name = "chkKeepOlderDedupl";
- this.chkKeepOlderDedupl.UseVisualStyleBackColor = true;
- //
- // lbFreshrate
- //
- resources.ApplyResources(this.lbFreshrate, "lbFreshrate");
- this.lbFreshrate.Name = "lbFreshrate";
- //
- // chkEnableStatistics
- //
- resources.ApplyResources(this.chkEnableStatistics, "chkEnableStatistics");
- this.chkEnableStatistics.Name = "chkEnableStatistics";
- this.chkEnableStatistics.UseVisualStyleBackColor = true;
- //
- // chkAutoRun
- //
- resources.ApplyResources(this.chkAutoRun, "chkAutoRun");
- this.chkAutoRun.Name = "chkAutoRun";
- this.chkAutoRun.UseVisualStyleBackColor = true;
- //
- // tabPageCoreType
- //
- this.tabPageCoreType.Controls.Add(this.cmbCoreType6);
- this.tabPageCoreType.Controls.Add(this.labCoreType6);
- this.tabPageCoreType.Controls.Add(this.cmbCoreType5);
- this.tabPageCoreType.Controls.Add(this.labCoreType5);
- this.tabPageCoreType.Controls.Add(this.cmbCoreType4);
- this.tabPageCoreType.Controls.Add(this.labCoreType4);
- this.tabPageCoreType.Controls.Add(this.cmbCoreType3);
- this.tabPageCoreType.Controls.Add(this.labCoreType3);
- this.tabPageCoreType.Controls.Add(this.cmbCoreType2);
- this.tabPageCoreType.Controls.Add(this.labCoreType2);
- this.tabPageCoreType.Controls.Add(this.cmbCoreType1);
- this.tabPageCoreType.Controls.Add(this.labCoreType1);
- resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType");
- this.tabPageCoreType.Name = "tabPageCoreType";
- this.tabPageCoreType.UseVisualStyleBackColor = true;
- //
- // cmbCoreType6
- //
- this.cmbCoreType6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType6.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6");
- this.cmbCoreType6.Name = "cmbCoreType6";
- //
- // labCoreType6
- //
- resources.ApplyResources(this.labCoreType6, "labCoreType6");
- this.labCoreType6.Name = "labCoreType6";
- //
- // cmbCoreType5
- //
- this.cmbCoreType5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType5.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5");
- this.cmbCoreType5.Name = "cmbCoreType5";
- //
- // labCoreType5
- //
- resources.ApplyResources(this.labCoreType5, "labCoreType5");
- this.labCoreType5.Name = "labCoreType5";
- //
- // cmbCoreType4
- //
- this.cmbCoreType4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType4.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4");
- this.cmbCoreType4.Name = "cmbCoreType4";
- //
- // labCoreType4
- //
- resources.ApplyResources(this.labCoreType4, "labCoreType4");
- this.labCoreType4.Name = "labCoreType4";
- //
- // cmbCoreType3
- //
- this.cmbCoreType3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType3.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3");
- this.cmbCoreType3.Name = "cmbCoreType3";
- //
- // labCoreType3
- //
- resources.ApplyResources(this.labCoreType3, "labCoreType3");
- this.labCoreType3.Name = "labCoreType3";
- //
- // cmbCoreType2
- //
- this.cmbCoreType2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType2.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2");
- this.cmbCoreType2.Name = "cmbCoreType2";
- //
- // labCoreType2
- //
- resources.ApplyResources(this.labCoreType2, "labCoreType2");
- this.labCoreType2.Name = "labCoreType2";
- //
- // cmbCoreType1
- //
- this.cmbCoreType1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbCoreType1.FormattingEnabled = true;
- resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1");
- this.cmbCoreType1.Name = "cmbCoreType1";
- //
- // labCoreType1
- //
- resources.ApplyResources(this.labCoreType1, "labCoreType1");
- this.labCoreType1.Name = "labCoreType1";
- //
- // tabPage3
- //
- this.tabPage3.Controls.Add(this.groupBox2);
- resources.ApplyResources(this.tabPage3, "tabPage3");
- this.tabPage3.Name = "tabPage3";
- this.tabPage3.UseVisualStyleBackColor = true;
- //
- // groupBox2
- //
- this.groupBox2.Controls.Add(this.label18);
- this.groupBox2.Controls.Add(this.cmbSystemProxyAdvancedProtocol);
- this.groupBox2.Controls.Add(this.label13);
- this.groupBox2.Controls.Add(this.label12);
- this.groupBox2.Controls.Add(this.txtsystemProxyExceptions);
- resources.ApplyResources(this.groupBox2, "groupBox2");
- this.groupBox2.Name = "groupBox2";
- this.groupBox2.TabStop = false;
- //
- // label18
- //
- resources.ApplyResources(this.label18, "label18");
- this.label18.Name = "label18";
- //
- // cmbSystemProxyAdvancedProtocol
- //
- this.cmbSystemProxyAdvancedProtocol.FormattingEnabled = true;
- resources.ApplyResources(this.cmbSystemProxyAdvancedProtocol, "cmbSystemProxyAdvancedProtocol");
- this.cmbSystemProxyAdvancedProtocol.Name = "cmbSystemProxyAdvancedProtocol";
- //
- // label13
- //
- resources.ApplyResources(this.label13, "label13");
- this.label13.Name = "label13";
- //
- // label12
- //
- resources.ApplyResources(this.label12, "label12");
- this.label12.Name = "label12";
- //
- // txtsystemProxyExceptions
- //
- resources.ApplyResources(this.txtsystemProxyExceptions, "txtsystemProxyExceptions");
- this.txtsystemProxyExceptions.Name = "txtsystemProxyExceptions";
- //
- // panel2
- //
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Name = "panel2";
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panel1
- //
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Name = "panel1";
- //
- // chkEnableCheckPreReleaseUpdate
- //
- resources.ApplyResources(this.chkEnableCheckPreReleaseUpdate, "chkEnableCheckPreReleaseUpdate");
- this.chkEnableCheckPreReleaseUpdate.Name = "chkEnableCheckPreReleaseUpdate";
- this.chkEnableCheckPreReleaseUpdate.UseVisualStyleBackColor = true;
- //
- // OptionSettingForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.tabControl1);
- this.Controls.Add(this.panel2);
- this.Controls.Add(this.panel1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "OptionSettingForm";
- this.Load += new System.EventHandler(this.OptionSettingForm_Load);
- this.tabControl1.ResumeLayout(false);
- this.tabPage1.ResumeLayout(false);
- this.groupBox1.ResumeLayout(false);
- this.groupBox1.PerformLayout();
- this.tabPage2.ResumeLayout(false);
- this.tabPage2.PerformLayout();
- this.tabPage6.ResumeLayout(false);
- this.tabPage6.PerformLayout();
- this.tabPage7.ResumeLayout(false);
- this.tabPage7.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numStatisticsFreshRate)).EndInit();
- this.tabPageCoreType.ResumeLayout(false);
- this.tabPageCoreType.PerformLayout();
- this.tabPage3.ResumeLayout(false);
- this.groupBox2.ResumeLayout(false);
- this.groupBox2.PerformLayout();
- this.panel2.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.ComboBox cmbloglevel;
- private System.Windows.Forms.Label label5;
- private System.Windows.Forms.TextBox txtlocalPort;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.CheckBox chklogEnabled;
- private System.Windows.Forms.CheckBox chkudpEnabled;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.TabControl tabControl1;
- private System.Windows.Forms.TabPage tabPage1;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.ComboBox cmbprotocol;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.CheckBox chkmuxEnabled;
- private System.Windows.Forms.TabPage tabPage6;
- private System.Windows.Forms.TextBox txtKcpmtu;
- private System.Windows.Forms.Label label6;
- private System.Windows.Forms.TextBox txtKcptti;
- private System.Windows.Forms.Label label7;
- private System.Windows.Forms.TextBox txtKcpwriteBufferSize;
- private System.Windows.Forms.Label label10;
- private System.Windows.Forms.TextBox txtKcpreadBufferSize;
- private System.Windows.Forms.Label label11;
- private System.Windows.Forms.TextBox txtKcpdownlinkCapacity;
- private System.Windows.Forms.Label label8;
- private System.Windows.Forms.TextBox txtKcpuplinkCapacity;
- private System.Windows.Forms.Label label9;
- private System.Windows.Forms.CheckBox chkKcpcongestion;
- private System.Windows.Forms.TabPage tabPage7;
- private System.Windows.Forms.CheckBox chkAutoRun;
- private System.Windows.Forms.CheckBox chkAllowLANConn;
- private System.Windows.Forms.CheckBox chksniffingEnabled;
- private System.Windows.Forms.CheckBox chkEnableStatistics;
- private System.Windows.Forms.Label lbFreshrate;
- private System.Windows.Forms.CheckBox chkKeepOlderDedupl;
- private System.Windows.Forms.CheckBox chkdefAllowInsecure;
- private System.Windows.Forms.TabPage tabPage2;
- private System.Windows.Forms.LinkLabel linkDnsObjectDoc;
- private System.Windows.Forms.TextBox txtremoteDNS;
- private System.Windows.Forms.Label label14;
- private System.Windows.Forms.CheckBox chkIgnoreGeoUpdateCore;
- private System.Windows.Forms.TabPage tabPage3;
- private System.Windows.Forms.TextBox txtsystemProxyExceptions;
- private System.Windows.Forms.Label label12;
- private System.Windows.Forms.GroupBox groupBox2;
- private System.Windows.Forms.Label label13;
- private System.Windows.Forms.TextBox txtautoUpdateInterval;
- private System.Windows.Forms.Label label15;
- private System.Windows.Forms.Button btnSetLoopback;
- private System.Windows.Forms.CheckBox chkEnableAutoAdjustMainLvColWidth;
- private System.Windows.Forms.CheckBox chkEnableSecurityProtocolTls13;
- private System.Windows.Forms.TabPage tabPageCoreType;
- private System.Windows.Forms.ComboBox cmbCoreType1;
- private System.Windows.Forms.Label labCoreType1;
- private System.Windows.Forms.ComboBox cmbCoreType6;
- private System.Windows.Forms.Label labCoreType6;
- private System.Windows.Forms.ComboBox cmbCoreType5;
- private System.Windows.Forms.Label labCoreType5;
- private System.Windows.Forms.ComboBox cmbCoreType4;
- private System.Windows.Forms.Label labCoreType4;
- private System.Windows.Forms.ComboBox cmbCoreType3;
- private System.Windows.Forms.Label labCoreType3;
- private System.Windows.Forms.ComboBox cmbCoreType2;
- private System.Windows.Forms.Label labCoreType2;
- private System.Windows.Forms.Label label16;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.TextBox txtpass;
- private System.Windows.Forms.TextBox txtuser;
- private System.Windows.Forms.TextBox txtautoUpdateSubInterval;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.TextBox txttrayMenuServersLimit;
- private System.Windows.Forms.Label label17;
- private System.Windows.Forms.ComboBox cmbSystemProxyAdvancedProtocol;
- private System.Windows.Forms.Label label18;
- private System.Windows.Forms.NumericUpDown numStatisticsFreshRate;
- private System.Windows.Forms.ComboBox cmbdomainStrategy4Freedom;
- private System.Windows.Forms.Label label19;
- private System.Windows.Forms.CheckBox chkEnableCheckPreReleaseUpdate;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs
deleted file mode 100644
index 4c357b83..00000000
--- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs
+++ /dev/null
@@ -1,341 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class OptionSettingForm : BaseForm
- {
- public OptionSettingForm()
- {
- InitializeComponent();
- }
-
- private void OptionSettingForm_Load(object sender, EventArgs e)
- {
- cmbSystemProxyAdvancedProtocol.Items.AddRange(Global.IEProxyProtocols.ToArray());
- cmbdomainStrategy4Freedom.Items.Clear();
- cmbdomainStrategy4Freedom.Items.AddRange(Global.domainStrategy4Freedoms.ToArray());
-
- InitBase();
-
- InitKCP();
-
- InitGUI();
-
- InitCoreType();
- }
-
- ///
- /// 初始化基础设置
- ///
- private void InitBase()
- {
- //日志
- chklogEnabled.Checked = config.logEnabled;
- cmbloglevel.Text = config.loglevel;
-
- //Mux
- chkmuxEnabled.Checked = config.muxEnabled;
-
- //本地监听
- if (config.inbound.Count > 0)
- {
- txtlocalPort.Text = config.inbound[0].localPort.ToString();
- cmbprotocol.Text = config.inbound[0].protocol.ToString();
- chkudpEnabled.Checked = config.inbound[0].udpEnabled;
- chksniffingEnabled.Checked = config.inbound[0].sniffingEnabled;
- chkAllowLANConn.Checked = config.inbound[0].allowLANConn;
- txtuser.Text = config.inbound[0].user;
- txtpass.Text = config.inbound[0].pass;
-
- }
-
- //remoteDNS
- txtremoteDNS.Text = config.remoteDNS;
- cmbdomainStrategy4Freedom.Text = config.domainStrategy4Freedom;
-
- chkdefAllowInsecure.Checked = config.defAllowInsecure;
-
- txtsystemProxyExceptions.Text = config.systemProxyExceptions;
-
- cmbSystemProxyAdvancedProtocol.Text = config.systemProxyAdvancedProtocol;
- }
-
-
- ///
- /// 初始化KCP设置
- ///
- private void InitKCP()
- {
- txtKcpmtu.Text = config.kcpItem.mtu.ToString();
- txtKcptti.Text = config.kcpItem.tti.ToString();
- txtKcpuplinkCapacity.Text = config.kcpItem.uplinkCapacity.ToString();
- txtKcpdownlinkCapacity.Text = config.kcpItem.downlinkCapacity.ToString();
- txtKcpreadBufferSize.Text = config.kcpItem.readBufferSize.ToString();
- txtKcpwriteBufferSize.Text = config.kcpItem.writeBufferSize.ToString();
- chkKcpcongestion.Checked = config.kcpItem.congestion;
- }
-
- ///
- /// 初始化v2rayN GUI设置
- ///
- private void InitGUI()
- {
- //开机自动启动
- chkAutoRun.Checked = Utils.IsAutoRun();
-
- chkEnableStatistics.Checked = config.enableStatistics;
- numStatisticsFreshRate.Value = config.statisticsFreshRate;
- chkKeepOlderDedupl.Checked = config.keepOlderDedupl;
-
- chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore;
- chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth;
- chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13;
-
- txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString();
- txtautoUpdateSubInterval.Text = config.autoUpdateSubInterval.ToString();
- chkEnableCheckPreReleaseUpdate.Checked = config.checkPreReleaseUpdate;
- txttrayMenuServersLimit.Text = config.trayMenuServersLimit.ToString();
- }
-
- private void InitCoreType()
- {
- if (config.coreTypeItem == null)
- {
- config.coreTypeItem = new List();
- }
-
- foreach (EConfigType it in Enum.GetValues(typeof(EConfigType)))
- {
- if (config.coreTypeItem.FindIndex(t => t.configType == it) >= 0)
- {
- continue;
- }
-
- config.coreTypeItem.Add(new CoreTypeItem()
- {
- configType = it,
- coreType = ECoreType.Xray
- });
- }
- for (int k = 1; k <= config.coreTypeItem.Count; k++)
- {
- var item = config.coreTypeItem[k - 1];
- ((ComboBox)tabPageCoreType.Controls[$"cmbCoreType{k}"]).Items.AddRange(Global.coreTypes.ToArray());
- tabPageCoreType.Controls[$"labCoreType{k}"].Text = item.configType.ToString();
- tabPageCoreType.Controls[$"cmbCoreType{k}"].Text = item.coreType.ToString();
- }
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- if (SaveBase() != 0)
- {
- return;
- }
-
-
- if (SaveKCP() != 0)
- {
- return;
- }
-
- if (SaveGUI() != 0)
- {
- return;
- }
-
- if (SaveCoreType() != 0)
- {
- return;
- }
-
- if (ConfigHandler.SaveConfig(ref config) == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
- }
-
- ///
- /// 保存基础设置
- ///
- ///
- private int SaveBase()
- {
- //日志
- bool logEnabled = chklogEnabled.Checked;
- string loglevel = cmbloglevel.Text.TrimEx();
-
- //Mux
- bool muxEnabled = chkmuxEnabled.Checked;
-
- //本地监听
- string localPort = txtlocalPort.Text.TrimEx();
- string protocol = cmbprotocol.Text.TrimEx();
- bool udpEnabled = chkudpEnabled.Checked;
- bool sniffingEnabled = chksniffingEnabled.Checked;
- bool allowLANConn = chkAllowLANConn.Checked;
- if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort))
- {
- UI.Show(ResUI.FillLocalListeningPort);
- return -1;
- }
- if (Utils.IsNullOrEmpty(protocol))
- {
- UI.Show(ResUI.PleaseSelectProtocol);
- return -1;
- }
-
- var remoteDNS = txtremoteDNS.Text.TrimEx();
- var obj = Utils.ParseJson(remoteDNS);
- if (obj != null && obj.ContainsKey("servers"))
- {
- }
- else
- {
- if (remoteDNS.Contains("{") || remoteDNS.Contains("}"))
- {
- UI.Show(ResUI.FillCorrectDNSText);
- return -1;
- }
- }
-
- config.inbound[0].localPort = Utils.ToInt(localPort);
- config.inbound[0].protocol = protocol;
- config.inbound[0].udpEnabled = udpEnabled;
- config.inbound[0].sniffingEnabled = sniffingEnabled;
- config.inbound[0].allowLANConn = allowLANConn;
- config.inbound[0].user = txtuser.Text;
- config.inbound[0].pass = txtpass.Text;
-
- if (config.inbound.Count > 1)
- {
- config.inbound.RemoveAt(1);
- }
-
-
- //日志
- config.logEnabled = logEnabled;
- config.loglevel = loglevel;
-
- //Mux
- config.muxEnabled = muxEnabled;
-
- //remoteDNS
- config.remoteDNS = txtremoteDNS.Text.TrimEx();
- config.domainStrategy4Freedom = cmbdomainStrategy4Freedom.Text;
-
- config.defAllowInsecure = chkdefAllowInsecure.Checked;
-
- config.systemProxyExceptions = txtsystemProxyExceptions.Text.TrimEx();
-
- config.systemProxyAdvancedProtocol = cmbSystemProxyAdvancedProtocol.Text.TrimEx();
-
- return 0;
- }
-
-
- ///
- /// 保存KCP设置
- ///
- ///
- private int SaveKCP()
- {
- string mtu = txtKcpmtu.Text.TrimEx();
- string tti = txtKcptti.Text.TrimEx();
- string uplinkCapacity = txtKcpuplinkCapacity.Text.TrimEx();
- string downlinkCapacity = txtKcpdownlinkCapacity.Text.TrimEx();
- string readBufferSize = txtKcpreadBufferSize.Text.TrimEx();
- string writeBufferSize = txtKcpwriteBufferSize.Text.TrimEx();
- bool congestion = chkKcpcongestion.Checked;
-
- if (Utils.IsNullOrEmpty(mtu) || !Utils.IsNumberic(mtu)
- || Utils.IsNullOrEmpty(tti) || !Utils.IsNumberic(tti)
- || Utils.IsNullOrEmpty(uplinkCapacity) || !Utils.IsNumberic(uplinkCapacity)
- || Utils.IsNullOrEmpty(downlinkCapacity) || !Utils.IsNumberic(downlinkCapacity)
- || Utils.IsNullOrEmpty(readBufferSize) || !Utils.IsNumberic(readBufferSize)
- || Utils.IsNullOrEmpty(writeBufferSize) || !Utils.IsNumberic(writeBufferSize))
- {
- UI.Show(ResUI.FillKcpParameters);
- return -1;
- }
- config.kcpItem.mtu = Utils.ToInt(mtu);
- config.kcpItem.tti = Utils.ToInt(tti);
- config.kcpItem.uplinkCapacity = Utils.ToInt(uplinkCapacity);
- config.kcpItem.downlinkCapacity = Utils.ToInt(downlinkCapacity);
- config.kcpItem.readBufferSize = Utils.ToInt(readBufferSize);
- config.kcpItem.writeBufferSize = Utils.ToInt(writeBufferSize);
- config.kcpItem.congestion = congestion;
-
- return 0;
- }
-
- ///
- /// 保存GUI设置
- ///
- ///
- private int SaveGUI()
- {
- //开机自动启动
- Utils.SetAutoRun(chkAutoRun.Checked);
-
- bool lastEnableStatistics = config.enableStatistics;
- config.enableStatistics = chkEnableStatistics.Checked;
- config.statisticsFreshRate = Convert.ToInt32(numStatisticsFreshRate.Value);
- if (config.statisticsFreshRate > 100 || config.statisticsFreshRate < 1)
- {
- config.statisticsFreshRate = 1;
- }
-
- config.keepOlderDedupl = chkKeepOlderDedupl.Checked;
-
- config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked;
- config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked;
- config.enableSecurityProtocolTls13 = chkEnableSecurityProtocolTls13.Checked;
-
- config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text);
- config.autoUpdateSubInterval = Utils.ToInt(txtautoUpdateSubInterval.Text);
- config.checkPreReleaseUpdate = chkEnableCheckPreReleaseUpdate.Checked;
- config.trayMenuServersLimit = Utils.ToInt(txttrayMenuServersLimit.Text);
- return 0;
- }
-
- private int SaveCoreType()
- {
- for (int k = 1; k <= config.coreTypeItem.Count; k++)
- {
- var item = config.coreTypeItem[k - 1];
- item.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), tabPageCoreType.Controls[$"cmbCoreType{k}"].Text);
- }
-
- return 0;
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
-
-
- private void linkDnsObjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- Process.Start("https://www.v2fly.org/config/dns.html#dnsobject");
- }
-
- private void btnSetLoopback_Click(object sender, EventArgs e)
- {
- Process.Start(Utils.GetPath("EnableLoopback.exe"));
- }
-
- }
-}
diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx
deleted file mode 100644
index c1cb6445..00000000
--- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx
+++ /dev/null
@@ -1,2898 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 355, 16
-
-
- 75, 23
-
-
-
- 7
-
-
- &Cancel
-
-
- btnClose
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 0
-
-
- groupBox1
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage1
-
-
- 0
-
-
- 4, 22
-
-
-
- 3, 3, 3, 3
-
-
- 728, 427
-
-
- 0
-
-
- Core: basic settings
-
-
- tabPage1
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabControl1
-
-
- 0
-
-
- cmbdomainStrategy4Freedom
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 0
-
-
- label19
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 1
-
-
- linkDnsObjectDoc
-
-
- System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 2
-
-
- txtremoteDNS
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 3
-
-
- label14
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 4
-
-
- 4, 22
-
-
- 728, 427
-
-
- 4
-
-
- Core: DNS settings
-
-
- tabPage2
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabControl1
-
-
- 1
-
-
- chkKcpcongestion
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 0
-
-
- txtKcpwriteBufferSize
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 1
-
-
- label10
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 2
-
-
- txtKcpreadBufferSize
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 3
-
-
- label11
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 4
-
-
- txtKcpdownlinkCapacity
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 5
-
-
- label8
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 6
-
-
- txtKcpuplinkCapacity
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 7
-
-
- label9
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 8
-
-
- txtKcptti
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 9
-
-
- label7
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 10
-
-
- txtKcpmtu
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 11
-
-
- label6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 12
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 728, 427
-
-
- 2
-
-
- Core: KCP settings
-
-
- tabPage6
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabControl1
-
-
- 2
-
-
- NoControl
-
-
- 15, 247
-
-
- 297, 16
-
-
- 48
-
-
- Check for pre-release updates
-
-
- chkEnableCheckPreReleaseUpdate
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 0
-
-
- 663, 37
-
-
- 62, 21
-
-
- 47
-
-
- numStatisticsFreshRate
-
-
- System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 1
-
-
- 351, 211
-
-
- 97, 21
-
-
- 45
-
-
- txttrayMenuServersLimit
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 27, 215
-
-
- 263, 12
-
-
- 44
-
-
- Tray right-click menu servers display limit
-
-
- label17
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 3
-
-
- 351, 184
-
-
- 97, 21
-
-
- 43
-
-
- txtautoUpdateSubInterval
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 4
-
-
- True
-
-
- NoControl
-
-
- 27, 188
-
-
- 305, 12
-
-
- 42
-
-
- Automatic update interval of subscriptions (hours)
-
-
- label3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 5
-
-
- 15, 131
-
-
- 506, 16
-
-
- 41
-
-
- Enable Security Protocol TLS v1.3 (subscription/update/speedtest)
-
-
- chkEnableSecurityProtocolTls13
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 6
-
-
- True
-
-
- NoControl
-
-
- 15, 108
-
-
- 390, 16
-
-
- 40
-
-
- Automatically adjust column width after updating subscription
-
-
- chkEnableAutoAdjustMainLvColWidth
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 7
-
-
- NoControl
-
-
- 30, 376
-
-
- 282, 23
-
-
- 39
-
-
- Set Windows10 UWP Loopback
-
-
- btnSetLoopback
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 8
-
-
- 351, 157
-
-
- 97, 21
-
-
- 38
-
-
- txtautoUpdateInterval
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 9
-
-
- True
-
-
- NoControl
-
-
- 27, 161
-
-
- 269, 12
-
-
- 37
-
-
- Automatic update interval of and Geo (hours)
-
-
- label15
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 10
-
-
- True
-
-
- NoControl
-
-
- 15, 85
-
-
- 234, 16
-
-
- 36
-
-
- Ignore Geo files when updating core
-
-
- chkIgnoreGeoUpdateCore
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 11
-
-
- True
-
-
- NoControl
-
-
- 15, 62
-
-
- 198, 16
-
-
- 33
-
-
- Keep older when deduplication
-
-
- chkKeepOlderDedupl
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 12
-
-
- True
-
-
- NoControl
-
-
- 479, 41
-
-
- 179, 12
-
-
- 30
-
-
- Statistics freshrate (second)
-
-
- lbFreshrate
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 13
-
-
- True
-
-
- NoControl
-
-
- 15, 39
-
-
- 468, 16
-
-
- 29
-
-
- Enable Statistics (Realtime netspeed and traffic records. Require restart)
-
-
- chkEnableStatistics
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 14
-
-
- True
-
-
- 15, 16
-
-
- 246, 16
-
-
- 23
-
-
- Automatically start at system startup
-
-
- chkAutoRun
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage7
-
-
- 15
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 728, 427
-
-
- 3
-
-
- v2rayN settings
-
-
- tabPage7
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabControl1
-
-
- 3
-
-
- cmbCoreType6
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 0
-
-
- labCoreType6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 1
-
-
- cmbCoreType5
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 2
-
-
- labCoreType5
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 3
-
-
- cmbCoreType4
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 4
-
-
- labCoreType4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 5
-
-
- cmbCoreType3
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 6
-
-
- labCoreType3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 7
-
-
- cmbCoreType2
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 8
-
-
- labCoreType2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 9
-
-
- cmbCoreType1
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 10
-
-
- labCoreType1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 11
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 728, 427
-
-
- 6
-
-
- CoreType settings
-
-
- tabPageCoreType
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabControl1
-
-
- 4
-
-
- groupBox2
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage3
-
-
- 0
-
-
- 4, 22
-
-
- 728, 427
-
-
- 5
-
-
- System proxy settings
-
-
- tabPage3
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabControl1
-
-
- 5
-
-
- Fill
-
-
- 0, 10
-
-
- 736, 453
-
-
- 10
-
-
- tabControl1
-
-
- System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- label16
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 0
-
-
- label4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 1
-
-
- txtpass
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 2
-
-
- txtuser
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 3
-
-
- chkdefAllowInsecure
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 4
-
-
- chkAllowLANConn
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 5
-
-
- chksniffingEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 6
-
-
- chkmuxEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 7
-
-
- cmbprotocol
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 8
-
-
- label1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 9
-
-
- chkudpEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 10
-
-
- chklogEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 11
-
-
- cmbloglevel
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 12
-
-
- label5
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 13
-
-
- txtlocalPort
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 14
-
-
- label2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 15
-
-
- Fill
-
-
- 3, 3
-
-
- 722, 421
-
-
- 6
-
-
- groupBox1
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage1
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 397, 65
-
-
- 59, 12
-
-
- 39
-
-
- Auth pass
-
-
- label16
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 224, 65
-
-
- 59, 12
-
-
- 38
-
-
- Auth user
-
-
- label4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 1
-
-
- 496, 61
-
-
- 120, 21
-
-
- 37
-
-
- txtpass
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 2
-
-
- 285, 61
-
-
- 97, 21
-
-
- 36
-
-
- txtuser
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 3
-
-
- True
-
-
- NoControl
-
-
- 15, 192
-
-
- 102, 16
-
-
- 35
-
-
- allowInsecure
-
-
- chkdefAllowInsecure
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 4
-
-
- True
-
-
- 15, 63
-
-
- 204, 16
-
-
- 29
-
-
- Allow connections from the LAN
-
-
- chkAllowLANConn
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 5
-
-
- True
-
-
- NoControl
-
-
- 496, 27
-
-
- 120, 16
-
-
- 31
-
-
- Turn on Sniffing
-
-
- chksniffingEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 6
-
-
- True
-
-
- 15, 129
-
-
- 174, 16
-
-
- 20
-
-
- Turn on Mux Multiplexing
-
-
- chkmuxEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 7
-
-
- False
-
-
- socks
-
-
- http
-
-
- 285, 25
-
-
- 97, 20
-
-
- 12
-
-
- cmbprotocol
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 8
-
-
- True
-
-
- 224, 29
-
-
- 53, 12
-
-
- 11
-
-
- protocol
-
-
- label1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 9
-
-
- True
-
-
- 397, 27
-
-
- 84, 16
-
-
- 10
-
-
- Enable UDP
-
-
- chkudpEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 10
-
-
- True
-
-
- 15, 160
-
-
- 126, 16
-
-
- 9
-
-
- Record local logs
-
-
- chklogEnabled
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 11
-
-
- debug
-
-
- info
-
-
- warning
-
-
- error
-
-
- none
-
-
- 257, 158
-
-
- 97, 20
-
-
- 6
-
-
- cmbloglevel
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 12
-
-
- True
-
-
- 193, 162
-
-
- 59, 12
-
-
- 8
-
-
- Log level
-
-
- label5
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 13
-
-
- 124, 25
-
-
- 78, 21
-
-
- 3
-
-
- txtlocalPort
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 14
-
-
- True
-
-
- 33, 29
-
-
- 89, 12
-
-
- 2
-
-
- Listening port
-
-
- label2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 15
-
-
- AsIs
-
-
- UseIP
-
-
- UseIPv4
-
-
- UseIPv6
-
-
- 223, 398
-
-
- 100, 20
-
-
- 41
-
-
- cmbdomainStrategy4Freedom
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 8, 402
-
-
- 191, 12
-
-
- 42
-
-
- Outbound Freedom domainStrategy
-
-
- label19
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 1
-
-
- True
-
-
- NoControl
-
-
- 342, 17
-
-
- 0, 0, 0, 0
-
-
- 107, 12
-
-
- 40
-
-
- Support DnsObject
-
-
- linkDnsObjectDoc
-
-
- System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 2
-
-
- 8, 41
-
-
- True
-
-
- Vertical
-
-
- 638, 349
-
-
- 39
-
-
- txtremoteDNS
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 3
-
-
- True
-
-
- NoControl
-
-
- 8, 17
-
-
- 281, 12
-
-
- 38
-
-
- Custom DNS (multiple, separated by commas (,))
-
-
- label14
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage2
-
-
- 4
-
-
- True
-
-
- 20, 143
-
-
- 84, 16
-
-
- 20
-
-
- congestion
-
-
- chkKcpcongestion
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 0
-
-
- 345, 100
-
-
- 94, 21
-
-
- 15
-
-
- txtKcpwriteBufferSize
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 1
-
-
- True
-
-
- 236, 104
-
-
- 95, 12
-
-
- 14
-
-
- writeBufferSize
-
-
- label10
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 2
-
-
- 111, 100
-
-
- 94, 21
-
-
- 13
-
-
- txtKcpreadBufferSize
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 3
-
-
- True
-
-
- 18, 104
-
-
- 89, 12
-
-
- 12
-
-
- readBufferSize
-
-
- label11
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 4
-
-
- 345, 62
-
-
- 94, 21
-
-
- 11
-
-
- txtKcpdownlinkCapacity
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 5
-
-
- True
-
-
- 236, 66
-
-
- 101, 12
-
-
- 10
-
-
- downlinkCapacity
-
-
- label8
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 6
-
-
- 111, 62
-
-
- 94, 21
-
-
- 9
-
-
- txtKcpuplinkCapacity
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 7
-
-
- True
-
-
- 18, 66
-
-
- 89, 12
-
-
- 8
-
-
- uplinkCapacity
-
-
- label9
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 8
-
-
- 345, 24
-
-
- 94, 21
-
-
- 7
-
-
- txtKcptti
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 9
-
-
- True
-
-
- 236, 28
-
-
- 23, 12
-
-
- 6
-
-
- tti
-
-
- label7
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 10
-
-
- 111, 24
-
-
- 94, 21
-
-
- 5
-
-
- txtKcpmtu
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 11
-
-
- True
-
-
- 18, 28
-
-
- 23, 12
-
-
- 4
-
-
- mtu
-
-
- label6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage6
-
-
- 12
-
-
- 117, 172
-
-
- 143, 20
-
-
- 46
-
-
- cmbCoreType6
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 45, 176
-
-
- 59, 12
-
-
- 47
-
-
- Core Type
-
-
- labCoreType6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 1
-
-
- 117, 146
-
-
- 143, 20
-
-
- 44
-
-
- cmbCoreType5
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 45, 150
-
-
- 59, 12
-
-
- 45
-
-
- Core Type
-
-
- labCoreType5
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 3
-
-
- 117, 120
-
-
- 143, 20
-
-
- 42
-
-
- cmbCoreType4
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 4
-
-
- True
-
-
- NoControl
-
-
- 45, 124
-
-
- 59, 12
-
-
- 43
-
-
- Core Type
-
-
- labCoreType4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 5
-
-
- 117, 94
-
-
- 143, 20
-
-
- 40
-
-
- cmbCoreType3
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 6
-
-
- True
-
-
- NoControl
-
-
- 45, 98
-
-
- 59, 12
-
-
- 41
-
-
- Core Type
-
-
- labCoreType3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 7
-
-
- 117, 68
-
-
- 143, 20
-
-
- 38
-
-
- cmbCoreType2
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 8
-
-
- True
-
-
- NoControl
-
-
- 45, 72
-
-
- 59, 12
-
-
- 39
-
-
- Core Type
-
-
- labCoreType2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 9
-
-
- 117, 42
-
-
- 143, 20
-
-
- 36
-
-
- cmbCoreType1
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 10
-
-
- True
-
-
- NoControl
-
-
- 45, 46
-
-
- 59, 12
-
-
- 37
-
-
- Core Type
-
-
- labCoreType1
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageCoreType
-
-
- 11
-
-
- label18
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 0
-
-
- cmbSystemProxyAdvancedProtocol
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 1
-
-
- label13
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 2
-
-
- label12
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 3
-
-
- txtsystemProxyExceptions
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 4
-
-
- Fill
-
-
- 0, 0
-
-
- 728, 427
-
-
- 42
-
-
- Exception
-
-
- groupBox2
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPage3
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 8, 346
-
-
- 329, 12
-
-
- 45
-
-
- Advanced proxy settings, protocol selection (optional)
-
-
- label18
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 0
-
-
- 8, 371
-
-
- 638, 20
-
-
- 44
-
-
- cmbSystemProxyAdvancedProtocol
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 1
-
-
- True
-
-
- NoControl
-
-
- 6, 283
-
-
- 107, 12
-
-
- 42
-
-
- Use semicolon (;)
-
-
- label13
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 8, 28
-
-
- 317, 12
-
-
- 40
-
-
- Do not use proxy server for addresses beginning with
-
-
- label12
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 3
-
-
- 8, 52
-
-
- True
-
-
- Vertical
-
-
- 638, 219
-
-
- 41
-
-
- txtsystemProxyExceptions
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 4
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 1
-
-
- Bottom
-
-
- 0, 463
-
-
- 736, 60
-
-
- 11
-
-
- panel2
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- 267, 16
-
-
- 75, 23
-
-
- 8
-
-
- &OK
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 1
-
-
- Top
-
-
- 0, 0
-
-
- 736, 10
-
-
- 9
-
-
- panel1
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 2
-
-
- True
-
-
- 6, 12
-
-
- 736, 523
-
-
- 4, 4, 4, 4
-
-
- Settings
-
-
- OptionSettingForm
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx
deleted file mode 100644
index 7434452d..00000000
--- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx
+++ /dev/null
@@ -1,394 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 取消(&C)
-
-
-
- 662, 469
-
-
- 654, 443
-
-
- Core:基础设置
-
-
- 648, 437
-
-
- 53, 12
-
-
- 认证密码
-
-
- 219, 65
-
-
- 65, 12
-
-
- 认证用户名
-
-
- 15, 208
-
-
- 324, 16
-
-
- 传输层安全选tls时,默认跳过证书验证(allowInsecure)
-
-
- 144, 16
-
-
- 允许来自局域网的连接
-
-
- 96, 16
-
-
- 开启流量探测
-
-
- 15, 145
-
-
- 114, 16
-
-
- 开启Mux多路复用
-
-
- 219, 29
-
-
- 29, 12
-
-
- 协议
-
-
- 66, 16
-
-
- 开启UDP
-
-
- 15, 176
-
-
- 156, 16
-
-
- 记录本地日志(默认关闭)
-
-
- 257, 174
-
-
- 193, 178
-
-
- 53, 12
-
-
- 日志等级
-
-
- 77, 12
-
-
- 本地监听端口
-
-
- 654, 443
-
-
- Core:DNS设置
-
-
- 223, 413
-
-
- 8, 417
-
-
- 161, 12
-
-
- 支持填写DnsObject,JSON格式
-
-
- 638, 366
-
-
- 191, 12
-
-
- 自定义DNS(可多个,用逗号(,)隔开)
-
-
- 654, 443
-
-
- Core:KCP设置
-
-
- 654, 443
-
-
- v2rayN设置
-
-
- 472, 37
-
-
- 248, 211
-
-
- 185, 12
-
-
- 托盘右键菜单服务器展示数量限制
-
-
- 248, 184
-
-
- 173, 12
-
-
- 自动更新订阅的间隔(单位小时)
-
-
- 启用安全协议TLS v1.3 (订阅/检查更新/测速)
-
-
- 204, 16
-
-
- 自动调整服务器列宽在更新订阅后
-
-
- 解除Windows10 UWP应用回环代理限制
-
-
- 248, 157
-
-
- 191, 12
-
-
- 自动更新Geo文件的间隔(单位小时)
-
-
- 150, 16
-
-
- 更新Core时忽略Geo文件
-
-
- 156, 16
-
-
- 去重时保留序号较小的项
-
-
- 339, 41
-
-
- 125, 12
-
-
- 统计刷新频率(单位秒)
-
-
- 300, 16
-
-
- 启用统计(实时网速显示和使用流量显示,需要重启)
-
-
- 180, 16
-
-
- 开机自动启动(可能会不成功)
-
-
- 654, 443
-
-
- Core类型设置
-
-
- 654, 443
-
-
- 系统代理设置
-
-
- 654, 443
-
-
- 例外
-
-
- 173, 12
-
-
- 高级代理设置, 协议选择(可选)
-
-
- 95, 12
-
-
- 使用分号(;)分隔
-
-
- 239, 12
-
-
- 对于下列字符开头的地址不使用代理服务器:
-
-
- 0, 479
-
-
- 662, 60
-
-
- 确定(&O)
-
-
- 662, 10
-
-
- 662, 539
-
-
- 参数设置
-
-
- 检查Pre-Release更新(请谨慎启用)
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs
deleted file mode 100644
index ca405968..00000000
--- a/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class QRCodeControl
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region 组件设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QRCodeControl));
- this.txtUrl = new System.Windows.Forms.TextBox();
- this.picQRCode = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit();
- this.SuspendLayout();
- //
- // txtUrl
- //
- resources.ApplyResources(this.txtUrl, "txtUrl");
- this.txtUrl.Name = "txtUrl";
- this.txtUrl.ReadOnly = true;
- //
- // picQRCode
- //
- resources.ApplyResources(this.picQRCode, "picQRCode");
- this.picQRCode.Name = "picQRCode";
- this.picQRCode.TabStop = false;
- //
- // QRCodeControl
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.picQRCode);
- this.Controls.Add(this.txtUrl);
- this.Name = "QRCodeControl";
- this.Load += new System.EventHandler(this.QRCodeControl_Load);
- ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.TextBox txtUrl;
- private System.Windows.Forms.PictureBox picQRCode;
- }
-}
diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs
deleted file mode 100644
index 89e47cd1..00000000
--- a/v2rayN/v2rayN/Forms/QRCodeControl.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System.Windows.Forms;
-using v2rayN.Handler;
-using v2rayN.Mode;
-
-namespace v2rayN.Forms
-{
- public partial class QRCodeControl : UserControl
- {
- public QRCodeControl()
- {
- InitializeComponent();
- }
- private void QRCodeControl_Load(object sender, System.EventArgs e)
- {
- txtUrl.MouseUp += txtUrl_MouseUp;
- }
-
- void txtUrl_MouseUp(object sender, MouseEventArgs e)
- {
- txtUrl.SelectAll();
- }
-
- public void showQRCode(VmessItem item)
- {
- if (item != null)
- {
- string url = ShareHandler.GetShareUrl(item);
- if (Utils.IsNullOrEmpty(url))
- {
- picQRCode.Image = null;
- txtUrl.Text = string.Empty;
- return;
- }
- txtUrl.Text = url;
- picQRCode.Image = QRCodeHelper.GetQRCode(url);
- }
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.resx b/v2rayN/v2rayN/Forms/QRCodeControl.resx
deleted file mode 100644
index a6ceff05..00000000
--- a/v2rayN/v2rayN/Forms/QRCodeControl.resx
+++ /dev/null
@@ -1,192 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- Bottom
-
-
-
- 0, 371
-
-
-
- True
-
-
- 356, 70
-
-
- 0
-
-
- txtUrl
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- Fill
-
-
- 0, 0
-
-
- 356, 371
-
-
- Zoom
-
-
- 24
-
-
- picQRCode
-
-
- System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- True
-
-
- 6, 12
-
-
- 356, 441
-
-
- QRCodeControl
-
-
- System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs
deleted file mode 100644
index 0b4e891b..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class RoutingRuleSettingDetailsForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingDetailsForm));
- this.panel1 = new System.Windows.Forms.Panel();
- this.panel3 = new System.Windows.Forms.Panel();
- this.linkRuleobjectDoc = new System.Windows.Forms.LinkLabel();
- this.chkEnabled = new System.Windows.Forms.CheckBox();
- this.clbInboundTag = new System.Windows.Forms.CheckedListBox();
- this.label2 = new System.Windows.Forms.Label();
- this.clbProtocol = new System.Windows.Forms.CheckedListBox();
- this.label3 = new System.Windows.Forms.Label();
- this.txtPort = new System.Windows.Forms.TextBox();
- this.label1 = new System.Windows.Forms.Label();
- this.labRoutingTips = new System.Windows.Forms.Label();
- this.label4 = new System.Windows.Forms.Label();
- this.cmbOutboundTag = new System.Windows.Forms.ComboBox();
- this.panel4 = new System.Windows.Forms.Panel();
- this.chkAutoSort = new System.Windows.Forms.CheckBox();
- this.btnClose = new System.Windows.Forms.Button();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel2 = new System.Windows.Forms.Panel();
- this.groupBox2 = new System.Windows.Forms.GroupBox();
- this.txtIP = new System.Windows.Forms.TextBox();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.txtDomain = new System.Windows.Forms.TextBox();
- this.panel3.SuspendLayout();
- this.panel4.SuspendLayout();
- this.panel2.SuspendLayout();
- this.groupBox2.SuspendLayout();
- this.groupBox1.SuspendLayout();
- this.SuspendLayout();
- //
- // panel1
- //
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Name = "panel1";
- //
- // panel3
- //
- resources.ApplyResources(this.panel3, "panel3");
- this.panel3.Controls.Add(this.linkRuleobjectDoc);
- this.panel3.Controls.Add(this.chkEnabled);
- this.panel3.Controls.Add(this.clbInboundTag);
- this.panel3.Controls.Add(this.label2);
- this.panel3.Controls.Add(this.clbProtocol);
- this.panel3.Controls.Add(this.label3);
- this.panel3.Controls.Add(this.txtPort);
- this.panel3.Controls.Add(this.label1);
- this.panel3.Controls.Add(this.labRoutingTips);
- this.panel3.Controls.Add(this.label4);
- this.panel3.Controls.Add(this.cmbOutboundTag);
- this.panel3.Name = "panel3";
- //
- // linkRuleobjectDoc
- //
- resources.ApplyResources(this.linkRuleobjectDoc, "linkRuleobjectDoc");
- this.linkRuleobjectDoc.Name = "linkRuleobjectDoc";
- this.linkRuleobjectDoc.TabStop = true;
- this.linkRuleobjectDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkRuleobjectDoc_LinkClicked);
- //
- // chkEnabled
- //
- resources.ApplyResources(this.chkEnabled, "chkEnabled");
- this.chkEnabled.Name = "chkEnabled";
- this.chkEnabled.UseVisualStyleBackColor = true;
- //
- // clbInboundTag
- //
- resources.ApplyResources(this.clbInboundTag, "clbInboundTag");
- this.clbInboundTag.CheckOnClick = true;
- this.clbInboundTag.FormattingEnabled = true;
- this.clbInboundTag.Items.AddRange(new object[] {
- resources.GetString("clbInboundTag.Items"),
- resources.GetString("clbInboundTag.Items1"),
- resources.GetString("clbInboundTag.Items2"),
- resources.GetString("clbInboundTag.Items3")});
- this.clbInboundTag.MultiColumn = true;
- this.clbInboundTag.Name = "clbInboundTag";
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // clbProtocol
- //
- resources.ApplyResources(this.clbProtocol, "clbProtocol");
- this.clbProtocol.CheckOnClick = true;
- this.clbProtocol.FormattingEnabled = true;
- this.clbProtocol.Items.AddRange(new object[] {
- resources.GetString("clbProtocol.Items"),
- resources.GetString("clbProtocol.Items1"),
- resources.GetString("clbProtocol.Items2")});
- this.clbProtocol.MultiColumn = true;
- this.clbProtocol.Name = "clbProtocol";
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // txtPort
- //
- resources.ApplyResources(this.txtPort, "txtPort");
- this.txtPort.Name = "txtPort";
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // labRoutingTips
- //
- resources.ApplyResources(this.labRoutingTips, "labRoutingTips");
- this.labRoutingTips.ForeColor = System.Drawing.Color.Brown;
- this.labRoutingTips.Name = "labRoutingTips";
- //
- // label4
- //
- resources.ApplyResources(this.label4, "label4");
- this.label4.Name = "label4";
- //
- // cmbOutboundTag
- //
- resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag");
- this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbOutboundTag.FormattingEnabled = true;
- this.cmbOutboundTag.Items.AddRange(new object[] {
- resources.GetString("cmbOutboundTag.Items"),
- resources.GetString("cmbOutboundTag.Items1"),
- resources.GetString("cmbOutboundTag.Items2")});
- this.cmbOutboundTag.Name = "cmbOutboundTag";
- //
- // panel4
- //
- resources.ApplyResources(this.panel4, "panel4");
- this.panel4.Controls.Add(this.chkAutoSort);
- this.panel4.Controls.Add(this.btnClose);
- this.panel4.Controls.Add(this.btnOK);
- this.panel4.Name = "panel4";
- //
- // chkAutoSort
- //
- resources.ApplyResources(this.chkAutoSort, "chkAutoSort");
- this.chkAutoSort.Name = "chkAutoSort";
- this.chkAutoSort.UseVisualStyleBackColor = true;
- //
- // btnClose
- //
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panel2
- //
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Controls.Add(this.groupBox2);
- this.panel2.Controls.Add(this.groupBox1);
- this.panel2.Name = "panel2";
- //
- // groupBox2
- //
- resources.ApplyResources(this.groupBox2, "groupBox2");
- this.groupBox2.Controls.Add(this.txtIP);
- this.groupBox2.Name = "groupBox2";
- this.groupBox2.TabStop = false;
- //
- // txtIP
- //
- resources.ApplyResources(this.txtIP, "txtIP");
- this.txtIP.Name = "txtIP";
- //
- // groupBox1
- //
- resources.ApplyResources(this.groupBox1, "groupBox1");
- this.groupBox1.Controls.Add(this.txtDomain);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.TabStop = false;
- //
- // txtDomain
- //
- resources.ApplyResources(this.txtDomain, "txtDomain");
- this.txtDomain.Name = "txtDomain";
- //
- // RoutingRuleSettingDetailsForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.panel2);
- this.Controls.Add(this.panel4);
- this.Controls.Add(this.panel3);
- this.Controls.Add(this.panel1);
- this.Name = "RoutingRuleSettingDetailsForm";
- this.Load += new System.EventHandler(this.RoutingRuleSettingDetailsForm_Load);
- this.panel3.ResumeLayout(false);
- this.panel3.PerformLayout();
- this.panel4.ResumeLayout(false);
- this.panel4.PerformLayout();
- this.panel2.ResumeLayout(false);
- this.groupBox2.ResumeLayout(false);
- this.groupBox2.PerformLayout();
- this.groupBox1.ResumeLayout(false);
- this.groupBox1.PerformLayout();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.Panel panel3;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.ComboBox cmbOutboundTag;
- private System.Windows.Forms.Panel panel4;
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.TextBox txtDomain;
- private System.Windows.Forms.GroupBox groupBox2;
- private System.Windows.Forms.TextBox txtIP;
- private System.Windows.Forms.Label labRoutingTips;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.TextBox txtPort;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.CheckedListBox clbProtocol;
- private System.Windows.Forms.CheckedListBox clbInboundTag;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.CheckBox chkEnabled;
- private System.Windows.Forms.CheckBox chkAutoSort;
- private System.Windows.Forms.LinkLabel linkRuleobjectDoc;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs
deleted file mode 100644
index fa600925..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs
+++ /dev/null
@@ -1,148 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class RoutingRuleSettingDetailsForm : BaseForm
- {
- public RulesItem rulesItem
- {
- get; set;
- }
-
- public RoutingRuleSettingDetailsForm()
- {
- InitializeComponent();
- }
-
- private void RoutingRuleSettingDetailsForm_Load(object sender, EventArgs e)
- {
- if (Utils.IsNullOrEmpty(rulesItem.outboundTag))
- {
- ClearBind();
- }
- else
- {
- BindingData();
- }
- }
-
- private void EndBindingData()
- {
- if (rulesItem != null)
- {
- rulesItem.port = txtPort.Text.TrimEx();
-
- var inboundTag = new List();
- for (int i = 0; i < clbInboundTag.Items.Count; i++)
- {
- if (clbInboundTag.GetItemChecked(i))
- {
- inboundTag.Add(clbInboundTag.Items[i].ToString());
- }
- }
- rulesItem.inboundTag = inboundTag;
- rulesItem.outboundTag = cmbOutboundTag.Text;
- if (chkAutoSort.Checked)
- {
- rulesItem.domain = Utils.String2ListSorted(txtDomain.Text);
- rulesItem.ip = Utils.String2ListSorted(txtIP.Text);
- }
- else
- {
- rulesItem.domain = Utils.String2List(txtDomain.Text);
- rulesItem.ip = Utils.String2List(txtIP.Text);
- }
-
- var protocol = new List();
- for (int i = 0; i < clbProtocol.Items.Count; i++)
- {
- if (clbProtocol.GetItemChecked(i))
- {
- protocol.Add(clbProtocol.Items[i].ToString());
- }
- }
- rulesItem.protocol = protocol;
- rulesItem.enabled = chkEnabled.Checked;
- }
- }
- private void BindingData()
- {
- if (rulesItem != null)
- {
- txtPort.Text = rulesItem.port ?? string.Empty;
- cmbOutboundTag.Text = rulesItem.outboundTag;
- txtDomain.Text = Utils.List2String(rulesItem.domain, true);
- txtIP.Text = Utils.List2String(rulesItem.ip, true);
-
- if (rulesItem.inboundTag != null)
- {
- for (int i = 0; i < clbInboundTag.Items.Count; i++)
- {
- if (rulesItem.inboundTag.Contains(clbInboundTag.Items[i].ToString()))
- {
- clbInboundTag.SetItemChecked(i, true);
- }
- }
- }
-
- if (rulesItem.protocol != null)
- {
- for (int i = 0; i < clbProtocol.Items.Count; i++)
- {
- if (rulesItem.protocol.Contains(clbProtocol.Items[i].ToString()))
- {
- clbProtocol.SetItemChecked(i, true);
- }
- }
- }
- chkEnabled.Checked = rulesItem.enabled;
- }
- }
- private void ClearBind()
- {
- txtPort.Text = string.Empty;
- cmbOutboundTag.Text = Global.agentTag;
- txtDomain.Text = string.Empty;
- txtIP.Text = string.Empty;
- chkEnabled.Checked = true;
- }
- private void btnOK_Click(object sender, EventArgs e)
- {
- EndBindingData();
-
- bool hasRule =
- rulesItem.domain != null
- && rulesItem.domain.Count > 0
- || rulesItem.ip != null
- && rulesItem.ip.Count > 0
- || rulesItem.protocol != null
- && rulesItem.protocol.Count > 0
- || !Utils.IsNullOrEmpty(rulesItem.port);
-
- if (!hasRule)
- {
- UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP"));
- return;
- }
-
- DialogResult = DialogResult.OK;
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
-
- private void linkRuleobjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- Process.Start("https://www.v2fly.org/config/routing.html#ruleobject");
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx
deleted file mode 100644
index e568dc8e..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx
+++ /dev/null
@@ -1,762 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- NoControl
-
-
- 0
-
-
- System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 32
-
-
- System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 245, 20
-
-
- 53, 12
-
-
- 31
-
-
- proxy
-
-
- 4, 4, 4, 4
-
-
- Fill
-
-
- panel1
-
-
- 3
-
-
- clbProtocol
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 8
-
-
- NoControl
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- 4
-
-
- Left
-
-
- 80
-
-
- NoControl
-
-
- 0
-
-
- 29, 12
-
-
- 2
-
-
- http
-
-
- True
-
-
- panel2
-
-
- tls
-
-
- RoutingSettingDetailsForm
-
-
- NoControl
-
-
- System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 7
-
-
- Fill
-
-
- 411, 15
-
-
- 119, 20
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 36
-
-
- Bottom
-
-
- 89, 12
-
-
- 1
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 344, 375
-
-
- $this
-
-
- 0
-
-
- 575, 16
-
-
- groupBox1
-
-
- NoControl
-
-
- 6
-
-
- label1
-
-
- 742, 395
-
-
- Protocol
-
-
- 10
-
-
- True
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel3
-
-
- True
-
-
- 3
-
-
- panel4
-
-
- 3
-
-
- bittorrent
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- NoControl
-
-
- 270, 16
-
-
- 144, 86
-
-
- 25
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 347, 16
-
-
- 3, 17
-
-
- panel3
-
-
- 41
-
-
- 80
-
-
- 0, 0
-
-
- 19, 20
-
-
- labRoutingTips
-
-
- 19, 47
-
-
- 39
-
-
- Fill
-
-
- True
-
-
- 2
-
-
- RoutingRuleSettingDetailsForm
-
-
- panel2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel3
-
-
- 107, 43
-
-
- groupBox2
-
-
- Ruleobject Doc
-
-
- 9
-
-
- 1
-
-
- 386, 375
-
-
- panel3
-
-
- http2
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- Fill
-
-
- panel4
-
-
- NoControl
-
-
- socks2
-
-
- $this
-
-
- 42
-
-
- groupBox2
-
-
- chkEnabled
-
-
- panel3
-
-
- 5
-
-
- panel3
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- http
-
-
- txtPort
-
-
- 3, 17
-
-
- 1
-
-
- 742, 10
-
-
- 0, 0
-
-
- groupBox1
-
-
- 24
-
-
- Port
-
-
- Enable
-
-
- label4
-
-
- &OK
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel4
-
-
- 34
-
-
- 274, 47
-
-
- 40
-
-
- block
-
-
- 33
-
-
- 347, 43
-
-
- panel3
-
-
- 0
-
-
- panel3
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- btnOK
-
-
- 0, 0, 0, 0
-
-
- 2
-
-
- 119, 21
-
-
- Top
-
-
- 4
-
-
- 7
-
-
- 0
-
-
- 11
-
-
- 0
-
-
- 43
-
-
- panel3
-
-
- 8
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- label3
-
-
- inboundTag
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 742, 60
-
-
- 0, 121
-
-
- chkAutoSort
-
-
- $this
-
-
- *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA>
-
-
- 345, 20
-
-
- linkRuleobjectDoc
-
-
- socks
-
-
- 65, 12
-
-
- btnClose
-
-
- 392, 0
-
-
- 742, 111
-
-
- True
-
-
- 6, 12
-
-
- 1
-
-
- 632, 45
-
-
- 0, 10
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 274, 20
-
-
- True
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- txtIP
-
-
- direct
-
-
- label2
-
-
- 60, 16
-
-
- cmbOutboundTag
-
-
- Domain and ip are auto sorted when saving
-
-
- True
-
-
- 19, 86
-
-
- NoControl
-
-
- 742, 576
-
-
- 10
-
-
- $this
-
-
- 392, 395
-
-
- 41, 18
-
-
- 75, 23
-
-
- clbInboundTag
-
-
- 5
-
-
- Top
-
-
- &Cancel
-
-
- NoControl
-
-
- NoControl
-
-
- True
-
-
- 4
-
-
- txtDomain
-
-
- 41
-
-
- IP
-
-
- panel3
-
-
- 75, 23
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 0, 516
-
-
- 71, 12
-
-
- 350, 395
-
-
- panel4
-
-
- panel3
-
-
- Domain
-
-
- 504, 15
-
-
- panel3
-
-
- 107, 16
-
-
- outboundTag
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 35
-
-
- True
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx
deleted file mode 100644
index 4c82eaf8..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx
+++ /dev/null
@@ -1,185 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 101, 12
-
-
- 规则详细说明文档
-
-
- 670, 48
-
-
- 372, 16
-
-
- 347, 20
-
-
- 279, 20
-
-
- 372, 46
-
-
- 272, 20
-
-
- 279, 50
-
-
- 120, 46
-
-
- 19, 50
-
-
- *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代
-
-
- OutboundTag
-
-
- 120, 16
-
-
- 168, 16
-
-
- 保存时Domain和IP自动排序
-
-
- 取消(&C)
-
-
- 确定(&O)
-
-
-
- Vertical
-
-
- Vertical
-
-
- 路由规则详情设置
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs
deleted file mode 100644
index 5f76c47d..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs
+++ /dev/null
@@ -1,357 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class RoutingRuleSettingForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel1 = new System.Windows.Forms.Panel();
- this.label5 = new System.Windows.Forms.Label();
- this.btnBrowse = new System.Windows.Forms.Button();
- this.txtCustomIcon = new System.Windows.Forms.TextBox();
- this.label4 = new System.Windows.Forms.Label();
- this.label1 = new System.Windows.Forms.Label();
- this.txtUrl = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.txtRemarks = new System.Windows.Forms.TextBox();
- this.label2 = new System.Windows.Forms.Label();
- this.lvRoutings = new v2rayN.Base.ListViewFlickerFree();
- this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.menuAdd = new System.Windows.Forms.ToolStripMenuItem();
- this.menuRemove = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem();
- this.menuExportSelectedRules = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
- this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem();
- this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem();
- this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
- this.tabControl2 = new System.Windows.Forms.TabControl();
- this.tabPage2 = new System.Windows.Forms.TabPage();
- this.menuServer = new System.Windows.Forms.MenuStrip();
- this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
- this.menuImportRulesFromFile = new System.Windows.Forms.ToolStripMenuItem();
- this.menuImportRulesFromClipboard = new System.Windows.Forms.ToolStripMenuItem();
- this.menuImportRulesFromUrl = new System.Windows.Forms.ToolStripMenuItem();
- this.panel2.SuspendLayout();
- this.panel1.SuspendLayout();
- this.cmsLv.SuspendLayout();
- this.tabControl2.SuspendLayout();
- this.tabPage2.SuspendLayout();
- this.menuServer.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // panel2
- //
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- this.panel2.Name = "panel2";
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panel1
- //
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Controls.Add(this.label5);
- this.panel1.Controls.Add(this.btnBrowse);
- this.panel1.Controls.Add(this.txtCustomIcon);
- this.panel1.Controls.Add(this.label4);
- this.panel1.Controls.Add(this.label1);
- this.panel1.Controls.Add(this.txtUrl);
- this.panel1.Controls.Add(this.label3);
- this.panel1.Controls.Add(this.txtRemarks);
- this.panel1.Controls.Add(this.label2);
- this.panel1.Name = "panel1";
- //
- // label5
- //
- resources.ApplyResources(this.label5, "label5");
- this.label5.Name = "label5";
- //
- // btnBrowse
- //
- resources.ApplyResources(this.btnBrowse, "btnBrowse");
- this.btnBrowse.Name = "btnBrowse";
- this.btnBrowse.UseVisualStyleBackColor = true;
- this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
- //
- // txtCustomIcon
- //
- resources.ApplyResources(this.txtCustomIcon, "txtCustomIcon");
- this.txtCustomIcon.Name = "txtCustomIcon";
- //
- // label4
- //
- resources.ApplyResources(this.label4, "label4");
- this.label4.Name = "label4";
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // txtUrl
- //
- resources.ApplyResources(this.txtUrl, "txtUrl");
- this.txtUrl.Name = "txtUrl";
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // txtRemarks
- //
- resources.ApplyResources(this.txtRemarks, "txtRemarks");
- this.txtRemarks.Name = "txtRemarks";
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // lvRoutings
- //
- resources.ApplyResources(this.lvRoutings, "lvRoutings");
- this.lvRoutings.ContextMenuStrip = this.cmsLv;
- this.lvRoutings.FullRowSelect = true;
- this.lvRoutings.GridLines = true;
- this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.lvRoutings.HideSelection = false;
- this.lvRoutings.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
- ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvRoutings.Items")))});
- this.lvRoutings.MultiSelect = false;
- this.lvRoutings.Name = "lvRoutings";
- this.lvRoutings.UseCompatibleStateImageBehavior = false;
- this.lvRoutings.View = System.Windows.Forms.View.Details;
- this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick);
- this.lvRoutings.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvRoutings_KeyDown);
- //
- // cmsLv
- //
- resources.ApplyResources(this.cmsLv, "cmsLv");
- this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20);
- this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuAdd,
- this.menuRemove,
- this.menuSelectAll,
- this.menuExportSelectedRules,
- this.toolStripSeparator3,
- this.menuMoveTop,
- this.menuMoveUp,
- this.menuMoveDown,
- this.menuMoveBottom});
- this.cmsLv.Name = "cmsLv";
- this.cmsLv.OwnerItem = this.MenuItem1;
- //
- // menuAdd
- //
- resources.ApplyResources(this.menuAdd, "menuAdd");
- this.menuAdd.Name = "menuAdd";
- this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click);
- //
- // menuRemove
- //
- resources.ApplyResources(this.menuRemove, "menuRemove");
- this.menuRemove.Name = "menuRemove";
- this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click);
- //
- // menuSelectAll
- //
- resources.ApplyResources(this.menuSelectAll, "menuSelectAll");
- this.menuSelectAll.Name = "menuSelectAll";
- this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click);
- //
- // menuExportSelectedRules
- //
- resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules");
- this.menuExportSelectedRules.Name = "menuExportSelectedRules";
- this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_Click);
- //
- // toolStripSeparator3
- //
- resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
- this.toolStripSeparator3.Name = "toolStripSeparator3";
- //
- // menuMoveTop
- //
- resources.ApplyResources(this.menuMoveTop, "menuMoveTop");
- this.menuMoveTop.Name = "menuMoveTop";
- this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click);
- //
- // menuMoveUp
- //
- resources.ApplyResources(this.menuMoveUp, "menuMoveUp");
- this.menuMoveUp.Name = "menuMoveUp";
- this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click);
- //
- // menuMoveDown
- //
- resources.ApplyResources(this.menuMoveDown, "menuMoveDown");
- this.menuMoveDown.Name = "menuMoveDown";
- this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click);
- //
- // menuMoveBottom
- //
- resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom");
- this.menuMoveBottom.Name = "menuMoveBottom";
- this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click);
- //
- // MenuItem1
- //
- resources.ApplyResources(this.MenuItem1, "MenuItem1");
- this.MenuItem1.DropDown = this.cmsLv;
- this.MenuItem1.Name = "MenuItem1";
- //
- // tabControl2
- //
- resources.ApplyResources(this.tabControl2, "tabControl2");
- this.tabControl2.Controls.Add(this.tabPage2);
- this.tabControl2.Name = "tabControl2";
- this.tabControl2.SelectedIndex = 0;
- //
- // tabPage2
- //
- resources.ApplyResources(this.tabPage2, "tabPage2");
- this.tabPage2.Controls.Add(this.lvRoutings);
- this.tabPage2.Name = "tabPage2";
- this.tabPage2.UseVisualStyleBackColor = true;
- //
- // menuServer
- //
- resources.ApplyResources(this.menuServer, "menuServer");
- this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.MenuItem1,
- this.toolStripMenuItem1});
- this.menuServer.Name = "menuServer";
- //
- // toolStripMenuItem1
- //
- resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1");
- this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuImportRulesFromFile,
- this.menuImportRulesFromClipboard,
- this.menuImportRulesFromUrl});
- this.toolStripMenuItem1.Name = "toolStripMenuItem1";
- //
- // menuImportRulesFromFile
- //
- resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile");
- this.menuImportRulesFromFile.Name = "menuImportRulesFromFile";
- this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click);
- //
- // menuImportRulesFromClipboard
- //
- resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard");
- this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard";
- this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click);
- //
- // menuImportRulesFromUrl
- //
- resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl");
- this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl";
- this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click);
- //
- // RoutingRuleSettingForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.tabControl2);
- this.Controls.Add(this.panel1);
- this.Controls.Add(this.panel2);
- this.Controls.Add(this.menuServer);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "RoutingRuleSettingForm";
- this.Load += new System.EventHandler(this.RoutingRuleSettingForm_Load);
- this.panel2.ResumeLayout(false);
- this.panel1.ResumeLayout(false);
- this.panel1.PerformLayout();
- this.cmsLv.ResumeLayout(false);
- this.tabControl2.ResumeLayout(false);
- this.tabPage2.ResumeLayout(false);
- this.menuServer.ResumeLayout(false);
- this.menuServer.PerformLayout();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Panel panel1;
- private Base.ListViewFlickerFree lvRoutings;
- private System.Windows.Forms.TabControl tabControl2;
- private System.Windows.Forms.TabPage tabPage2;
- private System.Windows.Forms.ContextMenuStrip cmsLv;
- private System.Windows.Forms.ToolStripMenuItem menuRemove;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
- private System.Windows.Forms.ToolStripMenuItem menuMoveTop;
- private System.Windows.Forms.ToolStripMenuItem menuMoveUp;
- private System.Windows.Forms.ToolStripMenuItem menuMoveDown;
- private System.Windows.Forms.ToolStripMenuItem menuMoveBottom;
- private System.Windows.Forms.ToolStripMenuItem menuSelectAll;
- private System.Windows.Forms.ToolStripMenuItem menuAdd;
- private System.Windows.Forms.MenuStrip menuServer;
- private System.Windows.Forms.ToolStripMenuItem MenuItem1;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
- private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromFile;
- private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromClipboard;
- private System.Windows.Forms.ToolStripMenuItem menuExportSelectedRules;
- private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromUrl;
- private System.Windows.Forms.TextBox txtRemarks;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox txtUrl;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.TextBox txtCustomIcon;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.Button btnBrowse;
- private System.Windows.Forms.Label label5;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs
deleted file mode 100644
index b88d67d1..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs
+++ /dev/null
@@ -1,365 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class RoutingRuleSettingForm : BaseForm
- {
- public int EditIndex
- {
- get; set;
- }
- protected RoutingItem routingItem;
-
- private readonly List lvSelecteds = new List();
- public RoutingRuleSettingForm()
- {
- InitializeComponent();
- }
-
- private void RoutingRuleSettingForm_Load(object sender, EventArgs e)
- {
- routingItem = EditIndex >= 0 ? config.routings[EditIndex] : new RoutingItem();
- if (routingItem.rules == null)
- {
- routingItem.rules = new List();
- }
-
- txtRemarks.Text = routingItem.remarks ?? string.Empty;
- txtUrl.Text = routingItem.url ?? string.Empty;
- txtCustomIcon.Text = routingItem.customIcon ?? string.Empty;
-
- InitRoutingsView();
- RefreshRoutingsView();
- }
-
- private void InitRoutingsView()
- {
- lvRoutings.BeginUpdate();
- lvRoutings.Items.Clear();
-
- lvRoutings.GridLines = true;
- lvRoutings.FullRowSelect = true;
- lvRoutings.View = View.Details;
- lvRoutings.MultiSelect = true;
- lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable;
- lvRoutings.RegisterDragEvent(UpdateDragEventHandler);
-
- lvRoutings.Columns.Add("", 30);
- lvRoutings.Columns.Add("outboundTag", 80);
- lvRoutings.Columns.Add("port", 80);
- lvRoutings.Columns.Add("protocol", 80);
- lvRoutings.Columns.Add("inboundTag", 80);
- lvRoutings.Columns.Add("domain", 160);
- lvRoutings.Columns.Add("ip", 160);
- lvRoutings.Columns.Add("enable", 60);
-
- lvRoutings.EndUpdate();
- }
- private void UpdateDragEventHandler(int index, int targetIndex)
- {
- if (index < 0 || targetIndex < 0)
- {
- return;
- }
- if (ConfigHandler.MoveRoutingRule(ref routingItem, index, EMove.Position, targetIndex) == 0)
- {
- RefreshRoutingsView();
- }
- }
-
- private void RefreshRoutingsView()
- {
- lvRoutings.BeginUpdate();
- lvRoutings.Items.Clear();
-
- foreach (var item in routingItem.rules)
- {
- ListViewItem lvItem = new ListViewItem("");
- Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag);
- Utils.AddSubItem(lvItem, "port", item.port);
- Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol));
- Utils.AddSubItem(lvItem, "inboundTag", Utils.List2String(item.inboundTag));
- Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain));
- Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip));
- Utils.AddSubItem(lvItem, "enable", item.enabled.ToString());
-
- if (lvItem != null) lvRoutings.Items.Add(lvItem);
- }
- lvRoutings.EndUpdate();
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- routingItem.remarks = txtRemarks.Text.Trim();
- routingItem.url = txtUrl.Text.Trim();
- routingItem.customIcon = txtCustomIcon.Text.Trim();
-
- if (ConfigHandler.AddRoutingItem(ref config, routingItem, EditIndex) == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
- private void btnBrowse_Click(object sender, EventArgs e)
- {
- OpenFileDialog openFileDialog1 = new OpenFileDialog();
- openFileDialog1.Filter = "PNG|*.png";
- openFileDialog1.ShowDialog();
- txtCustomIcon.Text = openFileDialog1.FileName;
-
- }
-
- private void lvRoutings_DoubleClick(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- var fm = new RoutingRuleSettingDetailsForm();
- fm.rulesItem = routingItem.rules[index];
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshRoutingsView();
- }
- }
-
- private int GetLvSelectedIndex()
- {
- int index = -1;
- lvSelecteds.Clear();
- try
- {
- if (lvRoutings.SelectedIndices.Count <= 0)
- {
- UI.Show(ResUI.PleaseSelectRules);
- return index;
- }
-
- index = lvRoutings.SelectedIndices[0];
- foreach (int i in lvRoutings.SelectedIndices)
- {
- lvSelecteds.Add(i);
- }
- return index;
- }
- catch
- {
- return index;
- }
- }
-
- #region Edit function
-
- private void menuMoveTop_Click(object sender, EventArgs e)
- {
- MoveRule(EMove.Top);
- }
-
- private void menuMoveUp_Click(object sender, EventArgs e)
- {
- MoveRule(EMove.Up);
- }
-
- private void menuMoveDown_Click(object sender, EventArgs e)
- {
- MoveRule(EMove.Down);
- }
-
- private void menuMoveBottom_Click(object sender, EventArgs e)
- {
- MoveRule(EMove.Bottom);
- }
-
- private void MoveRule(EMove eMove)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- UI.Show(ResUI.PleaseSelectRules);
- return;
- }
- if (ConfigHandler.MoveRoutingRule(ref routingItem, index, eMove) == 0)
- {
- RefreshRoutingsView();
- }
- }
- private void menuSelectAll_Click(object sender, EventArgs e)
- {
- foreach (ListViewItem item in lvRoutings.Items)
- {
- item.Selected = true;
- }
- }
-
- private void menuAdd_Click(object sender, EventArgs e)
- {
- var fm = new RoutingRuleSettingDetailsForm();
- fm.rulesItem = new RulesItem();
- if (fm.ShowDialog() == DialogResult.OK)
- {
- routingItem.rules.Insert(0, fm.rulesItem);
- RefreshRoutingsView();
- }
- }
-
- private void menuRemove_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- if (UI.ShowYesNo(ResUI.RemoveRules) == DialogResult.No)
- {
- return;
- }
- for (int k = lvSelecteds.Count - 1; k >= 0; k--)
- {
- routingItem.rules.RemoveAt(index);
- }
- RefreshRoutingsView();
- }
- private void menuExportSelectedRules_Click(object sender, EventArgs e)
- {
- GetLvSelectedIndex();
- var lst = new List();
- foreach (int v in lvSelecteds)
- {
- lst.Add(routingItem.rules[v]);
- }
- if (lst.Count > 0)
- {
- Utils.SetClipboardData(Utils.ToJson(lst));
- //UI.Show(ResUI.OperationSuccess"));
- }
-
- }
-
- private void lvRoutings_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.Control)
- {
- switch (e.KeyCode)
- {
- case Keys.A:
- menuSelectAll_Click(null, null);
- break;
- case Keys.C:
- menuExportSelectedRules_Click(null, null);
- break;
- }
- }
- else
- {
- switch (e.KeyCode)
- {
- case Keys.Delete:
- menuRemove_Click(null, null);
- break;
- case Keys.T:
- menuMoveTop_Click(null, null);
- break;
- case Keys.B:
- menuMoveBottom_Click(null, null);
- break;
- case Keys.U:
- menuMoveUp_Click(null, null);
- break;
- case Keys.D:
- menuMoveDown_Click(null, null);
- break;
- }
- }
- }
- #endregion
-
- #region preset rules
-
- private void menuImportRulesFromFile_Click(object sender, EventArgs e)
- {
- OpenFileDialog fileDialog = new OpenFileDialog
- {
- Multiselect = false,
- Filter = "Rules|*.json|All|*.*"
- };
- if (fileDialog.ShowDialog() != DialogResult.OK)
- {
- return;
- }
- string fileName = fileDialog.FileName;
- if (Utils.IsNullOrEmpty(fileName))
- {
- return;
- }
- string result = Utils.LoadResource(fileName);
- if (Utils.IsNullOrEmpty(result))
- {
- return;
- }
-
- if (AddBatchRoutingRules(ref routingItem, result) == 0)
- {
- RefreshRoutingsView();
- UI.Show(ResUI.OperationSuccess);
- }
- }
-
- private void menuImportRulesFromClipboard_Click(object sender, EventArgs e)
- {
- string clipboardData = Utils.GetClipboardData();
- if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0)
- {
- RefreshRoutingsView();
- UI.Show(ResUI.OperationSuccess);
- }
- }
- private void menuImportRulesFromUrl_Click(object sender, EventArgs e)
- {
- var url = txtUrl.Text.Trim();
- if (Utils.IsNullOrEmpty(url))
- {
- UI.Show(ResUI.MsgNeedUrl);
- return;
- }
-
- Task.Run(async () =>
- {
- DownloadHandle downloadHandle = new DownloadHandle();
- string result = await downloadHandle.DownloadStringAsync(url, false, "");
- if (AddBatchRoutingRules(ref routingItem, result) == 0)
- {
- RefreshRoutingsView();
- UI.Show(ResUI.OperationSuccess);
- }
- });
- }
- private int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData)
- {
- bool blReplace = false;
- if (UI.ShowYesNo(ResUI.AddBatchRoutingRulesYesNo) == DialogResult.No)
- {
- blReplace = true;
- }
- return ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData, blReplace);
- }
-
- #endregion
-
- }
-}
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx
deleted file mode 100644
index 481e5f26..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx
+++ /dev/null
@@ -1,785 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 199, 6
-
-
-
- Fill
-
-
- menuImportRulesFromUrl
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Down (D)
-
-
- 762, 25
-
-
-
- 32
-
-
- 5
-
-
- 47, 12
-
-
- Move to bottom (B)
-
-
- panel1
-
-
- 40
-
-
- Bottom
-
-
- Edit and Function
-
-
- panel1
-
-
- 3
-
-
- 75, 23
-
-
- NoControl
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4
-
-
- True
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 15
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4, 22
-
-
- $this
-
-
- panel1
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Rule Settings
-
-
- Remove selected
-
-
- NoControl
-
-
- tabPage2
-
-
- 4
-
-
- 202, 22
-
-
- 475, 17
-
-
- 75, 23
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 33
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- MenuItem1
-
-
- 0
-
-
- 754, 231
-
-
- 1
-
-
- 568, 17
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 8
-
-
- txtCustomIcon
-
-
- NoControl
-
-
- 0, 0
-
-
- label1
-
-
- 762, 60
-
-
- Sub Url
-
-
- 95, 21
-
-
- PNG(128*128)
-
-
- panel1
-
-
- True
-
-
- 120, 21
-
-
- True
-
-
- Import Rules From Sub Url
-
-
- 2
-
-
- menuSelectAll
-
-
- menuMoveTop
-
-
- 202, 22
-
-
- cmsLv
-
-
- 5
-
-
- Add
-
-
- 12
-
-
- toolStripSeparator3
-
-
- label5
-
-
- tabPage2
-
-
- 644, 48
-
-
- menuMoveBottom
-
-
- 0, 25
-
-
- 18, 105
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 18, 63
-
-
- Import Rules From File
-
-
- 202, 22
-
-
- 762, 257
-
-
- 1
-
-
- RoutingRuleSettingForm
-
-
- 166, 21
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 202, 22
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuServer
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 3
-
-
- System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- btnClose
-
-
- Up (U)
-
-
- 203, 186
-
-
- btnOK
-
-
- 47, 12
-
-
- 14
-
-
- Import Rules
-
-
- NoControl
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 3, 3
-
-
- 10, 117
-
-
- menuImportRulesFromClipboard
-
-
- Import Rules From Clipboard
-
-
- panel1
-
-
- menuAdd
-
-
- 0, 167
-
-
- 247, 22
-
-
- 4
-
-
- Move to top (T)
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 762, 142
-
-
- txtUrl
-
-
- 748, 225
-
-
- 660, 104
-
-
- $this
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
- 34
-
-
- 2
-
-
- 1
-
-
- label4
-
-
- &OK
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- 247, 22
-
-
- panel2
-
-
- 35
-
-
- v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- 71, 12
-
-
- 18, 45
-
-
- 31
-
-
- 91, 45
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuMoveDown
-
-
- panel2
-
-
- 202, 22
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuImportRulesFromFile
-
-
- label3
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 11
-
-
- panel2
-
-
- 7
-
-
- Vertical
-
-
- &Browse
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- tabControl2
-
-
- Remarks
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 3, 3, 3, 3
-
-
- 0, 424
-
-
- menuMoveUp
-
-
- RuleList
-
-
- toolStripMenuItem1
-
-
- 563, 21
-
-
- 0
-
-
- Select All (Ctrl+A)
-
-
- 53, 12
-
-
- Fill
-
-
- 18, 13
-
-
- 6, 12
-
-
- 37
-
-
- menuExportSelectedRules
-
-
- Optional
-
-
- Export Selected Rules
-
-
- 36
-
-
- 91, 13
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 247, 22
-
-
- 202, 22
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- lvRoutings
-
-
- 202, 22
-
-
- 91, 105
-
-
- label2
-
-
- menuRemove
-
-
- True
-
-
- NoControl
-
-
- NoControl
-
-
- 762, 484
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- btnBrowse
-
-
- $this
-
-
- NoControl
-
-
- 39
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 202, 22
-
-
- 6
-
-
- &Cancel
-
-
- NoControl
-
-
- 77, 12
-
-
- 0
-
-
- 7
-
-
- panel1
-
-
- 75, 23
-
-
- tabControl2
-
-
- panel1
-
-
- 0
-
-
- System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- txtRemarks
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- Custom icon
-
-
- 0
-
-
- Top
-
-
- True
-
-
- 25
-
-
- 139, 17
-
-
- 17, 17
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx
deleted file mode 100644
index 6c7dcd5f..00000000
--- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx
+++ /dev/null
@@ -1,300 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 取消(&C)
-
-
-
- 0, 501
-
-
- 785, 60
-
-
- 确定(&O)
-
-
- 785, 147
-
-
- 670, 104
-
-
- 浏览(&B)
-
-
- 101, 105
-
-
- 65, 12
-
-
- 自定义图标
-
-
- 29, 12
-
-
- 可选
-
-
- 101, 45
-
-
- 83, 12
-
-
- 订阅地址(Url)
-
-
- 101, 13
-
-
- 29, 12
-
-
- 别名
-
-
- 196, 22
-
-
- 添加规则
-
-
- 196, 22
-
-
- 移除所选规则
-
-
- 196, 22
-
-
- 全选
-
-
- 196, 22
-
-
- 导出所选规则至剪贴板
-
-
- 193, 6
-
-
- 196, 22
-
-
- 上移至顶 (T)
-
-
- 196, 22
-
-
- 上移 (U)
-
-
- 196, 22
-
-
- 下移 (D)
-
-
- 196, 22
-
-
- 下移至底 (B)
-
-
- 68, 21
-
-
- 规则功能
-
-
- 197, 186
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
- 771, 297
-
-
- 0, 172
-
-
- 785, 329
-
-
- 777, 303
-
-
- 规则列表
-
-
- 785, 25
-
-
- 68, 21
-
-
- 导入规则
-
-
- 189, 22
-
-
- 从文件中导入规则
-
-
- 189, 22
-
-
- 从剪贴板中导入规则
-
-
- 189, 22
-
-
- 从订阅Url中导入规则
-
-
- 785, 561
-
-
- 规则集设置
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs
deleted file mode 100644
index d9813d1b..00000000
--- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs
+++ /dev/null
@@ -1,482 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class RoutingSettingForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.panel2 = new System.Windows.Forms.Panel();
- this.labRoutingTips = new System.Windows.Forms.Label();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel1 = new System.Windows.Forms.Panel();
- this.cmbdomainMatcher = new System.Windows.Forms.ComboBox();
- this.label6 = new System.Windows.Forms.Label();
- this.chkenableRoutingAdvanced = new System.Windows.Forms.CheckBox();
- this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel();
- this.cmbdomainStrategy = new System.Windows.Forms.ComboBox();
- this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.menuAdd = new System.Windows.Forms.ToolStripMenuItem();
- this.menuRemove = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem();
- this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
- this.menuImportAdvancedRules = new System.Windows.Forms.ToolStripMenuItem();
- this.MenuItemAdvanced = new System.Windows.Forms.ToolStripMenuItem();
- this.menuServer = new System.Windows.Forms.MenuStrip();
- this.MenuItemBasic = new System.Windows.Forms.ToolStripMenuItem();
- this.menuImportBasicRules = new System.Windows.Forms.ToolStripMenuItem();
- this.tabNormal = new System.Windows.Forms.TabControl();
- this.tabPageProxy = new System.Windows.Forms.TabPage();
- this.panel5 = new System.Windows.Forms.Panel();
- this.groupBox5 = new System.Windows.Forms.GroupBox();
- this.txtProxyIp = new System.Windows.Forms.TextBox();
- this.groupBox6 = new System.Windows.Forms.GroupBox();
- this.txtProxyDomain = new System.Windows.Forms.TextBox();
- this.tabPageDirect = new System.Windows.Forms.TabPage();
- this.panel4 = new System.Windows.Forms.Panel();
- this.groupBox3 = new System.Windows.Forms.GroupBox();
- this.txtDirectIp = new System.Windows.Forms.TextBox();
- this.groupBox4 = new System.Windows.Forms.GroupBox();
- this.txtDirectDomain = new System.Windows.Forms.TextBox();
- this.tabPageBlock = new System.Windows.Forms.TabPage();
- this.panel3 = new System.Windows.Forms.Panel();
- this.groupBox2 = new System.Windows.Forms.GroupBox();
- this.txtBlockIp = new System.Windows.Forms.TextBox();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.txtBlockDomain = new System.Windows.Forms.TextBox();
- this.tabPageRuleList = new System.Windows.Forms.TabPage();
- this.lvRoutings = new v2rayN.Base.ListViewFlickerFree();
- this.panel2.SuspendLayout();
- this.panel1.SuspendLayout();
- this.cmsLv.SuspendLayout();
- this.menuServer.SuspendLayout();
- this.tabNormal.SuspendLayout();
- this.tabPageProxy.SuspendLayout();
- this.panel5.SuspendLayout();
- this.groupBox5.SuspendLayout();
- this.groupBox6.SuspendLayout();
- this.tabPageDirect.SuspendLayout();
- this.panel4.SuspendLayout();
- this.groupBox3.SuspendLayout();
- this.groupBox4.SuspendLayout();
- this.tabPageBlock.SuspendLayout();
- this.panel3.SuspendLayout();
- this.groupBox2.SuspendLayout();
- this.groupBox1.SuspendLayout();
- this.tabPageRuleList.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // panel2
- //
- this.panel2.Controls.Add(this.labRoutingTips);
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Name = "panel2";
- //
- // labRoutingTips
- //
- this.labRoutingTips.ForeColor = System.Drawing.Color.Brown;
- resources.ApplyResources(this.labRoutingTips, "labRoutingTips");
- this.labRoutingTips.Name = "labRoutingTips";
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // panel1
- //
- this.panel1.Controls.Add(this.cmbdomainMatcher);
- this.panel1.Controls.Add(this.label6);
- this.panel1.Controls.Add(this.chkenableRoutingAdvanced);
- this.panel1.Controls.Add(this.linkLabelRoutingDoc);
- this.panel1.Controls.Add(this.cmbdomainStrategy);
- resources.ApplyResources(this.panel1, "panel1");
- this.panel1.Name = "panel1";
- //
- // cmbdomainMatcher
- //
- this.cmbdomainMatcher.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbdomainMatcher.FormattingEnabled = true;
- resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher");
- this.cmbdomainMatcher.Name = "cmbdomainMatcher";
- //
- // label6
- //
- resources.ApplyResources(this.label6, "label6");
- this.label6.Name = "label6";
- //
- // chkenableRoutingAdvanced
- //
- resources.ApplyResources(this.chkenableRoutingAdvanced, "chkenableRoutingAdvanced");
- this.chkenableRoutingAdvanced.Name = "chkenableRoutingAdvanced";
- this.chkenableRoutingAdvanced.UseVisualStyleBackColor = true;
- this.chkenableRoutingAdvanced.CheckedChanged += new System.EventHandler(this.chkenableRoutingAdvanced_CheckedChanged_1);
- //
- // linkLabelRoutingDoc
- //
- resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc");
- this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc";
- this.linkLabelRoutingDoc.TabStop = true;
- this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked);
- //
- // cmbdomainStrategy
- //
- this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbdomainStrategy.FormattingEnabled = true;
- this.cmbdomainStrategy.Items.AddRange(new object[] {
- resources.GetString("cmbdomainStrategy.Items"),
- resources.GetString("cmbdomainStrategy.Items1"),
- resources.GetString("cmbdomainStrategy.Items2")});
- resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy");
- this.cmbdomainStrategy.Name = "cmbdomainStrategy";
- //
- // cmsLv
- //
- this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20);
- this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuAdd,
- this.menuRemove,
- this.menuSelectAll,
- this.menuSetDefaultRouting,
- this.toolStripSeparator1,
- this.menuImportAdvancedRules});
- this.cmsLv.Name = "cmsLv";
- this.cmsLv.OwnerItem = this.MenuItemAdvanced;
- resources.ApplyResources(this.cmsLv, "cmsLv");
- //
- // menuAdd
- //
- this.menuAdd.Name = "menuAdd";
- resources.ApplyResources(this.menuAdd, "menuAdd");
- this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click);
- //
- // menuRemove
- //
- this.menuRemove.Name = "menuRemove";
- resources.ApplyResources(this.menuRemove, "menuRemove");
- this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click);
- //
- // menuSelectAll
- //
- this.menuSelectAll.Name = "menuSelectAll";
- resources.ApplyResources(this.menuSelectAll, "menuSelectAll");
- this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click);
- //
- // menuSetDefaultRouting
- //
- this.menuSetDefaultRouting.Name = "menuSetDefaultRouting";
- resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting");
- this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click);
- //
- // toolStripSeparator1
- //
- this.toolStripSeparator1.Name = "toolStripSeparator1";
- resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
- //
- // menuImportAdvancedRules
- //
- this.menuImportAdvancedRules.Name = "menuImportAdvancedRules";
- resources.ApplyResources(this.menuImportAdvancedRules, "menuImportAdvancedRules");
- this.menuImportAdvancedRules.Click += new System.EventHandler(this.menuImportAdvancedRules_Click);
- //
- // MenuItemAdvanced
- //
- this.MenuItemAdvanced.DropDown = this.cmsLv;
- this.MenuItemAdvanced.Name = "MenuItemAdvanced";
- resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced");
- //
- // menuServer
- //
- this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.MenuItemBasic,
- this.MenuItemAdvanced});
- resources.ApplyResources(this.menuServer, "menuServer");
- this.menuServer.Name = "menuServer";
- //
- // MenuItemBasic
- //
- this.MenuItemBasic.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.menuImportBasicRules});
- this.MenuItemBasic.Name = "MenuItemBasic";
- resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic");
- //
- // menuImportBasicRules
- //
- this.menuImportBasicRules.Name = "menuImportBasicRules";
- resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules");
- this.menuImportBasicRules.Click += new System.EventHandler(this.menuImportBasicRules_Click);
- //
- // tabNormal
- //
- this.tabNormal.Controls.Add(this.tabPageProxy);
- this.tabNormal.Controls.Add(this.tabPageDirect);
- this.tabNormal.Controls.Add(this.tabPageBlock);
- this.tabNormal.Controls.Add(this.tabPageRuleList);
- resources.ApplyResources(this.tabNormal, "tabNormal");
- this.tabNormal.Name = "tabNormal";
- this.tabNormal.SelectedIndex = 0;
- this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting);
- //
- // tabPageProxy
- //
- this.tabPageProxy.Controls.Add(this.panel5);
- resources.ApplyResources(this.tabPageProxy, "tabPageProxy");
- this.tabPageProxy.Name = "tabPageProxy";
- this.tabPageProxy.UseVisualStyleBackColor = true;
- //
- // panel5
- //
- this.panel5.Controls.Add(this.groupBox5);
- this.panel5.Controls.Add(this.groupBox6);
- resources.ApplyResources(this.panel5, "panel5");
- this.panel5.Name = "panel5";
- //
- // groupBox5
- //
- this.groupBox5.Controls.Add(this.txtProxyIp);
- resources.ApplyResources(this.groupBox5, "groupBox5");
- this.groupBox5.Name = "groupBox5";
- this.groupBox5.TabStop = false;
- //
- // txtProxyIp
- //
- resources.ApplyResources(this.txtProxyIp, "txtProxyIp");
- this.txtProxyIp.Name = "txtProxyIp";
- //
- // groupBox6
- //
- this.groupBox6.Controls.Add(this.txtProxyDomain);
- resources.ApplyResources(this.groupBox6, "groupBox6");
- this.groupBox6.Name = "groupBox6";
- this.groupBox6.TabStop = false;
- //
- // txtProxyDomain
- //
- resources.ApplyResources(this.txtProxyDomain, "txtProxyDomain");
- this.txtProxyDomain.Name = "txtProxyDomain";
- //
- // tabPageDirect
- //
- this.tabPageDirect.Controls.Add(this.panel4);
- resources.ApplyResources(this.tabPageDirect, "tabPageDirect");
- this.tabPageDirect.Name = "tabPageDirect";
- this.tabPageDirect.UseVisualStyleBackColor = true;
- //
- // panel4
- //
- this.panel4.Controls.Add(this.groupBox3);
- this.panel4.Controls.Add(this.groupBox4);
- resources.ApplyResources(this.panel4, "panel4");
- this.panel4.Name = "panel4";
- //
- // groupBox3
- //
- this.groupBox3.Controls.Add(this.txtDirectIp);
- resources.ApplyResources(this.groupBox3, "groupBox3");
- this.groupBox3.Name = "groupBox3";
- this.groupBox3.TabStop = false;
- //
- // txtDirectIp
- //
- resources.ApplyResources(this.txtDirectIp, "txtDirectIp");
- this.txtDirectIp.Name = "txtDirectIp";
- //
- // groupBox4
- //
- this.groupBox4.Controls.Add(this.txtDirectDomain);
- resources.ApplyResources(this.groupBox4, "groupBox4");
- this.groupBox4.Name = "groupBox4";
- this.groupBox4.TabStop = false;
- //
- // txtDirectDomain
- //
- resources.ApplyResources(this.txtDirectDomain, "txtDirectDomain");
- this.txtDirectDomain.Name = "txtDirectDomain";
- //
- // tabPageBlock
- //
- this.tabPageBlock.Controls.Add(this.panel3);
- resources.ApplyResources(this.tabPageBlock, "tabPageBlock");
- this.tabPageBlock.Name = "tabPageBlock";
- this.tabPageBlock.UseVisualStyleBackColor = true;
- //
- // panel3
- //
- this.panel3.Controls.Add(this.groupBox2);
- this.panel3.Controls.Add(this.groupBox1);
- resources.ApplyResources(this.panel3, "panel3");
- this.panel3.Name = "panel3";
- //
- // groupBox2
- //
- this.groupBox2.Controls.Add(this.txtBlockIp);
- resources.ApplyResources(this.groupBox2, "groupBox2");
- this.groupBox2.Name = "groupBox2";
- this.groupBox2.TabStop = false;
- //
- // txtBlockIp
- //
- resources.ApplyResources(this.txtBlockIp, "txtBlockIp");
- this.txtBlockIp.Name = "txtBlockIp";
- //
- // groupBox1
- //
- this.groupBox1.Controls.Add(this.txtBlockDomain);
- resources.ApplyResources(this.groupBox1, "groupBox1");
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.TabStop = false;
- //
- // txtBlockDomain
- //
- resources.ApplyResources(this.txtBlockDomain, "txtBlockDomain");
- this.txtBlockDomain.Name = "txtBlockDomain";
- //
- // tabPageRuleList
- //
- this.tabPageRuleList.Controls.Add(this.lvRoutings);
- resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList");
- this.tabPageRuleList.Name = "tabPageRuleList";
- this.tabPageRuleList.UseVisualStyleBackColor = true;
- //
- // lvRoutings
- //
- this.lvRoutings.ContextMenuStrip = this.cmsLv;
- resources.ApplyResources(this.lvRoutings, "lvRoutings");
- this.lvRoutings.FullRowSelect = true;
- this.lvRoutings.GridLines = true;
- this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
- this.lvRoutings.HideSelection = false;
- this.lvRoutings.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
- ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvRoutings.Items")))});
- this.lvRoutings.MultiSelect = false;
- this.lvRoutings.Name = "lvRoutings";
- this.lvRoutings.UseCompatibleStateImageBehavior = false;
- this.lvRoutings.View = System.Windows.Forms.View.Details;
- this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick);
- //
- // RoutingSettingForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.tabNormal);
- this.Controls.Add(this.panel1);
- this.Controls.Add(this.panel2);
- this.Controls.Add(this.menuServer);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "RoutingSettingForm";
- this.Load += new System.EventHandler(this.RoutingSettingForm_Load);
- this.panel2.ResumeLayout(false);
- this.panel1.ResumeLayout(false);
- this.panel1.PerformLayout();
- this.cmsLv.ResumeLayout(false);
- this.menuServer.ResumeLayout(false);
- this.menuServer.PerformLayout();
- this.tabNormal.ResumeLayout(false);
- this.tabPageProxy.ResumeLayout(false);
- this.panel5.ResumeLayout(false);
- this.groupBox5.ResumeLayout(false);
- this.groupBox5.PerformLayout();
- this.groupBox6.ResumeLayout(false);
- this.groupBox6.PerformLayout();
- this.tabPageDirect.ResumeLayout(false);
- this.panel4.ResumeLayout(false);
- this.groupBox3.ResumeLayout(false);
- this.groupBox3.PerformLayout();
- this.groupBox4.ResumeLayout(false);
- this.groupBox4.PerformLayout();
- this.tabPageBlock.ResumeLayout(false);
- this.panel3.ResumeLayout(false);
- this.groupBox2.ResumeLayout(false);
- this.groupBox2.PerformLayout();
- this.groupBox1.ResumeLayout(false);
- this.groupBox1.PerformLayout();
- this.tabPageRuleList.ResumeLayout(false);
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.LinkLabel linkLabelRoutingDoc;
- private System.Windows.Forms.ComboBox cmbdomainStrategy;
- private System.Windows.Forms.ContextMenuStrip cmsLv;
- private System.Windows.Forms.ToolStripMenuItem menuRemove;
- private System.Windows.Forms.ToolStripMenuItem menuSelectAll;
- private System.Windows.Forms.ToolStripMenuItem menuAdd;
- private System.Windows.Forms.MenuStrip menuServer;
- private System.Windows.Forms.ToolStripMenuItem MenuItemAdvanced;
- private System.Windows.Forms.ToolStripMenuItem menuSetDefaultRouting;
- private System.Windows.Forms.TabControl tabNormal;
- private System.Windows.Forms.TabPage tabPageProxy;
- private System.Windows.Forms.TabPage tabPageDirect;
- private System.Windows.Forms.TabPage tabPageBlock;
- private System.Windows.Forms.Panel panel5;
- private System.Windows.Forms.GroupBox groupBox5;
- private System.Windows.Forms.TextBox txtProxyIp;
- private System.Windows.Forms.GroupBox groupBox6;
- private System.Windows.Forms.TextBox txtProxyDomain;
- private System.Windows.Forms.Panel panel4;
- private System.Windows.Forms.GroupBox groupBox3;
- private System.Windows.Forms.TextBox txtDirectIp;
- private System.Windows.Forms.GroupBox groupBox4;
- private System.Windows.Forms.TextBox txtDirectDomain;
- private System.Windows.Forms.Panel panel3;
- private System.Windows.Forms.GroupBox groupBox2;
- private System.Windows.Forms.TextBox txtBlockIp;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.TextBox txtBlockDomain;
- private System.Windows.Forms.TabPage tabPageRuleList;
- private Base.ListViewFlickerFree lvRoutings;
- private System.Windows.Forms.Label labRoutingTips;
- private System.Windows.Forms.CheckBox chkenableRoutingAdvanced;
- private System.Windows.Forms.ToolStripMenuItem MenuItemBasic;
- private System.Windows.Forms.ToolStripMenuItem menuImportBasicRules;
- private System.Windows.Forms.ComboBox cmbdomainMatcher;
- private System.Windows.Forms.Label label6;
- private System.Windows.Forms.ToolStripMenuItem menuImportAdvancedRules;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs
deleted file mode 100644
index a34b01d7..00000000
--- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs
+++ /dev/null
@@ -1,320 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class RoutingSettingForm : BaseForm
- {
- private readonly List _lvSelecteds = new List();
- private RoutingItem _lockedItem;
- public RoutingSettingForm()
- {
- InitializeComponent();
- }
-
- private void RoutingSettingForm_Load(object sender, EventArgs e)
- {
- ConfigHandler.InitBuiltinRouting(ref config);
- cmbdomainMatcher.Items.AddRange(Global.domainMatchers.ToArray());
-
- cmbdomainStrategy.Text = config.domainStrategy;
- chkenableRoutingAdvanced.Checked = config.enableRoutingAdvanced;
- cmbdomainMatcher.Text = config.domainMatcher;
-
- if (config.routings == null)
- {
- config.routings = new List();
- }
- InitRoutingsView();
- RefreshRoutingsView();
-
- BindingLockedData();
- InitUI();
- }
-
-
- private void tabNormal_Selecting(object sender, TabControlCancelEventArgs e)
- {
- //if (tabNormal.SelectedTab == tabPageRuleList)
- //{
- // MenuItem1.Enabled = true;
- //}
- //else
- //{
- // MenuItem1.Enabled = false;
- //}
- }
- private void btnOK_Click(object sender, EventArgs e)
- {
- config.domainStrategy = cmbdomainStrategy.Text;
- config.enableRoutingAdvanced = chkenableRoutingAdvanced.Checked;
- config.domainMatcher = cmbdomainMatcher.Text;
-
- EndBindingLockedData();
-
- if (ConfigHandler.SaveRouting(ref config) == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
- private void chkenableRoutingAdvanced_CheckedChanged_1(object sender, EventArgs e)
- {
- InitUI();
- }
- private void InitUI()
- {
- if (chkenableRoutingAdvanced.Checked)
- {
- tabPageProxy.Parent = null;
- tabPageDirect.Parent = null;
- tabPageBlock.Parent = null;
- tabPageRuleList.Parent = tabNormal;
- MenuItemBasic.Enabled = false;
- MenuItemAdvanced.Enabled = true;
-
- }
- else
- {
- tabPageProxy.Parent = tabNormal;
- tabPageDirect.Parent = tabNormal;
- tabPageBlock.Parent = tabNormal;
- tabPageRuleList.Parent = null;
- MenuItemBasic.Enabled = true;
- MenuItemAdvanced.Enabled = false;
- }
-
- }
-
-
- #region locked
- private void BindingLockedData()
- {
- _lockedItem = ConfigHandler.GetLockedRoutingItem(ref config);
- if (_lockedItem != null)
- {
- txtProxyDomain.Text = Utils.List2String(_lockedItem.rules[0].domain, true);
- txtProxyIp.Text = Utils.List2String(_lockedItem.rules[0].ip, true);
-
- txtDirectDomain.Text = Utils.List2String(_lockedItem.rules[1].domain, true);
- txtDirectIp.Text = Utils.List2String(_lockedItem.rules[1].ip, true);
-
- txtBlockDomain.Text = Utils.List2String(_lockedItem.rules[2].domain, true);
- txtBlockIp.Text = Utils.List2String(_lockedItem.rules[2].ip, true);
- }
- }
- private void EndBindingLockedData()
- {
- if (_lockedItem != null)
- {
- _lockedItem.rules[0].domain = Utils.String2List(txtProxyDomain.Text.TrimEx());
- _lockedItem.rules[0].ip = Utils.String2List(txtProxyIp.Text.TrimEx());
-
- _lockedItem.rules[1].domain = Utils.String2List(txtDirectDomain.Text.TrimEx());
- _lockedItem.rules[1].ip = Utils.String2List(txtDirectIp.Text.TrimEx());
-
- _lockedItem.rules[2].domain = Utils.String2List(txtBlockDomain.Text.TrimEx());
- _lockedItem.rules[2].ip = Utils.String2List(txtBlockIp.Text.TrimEx());
-
- }
- }
- #endregion
-
- #region ListView
- private void InitRoutingsView()
- {
- lvRoutings.BeginUpdate();
- lvRoutings.Items.Clear();
-
- lvRoutings.GridLines = true;
- lvRoutings.FullRowSelect = true;
- lvRoutings.View = View.Details;
- lvRoutings.MultiSelect = true;
- lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable;
-
- lvRoutings.Columns.Add("", 30);
- lvRoutings.Columns.Add(ResUI.LvAlias, 200);
- lvRoutings.Columns.Add(ResUI.LvCount, 60);
- lvRoutings.Columns.Add(ResUI.LvUrl, 240);
- lvRoutings.Columns.Add(ResUI.LvCustomIcon, 240);
-
- lvRoutings.EndUpdate();
- }
-
- private void RefreshRoutingsView()
- {
- lvRoutings.BeginUpdate();
- lvRoutings.Items.Clear();
-
- for (int k = 0; k < config.routings.Count; k++)
- {
- var item = config.routings[k];
- if (item.locked == true)
- {
- continue;
- }
-
- string def = string.Empty;
- if (config.routingIndex.Equals(k))
- {
- def = Global.CheckMark;
- }
-
- ListViewItem lvItem = new ListViewItem(def);
- Utils.AddSubItem(lvItem, "remarks", item.remarks);
- Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString());
- Utils.AddSubItem(lvItem, "url", item.url);
- Utils.AddSubItem(lvItem, "customIcon", item.customIcon);
-
- if (lvItem != null) lvRoutings.Items.Add(lvItem);
- }
- lvRoutings.EndUpdate();
- }
-
-
- private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html");
- }
-
- private void lvRoutings_DoubleClick(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- var fm = new RoutingRuleSettingForm();
- fm.EditIndex = index;
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshRoutingsView();
- }
- }
-
- private int GetLvSelectedIndex()
- {
- int index = -1;
- _lvSelecteds.Clear();
- try
- {
- if (lvRoutings.SelectedIndices.Count <= 0)
- {
- UI.Show(ResUI.PleaseSelectRules);
- return index;
- }
-
- index = lvRoutings.SelectedIndices[0];
- foreach (int i in lvRoutings.SelectedIndices)
- {
- _lvSelecteds.Add(i);
- }
- return index;
- }
- catch
- {
- return index;
- }
- }
-
- #endregion
-
-
- #region Edit function
-
-
- private void menuSelectAll_Click(object sender, EventArgs e)
- {
- foreach (ListViewItem item in lvRoutings.Items)
- {
- item.Selected = true;
- }
- }
-
- private void menuAdd_Click(object sender, EventArgs e)
- {
- var fm = new RoutingRuleSettingForm();
- fm.EditIndex = -1;
- if (fm.ShowDialog() == DialogResult.OK)
- {
- RefreshRoutingsView();
- }
- }
-
- private void menuRemove_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- if (UI.ShowYesNo(ResUI.RemoveRules) == DialogResult.No)
- {
- return;
- }
- for (int k = _lvSelecteds.Count - 1; k >= 0; k--)
- {
- config.routings.RemoveAt(index);
- }
- RefreshRoutingsView();
- }
- private void menuSetDefaultRouting_Click(object sender, EventArgs e)
- {
- int index = GetLvSelectedIndex();
- if (index < 0)
- {
- return;
- }
- SetDefaultRouting(index);
- }
- private int SetDefaultRouting(int index)
- {
- if (index < 0)
- {
- UI.Show(ResUI.PleaseSelectServer);
- return -1;
- }
- if (ConfigHandler.SetDefaultRouting(ref config, index) == 0)
- {
- RefreshRoutingsView();
- }
- return 0;
- }
-
- private void menuImportBasicRules_Click(object sender, EventArgs e)
- {
- //Extra to bypass the mainland
- txtProxyDomain.Text = "geosite:google";
- txtDirectDomain.Text = "geosite:cn";
- txtDirectIp.Text = "geoip:private,geoip:cn";
-
- txtBlockDomain.Text = "geosite:category-ads-all";
-
- UI.Show(ResUI.OperationSuccess);
- }
-
- private void menuImportAdvancedRules_Click(object sender, EventArgs e)
- {
- if (ConfigHandler.InitBuiltinRouting(ref config, true) == 0)
- {
- RefreshRoutingsView();
- }
- }
-
- #endregion
-
- }
-}
diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx
deleted file mode 100644
index 98640e3f..00000000
--- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx
+++ /dev/null
@@ -1,1142 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- NoControl
-
-
-
- 753, 17
-
-
- 75, 23
-
-
-
- 4
-
-
- &Cancel
-
-
- btnClose
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 1
-
-
- NoControl
-
-
- 5, 22
-
-
- 562, 16
-
-
- 34
-
-
- *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA>
-
-
- labRoutingTips
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 0
-
-
- NoControl
-
-
- 660, 17
-
-
- 75, 23
-
-
- 5
-
-
- &OK
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 2
-
-
- Bottom
-
-
- 0, 613
-
-
- 853, 60
-
-
- 7
-
-
- panel2
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 3
-
-
- 681, 17
-
-
- 116, 20
-
-
- 28
-
-
- cmbdomainMatcher
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 0
-
-
- True
-
-
- NoControl
-
-
- 575, 21
-
-
- 89, 12
-
-
- 27
-
-
- Domain Matcher
-
-
- label6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 1
-
-
- True
-
-
- NoControl
-
-
- 318, 17
-
-
- 216, 16
-
-
- 26
-
-
- Enable advanced routing function
-
-
- chkenableRoutingAdvanced
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 2
-
-
- True
-
-
- NoControl
-
-
- 6, 21
-
-
- 0, 0, 0, 0
-
-
- 95, 12
-
-
- 19
-
-
- Domain strategy
-
-
- linkLabelRoutingDoc
-
-
- System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 3
-
-
- AsIs
-
-
- IPIfNonMatch
-
-
- IPOnDemand
-
-
- 116, 17
-
-
- 165, 20
-
-
- 16
-
-
- cmbdomainStrategy
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel1
-
-
- 4
-
-
- Top
-
-
- 0, 25
-
-
- 853, 51
-
-
- 11
-
-
- panel1
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 2
-
-
- 17, 17
-
-
- 212, 22
-
-
- Add
-
-
- 212, 22
-
-
- Remove selected
-
-
- 212, 22
-
-
- Select All (Ctrl+A)
-
-
- 212, 22
-
-
- Set as active routing
-
-
- 209, 6
-
-
- 212, 22
-
-
- Import Advanced Rules
-
-
- 129, 21
-
-
- Advanced Function
-
-
- 213, 120
-
-
- cmsLv
-
-
- System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 139, 17
-
-
- 185, 22
-
-
- Import Basic Rules
-
-
- 102, 21
-
-
- Basic Function
-
-
- 0, 0
-
-
- 853, 25
-
-
- 15
-
-
- menuServer
-
-
- System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 4
-
-
- Fill
-
-
- 3, 17
-
-
- True
-
-
- Vertical
-
-
- 441, 485
-
-
- 25
-
-
- txtProxyIp
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox5
-
-
- 0
-
-
- Fill
-
-
- 392, 0
-
-
- 447, 505
-
-
- 4
-
-
- IP
-
-
- groupBox5
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel5
-
-
- 0
-
-
- Fill
-
-
- 3, 17
-
-
- True
-
-
- Vertical
-
-
- 386, 485
-
-
- 24
-
-
- txtProxyDomain
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox6
-
-
- 0
-
-
- Left
-
-
- 0, 0
-
-
- 392, 505
-
-
- 3
-
-
- Domain
-
-
- groupBox6
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel5
-
-
- 1
-
-
- Fill
-
-
- 3, 3
-
-
- 839, 505
-
-
- 12
-
-
- panel5
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageProxy
-
-
- 0
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 845, 511
-
-
- 0
-
-
- 1.Proxy Domain or IP
-
-
- tabPageProxy
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabNormal
-
-
- 0
-
-
- Fill
-
-
- 3, 17
-
-
- True
-
-
- Vertical
-
-
- 441, 485
-
-
- 25
-
-
- txtDirectIp
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox3
-
-
- 0
-
-
- Fill
-
-
- 392, 0
-
-
- 447, 505
-
-
- 4
-
-
- IP
-
-
- groupBox3
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel4
-
-
- 0
-
-
- Fill
-
-
- 3, 17
-
-
- True
-
-
- Vertical
-
-
- 386, 485
-
-
- 24
-
-
- txtDirectDomain
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox4
-
-
- 0
-
-
- Left
-
-
- 0, 0
-
-
- 392, 505
-
-
- 3
-
-
- Domain
-
-
- groupBox4
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel4
-
-
- 1
-
-
- Fill
-
-
- 3, 3
-
-
- 839, 505
-
-
- 12
-
-
- panel4
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageDirect
-
-
- 0
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 845, 511
-
-
- 1
-
-
- 2.Direct Domain or IP
-
-
- tabPageDirect
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabNormal
-
-
- 1
-
-
- Fill
-
-
- 3, 17
-
-
- True
-
-
- Vertical
-
-
- 441, 485
-
-
- 25
-
-
- txtBlockIp
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox2
-
-
- 0
-
-
- Fill
-
-
- 392, 0
-
-
- 447, 505
-
-
- 4
-
-
- IP
-
-
- groupBox2
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel3
-
-
- 0
-
-
- Fill
-
-
- 3, 17
-
-
- True
-
-
- Vertical
-
-
- 386, 485
-
-
- 24
-
-
- txtBlockDomain
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- groupBox1
-
-
- 0
-
-
- Left
-
-
- 0, 0
-
-
- 392, 505
-
-
- 3
-
-
- Domain
-
-
- groupBox1
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel3
-
-
- 1
-
-
- Fill
-
-
- 3, 3
-
-
- 839, 505
-
-
- 12
-
-
- panel3
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabPageBlock
-
-
- 0
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 845, 511
-
-
- 2
-
-
- 3.Block Domain or IP
-
-
- tabPageBlock
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabNormal
-
-
- 2
-
-
- Fill
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
- 3, 3
-
-
- 839, 505
-
-
- 15
-
-
- lvRoutings
-
-
- v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
- tabPageRuleList
-
-
- 0
-
-
- 4, 22
-
-
- 3, 3, 3, 3
-
-
- 845, 511
-
-
- 3
-
-
- Pre-defined Rule Set List
-
-
- tabPageRuleList
-
-
- System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tabNormal
-
-
- 3
-
-
- Fill
-
-
- 0, 76
-
-
- 853, 537
-
-
- 16
-
-
- tabNormal
-
-
- System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- True
-
-
- 6, 12
-
-
- 853, 673
-
-
- Routing Settings
-
-
- menuAdd
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuRemove
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSelectAll
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuSetDefaultRouting
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- toolStripSeparator1
-
-
- System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuImportAdvancedRules
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- MenuItemAdvanced
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- MenuItemBasic
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- menuImportBasicRules
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- RoutingSettingForm
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx
deleted file mode 100644
index fe451130..00000000
--- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx
+++ /dev/null
@@ -1,315 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 691, 17
-
-
- 取消(&C)
-
-
- 0, 545
-
-
- 817, 60
-
-
- 518, 16
-
-
- *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代
-
-
- 598, 17
-
-
- 确定(&O)
-
-
- 817, 51
-
-
- 77, 12
-
-
- 域名匹配算法
-
-
- 120, 16
-
-
- 启用路由高级功能
-
-
- 77, 12
-
-
- 域名解析策略
-
-
- 149, 114
-
-
- 148, 22
-
-
- 添加规则集
-
-
- 148, 22
-
-
- 移除所选规则
-
-
- 148, 22
-
-
- 全选
-
-
- 148, 22
-
-
- 设为活动路由
-
-
- 68, 21
-
-
- 高级功能
-
-
- 817, 25
-
-
- 68, 21
-
-
- 基础功能
-
-
- 180, 22
-
-
- 一键导入基础规则
-
-
- 817, 469
-
-
- 809, 443
-
-
- 1.代理的Domain或IP
-
-
- 803, 437
-
-
- 411, 437
-
-
- 405, 417
-
-
- 392, 437
-
-
- 386, 417
-
-
- 809, 443
-
-
- 2.直连的Domain或IP
-
-
- 803, 437
-
-
- 411, 437
-
-
- 405, 417
-
-
- 392, 437
-
-
- 386, 417
-
-
- 809, 443
-
-
- 3.阻止的Domain或IP
-
-
- 803, 437
-
-
- 411, 437
-
-
- 405, 417
-
-
- 392, 437
-
-
- 386, 417
-
-
- 809, 443
-
-
- 预定义规则集列表
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
- 803, 437
-
-
- 一键导入高级规则
-
-
- 817, 605
-
-
- 路由设置
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs
deleted file mode 100644
index e0c63606..00000000
--- a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs
+++ /dev/null
@@ -1,268 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class ServerTransportControl
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region 组件设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要修改
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerTransportControl));
- this.gbTransport = new System.Windows.Forms.GroupBox();
- this.panTlsMore = new System.Windows.Forms.Panel();
- this.labfingerprint = new System.Windows.Forms.Label();
- this.cmbFingerprint = new System.Windows.Forms.ComboBox();
- this.clbAlpn = new System.Windows.Forms.CheckedListBox();
- this.label1 = new System.Windows.Forms.Label();
- this.txtSNI = new System.Windows.Forms.TextBox();
- this.labSNI = new System.Windows.Forms.Label();
- this.labAllowInsecure = new System.Windows.Forms.Label();
- this.cmbAllowInsecure = new System.Windows.Forms.ComboBox();
- this.tipNetwork = new System.Windows.Forms.Label();
- this.txtPath = new System.Windows.Forms.TextBox();
- this.cmbNetwork = new System.Windows.Forms.ComboBox();
- this.labNetwork = new System.Windows.Forms.Label();
- this.labPath = new System.Windows.Forms.Label();
- this.tipPath = new System.Windows.Forms.Label();
- this.tipRequestHost = new System.Windows.Forms.Label();
- this.labStreamSecurity = new System.Windows.Forms.Label();
- this.cmbStreamSecurity = new System.Windows.Forms.ComboBox();
- this.tipHeaderType = new System.Windows.Forms.Label();
- this.txtRequestHost = new System.Windows.Forms.TextBox();
- this.labHeaderType = new System.Windows.Forms.Label();
- this.labRequestHost = new System.Windows.Forms.Label();
- this.cmbHeaderType = new System.Windows.Forms.ComboBox();
- this.gbTransport.SuspendLayout();
- this.panTlsMore.SuspendLayout();
- this.SuspendLayout();
- //
- // gbTransport
- //
- resources.ApplyResources(this.gbTransport, "gbTransport");
- this.gbTransport.Controls.Add(this.panTlsMore);
- this.gbTransport.Controls.Add(this.tipNetwork);
- this.gbTransport.Controls.Add(this.txtPath);
- this.gbTransport.Controls.Add(this.cmbNetwork);
- this.gbTransport.Controls.Add(this.labNetwork);
- this.gbTransport.Controls.Add(this.labPath);
- this.gbTransport.Controls.Add(this.tipPath);
- this.gbTransport.Controls.Add(this.tipRequestHost);
- this.gbTransport.Controls.Add(this.labStreamSecurity);
- this.gbTransport.Controls.Add(this.cmbStreamSecurity);
- this.gbTransport.Controls.Add(this.tipHeaderType);
- this.gbTransport.Controls.Add(this.txtRequestHost);
- this.gbTransport.Controls.Add(this.labHeaderType);
- this.gbTransport.Controls.Add(this.labRequestHost);
- this.gbTransport.Controls.Add(this.cmbHeaderType);
- this.gbTransport.Name = "gbTransport";
- this.gbTransport.TabStop = false;
- //
- // panTlsMore
- //
- resources.ApplyResources(this.panTlsMore, "panTlsMore");
- this.panTlsMore.Controls.Add(this.labfingerprint);
- this.panTlsMore.Controls.Add(this.cmbFingerprint);
- this.panTlsMore.Controls.Add(this.clbAlpn);
- this.panTlsMore.Controls.Add(this.label1);
- this.panTlsMore.Controls.Add(this.txtSNI);
- this.panTlsMore.Controls.Add(this.labSNI);
- this.panTlsMore.Controls.Add(this.labAllowInsecure);
- this.panTlsMore.Controls.Add(this.cmbAllowInsecure);
- this.panTlsMore.Name = "panTlsMore";
- //
- // labfingerprint
- //
- resources.ApplyResources(this.labfingerprint, "labfingerprint");
- this.labfingerprint.Name = "labfingerprint";
- //
- // cmbFingerprint
- //
- resources.ApplyResources(this.cmbFingerprint, "cmbFingerprint");
- this.cmbFingerprint.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbFingerprint.FormattingEnabled = true;
- this.cmbFingerprint.Name = "cmbFingerprint";
- //
- // clbAlpn
- //
- resources.ApplyResources(this.clbAlpn, "clbAlpn");
- this.clbAlpn.CheckOnClick = true;
- this.clbAlpn.FormattingEnabled = true;
- this.clbAlpn.Items.AddRange(new object[] {
- resources.GetString("clbAlpn.Items"),
- resources.GetString("clbAlpn.Items1")});
- this.clbAlpn.MultiColumn = true;
- this.clbAlpn.Name = "clbAlpn";
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // txtSNI
- //
- resources.ApplyResources(this.txtSNI, "txtSNI");
- this.txtSNI.Name = "txtSNI";
- //
- // labSNI
- //
- resources.ApplyResources(this.labSNI, "labSNI");
- this.labSNI.Name = "labSNI";
- //
- // labAllowInsecure
- //
- resources.ApplyResources(this.labAllowInsecure, "labAllowInsecure");
- this.labAllowInsecure.Name = "labAllowInsecure";
- //
- // cmbAllowInsecure
- //
- resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure");
- this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbAllowInsecure.FormattingEnabled = true;
- this.cmbAllowInsecure.Items.AddRange(new object[] {
- resources.GetString("cmbAllowInsecure.Items"),
- resources.GetString("cmbAllowInsecure.Items1"),
- resources.GetString("cmbAllowInsecure.Items2")});
- this.cmbAllowInsecure.Name = "cmbAllowInsecure";
- //
- // tipNetwork
- //
- resources.ApplyResources(this.tipNetwork, "tipNetwork");
- this.tipNetwork.Name = "tipNetwork";
- //
- // txtPath
- //
- resources.ApplyResources(this.txtPath, "txtPath");
- this.txtPath.Name = "txtPath";
- //
- // cmbNetwork
- //
- resources.ApplyResources(this.cmbNetwork, "cmbNetwork");
- this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbNetwork.FormattingEnabled = true;
- this.cmbNetwork.Name = "cmbNetwork";
- this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged);
- //
- // labNetwork
- //
- resources.ApplyResources(this.labNetwork, "labNetwork");
- this.labNetwork.Name = "labNetwork";
- //
- // labPath
- //
- resources.ApplyResources(this.labPath, "labPath");
- this.labPath.Name = "labPath";
- //
- // tipPath
- //
- resources.ApplyResources(this.tipPath, "tipPath");
- this.tipPath.Name = "tipPath";
- //
- // tipRequestHost
- //
- resources.ApplyResources(this.tipRequestHost, "tipRequestHost");
- this.tipRequestHost.Name = "tipRequestHost";
- //
- // labStreamSecurity
- //
- resources.ApplyResources(this.labStreamSecurity, "labStreamSecurity");
- this.labStreamSecurity.Name = "labStreamSecurity";
- //
- // cmbStreamSecurity
- //
- resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity");
- this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbStreamSecurity.FormattingEnabled = true;
- this.cmbStreamSecurity.Name = "cmbStreamSecurity";
- this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged);
- //
- // tipHeaderType
- //
- resources.ApplyResources(this.tipHeaderType, "tipHeaderType");
- this.tipHeaderType.Name = "tipHeaderType";
- //
- // txtRequestHost
- //
- resources.ApplyResources(this.txtRequestHost, "txtRequestHost");
- this.txtRequestHost.Name = "txtRequestHost";
- //
- // labHeaderType
- //
- resources.ApplyResources(this.labHeaderType, "labHeaderType");
- this.labHeaderType.Name = "labHeaderType";
- //
- // labRequestHost
- //
- resources.ApplyResources(this.labRequestHost, "labRequestHost");
- this.labRequestHost.Name = "labRequestHost";
- //
- // cmbHeaderType
- //
- resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType");
- this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbHeaderType.FormattingEnabled = true;
- this.cmbHeaderType.Name = "cmbHeaderType";
- //
- // ServerTransportControl
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.gbTransport);
- this.Name = "ServerTransportControl";
- this.Load += new System.EventHandler(this.ServerTransportControl_Load);
- this.gbTransport.ResumeLayout(false);
- this.gbTransport.PerformLayout();
- this.panTlsMore.ResumeLayout(false);
- this.panTlsMore.PerformLayout();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox gbTransport;
- private System.Windows.Forms.Panel panTlsMore;
- private System.Windows.Forms.TextBox txtSNI;
- private System.Windows.Forms.Label labSNI;
- private System.Windows.Forms.Label labAllowInsecure;
- private System.Windows.Forms.ComboBox cmbAllowInsecure;
- private System.Windows.Forms.Label tipNetwork;
- private System.Windows.Forms.TextBox txtPath;
- private System.Windows.Forms.ComboBox cmbNetwork;
- private System.Windows.Forms.Label labNetwork;
- private System.Windows.Forms.Label labPath;
- private System.Windows.Forms.Label tipPath;
- private System.Windows.Forms.Label tipRequestHost;
- private System.Windows.Forms.Label labStreamSecurity;
- private System.Windows.Forms.ComboBox cmbStreamSecurity;
- private System.Windows.Forms.Label tipHeaderType;
- private System.Windows.Forms.TextBox txtRequestHost;
- private System.Windows.Forms.Label labHeaderType;
- private System.Windows.Forms.Label labRequestHost;
- private System.Windows.Forms.ComboBox cmbHeaderType;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.CheckedListBox clbAlpn;
- private System.Windows.Forms.Label labfingerprint;
- private System.Windows.Forms.ComboBox cmbFingerprint;
- }
-}
diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs
deleted file mode 100644
index ae9243a7..00000000
--- a/v2rayN/v2rayN/Forms/ServerTransportControl.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class ServerTransportControl : UserControl
- {
- public bool AllowXtls { get; set; }
- private VmessItem vmessItem;
-
- public ServerTransportControl()
- {
- InitializeComponent();
- }
- private void ServerTransportControl_Load(object sender, EventArgs e)
- {
- }
-
- private void Init(VmessItem item)
- {
- vmessItem = item;
-
- cmbNetwork.Items.AddRange(Global.networks.ToArray());
-
- cmbStreamSecurity.Items.Clear();
- cmbStreamSecurity.Items.Add(string.Empty);
- cmbStreamSecurity.Items.Add(Global.StreamSecurity);
- if (AllowXtls)
- {
- cmbStreamSecurity.Items.Add(Global.StreamSecurityX);
- }
- cmbFingerprint.Items.AddRange(Global.fingerprints.ToArray());
- }
-
- public void BindingServer(VmessItem item)
- {
- Init(item);
-
- cmbNetwork.Text = vmessItem.network;
- cmbHeaderType.Text = vmessItem.headerType;
- txtRequestHost.Text = vmessItem.requestHost;
- txtPath.Text = vmessItem.path;
- cmbStreamSecurity.Text = vmessItem.streamSecurity;
- cmbAllowInsecure.Text = vmessItem.allowInsecure;
- txtSNI.Text = vmessItem.sni;
- cmbFingerprint.Text = vmessItem.fingerprint;
-
- if (vmessItem.alpn != null)
- {
- for (int i = 0; i < clbAlpn.Items.Count; i++)
- {
- if (vmessItem.alpn.Contains(clbAlpn.Items[i].ToString()))
- {
- clbAlpn.SetItemChecked(i, true);
- }
- }
- }
- }
-
- public void ClearServer(VmessItem item)
- {
- Init(item);
-
- cmbNetwork.Text = Global.DefaultNetwork;
- cmbHeaderType.Text = Global.None;
- txtRequestHost.Text = "";
- cmbStreamSecurity.Text = "";
- cmbAllowInsecure.Text = "";
- txtPath.Text = "";
- txtSNI.Text = "";
- cmbFingerprint.Text = "";
- for (int i = 0; i < clbAlpn.Items.Count; i++)
- {
- clbAlpn.SetItemChecked(i, false);
- }
- }
-
- public void EndBindingServer()
- {
- string network = cmbNetwork.Text;
- string headerType = cmbHeaderType.Text;
- string requestHost = txtRequestHost.Text;
- string path = txtPath.Text;
- string streamSecurity = cmbStreamSecurity.Text;
- string allowInsecure = cmbAllowInsecure.Text;
- string sni = txtSNI.Text;
- string fingerprint = cmbFingerprint.Text;
-
- vmessItem.network = network;
- vmessItem.headerType = headerType;
- vmessItem.requestHost = requestHost.Replace(" ", "");
- vmessItem.path = path.Replace(" ", "");
- vmessItem.streamSecurity = streamSecurity;
- vmessItem.allowInsecure = allowInsecure;
- vmessItem.sni = sni;
- vmessItem.fingerprint = fingerprint;
-
- var alpn = new List();
- for (int i = 0; i < clbAlpn.Items.Count; i++)
- {
- if (clbAlpn.GetItemChecked(i))
- {
- alpn.Add(clbAlpn.Items[i].ToString());
- }
- }
- vmessItem.alpn = alpn;
- }
-
- private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e)
- {
- SetHeaderType();
- SetTips();
- }
-
- private void SetHeaderType()
- {
- cmbHeaderType.Items.Clear();
-
- string network = cmbNetwork.Text;
- if (Utils.IsNullOrEmpty(network))
- {
- cmbHeaderType.Items.Add(Global.None);
- return;
- }
-
- if (network.Equals(Global.DefaultNetwork))
- {
- cmbHeaderType.Items.Add(Global.None);
- cmbHeaderType.Items.Add(Global.TcpHeaderHttp);
- }
- else if (network.Equals("kcp") || network.Equals("quic"))
- {
- cmbHeaderType.Items.Add(Global.None);
- cmbHeaderType.Items.AddRange(Global.kcpHeaderTypes.ToArray());
- }
- else if (network.Equals("grpc"))
- {
- cmbHeaderType.Items.Add(Global.GrpcgunMode);
- cmbHeaderType.Items.Add(Global.GrpcmultiMode);
- }
- else
- {
- cmbHeaderType.Items.Add(Global.None);
- }
- cmbHeaderType.SelectedIndex = 0;
- }
-
- private void SetTips()
- {
- string network = cmbNetwork.Text;
- if (Utils.IsNullOrEmpty(network))
- {
- network = Global.DefaultNetwork;
- }
- labHeaderType.Visible = true;
- tipRequestHost.Text =
- tipPath.Text =
- tipHeaderType.Text = string.Empty;
-
- if (network.Equals(Global.DefaultNetwork))
- {
- tipRequestHost.Text = ResUI.TransportRequestHostTip1;
- tipHeaderType.Text = ResUI.TransportHeaderTypeTip1;
- }
- else if (network.Equals("kcp"))
- {
- tipHeaderType.Text = ResUI.TransportHeaderTypeTip2;
- tipPath.Text = ResUI.TransportPathTip5;
- }
- else if (network.Equals("ws"))
- {
- tipRequestHost.Text = ResUI.TransportRequestHostTip2;
- tipPath.Text = ResUI.TransportPathTip1;
- }
- else if (network.Equals("h2"))
- {
- tipRequestHost.Text = ResUI.TransportRequestHostTip3;
- tipPath.Text = ResUI.TransportPathTip2;
- }
- else if (network.Equals("quic"))
- {
- tipRequestHost.Text = ResUI.TransportRequestHostTip4;
- tipPath.Text = ResUI.TransportPathTip3;
- tipHeaderType.Text = ResUI.TransportHeaderTypeTip3;
- }
- else if (network.Equals("grpc"))
- {
- tipPath.Text = ResUI.TransportPathTip4;
- tipHeaderType.Text = ResUI.TransportHeaderTypeTip4;
- labHeaderType.Visible = false;
- }
- }
-
- private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e)
- {
- string security = cmbStreamSecurity.Text;
- if (Utils.IsNullOrEmpty(security))
- {
- panTlsMore.Hide();
- }
- else
- {
- panTlsMore.Show();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.resx
deleted file mode 100644
index 8bbb1bf5..00000000
--- a/v2rayN/v2rayN/Forms/ServerTransportControl.resx
+++ /dev/null
@@ -1,867 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- True
-
-
-
- 12, 200
-
-
- Camouflage domain(host)
-
-
- 127, 15
-
-
- 0
-
-
- panTlsMore
-
-
- gbTransport
-
-
- gbTransport
-
-
- gbTransport
-
-
-
- NoControl
-
-
- alpn
-
-
- System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Camouflage type
-
-
- panTlsMore
-
-
- 46
-
-
- 4, 0, 4, 0
-
-
- 12, 120
-
-
- tipPath
-
-
- 189, 23
-
-
- NoControl
-
-
- 17
-
-
- true
-
-
- false
-
-
- True
-
-
- True
-
-
- 15, 15
-
-
- 267, 186
-
-
- cmbNetwork
-
-
- labRequestHost
-
-
- 964, 325
-
-
- panTlsMore
-
-
- True
-
-
- TLS
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- cmbStreamSecurity
-
-
- panTlsMore
-
-
- 44
-
-
- gbTransport
-
-
- 4, 4, 4, 4
-
-
- 13
-
-
- 16, 54
-
-
- label1
-
-
- 191, 15
-
-
- 2
-
-
- Fill
-
-
- gbTransport
-
-
- 4, 4, 4, 4
-
-
- 0
-
-
- 4, 0, 4, 0
-
-
- 964, 325
-
-
- txtRequestHost
-
-
- 189, 23
-
-
- 133, 9
-
-
- gbTransport
-
-
- 7
-
-
- 12, 160
-
-
- 8
-
-
- 133, 49
-
-
- cmbAllowInsecure
-
-
- ServerTransportControl
-
-
- 13
-
-
- 111, 15
-
-
- 0, 0
-
-
- allowInsecure
-
-
- 1
-
-
- 15, 15
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4, 0, 4, 0
-
-
- NoControl
-
-
- 172, 90
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- gbTransport
-
-
- 7
-
-
- labAllowInsecure
-
-
- labSNI
-
-
- 667, 131
-
-
- 4, 4, 4, 4
-
-
- 4, 0, 4, 0
-
-
- 31
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 321, 14
-
-
- 15, 15
-
-
- 4, 0, 4, 0
-
-
- True
-
-
- 0
-
-
- 1
-
-
- 39, 15
-
-
- 5
-
-
- 211, 115
-
-
- gbTransport
-
-
- h2
-
-
- NoControl
-
-
- cmbFingerprint
-
-
- 4, 0, 4, 0
-
-
- gbTransport
-
-
- 12, 80
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- labPath
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- NoControl
-
-
- tipNetwork
-
-
- gbTransport
-
-
- gbTransport
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 79, 23
-
-
- 19
-
-
- 169, 195
-
-
- $this
-
-
- 4, 0, 4, 0
-
-
- 8, 15
-
-
- 22
-
-
- 169, 155
-
-
- 16, 95
-
-
- 151, 15
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 256, 35
-
-
- Transport protocol(network)
-
-
- 39, 15
-
-
- 31, 15
-
-
- 10
-
-
- 27
-
-
- True
-
-
- NoControl
-
-
- 169, 75
-
-
- gbTransport
-
-
- 70
-
-
- System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4, 0, 4, 0
-
-
- gbTransport
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 2
-
-
- panTlsMore
-
-
- 24
-
-
- True
-
-
- 4, 4, 4, 4
-
-
- clbAlpn
-
-
- SNI
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 3
-
-
- True
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- tipRequestHost
-
-
- True
-
-
- 6
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- labfingerprint
-
-
- NoControl
-
-
- labStreamSecurity
-
-
- http/1.1
-
-
- txtSNI
-
-
- txtPath
-
-
- True
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- NoControl
-
-
- 4, 0, 4, 0
-
-
- gbTransport
-
-
- 12
-
-
- 45
-
-
- NoControl
-
-
- 2
-
-
- panTlsMore
-
-
- 239, 24
-
-
- 407, 9
-
-
- Path
-
-
- 189, 23
-
-
- *
-
-
- Transport
-
-
- 1
-
-
- 4, 0, 4, 0
-
-
- tipHeaderType
-
-
- *
-
-
- True
-
-
- 15
-
-
- 4, 4, 4, 4
-
-
- panTlsMore
-
-
- 4, 4, 4, 4
-
-
- 31, 15
-
-
- 1
-
-
- 4, 4, 4, 4
-
-
- 4, 4, 4, 4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 223, 15
-
-
- 619, 120
-
-
- fingerprint(uTLS)
-
-
- 6
-
-
- 143, 15
-
-
- 105, 23
-
-
- 4, 4, 4, 4
-
-
- 3
-
-
- True
-
-
- 4, 4, 4, 4
-
-
- gbTransport
-
-
- 9
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4, 0, 4, 0
-
-
- 33
-
-
- 16, 14
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 705, 160
-
-
- 12, 40
-
-
- 4, 4, 4, 4
-
-
- NoControl
-
-
- 14
-
-
- True
-
-
- 11
-
-
- *
-
-
- 4, 0, 4, 0
-
-
- 5
-
-
- NoControl
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 512, 25
-
-
- 0
-
-
- 4
-
-
- gbTransport
-
-
- 32
-
-
-
-
-
- cmbHeaderType
-
-
- 4
-
-
- 4
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 23
-
-
- 376, 80
-
-
- 22
-
-
- panTlsMore
-
-
- labNetwork
-
-
- 20
-
-
- 3
-
-
- NoControl
-
-
- 399, 24
-
-
- 4, 4, 4, 4
-
-
- 527, 24
-
-
- NoControl
-
-
- 5
-
-
- panTlsMore
-
-
- labHeaderType
-
-
- 43
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 467, 40
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- *Default value tcp
-
-
- 4, 0, 4, 0
-
-
- True
-
-
- 4, 4, 4, 4
-
-
- True
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx
deleted file mode 100644
index 4ef44255..00000000
--- a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx
+++ /dev/null
@@ -1,193 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 182, 15
-
-
- *默认tcp,选错会无法连接
-
-
- 169, 36
-
-
- 290, 23
-
-
- 139, 15
-
-
- 传输协议(network)
-
-
- 85, 15
-
-
- 路径(path)
-
-
- 122, 15
-
-
- 传输层安全(tls)
-
-
- 169, 117
-
-
- 442, 20
-
-
- 115, 15
-
-
- 伪装类型(type)
-
-
- 115, 15
-
-
- 伪装域名(host)
-
-
- 底层传输方式(transport)
-
-
- 427, 9
-
-
- 208, 24
-
-
- 378, 14
-
-
- 391, 25
-
-
- 217, 15
-
-
- 跳过证书验证(allowInsecure)
-
-
- 247, 10
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs
deleted file mode 100644
index bff96482..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class SubSettingControl
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region 组件设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要修改
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl));
- this.grbMain = new System.Windows.Forms.GroupBox();
- this.label4 = new System.Windows.Forms.Label();
- this.cmbGroup = new System.Windows.Forms.ComboBox();
- this.txtUserAgent = new System.Windows.Forms.TextBox();
- this.label1 = new System.Windows.Forms.Label();
- this.btnShare = new System.Windows.Forms.Button();
- this.chkEnabled = new System.Windows.Forms.CheckBox();
- this.btnRemove = new System.Windows.Forms.Button();
- this.txtUrl = new System.Windows.Forms.TextBox();
- this.txtRemarks = new System.Windows.Forms.TextBox();
- this.label2 = new System.Windows.Forms.Label();
- this.label3 = new System.Windows.Forms.Label();
- this.picQRCode = new System.Windows.Forms.PictureBox();
- this.grbMain.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit();
- this.SuspendLayout();
- //
- // grbMain
- //
- resources.ApplyResources(this.grbMain, "grbMain");
- this.grbMain.Controls.Add(this.label4);
- this.grbMain.Controls.Add(this.cmbGroup);
- this.grbMain.Controls.Add(this.txtUserAgent);
- this.grbMain.Controls.Add(this.label1);
- this.grbMain.Controls.Add(this.btnShare);
- this.grbMain.Controls.Add(this.chkEnabled);
- this.grbMain.Controls.Add(this.btnRemove);
- this.grbMain.Controls.Add(this.txtUrl);
- this.grbMain.Controls.Add(this.txtRemarks);
- this.grbMain.Controls.Add(this.label2);
- this.grbMain.Controls.Add(this.label3);
- this.grbMain.Name = "grbMain";
- this.grbMain.TabStop = false;
- //
- // label4
- //
- resources.ApplyResources(this.label4, "label4");
- this.label4.Name = "label4";
- //
- // cmbGroup
- //
- resources.ApplyResources(this.cmbGroup, "cmbGroup");
- this.cmbGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cmbGroup.FormattingEnabled = true;
- this.cmbGroup.Name = "cmbGroup";
- this.cmbGroup.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // txtUserAgent
- //
- resources.ApplyResources(this.txtUserAgent, "txtUserAgent");
- this.txtUserAgent.Name = "txtUserAgent";
- this.txtUserAgent.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
- // btnShare
- //
- resources.ApplyResources(this.btnShare, "btnShare");
- this.btnShare.Name = "btnShare";
- this.btnShare.UseVisualStyleBackColor = true;
- this.btnShare.Click += new System.EventHandler(this.btnShare_Click);
- //
- // chkEnabled
- //
- resources.ApplyResources(this.chkEnabled, "chkEnabled");
- this.chkEnabled.Name = "chkEnabled";
- this.chkEnabled.UseVisualStyleBackColor = true;
- this.chkEnabled.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // btnRemove
- //
- resources.ApplyResources(this.btnRemove, "btnRemove");
- this.btnRemove.Name = "btnRemove";
- this.btnRemove.UseVisualStyleBackColor = true;
- this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
- //
- // txtUrl
- //
- resources.ApplyResources(this.txtUrl, "txtUrl");
- this.txtUrl.Name = "txtUrl";
- this.txtUrl.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // txtRemarks
- //
- resources.ApplyResources(this.txtRemarks, "txtRemarks");
- this.txtRemarks.Name = "txtRemarks";
- this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave);
- //
- // label2
- //
- resources.ApplyResources(this.label2, "label2");
- this.label2.Name = "label2";
- //
- // label3
- //
- resources.ApplyResources(this.label3, "label3");
- this.label3.Name = "label3";
- //
- // picQRCode
- //
- resources.ApplyResources(this.picQRCode, "picQRCode");
- this.picQRCode.Name = "picQRCode";
- this.picQRCode.TabStop = false;
- //
- // SubSettingControl
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.Controls.Add(this.picQRCode);
- this.Controls.Add(this.grbMain);
- this.Name = "SubSettingControl";
- this.Load += new System.EventHandler(this.SubSettingControl_Load);
- this.grbMain.ResumeLayout(false);
- this.grbMain.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox grbMain;
- private System.Windows.Forms.TextBox txtUrl;
- private System.Windows.Forms.TextBox txtRemarks;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.Button btnRemove;
- private System.Windows.Forms.CheckBox chkEnabled;
- private System.Windows.Forms.Button btnShare;
- private System.Windows.Forms.PictureBox picQRCode;
- private System.Windows.Forms.TextBox txtUserAgent;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.ComboBox cmbGroup;
- }
-}
diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs
deleted file mode 100644
index 12f8896c..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingControl.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-using System.Windows.Forms;
-using v2rayN.Base;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using System.Linq;
-using System.Collections.Generic;
-
-namespace v2rayN.Forms
-{
- public delegate void ChangeEventHandler(object sender, EventArgs e);
- public partial class SubSettingControl : UserControl
- {
- public event ChangeEventHandler OnButtonClicked;
- private List groupItem;
-
- public SubItem subItem
- {
- get; set;
- }
-
- public SubSettingControl()
- {
- InitializeComponent();
- }
-
- private void SubSettingControl_Load(object sender, EventArgs e)
- {
- Height = grbMain.Height;
-
- groupItem = LazyConfig.Instance.GetConfig().groupItem;
-
- cmbGroup.Items.AddRange(groupItem.Select(t => t.remarks).ToArray());
- cmbGroup.Items.Add(string.Empty);
-
- BindingSub();
- }
-
- private void BindingSub()
- {
- if (subItem != null)
- {
- txtRemarks.Text = subItem.remarks.ToString();
- txtUrl.Text = subItem.url.ToString();
- chkEnabled.Checked = subItem.enabled;
- txtUserAgent.Text = subItem.userAgent;
-
- var index = groupItem.FindIndex(t => t.id == subItem.groupId);
- if (index >= 0)
- {
- cmbGroup.SelectedIndex = index;
- }
- }
- }
- private void EndBindingSub()
- {
- if (subItem != null)
- {
- subItem.remarks = txtRemarks.Text.TrimEx();
- subItem.url = txtUrl.Text.TrimEx();
- subItem.enabled = chkEnabled.Checked;
- subItem.userAgent = txtUserAgent.Text.TrimEx();
-
- var index = groupItem.FindIndex(t => t.remarks == cmbGroup.Text);
- if (index >= 0)
- {
- subItem.groupId = groupItem[index].id;
- }
- else
- {
- subItem.groupId = string.Empty;
- }
- }
- }
- private void txtRemarks_Leave(object sender, EventArgs e)
- {
- EndBindingSub();
- }
-
- private void btnRemove_Click(object sender, EventArgs e)
- {
- if (subItem != null)
- {
- subItem.remarks = string.Empty;
- subItem.url = string.Empty;
- }
-
- OnButtonClicked?.Invoke(sender, e);
- }
-
- private void btnShare_Click(object sender, EventArgs e)
- {
- if (Height <= grbMain.Height)
- {
- if (Utils.IsNullOrEmpty(subItem.url))
- {
- picQRCode.Image = null;
- return;
- }
- picQRCode.Image = QRCodeHelper.GetQRCode(subItem.url);
- Height = grbMain.Height + 200;
- }
- else
- {
- Height = grbMain.Height;
- }
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx
deleted file mode 100644
index d750067b..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingControl.resx
+++ /dev/null
@@ -1,489 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- User Agent(optional)
-
-
-
- NoControl
-
-
- grbMain
-
-
-
- 619, 162
-
-
- 127, 147
-
-
- 60, 16
-
-
- System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- txtUrl
-
-
- grbMain
-
-
- picQRCode
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Remove
-
-
- 525, 21
-
-
-
- 24
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 127, 111
-
-
- SubSettingControl
-
-
- label1
-
-
- Subscription details
-
-
- 26
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- grbMain
-
-
- 36
-
-
- 434, 21
-
-
- 83, 12
-
-
- cmbGroup
-
-
- 232, 21
-
-
- Top
-
-
- 6, 12
-
-
- label3
-
-
- 127, 21
-
-
- NoControl
-
-
- Share
-
-
- 10
-
-
- grbMain
-
-
- 5
-
-
- 12, 53
-
-
- 3
-
-
- Fill
-
-
- 27
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 473, 21
-
-
- 125, 12
-
-
- label4
-
-
- 127, 53
-
-
- 3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 7
-
-
- grbMain
-
-
- 232, 20
-
-
- 2
-
-
- 1
-
-
- NoControl
-
-
- 47, 12
-
-
- Vertical
-
-
- btnRemove
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Enable
-
-
- chkEnabled
-
-
- Zoom
-
-
- 8
-
-
- 25
-
-
- Belong to Group
-
-
- 35
-
-
- txtRemarks
-
-
- NoControl
-
-
- 75, 23
-
-
- 6
-
-
- grbMain
-
-
- 25
-
-
- 0
-
-
- grbMain
-
-
- 1
-
-
- 2
-
-
- 10
-
-
- grbMain
-
-
- grbMain
-
-
- 368, 23
-
-
- True
-
-
- True
-
-
- 0, 0
-
-
- True
-
-
- True
-
-
- 0
-
-
- NoControl
-
-
- label2
-
-
- $this
-
-
- True
-
-
- 619, 188
-
-
- btnShare
-
-
- 619, 350
-
-
- 4
-
-
- 9
-
-
- NoControl
-
-
- 12, 115
-
-
- 0, 188
-
-
- txtUserAgent
-
-
- Remarks
-
-
- grbMain
-
-
- NoControl
-
-
- 473, 46
-
-
- 12, 25
-
-
- 75, 23
-
-
- 12, 151
-
-
- 95, 12
-
-
- grbMain
-
-
- 1
-
-
- Address (url)
-
-
- $this
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 0
-
-
- System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- grbMain
-
-
- NoControl
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 10
-
-
- True
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx
deleted file mode 100644
index 27cc0315..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 53, 12
-
-
- 所属分组
-
-
- 101, 12
-
-
- User Agent(可选)
-
-
- 分享
-
-
- 48, 16
-
-
- 启用
-
-
- 移除
-
-
- 29, 12
-
-
- 备注
-
-
- 65, 12
-
-
- 地址 (url)
-
-
- 订阅详情
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs
deleted file mode 100644
index 489693c8..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-namespace v2rayN.Forms
-{
- partial class SubSettingForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingForm));
- this.btnClose = new System.Windows.Forms.Button();
- this.panCon = new System.Windows.Forms.Panel();
- this.panel2 = new System.Windows.Forms.Panel();
- this.btnAdd = new System.Windows.Forms.Button();
- this.btnOK = new System.Windows.Forms.Button();
- this.panel2.SuspendLayout();
- this.SuspendLayout();
- //
- // btnClose
- //
- this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- resources.ApplyResources(this.btnClose, "btnClose");
- this.btnClose.Name = "btnClose";
- this.btnClose.UseVisualStyleBackColor = true;
- this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
- //
- // panCon
- //
- resources.ApplyResources(this.panCon, "panCon");
- this.panCon.Name = "panCon";
- //
- // panel2
- //
- this.panel2.Controls.Add(this.btnAdd);
- this.panel2.Controls.Add(this.btnClose);
- this.panel2.Controls.Add(this.btnOK);
- resources.ApplyResources(this.panel2, "panel2");
- this.panel2.Name = "panel2";
- //
- // btnAdd
- //
- resources.ApplyResources(this.btnAdd, "btnAdd");
- this.btnAdd.Name = "btnAdd";
- this.btnAdd.UseVisualStyleBackColor = true;
- this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
- //
- // btnOK
- //
- resources.ApplyResources(this.btnOK, "btnOK");
- this.btnOK.Name = "btnOK";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
- //
- // SubSettingForm
- //
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.btnClose;
- this.Controls.Add(this.panCon);
- this.Controls.Add(this.panel2);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Name = "SubSettingForm";
- this.Load += new System.EventHandler(this.SubSettingForm_Load);
- this.panel2.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
- private System.Windows.Forms.Button btnClose;
- private System.Windows.Forms.Button btnOK;
- private System.Windows.Forms.Panel panel2;
- private System.Windows.Forms.Button btnAdd;
- private System.Windows.Forms.Panel panCon;
- }
-}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs
deleted file mode 100644
index 1312c4a0..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingForm.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using v2rayN.Handler;
-using v2rayN.Mode;
-using v2rayN.Resx;
-
-namespace v2rayN.Forms
-{
- public partial class SubSettingForm : BaseForm
- {
- List lstControls = new List();
-
- public SubSettingForm()
- {
- InitializeComponent();
- }
-
- private void SubSettingForm_Load(object sender, EventArgs e)
- {
- if (config.subItem == null)
- {
- config.subItem = new List();
- }
-
- RefreshSubsView();
- }
-
- ///
- /// 刷新列表
- ///
- private void RefreshSubsView()
- {
- panCon.Controls.Clear();
- lstControls.Clear();
-
- for (int k = config.subItem.Count - 1; k >= 0; k--)
- {
- SubItem item = config.subItem[k];
- if (Utils.IsNullOrEmpty(item.remarks)
- && Utils.IsNullOrEmpty(item.url))
- {
- if (!Utils.IsNullOrEmpty(item.id))
- {
- ConfigHandler.RemoveServerViaSubid(ref config, item.id);
- }
- config.subItem.RemoveAt(k);
- }
- }
-
- foreach (SubItem item in config.subItem)
- {
- SubSettingControl control = new SubSettingControl();
- control.OnButtonClicked += Control_OnButtonClicked;
- control.subItem = item;
- control.Dock = DockStyle.Top;
-
- panCon.Controls.Add(control);
- panCon.Controls.SetChildIndex(control, 0);
-
- lstControls.Add(control);
- }
- }
-
- private void Control_OnButtonClicked(object sender, EventArgs e)
- {
- RefreshSubsView();
- }
-
- private void btnOK_Click(object sender, EventArgs e)
- {
- if (ConfigHandler.SaveSubItem(ref config) == 0)
- {
- DialogResult = DialogResult.OK;
- }
- else
- {
- UI.ShowWarning(ResUI.OperationFailed);
- }
- }
-
- private void btnClose_Click(object sender, EventArgs e)
- {
- DialogResult = DialogResult.Cancel;
- }
-
- private void btnAdd_Click(object sender, EventArgs e)
- {
- AddSub();
-
- RefreshSubsView();
- }
-
-
- private void AddSub()
- {
- SubItem subItem = new SubItem
- {
- id = string.Empty,
- remarks = "remarks",
- url = "url"
- };
- config.subItem.Add(subItem);
- }
- }
-}
diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx
deleted file mode 100644
index 316b8ff2..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingForm.resx
+++ /dev/null
@@ -1,273 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- NoControl
-
-
-
- 448, 17
-
-
- 75, 23
-
-
-
- 4
-
-
- &Cancel
-
-
- btnClose
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 1
-
-
- True
-
-
- Fill
-
-
- 0, 0
-
-
- 634, 401
-
-
- 10
-
-
- panCon
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 0
-
-
- NoControl
-
-
- 47, 17
-
-
- 75, 23
-
-
- 6
-
-
- &Add
-
-
- btnAdd
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 0
-
-
- NoControl
-
-
- 355, 17
-
-
- 75, 23
-
-
- 5
-
-
- &OK
-
-
- btnOK
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- panel2
-
-
- 2
-
-
- Bottom
-
-
- 0, 401
-
-
- 634, 60
-
-
- 7
-
-
- panel2
-
-
- System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 1
-
-
- True
-
-
- 6, 12
-
-
- 634, 461
-
-
- Subscription settings
-
-
- SubSettingForm
-
-
- v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx
deleted file mode 100644
index 35c3cbac..00000000
--- a/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx
+++ /dev/null
@@ -1,149 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 订阅设置
-
-
- 添加(&A)
-
-
- 取消(&C)
-
-
- 确定(&O)
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
- ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
- PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
- BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
- bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
- bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
- dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
- CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
- bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
- bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
- ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
- ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
-
-
-
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs
index 47564336..76526e58 100644
--- a/v2rayN/v2rayN/Global.cs
+++ b/v2rayN/v2rayN/Global.cs
@@ -1,13 +1,8 @@
-
-using System.Collections.Generic;
-
-namespace v2rayN
+namespace v2rayN
{
class Global
{
- #region 常量
-
- //public const string DownloadFileName = "v2ray-windows.zip";
+ #region const
public const string v2rayWebsiteUrl = @"https://www.v2fly.org/";
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
public const string UpdateUrl = AboutUrl + @"/releases";
@@ -22,100 +17,31 @@ namespace v2rayN
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
-
-
-
-
- ///
- /// SpeedTestUrl
- ///
public const string SpeedTestUrl = @"http://cachefly.cachefly.net/10mb.test";
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
-
- ///
- /// CustomRoutingListUrl
- ///
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
-
- ///
- /// PromotionUrl
- ///
public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=";
-
- ///
- /// 本软件配置文件名
- ///
public const string ConfigFileName = "guiNConfig.json";
-
- ///
- /// v2ray配置文件名
- ///
- public const string v2rayConfigFileName = "config.json";
-
- ///
- /// v2ray客户端配置样例文件名
- ///
- public const string v2raySampleClient = "v2rayN.Sample.SampleClientConfig.txt";
- ///
- /// v2ray服务端配置样例文件名
- ///
- public const string v2raySampleServer = "v2rayN.Sample.SampleServerConfig.txt";
- ///
- /// v2ray配置Httprequest文件名
- ///
- public const string v2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest.txt";
- ///
- /// v2ray配置Httpresponse文件名
- ///
- public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt";
-
+ public const string ConfigDB = "guiNDB.db";
+ public const string coreConfigFileName = "config.json";
+ public const string v2raySampleClient = "v2rayN.Sample.SampleClientConfig";
+ public const string v2raySampleServer = "v2rayN.Sample.SampleServerConfig";
+ public const string v2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest";
+ public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse";
public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_";
+ public const string v2raySampleInbound = "v2rayN.Sample.SampleInbound";
+ public const string TunSingboxFileName = "v2rayN.Sample.tun_singbox";
- public const string v2raySampleInbound = "v2rayN.Sample.SampleInbound.txt";
-
-
- ///
- /// 默认加密方式
- ///
public const string DefaultSecurity = "auto";
-
- ///
- /// 默认传输协议
- ///
public const string DefaultNetwork = "tcp";
-
- ///
- /// Tcp伪装http
- ///
public const string TcpHeaderHttp = "http";
-
- ///
- /// None值
- ///
public const string None = "none";
-
- ///
- /// 代理 tag值
- ///
public const string agentTag = "proxy";
-
- ///
- /// 直连 tag值
- ///
public const string directTag = "direct";
-
- ///
- /// 阻止 tag值
- ///
public const string blockTag = "block";
-
- ///
- ///
- ///
public const string StreamSecurity = "tls";
public const string StreamSecurityX = "xtls";
-
public const string InboundSocks = "socks";
public const string InboundHttp = "http";
public const string InboundSocks2 = "socks2";
@@ -124,79 +50,34 @@ namespace v2rayN
public const string InboundAPITagName = "api";
public const string InboundAPIProtocal = "dokodemo-door";
-
- ///
- /// vmess
- ///
public const string vmessProtocol = "vmess://";
- ///
- /// vmess
- ///
public const string vmessProtocolLite = "vmess";
- ///
- /// shadowsocks
- ///
public const string ssProtocol = "ss://";
- ///
- /// shadowsocks
- ///
public const string ssProtocolLite = "shadowsocks";
- ///
- /// socks
- ///
public const string socksProtocol = "socks://";
- ///
- /// socks
- ///
public const string socksProtocolLite = "socks";
- ///
- /// http
- ///
public const string httpProtocol = "http://";
- ///
- /// https
- ///
public const string httpsProtocol = "https://";
- ///
- /// vless
- ///
public const string vlessProtocol = "vless://";
- ///
- /// vless
- ///
public const string vlessProtocolLite = "vless";
- ///
- /// trojan
- ///
public const string trojanProtocol = "trojan://";
- ///
- /// trojan
- ///
public const string trojanProtocolLite = "trojan";
- ///
- /// email
- ///
public const string userEMail = "t@t.tt";
-
- ///
- /// MyRegPath
- ///
public const string MyRegPath = "Software\\v2rayNGUI";
-
- ///
- /// Language
- ///
+ public const string AutoRunRegPath = @"Software\Microsoft\Windows\CurrentVersion\Run";
+ public const string AutoRunName = "v2rayNAutoRun";
public const string MyRegKeyLanguage = "CurrentLanguage";
-
- ///
- /// Icon
- ///
public const string CustomIconName = "v2rayN.ico";
-
- public const string StatisticLogOverall = "StatisticLogOverall.json";
-
public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*";
+ public const string RoutingRuleComma = "";
+ public const string GrpcgunMode = "gun";
+ public const string GrpcmultiMode = "multi";
+ public const int MaxPort = 65536;
+ public const string CommandClearMsg = "CommandClearMsg";
+ public const string DelayUnit = "";
+ public const string SpeedUnit = "";
+
public static readonly List IEProxyProtocols = new List {
"{ip}:{http_port}",
"socks={ip}:{socks_port}",
@@ -204,9 +85,6 @@ namespace v2rayN
"http=http://{ip}:{http_port};https=http://{ip}:{http_port}",
""
};
-
- public const string RoutingRuleComma = "";
-
public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" };
public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" };
public static readonly List ssSecuritysInSagerNet = new List { "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "rc4", "rc4-md5", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-cfb8", "aes-192-cfb8", "aes-256-cfb8", "aes-128-ofb", "aes-192-ofb", "aes-256-ofb", "bf-cfb", "cast5-cfb", "des-cfb", "idea-cfb", "rc2-cfb", "seed-cfb", "camellia-128-cfb", "camellia-192-cfb", "camellia-256-cfb", "camellia-128-cfb8", "camellia-192-cfb8", "camellia-256-cfb8", "salsa20", "chacha20", "chacha20-ietf", "xchacha20" };
@@ -215,45 +93,30 @@ namespace v2rayN
public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" };
public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" };
public static readonly List coreTypes = new List { "v2fly", "SagerNet", "Xray", "v2fly_v5" };
+ public static readonly List domainStrategys = new List { "AsIs", "IPIfNonMatch", "IPOnDemand" };
public static readonly List domainMatchers = new List { "linear", "mph", "" };
public static readonly List fingerprints = new List { "chrome", "firefox", "safari", "randomized", "" };
+ public static readonly List allowInsecures = new List { "true", "false", "" };
public static readonly List domainStrategy4Freedoms = new List { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
- public const string GrpcgunMode = "gun";
- public const string GrpcmultiMode = "multi";
- public const string CheckMark = "√";
+ public static readonly List Languages = new List { "zh-Hans", "en" };
+ public static readonly List alpns = new List { "h2", "http/1.1", "h2,http/1.1", "" };
+ public static readonly List LogLevel = new List { "debug", "info", "warning", "error", "none" };
+ public static readonly List InboundTags = new List { "socks", "http", "socks2", "http2" };
+ public static readonly List Protocols = new List { "http", "tls", "bittorrent" };
+ public static readonly List TunMtus = new List { "9000", "1500" };
+ public static readonly List TunStacks = new List { "gvisor", "system" };
#endregion
- #region 全局变量
+ #region global variable
- ///
- /// 是否需要重启服务V2ray
- ///
- public static bool reloadV2ray
- {
- get; set;
- }
-
- ///
- ///
- ///
- public static int statePort
- {
- get; set;
- }
-
- public static Job processJob
- {
- get; set;
- }
- public static System.Threading.Mutex mutexObj
- {
- get; set;
- }
+ public static bool reloadCore { get; set; }
+ public static int statePort { get; set; }
+ public static Job processJob { get; set; }
+ public static bool ShowInTaskbar { get; set; }
+ public static string ExePathKey { get; set; }
#endregion
-
-
}
}
diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs
index 7fc1a687..8d94edf5 100644
--- a/v2rayN/v2rayN/Handler/ConfigHandler.cs
+++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs
@@ -1,12 +1,9 @@
-using System;
-using System.Collections.Generic;
+using System.Data;
using System.IO;
-using System.Net;
-using v2rayN.Mode;
+using System.Text.RegularExpressions;
using v2rayN.Base;
-using System.Linq;
+using v2rayN.Mode;
using v2rayN.Tool;
-using System.Threading.Tasks;
namespace v2rayN.Handler
{
@@ -28,7 +25,7 @@ namespace v2rayN.Handler
public static int LoadConfig(ref Config config)
{
//载入配置文件
- string result = Utils.LoadResource(Utils.GetPath(configRes));
+ string result = Utils.LoadResource(Utils.GetConfigPath(configRes));
if (!Utils.IsNullOrEmpty(result))
{
//转成Json
@@ -36,7 +33,7 @@ namespace v2rayN.Handler
}
else
{
- if (File.Exists(Utils.GetPath(configRes)))
+ if (File.Exists(Utils.GetConfigPath(configRes)))
{
Utils.SaveLog("LoadConfig Exception");
return -1;
@@ -49,7 +46,6 @@ namespace v2rayN.Handler
{
logEnabled = false,
loglevel = "warning",
- vmess = new List(),
//Mux
muxEnabled = false,
@@ -71,7 +67,8 @@ namespace v2rayN.Handler
protocol = Global.InboundSocks,
localPort = 10808,
udpEnabled = true,
- sniffingEnabled = true
+ sniffingEnabled = true,
+ routeOnly = false,
};
config.inbound.Add(inItem);
@@ -93,7 +90,7 @@ namespace v2rayN.Handler
//路由规则
if (Utils.IsNullOrEmpty(config.domainStrategy))
{
- config.domainStrategy = "IPIfNonMatch";
+ config.domainStrategy = Global.domainStrategys[0];//"IPIfNonMatch";
}
//if (Utils.IsNullOrEmpty(config.domainMatcher))
//{
@@ -114,6 +111,25 @@ namespace v2rayN.Handler
congestion = false
};
}
+ if (config.grpcItem == null)
+ {
+ config.grpcItem = new GrpcItem
+ {
+ idle_timeout = 60,
+ health_check_timeout = 20,
+ permit_without_stream = false,
+ initial_windows_size = 0,
+ };
+ }
+ if (config.tunModeItem == null)
+ {
+ config.tunModeItem = new TunModeItem
+ {
+ enableTun = false,
+ showWindow = true,
+ mtu = 9000,
+ };
+ }
if (config.uiItem == null)
{
config.uiItem = new UIItem()
@@ -125,7 +141,10 @@ namespace v2rayN.Handler
{
config.uiItem.mainLvColWidth = new Dictionary();
}
-
+ if (Utils.IsNullOrEmpty(config.uiItem.currentLanguage))
+ {
+ config.uiItem.currentLanguage = Global.Languages[0];
+ }
if (config.constItem == null)
{
@@ -148,40 +167,19 @@ namespace v2rayN.Handler
// config.remoteDNS = "1.1.1.1";
//}
- if (config.subItem == null)
- {
- config.subItem = new List();
- }
- if (config.groupItem == null)
- {
- config.groupItem = new List();
- }
if (config.statisticsFreshRate > 100 || config.statisticsFreshRate < 1)
{
config.statisticsFreshRate = 1;
}
- if (config == null
- || config.vmess.Count <= 0
- )
+ if (config == null)
{
- Global.reloadV2ray = false;
+ Global.reloadCore = false;
}
else
{
- Global.reloadV2ray = true;
+ Global.reloadCore = true;
- //版本升级
- for (int i = 0; i < config.vmess.Count; i++)
- {
- VmessItem vmessItem = config.vmess[i];
- UpgradeServerVersion(ref vmessItem);
-
- if (Utils.IsNullOrEmpty(vmessItem.indexId))
- {
- vmessItem.indexId = Utils.GetGUID(false);
- }
- }
}
LazyConfig.Instance.SetConfig(ref config);
@@ -194,7 +192,7 @@ namespace v2rayN.Handler
///
public static int SaveConfig(ref Config config, bool reload = true)
{
- Global.reloadV2ray = reload;
+ Global.reloadCore = reload;
ToJsonFile(config);
@@ -213,7 +211,7 @@ namespace v2rayN.Handler
{
//save temp file
- var resPath = Utils.GetPath(configRes);
+ var resPath = Utils.GetConfigPath(configRes);
var tempPath = $"{resPath}_temp";
if (Utils.ToJsonFile(config, tempPath) != 0)
{
@@ -234,6 +232,79 @@ namespace v2rayN.Handler
}
}
+ public static int ImportOldGuiConfig(ref Config config, string fileName)
+ {
+ string result = Utils.LoadResource(fileName);
+ if (Utils.IsNullOrEmpty(result))
+ {
+ return -1;
+ }
+
+ var configOld = Utils.FromJson(result);
+ if (configOld == null)
+ {
+ return -1;
+ }
+
+ var subItem = Utils.FromJson>(Utils.ToJson(configOld.subItem));
+ foreach (var it in subItem)
+ {
+ if (Utils.IsNullOrEmpty(it.id))
+ {
+ it.id = Utils.GetGUID(false);
+ }
+ SqliteHelper.Instance.Replace(it);
+ }
+
+ var profileItems = Utils.FromJson>(Utils.ToJson(configOld.vmess));
+ foreach (var it in profileItems)
+ {
+ if (Utils.IsNullOrEmpty(it.indexId))
+ {
+ it.indexId = Utils.GetGUID(false);
+ }
+ SqliteHelper.Instance.Replace(it);
+ }
+
+ foreach (var it in configOld.routings)
+ {
+ if (it.locked)
+ {
+ continue;
+ }
+ var routing = Utils.FromJson(Utils.ToJson(it));
+ foreach (var it2 in it.rules)
+ {
+ it2.id = Utils.GetGUID(false);
+ }
+ routing.ruleNum = it.rules.Count;
+ routing.ruleSet = Utils.ToJson(it.rules, false);
+
+ if (Utils.IsNullOrEmpty(routing.id))
+ {
+ routing.id = Utils.GetGUID(false);
+ }
+ SqliteHelper.Instance.Replace(routing);
+ }
+
+ config = Utils.FromJson(Utils.ToJson(configOld));
+ if (config.tunModeItem == null)
+ {
+ config.tunModeItem = new TunModeItem
+ {
+ enableTun = false,
+ showWindow = true,
+ mtu = 9000,
+ };
+ }
+
+ GetDefaultServer(ref config);
+ GetDefaultRouting(ref config);
+ SaveConfig(ref config);
+ LazyConfig.Instance.SetConfig(ref config);
+
+ return 0;
+ }
#endregion
#region Server
@@ -242,32 +313,28 @@ namespace v2rayN.Handler
/// 添加服务器或编辑
///
///
- ///
+ ///
///
- public static int AddServer(ref Config config, VmessItem vmessItem, bool toFile = true)
+ public static int AddServer(ref Config config, ProfileItem profileItem)
{
- vmessItem.configType = EConfigType.VMess;
+ profileItem.configType = EConfigType.VMess;
- vmessItem.address = vmessItem.address.TrimEx();
- vmessItem.id = vmessItem.id.TrimEx();
- vmessItem.security = vmessItem.security.TrimEx();
- vmessItem.network = vmessItem.network.TrimEx();
- vmessItem.headerType = vmessItem.headerType.TrimEx();
- vmessItem.requestHost = vmessItem.requestHost.TrimEx();
- vmessItem.path = vmessItem.path.TrimEx();
- vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx();
+ profileItem.address = profileItem.address.TrimEx();
+ profileItem.id = profileItem.id.TrimEx();
+ profileItem.security = profileItem.security.TrimEx();
+ profileItem.network = profileItem.network.TrimEx();
+ profileItem.headerType = profileItem.headerType.TrimEx();
+ profileItem.requestHost = profileItem.requestHost.TrimEx();
+ profileItem.path = profileItem.path.TrimEx();
+ profileItem.streamSecurity = profileItem.streamSecurity.TrimEx();
- if (!Global.vmessSecuritys.Contains(vmessItem.security))
+ if (!Global.vmessSecuritys.Contains(profileItem.security))
{
return -1;
}
- AddServerCommon(ref config, vmessItem);
+ AddServerCommon(ref config, profileItem);
- if (toFile)
- {
- ToJsonFile(config);
- }
return 0;
}
@@ -277,19 +344,13 @@ namespace v2rayN.Handler
///
///
///
- public static int RemoveServer(Config config, List indexs)
+ public static int RemoveServer(Config config, List indexs)
{
foreach (var item in indexs)
{
- var index = config.FindIndexId(item.indexId);
- if (index >= 0)
- {
- RemoveVmessItem(config, index);
- }
+ RemoveProfileItem(config, item.indexId);
}
- ToJsonFile(config);
-
return 0;
}
@@ -299,29 +360,27 @@ namespace v2rayN.Handler
///
///
///
- public static int CopyServer(ref Config config, List indexs)
+ public static int CopyServer(ref Config config, List indexs)
{
foreach (var item in indexs)
{
- VmessItem vmessItem = Utils.DeepCopy(item);
- vmessItem.indexId = string.Empty;
- vmessItem.remarks = $"{item.remarks}-clone";
+ ProfileItem profileItem = Utils.DeepCopy(item);
+ profileItem.indexId = string.Empty;
+ profileItem.remarks = $"{item.remarks}-clone";
- if (vmessItem.configType == EConfigType.Custom)
+ if (profileItem.configType == EConfigType.Custom)
{
- vmessItem.address = Utils.GetConfigPath(vmessItem.address);
- if (AddCustomServer(ref config, vmessItem, false) == 0)
+ profileItem.address = Utils.GetConfigPath(profileItem.address);
+ if (AddCustomServer(ref config, profileItem, false) == 0)
{
}
}
else
{
- AddServerCommon(ref config, vmessItem);
+ AddServerCommon(ref config, profileItem);
}
}
- ToJsonFile(config);
-
return 0;
}
@@ -331,7 +390,7 @@ namespace v2rayN.Handler
///
///
///
- public static int SetDefaultServer(ref Config config, VmessItem item)
+ public static int SetDefaultServer(ref Config config, ProfileItem item)
{
if (item == null)
{
@@ -339,68 +398,66 @@ namespace v2rayN.Handler
}
config.indexId = item.indexId;
- Global.reloadV2ray = true;
+ Global.reloadCore = true;
ToJsonFile(config);
return 0;
}
- public static int SetDefaultServer(Config config, List lstVmess)
+ public static int SetDefaultServer(Config config, List lstProfile)
{
- if (lstVmess.Exists(t => t.indexId == config.indexId))
+ if (lstProfile.Exists(t => t.indexId == config.indexId))
{
return 0;
}
- if (config.vmess.Exists(t => t.indexId == config.indexId))
+
+ if (SqliteHelper.Instance.Table().Where(t => t.indexId == config.indexId).Count() > 0)
{
return 0;
}
- if (lstVmess.Count > 0)
+ if (lstProfile.Count > 0)
{
- return SetDefaultServer(ref config, lstVmess[0]);
+ return SetDefaultServer(ref config, lstProfile[0]);
}
- if (config.vmess.Count > 0)
+ if (SqliteHelper.Instance.Table().Count() > 0)
{
- return SetDefaultServer(ref config, config.vmess[0]);
+ return SetDefaultServer(ref config, SqliteHelper.Instance.Table().FirstOrDefault());
}
return -1;
}
- public static VmessItem GetDefaultServer(ref Config config)
+ public static ProfileItem GetDefaultServer(ref Config config)
{
- if (config.vmess.Count <= 0)
+ var item = LazyConfig.Instance.GetProfileItem(config.indexId);
+ if (item is null)
{
- return null;
- }
- var index = config.FindIndexId(config.indexId);
- if (index < 0)
- {
- SetDefaultServer(ref config, config.vmess[0]);
- return config.vmess[0];
+ var item2 = SqliteHelper.Instance.Table().FirstOrDefault();
+ SetDefaultServer(ref config, item2);
+ return item2;
}
- return config.vmess[index];
+ return item;
}
///
/// 移动服务器
///
///
- ///
+ ///
///
///
///
- public static int MoveServer(ref Config config, ref List lstVmess, int index, EMove eMove, int pos = -1)
+ public static int MoveServer(ref Config config, ref List lstProfile, int index, EMove eMove, int pos = -1)
{
- int count = lstVmess.Count;
- if (index < 0 || index > lstVmess.Count - 1)
+ int count = lstProfile.Count;
+ if (index < 0 || index > lstProfile.Count - 1)
{
return -1;
}
- for (int i = 0; i < lstVmess.Count; i++)
+ for (int i = 0; i < lstProfile.Count; i++)
{
- lstVmess[i].sort = (i + 1) * 10;
+ lstProfile[i].sort = (i + 1) * 10;
}
switch (eMove)
@@ -411,7 +468,7 @@ namespace v2rayN.Handler
{
return 0;
}
- lstVmess[index].sort = lstVmess[0].sort - 1;
+ lstProfile[index].sort = lstProfile[0].sort - 1;
break;
}
@@ -421,7 +478,7 @@ namespace v2rayN.Handler
{
return 0;
}
- lstVmess[index].sort = lstVmess[index - 1].sort - 1;
+ lstProfile[index].sort = lstProfile[index - 1].sort - 1;
break;
}
@@ -432,7 +489,7 @@ namespace v2rayN.Handler
{
return 0;
}
- lstVmess[index].sort = lstVmess[index + 1].sort + 1;
+ lstProfile[index].sort = lstProfile[index + 1].sort + 1;
break;
}
@@ -442,16 +499,17 @@ namespace v2rayN.Handler
{
return 0;
}
- lstVmess[index].sort = lstVmess[lstVmess.Count - 1].sort + 1;
+ lstProfile[index].sort = lstProfile[lstProfile.Count - 1].sort + 1;
break;
}
case EMove.Position:
- lstVmess[index].sort = pos * 10 + 1;
+ lstProfile[index].sort = pos * 10 + 1;
break;
}
- ToJsonFile(config);
+ SqliteHelper.Instance.UpdateAll(lstProfile);
+
return 0;
}
@@ -460,11 +518,11 @@ namespace v2rayN.Handler
/// 添加自定义服务器
///
///
- ///
+ ///
///
- public static int AddCustomServer(ref Config config, VmessItem vmessItem, bool blDelete)
+ public static int AddCustomServer(ref Config config, ProfileItem profileItem, bool blDelete)
{
- var fileName = vmessItem.address;
+ var fileName = profileItem.address;
if (!File.Exists(fileName))
{
return -1;
@@ -487,17 +545,16 @@ namespace v2rayN.Handler
return -1;
}
- vmessItem.address = newFileName;
- vmessItem.configType = EConfigType.Custom;
- if (Utils.IsNullOrEmpty(vmessItem.remarks))
+ profileItem.address = newFileName;
+ profileItem.configType = EConfigType.Custom;
+ if (Utils.IsNullOrEmpty(profileItem.remarks))
{
- vmessItem.remarks = $"import custom@{DateTime.Now.ToShortDateString()}";
+ profileItem.remarks = $"import custom@{DateTime.Now.ToShortDateString()}";
}
- AddServerCommon(ref config, vmessItem);
+ AddServerCommon(ref config, profileItem);
- ToJsonFile(config);
return 0;
}
@@ -506,41 +563,43 @@ namespace v2rayN.Handler
/// 添加服务器或编辑
///
///
- ///
+ ///
///
- public static int EditCustomServer(ref Config config, VmessItem vmessItem)
+ public static int EditCustomServer(ref Config config, ProfileItem profileItem)
{
- ToJsonFile(config);
-
- return 0;
- }
-
- ///
- /// 添加服务器或编辑
- ///
- ///
- ///
- ///
- public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, bool toFile = true)
- {
- vmessItem.configType = EConfigType.Shadowsocks;
-
- vmessItem.address = vmessItem.address.TrimEx();
- vmessItem.id = vmessItem.id.TrimEx();
- vmessItem.security = vmessItem.security.TrimEx();
-
- if (!LazyConfig.Instance.GetShadowsocksSecuritys(vmessItem).Contains(vmessItem.security))
+ if (SqliteHelper.Instance.Update(profileItem) > 0)
+ {
+ return 0;
+ }
+ else
{
return -1;
}
- AddServerCommon(ref config, vmessItem);
+ //ToJsonFile(config);
+ }
- if (toFile)
+ ///
+ /// 添加服务器或编辑
+ ///
+ ///
+ ///
+ ///
+ public static int AddShadowsocksServer(ref Config config, ProfileItem profileItem)
+ {
+ profileItem.configType = EConfigType.Shadowsocks;
+
+ profileItem.address = profileItem.address.TrimEx();
+ profileItem.id = profileItem.id.TrimEx();
+ profileItem.security = profileItem.security.TrimEx();
+
+ if (!LazyConfig.Instance.GetShadowsocksSecuritys(profileItem).Contains(profileItem.security))
{
- ToJsonFile(config);
+ return -1;
}
+ AddServerCommon(ref config, profileItem);
+
return 0;
}
@@ -548,20 +607,15 @@ namespace v2rayN.Handler
/// 添加服务器或编辑
///
///
- ///
+ ///
///
- public static int AddSocksServer(ref Config config, VmessItem vmessItem, bool toFile = true)
+ public static int AddSocksServer(ref Config config, ProfileItem profileItem)
{
- vmessItem.configType = EConfigType.Socks;
+ profileItem.configType = EConfigType.Socks;
- vmessItem.address = vmessItem.address.TrimEx();
+ profileItem.address = profileItem.address.TrimEx();
- AddServerCommon(ref config, vmessItem);
-
- if (toFile)
- {
- ToJsonFile(config);
- }
+ AddServerCommon(ref config, profileItem);
return 0;
}
@@ -570,101 +624,34 @@ namespace v2rayN.Handler
/// 添加服务器或编辑
///
///
- ///
+ ///
///
- public static int AddTrojanServer(ref Config config, VmessItem vmessItem, bool toFile = true)
+ public static int AddTrojanServer(ref Config config, ProfileItem profileItem)
{
- vmessItem.configType = EConfigType.Trojan;
+ profileItem.configType = EConfigType.Trojan;
- vmessItem.address = vmessItem.address.TrimEx();
- vmessItem.id = vmessItem.id.TrimEx();
- if (Utils.IsNullOrEmpty(vmessItem.streamSecurity))
+ profileItem.address = profileItem.address.TrimEx();
+ profileItem.id = profileItem.id.TrimEx();
+ if (Utils.IsNullOrEmpty(profileItem.streamSecurity))
{
- vmessItem.streamSecurity = Global.StreamSecurity;
+ profileItem.streamSecurity = Global.StreamSecurity;
}
- if (Utils.IsNullOrEmpty(vmessItem.allowInsecure))
+ if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
{
- vmessItem.allowInsecure = config.defAllowInsecure.ToString();
+ profileItem.allowInsecure = config.defAllowInsecure.ToString();
}
- AddServerCommon(ref config, vmessItem);
-
- if (toFile)
- {
- ToJsonFile(config);
- }
+ AddServerCommon(ref config, profileItem);
return 0;
}
- ///
- /// 配置文件版本升级
- ///
- ///
- ///
- public static int UpgradeServerVersion(ref VmessItem vmessItem)
- {
- try
- {
- if (vmessItem == null
- || vmessItem.configVersion == 2)
- {
- return 0;
- }
- if (vmessItem.configType == EConfigType.VMess)
- {
- string path = "";
- string host = "";
- string[] arrParameter;
- switch (vmessItem.network)
- {
- case "kcp":
- break;
- case "ws":
- //*ws(path+host),它们中间分号(;)隔开
- arrParameter = vmessItem.requestHost.Replace(" ", "").Split(';');
- if (arrParameter.Length > 0)
- {
- path = arrParameter[0];
- }
- if (arrParameter.Length > 1)
- {
- path = arrParameter[0];
- host = arrParameter[1];
- }
- vmessItem.path = path;
- vmessItem.requestHost = host;
- break;
- case "h2":
- //*h2 path
- arrParameter = vmessItem.requestHost.Replace(" ", "").Split(';');
- if (arrParameter.Length > 0)
- {
- path = arrParameter[0];
- }
- if (arrParameter.Length > 1)
- {
- path = arrParameter[0];
- host = arrParameter[1];
- }
- vmessItem.path = path;
- vmessItem.requestHost = host;
- break;
- default:
- break;
- }
- }
- vmessItem.configVersion = 2;
- }
- catch
- {
- }
- return 0;
- }
- public static int SortServers(ref Config config, ref List lstVmess, EServerColName name, bool asc)
+ public static int SortServers(ref Config config, string subId, EServerColName name, bool asc)
{
- if (lstVmess.Count <= 0)
+ var lstModel = LazyConfig.Instance.ProfileItems(subId, "");
+ var lstProfile = Utils.FromJson>(Utils.ToJson(lstModel));
+ if (lstProfile.Count <= 0)
{
return -1;
}
@@ -678,7 +665,8 @@ namespace v2rayN.Handler
case EServerColName.security:
case EServerColName.network:
case EServerColName.streamSecurity:
- case EServerColName.testResult:
+ case EServerColName.delay:
+ case EServerColName.speed:
propertyName = name.ToString();
break;
case EServerColName.subRemarks:
@@ -688,22 +676,23 @@ namespace v2rayN.Handler
return -1;
}
- var items = lstVmess.AsQueryable();
+ var items = lstProfile.AsQueryable();
if (asc)
{
- lstVmess = items.OrderBy(propertyName).ToList();
+ lstProfile = items.OrderBy(propertyName).ToList();
}
else
{
- lstVmess = items.OrderByDescending(propertyName).ToList();
+ lstProfile = items.OrderByDescending(propertyName).ToList();
}
- for (int i = 0; i < lstVmess.Count; i++)
+ for (int i = 0; i < lstProfile.Count; i++)
{
- lstVmess[i].sort = (i + 1) * 10;
+ lstProfile[i].sort = (i + 1) * 10;
}
- ToJsonFile(config);
+ SqliteHelper.Instance.UpdateAll(lstProfile);
+
return 0;
}
@@ -711,52 +700,43 @@ namespace v2rayN.Handler
/// 添加服务器或编辑
///
///
- ///
+ ///
///
- public static int AddVlessServer(ref Config config, VmessItem vmessItem, bool toFile = true)
+ public static int AddVlessServer(ref Config config, ProfileItem profileItem)
{
- vmessItem.configType = EConfigType.VLESS;
+ profileItem.configType = EConfigType.VLESS;
- vmessItem.address = vmessItem.address.TrimEx();
- vmessItem.id = vmessItem.id.TrimEx();
- vmessItem.security = vmessItem.security.TrimEx();
- vmessItem.network = vmessItem.network.TrimEx();
- vmessItem.headerType = vmessItem.headerType.TrimEx();
- vmessItem.requestHost = vmessItem.requestHost.TrimEx();
- vmessItem.path = vmessItem.path.TrimEx();
- vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx();
+ profileItem.address = profileItem.address.TrimEx();
+ profileItem.id = profileItem.id.TrimEx();
+ profileItem.security = profileItem.security.TrimEx();
+ profileItem.network = profileItem.network.TrimEx();
+ profileItem.headerType = profileItem.headerType.TrimEx();
+ profileItem.requestHost = profileItem.requestHost.TrimEx();
+ profileItem.path = profileItem.path.TrimEx();
+ profileItem.streamSecurity = profileItem.streamSecurity.TrimEx();
- AddServerCommon(ref config, vmessItem);
-
- if (toFile)
- {
- ToJsonFile(config);
- }
+ AddServerCommon(ref config, profileItem);
return 0;
}
- public static int DedupServerList(ref Config config, ref List lstVmess)
+ public static int DedupServerList(ref Config config, ref List lstProfile)
{
- List source = lstVmess;
+ List source = lstProfile;
bool keepOlder = config.keepOlderDedupl;
- List list = new List();
+ List list = new List();
if (!keepOlder) source.Reverse(); // Remove the early items first
- foreach (VmessItem item in source)
+ foreach (ProfileItem item in source)
{
- if (!list.Exists(i => CompareVmessItem(i, item, false)))
+ if (!list.Exists(i => CompareProfileItem(i, item, false)))
{
list.Add(item);
}
else
{
- var index = config.FindIndexId(item.indexId);
- if (index >= 0)
- {
- RemoveVmessItem(config, index);
- }
+ RemoveProfileItem(config, item.indexId);
}
}
//if (!keepOlder) list.Reverse();
@@ -765,38 +745,47 @@ namespace v2rayN.Handler
return list.Count;
}
- public static int AddServerCommon(ref Config config, VmessItem vmessItem)
+ public static int AddServerCommon(ref Config config, ProfileItem profileItem)
{
- vmessItem.configVersion = 2;
- if (Utils.IsNullOrEmpty(vmessItem.allowInsecure))
+ profileItem.configVersion = 2;
+ if (Utils.IsNullOrEmpty(profileItem.allowInsecure))
{
- vmessItem.allowInsecure = config.defAllowInsecure.ToString();
+ profileItem.allowInsecure = config.defAllowInsecure.ToString();
}
- if (!Utils.IsNullOrEmpty(vmessItem.network) && !Global.networks.Contains(vmessItem.network))
+ if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network))
{
- vmessItem.network = Global.DefaultNetwork;
+ profileItem.network = Global.DefaultNetwork;
}
- if (Utils.IsNullOrEmpty(vmessItem.indexId))
+ if (Utils.IsNullOrEmpty(profileItem.indexId))
{
- vmessItem.indexId = Utils.GetGUID(false);
+ profileItem.indexId = Utils.GetGUID(false);
+ if (profileItem.sort <= 0)
+ {
+ var maxSort = 0;
+ if (SqliteHelper.Instance.Table().Count() > 0)
+ {
+ maxSort = SqliteHelper.Instance.Table().Max(t => t == null ? 0 : t.sort);
+ }
+ profileItem.sort = maxSort + 1;
+ }
}
- else if (vmessItem.indexId == config.indexId)
+ else if (profileItem.indexId == config.indexId)
{
- Global.reloadV2ray = true;
- }
- if (!config.vmess.Exists(it => it.indexId == vmessItem.indexId))
- {
- var maxSort = config.vmess.Any() ? config.vmess.Max(t => t.sort) : 0;
- vmessItem.sort = maxSort++;
-
- config.vmess.Add(vmessItem);
+ Global.reloadCore = true;
}
- return 0;
+ if (SqliteHelper.Instance.Replace(profileItem) > 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
}
- private static bool CompareVmessItem(VmessItem o, VmessItem n, bool remarks)
+ private static bool CompareProfileItem(ProfileItem o, ProfileItem n, bool remarks)
{
if (o == null || n == null)
{
@@ -820,20 +809,26 @@ namespace v2rayN.Handler
&& (!remarks || o.remarks == n.remarks);
}
- private static int RemoveVmessItem(Config config, int index)
+ private static int RemoveProfileItem(Config config, string indexId)
{
try
{
- if (config.vmess[index].configType == EConfigType.Custom)
+ var item = LazyConfig.Instance.GetProfileItem(indexId);
+ if (item == null)
{
- File.Delete(Utils.GetConfigPath(config.vmess[index].address));
+ return 0;
}
+ if (item.configType == EConfigType.Custom)
+ {
+ File.Delete(Utils.GetConfigPath(item.address));
+ }
+
+ SqliteHelper.Instance.Delete(item);
}
catch (Exception ex)
{
- Utils.SaveLog("RemoveVmessItem", ex);
+ Utils.SaveLog("Remove Item", ex);
}
- config.vmess.RemoveAt(index);
return 0;
}
@@ -848,25 +843,27 @@ namespace v2rayN.Handler
///
///
/// 成功导入的数量
- private static int AddBatchServers(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId)
+ private static int AddBatchServers(ref Config config, string clipboardData, string subid, bool isSub, List lstOriSub)
{
if (Utils.IsNullOrEmpty(clipboardData))
{
return -1;
}
- //copy sub items
- if (!Utils.IsNullOrEmpty(subid))
+ string subFilter = string.Empty;
+ //remove sub items
+ if (isSub && !Utils.IsNullOrEmpty(subid))
{
- RemoveServerViaSubid(ref config, subid);
+ RemoveServerViaSubid(ref config, subid, isSub);
+ subFilter = LazyConfig.Instance.GetSubItem(subid)?.filter ?? "";
}
- //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess"))
- //{
- // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", "");
- //}
- int countServers = 0;
- //string[] arrData = clipboardData.Split(new string[] { "\r\n" }, StringSplitOptions.None);
+ int countServers = 0;
+ var maxSort = 0;
+ if (SqliteHelper.Instance.Table().Count() > 0)
+ {
+ maxSort = SqliteHelper.Instance.Table().Max(t => t.sort);
+ }
string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray());
foreach (string str in arrData)
{
@@ -879,57 +876,64 @@ namespace v2rayN.Handler
}
continue;
}
- VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(str, out string msg);
- if (vmessItem == null)
+ ProfileItem profileItem = ShareHandler.ImportFromClipboardConfig(str, out string msg);
+ if (profileItem == null)
{
continue;
}
//exist sub items
- if (!Utils.IsNullOrEmpty(subid))
+ if (isSub && !Utils.IsNullOrEmpty(subid))
{
- var existItem = lstOriSub?.FirstOrDefault(t => CompareVmessItem(t, vmessItem, true));
+ var existItem = lstOriSub?.FirstOrDefault(t => CompareProfileItem(t, profileItem, true));
if (existItem != null)
{
- vmessItem = existItem;
+ profileItem = existItem;
+ }
+ //filter
+ if (!Utils.IsNullOrEmpty(subFilter))
+ {
+ if (!Regex.IsMatch(profileItem.remarks, subFilter))
+ {
+ continue;
+ }
}
- vmessItem.subid = subid;
}
+ profileItem.subid = subid;
+ profileItem.isSub = isSub;
+ profileItem.sort = maxSort + countServers + 1;
- //groupId
- vmessItem.groupId = groupId;
-
- if (vmessItem.configType == EConfigType.VMess)
+ if (profileItem.configType == EConfigType.VMess)
{
- if (AddServer(ref config, vmessItem, false) == 0)
+ if (AddServer(ref config, profileItem) == 0)
{
countServers++;
}
}
- else if (vmessItem.configType == EConfigType.Shadowsocks)
+ else if (profileItem.configType == EConfigType.Shadowsocks)
{
- if (AddShadowsocksServer(ref config, vmessItem, false) == 0)
+ if (AddShadowsocksServer(ref config, profileItem) == 0)
{
countServers++;
}
}
- else if (vmessItem.configType == EConfigType.Socks)
+ else if (profileItem.configType == EConfigType.Socks)
{
- if (AddSocksServer(ref config, vmessItem, false) == 0)
+ if (AddSocksServer(ref config, profileItem) == 0)
{
countServers++;
}
}
- else if (vmessItem.configType == EConfigType.Trojan)
+ else if (profileItem.configType == EConfigType.Trojan)
{
- if (AddTrojanServer(ref config, vmessItem, false) == 0)
+ if (AddTrojanServer(ref config, profileItem) == 0)
{
countServers++;
}
}
- else if (vmessItem.configType == EConfigType.VLESS)
+ else if (profileItem.configType == EConfigType.VLESS)
{
- if (AddVlessServer(ref config, vmessItem, false) == 0)
+ if (AddVlessServer(ref config, profileItem) == 0)
{
countServers++;
}
@@ -940,14 +944,14 @@ namespace v2rayN.Handler
return countServers;
}
- private static int AddBatchServers4Custom(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId)
+ private static int AddBatchServers4Custom(ref Config config, string clipboardData, string subid, bool isSub, List lstOriSub)
{
if (Utils.IsNullOrEmpty(clipboardData))
{
return -1;
}
- VmessItem vmessItem = new VmessItem();
+ ProfileItem profileItem = new ProfileItem();
//Is v2ray configuration
V2rayConfig v2rayConfig = Utils.FromJson(clipboardData);
if (v2rayConfig != null
@@ -959,9 +963,9 @@ namespace v2rayN.Handler
var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json");
File.WriteAllText(fileName, clipboardData);
- vmessItem.coreType = ECoreType.Xray;
- vmessItem.address = fileName;
- vmessItem.remarks = "v2ray_custom";
+ profileItem.coreType = ECoreType.Xray;
+ profileItem.address = fileName;
+ profileItem.remarks = "v2ray_custom";
}
//Is Clash configuration
else if (clipboardData.IndexOf("port") >= 0
@@ -971,9 +975,9 @@ namespace v2rayN.Handler
var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.yaml");
File.WriteAllText(fileName, clipboardData);
- vmessItem.coreType = ECoreType.clash;
- vmessItem.address = fileName;
- vmessItem.remarks = "clash_custom";
+ profileItem.coreType = ECoreType.clash;
+ profileItem.address = fileName;
+ profileItem.remarks = "clash_custom";
}
//Is hysteria configuration
else if (clipboardData.IndexOf("server") >= 0
@@ -986,9 +990,9 @@ namespace v2rayN.Handler
var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json");
File.WriteAllText(fileName, clipboardData);
- vmessItem.coreType = ECoreType.hysteria;
- vmessItem.address = fileName;
- vmessItem.remarks = "hysteria_custom";
+ profileItem.coreType = ECoreType.hysteria;
+ profileItem.address = fileName;
+ profileItem.remarks = "hysteria_custom";
}
//Is naiveproxy configuration
else if (clipboardData.IndexOf("listen") >= 0
@@ -999,9 +1003,9 @@ namespace v2rayN.Handler
var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json");
File.WriteAllText(fileName, clipboardData);
- vmessItem.coreType = ECoreType.naiveproxy;
- vmessItem.address = fileName;
- vmessItem.remarks = "naiveproxy_custom";
+ profileItem.coreType = ECoreType.naiveproxy;
+ profileItem.address = fileName;
+ profileItem.remarks = "naiveproxy_custom";
}
//Is Other configuration
else
@@ -1010,27 +1014,27 @@ namespace v2rayN.Handler
//var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt");
//File.WriteAllText(fileName, clipboardData);
- //vmessItem.address = fileName;
- //vmessItem.remarks = "other_custom";
+ //profileItem.address = fileName;
+ //profileItem.remarks = "other_custom";
}
- if (!Utils.IsNullOrEmpty(subid))
+ if (isSub && !Utils.IsNullOrEmpty(subid))
{
- RemoveServerViaSubid(ref config, subid);
+ RemoveServerViaSubid(ref config, subid, isSub);
}
- if (lstOriSub != null && lstOriSub.Count == 1)
+ if (isSub && lstOriSub != null && lstOriSub.Count == 1)
{
- vmessItem.indexId = lstOriSub[0].indexId;
+ profileItem.indexId = lstOriSub[0].indexId;
}
- vmessItem.subid = subid;
- vmessItem.groupId = groupId;
+ profileItem.subid = subid;
+ profileItem.isSub = isSub;
- if (Utils.IsNullOrEmpty(vmessItem.address))
+ if (Utils.IsNullOrEmpty(profileItem.address))
{
return -1;
}
- if (AddCustomServer(ref config, vmessItem, true) == 0)
+ if (AddCustomServer(ref config, profileItem, true) == 0)
{
return 1;
@@ -1041,16 +1045,16 @@ namespace v2rayN.Handler
}
}
- private static int AddBatchServers4SsSIP008(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId)
+ private static int AddBatchServers4SsSIP008(ref Config config, string clipboardData, string subid, bool isSub, List lstOriSub)
{
if (Utils.IsNullOrEmpty(clipboardData))
{
return -1;
}
- if (!Utils.IsNullOrEmpty(subid))
+ if (isSub && !Utils.IsNullOrEmpty(subid))
{
- RemoveServerViaSubid(ref config, subid);
+ RemoveServerViaSubid(ref config, subid, isSub);
}
//SsSIP008
@@ -1069,17 +1073,18 @@ namespace v2rayN.Handler
int counter = 0;
foreach (var it in lstSsServer)
{
- var ssItem = new VmessItem()
+ var ssItem = new ProfileItem()
{
subid = subid,
- groupId = groupId,
remarks = it.remarks,
security = it.method,
id = it.password,
address = it.server,
port = Utils.ToInt(it.server_port)
};
- if (AddShadowsocksServer(ref config, ssItem, false) == 0)
+ ssItem.subid = subid;
+ ssItem.isSub = isSub;
+ if (AddShadowsocksServer(ref config, ssItem) == 0)
{
counter++;
}
@@ -1091,29 +1096,29 @@ namespace v2rayN.Handler
return -1;
}
- public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId)
+ public static int AddBatchServers(ref Config config, string clipboardData, string subid, bool isSub)
{
- List lstOriSub = null;
- if (!Utils.IsNullOrEmpty(subid))
+ List lstOriSub = null;
+ if (isSub && !Utils.IsNullOrEmpty(subid))
{
- lstOriSub = config.vmess.Where(it => it.subid == subid).ToList();
+ lstOriSub = LazyConfig.Instance.ProfileItems(subid);
}
- int counter = AddBatchServers(ref config, clipboardData, subid, lstOriSub, groupId);
+ int counter = AddBatchServers(ref config, clipboardData, subid, isSub, lstOriSub);
if (counter < 1)
{
- counter = AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, lstOriSub, groupId);
+ counter = AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, isSub, lstOriSub);
}
if (counter < 1)
{
- counter = AddBatchServers4SsSIP008(ref config, clipboardData, subid, lstOriSub, groupId);
+ counter = AddBatchServers4SsSIP008(ref config, clipboardData, subid, isSub, lstOriSub);
}
//maybe other sub
if (counter < 1)
{
- counter = AddBatchServers4Custom(ref config, clipboardData, subid, lstOriSub, groupId);
+ counter = AddBatchServers4Custom(ref config, clipboardData, subid, isSub, lstOriSub);
}
return counter;
@@ -1133,7 +1138,7 @@ namespace v2rayN.Handler
public static int AddSubItem(ref Config config, string url)
{
//already exists
- if (config.subItem.FindIndex(e => e.url == url) >= 0)
+ if (SqliteHelper.Instance.Table().Where(e => e.url == url).Count() > 0)
{
return 0;
}
@@ -1141,119 +1146,77 @@ namespace v2rayN.Handler
SubItem subItem = new SubItem
{
id = string.Empty,
- remarks = "import sub",
+ remarks = "import_sub",
url = url
};
- config.subItem.Add(subItem);
- return SaveSubItem(ref config);
+ return AddSubItem(ref config, subItem);
}
- ///
- /// save sub
- ///
- ///
- ///
- public static int SaveSubItem(ref Config config)
+ public static int AddSubItem(ref Config config, SubItem subItem)
{
- if (config.subItem == null)
+ if (Utils.IsNullOrEmpty(subItem.id))
+ {
+ subItem.id = Utils.GetGUID(false);
+
+ if (subItem.sort <= 0)
+ {
+ var maxSort = 0;
+ if (SqliteHelper.Instance.Table().Count() > 0)
+ {
+ maxSort = SqliteHelper.Instance.Table().Max(t => t == null ? 0 : t.sort);
+ }
+ subItem.sort = maxSort + 1;
+ }
+ }
+ if (SqliteHelper.Instance.Replace(subItem) > 0)
+ {
+ return 0;
+ }
+ else
{
return -1;
}
-
- foreach (var item in config.subItem.Where(item => Utils.IsNullOrEmpty(item.id)))
- {
- item.id = Utils.GetGUID(false);
- }
-
- ToJsonFile(config);
- return 0;
}
+
///
/// 移除服务器
///
///
///
///
- public static int RemoveServerViaSubid(ref Config config, string subid)
+ public static int RemoveServerViaSubid(ref Config config, string subid, bool isSub)
{
- if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0)
+ if (Utils.IsNullOrEmpty(subid))
{
return -1;
}
- for (int k = config.vmess.Count - 1; k >= 0; k--)
+ if (isSub)
{
- if (config.vmess[k].subid.Equals(subid))
- {
- RemoveVmessItem(config, k);
- }
+ SqliteHelper.Instance.Execute($"delete from ProfileItem where isSub = 1 and subid = {subid}");
+ }
+ else
+ {
+ SqliteHelper.Instance.Execute($"delete from ProfileItem where subid = {subid}");
}
- ToJsonFile(config);
return 0;
}
-
- ///
- /// save Group
- ///
- ///
- ///
- public static int SaveGroupItem(ref Config config)
+ public static int DeleteSubItem(ref Config config, string id)
{
- if (config.groupItem == null)
+ var item = LazyConfig.Instance.GetSubItem(id);
+ if (item is null)
{
- return -1;
+ return 0;
}
+ SqliteHelper.Instance.Delete(item);
+ RemoveServerViaSubid(ref config, id, false);
- foreach (var item in config.groupItem.Where(item => Utils.IsNullOrEmpty(item.id)))
- {
- item.id = Utils.GetGUID(false);
- }
-
- ToJsonFile(config);
return 0;
}
- public static int RemoveGroupItem(ref Config config, string groupId)
- {
- if (Utils.IsNullOrEmpty(groupId))
- {
- return -1;
- }
-
- var items = config.vmess.Where(t => t.groupId == groupId).ToList();
- foreach (var item in items)
- {
- if (item.groupId.Equals(groupId))
- {
- item.groupId = string.Empty;
- }
- }
- foreach (var item in config.subItem)
- {
- if (item.groupId.Equals(groupId))
- {
- item.groupId = string.Empty;
- }
- }
-
- ToJsonFile(config);
- return 0;
- }
-
- public static int MoveServerToGroup(Config config, List indexs, string groupId)
- {
- foreach (var item in indexs)
- {
- item.groupId = groupId;
- }
-
- ToJsonFile(config);
-
- return 0;
- }
#endregion
#region UI
@@ -1294,62 +1257,23 @@ namespace v2rayN.Handler
#endregion
- #region Routing
+ #region Routing
- public static int SaveRouting(ref Config config)
+ public static int SaveRoutingItem(ref Config config, RoutingItem item)
{
- if (config.routings == null)
+ if (Utils.IsNullOrEmpty(item.id))
{
- return -1;
+ item.id = Utils.GetGUID(false);
}
- foreach (var item in config.routings)
+ if (SqliteHelper.Instance.Replace(item) > 0)
{
-
- }
- //move locked item
- int index = config.routings.FindIndex(it => it.locked == true);
- if (index != -1)
- {
- var item = Utils.DeepCopy(config.routings[index]);
- config.routings.RemoveAt(index);
- config.routings.Add(item);
- }
- if (config.routingIndex >= config.routings.Count)
- {
- config.routingIndex = 0;
- }
- if (config.trayMenuServersLimit <= 0)
- {
- config.trayMenuServersLimit = 30;
- }
-
- Global.reloadV2ray = true;
-
- ToJsonFile(config);
- return 0;
- }
-
- public static int AddRoutingItem(ref Config config, RoutingItem item, int index)
- {
- if (index >= 0)
- {
- config.routings[index] = item;
+ return 0;
}
else
{
- config.routings.Add(item);
- int indexLocked = config.routings.FindIndex(it => it.locked == true);
- if (indexLocked != -1)
- {
- var itemLocked = Utils.DeepCopy(config.routings[indexLocked]);
- config.routings.RemoveAt(indexLocked);
- config.routings.Add(itemLocked);
- }
+ return -1;
}
- ToJsonFile(config);
-
- return 0;
}
///
@@ -1358,7 +1282,7 @@ namespace v2rayN.Handler
///
///
///
- public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData, bool blReplace = true)
+ public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData)
{
if (Utils.IsNullOrEmpty(clipboardData))
{
@@ -1370,19 +1294,27 @@ namespace v2rayN.Handler
{
return -1;
}
- if (routingItem.rules == null)
- {
- routingItem.rules = new List();
- }
- if (blReplace)
- {
- routingItem.rules.Clear();
- }
+
foreach (var item in lstRules)
{
- routingItem.rules.Add(item);
+ item.id = Utils.GetGUID(false);
+ }
+ routingItem.ruleNum = lstRules.Count;
+ routingItem.ruleSet = Utils.ToJson(lstRules, false);
+
+ if (Utils.IsNullOrEmpty(routingItem.id))
+ {
+ routingItem.id = Utils.GetGUID(false);
+ }
+
+ if (SqliteHelper.Instance.Replace(routingItem) > 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
}
- return 0;
}
///
@@ -1392,10 +1324,10 @@ namespace v2rayN.Handler
///
///
///
- public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove, int pos = -1)
+ public static int MoveRoutingRule(List rules, int index, EMove eMove, int pos = -1)
{
- int count = routingItem.rules.Count;
- if (index < 0 || index > routingItem.rules.Count - 1)
+ int count = rules.Count;
+ if (index < 0 || index > rules.Count - 1)
{
return -1;
}
@@ -1407,9 +1339,9 @@ namespace v2rayN.Handler
{
return 0;
}
- var item = Utils.DeepCopy(routingItem.rules[index]);
- routingItem.rules.RemoveAt(index);
- routingItem.rules.Insert(0, item);
+ var item = Utils.DeepCopy(rules[index]);
+ rules.RemoveAt(index);
+ rules.Insert(0, item);
break;
}
@@ -1419,9 +1351,9 @@ namespace v2rayN.Handler
{
return 0;
}
- var item = Utils.DeepCopy(routingItem.rules[index]);
- routingItem.rules.RemoveAt(index);
- routingItem.rules.Insert(index - 1, item);
+ var item = Utils.DeepCopy(rules[index]);
+ rules.RemoveAt(index);
+ rules.Insert(index - 1, item);
break;
}
@@ -1432,9 +1364,9 @@ namespace v2rayN.Handler
{
return 0;
}
- var item = Utils.DeepCopy(routingItem.rules[index]);
- routingItem.rules.RemoveAt(index);
- routingItem.rules.Insert(index + 1, item);
+ var item = Utils.DeepCopy(rules[index]);
+ rules.RemoveAt(index);
+ rules.Insert(index + 1, item);
break;
}
@@ -1444,18 +1376,18 @@ namespace v2rayN.Handler
{
return 0;
}
- var item = Utils.DeepCopy(routingItem.rules[index]);
- routingItem.rules.RemoveAt(index);
- routingItem.rules.Add(item);
+ var item = Utils.DeepCopy(rules[index]);
+ rules.RemoveAt(index);
+ rules.Add(item);
break;
}
case EMove.Position:
{
- var removeItem = routingItem.rules[index];
- var item = Utils.DeepCopy(routingItem.rules[index]);
- routingItem.rules.Insert(pos, item);
- routingItem.rules.Remove(removeItem);
+ var removeItem = rules[index];
+ var item = Utils.DeepCopy(rules[index]);
+ rules.Insert(pos, item);
+ rules.Remove(removeItem);
break;
}
@@ -1463,34 +1395,35 @@ namespace v2rayN.Handler
return 0;
}
- public static int SetDefaultRouting(ref Config config, int index)
+ public static int SetDefaultRouting(ref Config config, RoutingItem routingItem)
{
- if (index < 0 || index > config.routings.Count - 1)
+ if (SqliteHelper.Instance.Table().Where(t => t.id == routingItem.id).Count() > 0)
{
- return -1;
+ config.routingIndexId = routingItem.id;
}
- ////和现在相同
- //if (config.index.Equals(index))
- //{
- // return -1;
- //}
- config.routingIndex = index;
- Global.reloadV2ray = true;
+ Global.reloadCore = true;
ToJsonFile(config);
return 0;
}
+ public static RoutingItem GetDefaultRouting(ref Config config)
+ {
+ var item = LazyConfig.Instance.GetRoutingItem(config.routingIndexId);
+ if (item is null)
+ {
+ var item2 = SqliteHelper.Instance.Table().FirstOrDefault(t => t.locked == false);
+ SetDefaultRouting(ref config, item2);
+ return item2;
+ }
+
+ return item;
+ }
public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false)
{
- if (config.routings == null)
- {
- config.routings = new List();
- }
-
- if (blImportAdvancedRules || config.routings.Count(it => it.locked != true) <= 0)
+ if (blImportAdvancedRules || LazyConfig.Instance.RoutingItems().Count <= 0)
{
//Bypass the mainland
var item2 = new RoutingItem()
@@ -1499,7 +1432,6 @@ namespace v2rayN.Handler
url = string.Empty,
};
AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white"));
- config.routings.Add(item2);
//Blacklist
var item3 = new RoutingItem()
@@ -1508,7 +1440,6 @@ namespace v2rayN.Handler
url = string.Empty,
};
AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black"));
- config.routings.Add(item3);
//Global
var item1 = new RoutingItem()
@@ -1517,11 +1448,10 @@ namespace v2rayN.Handler
url = string.Empty,
};
AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global"));
- config.routings.Add(item1);
if (!blImportAdvancedRules)
{
- config.routingIndex = 0;
+ SetDefaultRouting(ref config, item2);
}
}
@@ -1534,20 +1464,18 @@ namespace v2rayN.Handler
locked = true,
};
AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "locked"));
- config.routings.Add(item1);
}
-
- SaveRouting(ref config);
return 0;
}
public static RoutingItem GetLockedRoutingItem(ref Config config)
{
- if (config.routings == null)
- {
- return null;
- }
- return config.routings.Find(it => it.locked == true);
+ return SqliteHelper.Instance.Table().FirstOrDefault(it => it.locked == true);
+ }
+
+ public static void RemoveRoutingItem(RoutingItem routingItem)
+ {
+ SqliteHelper.Instance.Delete(routingItem);
}
#endregion
}
diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/CoreConfigHandler.cs
similarity index 81%
rename from v2rayN/v2rayN/Handler/V2rayConfigHandler.cs
rename to v2rayN/v2rayN/Handler/CoreConfigHandler.cs
index 5e76f664..f9ea34e8 100644
--- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs
+++ b/v2rayN/v2rayN/Handler/CoreConfigHandler.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
+using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using v2rayN.Base;
@@ -11,23 +8,24 @@ using v2rayN.Resx;
namespace v2rayN.Handler
{
///
- /// v2ray配置文件处理类
+ /// Core configuration file processing class
///
- class V2rayConfigHandler
+ class CoreConfigHandler
{
private static string SampleClient = Global.v2raySampleClient;
private static string SampleServer = Global.v2raySampleServer;
- #region 生成客户端配置
+ #region Generate client configuration
///
- /// 生成v2ray的客户端配置文件
+ /// Generate client configuration
///
///
///
///
+ ///
///
- public static int GenerateClientConfig(VmessItem node, string fileName, out string msg, out string content)
+ public static int GenerateClientConfig(ProfileItem node, string fileName, out string msg, out string content)
{
content = string.Empty;
try
@@ -69,14 +67,6 @@ namespace v2rayN.Handler
return 0;
}
-
-
- ///
- /// 日志
- ///
- ///
- ///
- ///
private static int log(Config config, ref V2rayConfig v2rayConfig, bool blExport)
{
try
@@ -99,8 +89,8 @@ namespace v2rayN.Handler
if (config.logEnabled)
{
v2rayConfig.log.loglevel = config.loglevel;
- v2rayConfig.log.access = Utils.GetPath(v2rayConfig.log.access);
- v2rayConfig.log.error = Utils.GetPath(v2rayConfig.log.error);
+ v2rayConfig.log.access = Utils.GetLogPath(v2rayConfig.log.access);
+ v2rayConfig.log.error = Utils.GetLogPath(v2rayConfig.log.error);
}
else
{
@@ -117,12 +107,6 @@ namespace v2rayN.Handler
return 0;
}
- ///
- /// 本地端口
- ///
- ///
- ///
- ///
private static int inbound(Config config, ref V2rayConfig v2rayConfig)
{
try
@@ -138,22 +122,30 @@ namespace v2rayN.Handler
if (config.inbound[0].allowLANConn)
{
- Inbounds inbound3 = GetInbound(config.inbound[0], Global.InboundSocks2, 2, true);
- inbound3.listen = "0.0.0.0";
- v2rayConfig.inbounds.Add(inbound3);
-
- Inbounds inbound4 = GetInbound(config.inbound[0], Global.InboundHttp2, 3, false);
- inbound4.listen = "0.0.0.0";
- v2rayConfig.inbounds.Add(inbound4);
-
- //auth
- if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass))
+ if (config.inbound[0].newPort4LAN)
{
- inbound3.settings.auth = "password";
- inbound3.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } };
+ Inbounds inbound3 = GetInbound(config.inbound[0], Global.InboundSocks2, 2, true);
+ inbound3.listen = "0.0.0.0";
+ v2rayConfig.inbounds.Add(inbound3);
- inbound4.settings.auth = "password";
- inbound4.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } };
+ Inbounds inbound4 = GetInbound(config.inbound[0], Global.InboundHttp2, 3, false);
+ inbound4.listen = "0.0.0.0";
+ v2rayConfig.inbounds.Add(inbound4);
+
+ //auth
+ if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass))
+ {
+ inbound3.settings.auth = "password";
+ inbound3.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } };
+
+ inbound4.settings.auth = "password";
+ inbound4.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } };
+ }
+ }
+ else
+ {
+ inbound.listen = "0.0.0.0";
+ inbound2.listen = "0.0.0.0";
}
}
}
@@ -182,16 +174,11 @@ namespace v2rayN.Handler
inbound.protocol = bSocks ? Global.InboundSocks : Global.InboundHttp;
inbound.settings.udp = inItem.udpEnabled;
inbound.sniffing.enabled = inItem.sniffingEnabled;
+ inbound.sniffing.routeOnly = inItem.routeOnly;
return inbound;
}
- ///
- /// 路由
- ///
- ///
- ///
- ///
private static int routing(Config config, ref V2rayConfig v2rayConfig)
{
try
@@ -204,9 +191,15 @@ namespace v2rayN.Handler
if (config.enableRoutingAdvanced)
{
- if (config.routings != null && config.routingIndex < config.routings.Count)
+ var routing = ConfigHandler.GetDefaultRouting(ref config);
+ if (routing != null)
{
- foreach (var item in config.routings[config.routingIndex].rules)
+ if (!Utils.IsNullOrEmpty(routing.domainStrategy))
+ {
+ v2rayConfig.routing.domainStrategy = routing.domainStrategy;
+ }
+ var rules = Utils.FromJson>(routing.ruleSet);
+ foreach (var item in rules)
{
if (item.enabled)
{
@@ -220,7 +213,8 @@ namespace v2rayN.Handler
var lockedItem = ConfigHandler.GetLockedRoutingItem(ref config);
if (lockedItem != null)
{
- foreach (var item in lockedItem.rules)
+ var rules = Utils.FromJson>(lockedItem.ruleSet);
+ foreach (var item in rules)
{
routingUserRule(item, ref v2rayConfig);
}
@@ -258,6 +252,10 @@ namespace v2rayN.Handler
{
rules.protocol = null;
}
+ if (rules.inboundTag != null && rules.inboundTag.Count == 0)
+ {
+ rules.inboundTag = null;
+ }
var hasDomainIp = false;
if (rules.domain != null && rules.domain.Count > 0)
@@ -273,14 +271,6 @@ namespace v2rayN.Handler
}
it.domain[k] = it.domain[k].Replace(Global.RoutingRuleComma, ",");
}
- //if (Utils.IsNullOrEmpty(it.port))
- //{
- // it.port = null;
- //}
- //if (it.protocol != null && it.protocol.Count == 0)
- //{
- // it.protocol = null;
- //}
v2rayConfig.routing.rules.Add(it);
hasDomainIp = true;
}
@@ -289,40 +279,17 @@ namespace v2rayN.Handler
var it = Utils.DeepCopy(rules);
it.domain = null;
it.type = "field";
- //if (Utils.IsNullOrEmpty(it.port))
- //{
- // it.port = null;
- //}
- //if (it.protocol != null && it.protocol.Count == 0)
- //{
- // it.protocol = null;
- //}
v2rayConfig.routing.rules.Add(it);
hasDomainIp = true;
}
if (!hasDomainIp)
{
- if (!Utils.IsNullOrEmpty(rules.port))
+ if (!Utils.IsNullOrEmpty(rules.port)
+ || (rules.protocol != null && rules.protocol.Count > 0)
+ || (rules.inboundTag != null && rules.inboundTag.Count > 0)
+ )
{
var it = Utils.DeepCopy(rules);
- //it.domain = null;
- //it.ip = null;
- //if (it.protocol != null && it.protocol.Count == 0)
- //{
- // it.protocol = null;
- //}
- it.type = "field";
- v2rayConfig.routing.rules.Add(it);
- }
- else if (rules.protocol != null && rules.protocol.Count > 0)
- {
- var it = Utils.DeepCopy(rules);
- //it.domain = null;
- //it.ip = null;
- //if (Utils.IsNullOrEmpty(it.port))
- //{
- // it.port = null;
- //}
it.type = "field";
v2rayConfig.routing.rules.Add(it);
}
@@ -335,13 +302,7 @@ namespace v2rayN.Handler
return 0;
}
- ///
- /// vmess协议服务器配置
- ///
- ///
- ///
- ///
- private static int outbound(VmessItem node, ref V2rayConfig v2rayConfig)
+ private static int outbound(ProfileItem node, ref V2rayConfig v2rayConfig)
{
try
{
@@ -359,7 +320,6 @@ namespace v2rayN.Handler
{
vnextItem = outbound.settings.vnext[0];
}
- //远程服务器地址和端口
vnextItem.address = node.address;
vnextItem.port = node.port;
@@ -407,7 +367,6 @@ namespace v2rayN.Handler
{
serversItem = outbound.settings.servers[0];
}
- //远程服务器地址和端口
serversItem.address = node.address;
serversItem.port = node.port;
serversItem.password = node.id;
@@ -437,7 +396,6 @@ namespace v2rayN.Handler
{
serversItem = outbound.settings.servers[0];
}
- //远程服务器地址和端口
serversItem.address = node.address;
serversItem.port = node.port;
serversItem.method = null;
@@ -474,7 +432,6 @@ namespace v2rayN.Handler
{
vnextItem = outbound.settings.vnext[0];
}
- //远程服务器地址和端口
vnextItem.address = node.address;
vnextItem.port = node.port;
@@ -488,7 +445,6 @@ namespace v2rayN.Handler
{
usersItem = vnextItem.users[0];
}
- //远程服务器用户ID
usersItem.id = node.id;
usersItem.flow = string.Empty;
usersItem.email = Global.userEMail;
@@ -541,7 +497,6 @@ namespace v2rayN.Handler
{
serversItem = outbound.settings.servers[0];
}
- //远程服务器地址和端口
serversItem.address = node.address;
serversItem.port = node.port;
serversItem.password = node.id;
@@ -582,14 +537,7 @@ namespace v2rayN.Handler
return 0;
}
- ///
- /// 底层传输配置
- ///
- ///
- ///
- ///
- ///
- private static int boundStreamSettings(VmessItem node, string iobound, StreamSettings streamSettings)
+ private static int boundStreamSettings(ProfileItem node, string iobound, StreamSettings streamSettings)
{
try
{
@@ -646,7 +594,6 @@ namespace v2rayN.Handler
//streamSettings
switch (node.GetNetwork())
{
- //kcp基本配置暂时是默认值,用户能自己设置伪装类型
case "kcp":
KcpSettings kcpSettings = new KcpSettings
{
@@ -754,13 +701,17 @@ namespace v2rayN.Handler
var grpcSettings = new GrpcSettings
{
serviceName = node.path,
- multiMode = (node.headerType == Global.GrpcmultiMode)
+ multiMode = (node.headerType == Global.GrpcmultiMode),
+ idle_timeout = config.grpcItem.idle_timeout,
+ health_check_timeout = config.grpcItem.health_check_timeout,
+ permit_without_stream = config.grpcItem.permit_without_stream,
+ initial_windows_size = config.grpcItem.initial_windows_size,
};
streamSettings.grpcSettings = grpcSettings;
break;
default:
- //tcp带http伪装
+ //tcp
if (node.headerType.Equals(Global.TcpHeaderHttp))
{
TcpSettings tcpSettings = new TcpSettings
@@ -773,14 +724,14 @@ namespace v2rayN.Handler
if (iobound.Equals("out"))
{
- //request填入自定义Host
+ //request Host
string request = Utils.GetEmbedText(Global.v2raySampleHttprequestFileName);
string[] arrHost = host.Split(',');
string host2 = string.Join("\",\"", arrHost);
request = request.Replace("$requestHost$", $"\"{host2}\"");
//request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost()));
- //填入自定义Path
+ //Path
string pathHttp = @"/";
if (!Utils.IsNullOrEmpty(node.path))
{
@@ -808,12 +759,6 @@ namespace v2rayN.Handler
return 0;
}
- ///
- /// remoteDNS
- ///
- ///
- ///
- ///
private static int dns(Config config, ref V2rayConfig v2rayConfig)
{
try
@@ -912,17 +857,16 @@ namespace v2rayN.Handler
}
///
- /// 生成v2ray的客户端配置文件(自定义配置)
+ /// Generate custom configuration
///
///
///
///
///
- private static int GenerateClientCustomConfig(VmessItem node, string fileName, out string msg)
+ private static int GenerateClientCustomConfig(ProfileItem node, string fileName, out string msg)
{
try
{
- //检查GUI设置
if (node == null)
{
msg = ResUI.CheckServerSettings;
@@ -979,14 +923,13 @@ namespace v2rayN.Handler
fileContent.RemoveAt(indexPort);
}
- fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}");
- fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}");
+ fileContent.Add($"port: {LazyConfig.Instance.GetLocalPort(Global.InboundHttp)}");
+ fileContent.Add($"socks-port: {LazyConfig.Instance.GetLocalPort(Global.InboundSocks)}");
break;
}
File.WriteAllLines(fileName, fileContent);
}
- //msg = string.Format(ResUI.SuccessfulConfiguration, $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}");
msg = string.Format(ResUI.SuccessfulConfiguration, "");
}
catch (Exception ex)
@@ -998,7 +941,7 @@ namespace v2rayN.Handler
return 0;
}
- public static int GenerateClientConfigContent(VmessItem node, bool blExport, ref V2rayConfig v2rayConfig, out string msg)
+ public static int GenerateClientConfigContent(ProfileItem node, bool blExport, ref V2rayConfig v2rayConfig, out string msg)
{
try
{
@@ -1010,7 +953,6 @@ namespace v2rayN.Handler
msg = ResUI.InitialConfiguration;
- //取得默认配置
string result = Utils.GetEmbedText(SampleClient);
if (Utils.IsNullOrEmpty(result))
{
@@ -1018,7 +960,6 @@ namespace v2rayN.Handler
return -1;
}
- //转成Json
v2rayConfig = Utils.FromJson(result);
if (v2rayConfig == null)
{
@@ -1028,13 +969,10 @@ namespace v2rayN.Handler
var config = LazyConfig.Instance.GetConfig();
- //开始修改配置
log(config, ref v2rayConfig, blExport);
- //本地端口
inbound(config, ref v2rayConfig);
- //路由
routing(config, ref v2rayConfig);
//outbound
@@ -1046,7 +984,6 @@ namespace v2rayN.Handler
//stat
statistic(config, ref v2rayConfig);
- //msg = string.Format(ResUI.SuccessfulConfiguration, $"[{config.GetGroupRemarks(node.groupId)}] {node.GetSummary()}");
msg = string.Format(ResUI.SuccessfulConfiguration, "");
}
catch (Exception ex)
@@ -1060,20 +997,12 @@ namespace v2rayN.Handler
#endregion
- #region 生成服务端端配置
+ #region Generate server-side configuration
- ///
- /// 生成v2ray的客户端配置文件
- ///
- ///
- ///
- ///
- ///
- public static int GenerateServerConfig(VmessItem node, string fileName, out string msg)
+ public static int GenerateServerConfig(ProfileItem node, string fileName, out string msg)
{
try
{
- //检查GUI设置
if (node == null)
{
msg = ResUI.CheckServerSettings;
@@ -1082,7 +1011,6 @@ namespace v2rayN.Handler
msg = ResUI.InitialConfiguration;
- //取得默认配置
string result = Utils.GetEmbedText(SampleServer);
if (Utils.IsNullOrEmpty(result))
{
@@ -1090,7 +1018,6 @@ namespace v2rayN.Handler
return -1;
}
- //转成Json
V2rayConfig v2rayConfig = Utils.FromJson(result);
if (v2rayConfig == null)
{
@@ -1100,13 +1027,10 @@ namespace v2rayN.Handler
var config = LazyConfig.Instance.GetConfig();
- ////开始修改配置
log(config, ref v2rayConfig, true);
- //vmess协议服务器配置
ServerInbound(node, ref v2rayConfig);
- //传出设置
ServerOutbound(config, ref v2rayConfig);
Utils.ToJsonFile(v2rayConfig, fileName, false);
@@ -1122,13 +1046,7 @@ namespace v2rayN.Handler
return 0;
}
- ///
- /// vmess协议服务器配置
- ///
- ///
- ///
- ///
- private static int ServerInbound(VmessItem node, ref V2rayConfig v2rayConfig)
+ private static int ServerInbound(ProfileItem node, ref V2rayConfig v2rayConfig)
{
try
{
@@ -1143,10 +1061,8 @@ namespace v2rayN.Handler
{
usersItem = inbound.settings.clients[0];
}
- //远程服务器端口
inbound.port = node.port;
- //远程服务器用户ID
usersItem.id = node.id;
usersItem.email = Global.userEMail;
@@ -1172,12 +1088,6 @@ namespace v2rayN.Handler
return 0;
}
- ///
- /// 传出设置
- ///
- ///
- ///
- ///
private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig)
{
try
@@ -1195,22 +1105,15 @@ namespace v2rayN.Handler
}
#endregion
- #region 导入(导出)客户端/服务端配置
+ #region Import (export) client/server configuration
- ///
- /// 导入v2ray客户端配置
- ///
- ///
- ///
- ///
- public static VmessItem ImportFromClientConfig(string fileName, out string msg)
+ public static ProfileItem ImportFromClientConfig(string fileName, out string msg)
{
msg = string.Empty;
- VmessItem vmessItem = new VmessItem();
+ ProfileItem profileItem = new ProfileItem();
try
{
- //载入配置文件
string result = Utils.LoadResource(fileName);
if (Utils.IsNullOrEmpty(result))
{
@@ -1218,7 +1121,6 @@ namespace v2rayN.Handler
return null;
}
- //转成Json
V2rayConfig v2rayConfig = Utils.FromJson(result);
if (v2rayConfig == null)
{
@@ -1247,24 +1149,24 @@ namespace v2rayN.Handler
return null;
}
- vmessItem.security = Global.DefaultSecurity;
- vmessItem.network = Global.DefaultNetwork;
- vmessItem.headerType = Global.None;
- vmessItem.address = outbound.settings.vnext[0].address;
- vmessItem.port = outbound.settings.vnext[0].port;
- vmessItem.id = outbound.settings.vnext[0].users[0].id;
- vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId;
- vmessItem.remarks = $"import@{DateTime.Now.ToShortDateString()}";
+ profileItem.security = Global.DefaultSecurity;
+ profileItem.network = Global.DefaultNetwork;
+ profileItem.headerType = Global.None;
+ profileItem.address = outbound.settings.vnext[0].address;
+ profileItem.port = outbound.settings.vnext[0].port;
+ profileItem.id = outbound.settings.vnext[0].users[0].id;
+ profileItem.alterId = outbound.settings.vnext[0].users[0].alterId;
+ profileItem.remarks = $"import@{DateTime.Now.ToShortDateString()}";
//tcp or kcp
if (outbound.streamSettings != null
&& outbound.streamSettings.network != null
&& !Utils.IsNullOrEmpty(outbound.streamSettings.network))
{
- vmessItem.network = outbound.streamSettings.network;
+ profileItem.network = outbound.streamSettings.network;
}
- //tcp伪装http
+ //tcp http
if (outbound.streamSettings != null
&& outbound.streamSettings.tcpSettings != null
&& outbound.streamSettings.tcpSettings.header != null
@@ -1272,7 +1174,7 @@ namespace v2rayN.Handler
{
if (outbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp))
{
- vmessItem.headerType = outbound.streamSettings.tcpSettings.header.type;
+ profileItem.headerType = outbound.streamSettings.tcpSettings.header.type;
string request = Convert.ToString(outbound.streamSettings.tcpSettings.header.request);
if (!Utils.IsNullOrEmpty(request))
{
@@ -1282,18 +1184,18 @@ namespace v2rayN.Handler
&& v2rayTcpRequest.headers.Host != null
&& v2rayTcpRequest.headers.Host.Count > 0)
{
- vmessItem.requestHost = v2rayTcpRequest.headers.Host[0];
+ profileItem.requestHost = v2rayTcpRequest.headers.Host[0];
}
}
}
}
- //kcp伪装
+ //kcp
if (outbound.streamSettings != null
&& outbound.streamSettings.kcpSettings != null
&& outbound.streamSettings.kcpSettings.header != null
&& !Utils.IsNullOrEmpty(outbound.streamSettings.kcpSettings.header.type))
{
- vmessItem.headerType = outbound.streamSettings.kcpSettings.header.type;
+ profileItem.headerType = outbound.streamSettings.kcpSettings.header.type;
}
//ws
@@ -1302,12 +1204,12 @@ namespace v2rayN.Handler
{
if (!Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.path))
{
- vmessItem.path = outbound.streamSettings.wsSettings.path;
+ profileItem.path = outbound.streamSettings.wsSettings.path;
}
if (outbound.streamSettings.wsSettings.headers != null
&& !Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.headers.Host))
{
- vmessItem.requestHost = outbound.streamSettings.wsSettings.headers.Host;
+ profileItem.requestHost = outbound.streamSettings.wsSettings.headers.Host;
}
}
@@ -1317,12 +1219,12 @@ namespace v2rayN.Handler
{
if (!Utils.IsNullOrEmpty(outbound.streamSettings.httpSettings.path))
{
- vmessItem.path = outbound.streamSettings.httpSettings.path;
+ profileItem.path = outbound.streamSettings.httpSettings.path;
}
if (outbound.streamSettings.httpSettings.host != null
&& outbound.streamSettings.httpSettings.host.Count > 0)
{
- vmessItem.requestHost = Utils.List2String(outbound.streamSettings.httpSettings.host);
+ profileItem.requestHost = Utils.List2String(outbound.streamSettings.httpSettings.host);
}
}
@@ -1331,7 +1233,7 @@ namespace v2rayN.Handler
&& outbound.streamSettings.security != null
&& outbound.streamSettings.security == Global.StreamSecurity)
{
- vmessItem.streamSecurity = Global.StreamSecurity;
+ profileItem.streamSecurity = Global.StreamSecurity;
}
}
catch (Exception ex)
@@ -1341,23 +1243,16 @@ namespace v2rayN.Handler
return null;
}
- return vmessItem;
+ return profileItem;
}
- ///
- /// 导入v2ray服务端配置
- ///
- ///
- ///
- ///
- public static VmessItem ImportFromServerConfig(string fileName, out string msg)
+ public static ProfileItem ImportFromServerConfig(string fileName, out string msg)
{
msg = string.Empty;
- VmessItem vmessItem = new VmessItem();
+ ProfileItem profileItem = new ProfileItem();
try
{
- //载入配置文件
string result = Utils.LoadResource(fileName);
if (Utils.IsNullOrEmpty(result))
{
@@ -1365,7 +1260,6 @@ namespace v2rayN.Handler
return null;
}
- //转成Json
V2rayConfig v2rayConfig = Utils.FromJson(result);
if (v2rayConfig == null)
{
@@ -1392,25 +1286,25 @@ namespace v2rayN.Handler
return null;
}
- vmessItem.security = Global.DefaultSecurity;
- vmessItem.network = Global.DefaultNetwork;
- vmessItem.headerType = Global.None;
- vmessItem.address = string.Empty;
- vmessItem.port = inbound.port;
- vmessItem.id = inbound.settings.clients[0].id;
- vmessItem.alterId = inbound.settings.clients[0].alterId;
+ profileItem.security = Global.DefaultSecurity;
+ profileItem.network = Global.DefaultNetwork;
+ profileItem.headerType = Global.None;
+ profileItem.address = string.Empty;
+ profileItem.port = inbound.port;
+ profileItem.id = inbound.settings.clients[0].id;
+ profileItem.alterId = inbound.settings.clients[0].alterId;
- vmessItem.remarks = $"import@{DateTime.Now.ToShortDateString()}";
+ profileItem.remarks = $"import@{DateTime.Now.ToShortDateString()}";
//tcp or kcp
if (inbound.streamSettings != null
&& inbound.streamSettings.network != null
&& !Utils.IsNullOrEmpty(inbound.streamSettings.network))
{
- vmessItem.network = inbound.streamSettings.network;
+ profileItem.network = inbound.streamSettings.network;
}
- //tcp伪装http
+ //tcp http
if (inbound.streamSettings != null
&& inbound.streamSettings.tcpSettings != null
&& inbound.streamSettings.tcpSettings.header != null
@@ -1418,7 +1312,7 @@ namespace v2rayN.Handler
{
if (inbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp))
{
- vmessItem.headerType = inbound.streamSettings.tcpSettings.header.type;
+ profileItem.headerType = inbound.streamSettings.tcpSettings.header.type;
string request = Convert.ToString(inbound.streamSettings.tcpSettings.header.request);
if (!Utils.IsNullOrEmpty(request))
{
@@ -1428,12 +1322,12 @@ namespace v2rayN.Handler
&& v2rayTcpRequest.headers.Host != null
&& v2rayTcpRequest.headers.Host.Count > 0)
{
- vmessItem.requestHost = v2rayTcpRequest.headers.Host[0];
+ profileItem.requestHost = v2rayTcpRequest.headers.Host[0];
}
}
}
}
- //kcp伪装
+ //kcp
//if (v2rayConfig.outbound.streamSettings != null
// && v2rayConfig.outbound.streamSettings.kcpSettings != null
// && v2rayConfig.outbound.streamSettings.kcpSettings.header != null
@@ -1448,12 +1342,12 @@ namespace v2rayN.Handler
{
if (!Utils.IsNullOrEmpty(inbound.streamSettings.wsSettings.path))
{
- vmessItem.path = inbound.streamSettings.wsSettings.path;
+ profileItem.path = inbound.streamSettings.wsSettings.path;
}
if (inbound.streamSettings.wsSettings.headers != null
&& !Utils.IsNullOrEmpty(inbound.streamSettings.wsSettings.headers.Host))
{
- vmessItem.requestHost = inbound.streamSettings.wsSettings.headers.Host;
+ profileItem.requestHost = inbound.streamSettings.wsSettings.headers.Host;
}
}
@@ -1463,12 +1357,12 @@ namespace v2rayN.Handler
{
if (!Utils.IsNullOrEmpty(inbound.streamSettings.httpSettings.path))
{
- vmessItem.path = inbound.streamSettings.httpSettings.path;
+ profileItem.path = inbound.streamSettings.httpSettings.path;
}
if (inbound.streamSettings.httpSettings.host != null
&& inbound.streamSettings.httpSettings.host.Count > 0)
{
- vmessItem.requestHost = Utils.List2String(inbound.streamSettings.httpSettings.host);
+ profileItem.requestHost = Utils.List2String(inbound.streamSettings.httpSettings.host);
}
}
@@ -1477,7 +1371,7 @@ namespace v2rayN.Handler
&& inbound.streamSettings.security != null
&& inbound.streamSettings.security == Global.StreamSecurity)
{
- vmessItem.streamSecurity = Global.StreamSecurity;
+ profileItem.streamSecurity = Global.StreamSecurity;
}
}
catch (Exception ex)
@@ -1486,17 +1380,10 @@ namespace v2rayN.Handler
msg = ResUI.IncorrectClientConfiguration;
return null;
}
- return vmessItem;
+ return profileItem;
}
- ///
- /// 导出为客户端配置
- ///
- ///
- ///
- ///
- ///
- public static int Export2ClientConfig(VmessItem node, string fileName, out string msg)
+ public static int Export2ClientConfig(ProfileItem node, string fileName, out string msg)
{
V2rayConfig v2rayConfig = null;
if (GenerateClientConfigContent(node, true, ref v2rayConfig, out msg) != 0)
@@ -1506,14 +1393,7 @@ namespace v2rayN.Handler
return Utils.ToJsonFile(v2rayConfig, fileName, false);
}
- ///
- /// 导出为服务端配置
- ///
- ///
- ///
- ///
- ///
- public static int Export2ServerConfig(VmessItem node, string fileName, out string msg)
+ public static int Export2ServerConfig(ProfileItem node, string fileName, out string msg)
{
return GenerateServerConfig(node, fileName, out msg);
}
@@ -1565,11 +1445,11 @@ namespace v2rayN.Handler
log(configCopy, ref v2rayConfig, false);
//routing(config, ref v2rayConfig);
- dns(configCopy, ref v2rayConfig);
+ //dns(configCopy, ref v2rayConfig);
v2rayConfig.inbounds.Clear(); // Remove "proxy" service for speedtest, avoiding port conflicts.
- int httpPort = configCopy.GetLocalPort("speedtest");
+ int httpPort = LazyConfig.Instance.GetLocalPort("speedtest");
foreach (var it in selecteds)
{
@@ -1583,7 +1463,8 @@ namespace v2rayN.Handler
}
if (it.configType == EConfigType.VMess || it.configType == EConfigType.VLESS)
{
- if (!Utils.IsGuidByParse(configCopy.GetVmessItem(it.indexId).id))
+ var item2 = LazyConfig.Instance.GetProfileItem(config.indexId);
+ if (item2 is null || !Utils.IsGuidByParse(item2.id))
{
continue;
}
@@ -1591,7 +1472,7 @@ namespace v2rayN.Handler
//find unuse port
var port = httpPort;
- for (int k = httpPort; k < 65536; k++)
+ for (int k = httpPort; k < Global.MaxPort; k++)
{
if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == k) >= 0)
{
@@ -1615,6 +1496,7 @@ namespace v2rayN.Handler
it.port = port;
it.allowTest = true;
+ //inbound
Inbounds inbound = new Inbounds
{
listen = Global.Loopback,
@@ -1624,11 +1506,24 @@ namespace v2rayN.Handler
inbound.tag = Global.InboundHttp + inbound.port.ToString();
v2rayConfig.inbounds.Add(inbound);
+ //outbound
V2rayConfig v2rayConfigCopy = Utils.FromJson(result);
- outbound(configCopy.GetVmessItem(it.indexId), ref v2rayConfigCopy);
+ var item = LazyConfig.Instance.GetProfileItem(it.indexId);
+ if (item is null)
+ {
+ continue;
+ }
+ if (item.configType == EConfigType.Shadowsocks
+ && !Global.ssSecuritysInXray.Contains(item.security))
+ {
+ continue;
+ }
+
+ outbound(item, ref v2rayConfigCopy);
v2rayConfigCopy.outbounds[0].tag = Global.agentTag + inbound.port.ToString();
v2rayConfig.outbounds.Add(v2rayConfigCopy.outbounds[0]);
+ //rule
RulesItem rule = new RulesItem
{
inboundTag = new List { inbound.tag },
diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/CoreHandler.cs
similarity index 62%
rename from v2rayN/v2rayN/Handler/V2rayHandler.cs
rename to v2rayN/v2rayN/Handler/CoreHandler.cs
index 412bf95d..710a83c3 100644
--- a/v2rayN/v2rayN/Handler/V2rayHandler.cs
+++ b/v2rayN/v2rayN/Handler/CoreHandler.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
+using System.Diagnostics;
using System.IO;
using System.Text;
using v2rayN.Mode;
@@ -8,85 +6,72 @@ using v2rayN.Resx;
namespace v2rayN.Handler
{
-
///
- /// 消息委托
+ /// Core process processing class
///
- /// 是否显示在托盘区
- /// 内容
- public delegate void ProcessDelegate(bool notify, string msg);
-
- ///
- /// v2ray进程处理类
- ///
- class V2rayHandler
+ class CoreHandler
{
- private static string v2rayConfigRes = Global.v2rayConfigFileName;
+ private static string coreCConfigRes = Global.coreConfigFileName;
private CoreInfo coreInfo;
- public event ProcessDelegate ProcessEvent;
private int processId = 0;
private Process _process;
+ Action _updateFunc;
- public V2rayHandler()
+ public CoreHandler(Action update)
{
+ _updateFunc = update;
}
- ///
- /// 载入V2ray
- ///
- public void LoadV2ray(Config config)
+ public void LoadCore(Config config)
{
- if (Global.reloadV2ray)
+ if (Global.reloadCore)
{
- var item = ConfigHandler.GetDefaultServer(ref config);
- if (item == null)
+ var node = ConfigHandler.GetDefaultServer(ref config);
+ if (node == null)
{
ShowMsg(false, ResUI.CheckServerSettings);
return;
}
- if (SetCore(config, item) != 0)
+ if (SetCore(config, node) != 0)
{
ShowMsg(false, ResUI.CheckServerSettings);
return;
}
- string fileName = Utils.GetPath(v2rayConfigRes);
- if (V2rayConfigHandler.GenerateClientConfig(item, fileName, out string msg, out string content) != 0)
+ string fileName = Utils.GetConfigPath(coreCConfigRes);
+ if (CoreConfigHandler.GenerateClientConfig(node, fileName, out string msg, out string content) != 0)
{
ShowMsg(false, msg);
}
else
{
ShowMsg(false, msg);
- ShowMsg(true, $"[{config.GetGroupRemarks(item.groupId)}] {item.GetSummary()}");
- V2rayRestart();
+ ShowMsg(true, $"{node.GetSummary()}");
+ CoreStop();
+ CoreStart(node);
}
//start a socks service
- if (_process != null && !_process.HasExited && item.configType == EConfigType.Custom && item.preSocksPort > 0)
+ if (_process != null && !_process.HasExited && node.configType == EConfigType.Custom && node.preSocksPort > 0)
{
- var itemSocks = new VmessItem()
+ var itemSocks = new ProfileItem()
{
configType = EConfigType.Socks,
address = Global.Loopback,
- port = item.preSocksPort
+ port = node.preSocksPort
};
- if (V2rayConfigHandler.GenerateClientConfig(itemSocks, null, out string msg2, out string configStr) == 0)
+ if (CoreConfigHandler.GenerateClientConfig(itemSocks, null, out string msg2, out string configStr) == 0)
{
- processId = V2rayStartNew(configStr);
+ processId = CoreStartViaString(configStr);
}
}
}
}
- ///
- /// 新建进程,载入V2ray配置文件字符串
- /// 返回新进程pid。
- ///
- public int LoadV2rayConfigString(Config config, List _selecteds)
+ public int LoadCoreConfigString(Config config, List _selecteds)
{
int pid = -1;
- string configStr = V2rayConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg);
+ string configStr = CoreConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg);
if (configStr == "")
{
ShowMsg(false, msg);
@@ -94,26 +79,12 @@ namespace v2rayN.Handler
else
{
ShowMsg(false, msg);
- pid = V2rayStartNew(configStr);
- //V2rayRestart();
- // start with -config
+ pid = CoreStartViaString(configStr);
}
return pid;
}
- ///
- /// V2ray重启
- ///
- private void V2rayRestart()
- {
- V2rayStop();
- V2rayStart();
- }
-
- ///
- /// V2ray停止
- ///
- public void V2rayStop()
+ public void CoreStop()
{
try
{
@@ -135,7 +106,7 @@ namespace v2rayN.Handler
foreach (Process p in existing)
{
string path = p.MainModule.FileName;
- if (path == $"{Utils.GetPath(vName)}.exe")
+ if (path == $"{Utils.GetBinPath(vName, coreInfo.coreType)}.exe")
{
KillProcess(p);
}
@@ -145,7 +116,7 @@ namespace v2rayN.Handler
if (processId > 0)
{
- V2rayStopPid(processId);
+ CoreStopPid(processId);
processId = 0;
}
@@ -155,10 +126,8 @@ namespace v2rayN.Handler
Utils.SaveLog(ex.Message, ex);
}
}
- ///
- /// V2ray停止
- ///
- public void V2rayStopPid(int pid)
+
+ public void CoreStopPid(int pid)
{
try
{
@@ -171,13 +140,13 @@ namespace v2rayN.Handler
}
}
- private string V2rayFindexe(List lstCoreTemp)
+ private string CoreFindexe(List lstCoreTemp)
{
string fileName = string.Empty;
foreach (string name in lstCoreTemp)
{
string vName = $"{name}.exe";
- vName = Utils.GetPath(vName);
+ vName = Utils.GetBinPath(vName, coreInfo.coreType);
if (File.Exists(vName))
{
fileName = vName;
@@ -186,22 +155,19 @@ namespace v2rayN.Handler
}
if (Utils.IsNullOrEmpty(fileName))
{
- string msg = string.Format(ResUI.NotFoundCore, string.Join(", ", lstCoreTemp.ToArray()), coreInfo.coreUrl);
+ string msg = string.Format(ResUI.NotFoundCore, Utils.GetBinPath("", coreInfo.coreType), string.Join(", ", lstCoreTemp.ToArray()), coreInfo.coreUrl);
ShowMsg(false, msg);
}
return fileName;
}
- ///
- /// V2ray启动
- ///
- private void V2rayStart()
+ private void CoreStart(ProfileItem node)
{
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString()));
try
{
- string fileName = V2rayFindexe(coreInfo.coreExes);
+ string fileName = CoreFindexe(coreInfo.coreExes);
if (fileName == "") return;
Process p = new Process
@@ -210,16 +176,16 @@ namespace v2rayN.Handler
{
FileName = fileName,
Arguments = coreInfo.arguments,
- WorkingDirectory = Utils.StartupPath(),
+ WorkingDirectory = Utils.GetConfigPath(),
UseShellExecute = false,
- RedirectStandardOutput = coreInfo.redirectInfo,
- RedirectStandardError = coreInfo.redirectInfo,
+ RedirectStandardOutput = node.displayLog,
+ RedirectStandardError = node.displayLog,
CreateNoWindow = true,
- StandardOutputEncoding = coreInfo.redirectInfo ? Encoding.UTF8 : null,
- StandardErrorEncoding = coreInfo.redirectInfo ? Encoding.UTF8 : null,
+ StandardOutputEncoding = node.displayLog ? Encoding.UTF8 : null,
+ StandardErrorEncoding = node.displayLog ? Encoding.UTF8 : null,
}
};
- if (coreInfo.redirectInfo)
+ if (node.displayLog)
{
p.OutputDataReceived += (sender, e) =>
{
@@ -231,7 +197,7 @@ namespace v2rayN.Handler
};
}
p.Start();
- if (coreInfo.redirectInfo)
+ if (node.displayLog)
{
p.BeginOutputReadLine();
}
@@ -239,7 +205,7 @@ namespace v2rayN.Handler
if (p.WaitForExit(1000))
{
- throw new Exception(coreInfo.redirectInfo ? p.StandardError.ReadToEnd() : "启动进程失败并退出 (Failed to start the process and exited)");
+ throw new Exception(node.displayLog ? p.StandardError.ReadToEnd() : "启动进程失败并退出 (Failed to start the process and exited)");
}
Global.processJob.AddProcess(p.Handle);
@@ -251,16 +217,14 @@ namespace v2rayN.Handler
ShowMsg(true, msg);
}
}
- ///
- /// V2ray启动,新建进程,传入配置字符串
- ///
- private int V2rayStartNew(string configStr)
+
+ private int CoreStartViaString(string configStr)
{
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString()));
try
{
- string fileName = V2rayFindexe(new List { "xray", "wv2ray", "v2ray" });
+ string fileName = CoreFindexe(new List { "xray", "wxray", "wv2ray", "v2ray" });
if (fileName == "") return -1;
Process p = new Process
@@ -269,7 +233,7 @@ namespace v2rayN.Handler
{
FileName = fileName,
Arguments = "-config stdin:",
- WorkingDirectory = Utils.StartupPath(),
+ WorkingDirectory = Utils.GetConfigPath(),
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
@@ -310,14 +274,9 @@ namespace v2rayN.Handler
}
}
- ///
- /// 消息委托
- ///
- /// 是否更新托盘图标的工具提示
- /// 输出到日志框
private void ShowMsg(bool updateToTrayTooltip, string msg)
{
- ProcessEvent?.Invoke(updateToTrayTooltip, msg);
+ _updateFunc(updateToTrayTooltip, msg);
}
private void KillProcess(Process p)
@@ -338,13 +297,13 @@ namespace v2rayN.Handler
}
}
- private int SetCore(Config config, VmessItem item)
+ private int SetCore(Config config, ProfileItem node)
{
- if (item == null)
+ if (node == null)
{
return -1;
}
- var coreType = LazyConfig.Instance.GetCoreType(item, item.configType);
+ var coreType = LazyConfig.Instance.GetCoreType(node, node.configType);
coreInfo = LazyConfig.Instance.GetCoreInfo(coreType);
diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs
index 5d4d3caf..1f597fcd 100644
--- a/v2rayN/v2rayN/Handler/DownloadHandle.cs
+++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs
@@ -1,13 +1,9 @@
-using System;
-using System.Diagnostics;
+using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Sockets;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
using v2rayN.Base;
using v2rayN.Resx;
@@ -35,14 +31,14 @@ namespace v2rayN.Handler
}
}
- public async Task DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout)
+ public async Task DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action update)
{
+ var hasValue = false;
try
{
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
- UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Speedtesting));
- var client = new HttpClient(new WebRequestHandler()
+ var client = new HttpClient(new SocketsHttpHandler()
{
Proxy = webProxy
});
@@ -50,10 +46,11 @@ namespace v2rayN.Handler
var progress = new Progress();
progress.ProgressChanged += (sender, value) =>
{
- if (UpdateCompleted != null)
+ hasValue = true;
+ if (update != null)
{
- string msg = $"{value} M/s".PadLeft(9, ' ');
- UpdateCompleted(this, new ResultEventArgs(false, msg));
+ string msg = $"{value}";
+ update(false, msg);
}
};
@@ -66,11 +63,13 @@ namespace v2rayN.Handler
}
catch (Exception ex)
{
- //Utils.SaveLog(ex.Message, ex);
- Error?.Invoke(this, new ErrorEventArgs(ex));
- if (ex.InnerException != null)
+ if (!hasValue)
{
- Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
+ update(false, ex.Message);
+ if (ex.InnerException != null)
+ {
+ update(false, ex.InnerException.Message);
+ }
}
}
return 0;
@@ -83,7 +82,7 @@ namespace v2rayN.Handler
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading));
- var client = new HttpClient(new WebRequestHandler()
+ var client = new HttpClient(new SocketsHttpHandler()
{
Proxy = GetWebProxy(blProxy)
});
@@ -101,7 +100,7 @@ namespace v2rayN.Handler
var cancellationToken = new CancellationTokenSource();
_ = HttpClientHelper.GetInstance().DownloadFileAsync(client,
url,
- Utils.GetPath(Utils.GetDownloadFileName(url)),
+ Utils.GetTempPath(Utils.GetDownloadFileName(url)),
progress,
cancellationToken.Token);
}
@@ -109,7 +108,7 @@ namespace v2rayN.Handler
{
Utils.SaveLog(ex.Message, ex);
- Error?.Invoke(this, new ErrorEventArgs(ex));
+ Error?.Invoke(this, new ErrorEventArgs(ex));
if (ex.InnerException != null)
{
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
@@ -120,7 +119,7 @@ namespace v2rayN.Handler
public async Task UrlRedirectAsync(string url, bool blProxy)
{
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
- WebRequestHandler webRequestHandler = new WebRequestHandler
+ var webRequestHandler = new SocketsHttpHandler
{
AllowAutoRedirect = false,
Proxy = GetWebProxy(blProxy)
@@ -148,7 +147,7 @@ namespace v2rayN.Handler
try
{
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
- var client = new HttpClient(new WebRequestHandler()
+ var client = new HttpClient(new SocketsHttpHandler()
{
Proxy = GetWebProxy(blProxy)
});
@@ -190,13 +189,13 @@ namespace v2rayN.Handler
{
if (webProxy == null)
{
- var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp);
+ var httpPort = LazyConfig.Instance.GetLocalPort(Global.InboundHttp);
webProxy = new WebProxy(Global.Loopback, httpPort);
}
try
{
- string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out int responseTime);
+ string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, 10, out int responseTime);
bool noError = Utils.IsNullOrEmpty(status);
return noError ? responseTime : -1;
}
@@ -213,14 +212,14 @@ namespace v2rayN.Handler
}
}
- public string GetRealPingTime(string url, WebProxy webProxy, out int responseTime)
+ public string GetRealPingTime(string url, WebProxy webProxy, int downloadTimeout, out int responseTime)
{
string msg = string.Empty;
responseTime = -1;
try
{
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
- myHttpWebRequest.Timeout = 30 * 1000;
+ myHttpWebRequest.Timeout = downloadTimeout * 1000;
myHttpWebRequest.Proxy = webProxy;
Stopwatch timer = new Stopwatch();
@@ -251,7 +250,7 @@ namespace v2rayN.Handler
{
return null;
}
- var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp);
+ var httpPort = LazyConfig.Instance.GetLocalPort(Global.InboundHttp);
if (!SocketCheck(Global.Loopback, httpPort))
{
return null;
diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs
index 2a89f526..aaf3309b 100644
--- a/v2rayN/v2rayN/Handler/LazyConfig.cs
+++ b/v2rayN/v2rayN/Handler/LazyConfig.cs
@@ -1,18 +1,26 @@
-using System;
-using System.Collections.Generic;
+using v2rayN.Base;
using v2rayN.Mode;
-using System.Linq;
namespace v2rayN.Handler
{
public sealed class LazyConfig
{
- private static readonly Lazy _instance = new Lazy(() => new LazyConfig());
+ private static readonly Lazy _instance = new Lazy(() => new());
private Config _config;
private List coreInfos;
public static LazyConfig Instance => _instance.Value;
+ public LazyConfig()
+ {
+ SqliteHelper.Instance.CreateTable();
+ SqliteHelper.Instance.CreateTable();
+ SqliteHelper.Instance.CreateTable();
+ SqliteHelper.Instance.CreateTable();
+ }
+
+ #region Config
+
public void SetConfig(ref Config config)
{
_config = config;
@@ -22,13 +30,135 @@ namespace v2rayN.Handler
return _config;
}
- public List GetShadowsocksSecuritys(VmessItem vmessItem)
+ public int GetLocalPort(string protocol)
{
- if (GetCoreType(vmessItem, EConfigType.Shadowsocks) == ECoreType.v2fly)
+ int localPort = _config.inbound.FirstOrDefault(t => t.protocol == Global.InboundSocks).localPort;
+ if (protocol == Global.InboundSocks)
+ {
+ return localPort;
+ }
+ else if (protocol == Global.InboundHttp)
+ {
+ return localPort + 1;
+ }
+ else if (protocol == Global.InboundSocks2)
+ {
+ return localPort + 2;
+ }
+ else if (protocol == Global.InboundHttp2)
+ {
+ return localPort + 3;
+ }
+ else if (protocol == ESysProxyType.Pac.ToString())
+ {
+ return localPort + 4;
+ }
+ else if (protocol == "speedtest")
+ {
+ return localPort + 103;
+ }
+ return localPort;
+ }
+
+ public List SubItems()
+ {
+ return SqliteHelper.Instance.Table().ToList();
+ }
+ public SubItem GetSubItem(string subid)
+ {
+ return SqliteHelper.Instance.Table().FirstOrDefault(t => t.id == subid);
+ }
+
+ public List ProfileItems(string subid)
+ {
+ if (Utils.IsNullOrEmpty(subid))
+ {
+ return SqliteHelper.Instance.Table().ToList();
+
+ }
+ else
+ {
+ return SqliteHelper.Instance.Table().Where(t => t.subid == subid).ToList();
+ }
+ }
+
+ public List ProfileItems(string subid, string filter)
+ {
+ var sql = @$"select a.*
+ ,b.remarks subRemarks
+ ,case when a.indexId = '{_config.indexId}' then true else false end isActive
+ from ProfileItem a
+ left join SubItem b on a.subid = b.id
+ where 1=1 ";
+ if (!Utils.IsNullOrEmpty(subid))
+ {
+ sql += $" and a.subid = {subid}";
+ }
+ if (!Utils.IsNullOrEmpty(filter))
+ {
+ sql += $" and a.remarks like '%{filter}%'";
+ }
+ sql += " order by a.sort";
+
+ return SqliteHelper.Instance.Query(sql).ToList();
+ }
+
+ public ProfileItem GetProfileItem(string indexId)
+ {
+ if (Utils.IsNullOrEmpty(indexId))
+ {
+ return null;
+ }
+ return SqliteHelper.Instance.Table().FirstOrDefault(it => it.indexId == indexId);
+ }
+
+ public Task SetTestResult(string indexId, string delayVal, string speedVal)
+ {
+ string sql = string.Empty;
+ if (!Utils.IsNullOrEmpty(delayVal) && !Utils.IsNullOrEmpty(speedVal))
+ {
+ int.TryParse(delayVal, out int delay);
+ decimal.TryParse(speedVal, out decimal speed);
+ sql = $"update ProfileItem set delay={delay},speed={speed} where indexId = '{indexId}'";
+ }
+ else if (!Utils.IsNullOrEmpty(delayVal))
+ {
+ int.TryParse(delayVal, out int delay);
+ sql = $"update ProfileItem set delay={delay} where indexId = '{indexId}'";
+ }
+ else if (!Utils.IsNullOrEmpty(speedVal))
+ {
+ decimal.TryParse(speedVal, out decimal speed);
+ sql = $"update ProfileItem set speed={speed} where indexId = '{indexId}'";
+ }
+ return SqliteHelper.Instance.ExecuteAsync(sql);
+ }
+
+ public List ServerStatItems()
+ {
+ return SqliteHelper.Instance.Table().ToList();
+ }
+
+ public List RoutingItems()
+ {
+ return SqliteHelper.Instance.Table().Where(it => it.locked == false).ToList();
+ }
+ public RoutingItem GetRoutingItem(string id)
+ {
+ return SqliteHelper.Instance.Table().FirstOrDefault(it => it.locked == false && it.id == id);
+ }
+
+ #endregion
+
+ #region Core Type
+
+ public List GetShadowsocksSecuritys(ProfileItem profileItem)
+ {
+ if (GetCoreType(profileItem, EConfigType.Shadowsocks) == ECoreType.v2fly)
{
return Global.ssSecuritys;
}
- if (GetCoreType(vmessItem, EConfigType.Shadowsocks) == ECoreType.Xray)
+ if (GetCoreType(profileItem, EConfigType.Shadowsocks) == ECoreType.Xray)
{
return Global.ssSecuritysInXray;
}
@@ -36,11 +166,11 @@ namespace v2rayN.Handler
return Global.ssSecuritysInSagerNet;
}
- public ECoreType GetCoreType(VmessItem vmessItem, EConfigType eConfigType)
+ public ECoreType GetCoreType(ProfileItem profileItem, EConfigType eConfigType)
{
- if (vmessItem != null && vmessItem.coreType != null)
+ if (profileItem != null && profileItem.coreType != null)
{
- return (ECoreType)vmessItem.coreType;
+ return (ECoreType)profileItem.coreType;
}
if (_config.coreTypeItem == null)
@@ -64,6 +194,15 @@ namespace v2rayN.Handler
return coreInfos.Where(t => t.coreType == coreType).FirstOrDefault();
}
+ public List GetCoreInfos()
+ {
+ if (coreInfos == null)
+ {
+ InitCoreInfo();
+ }
+ return coreInfos;
+ }
+
private void InitCoreInfo()
{
coreInfos = new List();
@@ -122,7 +261,7 @@ namespace v2rayN.Handler
coreInfos.Add(new CoreInfo
{
coreType = ECoreType.Xray,
- coreExes = new List { "xray" },
+ coreExes = new List { "xray", "wxray" },
arguments = "",
coreUrl = Global.xrayCoreUrl,
coreReleaseApiUrl = Global.xrayCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
@@ -201,5 +340,6 @@ namespace v2rayN.Handler
});
}
+ #endregion
}
}
diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs
index 240d04ff..7d42c448 100644
--- a/v2rayN/v2rayN/Handler/MainFormHandler.cs
+++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs
@@ -1,14 +1,11 @@
using NHotkey;
-using NHotkey.WindowsForms;
-using System;
-using System.Collections.Generic;
+using NHotkey.Wpf;
using System.Drawing;
using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
using System.Windows.Forms;
+using System.Windows.Input;
+using System.Windows.Media.Imaging;
using v2rayN.Mode;
-using System.Linq;
using v2rayN.Resx;
namespace v2rayN.Handler
@@ -26,7 +23,7 @@ namespace v2rayN.Handler
//Action _updateFunc;
public static MainFormHandler Instance => instance.Value;
- public Icon GetNotifyIcon(Config config, Icon def)
+ public Icon GetNotifyIcon(Config config)
{
try
{
@@ -53,6 +50,8 @@ namespace v2rayN.Handler
return Properties.Resources.NotifyIcon2;
case 2:
return Properties.Resources.NotifyIcon3;
+ case 3:
+ return Properties.Resources.NotifyIcon2;
}
return Properties.Resources.NotifyIcon1;
@@ -60,9 +59,29 @@ namespace v2rayN.Handler
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
- return def;
+ return Properties.Resources.NotifyIcon1;
}
}
+
+ public System.Windows.Media.ImageSource GetAppIcon(Config config)
+ {
+ int index = 1;
+ switch ((int)config.sysProxyType)
+ {
+ case 0:
+ index = 1;
+ break;
+ case 1:
+ case 3:
+ index = 2;
+ break;
+ case 2:
+ index = 3;
+ break;
+ }
+ return BitmapFrame.Create(new Uri($"pack://application:,,,/Resources/NotifyIcon{index}.ico", UriKind.RelativeOrAbsolute));
+ }
+
private Icon GetNotifyIcon4Routing(Config config)
{
try
@@ -72,8 +91,8 @@ namespace v2rayN.Handler
return null;
}
- var item = config.routings[config.routingIndex];
- if (Utils.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon))
+ var item = ConfigHandler.GetDefaultRouting(ref config);
+ if (item == null || Utils.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon))
{
return null;
}
@@ -112,7 +131,7 @@ namespace v2rayN.Handler
}
}
- public void Export2ClientConfig(VmessItem item, Config config)
+ public void Export2ClientConfig(ProfileItem item, Config config)
{
if (item == null)
{
@@ -141,7 +160,7 @@ namespace v2rayN.Handler
}
//Config configCopy = Utils.DeepCopy(config);
//configCopy.index = index;
- if (V2rayConfigHandler.Export2ClientConfig(item, fileName, out string msg) != 0)
+ if (CoreConfigHandler.Export2ClientConfig(item, fileName, out string msg) != 0)
{
UI.Show(msg);
}
@@ -151,7 +170,7 @@ namespace v2rayN.Handler
}
}
- public void Export2ServerConfig(VmessItem item, Config config)
+ public void Export2ServerConfig(ProfileItem item, Config config)
{
if (item == null)
{
@@ -181,7 +200,7 @@ namespace v2rayN.Handler
}
//Config configCopy = Utils.DeepCopy(config);
//configCopy.index = index;
- if (V2rayConfigHandler.Export2ServerConfig(item, fileName, out string msg) != 0)
+ if (CoreConfigHandler.Export2ServerConfig(item, fileName, out string msg) != 0)
{
UI.Show(msg);
}
@@ -344,29 +363,30 @@ namespace v2rayN.Handler
continue;
}
- Keys keys = (Keys)item.KeyCode;
+ var modifiers = ModifierKeys.None;
if (item.Control)
{
- keys |= Keys.Control;
+ modifiers |= ModifierKeys.Control;
}
if (item.Alt)
{
- keys |= Keys.Alt;
+ modifiers |= ModifierKeys.Alt;
}
if (item.Shift)
{
- keys |= Keys.Shift;
+ modifiers |= ModifierKeys.Shift;
}
+ var gesture = new KeyGesture(KeyInterop.KeyFromVirtualKey((int)item.KeyCode), modifiers);
try
{
- HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), keys, handler);
- var msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{item.eGlobalHotkey.ToString()} = {keys}");
+ HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), gesture, handler);
+ var msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{item.eGlobalHotkey.ToString()}");
update(false, msg);
}
catch (Exception ex)
{
- var msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{item.eGlobalHotkey.ToString()} = {keys}", ex.Message);
+ var msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{item.eGlobalHotkey.ToString()}", ex.Message);
update(false, msg);
Utils.SaveLog(msg);
}
diff --git a/v2rayN/v2rayN/Handler/NoticeHandler.cs b/v2rayN/v2rayN/Handler/NoticeHandler.cs
new file mode 100644
index 00000000..0b3c1d2f
--- /dev/null
+++ b/v2rayN/v2rayN/Handler/NoticeHandler.cs
@@ -0,0 +1,33 @@
+using MaterialDesignThemes.Wpf;
+using ReactiveUI;
+
+namespace v2rayN.Handler
+{
+ public class NoticeHandler
+ {
+ private readonly ISnackbarMessageQueue _snackbarMessageQueue;
+
+ public NoticeHandler(ISnackbarMessageQueue snackbarMessageQueue)
+ {
+ _snackbarMessageQueue = snackbarMessageQueue ?? throw new ArgumentNullException(nameof(snackbarMessageQueue));
+
+ //_snackbarMessageQueue = snackbarMessageQueue;
+ }
+
+ public void Enqueue(object content)
+ {
+ _snackbarMessageQueue?.Enqueue(content);
+ }
+ public void SendMessage(string msg)
+ {
+ MessageBus.Current.SendMessage(msg, "MsgView");
+ }
+ public void SendMessage(string msg, bool time)
+ {
+ msg = $"{DateTime.Now} {msg}";
+ MessageBus.Current.SendMessage(msg, "MsgView");
+ }
+
+
+ }
+}
diff --git a/v2rayN/v2rayN/Handler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs
index 4e900eee..1a0d46db 100644
--- a/v2rayN/v2rayN/Handler/ProxySetting.cs
+++ b/v2rayN/v2rayN/Handler/ProxySetting.cs
@@ -1,5 +1,4 @@
using Microsoft.Win32;
-using System;
using System.Runtime.InteropServices;
namespace v2rayN.Handler
diff --git a/v2rayN/v2rayN/Handler/QRCodeHelper.cs b/v2rayN/v2rayN/Handler/QRCodeHelper.cs
index 4214f485..643b7e7e 100644
--- a/v2rayN/v2rayN/Handler/QRCodeHelper.cs
+++ b/v2rayN/v2rayN/Handler/QRCodeHelper.cs
@@ -1,7 +1,6 @@
-using System;
-using System.Drawing;
-using ZXing;
-using ZXing.QrCode;
+using QRCoder;
+using QRCoder.Xaml;
+using System.Windows.Media;
namespace v2rayN.Handler
{
@@ -10,36 +9,22 @@ namespace v2rayN.Handler
///
public class QRCodeHelper
{
- public static Image GetQRCode(string strContent)
+ public static DrawingImage GetQRCode(string strContent)
{
- Image img = null;
try
{
- QrCodeEncodingOptions options = new QrCodeEncodingOptions
- {
- CharacterSet = "UTF-8",
- DisableECI = true, // Extended Channel Interpretation (ECI) 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。
- ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M, // 纠错级别
- Width = 500,
- Height = 500,
- Margin = 1
- };
- // options.Hints,更多属性,也可以在这里添加。
-
- BarcodeWriter writer = new BarcodeWriter
- {
- Format = BarcodeFormat.QR_CODE,
- Options = options
- };
- Bitmap bmp = writer.Write(strContent);
- img = (Image)bmp;
- return img;
+ QRCodeGenerator qrGenerator = new QRCodeGenerator();
+ QRCodeData qrCodeData = qrGenerator.CreateQrCode(strContent, QRCodeGenerator.ECCLevel.H);
+ XamlQRCode qrCode = new XamlQRCode(qrCodeData);
+ DrawingImage qrCodeAsXaml = qrCode.GetGraphic(40);
+ return qrCodeAsXaml;
}
- catch(Exception ex)
+ catch
{
- Utils.SaveLog(ex.Message, ex);
- return img;
+ return null;
}
}
+
+
}
}
diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs
index 55a40eac..064da35b 100644
--- a/v2rayN/v2rayN/Handler/ShareHandler.cs
+++ b/v2rayN/v2rayN/Handler/ShareHandler.cs
@@ -1,11 +1,5 @@
-using System;
-using System.Collections.Generic;
-using System.Collections.Specialized;
-using System.Linq;
-using System.Net;
-using System.Text;
+using System.Collections.Specialized;
using System.Text.RegularExpressions;
-using System.Threading.Tasks;
using System.Web;
using v2rayN.Base;
using v2rayN.Mode;
@@ -23,7 +17,7 @@ namespace v2rayN.Handler
///
///
///
- public static string GetShareUrl(VmessItem item)
+ public static string GetShareUrl(ProfileItem item)
{
try
{
@@ -58,7 +52,7 @@ namespace v2rayN.Handler
}
}
- private static string ShareVmess(VmessItem item)
+ private static string ShareVmess(ProfileItem item)
{
string url = string.Empty;
@@ -77,7 +71,7 @@ namespace v2rayN.Handler
path = item.path,
tls = item.streamSecurity,
sni = item.sni,
- alpn = Utils.List2String(item.alpn)
+ alpn = item.alpn
};
url = Utils.ToJson(vmessQRCode);
@@ -87,7 +81,7 @@ namespace v2rayN.Handler
return url;
}
- private static string ShareShadowsocks(VmessItem item)
+ private static string ShareShadowsocks(ProfileItem item)
{
string url = string.Empty;
@@ -104,12 +98,12 @@ namespace v2rayN.Handler
//url = Utils.Base64Encode(url);
//new Sip002
var pw = Utils.Base64Encode($"{item.security}:{item.id}");
- url = $"{pw}@{GetIpv6(item.address)}:{ item.port}";
+ url = $"{pw}@{GetIpv6(item.address)}:{item.port}";
url = $"{Global.ssProtocol}{url}{remark}";
return url;
}
- private static string ShareSocks(VmessItem item)
+ private static string ShareSocks(ProfileItem item)
{
string url = string.Empty;
string remark = string.Empty;
@@ -125,12 +119,12 @@ namespace v2rayN.Handler
//url = Utils.Base64Encode(url);
//new
var pw = Utils.Base64Encode($"{item.security}:{item.id}");
- url = $"{pw}@{GetIpv6(item.address)}:{ item.port}";
+ url = $"{pw}@{GetIpv6(item.address)}:{item.port}";
url = $"{Global.socksProtocol}{url}{remark}";
return url;
}
- private static string ShareTrojan(VmessItem item)
+ private static string ShareTrojan(ProfileItem item)
{
string url = string.Empty;
string remark = string.Empty;
@@ -150,7 +144,7 @@ namespace v2rayN.Handler
return url;
}
- private static string ShareVLESS(VmessItem item)
+ private static string ShareVLESS(ProfileItem item)
{
string url = string.Empty;
string remark = string.Empty;
@@ -182,7 +176,7 @@ namespace v2rayN.Handler
return Utils.IsIpv6(address) ? $"[{address}]" : address;
}
- private static int GetStdTransport(VmessItem item, string securityDef, ref Dictionary dicQuery)
+ private static int GetStdTransport(ProfileItem item, string securityDef, ref Dictionary dicQuery)
{
if (!Utils.IsNullOrEmpty(item.flow))
{
@@ -204,9 +198,9 @@ namespace v2rayN.Handler
{
dicQuery.Add("sni", item.sni);
}
- if (item.alpn != null && item.alpn.Count > 0)
+ if (!Utils.IsNullOrEmpty(item.alpn))
{
- dicQuery.Add("alpn", Utils.UrlEncode(Utils.List2String(item.alpn)));
+ dicQuery.Add("alpn", Utils.UrlEncode(item.alpn));
}
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp");
@@ -282,10 +276,10 @@ namespace v2rayN.Handler
///
///
///
- public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg)
+ public static ProfileItem ImportFromClipboardConfig(string clipboardData, out string msg)
{
msg = string.Empty;
- VmessItem vmessItem = new VmessItem();
+ ProfileItem profileItem = new ProfileItem();
try
{
@@ -302,58 +296,56 @@ namespace v2rayN.Handler
int indexSplit = result.IndexOf("?");
if (indexSplit > 0)
{
- vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result);
+ profileItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result);
}
else
{
- vmessItem = ResolveVmess(result, out msg);
+ profileItem = ResolveVmess(result, out msg);
}
- ConfigHandler.UpgradeServerVersion(ref vmessItem);
}
else if (result.StartsWith(Global.ssProtocol))
{
msg = ResUI.ConfigurationFormatIncorrect;
- vmessItem = ResolveSSLegacy(result) ?? ResolveSip002(result);
- if (vmessItem == null)
+ profileItem = ResolveSSLegacy(result) ?? ResolveSip002(result);
+ if (profileItem == null)
{
return null;
}
- if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0)
+ if (profileItem.address.Length == 0 || profileItem.port == 0 || profileItem.security.Length == 0 || profileItem.id.Length == 0)
{
return null;
}
- vmessItem.configType = EConfigType.Shadowsocks;
+ profileItem.configType = EConfigType.Shadowsocks;
}
else if (result.StartsWith(Global.socksProtocol))
{
msg = ResUI.ConfigurationFormatIncorrect;
- vmessItem = ResolveSocksNew(result) ?? ResolveSocks(result);
- if (vmessItem == null)
+ profileItem = ResolveSocksNew(result) ?? ResolveSocks(result);
+ if (profileItem == null)
{
return null;
}
- if (vmessItem.address.Length == 0 || vmessItem.port == 0)
+ if (profileItem.address.Length == 0 || profileItem.port == 0)
{
return null;
}
- vmessItem.configType = EConfigType.Socks;
+ profileItem.configType = EConfigType.Socks;
}
else if (result.StartsWith(Global.trojanProtocol))
{
msg = ResUI.ConfigurationFormatIncorrect;
- vmessItem = ResolveTrojan(result);
+ profileItem = ResolveTrojan(result);
}
else if (result.StartsWith(Global.vlessProtocol))
{
- vmessItem = ResolveStdVLESS(result);
+ profileItem = ResolveStdVLESS(result);
- ConfigHandler.UpgradeServerVersion(ref vmessItem);
}
else
{
@@ -368,13 +360,13 @@ namespace v2rayN.Handler
return null;
}
- return vmessItem;
+ return profileItem;
}
- private static VmessItem ResolveVmess(string result, out string msg)
+ private static ProfileItem ResolveVmess(string result, out string msg)
{
msg = string.Empty;
- var vmessItem = new VmessItem
+ var profileItem = new ProfileItem
{
configType = EConfigType.VMess
};
@@ -390,39 +382,39 @@ namespace v2rayN.Handler
return null;
}
- vmessItem.network = Global.DefaultNetwork;
- vmessItem.headerType = Global.None;
+ profileItem.network = Global.DefaultNetwork;
+ profileItem.headerType = Global.None;
- vmessItem.configVersion = Utils.ToInt(vmessQRCode.v);
- vmessItem.remarks = Utils.ToString(vmessQRCode.ps);
- vmessItem.address = Utils.ToString(vmessQRCode.add);
- vmessItem.port = Utils.ToInt(vmessQRCode.port);
- vmessItem.id = Utils.ToString(vmessQRCode.id);
- vmessItem.alterId = Utils.ToInt(vmessQRCode.aid);
- vmessItem.security = Utils.ToString(vmessQRCode.scy);
+ profileItem.configVersion = Utils.ToInt(vmessQRCode.v);
+ profileItem.remarks = Utils.ToString(vmessQRCode.ps);
+ profileItem.address = Utils.ToString(vmessQRCode.add);
+ profileItem.port = Utils.ToInt(vmessQRCode.port);
+ profileItem.id = Utils.ToString(vmessQRCode.id);
+ profileItem.alterId = Utils.ToInt(vmessQRCode.aid);
+ profileItem.security = Utils.ToString(vmessQRCode.scy);
- vmessItem.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity;
+ profileItem.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity;
if (!Utils.IsNullOrEmpty(vmessQRCode.net))
{
- vmessItem.network = vmessQRCode.net;
+ profileItem.network = vmessQRCode.net;
}
if (!Utils.IsNullOrEmpty(vmessQRCode.type))
{
- vmessItem.headerType = vmessQRCode.type;
+ profileItem.headerType = vmessQRCode.type;
}
- vmessItem.requestHost = Utils.ToString(vmessQRCode.host);
- vmessItem.path = Utils.ToString(vmessQRCode.path);
- vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
- vmessItem.sni = Utils.ToString(vmessQRCode.sni);
- vmessItem.alpn = Utils.String2List(vmessQRCode.alpn);
+ profileItem.requestHost = Utils.ToString(vmessQRCode.host);
+ profileItem.path = Utils.ToString(vmessQRCode.path);
+ profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls);
+ profileItem.sni = Utils.ToString(vmessQRCode.sni);
+ profileItem.alpn = Utils.ToString(vmessQRCode.alpn);
- return vmessItem;
+ return profileItem;
}
- private static VmessItem ResolveVmess4Kitsunebi(string result)
+ private static ProfileItem ResolveVmess4Kitsunebi(string result)
{
- VmessItem vmessItem = new VmessItem
+ ProfileItem profileItem = new ProfileItem
{
configType = EConfigType.VMess
};
@@ -446,21 +438,21 @@ namespace v2rayN.Handler
return null;
}
- vmessItem.address = arr22[0];
- vmessItem.port = Utils.ToInt(arr22[1]);
- vmessItem.security = arr21[0];
- vmessItem.id = arr21[1];
+ profileItem.address = arr22[0];
+ profileItem.port = Utils.ToInt(arr22[1]);
+ profileItem.security = arr21[0];
+ profileItem.id = arr21[1];
- vmessItem.network = Global.DefaultNetwork;
- vmessItem.headerType = Global.None;
- vmessItem.remarks = "Alien";
+ profileItem.network = Global.DefaultNetwork;
+ profileItem.headerType = Global.None;
+ profileItem.remarks = "Alien";
- return vmessItem;
+ return profileItem;
}
- private static VmessItem ResolveStdVmess(string result)
+ private static ProfileItem ResolveStdVmess(string result)
{
- VmessItem i = new VmessItem
+ ProfileItem i = new ProfileItem
{
configType = EConfigType.VMess,
security = "auto"
@@ -539,7 +531,7 @@ namespace v2rayN.Handler
return i;
}
- private static VmessItem ResolveSip002(string result)
+ private static ProfileItem ResolveSip002(string result)
{
Uri parsedUrl;
try
@@ -550,7 +542,7 @@ namespace v2rayN.Handler
{
return null;
}
- VmessItem server = new VmessItem
+ ProfileItem server = new ProfileItem
{
remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped),
address = parsedUrl.IdnHost,
@@ -605,13 +597,13 @@ namespace v2rayN.Handler
private static readonly Regex UrlFinder = new Regex(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase);
private static readonly Regex DetailsParser = new Regex(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase);
- private static VmessItem ResolveSSLegacy(string result)
+ private static ProfileItem ResolveSSLegacy(string result)
{
var match = UrlFinder.Match(result);
if (!match.Success)
return null;
- VmessItem server = new VmessItem();
+ ProfileItem server = new ProfileItem();
var base64 = match.Groups["base64"].Value.TrimEnd('/');
var tag = match.Groups["tag"].Value;
if (!Utils.IsNullOrEmpty(tag))
@@ -640,9 +632,9 @@ namespace v2rayN.Handler
private static readonly Regex StdVmessUserInfo = new Regex(
@"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$");
- private static VmessItem ResolveSocks(string result)
+ private static ProfileItem ResolveSocks(string result)
{
- VmessItem vmessItem = new VmessItem
+ ProfileItem profileItem = new ProfileItem
{
configType = EConfigType.Socks
};
@@ -653,7 +645,7 @@ namespace v2rayN.Handler
{
try
{
- vmessItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1));
+ profileItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1));
}
catch { }
result = result.Substring(0, indexRemark);
@@ -680,15 +672,15 @@ namespace v2rayN.Handler
{
return null;
}
- vmessItem.address = arr1[1].Substring(0, indexPort);
- vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1)));
- vmessItem.security = arr21[0];
- vmessItem.id = arr21[1];
+ profileItem.address = arr1[1].Substring(0, indexPort);
+ profileItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1)));
+ profileItem.security = arr21[0];
+ profileItem.id = arr21[1];
- return vmessItem;
+ return profileItem;
}
- private static VmessItem ResolveSocksNew(string result)
+ private static ProfileItem ResolveSocksNew(string result)
{
Uri parsedUrl;
try
@@ -699,7 +691,7 @@ namespace v2rayN.Handler
{
return null;
}
- VmessItem server = new VmessItem
+ ProfileItem server = new ProfileItem
{
remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped),
address = parsedUrl.IdnHost,
@@ -719,9 +711,9 @@ namespace v2rayN.Handler
return server;
}
- private static VmessItem ResolveTrojan(string result)
+ private static ProfileItem ResolveTrojan(string result)
{
- VmessItem item = new VmessItem
+ ProfileItem item = new ProfileItem
{
configType = EConfigType.Trojan
};
@@ -738,9 +730,9 @@ namespace v2rayN.Handler
return item;
}
- private static VmessItem ResolveStdVLESS(string result)
+ private static ProfileItem ResolveStdVLESS(string result)
{
- VmessItem item = new VmessItem
+ ProfileItem item = new ProfileItem
{
configType = EConfigType.VLESS,
security = "none"
@@ -761,12 +753,12 @@ namespace v2rayN.Handler
return item;
}
- private static int ResolveStdTransport(NameValueCollection query, ref VmessItem item)
+ private static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item)
{
item.flow = query["flow"] ?? "";
item.streamSecurity = query["security"] ?? "";
item.sni = query["sni"] ?? "";
- item.alpn = Utils.String2List(Utils.UrlDecode(query["alpn"] ?? ""));
+ item.alpn = Utils.UrlDecode(query["alpn"] ?? "");
item.network = query["type"] ?? "tcp";
switch (item.network)
{
diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs
index e5d6022d..7bff7067 100644
--- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs
+++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs
@@ -1,11 +1,7 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
+using System.Diagnostics;
using System.Net;
+using System.Net.NetworkInformation;
using System.Net.Sockets;
-using System.Threading;
-using System.Threading.Tasks;
using v2rayN.Mode;
using v2rayN.Resx;
@@ -14,19 +10,19 @@ namespace v2rayN.Handler
class SpeedtestHandler
{
private Config _config;
- private V2rayHandler _v2rayHandler;
+ private CoreHandler _coreHandler;
private List _selecteds;
- Action _updateFunc;
+ Action _updateFunc;
public SpeedtestHandler(Config config)
{
_config = config;
}
- public SpeedtestHandler(Config config, V2rayHandler v2rayHandler, List selecteds, ESpeedActionType actionType, Action update)
+ public SpeedtestHandler(Config config, CoreHandler coreHandler, List selecteds, ESpeedActionType actionType, Action update)
{
_config = config;
- _v2rayHandler = v2rayHandler;
+ _coreHandler = coreHandler;
//_selecteds = Utils.DeepCopy(selecteds);
_updateFunc = update;
@@ -41,22 +37,23 @@ namespace v2rayN.Handler
configType = it.configType
});
}
-
- if (actionType == ESpeedActionType.Ping)
+ switch (actionType)
{
- Task.Run(RunPing);
- }
- else if (actionType == ESpeedActionType.Tcping)
- {
- Task.Run(RunTcping);
- }
- else if (actionType == ESpeedActionType.Realping)
- {
- Task.Run(RunRealPing);
- }
- else if (actionType == ESpeedActionType.Speedtest)
- {
- Task.Run(RunSpeedTestAsync);
+ case ESpeedActionType.Ping:
+ Task.Run(RunPing);
+ break;
+ case ESpeedActionType.Tcping:
+ Task.Run(RunTcping);
+ break;
+ case ESpeedActionType.Realping:
+ Task.Run(RunRealPing);
+ break;
+ case ESpeedActionType.Speedtest:
+ Task.Run(RunSpeedTestAsync);
+ break;
+ case ESpeedActionType.Mixedtest:
+ Task.Run(RunMixedtestAsync);
+ break;
}
}
@@ -89,9 +86,11 @@ namespace v2rayN.Handler
{
RunPingSub((ServerTestItem it) =>
{
- long time = Utils.Ping(it.address);
+ long time = Ping(it.address);
+ var output = FormatOut(time, Global.DelayUnit);
- _updateFunc(it.indexId, FormatOut(time, "ms"));
+ LazyConfig.Instance.SetTestResult(it.indexId, output, "");
+ UpdateFunc(it.indexId, output);
});
}
@@ -100,22 +99,24 @@ namespace v2rayN.Handler
RunPingSub((ServerTestItem it) =>
{
int time = GetTcpingTime(it.address, it.port);
+ var output = FormatOut(time, Global.DelayUnit);
- _updateFunc(it.indexId, FormatOut(time, "ms"));
+ LazyConfig.Instance.SetTestResult(it.indexId, output, "");
+ UpdateFunc(it.indexId, output);
});
}
- private void RunRealPing()
+ private async Task RunRealPing()
{
int pid = -1;
try
{
string msg = string.Empty;
- pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds);
+ pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
if (pid < 0)
{
- _updateFunc(_selecteds[0].indexId, ResUI.OperationFailed);
+ UpdateFunc("", ResUI.FailedToRunCore);
return;
}
@@ -136,13 +137,13 @@ namespace v2rayN.Handler
{
try
{
- WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
- int responseTime = -1;
- string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime);
- string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status;
+ LazyConfig.Instance.SetTestResult(it.indexId, "-1", "");
- _config.GetVmessItem(it.indexId)?.SetTestResult(output);
- _updateFunc(it.indexId, output);
+ WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
+ string output = GetRealPingTime(downloadHandle, webProxy);
+
+ LazyConfig.Instance.SetTestResult(it.indexId, output, "");
+ UpdateFunc(it.indexId, output);
}
catch (Exception ex)
{
@@ -159,37 +160,29 @@ namespace v2rayN.Handler
}
finally
{
- if (pid > 0) _v2rayHandler.V2rayStopPid(pid);
+ if (pid > 0) _coreHandler.CoreStopPid(pid);
}
}
-
private async Task RunSpeedTestAsync()
{
string testIndexId = string.Empty;
int pid = -1;
- pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds);
+ pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
if (pid < 0)
{
- _updateFunc(_selecteds[0].indexId, ResUI.OperationFailed);
+ UpdateFunc("", ResUI.FailedToRunCore);
return;
}
string url = _config.constItem.speedTestUrl;
- DownloadHandle downloadHandle2 = new DownloadHandle();
- downloadHandle2.UpdateCompleted += (sender2, args) =>
- {
- _config.GetVmessItem(testIndexId)?.SetTestResult(args.Msg);
- _updateFunc(testIndexId, args.Msg);
- };
- downloadHandle2.Error += (sender2, args) =>
- {
- _updateFunc(testIndexId, args.GetException().Message);
- };
+ DownloadHandle downloadHandle = new DownloadHandle();
- var timeout = 8;
+ var timeout = 10;
foreach (var it in _selecteds)
{
+ _ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
+ UpdateFunc(it.indexId, "", ResUI.Speedtesting);
if (!it.allowTest)
{
continue;
@@ -199,15 +192,41 @@ namespace v2rayN.Handler
continue;
}
testIndexId = it.indexId;
- if (_config.FindIndexId(it.indexId) < 0) continue;
+
+ var item = LazyConfig.Instance.GetProfileItem(it.indexId);
+ if (item is null) continue;
WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
- await downloadHandle2.DownloadDataAsync(url, webProxy, timeout);
+
+ await downloadHandle.DownloadDataAsync(url, webProxy, timeout, (bool success, string msg) =>
+ {
+ decimal.TryParse(msg, out decimal dec);
+ if (dec > 0)
+ {
+ _ = LazyConfig.Instance.SetTestResult(it.indexId, "", msg);
+ }
+ UpdateFunc(it.indexId, "", msg);
+ });
}
- if (pid > 0) _v2rayHandler.V2rayStopPid(pid);
+ if (pid > 0)
+ {
+ _coreHandler.CoreStopPid(pid);
+ }
+ }
+ private async Task RunMixedtestAsync()
+ {
+ await RunRealPing();
+
+ await RunSpeedTestAsync();
}
+ public string GetRealPingTime(DownloadHandle downloadHandle, WebProxy webProxy)
+ {
+ string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
+ //string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status;
+ return FormatOut(Utils.IsNullOrEmpty(status) ? responseTime : -1, Global.DelayUnit);
+ }
private int GetTcpingTime(string url, int port)
{
@@ -243,13 +262,56 @@ namespace v2rayN.Handler
return responseTime;
}
+
+ ///
+ /// Ping
+ ///
+ ///
+ ///
+ public long Ping(string host)
+ {
+ long roundtripTime = -1;
+ try
+ {
+ int timeout = 30;
+ int echoNum = 2;
+ Ping pingSender = new Ping();
+ for (int i = 0; i < echoNum; i++)
+ {
+ PingReply reply = pingSender.Send(host, timeout);
+ if (reply.Status == IPStatus.Success)
+ {
+ if (reply.RoundtripTime < 0)
+ {
+ continue;
+ }
+ if (roundtripTime < 0 || reply.RoundtripTime < roundtripTime)
+ {
+ roundtripTime = reply.RoundtripTime;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Utils.SaveLog(ex.Message, ex);
+ return -1;
+ }
+ return roundtripTime;
+ }
+
private string FormatOut(object time, string unit)
{
- if (time.ToString().Equals("-1"))
- {
- return "Timeout";
- }
- return $"{time}{unit}".PadLeft(8, ' ');
+ //if (time.ToString().Equals("-1"))
+ //{
+ // return "Timeout";
+ //}
+ return $"{time}";
+ }
+
+ private void UpdateFunc(string indexId, string delay, string speed = "")
+ {
+ _updateFunc(indexId, delay, speed);
}
}
}
diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs
index 65b6e687..1427a4fd 100644
--- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs
+++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs
@@ -1,65 +1,35 @@
using Grpc.Core;
-using System;
-using System.Collections.Generic;
+using ProtosLib.Statistics;
using System.Net;
using System.Net.Sockets;
-using System.Threading;
-using System.Threading.Tasks;
+using v2rayN.Base;
using v2rayN.Mode;
-using v2rayN.Protos.Statistics;
namespace v2rayN.Handler
{
class StatisticsHandler
{
private Mode.Config config_;
- private ServerStatistics serverStatistics_;
private Channel channel_;
private StatsService.StatsServiceClient client_;
private bool exitFlag_;
+ private ServerStatItem _serverStatItem;
- Action> updateFunc_;
+ Action updateFunc_;
public bool Enable
{
get; set;
}
- public bool UpdateUI
+ public StatisticsHandler(Mode.Config config, Action update)
{
- get; set;
- }
-
-
- public List Statistic => serverStatistics_.server;
-
- public StatisticsHandler(Mode.Config config, Action> update)
- {
- //try
- //{
- // if (Environment.Is64BitOperatingSystem)
- // {
- // FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x64.dll"), Resources.grpc_csharp_ext_x64_dll);
- // }
- // else
- // {
- // FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x86.dll"), Resources.grpc_csharp_ext_x86_dll);
- // }
- //}
- //catch (IOException ex)
- //{
- // Utils.SaveLog(ex.Message, ex);
-
- //}
-
config_ = config;
Enable = config.enableStatistics;
- UpdateUI = false;
updateFunc_ = update;
exitFlag_ = false;
- LoadFromFile();
-
+ Init();
GrpcInit();
Task.Run(Run);
@@ -110,140 +80,92 @@ namespace v2rayN.Handler
if (res != null)
{
- string itemId = config_.indexId;
- ServerStatItem serverStatItem = GetServerStatItem(itemId);
+ GetServerStatItem(config_.indexId);
+ ParseOutput(res.Stat, out ServerSpeedItem server);
- //TODO: parse output
- ParseOutput(res.Stat, out ulong up, out ulong down);
+ _serverStatItem.todayUp += server.proxyUp;
+ _serverStatItem.todayDown += server.proxyDown;
+ _serverStatItem.totalUp += server.proxyUp;
+ _serverStatItem.totalDown += server.proxyDown;
- serverStatItem.todayUp += up;
- serverStatItem.todayDown += down;
- serverStatItem.totalUp += up;
- serverStatItem.totalDown += down;
-
- if (UpdateUI)
+ if (Global.ShowInTaskbar)
{
- updateFunc_(up, down, new List { serverStatItem });
+ server.indexId = config_.indexId;
+ updateFunc_(server);
}
+ if (server.proxyUp != 0 || server.proxyDown != 0)
+ {
+ _ = SqliteHelper.Instance.UpdateAsync(_serverStatItem);
+ }
+
}
}
var sleep = config_.statisticsFreshRate < 1 ? 1 : config_.statisticsFreshRate;
Thread.Sleep(1000 * sleep);
channel_.ConnectAsync();
}
- catch (Exception ex)
+ catch
{
- //Utils.SaveLog(ex.Message, ex);
}
}
}
- public void LoadFromFile()
- {
- try
- {
- string result = Utils.LoadResource(Utils.GetPath(Global.StatisticLogOverall));
- if (!Utils.IsNullOrEmpty(result))
- {
- //转成Json
- serverStatistics_ = Utils.FromJson(result);
- }
-
- if (serverStatistics_ == null)
- {
- serverStatistics_ = new ServerStatistics();
- }
- if (serverStatistics_.server == null)
- {
- serverStatistics_.server = new List();
- }
-
- long ticks = DateTime.Now.Date.Ticks;
- foreach (ServerStatItem item in serverStatistics_.server)
- {
- if (item.dateNow != ticks)
- {
- item.todayUp = 0;
- item.todayDown = 0;
- item.dateNow = ticks;
- }
- }
- }
- catch (Exception ex)
- {
- Utils.SaveLog(ex.Message, ex);
- }
- }
-
- public void SaveToFile()
- {
- try
- {
- Utils.ToJsonFile(serverStatistics_, Utils.GetPath(Global.StatisticLogOverall));
- }
- catch (Exception ex)
- {
- Utils.SaveLog(ex.Message, ex);
- }
- }
-
public void ClearAllServerStatistics()
{
- if (serverStatistics_ != null)
- {
- //foreach (var item in serverStatistics_.server)
- //{
- // item.todayUp = 0;
- // item.todayDown = 0;
- // item.totalUp = 0;
- // item.totalDown = 0;
- // // update ui display to zero
- // updateFunc_(0, 0, new List { item });
- //}
- serverStatistics_.server = new List();
-
- // update statistic json file
- SaveToFile();
- }
+ SqliteHelper.Instance.Execute($"delete from ServerStatItem ");
+ _serverStatItem = null;
}
- private ServerStatItem GetServerStatItem(string itemId)
+ private void Init()
{
long ticks = DateTime.Now.Date.Ticks;
- int cur = Statistic.FindIndex(item => item.itemId == itemId);
- if (cur < 0)
- {
- Statistic.Add(new ServerStatItem
- {
- itemId = itemId,
- totalUp = 0,
- totalDown = 0,
- todayUp = 0,
- todayDown = 0,
- dateNow = ticks
- });
- cur = Statistic.Count - 1;
- }
- if (Statistic[cur].dateNow != ticks)
- {
- Statistic[cur].todayUp = 0;
- Statistic[cur].todayDown = 0;
- Statistic[cur].dateNow = ticks;
- }
- return Statistic[cur];
+ SqliteHelper.Instance.Execute($"update ServerStatItem set todayUp = 0,todayDown=0,dateNow={ticks} where dateNow<>{ticks}");
}
- private void ParseOutput(Google.Protobuf.Collections.RepeatedField source, out ulong up, out ulong down)
+ private void GetServerStatItem(string indexId)
{
+ long ticks = DateTime.Now.Date.Ticks;
+ if (_serverStatItem != null && _serverStatItem.indexId != indexId)
+ {
+ _serverStatItem = null;
+ }
- up = 0; down = 0;
+ if (_serverStatItem == null)
+ {
+ _serverStatItem = SqliteHelper.Instance.Table().FirstOrDefault(t => t.indexId == indexId);
+ if (_serverStatItem == null)
+ {
+ _serverStatItem = new ServerStatItem
+ {
+ indexId = indexId,
+ totalUp = 0,
+ totalDown = 0,
+ todayUp = 0,
+ todayDown = 0,
+ dateNow = ticks
+ };
+ _ = SqliteHelper.Instance.Replacesync(_serverStatItem);
+ }
+ }
+
+ if (_serverStatItem.dateNow != ticks)
+ {
+ _serverStatItem.todayUp = 0;
+ _serverStatItem.todayDown = 0;
+ _serverStatItem.dateNow = ticks;
+ }
+ }
+
+ private void ParseOutput(Google.Protobuf.Collections.RepeatedField source, out ServerSpeedItem server)
+ {
+ server = new();
try
{
foreach (Stat stat in source)
{
string name = stat.Name;
- long value = stat.Value;
+ long value = stat.Value / 1024; //KByte
string[] nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
string type = "";
@@ -256,11 +178,22 @@ namespace v2rayN.Handler
{
if (type == "uplink")
{
- up = (ulong)value;
+ server.proxyUp = value;
}
else if (type == "downlink")
{
- down = (ulong)value;
+ server.proxyDown = value;
+ }
+ }
+ else if (name == Global.directTag)
+ {
+ if (type == "uplink")
+ {
+ server.directUp = value;
+ }
+ else if (type == "downlink")
+ {
+ server.directDown = value;
}
}
}
diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs
index 815580ae..c0dd4f8d 100644
--- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs
+++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs
@@ -1,9 +1,7 @@
-
-using System;
+using PacLib;
using System.Diagnostics;
using System.IO;
using System.Text;
-using System.Threading;
using v2rayN.Mode;
using v2rayN.Properties;
using v2rayN.Tool;
@@ -59,8 +57,9 @@ namespace v2rayN.Handler
try
{
- int port = config.GetLocalPort(Global.InboundHttp);
- int portSocks = config.GetLocalPort(Global.InboundSocks);
+ int port = LazyConfig.Instance.GetLocalPort(Global.InboundHttp);
+ int portSocks = LazyConfig.Instance.GetLocalPort(Global.InboundSocks);
+ int portPac = LazyConfig.Instance.GetLocalPort(ESysProxyType.Pac.ToString());
if (port <= 0)
{
return false;
@@ -90,6 +89,17 @@ namespace v2rayN.Handler
else if (type == ESysProxyType.Unchanged)
{
}
+ else if (type == ESysProxyType.Pac)
+ {
+ PacHandler.Start(Utils.GetConfigPath(), port, portPac);
+ var strProxy = $"{Global.httpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}";
+ SetIEProxy(false, strProxy, "");
+ }
+
+ if (type != ESysProxyType.Pac)
+ {
+ PacHandler.Stop();
+ }
}
catch (Exception ex)
{
diff --git a/v2rayN/v2rayN/Handler/TunHandler.cs b/v2rayN/v2rayN/Handler/TunHandler.cs
new file mode 100644
index 00000000..e64f0f0b
--- /dev/null
+++ b/v2rayN/v2rayN/Handler/TunHandler.cs
@@ -0,0 +1,249 @@
+using System.Diagnostics;
+using System.IO;
+using System.Reactive.Linq;
+using v2rayN.Handler;
+using v2rayN.Mode;
+
+namespace v2rayN.Base
+{
+ public sealed class TunHandler
+ {
+ private static readonly Lazy _instance = new Lazy(() => new());
+ public static TunHandler Instance => _instance.Value;
+ private string _tunConfigName = "tunConfig.json";
+ private static Config _config;
+ private CoreInfo coreInfo;
+ private Process _process;
+ private static int _socksPort;
+ private static bool _needRestart = true;
+ private static bool _isRunning = false;
+
+ public TunHandler()
+ {
+ _config = LazyConfig.Instance.GetConfig();
+
+ Observable.Interval(TimeSpan.FromSeconds(10))
+ .Subscribe(x =>
+ {
+ if (_isRunning && _config.tunModeItem.enableTun)
+ {
+ if (_process == null || _process.HasExited)
+ {
+ if (Init() == false)
+ {
+ return;
+ }
+ CoreStart();
+ Utils.SaveLog("Tun mode monitors restart");
+ }
+ }
+ });
+ }
+
+ public void Start()
+ {
+ var socksPort = LazyConfig.Instance.GetLocalPort(Global.InboundSocks);
+
+ if (socksPort.Equals(_socksPort)
+ && _process != null
+ && !_process.HasExited)
+ {
+ _needRestart = false;
+ }
+
+ _socksPort = socksPort;
+
+ if (_needRestart)
+ {
+ CoreStop();
+ if (Init() == false)
+ {
+ return;
+ }
+ CoreStart();
+ }
+ }
+
+ public void Stop()
+ {
+ CoreStop();
+ }
+
+ private bool Init()
+ {
+ coreInfo = LazyConfig.Instance.GetCoreInfo(ECoreType.sing_box);
+ string configStr = Utils.GetEmbedText(Global.TunSingboxFileName);
+ if (Utils.IsNullOrEmpty(configStr))
+ {
+ return false;
+ }
+
+ //settings
+ if (_config.tunModeItem.mtu <= 0)
+ {
+ _config.tunModeItem.mtu = Convert.ToInt32(Global.TunMtus[0]);
+ }
+ if (Utils.IsNullOrEmpty(_config.tunModeItem.stack))
+ {
+ _config.tunModeItem.stack = Global.TunStacks[0];
+ }
+ configStr = configStr.Replace("$mtu$", $"{_config.tunModeItem.mtu}");
+ configStr = configStr.Replace("$strict_route$", $"{_config.tunModeItem.strictRoute.ToString().ToLower()}");
+ configStr = configStr.Replace("$stack$", $"{_config.tunModeItem.stack}");
+
+
+ //port
+ configStr = configStr.Replace("$socksPort$", $"{_socksPort}");
+
+ //exe
+ List lstDnsExe = new List();
+ List lstDirectExe = new List();
+ var coreInfos = LazyConfig.Instance.GetCoreInfos();
+ foreach (var it in coreInfos)
+ {
+ if (it.coreType == ECoreType.v2rayN)
+ {
+ continue;
+ }
+ foreach (var it2 in it.coreExes)
+ {
+ if (!lstDnsExe.Contains(it2) && it.coreType != ECoreType.sing_box)
+ {
+ lstDnsExe.Add(it2);
+ lstDnsExe.Add($"{it2}.exe");
+ }
+
+ if (!lstDirectExe.Contains(it2))
+ {
+ lstDirectExe.Add(it2);
+ lstDirectExe.Add($"{it2}.exe");
+ }
+ }
+ }
+ string strDns = string.Join("\",\"", lstDnsExe.ToArray());
+ configStr = configStr.Replace("$dnsProcessName$", $"\"{strDns}\"");
+
+ string strDirect = string.Join("\",\"", lstDirectExe.ToArray());
+ configStr = configStr.Replace("$directProcessName$", $"\"{strDirect}\"");
+
+
+ //ips
+ if (_config.tunModeItem.directIP != null && _config.tunModeItem.directIP.Count > 0)
+ {
+ var ips = new { outbound = "direct", ip_cidr = _config.tunModeItem.directIP };
+ configStr = configStr.Replace("$ruleDirectIPs$", "," + Utils.ToJson(ips));
+ }
+ else
+ {
+ configStr = configStr.Replace("$ruleDirectIPs$", "");
+ }
+ //process
+ if (_config.tunModeItem.directProcess != null && _config.tunModeItem.directProcess.Count > 0)
+ {
+ var process = new { outbound = "direct", process_name = _config.tunModeItem.directProcess };
+ configStr = configStr.Replace("$ruleDirectProcess$", "," + Utils.ToJson(process));
+ }
+ else
+ {
+ configStr = configStr.Replace("$ruleDirectProcess$", "");
+ }
+
+ File.WriteAllText(Utils.GetConfigPath(_tunConfigName), configStr);
+
+ return true;
+ }
+
+ private void CoreStop()
+ {
+ try
+ {
+ _isRunning = false;
+ if (_process != null)
+ {
+ KillProcess(_process);
+ _process.Dispose();
+ _process = null;
+ }
+ }
+ catch (Exception ex)
+ {
+ Utils.SaveLog(ex.Message, ex);
+ }
+ }
+
+ private string CoreFindexe()
+ {
+ string fileName = string.Empty;
+ foreach (string name in coreInfo.coreExes)
+ {
+ string vName = $"{name}.exe";
+ vName = Utils.GetBinPath(vName, coreInfo.coreType);
+ if (File.Exists(vName))
+ {
+ fileName = vName;
+ break;
+ }
+ }
+ if (Utils.IsNullOrEmpty(fileName))
+ {
+
+ }
+ return fileName;
+ }
+
+ private void CoreStart()
+ {
+ try
+ {
+ string fileName = CoreFindexe();
+ if (fileName == "")
+ {
+ return;
+ }
+ Process p = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = fileName,
+ Arguments = $"run -c {Utils.GetConfigPath(_tunConfigName)}",
+ WorkingDirectory = Utils.GetConfigPath(),
+ UseShellExecute = _config.tunModeItem.showWindow,
+ CreateNoWindow = !_config.tunModeItem.showWindow,
+ Verb = "runas",
+ }
+ };
+ p.Start();
+ _process = p;
+ _isRunning = true;
+ if (p.WaitForExit(1000))
+ {
+ throw new Exception("start tun mode fail");
+ }
+
+ Global.processJob.AddProcess(p.Handle);
+ }
+ catch (Exception ex)
+ {
+ Utils.SaveLog(ex.Message, ex);
+ }
+ }
+
+ private void KillProcess(Process p)
+ {
+ try
+ {
+ p.CloseMainWindow();
+ p.WaitForExit(100);
+ if (!p.HasExited)
+ {
+ p.Kill();
+ p.WaitForExit(100);
+ }
+ }
+ catch (Exception ex)
+ {
+ Utils.SaveLog(ex.Message, ex);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs
index 3ba58386..34f24d67 100644
--- a/v2rayN/v2rayN/Handler/UpdateHandle.cs
+++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs
@@ -1,14 +1,9 @@
-using System;
-using System.Collections.Generic;
+using Splat;
using System.Diagnostics;
using System.IO;
-using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
-using System.Threading;
-using System.Threading.Tasks;
using System.Windows.Forms;
-using Newtonsoft.Json;
using v2rayN.Base;
using v2rayN.Mode;
using v2rayN.Resx;
@@ -53,7 +48,7 @@ namespace v2rayN.Handler
try
{
- string fileName = Utils.GetPath(Utils.GetDownloadFileName(url));
+ string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
fileName = Utils.UrlEncode(fileName);
Process process = new Process
{
@@ -96,6 +91,7 @@ namespace v2rayN.Handler
}
else
{
+ Locator.Current.GetService()?.Enqueue(args.Msg);
_updateFunc(false, args.Msg);
}
};
@@ -151,6 +147,7 @@ namespace v2rayN.Handler
}
else
{
+ Locator.Current.GetService()?.Enqueue(args.Msg);
_updateFunc(false, args.Msg);
}
};
@@ -159,14 +156,15 @@ namespace v2rayN.Handler
}
- public void UpdateSubscriptionProcess(Config config, string groupId, bool blProxy, Action update)
+ public void UpdateSubscriptionProcess(Config config, string subId, bool blProxy, Action update)
{
_config = config;
_updateFunc = update;
_updateFunc(false, ResUI.MsgUpdateSubscriptionStart);
+ var subItem = LazyConfig.Instance.SubItems();
- if (config.subItem == null || config.subItem.Count <= 0)
+ if (subItem == null || subItem.Count <= 0)
{
_updateFunc(false, ResUI.MsgNoValidSubscription);
return;
@@ -184,13 +182,13 @@ namespace v2rayN.Handler
Thread.Sleep(3000);
}
- foreach (var item in config.subItem)
+ foreach (var item in subItem)
{
if (item.enabled == false)
{
continue;
}
- if (!Utils.IsNullOrEmpty(groupId) && item.groupId != groupId)
+ if (!Utils.IsNullOrEmpty(subId) && item.id != subId)
{
continue;
}
@@ -198,7 +196,6 @@ namespace v2rayN.Handler
string id = item.id.TrimEx();
string url = item.url.TrimEx();
string userAgent = item.userAgent.TrimEx();
- //string groupId = item.groupId.TrimEx();
string hashCode = $"{item.remarks}->";
if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url))
{
@@ -212,7 +209,9 @@ namespace v2rayN.Handler
_updateFunc(false, $"{hashCode}{args.GetException().Message}");
};
+ //idn to idc
url = Utils.GetPunycode(url);
+
_updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}");
var result = await downloadHandle.DownloadStringAsync(url, blProxy, userAgent);
if (blProxy && Utils.IsNullOrEmpty(result))
@@ -232,7 +231,7 @@ namespace v2rayN.Handler
_updateFunc(false, $"{hashCode}{result}");
}
- int ret = ConfigHandler.AddBatchServers(ref config, result, id, item.groupId.TrimEx());
+ int ret = ConfigHandler.AddBatchServers(ref config, result, id, true);
_updateFunc(false,
ret > 0
? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}"
@@ -271,15 +270,14 @@ namespace v2rayN.Handler
try
{
- string fileName = Utils.GetPath(Utils.GetDownloadFileName(url));
+ string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
if (File.Exists(fileName))
{
- string targetPath = Utils.GetPath($"{geoName}.dat");
- if (File.Exists(targetPath))
+ Global.coreTypes.ForEach(it =>
{
- File.Delete(targetPath);
- }
- File.Move(fileName, targetPath);
+ string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it));
+ File.Copy(fileName, targetPath, true);
+ });
//_updateFunc(true, "");
}
}
@@ -352,7 +350,7 @@ namespace v2rayN.Handler
foreach (string name in coreInfo.coreExes)
{
string vName = $"{name}.exe";
- vName = Utils.GetPath(vName);
+ vName = Utils.GetBinPath(vName, coreInfo.coreType);
if (File.Exists(vName))
{
filePath = vName;
@@ -362,7 +360,7 @@ namespace v2rayN.Handler
if (!File.Exists(filePath))
{
- string msg = string.Format(ResUI.NotFoundCore, @"", "");
+ string msg = string.Format(ResUI.NotFoundCore, @"", "", "");
//ShowMsg(true, msg);
return "";
}
diff --git a/v2rayN/v2rayN/Mode/ComboItem.cs b/v2rayN/v2rayN/Mode/ComboItem.cs
index e69373ef..0a702fa3 100644
--- a/v2rayN/v2rayN/Mode/ComboItem.cs
+++ b/v2rayN/v2rayN/Mode/ComboItem.cs
@@ -1,8 +1,8 @@
namespace v2rayN.Mode
{
- class ComboItem
+ public class ComboItem
{
- public int ID
+ public string ID
{
get; set;
}
diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs
index 6349b123..61842446 100644
--- a/v2rayN/v2rayN/Mode/Config.cs
+++ b/v2rayN/v2rayN/Mode/Config.cs
@@ -1,11 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using v2rayN.Base;
-using System.Linq;
-using System.Drawing;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
///
/// 本软件配置文件实体类
@@ -111,10 +104,7 @@ namespace v2rayN.Mode
{
get; set;
}
- public int routingIndex
- {
- get; set;
- }
+ public string routingIndexId { get; set; }
public bool enableRoutingAdvanced
{
get; set;
@@ -147,672 +137,22 @@ namespace v2rayN.Mode
public int trayMenuServersLimit { get; set; }
+ public bool autoHideStartup { get; set; }
+
#endregion
#region other entities
- ///
- /// 本地监听
- ///
- public List inbound
- {
- get; set;
- }
-
- ///
- /// vmess服务器信息
- ///
- public List vmess
- {
- get; set;
- }
-
- ///
- /// KcpItem
- ///
- public KcpItem kcpItem
- {
- get; set;
- }
-
- ///
- /// 订阅
- ///
- public List subItem
- {
- get; set;
- }
- ///
- /// UI
- ///
- public UIItem uiItem
- {
- get; set;
- }
- public List routings
- {
- get; set;
- }
-
- public ConstItem constItem
- {
- get; set;
- }
-
- public List globalHotkeys
- {
- get; set;
- }
-
- public List groupItem
- {
- get; set;
- }
-
- public List coreTypeItem
- {
- get; set;
- }
+ public TunModeItem tunModeItem { get; set; }
+ public KcpItem kcpItem { get; set; }
+ public GrpcItem grpcItem { get; set; }
+ public UIItem uiItem { get; set; }
+ public ConstItem constItem { get; set; }
+ public List inbound { get; set; }
+ public List globalHotkeys { get; set; }
+ public List coreTypeItem { get; set; }
#endregion
- #region function
-
- public int GetLocalPort(string protocol)
- {
- int localPort = inbound.FirstOrDefault(t => t.protocol == Global.InboundSocks).localPort;
-
- if (protocol == Global.InboundSocks)
- {
- return localPort;
- }
- else if (protocol == Global.InboundHttp)
- {
- return localPort + 1;
- }
- else if (protocol == Global.InboundSocks2)
- {
- return localPort + 2;
- }
- else if (protocol == Global.InboundHttp2)
- {
- return localPort + 3;
- }
- else if (protocol == "speedtest")
- {
- return localPort + 103;
- }
- return localPort;
- }
-
- public int FindIndexId(string id)
- {
- if (string.IsNullOrEmpty(id))
- {
- return -1;
- }
- return vmess.FindIndex(it => it.indexId == id);
- }
-
- public VmessItem GetVmessItem(string id)
- {
- if (string.IsNullOrEmpty(id))
- {
- return null;
- }
- return vmess.FirstOrDefault(it => it.indexId == id);
- }
-
- public bool IsActiveNode(VmessItem item)
- {
- if (!Utils.IsNullOrEmpty(item.indexId) && item.indexId == indexId)
- {
- return true;
- }
-
- return false;
- }
-
- public string GetGroupRemarks(string groupId)
- {
- if (string.IsNullOrEmpty(groupId))
- {
- return string.Empty;
- }
- return groupItem.Where(it => it.id == groupId).FirstOrDefault()?.remarks;
- }
-
- #endregion
-
- }
-
- [Serializable]
- public class VmessItem
- {
- public VmessItem()
- {
- indexId = string.Empty;
- configType = EConfigType.VMess;
- configVersion = 2;
- sort = 0;
- address = string.Empty;
- port = 0;
- id = string.Empty;
- alterId = 0;
- security = string.Empty;
- network = string.Empty;
- remarks = string.Empty;
- headerType = string.Empty;
- requestHost = string.Empty;
- path = string.Empty;
- streamSecurity = string.Empty;
- allowInsecure = string.Empty;
- testResult = string.Empty;
- subid = string.Empty;
- flow = string.Empty;
- groupId = string.Empty;
- }
-
- #region function
- public string GetSummary()
- {
- string summary = string.Format("[{0}] ", (configType).ToString());
- string[] arrAddr = address.Split('.');
- string addr;
- if (arrAddr.Length > 2)
- {
- addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}";
- }
- else if (arrAddr.Length > 1)
- {
- addr = $"***{arrAddr[arrAddr.Length - 1]}";
- }
- else
- {
- addr = address;
- }
- switch (configType)
- {
- case EConfigType.VMess:
- case EConfigType.Shadowsocks:
- case EConfigType.Socks:
- case EConfigType.VLESS:
- case EConfigType.Trojan:
- summary += string.Format("{0}({1}:{2})", remarks, addr, port);
- break;
- default:
- summary += string.Format("{0}", remarks);
- break;
- }
- return summary;
- }
- public string GetSubRemarks(Config config)
- {
- string subRemarks = string.Empty;
- if (Utils.IsNullOrEmpty(subid))
- {
- return subRemarks;
- }
- if (subid.Length <= 4)
- {
- return subid;
- }
- var sub = config.subItem.FirstOrDefault(t => t.id == subid);
- if (sub != null)
- {
- return sub.remarks;
- }
- return subid.Substring(0, 4);
- }
- public string GetGroupRemarks(Config config)
- {
- string subRemarks = string.Empty;
- if (Utils.IsNullOrEmpty(groupId))
- {
- return subRemarks;
- }
- var group = config.groupItem.FirstOrDefault(t => t.id == groupId);
- if (group != null)
- {
- return group.remarks;
- }
- return groupId.Substring(0, 4);
- }
-
- public List GetAlpn()
- {
- if (alpn != null && alpn.Count > 0)
- {
- return alpn;
- }
- else
- {
- return null;
- }
- }
- public string GetNetwork()
- {
- if (Utils.IsNullOrEmpty(network) || !Global.networks.Contains(network))
- {
- return Global.DefaultNetwork;
- }
- return network.TrimEx();
- }
-
- public void SetTestResult(string value)
- {
- testResult = value;
- }
- #endregion
-
- public string indexId
- {
- get; set;
- }
-
- ///
- /// config type(1=normal,2=custom)
- ///
- public EConfigType configType
- {
- get; set;
- }
-
- ///
- /// 版本(现在=2)
- ///
- public int configVersion
- {
- get; set;
- }
-
- public int sort
- {
- get; set;
- }
-
- ///
- /// 远程服务器地址
- ///
- public string address
- {
- get; set;
- }
- ///
- /// 远程服务器端口
- ///
- public int port
- {
- get; set;
- }
- ///
- /// 远程服务器ID
- ///
- public string id
- {
- get; set;
- }
- ///
- /// 远程服务器额外ID
- ///
- public int alterId
- {
- get; set;
- }
- ///
- /// 本地安全策略
- ///
- public string security
- {
- get; set;
- }
- ///
- /// tcp,kcp,ws,h2,quic
- ///
- public string network
- {
- get; set;
- }
- ///
- /// 备注或别名
- ///
- public string remarks
- {
- get; set;
- }
-
- ///
- /// 伪装类型
- ///
- public string headerType
- {
- get; set;
- }
-
- ///
- /// 伪装的域名
- ///
- public string requestHost
- {
- get; set;
- }
-
- ///
- /// ws h2 path
- ///
- public string path
- {
- get; set;
- }
-
- ///
- /// 传输层安全
- ///
- public string streamSecurity
- {
- get; set;
- }
-
- ///
- /// 是否允许不安全连接(用于客户端)
- ///
- public string allowInsecure
- {
- get; set;
- }
-
- ///
- ///
- ///
- public string testResult
- {
- get; set;
- }
-
- ///
- /// SubItem id
- ///
- public string subid
- {
- get; set;
- }
-
- ///
- /// VLESS flow
- ///
- public string flow
- {
- get; set;
- }
- ///
- /// tls sni
- ///
- public string sni
- {
- get; set;
- }
- ///
- /// tls alpn
- ///
- public List alpn
- {
- get; set;
- }
-
- public string groupId
- {
- get; set;
- } = string.Empty;
-
- public ECoreType? coreType
- {
- get; set;
- }
-
- public int preSocksPort
- {
- get; set;
- }
-
- public string fingerprint { get; set; }
- }
-
- [Serializable]
- public class InItem
- {
- ///
- /// 本地监听端口
- ///
- public int localPort
- {
- get; set;
- }
-
- ///
- /// 协议,默认为socks
- ///
- public string protocol
- {
- get; set;
- }
-
- ///
- /// 允许udp
- ///
- public bool udpEnabled
- {
- get; set;
- }
-
- ///
- /// 开启流量探测
- ///
- public bool sniffingEnabled { get; set; } = true;
-
- public bool allowLANConn { get; set; }
-
- public string user { get; set; }
-
- public string pass { get; set; }
-
- }
-
- [Serializable]
- public class KcpItem
- {
- ///
- ///
- ///
- public int mtu
- {
- get; set;
- }
- ///
- ///
- ///
- public int tti
- {
- get; set;
- }
- ///
- ///
- ///
- public int uplinkCapacity
- {
- get; set;
- }
- ///
- ///
- ///
- public int downlinkCapacity
- {
- get; set;
- }
- ///
- ///
- ///
- public bool congestion
- {
- get; set;
- }
- ///
- ///
- ///
- public int readBufferSize
- {
- get; set;
- }
- ///
- ///
- ///
- public int writeBufferSize
- {
- get; set;
- }
- }
-
-
- [Serializable]
- public class SubItem
- {
- ///
- ///
- ///
- public string id
- {
- get; set;
- }
-
- ///
- /// 备注
- ///
- public string remarks
- {
- get; set;
- }
-
- ///
- /// url
- ///
- public string url
- {
- get; set;
- }
-
- ///
- /// enable
- ///
- public bool enabled { get; set; } = true;
-
- ///
- ///
- ///
- public string userAgent
- {
- get; set;
- } = string.Empty;
-
- public string groupId
- {
- get; set;
- } = string.Empty;
- }
-
- [Serializable]
- public class UIItem
- {
- public bool enableAutoAdjustMainLvColWidth
- {
- get; set;
- }
-
- public Point mainLocation { get; set; }
-
- public Size mainSize
- {
- get; set;
- }
-
- public Dictionary mainLvColWidth
- {
- get; set;
- }
- }
-
- [Serializable]
- public class ConstItem
- {
- ///
- /// 自定义服务器下载测速url
- ///
- public string speedTestUrl
- {
- get; set;
- }
- ///
- /// 自定义“服务器真连接延迟”测试url
- ///
- public string speedPingTestUrl
- {
- get; set;
- }
- public string defIEProxyExceptions
- {
- get; set;
- }
- }
-
- [Serializable]
- public class KeyEventItem
- {
- public EGlobalHotkey eGlobalHotkey { get; set; }
-
- public bool Alt { get; set; }
-
- public bool Control { get; set; }
-
- public bool Shift { get; set; }
-
- public Keys? KeyCode { get; set; }
-
- }
-
- [Serializable]
- public class GroupItem
- {
- ///
- ///
- ///
- public string id
- {
- get; set;
- }
-
- ///
- ///
- ///
- public string remarks
- {
- get; set;
- }
- public int sort
- {
- get; set;
- }
- }
-
-
- [Serializable]
- public class CoreTypeItem
- {
- public EConfigType configType
- {
- get; set;
- }
-
- public ECoreType coreType
- {
- get; set;
- }
}
}
diff --git a/v2rayN/v2rayN/Mode/ConfigItems.cs b/v2rayN/v2rayN/Mode/ConfigItems.cs
new file mode 100644
index 00000000..35da19c2
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/ConfigItems.cs
@@ -0,0 +1,109 @@
+using System.Windows.Forms;
+
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class InItem
+ {
+ public int localPort { get; set; }
+
+ public string protocol { get; set; }
+
+ public bool udpEnabled { get; set; }
+
+ public bool sniffingEnabled { get; set; } = true;
+ public bool routeOnly { get; set; }
+
+ public bool allowLANConn { get; set; }
+
+ public bool newPort4LAN { get; set; }
+
+ public string user { get; set; }
+
+ public string pass { get; set; }
+
+ }
+
+ [Serializable]
+ public class KcpItem
+ {
+ public int mtu { get; set; }
+
+ public int tti { get; set; }
+
+ public int uplinkCapacity { get; set; }
+
+ public int downlinkCapacity { get; set; }
+
+ public bool congestion { get; set; }
+
+ public int readBufferSize { get; set; }
+
+ public int writeBufferSize { get; set; }
+ }
+
+ [Serializable]
+ public class GrpcItem
+ {
+ public int idle_timeout { get; set; }
+ public int health_check_timeout { get; set; }
+ public bool permit_without_stream { get; set; }
+ public int initial_windows_size { get; set; }
+ }
+
+ [Serializable]
+ public class UIItem
+ {
+ public bool enableAutoAdjustMainLvColWidth { get; set; }
+ public double mainWidth { get; set; }
+ public double mainHeight { get; set; }
+ public bool colorModeDark { get; set; }
+ public string? colorPrimaryName { get; set; }
+ public string currentLanguage { get; set; }
+ public Dictionary mainLvColWidth { get; set; }
+ }
+
+ [Serializable]
+ public class ConstItem
+ {
+ public string speedTestUrl { get; set; }
+ public string speedPingTestUrl { get; set; }
+ public string defIEProxyExceptions { get; set; }
+ }
+
+ [Serializable]
+ public class KeyEventItem
+ {
+ public EGlobalHotkey eGlobalHotkey { get; set; }
+
+ public bool Alt { get; set; }
+
+ public bool Control { get; set; }
+
+ public bool Shift { get; set; }
+
+ public Keys? KeyCode { get; set; }
+
+ }
+
+ [Serializable]
+ public class CoreTypeItem
+ {
+ public EConfigType configType { get; set; }
+
+ public ECoreType coreType { get; set; }
+ }
+
+ [Serializable]
+ public class TunModeItem
+ {
+ public bool enableTun { get; set; }
+ public bool showWindow { get; set; }
+ public bool strictRoute { get; set; }
+ public string stack { get; set; }
+ public int mtu { get; set; }
+ public List directIP { get; set; }
+ public List directProcess { get; set; }
+
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/ConfigOld.cs b/v2rayN/v2rayN/Mode/ConfigOld.cs
new file mode 100644
index 00000000..a0917033
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/ConfigOld.cs
@@ -0,0 +1,426 @@
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class ConfigOld
+ {
+ #region property
+
+ ///
+ /// 允许日志
+ ///
+ public bool logEnabled
+ {
+ get; set;
+ }
+
+ ///
+ /// 日志等级
+ ///
+ public string loglevel
+ {
+ get; set;
+ }
+
+ public string indexId
+ {
+ get; set;
+ }
+
+ ///
+ /// 允许Mux多路复用
+ ///
+ public bool muxEnabled
+ {
+ get; set;
+ }
+
+ ///
+ ///
+ ///
+ public ESysProxyType sysProxyType
+ {
+ get; set;
+ }
+
+ ///
+ /// 启用实时网速和流量统计
+ ///
+ public bool enableStatistics
+ {
+ get; set;
+ }
+
+ ///
+ /// 去重时优先保留较旧(顶部)节点
+ ///
+ public bool keepOlderDedupl
+ {
+ get; set;
+ }
+
+ ///
+ /// 视图刷新率
+ ///
+ public int statisticsFreshRate
+ {
+ get; set;
+ }
+
+ ///
+ /// 自定义远程DNS
+ ///
+ public string remoteDNS
+ {
+ get; set;
+ }
+
+ ///
+ /// Outbound Freedom domainStrategy
+ ///
+ public string domainStrategy4Freedom
+ {
+ get; set;
+ }
+
+ ///
+ /// 是否允许不安全连接
+ ///
+ public bool defAllowInsecure
+ {
+ get; set;
+ }
+
+ ///
+ /// 域名解析策略
+ ///
+ public string domainStrategy
+ {
+ get; set;
+ }
+ public string domainMatcher
+ {
+ get; set;
+ }
+ public int routingIndex
+ {
+ get; set;
+ }
+ public bool enableRoutingAdvanced
+ {
+ get; set;
+ }
+
+ public bool ignoreGeoUpdateCore
+ {
+ get; set;
+ }
+
+ ///
+ /// systemProxyExceptions
+ ///
+ public string systemProxyExceptions
+ {
+ get; set;
+ }
+ public string systemProxyAdvancedProtocol { get; set; }
+
+ public int autoUpdateInterval { get; set; } = 0;
+
+ public int autoUpdateSubInterval { get; set; } = 0;
+
+ public bool checkPreReleaseUpdate { get; set; } = false;
+
+ public bool enableSecurityProtocolTls13
+ {
+ get; set;
+ }
+
+ public int trayMenuServersLimit { get; set; }
+
+ #endregion
+
+ #region other entities
+
+ ///
+ /// 本地监听
+ ///
+ public List inbound
+ {
+ get; set;
+ }
+
+ ///
+ /// vmess服务器信息
+ ///
+ public List vmess
+ {
+ get; set;
+ }
+
+ ///
+ /// KcpItem
+ ///
+ public KcpItem kcpItem
+ {
+ get; set;
+ }
+
+ ///
+ /// 订阅
+ ///
+ public List subItem
+ {
+ get; set;
+ }
+ ///
+ /// UI
+ ///
+ public UIItem uiItem
+ {
+ get; set;
+ }
+ public List routings
+ {
+ get; set;
+ }
+
+ public ConstItem constItem
+ {
+ get; set;
+ }
+
+ public List globalHotkeys
+ {
+ get; set;
+ }
+
+
+ public List coreTypeItem
+ {
+ get; set;
+ }
+
+ #endregion
+
+ }
+
+ [Serializable]
+ public class VmessItem
+ {
+ public VmessItem()
+ {
+ indexId = string.Empty;
+ configType = EConfigType.VMess;
+ configVersion = 2;
+ sort = 0;
+ address = string.Empty;
+ port = 0;
+ id = string.Empty;
+ alterId = 0;
+ security = string.Empty;
+ network = string.Empty;
+ remarks = string.Empty;
+ headerType = string.Empty;
+ requestHost = string.Empty;
+ path = string.Empty;
+ streamSecurity = string.Empty;
+ allowInsecure = string.Empty;
+ testResult = string.Empty;
+ subid = string.Empty;
+ flow = string.Empty;
+ groupId = string.Empty;
+ }
+
+
+ public string indexId
+ {
+ get; set;
+ }
+
+ ///
+ /// config type(1=normal,2=custom)
+ ///
+ public EConfigType configType
+ {
+ get; set;
+ }
+
+ ///
+ /// 版本(现在=2)
+ ///
+ public int configVersion
+ {
+ get; set;
+ }
+
+ public int sort
+ {
+ get; set;
+ }
+
+ ///
+ /// 远程服务器地址
+ ///
+ public string address
+ {
+ get; set;
+ }
+ ///
+ /// 远程服务器端口
+ ///
+ public int port
+ {
+ get; set;
+ }
+ ///
+ /// 远程服务器ID
+ ///
+ public string id
+ {
+ get; set;
+ }
+ ///
+ /// 远程服务器额外ID
+ ///
+ public int alterId
+ {
+ get; set;
+ }
+ ///
+ /// 本地安全策略
+ ///
+ public string security
+ {
+ get; set;
+ }
+ ///
+ /// tcp,kcp,ws,h2,quic
+ ///
+ public string network
+ {
+ get; set;
+ }
+ ///
+ /// 备注或别名
+ ///
+ public string remarks
+ {
+ get; set;
+ }
+
+ ///
+ /// 伪装类型
+ ///
+ public string headerType
+ {
+ get; set;
+ }
+
+ ///
+ /// 伪装的域名
+ ///
+ public string requestHost
+ {
+ get; set;
+ }
+
+ ///
+ /// ws h2 path
+ ///
+ public string path
+ {
+ get; set;
+ }
+
+ ///
+ /// 传输层安全
+ ///
+ public string streamSecurity
+ {
+ get; set;
+ }
+
+ ///
+ /// 是否允许不安全连接(用于客户端)
+ ///
+ public string allowInsecure
+ {
+ get; set;
+ }
+
+ ///
+ ///
+ ///
+ public string testResult
+ {
+ get; set;
+ }
+
+ ///
+ /// SubItem id
+ ///
+ public string subid
+ {
+ get; set;
+ }
+
+ ///
+ /// VLESS flow
+ ///
+ public string flow
+ {
+ get; set;
+ }
+ ///
+ /// tls sni
+ ///
+ public string sni
+ {
+ get; set;
+ }
+
+ public string groupId
+ {
+ get; set;
+ } = string.Empty;
+
+ public ECoreType? coreType
+ {
+ get; set;
+ }
+
+ public int preSocksPort
+ {
+ get; set;
+ }
+
+ public string fingerprint { get; set; }
+ }
+
+ [Serializable]
+ public class RoutingItemOld
+ {
+ public string remarks
+ {
+ get; set;
+ }
+ public string url
+ {
+ get; set;
+ }
+ public List rules
+ {
+ get; set;
+ }
+ public bool enabled { get; set; } = true;
+
+ public bool locked
+ {
+ get; set;
+ }
+ public string customIcon
+ {
+ get; set;
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/CoreInfo.cs b/v2rayN/v2rayN/Mode/CoreInfo.cs
index 784ca607..e7bbd95b 100644
--- a/v2rayN/v2rayN/Mode/CoreInfo.cs
+++ b/v2rayN/v2rayN/Mode/CoreInfo.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
[Serializable]
public class CoreInfo
diff --git a/v2rayN/v2rayN/Mode/EGlobalHotkey.cs b/v2rayN/v2rayN/Mode/EGlobalHotkey.cs
index de7cd336..0954912e 100644
--- a/v2rayN/v2rayN/Mode/EGlobalHotkey.cs
+++ b/v2rayN/v2rayN/Mode/EGlobalHotkey.cs
@@ -7,5 +7,6 @@ namespace v2rayN.Mode
SystemProxyClear = 1,
SystemProxySet = 2,
SystemProxyUnchanged = 3,
+ SystemProxyPac = 4,
}
}
diff --git a/v2rayN/v2rayN/Mode/EServerColName.cs b/v2rayN/v2rayN/Mode/EServerColName.cs
index 554a520e..7a14feaf 100644
--- a/v2rayN/v2rayN/Mode/EServerColName.cs
+++ b/v2rayN/v2rayN/Mode/EServerColName.cs
@@ -12,7 +12,8 @@ namespace v2rayN.Mode
network,
streamSecurity,
subRemarks,
- testResult,
+ delay,
+ speed,
todayDown,
todayUp,
diff --git a/v2rayN/v2rayN/Mode/ESpeedActionType.cs b/v2rayN/v2rayN/Mode/ESpeedActionType.cs
index 3e9bc3b6..49d113ae 100644
--- a/v2rayN/v2rayN/Mode/ESpeedActionType.cs
+++ b/v2rayN/v2rayN/Mode/ESpeedActionType.cs
@@ -6,6 +6,7 @@ namespace v2rayN.Mode
Ping,
Tcping,
Realping,
- Speedtest
+ Speedtest,
+ Mixedtest
}
}
diff --git a/v2rayN/v2rayN/Mode/ESysProxyType.cs b/v2rayN/v2rayN/Mode/ESysProxyType.cs
index 7e33357e..89871a40 100644
--- a/v2rayN/v2rayN/Mode/ESysProxyType.cs
+++ b/v2rayN/v2rayN/Mode/ESysProxyType.cs
@@ -5,6 +5,7 @@ namespace v2rayN.Mode
{
ForcedClear = 0,
ForcedChange = 1,
- Unchanged = 2
+ Unchanged = 2,
+ Pac = 3
}
}
diff --git a/v2rayN/v2rayN/Mode/GitHubRelease.cs b/v2rayN/v2rayN/Mode/GitHubRelease.cs
index eaa374c6..e509b10f 100644
--- a/v2rayN/v2rayN/Mode/GitHubRelease.cs
+++ b/v2rayN/v2rayN/Mode/GitHubRelease.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using Newtonsoft.Json;
+using Newtonsoft.Json;
namespace v2rayN.Mode
{
diff --git a/v2rayN/v2rayN/Mode/ProfileItem.cs b/v2rayN/v2rayN/Mode/ProfileItem.cs
new file mode 100644
index 00000000..00ce76c1
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/ProfileItem.cs
@@ -0,0 +1,251 @@
+using SQLite;
+using v2rayN.Base;
+
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class ProfileItem
+ {
+ public ProfileItem()
+ {
+ indexId = string.Empty;
+ configType = EConfigType.VMess;
+ configVersion = 2;
+ sort = 0;
+ address = string.Empty;
+ port = 0;
+ id = string.Empty;
+ alterId = 0;
+ security = string.Empty;
+ network = string.Empty;
+ remarks = string.Empty;
+ headerType = string.Empty;
+ requestHost = string.Empty;
+ path = string.Empty;
+ streamSecurity = string.Empty;
+ allowInsecure = string.Empty;
+ subid = string.Empty;
+ flow = string.Empty;
+ }
+
+ #region function
+ public string GetSummary()
+ {
+ string summary = string.Format("[{0}] ", (configType).ToString());
+ string[] arrAddr = address.Split('.');
+ string addr;
+ if (arrAddr.Length > 2)
+ {
+ addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}";
+ }
+ else if (arrAddr.Length > 1)
+ {
+ addr = $"***{arrAddr[arrAddr.Length - 1]}";
+ }
+ else
+ {
+ addr = address;
+ }
+ switch (configType)
+ {
+ case EConfigType.VMess:
+ case EConfigType.Shadowsocks:
+ case EConfigType.Socks:
+ case EConfigType.VLESS:
+ case EConfigType.Trojan:
+ summary += string.Format("{0}({1}:{2})", remarks, addr, port);
+ break;
+ default:
+ summary += string.Format("{0}", remarks);
+ break;
+ }
+ return summary;
+ }
+
+ public List GetAlpn()
+ {
+ if (Utils.IsNullOrEmpty(alpn))
+ {
+ return null;
+ }
+ else
+ {
+ return Utils.String2List(alpn);
+ }
+ }
+
+ public string GetNetwork()
+ {
+ if (Utils.IsNullOrEmpty(network) || !Global.networks.Contains(network))
+ {
+ return Global.DefaultNetwork;
+ }
+ return network.TrimEx();
+ }
+
+ #endregion
+
+ [PrimaryKey]
+ public string indexId
+ {
+ get; set;
+ }
+
+ ///
+ /// config type(1=normal,2=custom)
+ ///
+ public EConfigType configType
+ {
+ get; set;
+ }
+
+ ///
+ /// 版本(现在=2)
+ ///
+ public int configVersion
+ {
+ get; set;
+ }
+
+ public int sort
+ {
+ get; set;
+ }
+
+ ///
+ /// 远程服务器地址
+ ///
+ public string address
+ {
+ get; set;
+ }
+ ///
+ /// 远程服务器端口
+ ///
+ public int port
+ {
+ get; set;
+ }
+ ///
+ /// 远程服务器ID
+ ///
+ public string id
+ {
+ get; set;
+ }
+ ///
+ /// 远程服务器额外ID
+ ///
+ public int alterId
+ {
+ get; set;
+ }
+ ///
+ /// 本地安全策略
+ ///
+ public string security
+ {
+ get; set;
+ }
+ ///
+ /// tcp,kcp,ws,h2,quic
+ ///
+ public string network
+ {
+ get; set;
+ }
+ ///
+ /// 备注或别名
+ ///
+ public string remarks
+ {
+ get; set;
+ }
+
+ ///
+ /// 伪装类型
+ ///
+ public string headerType
+ {
+ get; set;
+ }
+
+ ///
+ /// 伪装的域名
+ ///
+ public string requestHost
+ {
+ get; set;
+ }
+
+ ///
+ /// ws h2 path
+ ///
+ public string path
+ {
+ get; set;
+ }
+
+ ///
+ /// 传输层安全
+ ///
+ public string streamSecurity
+ {
+ get; set;
+ }
+
+ ///
+ /// 是否允许不安全连接(用于客户端)
+ ///
+ public string allowInsecure
+ {
+ get; set;
+ }
+
+ public int delay { get; set; }
+ public decimal speed { get; set; }
+
+ ///
+ /// SubItem id
+ ///
+ public string subid
+ {
+ get; set;
+ }
+ public bool isSub { get; set; } = true;
+
+ ///
+ /// VLESS flow
+ ///
+ public string flow
+ {
+ get; set;
+ }
+ ///
+ /// tls sni
+ ///
+ public string sni
+ {
+ get; set;
+ }
+ ///
+ /// tls alpn
+ ///
+ public string alpn { get; set; } = string.Empty;
+
+
+ public ECoreType? coreType
+ {
+ get; set;
+ }
+
+ public int preSocksPort
+ {
+ get; set;
+ }
+
+ public string fingerprint { get; set; }
+
+ public bool displayLog { get; set; } = true;
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/ProfileItemModel.cs b/v2rayN/v2rayN/Mode/ProfileItemModel.cs
new file mode 100644
index 00000000..096bb71c
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/ProfileItemModel.cs
@@ -0,0 +1,16 @@
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class ProfileItemModel : ProfileItem
+ {
+ public bool isActive { get; set; }
+ public string subRemarks { get; set; }
+ public string delayVal { get; set; }
+ public string speedVal { get; set; }
+ public string todayUp { get; set; }
+ public string todayDown { get; set; }
+ public string totalUp { get; set; }
+ public string totalDown { get; set; }
+
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/RoutingItem.cs b/v2rayN/v2rayN/Mode/RoutingItem.cs
index 02a93edf..8aae1ac4 100644
--- a/v2rayN/v2rayN/Mode/RoutingItem.cs
+++ b/v2rayN/v2rayN/Mode/RoutingItem.cs
@@ -1,35 +1,20 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using SQLite;
namespace v2rayN.Mode
{
[Serializable]
public class RoutingItem
{
- public string remarks
- {
- get; set;
- }
- public string url
- {
- get; set;
- }
- public List rules
- {
- get; set;
- }
+ [PrimaryKey]
+ public string id { get; set; }
+ public string remarks { get; set; }
+ public string url { get; set; }
+ public string ruleSet { get; set; }
+ public int ruleNum { get; set; }
public bool enabled { get; set; } = true;
+ public bool locked { get; set; }
+ public string customIcon { get; set; }
+ public string domainStrategy { get; set; }
- public bool locked
- {
- get; set;
- }
- public string customIcon
- {
- get; set;
- }
}
}
diff --git a/v2rayN/v2rayN/Mode/RoutingItemModel.cs b/v2rayN/v2rayN/Mode/RoutingItemModel.cs
new file mode 100644
index 00000000..d0b69abe
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/RoutingItemModel.cs
@@ -0,0 +1,9 @@
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class RoutingItemModel : RoutingItem
+ {
+ public bool isActive { get; set; }
+
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/RulesItem.cs b/v2rayN/v2rayN/Mode/RulesItem.cs
index 823e970b..8d62d9d3 100644
--- a/v2rayN/v2rayN/Mode/RulesItem.cs
+++ b/v2rayN/v2rayN/Mode/RulesItem.cs
@@ -1,23 +1,21 @@
-using System;
-using System.Collections.Generic;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
[Serializable]
public class RulesItem
{
+ public string id { get; set; }
public string type { get; set; }
-
+
public string port { get; set; }
public List inboundTag { get; set; }
-
+
public string outboundTag { get; set; }
-
+
public List ip { get; set; }
-
+
public List domain { get; set; }
-
+
public List protocol { get; set; }
public bool enabled { get; set; } = true;
diff --git a/v2rayN/v2rayN/Mode/RulesItemModel.cs b/v2rayN/v2rayN/Mode/RulesItemModel.cs
new file mode 100644
index 00000000..4f61dd7f
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/RulesItemModel.cs
@@ -0,0 +1,15 @@
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class RulesItemModel : RulesItem
+ {
+ public string inboundTags { get; set; }
+
+ public string ips { get; set; }
+
+ public string domains { get; set; }
+
+ public string protocols { get; set; }
+
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/ServerSpeedItem.cs b/v2rayN/v2rayN/Mode/ServerSpeedItem.cs
new file mode 100644
index 00000000..6546d772
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/ServerSpeedItem.cs
@@ -0,0 +1,27 @@
+namespace v2rayN.Mode
+{
+ [Serializable]
+ class ServerSpeedItem
+ {
+ public string indexId
+ {
+ get; set;
+ }
+ public long proxyUp
+ {
+ get; set;
+ }
+ public long proxyDown
+ {
+ get; set;
+ }
+ public long directUp
+ {
+ get; set;
+ }
+ public long directDown
+ {
+ get; set;
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/ServerStatistics.cs b/v2rayN/v2rayN/Mode/ServerStatItem.cs
similarity index 51%
rename from v2rayN/v2rayN/Mode/ServerStatistics.cs
rename to v2rayN/v2rayN/Mode/ServerStatItem.cs
index e4a42a5a..b5ff9630 100644
--- a/v2rayN/v2rayN/Mode/ServerStatistics.cs
+++ b/v2rayN/v2rayN/Mode/ServerStatItem.cs
@@ -1,37 +1,28 @@
-using System;
-using System.Collections.Generic;
+using SQLite;
namespace v2rayN.Mode
{
- [Serializable]
- public class ServerStatistics
- {
- public List server
- {
- get; set;
- }
- }
-
[Serializable]
public class ServerStatItem
{
- public string itemId
+ [PrimaryKey]
+ public string indexId
{
get; set;
}
- public ulong totalUp
+ public long totalUp
{
get; set;
}
- public ulong totalDown
+ public long totalDown
{
get; set;
}
- public ulong todayUp
+ public long todayUp
{
get; set;
}
- public ulong todayDown
+ public long todayDown
{
get; set;
}
diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs
index 45d6b5f9..732e8de1 100644
--- a/v2rayN/v2rayN/Mode/ServerTestItem.cs
+++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
[Serializable]
class ServerTestItem
diff --git a/v2rayN/v2rayN/Mode/SsSIP008.cs b/v2rayN/v2rayN/Mode/SsSIP008.cs
index 6b3bbc24..338c0cd3 100644
--- a/v2rayN/v2rayN/Mode/SsSIP008.cs
+++ b/v2rayN/v2rayN/Mode/SsSIP008.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
public class SsSIP008
{
diff --git a/v2rayN/v2rayN/Mode/SubItem.cs b/v2rayN/v2rayN/Mode/SubItem.cs
new file mode 100644
index 00000000..3caa262c
--- /dev/null
+++ b/v2rayN/v2rayN/Mode/SubItem.cs
@@ -0,0 +1,51 @@
+using SQLite;
+
+namespace v2rayN.Mode
+{
+ [Serializable]
+ public class SubItem
+ {
+ [PrimaryKey]
+ public string id
+ {
+ get; set;
+ }
+
+ ///
+ /// 备注
+ ///
+ public string remarks
+ {
+ get; set;
+ }
+
+ ///
+ /// url
+ ///
+ public string url
+ {
+ get; set;
+ }
+
+ ///
+ /// enable
+ ///
+ public bool enabled { get; set; } = true;
+
+ ///
+ ///
+ ///
+ public string userAgent
+ {
+ get; set;
+ } = string.Empty;
+
+
+ public int sort
+ {
+ get; set;
+ }
+ public string filter { get; set; }
+
+ }
+}
diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs
index d843dfe7..e0247c7e 100644
--- a/v2rayN/v2rayN/Mode/V2rayConfig.cs
+++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs
@@ -1,6 +1,4 @@
-using System.Collections.Generic;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
///
/// v2ray配置文件实体类
@@ -175,14 +173,9 @@ namespace v2rayN.Mode
}
public class Sniffing
{
- ///
- ///
- ///
public bool enabled { get; set; }
- ///
- ///
- ///
public List destOverride { get; set; }
+ public bool routeOnly { get; set; }
}
public class Outbounds
@@ -547,14 +540,12 @@ namespace v2rayN.Mode
public class GrpcSettings
{
- ///
- ///
- ///
public string serviceName { get; set; }
- ///
- ///
- ///
public bool multiMode { get; set; }
+ public int idle_timeout { get; set; }
+ public int health_check_timeout { get; set; }
+ public bool permit_without_stream { get; set; }
+ public int initial_windows_size { get; set; }
}
public class AccountsItem
diff --git a/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs b/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs
index 4a4e863d..23337f40 100644
--- a/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs
+++ b/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs
@@ -1,6 +1,4 @@
-using System.Collections.Generic;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
///
/// Tcp伪装http的Request,只要Host
diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs
index c4db42b4..5e42ca68 100644
--- a/v2rayN/v2rayN/Mode/VmessQRCode.cs
+++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace v2rayN.Mode
+namespace v2rayN.Mode
{
///
/// https://github.com/2dust/v2rayN/wiki/
diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs
deleted file mode 100644
index a8154406..00000000
--- a/v2rayN/v2rayN/Program.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-using System;
-using System.Threading;
-using System.Windows.Forms;
-using v2rayN.Forms;
-using v2rayN.Tool;
-
-namespace v2rayN
-{
- static class Program
- {
- ///
- /// 应用程序的主入口点。
- ///
- [STAThread]
- static void Main()
- {
- if (Environment.OSVersion.Version.Major >= 6)
- {
- Utils.SetProcessDPIAware();
- }
-
- Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
- Application.ThreadException += Application_ThreadException;
- AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
-
-
- //AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
-
- if (!IsDuplicateInstance())
- {
- Logging.Setup();
- Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}");
- Logging.ClearLogs();
-
- //设置语言环境
- string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans");
- Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
-
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new MainForm());
- }
- else
- {
- try
- {
- //read handle from reg and show the window
- long.TryParse(Utils.RegReadValue(Global.MyRegPath, Utils.WindowHwndKey, ""), out long llong);
- if (llong > 0)
- {
- var hwnd = (IntPtr)llong;
- if (Utils.IsWindow(hwnd))
- {
- Utils.ShowWindow(hwnd, 4);
- Utils.SwitchToThisWindow(hwnd, true);
- return;
- }
- }
- }
- catch { }
- UI.ShowWarning($"v2rayN is already running(v2rayN已经运行)");
- }
- }
-
- //private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
- //{
- // try
- // {
- // string resourceName = "v2rayN.LIB." + new AssemblyName(args.Name).Name + ".dll";
- // using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
- // {
- // if (stream == null)
- // {
- // return null;
- // }
- // byte[] assemblyData = new byte[stream.Length];
- // stream.Read(assemblyData, 0, assemblyData.Length);
- // return Assembly.Load(assemblyData);
- // }
- // }
- // catch
- // {
- // return null;
- // }
- //}
-
- ///
- /// 检查是否已在运行
- ///
- public static bool IsDuplicateInstance()
- {
- //string name = "v2rayN";
-
- string name = Utils.GetExePath(); // Allow different locations to run
- name = name.Replace("\\", "/"); // https://stackoverflow.com/questions/20714120/could-not-find-a-part-of-the-path-error-while-creating-mutex
-
- Global.mutexObj = new Mutex(false, name, out bool bCreatedNew);
- return !bCreatedNew;
- }
-
- static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
- {
- Utils.SaveLog("Application_ThreadException", e.Exception);
- }
-
- static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
- }
- }
-}
diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs
index aa68f66d..f422c042 100644
--- a/v2rayN/v2rayN/Properties/Resources.Designer.cs
+++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs
@@ -19,7 +19,7 @@ namespace v2rayN.Properties {
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@@ -70,6 +70,16 @@ namespace v2rayN.Properties {
}
}
+ ///
+ /// 查找 System.Drawing.Bitmap 类型的本地化资源。
+ ///
+ internal static System.Drawing.Bitmap active {
+ get {
+ object obj = ResourceManager.GetObject("active", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
///
@@ -190,6 +200,16 @@ namespace v2rayN.Properties {
}
}
+ ///
+ /// 查找 System.Drawing.Bitmap 类型的本地化资源。
+ ///
+ internal static System.Drawing.Bitmap speedtest {
+ get {
+ object obj = ResourceManager.GetObject("speedtest", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
///
diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx
index 20e420b5..bebcc3df 100644
--- a/v2rayN/v2rayN/Properties/Resources.resx
+++ b/v2rayN/v2rayN/Properties/Resources.resx
@@ -118,45 +118,12 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- ..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- ..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\Resources\NotifyIcon1.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
diff --git a/v2rayN/v2rayN/Properties/Settings.Designer.cs b/v2rayN/v2rayN/Properties/Settings.Designer.cs
deleted file mode 100644
index dea73b7b..00000000
--- a/v2rayN/v2rayN/Properties/Settings.Designer.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// 此代码由工具生成。
-// 运行时版本:4.0.30319.42000
-//
-// 对此文件的更改可能会导致不正确的行为,并且如果
-// 重新生成代码,这些更改将会丢失。
-//
-//------------------------------------------------------------------------------
-
-namespace v2rayN.Properties {
-
-
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")]
- internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
-
- private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
- public static Settings Default {
- get {
- return defaultInstance;
- }
- }
- }
-}
diff --git a/v2rayN/v2rayN/Properties/Settings.settings b/v2rayN/v2rayN/Properties/Settings.settings
deleted file mode 100644
index 39645652..00000000
--- a/v2rayN/v2rayN/Properties/Settings.settings
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/v2rayN/v2rayN/Resources/about.png b/v2rayN/v2rayN/Resources/about.png
deleted file mode 100644
index 48fa6b1b..00000000
Binary files a/v2rayN/v2rayN/Resources/about.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/checkupdate.png b/v2rayN/v2rayN/Resources/checkupdate.png
deleted file mode 100644
index bc1fade1..00000000
Binary files a/v2rayN/v2rayN/Resources/checkupdate.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/help.png b/v2rayN/v2rayN/Resources/help.png
deleted file mode 100644
index 03691a42..00000000
Binary files a/v2rayN/v2rayN/Resources/help.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/minimize.png b/v2rayN/v2rayN/Resources/minimize.png
deleted file mode 100644
index 82ee86e4..00000000
Binary files a/v2rayN/v2rayN/Resources/minimize.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/notify.png b/v2rayN/v2rayN/Resources/notify.png
deleted file mode 100644
index 4752fe64..00000000
Binary files a/v2rayN/v2rayN/Resources/notify.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/option.png b/v2rayN/v2rayN/Resources/option.png
deleted file mode 100644
index a0973e58..00000000
Binary files a/v2rayN/v2rayN/Resources/option.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/promotion.png b/v2rayN/v2rayN/Resources/promotion.png
deleted file mode 100644
index e7b6251f..00000000
Binary files a/v2rayN/v2rayN/Resources/promotion.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/restart.png b/v2rayN/v2rayN/Resources/restart.png
deleted file mode 100644
index 1c0e0ca6..00000000
Binary files a/v2rayN/v2rayN/Resources/restart.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/server.png b/v2rayN/v2rayN/Resources/server.png
deleted file mode 100644
index ee3b6970..00000000
Binary files a/v2rayN/v2rayN/Resources/server.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/share.png b/v2rayN/v2rayN/Resources/share.png
deleted file mode 100644
index df5e2396..00000000
Binary files a/v2rayN/v2rayN/Resources/share.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resources/sub.png b/v2rayN/v2rayN/Resources/sub.png
deleted file mode 100644
index c60b5b35..00000000
Binary files a/v2rayN/v2rayN/Resources/sub.png and /dev/null differ
diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs
index 80b79b1f..0aa7c627 100644
--- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs
+++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs
@@ -19,10 +19,10 @@ namespace v2rayN.Resx {
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class ResUI {
+ public class ResUI {
private static global::System.Resources.ResourceManager resourceMan;
@@ -36,7 +36,7 @@ namespace v2rayN.Resx {
/// 返回此类使用的缓存的 ResourceManager 实例。
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager {
+ public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Resx.ResUI", typeof(ResUI).Assembly);
@@ -51,7 +51,7 @@ namespace v2rayN.Resx {
/// 使用此强类型资源类的所有资源查找执行重写。
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture {
+ public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
@@ -63,7 +63,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。
///
- internal static string AddBatchRoutingRulesYesNo {
+ public static string AddBatchRoutingRulesYesNo {
get {
return ResourceManager.GetString("AddBatchRoutingRulesYesNo", resourceCulture);
}
@@ -72,7 +72,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 All servers 的本地化字符串。
///
- internal static string AllGroupServers {
+ public static string AllGroupServers {
get {
return ResourceManager.GetString("AllGroupServers", resourceCulture);
}
@@ -81,7 +81,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。
///
- internal static string BatchExportSubscriptionSuccessfully {
+ public static string BatchExportSubscriptionSuccessfully {
get {
return ResourceManager.GetString("BatchExportSubscriptionSuccessfully", resourceCulture);
}
@@ -90,7 +90,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Batch export share URL to clipboard successfully 的本地化字符串。
///
- internal static string BatchExportURLSuccessfully {
+ public static string BatchExportURLSuccessfully {
get {
return ResourceManager.GetString("BatchExportURLSuccessfully", resourceCulture);
}
@@ -99,7 +99,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please check the server settings first 的本地化字符串。
///
- internal static string CheckServerSettings {
+ public static string CheckServerSettings {
get {
return ResourceManager.GetString("CheckServerSettings", resourceCulture);
}
@@ -108,7 +108,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Invalid configuration format 的本地化字符串。
///
- internal static string ConfigurationFormatIncorrect {
+ public static string ConfigurationFormatIncorrect {
get {
return ResourceManager.GetString("ConfigurationFormatIncorrect", resourceCulture);
}
@@ -117,7 +117,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。
///
- internal static string CustomServerTips {
+ public static string CustomServerTips {
get {
return ResourceManager.GetString("CustomServerTips", resourceCulture);
}
@@ -126,7 +126,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Downloading... 的本地化字符串。
///
- internal static string Downloading {
+ public static string Downloading {
get {
return ResourceManager.GetString("Downloading", resourceCulture);
}
@@ -135,7 +135,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Download 的本地化字符串。
///
- internal static string downloadSpeed {
+ public static string downloadSpeed {
get {
return ResourceManager.GetString("downloadSpeed", resourceCulture);
}
@@ -144,7 +144,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Whether to download? {0} 的本地化字符串。
///
- internal static string DownloadYesNo {
+ public static string DownloadYesNo {
get {
return ResourceManager.GetString("DownloadYesNo", resourceCulture);
}
@@ -153,7 +153,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Failed to convert configuration file 的本地化字符串。
///
- internal static string FailedConversionConfiguration {
+ public static string FailedConversionConfiguration {
get {
return ResourceManager.GetString("FailedConversionConfiguration", resourceCulture);
}
@@ -162,7 +162,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Failed to generate default configuration file 的本地化字符串。
///
- internal static string FailedGenDefaultConfiguration {
+ public static string FailedGenDefaultConfiguration {
get {
return ResourceManager.GetString("FailedGenDefaultConfiguration", resourceCulture);
}
@@ -171,7 +171,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Failed to get the default configuration 的本地化字符串。
///
- internal static string FailedGetDefaultConfiguration {
+ public static string FailedGetDefaultConfiguration {
get {
return ResourceManager.GetString("FailedGetDefaultConfiguration", resourceCulture);
}
@@ -180,7 +180,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Failed to import custom configuration server 的本地化字符串。
///
- internal static string FailedImportedCustomServer {
+ public static string FailedImportedCustomServer {
get {
return ResourceManager.GetString("FailedImportedCustomServer", resourceCulture);
}
@@ -189,16 +189,25 @@ namespace v2rayN.Resx {
///
/// 查找类似 Failed to read configuration file 的本地化字符串。
///
- internal static string FailedReadConfiguration {
+ public static string FailedReadConfiguration {
get {
return ResourceManager.GetString("FailedReadConfiguration", resourceCulture);
}
}
+ ///
+ /// 查找类似 Failed to run Core, please see the log 的本地化字符串。
+ ///
+ public static string FailedToRunCore {
+ get {
+ return ResourceManager.GetString("FailedToRunCore", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Please fill in the correct custom DNS 的本地化字符串。
///
- internal static string FillCorrectDNSText {
+ public static string FillCorrectDNSText {
get {
return ResourceManager.GetString("FillCorrectDNSText", resourceCulture);
}
@@ -207,7 +216,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the correct format server port 的本地化字符串。
///
- internal static string FillCorrectServerPort {
+ public static string FillCorrectServerPort {
get {
return ResourceManager.GetString("FillCorrectServerPort", resourceCulture);
}
@@ -216,7 +225,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the KCP parameters correctly 的本地化字符串。
///
- internal static string FillKcpParameters {
+ public static string FillKcpParameters {
get {
return ResourceManager.GetString("FillKcpParameters", resourceCulture);
}
@@ -225,7 +234,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the local listening port 的本地化字符串。
///
- internal static string FillLocalListeningPort {
+ public static string FillLocalListeningPort {
get {
return ResourceManager.GetString("FillLocalListeningPort", resourceCulture);
}
@@ -234,7 +243,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the password 的本地化字符串。
///
- internal static string FillPassword {
+ public static string FillPassword {
get {
return ResourceManager.GetString("FillPassword", resourceCulture);
}
@@ -243,7 +252,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the server address 的本地化字符串。
///
- internal static string FillServerAddress {
+ public static string FillServerAddress {
get {
return ResourceManager.GetString("FillServerAddress", resourceCulture);
}
@@ -252,7 +261,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please browse to import server configuration 的本地化字符串。
///
- internal static string FillServerAddressCustom {
+ public static string FillServerAddressCustom {
get {
return ResourceManager.GetString("FillServerAddressCustom", resourceCulture);
}
@@ -261,16 +270,25 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the user ID 的本地化字符串。
///
- internal static string FillUUID {
+ public static string FillUUID {
get {
return ResourceManager.GetString("FillUUID", resourceCulture);
}
}
+ ///
+ /// 查找类似 Transport 的本地化字符串。
+ ///
+ public static string GbTransport {
+ get {
+ return ResourceManager.GetString("GbTransport", resourceCulture);
+ }
+ }
+
///
/// 查找类似 is not the correct client configuration file, please check 的本地化字符串。
///
- internal static string IncorrectClientConfiguration {
+ public static string IncorrectClientConfiguration {
get {
return ResourceManager.GetString("IncorrectClientConfiguration", resourceCulture);
}
@@ -279,7 +297,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 is not the correct configuration, please check 的本地化字符串。
///
- internal static string Incorrectconfiguration {
+ public static string Incorrectconfiguration {
get {
return ResourceManager.GetString("Incorrectconfiguration", resourceCulture);
}
@@ -288,7 +306,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 is not the correct server configuration file, please check 的本地化字符串。
///
- internal static string IncorrectServerConfiguration {
+ public static string IncorrectServerConfiguration {
get {
return ResourceManager.GetString("IncorrectServerConfiguration", resourceCulture);
}
@@ -297,7 +315,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Initial Configuration 的本地化字符串。
///
- internal static string InitialConfiguration {
+ public static string InitialConfiguration {
get {
return ResourceManager.GetString("InitialConfiguration", resourceCulture);
}
@@ -306,7 +324,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 {0} already up to date. 的本地化字符串。
///
- internal static string IsLatestCore {
+ public static string IsLatestCore {
get {
return ResourceManager.GetString("IsLatestCore", resourceCulture);
}
@@ -315,7 +333,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 {0} already up to date. 的本地化字符串。
///
- internal static string IsLatestN {
+ public static string IsLatestN {
get {
return ResourceManager.GetString("IsLatestN", resourceCulture);
}
@@ -324,7 +342,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 LAN 的本地化字符串。
///
- internal static string LabLAN {
+ public static string LabLAN {
get {
return ResourceManager.GetString("LabLAN", resourceCulture);
}
@@ -333,7 +351,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Local 的本地化字符串。
///
- internal static string LabLocal {
+ public static string LabLocal {
get {
return ResourceManager.GetString("LabLocal", resourceCulture);
}
@@ -342,7 +360,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Address 的本地化字符串。
///
- internal static string LvAddress {
+ public static string LvAddress {
get {
return ResourceManager.GetString("LvAddress", resourceCulture);
}
@@ -351,7 +369,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Alias 的本地化字符串。
///
- internal static string LvAlias {
+ public static string LvAlias {
get {
return ResourceManager.GetString("LvAlias", resourceCulture);
}
@@ -360,7 +378,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Count 的本地化字符串。
///
- internal static string LvCount {
+ public static string LvCount {
get {
return ResourceManager.GetString("LvCount", resourceCulture);
}
@@ -369,34 +387,52 @@ namespace v2rayN.Resx {
///
/// 查找类似 Custom Icon 的本地化字符串。
///
- internal static string LvCustomIcon {
+ public static string LvCustomIcon {
get {
return ResourceManager.GetString("LvCustomIcon", resourceCulture);
}
}
+ ///
+ /// 查找类似 Enabled Update 的本地化字符串。
+ ///
+ public static string LvEnabled {
+ get {
+ return ResourceManager.GetString("LvEnabled", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Security 的本地化字符串。
///
- internal static string LvEncryptionMethod {
+ public static string LvEncryptionMethod {
get {
return ResourceManager.GetString("LvEncryptionMethod", resourceCulture);
}
}
+ ///
+ /// 查找类似 Remarks regular filter 的本地化字符串。
+ ///
+ public static string LvFilter {
+ get {
+ return ResourceManager.GetString("LvFilter", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Port 的本地化字符串。
///
- internal static string LvPort {
+ public static string LvPort {
get {
return ResourceManager.GetString("LvPort", resourceCulture);
}
}
///
- /// 查找类似 remarks 的本地化字符串。
+ /// 查找类似 Remarks 的本地化字符串。
///
- internal static string LvRemarks {
+ public static string LvRemarks {
get {
return ResourceManager.GetString("LvRemarks", resourceCulture);
}
@@ -405,34 +441,61 @@ namespace v2rayN.Resx {
///
/// 查找类似 Type 的本地化字符串。
///
- internal static string LvServiceType {
+ public static string LvServiceType {
get {
return ResourceManager.GetString("LvServiceType", resourceCulture);
}
}
///
- /// 查找类似 Subs 的本地化字符串。
+ /// 查找类似 Sort 的本地化字符串。
///
- internal static string LvSubscription {
+ public static string LvSort {
+ get {
+ return ResourceManager.GetString("LvSort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Subs group 的本地化字符串。
+ ///
+ public static string LvSubscription {
get {
return ResourceManager.GetString("LvSubscription", resourceCulture);
}
}
+ ///
+ /// 查找类似 Delay(ms) 的本地化字符串。
+ ///
+ public static string LvTestDelay {
+ get {
+ return ResourceManager.GetString("LvTestDelay", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Test Results 的本地化字符串。
///
- internal static string LvTestResults {
+ public static string LvTestResults {
get {
return ResourceManager.GetString("LvTestResults", resourceCulture);
}
}
+ ///
+ /// 查找类似 Speed(M/s) 的本地化字符串。
+ ///
+ public static string LvTestSpeed {
+ get {
+ return ResourceManager.GetString("LvTestSpeed", resourceCulture);
+ }
+ }
+
///
/// 查找类似 TLS 的本地化字符串。
///
- internal static string LvTLS {
+ public static string LvTLS {
get {
return ResourceManager.GetString("LvTLS", resourceCulture);
}
@@ -441,7 +504,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Download traffic today 的本地化字符串。
///
- internal static string LvTodayDownloadDataAmount {
+ public static string LvTodayDownloadDataAmount {
get {
return ResourceManager.GetString("LvTodayDownloadDataAmount", resourceCulture);
}
@@ -450,7 +513,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Upload traffic today 的本地化字符串。
///
- internal static string LvTodayUploadDataAmount {
+ public static string LvTodayUploadDataAmount {
get {
return ResourceManager.GetString("LvTodayUploadDataAmount", resourceCulture);
}
@@ -459,7 +522,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Total download traffic 的本地化字符串。
///
- internal static string LvTotalDownloadDataAmount {
+ public static string LvTotalDownloadDataAmount {
get {
return ResourceManager.GetString("LvTotalDownloadDataAmount", resourceCulture);
}
@@ -468,7 +531,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Total upload traffic 的本地化字符串。
///
- internal static string LvTotalUploadDataAmount {
+ public static string LvTotalUploadDataAmount {
get {
return ResourceManager.GetString("LvTotalUploadDataAmount", resourceCulture);
}
@@ -477,34 +540,763 @@ namespace v2rayN.Resx {
///
/// 查找类似 Transport 的本地化字符串。
///
- internal static string LvTransportProtocol {
+ public static string LvTransportProtocol {
get {
return ResourceManager.GetString("LvTransportProtocol", resourceCulture);
}
}
///
- /// 查找类似 Url 的本地化字符串。
+ /// 查找类似 Url(Optional) 的本地化字符串。
///
- internal static string LvUrl {
+ public static string LvUrl {
get {
return ResourceManager.GetString("LvUrl", resourceCulture);
}
}
+ ///
+ /// 查找类似 User Agent 的本地化字符串。
+ ///
+ public static string LvUserAgent {
+ get {
+ return ResourceManager.GetString("LvUserAgent", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Medium 的本地化字符串。
///
- internal static string MediumFresh {
+ public static string MediumFresh {
get {
return ResourceManager.GetString("MediumFresh", resourceCulture);
}
}
+ ///
+ /// 查找类似 Add a custom configuration server 的本地化字符串。
+ ///
+ public static string menuAddCustomServer {
+ get {
+ return ResourceManager.GetString("menuAddCustomServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import bulk URL from clipboard (Ctrl+V) 的本地化字符串。
+ ///
+ public static string menuAddServerViaClipboard {
+ get {
+ return ResourceManager.GetString("menuAddServerViaClipboard", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Scan QR code on the screen (Ctrl+S) 的本地化字符串。
+ ///
+ public static string menuAddServerViaScan {
+ get {
+ return ResourceManager.GetString("menuAddServerViaScan", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add [Shadowsocks] server 的本地化字符串。
+ ///
+ public static string menuAddShadowsocksServer {
+ get {
+ return ResourceManager.GetString("menuAddShadowsocksServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add [Socks] server 的本地化字符串。
+ ///
+ public static string menuAddSocksServer {
+ get {
+ return ResourceManager.GetString("menuAddSocksServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add [Trojan] server 的本地化字符串。
+ ///
+ public static string menuAddTrojanServer {
+ get {
+ return ResourceManager.GetString("menuAddTrojanServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add [VLESS] server 的本地化字符串。
+ ///
+ public static string menuAddVlessServer {
+ get {
+ return ResourceManager.GetString("menuAddVlessServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add [VMess] server 的本地化字符串。
+ ///
+ public static string menuAddVmessServer {
+ get {
+ return ResourceManager.GetString("menuAddVmessServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Check Update 的本地化字符串。
+ ///
+ public static string menuCheckUpdate {
+ get {
+ return ResourceManager.GetString("menuCheckUpdate", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Clear all service statistics 的本地化字符串。
+ ///
+ public static string menuClearServerStatistics {
+ get {
+ return ResourceManager.GetString("menuClearServerStatistics", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Close 的本地化字符串。
+ ///
+ public static string menuClose {
+ get {
+ return ResourceManager.GetString("menuClose", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Clone selected server 的本地化字符串。
+ ///
+ public static string menuCopyServer {
+ get {
+ return ResourceManager.GetString("menuCopyServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Exit 的本地化字符串。
+ ///
+ public static string menuExit {
+ get {
+ return ResourceManager.GetString("menuExit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Export selected server for client configuration 的本地化字符串。
+ ///
+ public static string menuExport2ClientConfig {
+ get {
+ return ResourceManager.GetString("menuExport2ClientConfig", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Export selected server for server configuration 的本地化字符串。
+ ///
+ public static string menuExport2ServerConfig {
+ get {
+ return ResourceManager.GetString("menuExport2ServerConfig", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Export share URLs to clipboard (Ctrl+C) 的本地化字符串。
+ ///
+ public static string menuExport2ShareUrl {
+ get {
+ return ResourceManager.GetString("menuExport2ShareUrl", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Export subscription (base64) share to clipboard 的本地化字符串。
+ ///
+ public static string menuExport2SubContent {
+ get {
+ return ResourceManager.GetString("menuExport2SubContent", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 GlobalHotkeySetting 的本地化字符串。
+ ///
+ public static string menuGlobalHotkeySetting {
+ get {
+ return ResourceManager.GetString("menuGlobalHotkeySetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Help 的本地化字符串。
+ ///
+ public static string menuHelp {
+ get {
+ return ResourceManager.GetString("menuHelp", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import old config guiNConfig 的本地化字符串。
+ ///
+ public static string menuImportOldGuiConfig {
+ get {
+ return ResourceManager.GetString("menuImportOldGuiConfig", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import Rules From Clipboard 的本地化字符串。
+ ///
+ public static string menuImportRulesFromClipboard {
+ get {
+ return ResourceManager.GetString("menuImportRulesFromClipboard", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import Rules From File 的本地化字符串。
+ ///
+ public static string menuImportRulesFromFile {
+ get {
+ return ResourceManager.GetString("menuImportRulesFromFile", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import Rules From Sub Url 的本地化字符串。
+ ///
+ public static string menuImportRulesFromUrl {
+ get {
+ return ResourceManager.GetString("menuImportRulesFromUrl", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 One-click test Latency and speed (Ctrl+E) 的本地化字符串。
+ ///
+ public static string menuMixedTestServer {
+ get {
+ return ResourceManager.GetString("menuMixedTestServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Move to bottom (B) 的本地化字符串。
+ ///
+ public static string menuMoveBottom {
+ get {
+ return ResourceManager.GetString("menuMoveBottom", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Down (D) 的本地化字符串。
+ ///
+ public static string menuMoveDown {
+ get {
+ return ResourceManager.GetString("menuMoveDown", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Move to top (T) 的本地化字符串。
+ ///
+ public static string menuMoveTop {
+ get {
+ return ResourceManager.GetString("menuMoveTop", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Up (U) 的本地化字符串。
+ ///
+ public static string menuMoveUp {
+ get {
+ return ResourceManager.GetString("menuMoveUp", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Clear All 的本地化字符串。
+ ///
+ public static string menuMsgViewClear {
+ get {
+ return ResourceManager.GetString("menuMsgViewClear", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Copy (Ctrl+C) 的本地化字符串。
+ ///
+ public static string menuMsgViewCopy {
+ get {
+ return ResourceManager.GetString("menuMsgViewCopy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Copy All 的本地化字符串。
+ ///
+ public static string menuMsgViewCopyAll {
+ get {
+ return ResourceManager.GetString("menuMsgViewCopyAll", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set message filters 的本地化字符串。
+ ///
+ public static string menuMsgViewFilter {
+ get {
+ return ResourceManager.GetString("menuMsgViewFilter", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Select All (Ctrl+A) 的本地化字符串。
+ ///
+ public static string menuMsgViewSelectAll {
+ get {
+ return ResourceManager.GetString("menuMsgViewSelectAll", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 OptionSetting 的本地化字符串。
+ ///
+ public static string menuOptionSetting {
+ get {
+ return ResourceManager.GetString("menuOptionSetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Test servers ping (Ctrl+P) 的本地化字符串。
+ ///
+ public static string menuPingServer {
+ get {
+ return ResourceManager.GetString("menuPingServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Promotion 的本地化字符串。
+ ///
+ public static string menuPromotion {
+ get {
+ return ResourceManager.GetString("menuPromotion", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Test servers real delay (Ctrl+R) 的本地化字符串。
+ ///
+ public static string menuRealPingServer {
+ get {
+ return ResourceManager.GetString("menuRealPingServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Reload 的本地化字符串。
+ ///
+ public static string menuReload {
+ get {
+ return ResourceManager.GetString("menuReload", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Remove duplicate servers 的本地化字符串。
+ ///
+ public static string menuRemoveDuplicateServer {
+ get {
+ return ResourceManager.GetString("menuRemoveDuplicateServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Remove selected servers (Delete) 的本地化字符串。
+ ///
+ public static string menuRemoveServer {
+ get {
+ return ResourceManager.GetString("menuRemoveServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Routing 的本地化字符串。
+ ///
+ public static string menuRouting {
+ get {
+ return ResourceManager.GetString("menuRouting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Advanced Function 的本地化字符串。
+ ///
+ public static string menuRoutingAdvanced {
+ get {
+ return ResourceManager.GetString("menuRoutingAdvanced", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add 的本地化字符串。
+ ///
+ public static string menuRoutingAdvancedAdd {
+ get {
+ return ResourceManager.GetString("menuRoutingAdvancedAdd", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import Advanced Rules 的本地化字符串。
+ ///
+ public static string menuRoutingAdvancedImportRules {
+ get {
+ return ResourceManager.GetString("menuRoutingAdvancedImportRules", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Remove selected 的本地化字符串。
+ ///
+ public static string menuRoutingAdvancedRemove {
+ get {
+ return ResourceManager.GetString("menuRoutingAdvancedRemove", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set as active rule 的本地化字符串。
+ ///
+ public static string menuRoutingAdvancedSetDefault {
+ get {
+ return ResourceManager.GetString("menuRoutingAdvancedSetDefault", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Basic Function 的本地化字符串。
+ ///
+ public static string menuRoutingBasic {
+ get {
+ return ResourceManager.GetString("menuRoutingBasic", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Import Basic Rules 的本地化字符串。
+ ///
+ public static string menuRoutingBasicImportRules {
+ get {
+ return ResourceManager.GetString("menuRoutingBasicImportRules", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 RoutingRuleDetailsSetting 的本地化字符串。
+ ///
+ public static string menuRoutingRuleDetailsSetting {
+ get {
+ return ResourceManager.GetString("menuRoutingRuleDetailsSetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Rule Setting 的本地化字符串。
+ ///
+ public static string menuRoutingRuleSetting {
+ get {
+ return ResourceManager.GetString("menuRoutingRuleSetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 RoutingSetting 的本地化字符串。
+ ///
+ public static string menuRoutingSetting {
+ get {
+ return ResourceManager.GetString("menuRoutingSetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Rule Add 的本地化字符串。
+ ///
+ public static string menuRuleAdd {
+ get {
+ return ResourceManager.GetString("menuRuleAdd", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Export Selected Rules 的本地化字符串。
+ ///
+ public static string menuRuleExportSelected {
+ get {
+ return ResourceManager.GetString("menuRuleExportSelected", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Rule List 的本地化字符串。
+ ///
+ public static string menuRuleList {
+ get {
+ return ResourceManager.GetString("menuRuleList", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Remove Rules 的本地化字符串。
+ ///
+ public static string menuRuleRemove {
+ get {
+ return ResourceManager.GetString("menuRuleRemove", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Select All (Ctrl+A) 的本地化字符串。
+ ///
+ public static string menuSelectAll {
+ get {
+ return ResourceManager.GetString("menuSelectAll", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Servers 的本地化字符串。
+ ///
+ public static string menuServers {
+ get {
+ return ResourceManager.GetString("menuServers", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set as active server (Enter) 的本地化字符串。
+ ///
+ public static string menuSetDefaultServer {
+ get {
+ return ResourceManager.GetString("menuSetDefaultServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Setting 的本地化字符串。
+ ///
+ public static string menuSetting {
+ get {
+ return ResourceManager.GetString("menuSetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Share Server (Ctrl+D) 的本地化字符串。
+ ///
+ public static string menuShareServer {
+ get {
+ return ResourceManager.GetString("menuShareServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Sort by test result 的本地化字符串。
+ ///
+ public static string menuSortServerResult {
+ get {
+ return ResourceManager.GetString("menuSortServerResult", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Test servers download speed (Ctrl+T) 的本地化字符串。
+ ///
+ public static string menuSpeedServer {
+ get {
+ return ResourceManager.GetString("menuSpeedServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Add 的本地化字符串。
+ ///
+ public static string menuSubAdd {
+ get {
+ return ResourceManager.GetString("menuSubAdd", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Delete 的本地化字符串。
+ ///
+ public static string menuSubDelete {
+ get {
+ return ResourceManager.GetString("menuSubDelete", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Edit 的本地化字符串。
+ ///
+ public static string menuSubEdit {
+ get {
+ return ResourceManager.GetString("menuSubEdit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Update current subscription without proxy 的本地化字符串。
+ ///
+ public static string menuSubGroupUpdate {
+ get {
+ return ResourceManager.GetString("menuSubGroupUpdate", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Update current subscription with proxy 的本地化字符串。
+ ///
+ public static string menuSubGroupUpdateViaProxy {
+ get {
+ return ResourceManager.GetString("menuSubGroupUpdateViaProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Subscription group 的本地化字符串。
+ ///
+ public static string menuSubscription {
+ get {
+ return ResourceManager.GetString("menuSubscription", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Subscription group Setting 的本地化字符串。
+ ///
+ public static string menuSubSetting {
+ get {
+ return ResourceManager.GetString("menuSubSetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Share 的本地化字符串。
+ ///
+ public static string menuSubShare {
+ get {
+ return ResourceManager.GetString("menuSubShare", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Update subscription without proxy 的本地化字符串。
+ ///
+ public static string menuSubUpdate {
+ get {
+ return ResourceManager.GetString("menuSubUpdate", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Update subscription with proxy 的本地化字符串。
+ ///
+ public static string menuSubUpdateViaProxy {
+ get {
+ return ResourceManager.GetString("menuSubUpdateViaProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 System proxy 的本地化字符串。
+ ///
+ public static string menuSystemproxy {
+ get {
+ return ResourceManager.GetString("menuSystemproxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Clear system proxy 的本地化字符串。
+ ///
+ public static string menuSystemProxyClear {
+ get {
+ return ResourceManager.GetString("menuSystemProxyClear", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Do not change system proxy 的本地化字符串。
+ ///
+ public static string menuSystemProxyNothing {
+ get {
+ return ResourceManager.GetString("menuSystemProxyNothing", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Pac Mode 的本地化字符串。
+ ///
+ public static string menuSystemProxyPac {
+ get {
+ return ResourceManager.GetString("menuSystemProxyPac", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set system proxy 的本地化字符串。
+ ///
+ public static string menuSystemProxySet {
+ get {
+ return ResourceManager.GetString("menuSystemProxySet", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Test servers with tcping (Ctrl+O) 的本地化字符串。
+ ///
+ public static string menuTcpingServer {
+ get {
+ return ResourceManager.GetString("menuTcpingServer", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Test current service status 的本地化字符串。
+ ///
+ public static string menuTestMe {
+ get {
+ return ResourceManager.GetString("menuTestMe", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 {0} Website 的本地化字符串。
+ ///
+ public static string menuWebsiteItem {
+ get {
+ return ResourceManager.GetString("menuWebsiteItem", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Clear original subscription content 的本地化字符串。
///
- internal static string MsgClearSubscription {
+ public static string MsgClearSubscription {
get {
return ResourceManager.GetString("MsgClearSubscription", resourceCulture);
}
@@ -513,7 +1305,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。
///
- internal static string MsgDownloadGeoFileSuccessfully {
+ public static string MsgDownloadGeoFileSuccessfully {
get {
return ResourceManager.GetString("MsgDownloadGeoFileSuccessfully", resourceCulture);
}
@@ -522,7 +1314,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Download Core successfully 的本地化字符串。
///
- internal static string MsgDownloadV2rayCoreSuccessfully {
+ public static string MsgDownloadV2rayCoreSuccessfully {
get {
return ResourceManager.GetString("MsgDownloadV2rayCoreSuccessfully", resourceCulture);
}
@@ -531,25 +1323,34 @@ namespace v2rayN.Resx {
///
/// 查找类似 Failed to import subscription content 的本地化字符串。
///
- internal static string MsgFailedImportSubscription {
+ public static string MsgFailedImportSubscription {
get {
return ResourceManager.GetString("MsgFailedImportSubscription", resourceCulture);
}
}
+ ///
+ /// 查找类似 Filter, support regular 的本地化字符串。
+ ///
+ public static string MsgFilterTitle {
+ get {
+ return ResourceManager.GetString("MsgFilterTitle", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Get subscription content successfully 的本地化字符串。
///
- internal static string MsgGetSubscriptionSuccessfully {
+ public static string MsgGetSubscriptionSuccessfully {
get {
return ResourceManager.GetString("MsgGetSubscriptionSuccessfully", resourceCulture);
}
}
///
- /// 查找类似 Information (Filter : {0}) 的本地化字符串。
+ /// 查找类似 Information 的本地化字符串。
///
- internal static string MsgInformationTitle {
+ public static string MsgInformationTitle {
get {
return ResourceManager.GetString("MsgInformationTitle", resourceCulture);
}
@@ -558,7 +1359,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please fill in the address (Url) 的本地化字符串。
///
- internal static string MsgNeedUrl {
+ public static string MsgNeedUrl {
get {
return ResourceManager.GetString("MsgNeedUrl", resourceCulture);
}
@@ -567,7 +1368,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 No valid subscriptions set 的本地化字符串。
///
- internal static string MsgNoValidSubscription {
+ public static string MsgNoValidSubscription {
get {
return ResourceManager.GetString("MsgNoValidSubscription", resourceCulture);
}
@@ -576,7 +1377,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 PAC update failed 的本地化字符串。
///
- internal static string MsgPACUpdateFailed {
+ public static string MsgPACUpdateFailed {
get {
return ResourceManager.GetString("MsgPACUpdateFailed", resourceCulture);
}
@@ -585,7 +1386,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 PAC update succeeded 的本地化字符串。
///
- internal static string MsgPACUpdateSuccessfully {
+ public static string MsgPACUpdateSuccessfully {
get {
return ResourceManager.GetString("MsgPACUpdateSuccessfully", resourceCulture);
}
@@ -594,16 +1395,16 @@ namespace v2rayN.Resx {
///
/// 查找类似 Resolve {0} successfully 的本地化字符串。
///
- internal static string MsgParsingSuccessfully {
+ public static string MsgParsingSuccessfully {
get {
return ResourceManager.GetString("MsgParsingSuccessfully", resourceCulture);
}
}
///
- /// 查找类似 Servers (Filter : {0}) 的本地化字符串。
+ /// 查找类似 Servers Filter 的本地化字符串。
///
- internal static string MsgServerTitle {
+ public static string MsgServerTitle {
get {
return ResourceManager.GetString("MsgServerTitle", resourceCulture);
}
@@ -612,7 +1413,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Simplify PAC Success 的本地化字符串。
///
- internal static string MsgSimplifyPAC {
+ public static string MsgSimplifyPAC {
get {
return ResourceManager.GetString("MsgSimplifyPAC", resourceCulture);
}
@@ -621,7 +1422,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Start getting subscriptions 的本地化字符串。
///
- internal static string MsgStartGettingSubscriptions {
+ public static string MsgStartGettingSubscriptions {
get {
return ResourceManager.GetString("MsgStartGettingSubscriptions", resourceCulture);
}
@@ -630,7 +1431,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Start updating {0}... 的本地化字符串。
///
- internal static string MsgStartUpdating {
+ public static string MsgStartUpdating {
get {
return ResourceManager.GetString("MsgStartUpdating", resourceCulture);
}
@@ -639,7 +1440,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Start updating PAC... 的本地化字符串。
///
- internal static string MsgStartUpdatingPAC {
+ public static string MsgStartUpdatingPAC {
get {
return ResourceManager.GetString("MsgStartUpdatingPAC", resourceCulture);
}
@@ -648,7 +1449,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Invalid subscription content 的本地化字符串。
///
- internal static string MsgSubscriptionDecodingFailed {
+ public static string MsgSubscriptionDecodingFailed {
get {
return ResourceManager.GetString("MsgSubscriptionDecodingFailed", resourceCulture);
}
@@ -657,7 +1458,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 is unpacking... 的本地化字符串。
///
- internal static string MsgUnpacking {
+ public static string MsgUnpacking {
get {
return ResourceManager.GetString("MsgUnpacking", resourceCulture);
}
@@ -666,7 +1467,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Update subscription end 的本地化字符串。
///
- internal static string MsgUpdateSubscriptionEnd {
+ public static string MsgUpdateSubscriptionEnd {
get {
return ResourceManager.GetString("MsgUpdateSubscriptionEnd", resourceCulture);
}
@@ -675,7 +1476,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Update subscription starts 的本地化字符串。
///
- internal static string MsgUpdateSubscriptionStart {
+ public static string MsgUpdateSubscriptionStart {
get {
return ResourceManager.GetString("MsgUpdateSubscriptionStart", resourceCulture);
}
@@ -684,7 +1485,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Update Core successfully 的本地化字符串。
///
- internal static string MsgUpdateV2rayCoreSuccessfully {
+ public static string MsgUpdateV2rayCoreSuccessfully {
get {
return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfully", resourceCulture);
}
@@ -693,7 +1494,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。
///
- internal static string MsgUpdateV2rayCoreSuccessfullyMore {
+ public static string MsgUpdateV2rayCoreSuccessfullyMore {
get {
return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfullyMore", resourceCulture);
}
@@ -702,7 +1503,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 This feature relies on the Http global proxy, please set it correctly first. 的本地化字符串。
///
- internal static string NeedHttpGlobalProxy {
+ public static string NeedHttpGlobalProxy {
get {
return ResourceManager.GetString("NeedHttpGlobalProxy", resourceCulture);
}
@@ -711,7 +1512,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Normal use of this version requires .NET Framework 4.8 的本地化字符串。
///
- internal static string NetFrameworkRequirementsTip {
+ public static string NetFrameworkRequirementsTip {
get {
return ResourceManager.GetString("NetFrameworkRequirementsTip", resourceCulture);
}
@@ -720,7 +1521,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Non-VMess or ss protocol 的本地化字符串。
///
- internal static string NonvmessOrssProtocol {
+ public static string NonvmessOrssProtocol {
get {
return ResourceManager.GetString("NonvmessOrssProtocol", resourceCulture);
}
@@ -729,25 +1530,34 @@ namespace v2rayN.Resx {
///
/// 查找类似 non-standard service, this feature is invalid 的本地化字符串。
///
- internal static string NonVmessService {
+ public static string NonVmessService {
get {
return ResourceManager.GetString("NonVmessService", resourceCulture);
}
}
///
- /// 查找类似 Core not found({0}), please download: {1} 的本地化字符串。
+ /// 查找类似 The Core file (file name: {1}) was not found under the folder ({0}), please download and put it in the folder, download address: {2} 的本地化字符串。
///
- internal static string NotFoundCore {
+ public static string NotFoundCore {
get {
return ResourceManager.GetString("NotFoundCore", resourceCulture);
}
}
+ ///
+ /// 查找类似 Not Run As Admin 的本地化字符串。
+ ///
+ public static string NotRunAsAdmin {
+ get {
+ return ResourceManager.GetString("NotRunAsAdmin", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Scan completed, no valid QR code found 的本地化字符串。
///
- internal static string NoValidQRcodeFound {
+ public static string NoValidQRcodeFound {
get {
return ResourceManager.GetString("NoValidQRcodeFound", resourceCulture);
}
@@ -756,7 +1566,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 operation failed, please check and retry 的本地化字符串。
///
- internal static string OperationFailed {
+ public static string OperationFailed {
get {
return ResourceManager.GetString("OperationFailed", resourceCulture);
}
@@ -765,7 +1575,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Operation success 的本地化字符串。
///
- internal static string OperationSuccess {
+ public static string OperationSuccess {
get {
return ResourceManager.GetString("OperationSuccess", resourceCulture);
}
@@ -774,7 +1584,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please Fill Remarks 的本地化字符串。
///
- internal static string PleaseFillRemarks {
+ public static string PleaseFillRemarks {
get {
return ResourceManager.GetString("PleaseFillRemarks", resourceCulture);
}
@@ -783,7 +1593,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please select the encryption method 的本地化字符串。
///
- internal static string PleaseSelectEncryption {
+ public static string PleaseSelectEncryption {
get {
return ResourceManager.GetString("PleaseSelectEncryption", resourceCulture);
}
@@ -792,7 +1602,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please select a protocol 的本地化字符串。
///
- internal static string PleaseSelectProtocol {
+ public static string PleaseSelectProtocol {
get {
return ResourceManager.GetString("PleaseSelectProtocol", resourceCulture);
}
@@ -801,7 +1611,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please select rules 的本地化字符串。
///
- internal static string PleaseSelectRules {
+ public static string PleaseSelectRules {
get {
return ResourceManager.GetString("PleaseSelectRules", resourceCulture);
}
@@ -810,7 +1620,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Please select the server first 的本地化字符串。
///
- internal static string PleaseSelectServer {
+ public static string PleaseSelectServer {
get {
return ResourceManager.GetString("PleaseSelectServer", resourceCulture);
}
@@ -819,7 +1629,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Fast 的本地化字符串。
///
- internal static string QuickFresh {
+ public static string QuickFresh {
get {
return ResourceManager.GetString("QuickFresh", resourceCulture);
}
@@ -828,7 +1638,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。
///
- internal static string RegisterGlobalHotkeyFailed {
+ public static string RegisterGlobalHotkeyFailed {
get {
return ResourceManager.GetString("RegisterGlobalHotkeyFailed", resourceCulture);
}
@@ -837,7 +1647,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。
///
- internal static string RegisterGlobalHotkeySuccessfully {
+ public static string RegisterGlobalHotkeySuccessfully {
get {
return ResourceManager.GetString("RegisterGlobalHotkeySuccessfully", resourceCulture);
}
@@ -846,7 +1656,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。
///
- internal static string RemoveDuplicateServerResult {
+ public static string RemoveDuplicateServerResult {
get {
return ResourceManager.GetString("RemoveDuplicateServerResult", resourceCulture);
}
@@ -855,7 +1665,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Are you sure to remove the rules? 的本地化字符串。
///
- internal static string RemoveRules {
+ public static string RemoveRules {
get {
return ResourceManager.GetString("RemoveRules", resourceCulture);
}
@@ -864,7 +1674,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Are you sure to remove the server? 的本地化字符串。
///
- internal static string RemoveServer {
+ public static string RemoveServer {
get {
return ResourceManager.GetString("RemoveServer", resourceCulture);
}
@@ -873,16 +1683,25 @@ namespace v2rayN.Resx {
///
/// 查找类似 {0},One of the required. 的本地化字符串。
///
- internal static string RoutingRuleDetailRequiredTips {
+ public static string RoutingRuleDetailRequiredTips {
get {
return ResourceManager.GetString("RoutingRuleDetailRequiredTips", resourceCulture);
}
}
+ ///
+ /// 查找类似 Run As Admin 的本地化字符串。
+ ///
+ public static string RunAsAdmin {
+ get {
+ return ResourceManager.GetString("RunAsAdmin", resourceCulture);
+ }
+ }
+
///
/// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。
///
- internal static string SaveClientConfigurationIn {
+ public static string SaveClientConfigurationIn {
get {
return ResourceManager.GetString("SaveClientConfigurationIn", resourceCulture);
}
@@ -891,7 +1710,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 The server configuration file is saved at: {0} 的本地化字符串。
///
- internal static string SaveServerConfigurationIn {
+ public static string SaveServerConfigurationIn {
get {
return ResourceManager.GetString("SaveServerConfigurationIn", resourceCulture);
}
@@ -900,7 +1719,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Slow 的本地化字符串。
///
- internal static string SlowFresh {
+ public static string SlowFresh {
get {
return ResourceManager.GetString("SlowFresh", resourceCulture);
}
@@ -909,16 +1728,16 @@ namespace v2rayN.Resx {
///
/// 查找类似 Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. 的本地化字符串。
///
- internal static string SpeedServerTips {
+ public static string SpeedServerTips {
get {
return ResourceManager.GetString("SpeedServerTips", resourceCulture);
}
}
///
- /// 查找类似 Speed Test... 的本地化字符串。
+ /// 查找类似 Testing... 的本地化字符串。
///
- internal static string Speedtesting {
+ public static string Speedtesting {
get {
return ResourceManager.GetString("Speedtesting", resourceCulture);
}
@@ -927,7 +1746,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 PAC failed to start. Please run this program as Administrator. 的本地化字符串。
///
- internal static string StartPacFailed {
+ public static string StartPacFailed {
get {
return ResourceManager.GetString("StartPacFailed", resourceCulture);
}
@@ -936,17 +1755,26 @@ namespace v2rayN.Resx {
///
/// 查找类似 Start service ({0})... 的本地化字符串。
///
- internal static string StartService {
+ public static string StartService {
get {
return ResourceManager.GetString("StartService", resourceCulture);
}
}
+ ///
+ /// 查找类似 Group please leave blank here 的本地化字符串。
+ ///
+ public static string SubUrlTips {
+ get {
+ return ResourceManager.GetString("SubUrlTips", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Configuration successful
///{0} 的本地化字符串。
///
- internal static string SuccessfulConfiguration {
+ public static string SuccessfulConfiguration {
get {
return ResourceManager.GetString("SuccessfulConfiguration", resourceCulture);
}
@@ -955,7 +1783,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Custom configuration server imported successfully. 的本地化字符串。
///
- internal static string SuccessfullyImportedCustomServer {
+ public static string SuccessfullyImportedCustomServer {
get {
return ResourceManager.GetString("SuccessfullyImportedCustomServer", resourceCulture);
}
@@ -964,7 +1792,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 {0} servers have been imported from clipboard. 的本地化字符串。
///
- internal static string SuccessfullyImportedServerViaClipboard {
+ public static string SuccessfullyImportedServerViaClipboard {
get {
return ResourceManager.GetString("SuccessfullyImportedServerViaClipboard", resourceCulture);
}
@@ -973,7 +1801,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Scan import URL successfully 的本地化字符串。
///
- internal static string SuccessfullyImportedServerViaScan {
+ public static string SuccessfullyImportedServerViaScan {
get {
return ResourceManager.GetString("SuccessfullyImportedServerViaScan", resourceCulture);
}
@@ -982,25 +1810,952 @@ namespace v2rayN.Resx {
///
/// 查找类似 System proxy 的本地化字符串。
///
- internal static string SystemProxy {
+ public static string SystemProxy {
get {
return ResourceManager.GetString("SystemProxy", resourceCulture);
}
}
+ ///
+ /// 查找类似 Address 的本地化字符串。
+ ///
+ public static string TbAddress {
+ get {
+ return ResourceManager.GetString("TbAddress", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 AllowInsecure 的本地化字符串。
+ ///
+ public static string TbAllowInsecure {
+ get {
+ return ResourceManager.GetString("TbAllowInsecure", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Alpn 的本地化字符串。
+ ///
+ public static string TbAlpn {
+ get {
+ return ResourceManager.GetString("TbAlpn", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 AlterId 的本地化字符串。
+ ///
+ public static string TbAlterId {
+ get {
+ return ResourceManager.GetString("TbAlterId", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Domain and ip are auto sorted when saving 的本地化字符串。
+ ///
+ public static string TbAutoSort {
+ get {
+ return ResourceManager.GetString("TbAutoSort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Browse 的本地化字符串。
+ ///
+ public static string TbBrowse {
+ get {
+ return ResourceManager.GetString("TbBrowse", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Cancel 的本地化字符串。
+ ///
+ public static string TbCancel {
+ get {
+ return ResourceManager.GetString("TbCancel", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Clear system proxy 的本地化字符串。
+ ///
+ public static string TbClearSystemProxy {
+ get {
+ return ResourceManager.GetString("TbClearSystemProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Confirm 的本地化字符串。
+ ///
+ public static string TbConfirm {
+ get {
+ return ResourceManager.GetString("TbConfirm", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Core Type 的本地化字符串。
+ ///
+ public static string TbCoreType {
+ get {
+ return ResourceManager.GetString("TbCoreType", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Display GUI 的本地化字符串。
+ ///
+ public static string TbDisplayGUI {
+ get {
+ return ResourceManager.GetString("TbDisplayGUI", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Display Log 的本地化字符串。
+ ///
+ public static string TbDisplayLog {
+ get {
+ return ResourceManager.GetString("TbDisplayLog", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Support DnsObject 的本地化字符串。
+ ///
+ public static string TbDnsObjectDoc {
+ get {
+ return ResourceManager.GetString("TbDnsObjectDoc", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Domain Matcher 的本地化字符串。
+ ///
+ public static string TbdomainMatcher {
+ get {
+ return ResourceManager.GetString("TbdomainMatcher", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Domain strategy 的本地化字符串。
+ ///
+ public static string TbdomainStrategy {
+ get {
+ return ResourceManager.GetString("TbdomainStrategy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Edit 的本地化字符串。
+ ///
+ public static string TbEdit {
+ get {
+ return ResourceManager.GetString("TbEdit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Enable advanced function 的本地化字符串。
+ ///
+ public static string TbenableRoutingAdvanced {
+ get {
+ return ResourceManager.GetString("TbenableRoutingAdvanced", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Enable Tun 的本地化字符串。
+ ///
+ public static string TbEnableTunAs {
+ get {
+ return ResourceManager.GetString("TbEnableTunAs", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Fingerprint 的本地化字符串。
+ ///
+ public static string TbFingerprint {
+ get {
+ return ResourceManager.GetString("TbFingerprint", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Flow 的本地化字符串。
+ ///
+ public static string TbFlow5 {
+ get {
+ return ResourceManager.GetString("TbFlow5", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 GlobalHotkey Setting 的本地化字符串。
+ ///
+ public static string TbGlobalHotkeySetting {
+ get {
+ return ResourceManager.GetString("TbGlobalHotkeySetting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set directly by pressing the keyboard, Take effect after restart 的本地化字符串。
+ ///
+ public static string TbGlobalHotkeySettingTip {
+ get {
+ return ResourceManager.GetString("TbGlobalHotkeySettingTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Generate 的本地化字符串。
+ ///
+ public static string TbGUID {
+ get {
+ return ResourceManager.GetString("TbGUID", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Camouflage type 的本地化字符串。
+ ///
+ public static string TbHeaderType {
+ get {
+ return ResourceManager.GetString("TbHeaderType", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 UUID(id) 的本地化字符串。
+ ///
+ public static string TbId {
+ get {
+ return ResourceManager.GetString("TbId", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Password 的本地化字符串。
+ ///
+ public static string TbId3 {
+ get {
+ return ResourceManager.GetString("TbId3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Password(Optional) 的本地化字符串。
+ ///
+ public static string TbId4 {
+ get {
+ return ResourceManager.GetString("TbId4", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 UUID(id) 的本地化字符串。
+ ///
+ public static string TbId5 {
+ get {
+ return ResourceManager.GetString("TbId5", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Transport protocol(network) 的本地化字符串。
+ ///
+ public static string TbNetwork {
+ get {
+ return ResourceManager.GetString("TbNetwork", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Do not change system proxy 的本地化字符串。
+ ///
+ public static string TbNotChangeSystemProxy {
+ get {
+ return ResourceManager.GetString("TbNotChangeSystemProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Path 的本地化字符串。
+ ///
+ public static string TbPath {
+ get {
+ return ResourceManager.GetString("TbPath", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Port 的本地化字符串。
+ ///
+ public static string TbPort {
+ get {
+ return ResourceManager.GetString("TbPort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 txtPreSocksPort 的本地化字符串。
+ ///
+ public static string TbPreSocksPort {
+ get {
+ return ResourceManager.GetString("TbPreSocksPort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Alias (remarks) 的本地化字符串。
+ ///
+ public static string TbRemarks {
+ get {
+ return ResourceManager.GetString("TbRemarks", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Camouflage domain(host) 的本地化字符串。
+ ///
+ public static string TbRequestHost {
+ get {
+ return ResourceManager.GetString("TbRequestHost", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Reset 的本地化字符串。
+ ///
+ public static string TbReset {
+ get {
+ return ResourceManager.GetString("TbReset", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 3.Block Domain or IP 的本地化字符串。
+ ///
+ public static string TbRoutingTabBlock {
+ get {
+ return ResourceManager.GetString("TbRoutingTabBlock", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 2.Direct Domain or IP 的本地化字符串。
+ ///
+ public static string TbRoutingTabDirect {
+ get {
+ return ResourceManager.GetString("TbRoutingTabDirect", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 1.Proxy Domain or IP 的本地化字符串。
+ ///
+ public static string TbRoutingTabProxy {
+ get {
+ return ResourceManager.GetString("TbRoutingTabProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Pre-defined Rule Set List 的本地化字符串。
+ ///
+ public static string TbRoutingTabRuleList {
+ get {
+ return ResourceManager.GetString("TbRoutingTabRuleList", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> 的本地化字符串。
+ ///
+ public static string TbRoutingTips {
+ get {
+ return ResourceManager.GetString("TbRoutingTips", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Ruleobject Doc 的本地化字符串。
+ ///
+ public static string TbRuleobjectDoc {
+ get {
+ return ResourceManager.GetString("TbRuleobjectDoc", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Encryption method (security) 的本地化字符串。
+ ///
+ public static string TbSecurity {
+ get {
+ return ResourceManager.GetString("TbSecurity", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Encryption 的本地化字符串。
+ ///
+ public static string TbSecurity3 {
+ get {
+ return ResourceManager.GetString("TbSecurity3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 User(Optional) 的本地化字符串。
+ ///
+ public static string TbSecurity4 {
+ get {
+ return ResourceManager.GetString("TbSecurity4", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Encryption 的本地化字符串。
+ ///
+ public static string TbSecurity5 {
+ get {
+ return ResourceManager.GetString("TbSecurity5", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set system proxy 的本地化字符串。
+ ///
+ public static string TbSetSystemProxy {
+ get {
+ return ResourceManager.GetString("TbSetSystemProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Advanced proxy settings, protocol selection (optional) 的本地化字符串。
+ ///
+ public static string TbSettingsAdvancedProtocol {
+ get {
+ return ResourceManager.GetString("TbSettingsAdvancedProtocol", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Allow connections from the LAN 的本地化字符串。
+ ///
+ public static string TbSettingsAllowLAN {
+ get {
+ return ResourceManager.GetString("TbSettingsAllowLAN", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Auto hide startup 的本地化字符串。
+ ///
+ public static string TbSettingsAutoHideStartup {
+ get {
+ return ResourceManager.GetString("TbSettingsAutoHideStartup", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Automatic latency test interval (minutes) 的本地化字符串。
+ ///
+ public static string TbSettingsAutoTest {
+ get {
+ return ResourceManager.GetString("TbSettingsAutoTest", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Automatic update interval of subscriptions (hours) 的本地化字符串。
+ ///
+ public static string TbSettingsAutoUpdate {
+ get {
+ return ResourceManager.GetString("TbSettingsAutoUpdate", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Automatic update interval of and Geo (hours) 的本地化字符串。
+ ///
+ public static string TbSettingsAutoUpdateInterval {
+ get {
+ return ResourceManager.GetString("TbSettingsAutoUpdateInterval", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Color 的本地化字符串。
+ ///
+ public static string TbSettingsColor {
+ get {
+ return ResourceManager.GetString("TbSettingsColor", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Dark Mode 的本地化字符串。
+ ///
+ public static string TbSettingsColorMode {
+ get {
+ return ResourceManager.GetString("TbSettingsColorMode", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Core: basic settings 的本地化字符串。
+ ///
+ public static string TbSettingsCore {
+ get {
+ return ResourceManager.GetString("TbSettingsCore", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Core: DNS settings 的本地化字符串。
+ ///
+ public static string TbSettingsCoreDns {
+ get {
+ return ResourceManager.GetString("TbSettingsCoreDns", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Core: KCP settings 的本地化字符串。
+ ///
+ public static string TbSettingsCoreKcp {
+ get {
+ return ResourceManager.GetString("TbSettingsCoreKcp", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 CoreType settings 的本地化字符串。
+ ///
+ public static string TbSettingsCoreType {
+ get {
+ return ResourceManager.GetString("TbSettingsCoreType", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 AllowInsecure 的本地化字符串。
+ ///
+ public static string TbSettingsDefAllowInsecure {
+ get {
+ return ResourceManager.GetString("TbSettingsDefAllowInsecure", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。
+ ///
+ public static string TbSettingsDomainStrategy4Freedom {
+ get {
+ return ResourceManager.GetString("TbSettingsDomainStrategy4Freedom", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Automatically adjust column width after updating subscription 的本地化字符串。
+ ///
+ public static string TbSettingsEnableAutoAdjustMainLvColWidth {
+ get {
+ return ResourceManager.GetString("TbSettingsEnableAutoAdjustMainLvColWidth", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Check for pre-release updates 的本地化字符串。
+ ///
+ public static string TbSettingsEnableCheckPreReleaseUpdate {
+ get {
+ return ResourceManager.GetString("TbSettingsEnableCheckPreReleaseUpdate", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Exception 的本地化字符串。
+ ///
+ public static string TbSettingsException {
+ get {
+ return ResourceManager.GetString("TbSettingsException", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Exception. Do not use proxy server for addresses beginning with,Use semicolon (;) 的本地化字符串。
+ ///
+ public static string TbSettingsExceptionTip {
+ get {
+ return ResourceManager.GetString("TbSettingsExceptionTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Http Port 的本地化字符串。
+ ///
+ public static string TbSettingsHttpPort {
+ get {
+ return ResourceManager.GetString("TbSettingsHttpPort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Ignore Geo files when updating core 的本地化字符串。
+ ///
+ public static string TbSettingsIgnoreGeoUpdateCore {
+ get {
+ return ResourceManager.GetString("TbSettingsIgnoreGeoUpdateCore", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Enable IPv6 的本地化字符串。
+ ///
+ public static string TbSettingsIpv6 {
+ get {
+ return ResourceManager.GetString("TbSettingsIpv6", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Keep older when deduplication 的本地化字符串。
+ ///
+ public static string TbSettingsKeepOlderDedupl {
+ get {
+ return ResourceManager.GetString("TbSettingsKeepOlderDedupl", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Language 的本地化字符串。
+ ///
+ public static string TbSettingsLanguage {
+ get {
+ return ResourceManager.GetString("TbSettingsLanguage", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Record local logs 的本地化字符串。
+ ///
+ public static string TbSettingsLogEnabled {
+ get {
+ return ResourceManager.GetString("TbSettingsLogEnabled", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Log Level 的本地化字符串。
+ ///
+ public static string TbSettingsLogLevel {
+ get {
+ return ResourceManager.GetString("TbSettingsLogLevel", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Turn on Mux Multiplexing 的本地化字符串。
+ ///
+ public static string TbSettingsMuxEnabled {
+ get {
+ return ResourceManager.GetString("TbSettingsMuxEnabled", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 v2rayN settings 的本地化字符串。
+ ///
+ public static string TbSettingsN {
+ get {
+ return ResourceManager.GetString("TbSettingsN", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 New Port for LAN 的本地化字符串。
+ ///
+ public static string TbSettingsNewPort4LAN {
+ get {
+ return ResourceManager.GetString("TbSettingsNewPort4LAN", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Pac listen port 的本地化字符串。
+ ///
+ public static string TbSettingsPacListenPort {
+ get {
+ return ResourceManager.GetString("TbSettingsPacListenPort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Auth pass 的本地化字符串。
+ ///
+ public static string TbSettingsPass {
+ get {
+ return ResourceManager.GetString("TbSettingsPass", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Custom DNS (multiple, separated by commas (,)) 的本地化字符串。
+ ///
+ public static string TbSettingsRemoteDNS {
+ get {
+ return ResourceManager.GetString("TbSettingsRemoteDNS", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 RouteOnly 的本地化字符串。
+ ///
+ public static string TbSettingsRouteOnly {
+ get {
+ return ResourceManager.GetString("TbSettingsRouteOnly", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 After modifying the following parameters, click Save to take effect 的本地化字符串。
+ ///
+ public static string TbSettingsSaveTip {
+ get {
+ return ResourceManager.GetString("TbSettingsSaveTip", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Set Win10 UWP Loopback 的本地化字符串。
+ ///
+ public static string TbSettingsSetUWP {
+ get {
+ return ResourceManager.GetString("TbSettingsSetUWP", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Turn on Sniffing 的本地化字符串。
+ ///
+ public static string TbSettingsSniffingEnabled {
+ get {
+ return ResourceManager.GetString("TbSettingsSniffingEnabled", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Socks Port 的本地化字符串。
+ ///
+ public static string TbSettingsSocksPort {
+ get {
+ return ResourceManager.GetString("TbSettingsSocksPort", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Start on boot 的本地化字符串。
+ ///
+ public static string TbSettingsStartBoot {
+ get {
+ return ResourceManager.GetString("TbSettingsStartBoot", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Enable Statistics (Require restart) 的本地化字符串。
+ ///
+ public static string TbSettingsStatistics {
+ get {
+ return ResourceManager.GetString("TbSettingsStatistics", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Statistics freshrate (second) 的本地化字符串。
+ ///
+ public static string TbSettingsStatisticsFreshRate {
+ get {
+ return ResourceManager.GetString("TbSettingsStatisticsFreshRate", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Subscription conversion Url 的本地化字符串。
+ ///
+ public static string TbSettingsSubConvert {
+ get {
+ return ResourceManager.GetString("TbSettingsSubConvert", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 System proxy settings 的本地化字符串。
+ ///
+ public static string TbSettingsSystemproxy {
+ get {
+ return ResourceManager.GetString("TbSettingsSystemproxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Enable Security Protocol TLS v1.3 (subscription/update) 的本地化字符串。
+ ///
+ public static string TbSettingsTLS13 {
+ get {
+ return ResourceManager.GetString("TbSettingsTLS13", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Tray right-click menu servers display limit 的本地化字符串。
+ ///
+ public static string TbSettingsTrayMenuServersLimit {
+ get {
+ return ResourceManager.GetString("TbSettingsTrayMenuServersLimit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 TunMode settings 的本地化字符串。
+ ///
+ public static string TbSettingsTunMode {
+ get {
+ return ResourceManager.GetString("TbSettingsTunMode", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Direct IP CIDR, separated by commas (,) 的本地化字符串。
+ ///
+ public static string TbSettingsTunModeDirectIP {
+ get {
+ return ResourceManager.GetString("TbSettingsTunModeDirectIP", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Direct Process name, separated by commas (,) 的本地化字符串。
+ ///
+ public static string TbSettingsTunModeDirectProcess {
+ get {
+ return ResourceManager.GetString("TbSettingsTunModeDirectProcess", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Show console 的本地化字符串。
+ ///
+ public static string TbSettingsTunModeShowWindow {
+ get {
+ return ResourceManager.GetString("TbSettingsTunModeShowWindow", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Enable UDP 的本地化字符串。
+ ///
+ public static string TbSettingsUdpEnabled {
+ get {
+ return ResourceManager.GetString("TbSettingsUdpEnabled", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Auth user 的本地化字符串。
+ ///
+ public static string TbSettingsUser {
+ get {
+ return ResourceManager.GetString("TbSettingsUser", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 SNI 的本地化字符串。
+ ///
+ public static string TbSNI {
+ get {
+ return ResourceManager.GetString("TbSNI", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 TLS 的本地化字符串。
+ ///
+ public static string TbStreamSecurity {
+ get {
+ return ResourceManager.GetString("TbStreamSecurity", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 Pac Mode 的本地化字符串。
+ ///
+ public static string TbSystemProxyPac {
+ get {
+ return ResourceManager.GetString("TbSystemProxyPac", resourceCulture);
+ }
+ }
+
///
/// 查找类似 The ping of current service: {0} ms 的本地化字符串。
///
- internal static string TestMeOutput {
+ public static string TestMeOutput {
get {
return ResourceManager.GetString("TestMeOutput", resourceCulture);
}
}
+ ///
+ /// 查找类似 Routing setting is changed 的本地化字符串。
+ ///
+ public static string TipChangeRouting {
+ get {
+ return ResourceManager.GetString("TipChangeRouting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 System proxy setting is changed 的本地化字符串。
+ ///
+ public static string TipChangeSystemProxy {
+ get {
+ return ResourceManager.GetString("TipChangeSystemProxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 *Default value tcp 的本地化字符串。
+ ///
+ public static string TipNetwork {
+ get {
+ return ResourceManager.GetString("TipNetwork", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 * After setting this value, an socks service will be started using V2ray to provide functions such as speed display 的本地化字符串。
+ ///
+ public static string TipPreSocksPort {
+ get {
+ return ResourceManager.GetString("TipPreSocksPort", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Too many servers, please open the main interface 的本地化字符串。
///
- internal static string TooManyServersTip {
+ public static string TooManyServersTip {
get {
return ResourceManager.GetString("TooManyServersTip", resourceCulture);
}
@@ -1009,7 +2764,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *tcp camouflage type 的本地化字符串。
///
- internal static string TransportHeaderTypeTip1 {
+ public static string TransportHeaderTypeTip1 {
get {
return ResourceManager.GetString("TransportHeaderTypeTip1", resourceCulture);
}
@@ -1018,7 +2773,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *kcp camouflage type 的本地化字符串。
///
- internal static string TransportHeaderTypeTip2 {
+ public static string TransportHeaderTypeTip2 {
get {
return ResourceManager.GetString("TransportHeaderTypeTip2", resourceCulture);
}
@@ -1027,7 +2782,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *QUIC camouflage type 的本地化字符串。
///
- internal static string TransportHeaderTypeTip3 {
+ public static string TransportHeaderTypeTip3 {
get {
return ResourceManager.GetString("TransportHeaderTypeTip3", resourceCulture);
}
@@ -1036,7 +2791,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *grpc mode 的本地化字符串。
///
- internal static string TransportHeaderTypeTip4 {
+ public static string TransportHeaderTypeTip4 {
get {
return ResourceManager.GetString("TransportHeaderTypeTip4", resourceCulture);
}
@@ -1045,7 +2800,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *ws path 的本地化字符串。
///
- internal static string TransportPathTip1 {
+ public static string TransportPathTip1 {
get {
return ResourceManager.GetString("TransportPathTip1", resourceCulture);
}
@@ -1054,7 +2809,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *h2 path 的本地化字符串。
///
- internal static string TransportPathTip2 {
+ public static string TransportPathTip2 {
get {
return ResourceManager.GetString("TransportPathTip2", resourceCulture);
}
@@ -1063,7 +2818,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *QUIC key/Kcp seed 的本地化字符串。
///
- internal static string TransportPathTip3 {
+ public static string TransportPathTip3 {
get {
return ResourceManager.GetString("TransportPathTip3", resourceCulture);
}
@@ -1072,7 +2827,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *grpc serviceName 的本地化字符串。
///
- internal static string TransportPathTip4 {
+ public static string TransportPathTip4 {
get {
return ResourceManager.GetString("TransportPathTip4", resourceCulture);
}
@@ -1081,7 +2836,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *Kcp seed 的本地化字符串。
///
- internal static string TransportPathTip5 {
+ public static string TransportPathTip5 {
get {
return ResourceManager.GetString("TransportPathTip5", resourceCulture);
}
@@ -1090,7 +2845,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *http host Separated by commas (,) 的本地化字符串。
///
- internal static string TransportRequestHostTip1 {
+ public static string TransportRequestHostTip1 {
get {
return ResourceManager.GetString("TransportRequestHostTip1", resourceCulture);
}
@@ -1099,7 +2854,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *ws host 的本地化字符串。
///
- internal static string TransportRequestHostTip2 {
+ public static string TransportRequestHostTip2 {
get {
return ResourceManager.GetString("TransportRequestHostTip2", resourceCulture);
}
@@ -1108,7 +2863,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。
///
- internal static string TransportRequestHostTip3 {
+ public static string TransportRequestHostTip3 {
get {
return ResourceManager.GetString("TransportRequestHostTip3", resourceCulture);
}
@@ -1117,7 +2872,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 *QUIC securty 的本地化字符串。
///
- internal static string TransportRequestHostTip4 {
+ public static string TransportRequestHostTip4 {
get {
return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture);
}
@@ -1126,7 +2881,7 @@ namespace v2rayN.Resx {
///
/// 查找类似 Ungrouped 的本地化字符串。
///
- internal static string UngroupedServers {
+ public static string UngroupedServers {
get {
return ResourceManager.GetString("UngroupedServers", resourceCulture);
}
diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx
index a5d0f6da..ac226435 100644
--- a/v2rayN/v2rayN/Resx/ResUI.resx
+++ b/v2rayN/v2rayN/Resx/ResUI.resx
@@ -208,7 +208,7 @@
Type
- Subs
+ Subs group
Test Results
@@ -295,7 +295,7 @@
non-standard service, this feature is invalid
- Core not found({0}), please download: {1}
+ The Core file (file name: {1}) was not found under the folder ({0}), please download and put it in the folder, download address: {2}
Scan completed, no valid QR code found
@@ -371,10 +371,10 @@
{0},One of the required.
- remarks
+ Remarks
- Url
+ Url(Optional)
Count
@@ -389,7 +389,7 @@
Download GeoFile: {0} successfully
- Information (Filter : {0})
+ Information
Custom Icon
@@ -458,7 +458,7 @@
System proxy
- Speed Test...
+ Testing...
Too many servers, please open the main interface
@@ -470,9 +470,594 @@
Local
- Servers (Filter : {0})
+ Servers Filter
Normal use of this version requires .NET Framework 4.8
+
+ Check Update
+
+
+ Close
+
+
+ Exit
+
+
+ GlobalHotkeySetting
+
+
+ Help
+
+
+ OptionSetting
+
+
+ Promotion
+
+
+ Reload
+
+
+ RoutingSetting
+
+
+ Servers
+
+
+ Setting
+
+
+ Update current subscription without proxy
+
+
+ Update current subscription with proxy
+
+
+ Subscription group
+
+
+ Subscription group Setting
+
+
+ Update subscription without proxy
+
+
+ Update subscription with proxy
+
+
+ System proxy
+
+
+ Clear system proxy
+
+
+ Do not change system proxy
+
+
+ Pac Mode
+
+
+ Set system proxy
+
+
+ Color
+
+
+ Dark Mode
+
+
+ Language
+
+
+ Import bulk URL from clipboard (Ctrl+V)
+
+
+ Scan QR code on the screen (Ctrl+S)
+
+
+ Clone selected server
+
+
+ Remove duplicate servers
+
+
+ Remove selected servers (Delete)
+
+
+ Set as active server (Enter)
+
+
+ Clear all service statistics
+
+
+ Test servers ping (Ctrl+P)
+
+
+ Test servers real delay (Ctrl+R)
+
+
+ Sort by test result
+
+
+ Test servers download speed (Ctrl+T)
+
+
+ Test servers with tcping (Ctrl+O)
+
+
+ Test current service status
+
+
+ Export selected server for client configuration
+
+
+ Export selected server for server configuration
+
+
+ Export share URLs to clipboard (Ctrl+C)
+
+
+ Export subscription (base64) share to clipboard
+
+
+ Add a custom configuration server
+
+
+ Add [Shadowsocks] server
+
+
+ Add [Socks] server
+
+
+ Add [Trojan] server
+
+
+ Add [VLESS] server
+
+
+ Add [VMess] server
+
+
+ Select All (Ctrl+A)
+
+
+ Clear All
+
+
+ Copy (Ctrl+C)
+
+
+ Copy All
+
+
+ Set message filters
+
+
+ Select All (Ctrl+A)
+
+
+ Add
+
+
+ Delete
+
+
+ Edit
+
+
+ Share
+
+
+ Enabled Update
+
+
+ Sort
+
+
+ User Agent
+
+
+ Cancel
+
+
+ Confirm
+
+
+ Transport
+
+
+ Address
+
+
+ AllowInsecure
+
+
+ Alpn
+
+
+ AlterId
+
+
+ Fingerprint
+
+
+ Camouflage type
+
+
+ UUID(id)
+
+
+ Transport protocol(network)
+
+
+ Path
+
+
+ Port
+
+
+ Alias (remarks)
+
+
+ Camouflage domain(host)
+
+
+ Encryption method (security)
+
+
+ SNI
+
+
+ TLS
+
+
+ *Default value tcp
+
+
+ Core Type
+
+
+ Flow
+
+
+ Generate
+
+
+ Password
+
+
+ Password(Optional)
+
+
+ UUID(id)
+
+
+ Encryption
+
+
+ User(Optional)
+
+
+ Encryption
+
+
+ txtPreSocksPort
+
+
+ * After setting this value, an socks service will be started using V2ray to provide functions such as speed display
+
+
+ Browse
+
+
+ Edit
+
+
+ Advanced proxy settings, protocol selection (optional)
+
+
+ Allow connections from the LAN
+
+
+ Auto hide startup
+
+
+ Automatic latency test interval (minutes)
+
+
+ Automatic update interval of subscriptions (hours)
+
+
+ Automatic update interval of and Geo (hours)
+
+
+ Core: basic settings
+
+
+ Core: DNS settings
+
+
+ Core: KCP settings
+
+
+ CoreType settings
+
+
+ AllowInsecure
+
+
+ Outbound Freedom domainStrategy
+
+
+ Automatically adjust column width after updating subscription
+
+
+ Check for pre-release updates
+
+
+ Exception
+
+
+ Exception. Do not use proxy server for addresses beginning with,Use semicolon (;)
+
+
+ Http Port
+
+
+ Ignore Geo files when updating core
+
+
+ Enable IPv6
+
+
+ Keep older when deduplication
+
+
+ Record local logs
+
+
+ Log Level
+
+
+ Turn on Mux Multiplexing
+
+
+ v2rayN settings
+
+
+ Pac listen port
+
+
+ Auth pass
+
+
+ Custom DNS (multiple, separated by commas (,))
+
+
+ After modifying the following parameters, click Save to take effect
+
+
+ Set Win10 UWP Loopback
+
+
+ Turn on Sniffing
+
+
+ Socks Port
+
+
+ Start on boot
+
+
+ Enable Statistics (Require restart)
+
+
+ Statistics freshrate (second)
+
+
+ Subscription conversion Url
+
+
+ System proxy settings
+
+
+ Enable Security Protocol TLS v1.3 (subscription/update)
+
+
+ Tray right-click menu servers display limit
+
+
+ Enable UDP
+
+
+ Auth user
+
+
+ Clear system proxy
+
+
+ Display GUI
+
+
+ GlobalHotkey Setting
+
+
+ Set directly by pressing the keyboard, Take effect after restart
+
+
+ Do not change system proxy
+
+
+ Reset
+
+
+ Set system proxy
+
+
+ Pac Mode
+
+
+ Share Server (Ctrl+D)
+
+
+ Routing
+
+
+ Not Run As Admin
+
+
+ Run As Admin
+
+
+ Move to bottom (B)
+
+
+ Down (D)
+
+
+ Move to top (T)
+
+
+ Up (U)
+
+
+ Filter, support regular
+
+
+ {0} Website
+
+
+ Advanced Function
+
+
+ Add
+
+
+ Import Advanced Rules
+
+
+ Remove selected
+
+
+ Set as active rule
+
+
+ Basic Function
+
+
+ Import Basic Rules
+
+
+ Domain Matcher
+
+
+ Domain strategy
+
+
+ Enable advanced function
+
+
+ 3.Block Domain or IP
+
+
+ 2.Direct Domain or IP
+
+
+ 1.Proxy Domain or IP
+
+
+ Pre-defined Rule Set List
+
+
+ *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA>
+
+
+ Import Rules From Clipboard
+
+
+ Import Rules From File
+
+
+ Import Rules From Sub Url
+
+
+ Rule Setting
+
+
+ Rule Add
+
+
+ Export Selected Rules
+
+
+ Rule List
+
+
+ Remove Rules
+
+
+ RoutingRuleDetailsSetting
+
+
+ Domain and ip are auto sorted when saving
+
+
+ Ruleobject Doc
+
+
+ Support DnsObject
+
+
+ Group please leave blank here
+
+
+ Routing setting is changed
+
+
+ System proxy setting is changed
+
+
+ RouteOnly
+
+
+ One-click test Latency and speed (Ctrl+E)
+
+
+ Delay(ms)
+
+
+ Speed(M/s)
+
+
+ Failed to run Core, please see the log
+
+
+ Remarks regular filter
+
+
+ Display Log
+
+
+ Import old config guiNConfig
+
+
+ Enable Tun
+
+
+ New Port for LAN
+
+
+ TunMode settings
+
+
+ Direct IP CIDR, separated by commas (,)
+
+
+ Direct Process name, separated by commas (,)
+
+
+ Show console
+
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.Designer.cs
deleted file mode 100644
index e69de29b..00000000
diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx
index 6d42102b..5f1122ac 100644
--- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx
+++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx
@@ -208,7 +208,7 @@
类型
- 订阅
+ 订阅分组
测试结果
@@ -295,7 +295,7 @@
非标准服务,此功能无效
- 找不到Core(文件名:{0}),下载地址: {1}
+ 在文件夹 ({0}) 下未找到Core文件 (文件名:{1}),请下载后放入文件夹,下载地址: {2}
扫描完成,未发现有效二维码
@@ -374,7 +374,7 @@
别名
- 地址(Url)
+ 可选地址(Url)
数量
@@ -389,7 +389,7 @@
下载 GeoFile: {0} 成功
- 信息 (过滤器 : {0})
+ 信息
自定义图标
@@ -434,7 +434,7 @@
*grpc 模式
- 传输层安全
+ TLS
*Kcp seed
@@ -458,7 +458,7 @@
系统代理
- 测速中...
+ 测试中...
服务器太多,请打开主界面操作
@@ -470,9 +470,594 @@
本地
- 服务器 (过滤器 : {0})
+ 服务器过滤器
正常使用此版本需要.NET Framework 4.8,请更新后重启
+
+ 检查更新
+
+
+ 关闭
+
+
+ 退出
+
+
+ 全局热键设置
+
+
+ 帮助
+
+
+ 参数设置
+
+
+ 推广
+
+
+ 重启服务
+
+
+ 路由设置
+
+
+ 服务器
+
+
+ 设置
+
+
+ 更新当前订阅(不通过代理)
+
+
+ 更新当前订阅(通过代理)
+
+
+ 订阅分组
+
+
+ 订阅分组设置
+
+
+ 更新全部订阅(不通过代理)
+
+
+ 更新全部订阅(通过代理)
+
+
+ 系统代理
+
+
+ 清除系统代理
+
+
+ 不改变系统代理
+
+
+ Pac模式
+
+
+ 自动配置系统代理
+
+
+ 颜色
+
+
+ 暗黑模式
+
+
+ 语言
+
+
+ 从剪贴板导入批量URL (Ctrl+V)
+
+
+ 扫描屏幕上的二维码 (Ctrl+S)
+
+
+ 克隆所选服务器
+
+
+ 移除重复的服务器
+
+
+ 移除所选服务器(多选) (Delete)
+
+
+ 设为活动服务器 (Enter)
+
+
+ 清除所有服务统计数据
+
+
+ 测试服务器延迟Ping(多选) (Ctrl+P)
+
+
+ 测试服务器真连接延迟(多选) (Ctrl+R)
+
+
+ 按测试结果排序
+
+
+ 测试服务器速度(多选) (Ctrl+T)
+
+
+ 测试服务器延迟Tcping(多选) (Ctrl+O)
+
+
+ 测试当前服务状态
+
+
+ 导出所选服务器为客户端配置
+
+
+ 导出所选服务器为服务端配置
+
+
+ 批量导出分享URL至剪贴板(多选) (Ctrl+C)
+
+
+ 批量导出订阅内容至剪贴板(多选)
+
+
+ 添加自定义配置服务器
+
+
+ 添加[Shadowsocks]服务器
+
+
+ 添加[Socks]服务器
+
+
+ 添加[Trojan]服务器
+
+
+ 添加[VLESS]服务器
+
+
+ 添加[VMess]服务器
+
+
+ 全选 (Ctrl+A)
+
+
+ 清除所有
+
+
+ 复制 (Ctrl+C)
+
+
+ 复制所有
+
+
+ 设置信息过滤器
+
+
+ 全选 (Ctrl+A)
+
+
+ 添加
+
+
+ 删除
+
+
+ 编辑
+
+
+ 分享
+
+
+ 启用更新
+
+
+ 排序
+
+
+ User Agent(可选)
+
+
+ 取消
+
+
+ 确定
+
+
+ 底层传输方式(transport)
+
+
+ 地址(address)
+
+
+ 跳过证书验证(allowInsecure)
+
+
+ Alpn
+
+
+ 额外ID(alterId)
+
+
+ Fingerprint
+
+
+ 伪装类型(type)
+
+
+ 用户ID(id)
+
+
+ 传输协议(network)
+
+
+ 路径(path)
+
+
+ 端口(port)
+
+
+ 别名(remarks)
+
+
+ 伪装域名(host)
+
+
+ 加密方式(security)
+
+
+ SNI
+
+
+ TLS
+
+
+ *默认tcp,选错会无法连接
+
+
+ Core类型
+
+
+ 流控(flow)
+
+
+ 生成
+
+
+ 密码(password)
+
+
+ 密码(可选)
+
+
+ 用户ID(id)
+
+
+ 加密方式(encryption)
+
+
+ 用户名(可选)
+
+
+ 加密方式(encryption)
+
+
+ Socks端口
+
+
+ * 自定义配置的Socks端口值,可不设置;当设置此值后,将使用V2ray-core额外启动一个前置Socks服务,提供分流和速度显示等功能
+
+
+ 浏览
+
+
+ 编辑
+
+
+ 高级代理设置, 协议选择(可选)
+
+
+ 允许来自局域网的连接
+
+
+ 启动后隐藏窗口
+
+
+ 自动延迟测试的间隔 (单位分钟)
+
+
+ 自动更新订阅的间隔(单位小时)
+
+
+ 自动更新Geo文件的间隔(单位小时)
+
+
+ Core: 基础设置
+
+
+ Core: DNS设置
+
+
+ Core: KCP设置
+
+
+ Core类型设置
+
+
+ 默认跳过证书验证(allowInsecure)
+
+
+ Outbound Freedom domainStrategy
+
+
+ 自动调整服务器列宽在更新订阅后
+
+
+ 检查Pre-Release更新(请谨慎启用)
+
+
+ 例外
+
+
+ 例外. 对于下列字符开头的地址不使用代理配置文件:使用分号(;)分隔
+
+
+ 本地http监听端口
+
+
+ 更新Core时忽略Geo文件
+
+
+ 启用IPv6
+
+
+ 去重时保留序号较小的项
+
+
+ 记录本地日志(默认关闭)
+
+
+ 日志等级
+
+
+ 开启Mux多路复用
+
+
+ v2rayN 设置
+
+
+ Pac监听端口号
+
+
+ 认证密码
+
+
+ 自定义DNS(可多个,用逗号(,)隔开)
+
+
+ 修改以下参数后,点击保存才生效
+
+
+ 解除Win10 UWP应用回环代理限制
+
+
+ 开启流量探测
+
+
+ 本地socks监听端口
+
+
+ 开机启动(可能会不成功)
+
+
+ 启用统计(实时网速显示,需要重启)
+
+
+ 统计刷新频率(单位秒)
+
+
+ 订阅转换网址(可选)
+
+
+ 系统代理设置
+
+
+ 启用安全协议TLS v1.3 (订阅/检查更新)
+
+
+ 托盘右键菜单服务器展示数量限制
+
+
+ 开启UDP
+
+
+ 认证用户名
+
+
+ 清除系统代理
+
+
+ 显示主界面
+
+
+ 全局热键设置
+
+
+ 直接按键盘进行设置, 重启后生效
+
+
+ 不改变系统代理
+
+
+ 重置
+
+
+ 自动配置系统代理
+
+
+ Pac模式
+
+
+ 分享服务器 (Ctrl+D)
+
+
+ 路由
+
+
+ 非以管理员身份运行
+
+
+ 以管理员身份运行
+
+
+ 下移至底 (B)
+
+
+ 下移 (D)
+
+
+ 上移至顶 (T)
+
+
+ 上移 (U)
+
+
+ 过滤器, 支持正则
+
+
+ {0} 官网
+
+
+ 高级功能
+
+
+ 添加规则集
+
+
+ 一键导入高级规则
+
+
+ 移除所选规则
+
+
+ 设为活动规则
+
+
+ 基础功能
+
+
+ 一键导入基础规则
+
+
+ 域名匹配算法
+
+
+ 域名解析策略
+
+
+ 启用路由高级功能
+
+
+ 3.阻止的Domain或IP
+
+
+ 2.直连的Domain或IP
+
+
+ 1.代理的Domain或IP
+
+
+ 预定义规则集列表
+
+
+ *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代
+
+
+ 从剪贴板中导入规则
+
+
+ 从文件中导入规则
+
+
+ 从订阅Url中导入规则
+
+
+ 规则集设置
+
+
+ 添加规则
+
+
+ 导出所选规则至剪贴板
+
+
+ 规则列表
+
+
+ 移除所选规则
+
+
+ 路由规则详情设置
+
+
+ 保存时Domain和IP自动排序
+
+
+ 规则详细说明文档
+
+
+ 支持填写DnsObject,JSON格式
+
+
+ 普通分组此处请留空
+
+
+ 路由设置改变
+
+
+ 系统代理设置改变
+
+
+ RouteOnly
+
+
+ 一键测试延迟和速度 (Ctrl+E)
+
+
+ 延迟(ms)
+
+
+ 速度(M/s)
+
+
+ 运行Core失败,请看日志
+
+
+ 别名正则过滤
+
+
+ 显示日志
+
+
+ 导入旧的配置文件guiNConfig
+
+
+ 启用Tun模式
+
+
+ 为局域网开启新的端口
+
+
+ Tun模式设置
+
+
+ 直连的IP CIDR,用逗号(,)分隔
+
+
+ 直连的进程名,用逗号(,)分隔
+
+
+ 显示控制台
+
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig
similarity index 100%
rename from v2rayN/v2rayN/Sample/SampleClientConfig.txt
rename to v2rayN/v2rayN/Sample/SampleClientConfig
diff --git a/v2rayN/v2rayN/Sample/SampleHttprequest.txt b/v2rayN/v2rayN/Sample/SampleHttprequest
similarity index 100%
rename from v2rayN/v2rayN/Sample/SampleHttprequest.txt
rename to v2rayN/v2rayN/Sample/SampleHttprequest
diff --git a/v2rayN/v2rayN/Sample/SampleHttpresponse.txt b/v2rayN/v2rayN/Sample/SampleHttpresponse
similarity index 100%
rename from v2rayN/v2rayN/Sample/SampleHttpresponse.txt
rename to v2rayN/v2rayN/Sample/SampleHttpresponse
diff --git a/v2rayN/v2rayN/Sample/SampleInbound.txt b/v2rayN/v2rayN/Sample/SampleInbound
similarity index 100%
rename from v2rayN/v2rayN/Sample/SampleInbound.txt
rename to v2rayN/v2rayN/Sample/SampleInbound
diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig
similarity index 100%
rename from v2rayN/v2rayN/Sample/SampleServerConfig.txt
rename to v2rayN/v2rayN/Sample/SampleServerConfig
diff --git a/v2rayN/v2rayN/Sample/tun_singbox b/v2rayN/v2rayN/Sample/tun_singbox
new file mode 100644
index 00000000..0a05d626
--- /dev/null
+++ b/v2rayN/v2rayN/Sample/tun_singbox
@@ -0,0 +1,111 @@
+{
+ "dns": {
+ "servers": [
+ {
+ "tag": "google",
+ "address": "tls://8.8.8.8"
+ },
+ {
+ "tag": "local",
+ "address": "223.5.5.5",
+ "detour": "direct"
+ },
+ {
+ "tag": "block",
+ "address": "rcode://success"
+ }
+ ],
+ "rules": [
+ {
+ "geosite": "category-ads-all",
+ "server": "block",
+ "disable_cache": true
+ }
+ ],
+ "strategy": "ipv4_only"
+ },
+ "inbounds": [
+ {
+ "type": "tun",
+ "interface_name": "singbox_tun",
+ "inet4_address": "172.19.0.1/30",
+
+ "mtu": $mtu$,
+ "auto_route": true,
+ "strict_route": $strict_route$,
+ "stack": "$stack$",
+ "endpoint_independent_nat": true,
+ "sniff": true
+ }
+ ],
+ "outbounds": [
+ {
+ "type": "socks",
+ "tag": "proxy",
+ "udp_fragment": true,
+ "server": "127.0.0.1",
+ "server_port": $socksPort$
+ },
+ {
+ "type": "block",
+ "tag": "block"
+ },
+ {
+ "type": "direct",
+ "tag": "direct"
+ },
+ {
+ "type": "dns",
+ "tag": "dns_out"
+ }
+ ],
+ "route": {
+ "auto_detect_interface": true,
+ "rules": [
+ {
+ "inbound": "dns_in",
+ "outbound": "dns_out"
+ },
+ {
+ "protocol": "dns",
+ "outbound": "dns_out"
+ },
+ {
+ "network": "udp",
+ "port": [
+ 135,
+ 137,
+ 138,
+ 139,
+ 5353
+ ],
+ "outbound": "block"
+ },
+ {
+ "ip_cidr": [
+ "224.0.0.0/3",
+ "ff00::/8"
+ ],
+ "outbound": "block"
+ },
+ {
+ "source_ip_cidr": [
+ "224.0.0.0/3",
+ "ff00::/8"
+ ],
+ "outbound": "block"
+ },
+ {
+ "port": 53,
+ "process_name": [ $dnsProcessName$],
+ "outbound": "dns_out"
+ },
+ {
+ "process_name": [ $directProcessName$],
+ "outbound": "direct"
+ }
+ $ruleDirectIPs$
+ $ruleDirectProcess$
+ ]
+ }
+}
\ No newline at end of file
diff --git a/v2rayN/v2rayN/Tool/FileManager.cs b/v2rayN/v2rayN/Tool/FileManager.cs
index 42dffbd6..c3d45263 100644
--- a/v2rayN/v2rayN/Tool/FileManager.cs
+++ b/v2rayN/v2rayN/Tool/FileManager.cs
@@ -1,5 +1,4 @@
-using System;
-using System.IO;
+using System.IO;
using System.IO.Compression;
using System.Text;
@@ -68,7 +67,7 @@ namespace v2rayN.Tool
throw ex;
}
}
- public static bool ZipExtractToFile(string fileName, string ignoredName)
+ public static bool ZipExtractToFile(string fileName, string toPath, string ignoredName)
{
try
{
@@ -86,7 +85,7 @@ namespace v2rayN.Tool
{
continue;
}
- entry.ExtractToFile(Utils.GetPath(entry.Name), true);
+ entry.ExtractToFile(Path.Combine(toPath, entry.Name), true);
}
catch (IOException ex)
{
@@ -94,36 +93,6 @@ namespace v2rayN.Tool
}
}
}
- if (File.Exists(fileName))
- {
- File.Delete(fileName);
- }
- }
- catch (Exception ex)
- {
- Utils.SaveLog(ex.Message, ex);
- return false;
- }
- return true;
- }
-
- public static bool ZipExtractToFullFile(string fileName)
- {
- try
- {
- using (ZipArchive archive = ZipFile.OpenRead(fileName))
- {
- foreach (ZipArchiveEntry entry in archive.Entries)
- {
- if (entry.Length == 0)
- continue;
-
- string entryOuputPath = Utils.GetPath(entry.FullName);
- FileInfo fileInfo = new FileInfo(entryOuputPath);
- fileInfo.Directory.Create();
- entry.ExtractToFile(entryOuputPath, true);
- }
- }
}
catch (Exception ex)
{
diff --git a/v2rayN/v2rayN/Tool/Job.cs b/v2rayN/v2rayN/Tool/Job.cs
index e2569b75..8f9351b7 100644
--- a/v2rayN/v2rayN/Tool/Job.cs
+++ b/v2rayN/v2rayN/Tool/Job.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Diagnostics;
+using System.Diagnostics;
using System.Runtime.InteropServices;
@@ -34,7 +33,7 @@ namespace v2rayN
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr,
- (uint) length))
+ (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}",
Marshal.GetLastWin32Error()));
}
diff --git a/v2rayN/v2rayN/Tool/Logging.cs b/v2rayN/v2rayN/Tool/Logging.cs
index 400e84a5..6759a2d4 100644
--- a/v2rayN/v2rayN/Tool/Logging.cs
+++ b/v2rayN/v2rayN/Tool/Logging.cs
@@ -1,11 +1,7 @@
-using log4net;
-using log4net.Appender;
-using log4net.Core;
-using log4net.Layout;
-using log4net.Repository.Hierarchy;
-using System;
+using NLog;
+using NLog.Config;
+using NLog.Targets;
using System.IO;
-using System.Threading.Tasks;
namespace v2rayN.Tool
{
@@ -13,32 +9,13 @@ namespace v2rayN.Tool
{
public static void Setup()
{
- var hierarchy = (Hierarchy)LogManager.GetRepository();
-
- var patternLayout = new PatternLayout
- {
- ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"
- };
- patternLayout.ActivateOptions();
-
- var roller = new RollingFileAppender
- {
- AppendToFile = true,
- RollingStyle = RollingFileAppender.RollingMode.Date,
- DatePattern = "yyyy-MM-dd'.txt'",
- File = Utils.GetPath(@"guiLogs\"),
- Layout = patternLayout,
- StaticLogFileName = false
- };
- roller.ActivateOptions();
- hierarchy.Root.AddAppender(roller);
-
- var memory = new MemoryAppender();
- memory.ActivateOptions();
- hierarchy.Root.AddAppender(memory);
-
- hierarchy.Root.Level = Level.Debug;
- hierarchy.Configured = true;
+ LoggingConfiguration config = new LoggingConfiguration();
+ FileTarget fileTarget = new FileTarget();
+ config.AddTarget("file", fileTarget);
+ fileTarget.Layout = "${longdate}-${level:uppercase=true} ${message}";
+ fileTarget.FileName = Utils.GetLogPath("${shortdate}.txt");
+ config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, fileTarget));
+ LogManager.Configuration = config;
}
public static void ClearLogs()
@@ -48,7 +25,7 @@ namespace v2rayN.Tool
try
{
var now = DateTime.Now.AddMonths(-1);
- var dir = Utils.GetPath(@"guiLogs\");
+ var dir = Utils.GetLogPath();
var files = Directory.GetFiles(dir, "*.txt");
foreach (var filePath in files)
{
diff --git a/v2rayN/v2rayN/Tool/QueryableExtension.cs b/v2rayN/v2rayN/Tool/QueryableExtension.cs
index eefb04d2..b75eb9fb 100644
--- a/v2rayN/v2rayN/Tool/QueryableExtension.cs
+++ b/v2rayN/v2rayN/Tool/QueryableExtension.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Linq;
-using System.Linq.Expressions;
+using System.Linq.Expressions;
using System.Reflection;
namespace v2rayN.Tool
diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs
index 2edd4ece..bb9382cc 100644
--- a/v2rayN/v2rayN/Tool/Utils.cs
+++ b/v2rayN/v2rayN/Tool/Utils.cs
@@ -1,30 +1,32 @@
using Microsoft.Win32;
using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
+using Newtonsoft.Json.Linq;
+using NLog;
using System.Diagnostics;
+using System.Drawing;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Reflection;
+using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
+using System.Security.Cryptography;
+using System.Security.Principal;
using System.Text;
using System.Text.RegularExpressions;
+using System.Web;
using System.Windows.Forms;
-using System.Drawing;
+using System.Windows.Interop;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using v2rayN.Base;
+using v2rayN.Mode;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
-using System.Security.Principal;
-using v2rayN.Base;
-using Newtonsoft.Json.Linq;
-using System.Web;
-using log4net;
-using System.Linq;
-using System.Security.Cryptography;
-using System.Runtime.InteropServices;
+using ZXing.Windows.Compatibility;
namespace v2rayN
{
@@ -91,12 +93,16 @@ namespace v2rayN
{
try
{
+ if (string.IsNullOrEmpty(strJson))
+ {
+ return default;
+ }
T obj = JsonConvert.DeserializeObject(strJson);
return obj;
}
catch
{
- return JsonConvert.DeserializeObject("");
+ return default;
}
}
@@ -105,14 +111,21 @@ namespace v2rayN
///
///
///
- public static string ToJson(Object obj)
+ public static string ToJson(Object obj, bool indented = true)
{
string result = string.Empty;
try
{
- result = JsonConvert.SerializeObject(obj,
+ if (indented)
+ {
+ result = JsonConvert.SerializeObject(obj,
Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
+ }
+ else
+ {
+ result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
+ }
}
catch (Exception ex)
{
@@ -165,8 +178,7 @@ namespace v2rayN
}
catch (Exception ex)
{
- SaveLog(ex.Message, ex);
-
+ //SaveLog(ex.Message, ex);
return null;
}
}
@@ -340,18 +352,19 @@ namespace v2rayN
/// bytes
/// 转换之后的数据
/// 单位
- public static void ToHumanReadable(ulong amount, out double result, out string unit)
+ public static void ToHumanReadable(long amount, out double result, out string unit)
{
uint factor = 1024u;
- ulong KBs = amount / factor;
+ //long KBs = amount / factor;
+ long KBs = amount;
if (KBs > 0)
{
// multi KB
- ulong MBs = KBs / factor;
+ long MBs = KBs / factor;
if (MBs > 0)
{
// multi MB
- ulong GBs = MBs / factor;
+ long GBs = MBs / factor;
if (GBs > 0)
{
// multi GB
@@ -382,14 +395,12 @@ namespace v2rayN
}
}
- public static string HumanFy(ulong amount)
+ public static string HumanFy(long amount)
{
ToHumanReadable(amount, out double result, out string unit);
return $"{string.Format("{0:f1}", result)} {unit}";
}
-
-
public static string UrlEncode(string url)
{
return Uri.EscapeDataString(url);
@@ -412,6 +423,13 @@ namespace v2rayN
}
return sb.ToString();
}
+ public static ImageSource IconToImageSource(Icon icon)
+ {
+ return Imaging.CreateBitmapSourceFromHIcon(
+ icon.Handle,
+ new System.Windows.Int32Rect(0, 0, icon.Width, icon.Height),
+ BitmapSizeOptions.FromEmptyOptions());
+ }
public static string GetPunycode(string url)
{
@@ -466,7 +484,7 @@ namespace v2rayN
///
///
///
- public static bool IsNullOrEmpty(string text)
+ public static bool IsNullOrEmpty(string? text)
{
if (string.IsNullOrEmpty(text))
{
@@ -569,28 +587,6 @@ namespace v2rayN
#region 开机自动启动
- private static string autoRunName
- {
- get
- {
- return $"v2rayNAutoRun_{GetMD5(StartupPath())}";
- }
- }
- private static string autoRunRegPath
- {
- get
- {
- return @"Software\Microsoft\Windows\CurrentVersion\Run";
- //if (Environment.Is64BitProcess)
- //{
- // return @"Software\Microsoft\Windows\CurrentVersion\Run";
- //}
- //else
- //{
- // return @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run";
- //}
- }
- }
///
/// 开机自动启动
@@ -602,7 +598,7 @@ namespace v2rayN
try
{
string exePath = GetExePath();
- RegWriteValue(autoRunRegPath, autoRunName, run ? $"\"{exePath}\"" : "");
+ RegWriteValue(Global.AutoRunRegPath, Global.AutoRunName, run ? $"\"{exePath}\"" : "");
}
catch (Exception ex)
{
@@ -619,12 +615,12 @@ namespace v2rayN
try
{
//clear
- if (!RegReadValue(autoRunRegPath, "v2rayNAutoRun", "").IsNullOrEmpty())
+ if (!RegReadValue(Global.AutoRunRegPath, Global.AutoRunName, "").IsNullOrEmpty())
{
- RegWriteValue(autoRunRegPath, "v2rayNAutoRun", "");
+ RegWriteValue(Global.AutoRunRegPath, Global.AutoRunName, "");
}
- string value = RegReadValue(autoRunRegPath, autoRunName, "");
+ string value = RegReadValue(Global.AutoRunRegPath, Global.AutoRunName, "");
string exePath = GetExePath();
if (value?.Equals(exePath) == true || value?.Equals($"\"{exePath}\"") == true)
{
@@ -737,76 +733,32 @@ namespace v2rayN
}
}
- public static string MainMsgFilterKey
- {
- get
- {
- return $"MainMsgFilter_{GetMD5(StartupPath())}";
- }
- }
#endregion
#region 测速
- ///
- /// Ping
- ///
- ///
- ///
- public static long Ping(string host)
- {
- long roundtripTime = -1;
- try
- {
- int timeout = 30;
- int echoNum = 2;
- Ping pingSender = new Ping();
- for (int i = 0; i < echoNum; i++)
- {
- PingReply reply = pingSender.Send(host, timeout);
- if (reply.Status == IPStatus.Success)
- {
- if (reply.RoundtripTime < 0)
- {
- continue;
- }
- if (roundtripTime < 0 || reply.RoundtripTime < roundtripTime)
- {
- roundtripTime = reply.RoundtripTime;
- }
- }
- }
- }
- catch (Exception ex)
- {
- SaveLog(ex.Message, ex);
- return -1;
- }
- return roundtripTime;
- }
-
///
/// 取得本机 IP Address
///
///
- public static List GetHostIPAddress()
- {
- List lstIPAddress = new List();
- try
- {
- IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
- foreach (IPAddress ipa in IpEntry.AddressList)
- {
- if (ipa.AddressFamily == AddressFamily.InterNetwork)
- lstIPAddress.Add(ipa.ToString());
- }
- }
- catch (Exception ex)
- {
- SaveLog(ex.Message, ex);
- }
- return lstIPAddress;
- }
+ //public static List GetHostIPAddress()
+ //{
+ // List lstIPAddress = new List();
+ // try
+ // {
+ // IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
+ // foreach (IPAddress ipa in IpEntry.AddressList)
+ // {
+ // if (ipa.AddressFamily == AddressFamily.InterNetwork)
+ // lstIPAddress.Add(ipa.ToString());
+ // }
+ // }
+ // catch (Exception ex)
+ // {
+ // SaveLog(ex.Message, ex);
+ // }
+ // return lstIPAddress;
+ //}
public static void SetSecurityProtocol(bool enableSecurityProtocolTls13)
{
@@ -982,10 +934,6 @@ namespace v2rayN
}
}
- public static void AddSubItem(ListViewItem i, string name, string text)
- {
- i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text });
- }
public static string GetDownloadFileName(string url)
{
@@ -1013,6 +961,27 @@ namespace v2rayN
{
return Guid.TryParse(strSrc, out Guid g);
}
+ public static void ProcessStart(string fileName)
+ {
+ try
+ {
+ Process.Start(new ProcessStartInfo(fileName) { UseShellExecute = true });
+ }
+ catch (Exception ex)
+ {
+ SaveLog(ex.Message, ex);
+ }
+ }
+
+ public static void SetDarkBorder(System.Windows.Window window, bool dark)
+ {
+ // Make sure the handle is created before the window is shown
+ IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(window).EnsureHandle();
+ int attribute = dark ? 1 : 0;
+ uint attributeSize = (uint)Marshal.SizeOf(attribute);
+ DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ref attribute, attributeSize);
+ DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref attribute, attributeSize);
+ }
#endregion
#region TempPath
@@ -1072,6 +1041,39 @@ namespace v2rayN
return Path.Combine(_tempPath, filename);
}
}
+ public static string GetBinPath(string filename, ECoreType? coreType = null)
+ {
+ string _tempPath = Path.Combine(StartupPath(), "bin");
+ if (!Directory.Exists(_tempPath))
+ {
+ Directory.CreateDirectory(_tempPath);
+ }
+ if (coreType != null)
+ {
+ _tempPath = Path.Combine(_tempPath, coreType.ToString()!);
+ if (!Directory.Exists(_tempPath))
+ {
+ Directory.CreateDirectory(_tempPath);
+ }
+ }
+ return Path.Combine(_tempPath, filename);
+ }
+ public static string GetLogPath(string filename = "")
+ {
+ string _tempPath = Path.Combine(StartupPath(), "guiLogs");
+ if (!Directory.Exists(_tempPath))
+ {
+ Directory.CreateDirectory(_tempPath);
+ }
+ if (string.IsNullOrEmpty(filename))
+ {
+ return _tempPath;
+ }
+ else
+ {
+ return Path.Combine(_tempPath, filename);
+ }
+ }
#endregion
@@ -1085,8 +1087,12 @@ namespace v2rayN
public static void SaveLog(string strTitle, Exception ex)
{
var logger = LogManager.GetLogger("Log2");
- logger.Debug(strTitle);
- logger.Debug(ex);
+ logger.Debug($"{strTitle},{ex.Message}");
+ logger.Debug(ex.StackTrace);
+ if (ex != null && ex.InnerException != null)
+ {
+ logger.Error(ex.InnerException);
+ }
}
#endregion
@@ -1152,26 +1158,16 @@ namespace v2rayN
#region Windows API
- public static string WindowHwndKey
+
+ [Flags]
+ public enum DWMWINDOWATTRIBUTE : uint
{
- get
- {
- return $"WindowHwnd_{GetMD5(StartupPath())}";
- }
+ DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19,
+ DWMWA_USE_IMMERSIVE_DARK_MODE = 20,
}
- [DllImport("user32.dll")]
- public static extern bool SetProcessDPIAware();
-
- [DllImport("user32.dll")]
- public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
-
- [DllImport("user32.dll")]
- public static extern int SwitchToThisWindow(IntPtr hwnd, bool fUnknown);
-
- [DllImport("user32.dll")]
- public static extern bool IsWindow(IntPtr hwnd);
-
+ [DllImport("dwmapi.dll")]
+ public static extern int DwmSetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attribute, ref int attributeValue, uint attributeSize);
#endregion
}
diff --git a/v2rayN/v2rayN/ViewModels/AddServer2ViewModel.cs b/v2rayN/v2rayN/ViewModels/AddServer2ViewModel.cs
new file mode 100644
index 00000000..02f85c8e
--- /dev/null
+++ b/v2rayN/v2rayN/ViewModels/AddServer2ViewModel.cs
@@ -0,0 +1,157 @@
+using ReactiveUI;
+using ReactiveUI.Fody.Helpers;
+using ReactiveUI.Validation.Helpers;
+using Splat;
+using System.IO;
+using System.Reactive;
+using System.Windows;
+using System.Windows.Forms;
+using v2rayN.Base;
+using v2rayN.Handler;
+using v2rayN.Mode;
+using v2rayN.Resx;
+
+namespace v2rayN.ViewModels
+{
+ public class AddServer2ViewModel : ReactiveValidationObject
+ {
+ private static Config _config;
+ private NoticeHandler? _noticeHandler;
+ private Window _view;
+
+ [Reactive]
+ public ProfileItem SelectedSource { get; set; }
+
+
+ public ReactiveCommand BrowseServerCmd { get; }
+ public ReactiveCommand EditServerCmd { get; }
+ public ReactiveCommand SaveServerCmd { get; }
+
+ public AddServer2ViewModel(ProfileItem profileItem, Window view)
+ {
+ _noticeHandler = Locator.Current.GetService();
+ _config = LazyConfig.Instance.GetConfig();
+
+ if (profileItem.indexId.IsNullOrEmpty())
+ {
+ SelectedSource = profileItem;
+ }
+ else
+ {
+ SelectedSource = Utils.DeepCopy(profileItem);
+ }
+
+ _view = view;
+
+ BrowseServerCmd = ReactiveCommand.Create(() =>
+ {
+ BrowseServer();
+ });
+
+ EditServerCmd = ReactiveCommand.Create(() =>
+ {
+ EditServer();
+ });
+
+ SaveServerCmd = ReactiveCommand.Create(() =>
+ {
+ SaveServer();
+ });
+
+ }
+
+ private void SaveServer()
+ {
+ string remarks = SelectedSource.remarks;
+ if (Utils.IsNullOrEmpty(remarks))
+ {
+ UI.Show(ResUI.PleaseFillRemarks);
+ return;
+ }
+
+ if (Utils.IsNullOrEmpty(SelectedSource.address))
+ {
+ UI.Show(ResUI.FillServerAddressCustom);
+ return;
+ }
+
+ var item = LazyConfig.Instance.GetProfileItem(SelectedSource.indexId);
+ if (item is null)
+ {
+ item = SelectedSource;
+ }
+ else
+ {
+ item.remarks = SelectedSource.remarks;
+ item.address = SelectedSource.address;
+ item.coreType = SelectedSource.coreType;
+ item.preSocksPort = SelectedSource.preSocksPort;
+ }
+
+ if (ConfigHandler.EditCustomServer(ref _config, item) == 0)
+ {
+ _noticeHandler?.Enqueue(ResUI.OperationSuccess);
+ _view.DialogResult = true;
+ }
+ else
+ {
+ UI.Show(ResUI.OperationFailed);
+ }
+ }
+
+ private void BrowseServer()
+ {
+ UI.Show(ResUI.CustomServerTips);
+
+ OpenFileDialog fileDialog = new OpenFileDialog
+ {
+ Multiselect = false,
+ Filter = "Config|*.json|YAML|*.yaml;*.yml|All|*.*"
+ };
+ if (fileDialog.ShowDialog() != DialogResult.OK)
+ {
+ return;
+ }
+ string fileName = fileDialog.FileName;
+ if (Utils.IsNullOrEmpty(fileName))
+ {
+ return;
+ }
+ var item = LazyConfig.Instance.GetProfileItem(SelectedSource.indexId);
+ if (item is null)
+ {
+ item = SelectedSource;
+ }
+ item.address = fileName;
+ if (ConfigHandler.AddCustomServer(ref _config, item, false) == 0)
+ {
+ _noticeHandler?.Enqueue(ResUI.SuccessfullyImportedCustomServer);
+ _view.DialogResult = true;
+ }
+ else
+ {
+ UI.ShowWarning(ResUI.FailedImportedCustomServer);
+ }
+ }
+
+ private void EditServer()
+ {
+ var address = SelectedSource.address;
+ if (Utils.IsNullOrEmpty(address))
+ {
+ UI.Show(ResUI.FillServerAddressCustom);
+ return;
+ }
+
+ address = Utils.GetConfigPath(address);
+ if (File.Exists(address))
+ {
+ Utils.ProcessStart(address);
+ }
+ else
+ {
+ _noticeHandler?.Enqueue(ResUI.FailedReadConfiguration);
+ }
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs b/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs
new file mode 100644
index 00000000..9e83e972
--- /dev/null
+++ b/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs
@@ -0,0 +1,154 @@
+using ReactiveUI;
+using ReactiveUI.Fody.Helpers;
+using Splat;
+using System.Reactive;
+using System.Windows;
+using v2rayN.Base;
+using v2rayN.Handler;
+using v2rayN.Mode;
+using v2rayN.Resx;
+
+namespace v2rayN.ViewModels
+{
+ public class AddServerViewModel : ReactiveObject
+ {
+ private static Config _config;
+ private NoticeHandler? _noticeHandler;
+ private Window _view;
+
+ [Reactive]
+ public ProfileItem SelectedSource { get; set; }
+
+ public ReactiveCommand SaveCmd { get; }
+
+
+ public AddServerViewModel(ProfileItem profileItem, Window view)
+ {
+ _config = LazyConfig.Instance.GetConfig();
+ _noticeHandler = Locator.Current.GetService();
+ _view = view;
+
+ if (profileItem.id.IsNullOrEmpty())
+ {
+ profileItem.network = Global.DefaultNetwork;
+ profileItem.headerType = Global.None;
+ profileItem.requestHost = "";
+ profileItem.streamSecurity = "";
+ SelectedSource = profileItem;
+ }
+ else
+ {
+ SelectedSource = Utils.DeepCopy(profileItem);
+ }
+
+ SaveCmd = ReactiveCommand.Create(() =>
+ {
+ SaveServer();
+ });
+
+ }
+
+ private void SaveServer()
+ {
+ if (Utils.IsNullOrEmpty(SelectedSource.remarks))
+ {
+ UI.Show(ResUI.PleaseFillRemarks);
+ return;
+ }
+
+ if (Utils.IsNullOrEmpty(SelectedSource.address))
+ {
+ UI.Show(ResUI.FillServerAddress);
+ return;
+ }
+ var port = SelectedSource.port.ToString();
+ if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)
+ || SelectedSource.port <= 0 || SelectedSource.port >= Global.MaxPort)
+ {
+ UI.Show(ResUI.FillCorrectServerPort);
+ return;
+ }
+ if (SelectedSource.configType == EConfigType.Shadowsocks)
+ {
+ if (Utils.IsNullOrEmpty(SelectedSource.id))
+ {
+ UI.Show(ResUI.FillPassword);
+ return;
+ }
+ if (Utils.IsNullOrEmpty(SelectedSource.security))
+ {
+ UI.Show(ResUI.PleaseSelectEncryption);
+ return;
+ }
+ }
+ if (SelectedSource.configType != EConfigType.Socks)
+ {
+ if (Utils.IsNullOrEmpty(SelectedSource.id))
+ {
+ UI.Show(ResUI.FillUUID);
+ return;
+ }
+ }
+
+ var item = LazyConfig.Instance.GetProfileItem(SelectedSource.indexId);
+ if (item is null)
+ {
+ item = SelectedSource;
+ }
+ else
+ {
+ item.coreType = SelectedSource.coreType;
+ item.remarks = SelectedSource.remarks;
+ item.address = SelectedSource.address;
+ item.port = SelectedSource.port;
+
+ item.id = SelectedSource.id;
+ item.alterId = SelectedSource.alterId;
+ item.security = SelectedSource.security;
+ item.flow = SelectedSource.flow;
+
+ item.network = SelectedSource.network;
+ item.headerType = SelectedSource.headerType;
+ item.requestHost = SelectedSource.requestHost;
+ item.path = SelectedSource.path;
+
+ item.streamSecurity = SelectedSource.streamSecurity;
+ item.sni = SelectedSource.sni;
+ item.allowInsecure = SelectedSource.allowInsecure;
+ item.fingerprint = SelectedSource.fingerprint;
+ item.alpn = SelectedSource.alpn;
+ }
+
+ int ret = -1;
+ switch (item.configType)
+ {
+ case EConfigType.VMess:
+ ret = ConfigHandler.AddServer(ref _config, item);
+ break;
+ case EConfigType.Shadowsocks:
+ ret = ConfigHandler.AddShadowsocksServer(ref _config, item);
+ break;
+ case EConfigType.Socks:
+ ret = ConfigHandler.AddSocksServer(ref _config, item);
+ break;
+ case EConfigType.VLESS:
+ ret = ConfigHandler.AddVlessServer(ref _config, item);
+ break;
+ case EConfigType.Trojan:
+ ret = ConfigHandler.AddTrojanServer(ref _config, item);
+ break;
+ }
+
+ if (ret == 0)
+ {
+ _noticeHandler?.Enqueue(ResUI.OperationSuccess);
+ _view.DialogResult = true;
+ //_view?.Close();
+ }
+ else
+ {
+ UI.Show(ResUI.OperationFailed);
+ }
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs
new file mode 100644
index 00000000..c568f7cd
--- /dev/null
+++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs
@@ -0,0 +1,1605 @@
+using DynamicData;
+using DynamicData.Binding;
+using MaterialDesignColors;
+using MaterialDesignColors.ColorManipulation;
+using MaterialDesignThemes.Wpf;
+using NHotkey;
+using ReactiveUI;
+using ReactiveUI.Fody.Helpers;
+using Splat;
+using System.Drawing;
+using System.Reactive;
+using System.Reactive.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Forms;
+using System.Windows.Media;
+using v2rayN.Base;
+using v2rayN.Handler;
+using v2rayN.Mode;
+using v2rayN.Resx;
+using v2rayN.Tool;
+using v2rayN.Views;
+using Application = System.Windows.Application;
+
+
+namespace v2rayN.ViewModels
+{
+ public class MainWindowViewModel : ReactiveObject
+ {
+ #region private prop
+
+ private CoreHandler _coreHandler;
+ private StatisticsHandler _statistics;
+ private List _lstProfile;
+ private string _subId = string.Empty;
+ private string _serverFilter = string.Empty;
+ private static Config _config;
+ private NoticeHandler? _noticeHandler;
+ private readonly PaletteHelper _paletteHelper = new PaletteHelper();
+ private Dictionary _dicHeaderSort = new();
+ private Action _updateView;
+
+ #endregion
+
+ #region ObservableCollection
+
+ private IObservableCollection _profileItems = new ObservableCollectionExtended();
+ public IObservableCollection ProfileItems => _profileItems;
+
+ private IObservableCollection _subItems = new ObservableCollectionExtended();
+ public IObservableCollection SubItems => _subItems;
+
+ private IObservableCollection _routingItems = new ObservableCollectionExtended();
+ public IObservableCollection RoutingItems => _routingItems;
+
+ private IObservableCollection _servers = new ObservableCollectionExtended();
+ public IObservableCollection Servers => _servers;
+
+ [Reactive]
+ public ProfileItemModel SelectedProfile { get; set; }
+ public IList SelectedProfiles { get; set; }
+ [Reactive]
+ public SubItem SelectedSub { get; set; }
+ [Reactive]
+ public RoutingItem SelectedRouting { get; set; }
+ [Reactive]
+ public ComboItem SelectedServer { get; set; }
+ [Reactive]
+ public string ServerFilter { get; set; }
+ #endregion
+
+ #region Menu
+
+ //servers
+ public ReactiveCommand AddVmessServerCmd { get; }
+ public ReactiveCommand AddVlessServerCmd { get; }
+ public ReactiveCommand AddShadowsocksServerCmd { get; }
+ public ReactiveCommand AddSocksServerCmd { get; }
+ public ReactiveCommand AddTrojanServerCmd { get; }
+ public ReactiveCommand AddCustomServerCmd { get; }
+ public ReactiveCommand AddServerViaClipboardCmd { get; }
+ public ReactiveCommand AddServerViaScanCmd { get; }
+ //servers delete
+ public ReactiveCommand RemoveServerCmd { get; }
+ public ReactiveCommand RemoveDuplicateServerCmd { get; }
+ public ReactiveCommand CopyServerCmd { get; }
+ public ReactiveCommand SetDefaultServerCmd { get; }
+ public ReactiveCommand ShareServerCmd { get; }
+ //servers move
+ public ReactiveCommand MoveTopCmd { get; }
+ public ReactiveCommand MoveUpCmd { get; }
+ public ReactiveCommand MoveDownCmd { get; }
+ public ReactiveCommand MoveBottomCmd { get; }
+
+ //servers ping
+ public ReactiveCommand MixedTestServerCmd { get; }
+ public ReactiveCommand PingServerCmd { get; }
+ public ReactiveCommand TcpingServerCmd { get; }
+ public ReactiveCommand RealPingServerCmd { get; }
+ public ReactiveCommand SpeedServerCmd { get; }
+ public ReactiveCommand SortServerResultCmd { get; }
+ //servers export
+ public ReactiveCommand Export2ClientConfigCmd { get; }
+ public ReactiveCommand Export2ServerConfigCmd { get; }
+ public ReactiveCommand Export2ShareUrlCmd { get; }
+ public ReactiveCommand Export2SubContentCmd { get; }
+
+ //Subscription
+ public ReactiveCommand SubSettingCmd { get; }
+ public ReactiveCommand AddSubCmd { get; }
+ public ReactiveCommand SubUpdateCmd { get; }
+ public ReactiveCommand SubGroupUpdateCmd { get; }
+ public ReactiveCommand SubUpdateViaProxyCmd { get; }
+ public ReactiveCommand SubGroupUpdateViaProxyCmd { get; }
+
+ //Setting
+ public ReactiveCommand OptionSettingCmd { get; }
+ public ReactiveCommand RoutingSettingCmd { get; }
+ public ReactiveCommand GlobalHotkeySettingCmd { get; }
+ public ReactiveCommand ClearServerStatisticsCmd { get; }
+ public ReactiveCommand ImportOldGuiConfigCmd { get; }
+
+ //CheckUpdate
+ public ReactiveCommand CheckUpdateNCmd { get; }
+ public ReactiveCommand CheckUpdateV2flyCoreCmd { get; }
+ public ReactiveCommand CheckUpdateSagerNetCoreCmd { get; }
+ public ReactiveCommand CheckUpdateXrayCoreCmd { get; }
+ public ReactiveCommand CheckUpdateClashCoreCmd { get; }
+ public ReactiveCommand