use v2ray geosite to replace gfwlisttags/4.2.0.0
@@ -0,0 +1,203 @@ | |||||
using NLog; | |||||
using Shadowsocks.Properties; | |||||
using Shadowsocks.Util; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using Newtonsoft.Json; | |||||
using Shadowsocks.Model; | |||||
using System.Net; | |||||
namespace Shadowsocks.Controller | |||||
{ | |||||
public class GeositeResultEventArgs : EventArgs | |||||
{ | |||||
public bool Success; | |||||
public GeositeResultEventArgs(bool success) | |||||
{ | |||||
this.Success = success; | |||||
} | |||||
} | |||||
public static class GeositeUpdater | |||||
{ | |||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
public static event EventHandler<GeositeResultEventArgs> UpdateCompleted; | |||||
public static event ErrorEventHandler Error; | |||||
private static readonly string DATABASE_PATH = Utils.GetTempPath("dlc.dat"); | |||||
private static readonly string GEOSITE_URL = "https://github.com/v2ray/domain-list-community/raw/release/dlc.dat"; | |||||
public static readonly Dictionary<string, IList<DomainObject>> Geosites = new Dictionary<string, IList<DomainObject>>(); | |||||
static GeositeUpdater() | |||||
{ | |||||
if (!File.Exists(DATABASE_PATH)) | |||||
{ | |||||
File.WriteAllBytes(DATABASE_PATH, Resources.dlc_dat); | |||||
} | |||||
LoadGeositeList(); | |||||
} | |||||
static void LoadGeositeList(byte[] data = null) | |||||
{ | |||||
data = data ?? File.ReadAllBytes(DATABASE_PATH); | |||||
var list = GeositeList.Parser.ParseFrom(data); | |||||
foreach (var item in list.Entries) | |||||
{ | |||||
Geosites[item.GroupName.ToLower()] = item.Domains; | |||||
} | |||||
} | |||||
public static void ResetEvent() | |||||
{ | |||||
UpdateCompleted = null; | |||||
Error = null; | |||||
} | |||||
public static void UpdatePACFromGeosite(Configuration config) | |||||
{ | |||||
string geositeUrl = GEOSITE_URL; | |||||
string group = config.geositeGroup; | |||||
bool blacklist = config.geositeBlacklistMode; | |||||
if (!string.IsNullOrWhiteSpace(config.geositeUrl)) | |||||
{ | |||||
logger.Info("Found custom Geosite URL in config file"); | |||||
geositeUrl = config.geositeUrl; | |||||
} | |||||
logger.Info($"Checking Geosite from {geositeUrl}"); | |||||
WebClient http = new WebClient(); | |||||
if (config.enabled) | |||||
{ | |||||
http.Proxy = new WebProxy( | |||||
config.isIPv6Enabled | |||||
? $"[{IPAddress.IPv6Loopback}]" | |||||
: IPAddress.Loopback.ToString(), | |||||
config.localPort); | |||||
} | |||||
http.DownloadDataCompleted += (o, e) => | |||||
{ | |||||
try | |||||
{ | |||||
File.WriteAllBytes(DATABASE_PATH, e.Result); | |||||
LoadGeositeList(); | |||||
bool pacFileChanged = MergeAndWritePACFile(group, blacklist); | |||||
UpdateCompleted?.Invoke(null, new GeositeResultEventArgs(pacFileChanged)); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
Error?.Invoke(null, new ErrorEventArgs(ex)); | |||||
} | |||||
}; | |||||
http.DownloadDataAsync(new Uri(geositeUrl)); | |||||
} | |||||
public static bool MergeAndWritePACFile(string group, bool blacklist) | |||||
{ | |||||
IList<DomainObject> domains = Geosites[group]; | |||||
string abpContent = MergePACFile(domains, blacklist); | |||||
if (File.Exists(PACDaemon.PAC_FILE)) | |||||
{ | |||||
string original = FileManager.NonExclusiveReadAllText(PACDaemon.PAC_FILE, Encoding.UTF8); | |||||
if (original == abpContent) | |||||
{ | |||||
return false; | |||||
} | |||||
} | |||||
File.WriteAllText(PACDaemon.PAC_FILE, abpContent, Encoding.UTF8); | |||||
return true; | |||||
} | |||||
private static string MergePACFile(IList<DomainObject> domains, bool blacklist) | |||||
{ | |||||
string abpContent; | |||||
if (File.Exists(PACDaemon.USER_ABP_FILE)) | |||||
{ | |||||
abpContent = FileManager.NonExclusiveReadAllText(PACDaemon.USER_ABP_FILE, Encoding.UTF8); | |||||
} | |||||
else | |||||
{ | |||||
abpContent = Resources.abp_js; | |||||
} | |||||
List<string> userruleLines = new List<string>(); | |||||
if (File.Exists(PACDaemon.USER_RULE_FILE)) | |||||
{ | |||||
string userrulesString = FileManager.NonExclusiveReadAllText(PACDaemon.USER_RULE_FILE, Encoding.UTF8); | |||||
userruleLines = PreProcessGFWList(userrulesString); | |||||
} | |||||
List<string> gfwLines = GeositeToGFWList(domains, blacklist); | |||||
abpContent = | |||||
$@"var __USERRULES__ = {JsonConvert.SerializeObject(userruleLines, Formatting.Indented)}; | |||||
var __RULES__ = {JsonConvert.SerializeObject(gfwLines, Formatting.Indented)}; | |||||
{abpContent}"; | |||||
return abpContent; | |||||
} | |||||
private static readonly IEnumerable<char> IgnoredLineBegins = new[] { '!', '[' }; | |||||
private static List<string> PreProcessGFWList(string content) | |||||
{ | |||||
List<string> valid_lines = new List<string>(); | |||||
using (var sr = new StringReader(content)) | |||||
{ | |||||
foreach (var line in sr.NonWhiteSpaceLines()) | |||||
{ | |||||
if (line.BeginWithAny(IgnoredLineBegins)) | |||||
continue; | |||||
valid_lines.Add(line); | |||||
} | |||||
} | |||||
return valid_lines; | |||||
} | |||||
private static List<string> GeositeToGFWList(IList<DomainObject> domains, bool blacklist) | |||||
{ | |||||
return blacklist ? GeositeToGFWListBlack(domains) : GeositeToGFWListWhite(domains); | |||||
} | |||||
private static List<string> GeositeToGFWListBlack(IList<DomainObject> domains) | |||||
{ | |||||
List<string> ret = new List<string>(domains.Count + 100);// 100 overhead | |||||
foreach (var d in domains) | |||||
{ | |||||
string domain = d.Value; | |||||
switch (d.Type) | |||||
{ | |||||
case DomainObject.Types.Type.Plain: | |||||
ret.Add(domain); | |||||
break; | |||||
case DomainObject.Types.Type.Regex: | |||||
ret.Add($"/{domain}/"); | |||||
break; | |||||
case DomainObject.Types.Type.Domain: | |||||
ret.Add($"||{domain}"); | |||||
break; | |||||
case DomainObject.Types.Type.Full: | |||||
ret.Add($"|http://{domain}"); | |||||
ret.Add($"|https://{domain}"); | |||||
break; | |||||
} | |||||
} | |||||
return ret; | |||||
} | |||||
private static List<string> GeositeToGFWListWhite(IList<DomainObject> domains) | |||||
{ | |||||
return GeositeToGFWListBlack(domains) | |||||
.Select(r => $"@@{r}") // convert to whitelist | |||||
.Prepend("/.*/") // blacklist all other site | |||||
.ToList(); | |||||
} | |||||
} | |||||
} |
@@ -1,137 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Net; | |||||
using System.Text; | |||||
using Newtonsoft.Json; | |||||
using NLog; | |||||
using Shadowsocks.Model; | |||||
using Shadowsocks.Properties; | |||||
using Shadowsocks.Util; | |||||
namespace Shadowsocks.Controller | |||||
{ | |||||
public class GFWListUpdater | |||||
{ | |||||
private static Logger logger = LogManager.GetCurrentClassLogger(); | |||||
private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; | |||||
public event EventHandler<ResultEventArgs> UpdateCompleted; | |||||
public event ErrorEventHandler Error; | |||||
public class ResultEventArgs : EventArgs | |||||
{ | |||||
public bool Success; | |||||
public ResultEventArgs(bool success) | |||||
{ | |||||
this.Success = success; | |||||
} | |||||
} | |||||
private static readonly IEnumerable<char> IgnoredLineBegins = new[] { '!', '[' }; | |||||
private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) | |||||
{ | |||||
try | |||||
{ | |||||
File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), e.Result, Encoding.UTF8); | |||||
bool pacFileChanged = MergeAndWritePACFile(e.Result); | |||||
UpdateCompleted?.Invoke(this, new ResultEventArgs(pacFileChanged)); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
Error?.Invoke(this, new ErrorEventArgs(ex)); | |||||
} | |||||
} | |||||
public static bool MergeAndWritePACFile(string gfwListResult) | |||||
{ | |||||
string abpContent = MergePACFile(gfwListResult); | |||||
if (File.Exists(PACDaemon.PAC_FILE)) | |||||
{ | |||||
string original = FileManager.NonExclusiveReadAllText(PACDaemon.PAC_FILE, Encoding.UTF8); | |||||
if (original == abpContent) | |||||
{ | |||||
return false; | |||||
} | |||||
} | |||||
File.WriteAllText(PACDaemon.PAC_FILE, abpContent, Encoding.UTF8); | |||||
return true; | |||||
} | |||||
private static string MergePACFile(string gfwListResult) | |||||
{ | |||||
string abpContent; | |||||
if (File.Exists(PACDaemon.USER_ABP_FILE)) | |||||
{ | |||||
abpContent = FileManager.NonExclusiveReadAllText(PACDaemon.USER_ABP_FILE, Encoding.UTF8); | |||||
} | |||||
else | |||||
{ | |||||
abpContent = Resources.abp_js; | |||||
} | |||||
List<string> userruleLines = new List<string>(); | |||||
if (File.Exists(PACDaemon.USER_RULE_FILE)) | |||||
{ | |||||
string userrulesString = FileManager.NonExclusiveReadAllText(PACDaemon.USER_RULE_FILE, Encoding.UTF8); | |||||
userruleLines = ParseToValidList(userrulesString); | |||||
} | |||||
List<string> gfwLines = new List<string>(); | |||||
gfwLines = ParseBase64ToValidList(gfwListResult); | |||||
abpContent = | |||||
$@"var __USERRULES__ = {JsonConvert.SerializeObject(userruleLines, Formatting.Indented)}; | |||||
var __RULES__ = {JsonConvert.SerializeObject(gfwLines, Formatting.Indented)}; | |||||
{abpContent}"; | |||||
return abpContent; | |||||
} | |||||
public void UpdatePACFromGFWList(Configuration config) | |||||
{ | |||||
string gfwListUrl = GFWLIST_URL; | |||||
if (!string.IsNullOrWhiteSpace(config.gfwListUrl)) | |||||
{ | |||||
logger.Info("Found custom GFWListURL in config file"); | |||||
gfwListUrl = config.gfwListUrl; | |||||
} | |||||
logger.Info($"Checking GFWList from {gfwListUrl}"); | |||||
WebClient http = new WebClient(); | |||||
if (config.enabled) | |||||
{ | |||||
http.Proxy = new WebProxy( | |||||
config.isIPv6Enabled | |||||
? $"[{IPAddress.IPv6Loopback.ToString()}]" | |||||
: IPAddress.Loopback.ToString(), | |||||
config.localPort); | |||||
} | |||||
http.DownloadStringCompleted += http_DownloadStringCompleted; | |||||
http.DownloadStringAsync(new Uri(gfwListUrl)); | |||||
} | |||||
public static List<string> ParseBase64ToValidList(string response) | |||||
{ | |||||
byte[] bytes = Convert.FromBase64String(response); | |||||
string content = Encoding.ASCII.GetString(bytes); | |||||
return ParseToValidList(content); | |||||
} | |||||
private static List<string> ParseToValidList(string content) | |||||
{ | |||||
List<string> valid_lines = new List<string>(); | |||||
using (var sr = new StringReader(content)) | |||||
{ | |||||
foreach (var line in sr.NonWhiteSpaceLines()) | |||||
{ | |||||
if (line.BeginWithAny(IgnoredLineBegins)) | |||||
continue; | |||||
valid_lines.Add(line); | |||||
} | |||||
} | |||||
return valid_lines; | |||||
} | |||||
} | |||||
} |
@@ -1,4 +1,5 @@ | |||||
using NLog; | using NLog; | ||||
using Shadowsocks.Model; | |||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
using Shadowsocks.Util; | using Shadowsocks.Util; | ||||
using System; | using System; | ||||
@@ -21,6 +22,7 @@ namespace Shadowsocks.Controller | |||||
public const string PAC_FILE = "pac.txt"; | public const string PAC_FILE = "pac.txt"; | ||||
public const string USER_RULE_FILE = "user-rule.txt"; | public const string USER_RULE_FILE = "user-rule.txt"; | ||||
public const string USER_ABP_FILE = "abp.txt"; | public const string USER_ABP_FILE = "abp.txt"; | ||||
private Configuration config; | |||||
FileSystemWatcher PACFileWatcher; | FileSystemWatcher PACFileWatcher; | ||||
FileSystemWatcher UserRuleFileWatcher; | FileSystemWatcher UserRuleFileWatcher; | ||||
@@ -28,8 +30,9 @@ namespace Shadowsocks.Controller | |||||
public event EventHandler PACFileChanged; | public event EventHandler PACFileChanged; | ||||
public event EventHandler UserRuleFileChanged; | public event EventHandler UserRuleFileChanged; | ||||
public PACDaemon() | |||||
public PACDaemon(Configuration config) | |||||
{ | { | ||||
this.config = config; | |||||
TouchPACFile(); | TouchPACFile(); | ||||
TouchUserRuleFile(); | TouchUserRuleFile(); | ||||
@@ -42,7 +45,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (!File.Exists(PAC_FILE)) | if (!File.Exists(PAC_FILE)) | ||||
{ | { | ||||
File.WriteAllText(PAC_FILE, Resources.default_abp_rule + Resources.abp_js); | |||||
GeositeUpdater.MergeAndWritePACFile(config.geositeGroup, config.geositeBlacklistMode); | |||||
} | } | ||||
return PAC_FILE; | return PAC_FILE; | ||||
} | } | ||||
@@ -58,14 +61,11 @@ namespace Shadowsocks.Controller | |||||
internal string GetPACContent() | internal string GetPACContent() | ||||
{ | { | ||||
if (File.Exists(PAC_FILE)) | |||||
{ | |||||
return File.ReadAllText(PAC_FILE, Encoding.UTF8); | |||||
} | |||||
else | |||||
if (!File.Exists(PAC_FILE)) | |||||
{ | { | ||||
return Resources.default_abp_rule + Resources.abp_js; | |||||
GeositeUpdater.MergeAndWritePACFile(config.geositeGroup, config.geositeBlacklistMode); | |||||
} | } | ||||
return File.ReadAllText(PAC_FILE, Encoding.UTF8); | |||||
} | } | ||||
@@ -35,7 +35,6 @@ namespace Shadowsocks.Controller | |||||
private Configuration _config; | private Configuration _config; | ||||
private StrategyManager _strategyManager; | private StrategyManager _strategyManager; | ||||
private PrivoxyRunner privoxyRunner; | private PrivoxyRunner privoxyRunner; | ||||
private GFWListUpdater gfwListUpdater; | |||||
private readonly ConcurrentDictionary<Server, Sip003Plugin> _pluginsByServer; | private readonly ConcurrentDictionary<Server, Sip003Plugin> _pluginsByServer; | ||||
public AvailabilityStatistics availabilityStatistics = AvailabilityStatistics.Instance; | public AvailabilityStatistics availabilityStatistics = AvailabilityStatistics.Instance; | ||||
@@ -80,9 +79,9 @@ namespace Shadowsocks.Controller | |||||
public event EventHandler<PathEventArgs> PACFileReadyToOpen; | public event EventHandler<PathEventArgs> PACFileReadyToOpen; | ||||
public event EventHandler<PathEventArgs> UserRuleFileReadyToOpen; | public event EventHandler<PathEventArgs> UserRuleFileReadyToOpen; | ||||
public event EventHandler<GFWListUpdater.ResultEventArgs> UpdatePACFromGFWListCompleted; | |||||
public event EventHandler<GeositeResultEventArgs> UpdatePACFromGeositeCompleted; | |||||
public event ErrorEventHandler UpdatePACFromGFWListError; | |||||
public event ErrorEventHandler UpdatePACFromGeositeError; | |||||
public event ErrorEventHandler Errored; | public event ErrorEventHandler Errored; | ||||
@@ -416,12 +415,9 @@ namespace Shadowsocks.Controller | |||||
return $"ss://{url}{tag}"; | return $"ss://{url}{tag}"; | ||||
} | } | ||||
public void UpdatePACFromGFWList() | |||||
public void UpdatePACFromGeosite() | |||||
{ | { | ||||
if (gfwListUpdater != null) | |||||
{ | |||||
gfwListUpdater.UpdatePACFromGFWList(_config); | |||||
} | |||||
GeositeUpdater.UpdatePACFromGeosite(_config); | |||||
} | } | ||||
public void UpdateStatisticsConfiguration(bool enabled) | public void UpdateStatisticsConfiguration(bool enabled) | ||||
@@ -531,15 +527,15 @@ namespace Shadowsocks.Controller | |||||
privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); | privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); | ||||
_pacDaemon = _pacDaemon ?? new PACDaemon(); | |||||
_pacDaemon = _pacDaemon ?? new PACDaemon(_config); | |||||
_pacDaemon.PACFileChanged += PacDaemon_PACFileChanged; | _pacDaemon.PACFileChanged += PacDaemon_PACFileChanged; | ||||
_pacDaemon.UserRuleFileChanged += PacDaemon_UserRuleFileChanged; | _pacDaemon.UserRuleFileChanged += PacDaemon_UserRuleFileChanged; | ||||
_pacServer = _pacServer ?? new PACServer(_pacDaemon); | _pacServer = _pacServer ?? new PACServer(_pacDaemon); | ||||
_pacServer.UpdatePACURL(_config); // So PACServer works when system proxy disabled. | _pacServer.UpdatePACURL(_config); // So PACServer works when system proxy disabled. | ||||
gfwListUpdater = gfwListUpdater ?? new GFWListUpdater(); | |||||
gfwListUpdater.UpdateCompleted += PacServer_PACUpdateCompleted; | |||||
gfwListUpdater.Error += PacServer_PACUpdateError; | |||||
GeositeUpdater.ResetEvent(); | |||||
GeositeUpdater.UpdateCompleted += PacServer_PACUpdateCompleted; | |||||
GeositeUpdater.Error += PacServer_PACUpdateError; | |||||
availabilityStatistics.UpdateConfiguration(this); | availabilityStatistics.UpdateConfiguration(this); | ||||
_listener?.Stop(); | _listener?.Stop(); | ||||
@@ -621,27 +617,20 @@ namespace Shadowsocks.Controller | |||||
UpdateSystemProxy(); | UpdateSystemProxy(); | ||||
} | } | ||||
private void PacServer_PACUpdateCompleted(object sender, GFWListUpdater.ResultEventArgs e) | |||||
private void PacServer_PACUpdateCompleted(object sender, GeositeResultEventArgs e) | |||||
{ | { | ||||
UpdatePACFromGFWListCompleted?.Invoke(this, e); | |||||
UpdatePACFromGeositeCompleted?.Invoke(this, e); | |||||
} | } | ||||
private void PacServer_PACUpdateError(object sender, ErrorEventArgs e) | private void PacServer_PACUpdateError(object sender, ErrorEventArgs e) | ||||
{ | { | ||||
UpdatePACFromGFWListError?.Invoke(this, e); | |||||
UpdatePACFromGeositeError?.Invoke(this, e); | |||||
} | } | ||||
private static readonly IEnumerable<char> IgnoredLineBegins = new[] { '!', '[' }; | private static readonly IEnumerable<char> IgnoredLineBegins = new[] { '!', '[' }; | ||||
private void PacDaemon_UserRuleFileChanged(object sender, EventArgs e) | private void PacDaemon_UserRuleFileChanged(object sender, EventArgs e) | ||||
{ | { | ||||
if (!File.Exists(Utils.GetTempPath("gfwlist.txt"))) | |||||
{ | |||||
UpdatePACFromGFWList(); | |||||
} | |||||
else | |||||
{ | |||||
GFWListUpdater.MergeAndWritePACFile(FileManager.NonExclusiveReadAllText(Utils.GetTempPath("gfwlist.txt"))); | |||||
} | |||||
GeositeUpdater.MergeAndWritePACFile(_config.geositeGroup, _config.geositeBlacklistMode); | |||||
UpdateSystemProxy(); | UpdateSystemProxy(); | ||||
} | } | ||||
@@ -786,6 +786,10 @@ function FindProxyForURL(url, host) { | |||||
if (userrulesMatcher.matchesAny(url, host) instanceof WhitelistFilter) { | if (userrulesMatcher.matchesAny(url, host) instanceof WhitelistFilter) { | ||||
return direct; | return direct; | ||||
} | } | ||||
// Hack for Geosite, it provides a whitelist... | |||||
if (defaultMatcher.matchesAny(url, host) instanceof WhitelistFilter) { | |||||
return direct; | |||||
} | |||||
if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { | if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { | ||||
return proxy; | return proxy; | ||||
} | } | ||||
@@ -24,8 +24,8 @@ Allow other Devices to connect,Общий доступ к подключению | |||||
Local PAC,Локальный PAC,使用本地 PAC,使用本機 PAC,ローカル PAC,로컬 프록시 자동 구성,PAC local | Local PAC,Локальный PAC,使用本地 PAC,使用本機 PAC,ローカル PAC,로컬 프록시 자동 구성,PAC local | ||||
Online PAC,Удаленный PAC,使用在线 PAC,使用線上 PAC,オンライン PAC,온라인 프록시 자동 구성,PAC en ligne | Online PAC,Удаленный PAC,使用在线 PAC,使用線上 PAC,オンライン PAC,온라인 프록시 자동 구성,PAC en ligne | ||||
Edit Local PAC File...,Редактировать локальный PAC…,编辑本地 PAC 文件...,編輯本機 PAC 檔案...,ローカル PAC ファイルの編集...,로컬 프록시 자동 구성 파일 수정,Modifier le fichier PAC local ... | Edit Local PAC File...,Редактировать локальный PAC…,编辑本地 PAC 文件...,編輯本機 PAC 檔案...,ローカル PAC ファイルの編集...,로컬 프록시 자동 구성 파일 수정,Modifier le fichier PAC local ... | ||||
Update Local PAC from GFWList,Обновить локальный PAC из GFWList,从 GFWList 更新本地 PAC,從 GFWList 更新本機 PAC,GFWList からローカル PAC を更新,GFWList에서 로컬 프록시 자동 구성 파일 업데이트,Mettre à jour le PAC local à partir de GFWList | |||||
Edit User Rule for GFWList...,Редактировать свои правила для GFWList,编辑 GFWList 的用户规则...,編輯 GFWList 的使用者規則...,ユーザールールの編集...,GFWList 사용자 수정,Modifier la règle utilisateur pour GFWList ... | |||||
Update Local PAC from Geosite,Обновить локальный PAC из Geosite,从 Geosite 更新本地 PAC,從 Geosite 更新本機 PAC,Geosite からローカル PAC を更新,Geosite에서 로컬 프록시 자동 구성 파일 업데이트,Mettre à jour le PAC local à partir de Geosite | |||||
Edit User Rule for Geosite...,Редактировать свои правила для Geosite,编辑 Geosite 的用户规则...,編輯 Geosite 的使用者規則...,ユーザールールの編集...,Geosite 사용자 수정,Modifier la règle utilisateur pour Geosite ... | |||||
Secure Local PAC,Безопасный URL локального PAC,保护本地 PAC,安全本機 PAC,ローカル PAC を保護,로컬 프록시 자동 구성 파일 암호화,Sécuriser PAC local | Secure Local PAC,Безопасный URL локального PAC,保护本地 PAC,安全本機 PAC,ローカル PAC を保護,로컬 프록시 자동 구성 파일 암호화,Sécuriser PAC local | ||||
Copy Local PAC URL,Копировать URL локального PAC,复制本地 PAC 网址,複製本機 PAC 網址,ローカル PAC URL をコピー,로컬 프록시 자동 구성 파일 URL 복사,Copier l'URL du PAC local | Copy Local PAC URL,Копировать URL локального PAC,复制本地 PAC 网址,複製本機 PAC 網址,ローカル PAC URL をコピー,로컬 프록시 자동 구성 파일 URL 복사,Copier l'URL du PAC local | ||||
Share Server Config...,Поделиться конфигурацией сервера…,分享服务器配置...,分享伺服器設定檔...,サーバーの設定を共有...,서버 설정 공유,Partager la configuration du serveur ... | Share Server Config...,Поделиться конфигурацией сервера…,分享服务器配置...,分享伺服器設定檔...,サーバーの設定を共有...,서버 설정 공유,Partager la configuration du serveur ... | ||||
@@ -178,7 +178,7 @@ System Proxy Enabled,Системный прокси включен,系统代理 | |||||
System Proxy Disabled,Системный прокси отключен,系统代理未启用,系統 Proxy 未啟用,システム プロキシが無効です。,시스템 프록시가 비활성화되었습니다.,Proxy système désactivé | System Proxy Disabled,Системный прокси отключен,系统代理未启用,系統 Proxy 未啟用,システム プロキシが無効です。,시스템 프록시가 비활성화되었습니다.,Proxy système désactivé | ||||
Failed to update PAC file ,Не удалось обновить PAC файл,更新 PAC 文件失败,更新 PAC 檔案失敗,PAC の更新に失敗しました。,프록시 자동 구성 파일을 업데이트하는데 실패했습니다.,Impossible de mettre à jour le fichier PAC | Failed to update PAC file ,Не удалось обновить PAC файл,更新 PAC 文件失败,更新 PAC 檔案失敗,PAC の更新に失敗しました。,프록시 자동 구성 파일을 업데이트하는데 실패했습니다.,Impossible de mettre à jour le fichier PAC | ||||
PAC updated,PAC файл обновлен,更新 PAC 成功,更新 PAC 成功,PAC を更新しました。,프록시 자동 구성 파일이 업데이트되었습니다.,PAC mis à jour | PAC updated,PAC файл обновлен,更新 PAC 成功,更新 PAC 成功,PAC を更新しました。,프록시 자동 구성 파일이 업데이트되었습니다.,PAC mis à jour | ||||
No updates found. Please report to GFWList if you have problems with it.,Обновлений не найдено. Сообщите авторам GFWList если у вас возникли проблемы.,未发现更新。如有问题请提交给 GFWList。,未發現更新。如有問題請報告至 GFWList。,お使いのバージョンは最新です。問題がある場合は、GFWList に報告して下さい。,사용 가능한 업데이트를 찾지 못했습니다. 문제가 있다면 GFWList로 전송해주세요.,Aucune mise à jour trouvée. Veuillez signaler à GFWList si vous avez des problèmes concernant. | |||||
No updates found. Please report to Geosite if you have problems with it.,Обновлений не найдено. Сообщите авторам Geosite если у вас возникли проблемы.,未发现更新。如有问题请提交给 Geosite。,未發現更新。如有問題請報告至 Geosite。,お使いのバージョンは最新です。問題がある場合は、Geosite に報告して下さい。,사용 가능한 업데이트를 찾지 못했습니다. 문제가 있다면 Geosite로 전송해주세요.,Aucune mise à jour trouvée. Veuillez signaler à Geosite si vous avez des problèmes concernant. | |||||
No QRCode found. Try to zoom in or move it to the center of the screen.,QRCode не обнаружен. Попробуйте увеличить изображение или переместить его в центр экрана.,未发现二维码,尝试把它放大或移动到靠近屏幕中间的位置,未發現 QR 碼,嘗試把它放大或移動到靠近熒幕中間的位置,QR コードが見つかりませんでした。コードを大きくするか、画面の中央に移動して下さい。,QR코드를 찾을 수 없습니다. 가운데로 화면을 이동시키거나 확대해보세요.,Aucun QRCode trouvé. Essayez de zoomer ou de le déplacer vers le centre de l'écran. | No QRCode found. Try to zoom in or move it to the center of the screen.,QRCode не обнаружен. Попробуйте увеличить изображение или переместить его в центр экрана.,未发现二维码,尝试把它放大或移动到靠近屏幕中间的位置,未發現 QR 碼,嘗試把它放大或移動到靠近熒幕中間的位置,QR コードが見つかりませんでした。コードを大きくするか、画面の中央に移動して下さい。,QR코드를 찾을 수 없습니다. 가운데로 화면을 이동시키거나 확대해보세요.,Aucun QRCode trouvé. Essayez de zoomer ou de le déplacer vers le centre de l'écran. | ||||
Shadowsocks is already running.,Shadowsocks уже запущен.,Shadowsocks 已经在运行。,Shadowsocks 已經在執行。,Shadowsocks 実行中,Shadowsocks가 이미 실행 중입니다.,Shadowsocks est déjà en cours d'exécution. | Shadowsocks is already running.,Shadowsocks уже запущен.,Shadowsocks 已经在运行。,Shadowsocks 已經在執行。,Shadowsocks 実行中,Shadowsocks가 이미 실행 중입니다.,Shadowsocks est déjà en cours d'exécution. | ||||
Find Shadowsocks icon in your notify tray.,Значок Shadowsocks можно найти в области уведомлений.,请在任务栏里寻找 Shadowsocks 图标。,請在工作列裡尋找 Shadowsocks 圖示。,通知領域には Shadowsocks のアイコンがあります。,트레이에서 Shadowsocks를 찾아주세요.,Trouvez l'icône Shadowsocks dans votre barre de notification. | Find Shadowsocks icon in your notify tray.,Значок Shadowsocks можно найти в области уведомлений.,请在任务栏里寻找 Shadowsocks 图标。,請在工作列裡尋找 Shadowsocks 圖示。,通知領域には Shadowsocks のアイコンがあります。,트레이에서 Shadowsocks를 찾아주세요.,Trouvez l'icône Shadowsocks dans votre barre de notification. | ||||
@@ -29,7 +29,10 @@ namespace Shadowsocks.Model | |||||
public bool portableMode = true; | public bool portableMode = true; | ||||
public bool showPluginOutput; | public bool showPluginOutput; | ||||
public string pacUrl; | public string pacUrl; | ||||
public string gfwListUrl; | |||||
public string geositeUrl; | |||||
public string geositeGroup = "geolocation-!cn"; | |||||
public bool geositeBlacklistMode = true; | |||||
public bool useOnlinePac; | public bool useOnlinePac; | ||||
public bool secureLocalPac = true; | public bool secureLocalPac = true; | ||||
public bool availabilityStatistics; | public bool availabilityStatistics; | ||||
@@ -0,0 +1,753 @@ | |||||
// <auto-generated> | |||||
// Generated by the protocol buffer compiler. DO NOT EDIT! | |||||
// source: geosite.proto | |||||
// </auto-generated> | |||||
#pragma warning disable 1591, 0612, 3021 | |||||
#region Designer generated code | |||||
using pb = global::Google.Protobuf; | |||||
using pbc = global::Google.Protobuf.Collections; | |||||
using pbr = global::Google.Protobuf.Reflection; | |||||
using scg = global::System.Collections.Generic; | |||||
/// <summary>Holder for reflection information generated from geosite.proto</summary> | |||||
public static partial class GeositeReflection { | |||||
#region Descriptor | |||||
/// <summary>File descriptor for geosite.proto</summary> | |||||
public static pbr::FileDescriptor Descriptor { | |||||
get { return descriptor; } | |||||
} | |||||
private static pbr::FileDescriptor descriptor; | |||||
static GeositeReflection() { | |||||
byte[] descriptorData = global::System.Convert.FromBase64String( | |||||
string.Concat( | |||||
"Cg1nZW9zaXRlLnByb3RvIvMBCgxEb21haW5PYmplY3QSIAoEdHlwZRgBIAEo", | |||||
"DjISLkRvbWFpbk9iamVjdC5UeXBlEg0KBXZhbHVlGAIgASgJEioKCWF0dHJp", | |||||
"YnV0ZRgDIAMoCzIXLkRvbWFpbk9iamVjdC5BdHRyaWJ1dGUaUgoJQXR0cmli", | |||||
"dXRlEgsKA2tleRgBIAEoCRIUCgpib29sX3ZhbHVlGAIgASgISAASEwoJaW50", | |||||
"X3ZhbHVlGAMgASgDSABCDQoLdHlwZWRfdmFsdWUiMgoEVHlwZRIJCgVQbGFp", | |||||
"bhAAEgkKBVJlZ2V4EAESCgoGRG9tYWluEAISCAoERnVsbBADIj0KB0dlb3Np", | |||||
"dGUSEgoKZ3JvdXBfbmFtZRgBIAEoCRIeCgdkb21haW5zGAIgAygLMg0uRG9t", | |||||
"YWluT2JqZWN0IigKC0dlb3NpdGVMaXN0EhkKB2VudHJpZXMYASADKAsyCC5H", | |||||
"ZW9zaXRlYgZwcm90bzM=")); | |||||
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, | |||||
new pbr::FileDescriptor[] { }, | |||||
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { | |||||
new pbr::GeneratedClrTypeInfo(typeof(global::DomainObject), global::DomainObject.Parser, new[]{ "Type", "Value", "Attribute" }, null, new[]{ typeof(global::DomainObject.Types.Type) }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::DomainObject.Types.Attribute), global::DomainObject.Types.Attribute.Parser, new[]{ "Key", "BoolValue", "IntValue" }, new[]{ "TypedValue" }, null, null, null)}), | |||||
new pbr::GeneratedClrTypeInfo(typeof(global::Geosite), global::Geosite.Parser, new[]{ "GroupName", "Domains" }, null, null, null, null), | |||||
new pbr::GeneratedClrTypeInfo(typeof(global::GeositeList), global::GeositeList.Parser, new[]{ "Entries" }, null, null, null, null) | |||||
})); | |||||
} | |||||
#endregion | |||||
} | |||||
#region Messages | |||||
/// <summary> | |||||
/// DomainObject for routing decision. | |||||
/// </summary> | |||||
public sealed partial class DomainObject : pb::IMessage<DomainObject> { | |||||
private static readonly pb::MessageParser<DomainObject> _parser = new pb::MessageParser<DomainObject>(() => new DomainObject()); | |||||
private pb::UnknownFieldSet _unknownFields; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pb::MessageParser<DomainObject> Parser { get { return _parser; } } | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pbr::MessageDescriptor Descriptor { | |||||
get { return global::GeositeReflection.Descriptor.MessageTypes[0]; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
get { return Descriptor; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public DomainObject() { | |||||
OnConstruction(); | |||||
} | |||||
partial void OnConstruction(); | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public DomainObject(DomainObject other) : this() { | |||||
type_ = other.type_; | |||||
value_ = other.value_; | |||||
attribute_ = other.attribute_.Clone(); | |||||
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public DomainObject Clone() { | |||||
return new DomainObject(this); | |||||
} | |||||
/// <summary>Field number for the "type" field.</summary> | |||||
public const int TypeFieldNumber = 1; | |||||
private global::DomainObject.Types.Type type_ = global::DomainObject.Types.Type.Plain; | |||||
/// <summary> | |||||
/// DomainObject matching type. | |||||
/// </summary> | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public global::DomainObject.Types.Type Type { | |||||
get { return type_; } | |||||
set { | |||||
type_ = value; | |||||
} | |||||
} | |||||
/// <summary>Field number for the "value" field.</summary> | |||||
public const int ValueFieldNumber = 2; | |||||
private string value_ = ""; | |||||
/// <summary> | |||||
/// DomainObject value. | |||||
/// </summary> | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public string Value { | |||||
get { return value_; } | |||||
set { | |||||
value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); | |||||
} | |||||
} | |||||
/// <summary>Field number for the "attribute" field.</summary> | |||||
public const int AttributeFieldNumber = 3; | |||||
private static readonly pb::FieldCodec<global::DomainObject.Types.Attribute> _repeated_attribute_codec | |||||
= pb::FieldCodec.ForMessage(26, global::DomainObject.Types.Attribute.Parser); | |||||
private readonly pbc::RepeatedField<global::DomainObject.Types.Attribute> attribute_ = new pbc::RepeatedField<global::DomainObject.Types.Attribute>(); | |||||
/// <summary> | |||||
/// Attributes of this domain. May be used for filtering. | |||||
/// </summary> | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public pbc::RepeatedField<global::DomainObject.Types.Attribute> Attribute { | |||||
get { return attribute_; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override bool Equals(object other) { | |||||
return Equals(other as DomainObject); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public bool Equals(DomainObject other) { | |||||
if (ReferenceEquals(other, null)) { | |||||
return false; | |||||
} | |||||
if (ReferenceEquals(other, this)) { | |||||
return true; | |||||
} | |||||
if (Type != other.Type) return false; | |||||
if (Value != other.Value) return false; | |||||
if(!attribute_.Equals(other.attribute_)) return false; | |||||
return Equals(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override int GetHashCode() { | |||||
int hash = 1; | |||||
if (Type != global::DomainObject.Types.Type.Plain) hash ^= Type.GetHashCode(); | |||||
if (Value.Length != 0) hash ^= Value.GetHashCode(); | |||||
hash ^= attribute_.GetHashCode(); | |||||
if (_unknownFields != null) { | |||||
hash ^= _unknownFields.GetHashCode(); | |||||
} | |||||
return hash; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override string ToString() { | |||||
return pb::JsonFormatter.ToDiagnosticString(this); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void WriteTo(pb::CodedOutputStream output) { | |||||
if (Type != global::DomainObject.Types.Type.Plain) { | |||||
output.WriteRawTag(8); | |||||
output.WriteEnum((int) Type); | |||||
} | |||||
if (Value.Length != 0) { | |||||
output.WriteRawTag(18); | |||||
output.WriteString(Value); | |||||
} | |||||
attribute_.WriteTo(output, _repeated_attribute_codec); | |||||
if (_unknownFields != null) { | |||||
_unknownFields.WriteTo(output); | |||||
} | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public int CalculateSize() { | |||||
int size = 0; | |||||
if (Type != global::DomainObject.Types.Type.Plain) { | |||||
size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); | |||||
} | |||||
if (Value.Length != 0) { | |||||
size += 1 + pb::CodedOutputStream.ComputeStringSize(Value); | |||||
} | |||||
size += attribute_.CalculateSize(_repeated_attribute_codec); | |||||
if (_unknownFields != null) { | |||||
size += _unknownFields.CalculateSize(); | |||||
} | |||||
return size; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(DomainObject other) { | |||||
if (other == null) { | |||||
return; | |||||
} | |||||
if (other.Type != global::DomainObject.Types.Type.Plain) { | |||||
Type = other.Type; | |||||
} | |||||
if (other.Value.Length != 0) { | |||||
Value = other.Value; | |||||
} | |||||
attribute_.Add(other.attribute_); | |||||
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(pb::CodedInputStream input) { | |||||
uint tag; | |||||
while ((tag = input.ReadTag()) != 0) { | |||||
switch(tag) { | |||||
default: | |||||
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
break; | |||||
case 8: { | |||||
Type = (global::DomainObject.Types.Type) input.ReadEnum(); | |||||
break; | |||||
} | |||||
case 18: { | |||||
Value = input.ReadString(); | |||||
break; | |||||
} | |||||
case 26: { | |||||
attribute_.AddEntriesFrom(input, _repeated_attribute_codec); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
#region Nested types | |||||
/// <summary>Container for nested types declared in the DomainObject message type.</summary> | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static partial class Types { | |||||
/// <summary> | |||||
/// Type of domain value. | |||||
/// </summary> | |||||
public enum Type { | |||||
/// <summary> | |||||
/// The value is used as is. | |||||
/// </summary> | |||||
[pbr::OriginalName("Plain")] Plain = 0, | |||||
/// <summary> | |||||
/// The value is used as a regular expression. | |||||
/// </summary> | |||||
[pbr::OriginalName("Regex")] Regex = 1, | |||||
/// <summary> | |||||
/// The value is a root domain. | |||||
/// </summary> | |||||
[pbr::OriginalName("Domain")] Domain = 2, | |||||
/// <summary> | |||||
/// The value is a domain. | |||||
/// </summary> | |||||
[pbr::OriginalName("Full")] Full = 3, | |||||
} | |||||
public sealed partial class Attribute : pb::IMessage<Attribute> { | |||||
private static readonly pb::MessageParser<Attribute> _parser = new pb::MessageParser<Attribute>(() => new Attribute()); | |||||
private pb::UnknownFieldSet _unknownFields; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pb::MessageParser<Attribute> Parser { get { return _parser; } } | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pbr::MessageDescriptor Descriptor { | |||||
get { return global::DomainObject.Descriptor.NestedTypes[0]; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
get { return Descriptor; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public Attribute() { | |||||
OnConstruction(); | |||||
} | |||||
partial void OnConstruction(); | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public Attribute(Attribute other) : this() { | |||||
key_ = other.key_; | |||||
switch (other.TypedValueCase) { | |||||
case TypedValueOneofCase.BoolValue: | |||||
BoolValue = other.BoolValue; | |||||
break; | |||||
case TypedValueOneofCase.IntValue: | |||||
IntValue = other.IntValue; | |||||
break; | |||||
} | |||||
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public Attribute Clone() { | |||||
return new Attribute(this); | |||||
} | |||||
/// <summary>Field number for the "key" field.</summary> | |||||
public const int KeyFieldNumber = 1; | |||||
private string key_ = ""; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public string Key { | |||||
get { return key_; } | |||||
set { | |||||
key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); | |||||
} | |||||
} | |||||
/// <summary>Field number for the "bool_value" field.</summary> | |||||
public const int BoolValueFieldNumber = 2; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public bool BoolValue { | |||||
get { return typedValueCase_ == TypedValueOneofCase.BoolValue ? (bool) typedValue_ : false; } | |||||
set { | |||||
typedValue_ = value; | |||||
typedValueCase_ = TypedValueOneofCase.BoolValue; | |||||
} | |||||
} | |||||
/// <summary>Field number for the "int_value" field.</summary> | |||||
public const int IntValueFieldNumber = 3; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public long IntValue { | |||||
get { return typedValueCase_ == TypedValueOneofCase.IntValue ? (long) typedValue_ : 0L; } | |||||
set { | |||||
typedValue_ = value; | |||||
typedValueCase_ = TypedValueOneofCase.IntValue; | |||||
} | |||||
} | |||||
private object typedValue_; | |||||
/// <summary>Enum of possible cases for the "typed_value" oneof.</summary> | |||||
public enum TypedValueOneofCase { | |||||
None = 0, | |||||
BoolValue = 2, | |||||
IntValue = 3, | |||||
} | |||||
private TypedValueOneofCase typedValueCase_ = TypedValueOneofCase.None; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public TypedValueOneofCase TypedValueCase { | |||||
get { return typedValueCase_; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void ClearTypedValue() { | |||||
typedValueCase_ = TypedValueOneofCase.None; | |||||
typedValue_ = null; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override bool Equals(object other) { | |||||
return Equals(other as Attribute); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public bool Equals(Attribute other) { | |||||
if (ReferenceEquals(other, null)) { | |||||
return false; | |||||
} | |||||
if (ReferenceEquals(other, this)) { | |||||
return true; | |||||
} | |||||
if (Key != other.Key) return false; | |||||
if (BoolValue != other.BoolValue) return false; | |||||
if (IntValue != other.IntValue) return false; | |||||
if (TypedValueCase != other.TypedValueCase) return false; | |||||
return Equals(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override int GetHashCode() { | |||||
int hash = 1; | |||||
if (Key.Length != 0) hash ^= Key.GetHashCode(); | |||||
if (typedValueCase_ == TypedValueOneofCase.BoolValue) hash ^= BoolValue.GetHashCode(); | |||||
if (typedValueCase_ == TypedValueOneofCase.IntValue) hash ^= IntValue.GetHashCode(); | |||||
hash ^= (int) typedValueCase_; | |||||
if (_unknownFields != null) { | |||||
hash ^= _unknownFields.GetHashCode(); | |||||
} | |||||
return hash; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override string ToString() { | |||||
return pb::JsonFormatter.ToDiagnosticString(this); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void WriteTo(pb::CodedOutputStream output) { | |||||
if (Key.Length != 0) { | |||||
output.WriteRawTag(10); | |||||
output.WriteString(Key); | |||||
} | |||||
if (typedValueCase_ == TypedValueOneofCase.BoolValue) { | |||||
output.WriteRawTag(16); | |||||
output.WriteBool(BoolValue); | |||||
} | |||||
if (typedValueCase_ == TypedValueOneofCase.IntValue) { | |||||
output.WriteRawTag(24); | |||||
output.WriteInt64(IntValue); | |||||
} | |||||
if (_unknownFields != null) { | |||||
_unknownFields.WriteTo(output); | |||||
} | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public int CalculateSize() { | |||||
int size = 0; | |||||
if (Key.Length != 0) { | |||||
size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); | |||||
} | |||||
if (typedValueCase_ == TypedValueOneofCase.BoolValue) { | |||||
size += 1 + 1; | |||||
} | |||||
if (typedValueCase_ == TypedValueOneofCase.IntValue) { | |||||
size += 1 + pb::CodedOutputStream.ComputeInt64Size(IntValue); | |||||
} | |||||
if (_unknownFields != null) { | |||||
size += _unknownFields.CalculateSize(); | |||||
} | |||||
return size; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(Attribute other) { | |||||
if (other == null) { | |||||
return; | |||||
} | |||||
if (other.Key.Length != 0) { | |||||
Key = other.Key; | |||||
} | |||||
switch (other.TypedValueCase) { | |||||
case TypedValueOneofCase.BoolValue: | |||||
BoolValue = other.BoolValue; | |||||
break; | |||||
case TypedValueOneofCase.IntValue: | |||||
IntValue = other.IntValue; | |||||
break; | |||||
} | |||||
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(pb::CodedInputStream input) { | |||||
uint tag; | |||||
while ((tag = input.ReadTag()) != 0) { | |||||
switch(tag) { | |||||
default: | |||||
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
break; | |||||
case 10: { | |||||
Key = input.ReadString(); | |||||
break; | |||||
} | |||||
case 16: { | |||||
BoolValue = input.ReadBool(); | |||||
break; | |||||
} | |||||
case 24: { | |||||
IntValue = input.ReadInt64(); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
#endregion | |||||
} | |||||
public sealed partial class Geosite : pb::IMessage<Geosite> { | |||||
private static readonly pb::MessageParser<Geosite> _parser = new pb::MessageParser<Geosite>(() => new Geosite()); | |||||
private pb::UnknownFieldSet _unknownFields; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pb::MessageParser<Geosite> Parser { get { return _parser; } } | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pbr::MessageDescriptor Descriptor { | |||||
get { return global::GeositeReflection.Descriptor.MessageTypes[1]; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
get { return Descriptor; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public Geosite() { | |||||
OnConstruction(); | |||||
} | |||||
partial void OnConstruction(); | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public Geosite(Geosite other) : this() { | |||||
groupName_ = other.groupName_; | |||||
domains_ = other.domains_.Clone(); | |||||
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public Geosite Clone() { | |||||
return new Geosite(this); | |||||
} | |||||
/// <summary>Field number for the "group_name" field.</summary> | |||||
public const int GroupNameFieldNumber = 1; | |||||
private string groupName_ = ""; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public string GroupName { | |||||
get { return groupName_; } | |||||
set { | |||||
groupName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); | |||||
} | |||||
} | |||||
/// <summary>Field number for the "domains" field.</summary> | |||||
public const int DomainsFieldNumber = 2; | |||||
private static readonly pb::FieldCodec<global::DomainObject> _repeated_domains_codec | |||||
= pb::FieldCodec.ForMessage(18, global::DomainObject.Parser); | |||||
private readonly pbc::RepeatedField<global::DomainObject> domains_ = new pbc::RepeatedField<global::DomainObject>(); | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public pbc::RepeatedField<global::DomainObject> Domains { | |||||
get { return domains_; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override bool Equals(object other) { | |||||
return Equals(other as Geosite); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public bool Equals(Geosite other) { | |||||
if (ReferenceEquals(other, null)) { | |||||
return false; | |||||
} | |||||
if (ReferenceEquals(other, this)) { | |||||
return true; | |||||
} | |||||
if (GroupName != other.GroupName) return false; | |||||
if(!domains_.Equals(other.domains_)) return false; | |||||
return Equals(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override int GetHashCode() { | |||||
int hash = 1; | |||||
if (GroupName.Length != 0) hash ^= GroupName.GetHashCode(); | |||||
hash ^= domains_.GetHashCode(); | |||||
if (_unknownFields != null) { | |||||
hash ^= _unknownFields.GetHashCode(); | |||||
} | |||||
return hash; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override string ToString() { | |||||
return pb::JsonFormatter.ToDiagnosticString(this); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void WriteTo(pb::CodedOutputStream output) { | |||||
if (GroupName.Length != 0) { | |||||
output.WriteRawTag(10); | |||||
output.WriteString(GroupName); | |||||
} | |||||
domains_.WriteTo(output, _repeated_domains_codec); | |||||
if (_unknownFields != null) { | |||||
_unknownFields.WriteTo(output); | |||||
} | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public int CalculateSize() { | |||||
int size = 0; | |||||
if (GroupName.Length != 0) { | |||||
size += 1 + pb::CodedOutputStream.ComputeStringSize(GroupName); | |||||
} | |||||
size += domains_.CalculateSize(_repeated_domains_codec); | |||||
if (_unknownFields != null) { | |||||
size += _unknownFields.CalculateSize(); | |||||
} | |||||
return size; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(Geosite other) { | |||||
if (other == null) { | |||||
return; | |||||
} | |||||
if (other.GroupName.Length != 0) { | |||||
GroupName = other.GroupName; | |||||
} | |||||
domains_.Add(other.domains_); | |||||
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(pb::CodedInputStream input) { | |||||
uint tag; | |||||
while ((tag = input.ReadTag()) != 0) { | |||||
switch(tag) { | |||||
default: | |||||
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
break; | |||||
case 10: { | |||||
GroupName = input.ReadString(); | |||||
break; | |||||
} | |||||
case 18: { | |||||
domains_.AddEntriesFrom(input, _repeated_domains_codec); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
public sealed partial class GeositeList : pb::IMessage<GeositeList> { | |||||
private static readonly pb::MessageParser<GeositeList> _parser = new pb::MessageParser<GeositeList>(() => new GeositeList()); | |||||
private pb::UnknownFieldSet _unknownFields; | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pb::MessageParser<GeositeList> Parser { get { return _parser; } } | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public static pbr::MessageDescriptor Descriptor { | |||||
get { return global::GeositeReflection.Descriptor.MessageTypes[2]; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
get { return Descriptor; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public GeositeList() { | |||||
OnConstruction(); | |||||
} | |||||
partial void OnConstruction(); | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public GeositeList(GeositeList other) : this() { | |||||
entries_ = other.entries_.Clone(); | |||||
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public GeositeList Clone() { | |||||
return new GeositeList(this); | |||||
} | |||||
/// <summary>Field number for the "entries" field.</summary> | |||||
public const int EntriesFieldNumber = 1; | |||||
private static readonly pb::FieldCodec<global::Geosite> _repeated_entries_codec | |||||
= pb::FieldCodec.ForMessage(10, global::Geosite.Parser); | |||||
private readonly pbc::RepeatedField<global::Geosite> entries_ = new pbc::RepeatedField<global::Geosite>(); | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public pbc::RepeatedField<global::Geosite> Entries { | |||||
get { return entries_; } | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override bool Equals(object other) { | |||||
return Equals(other as GeositeList); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public bool Equals(GeositeList other) { | |||||
if (ReferenceEquals(other, null)) { | |||||
return false; | |||||
} | |||||
if (ReferenceEquals(other, this)) { | |||||
return true; | |||||
} | |||||
if(!entries_.Equals(other.entries_)) return false; | |||||
return Equals(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override int GetHashCode() { | |||||
int hash = 1; | |||||
hash ^= entries_.GetHashCode(); | |||||
if (_unknownFields != null) { | |||||
hash ^= _unknownFields.GetHashCode(); | |||||
} | |||||
return hash; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public override string ToString() { | |||||
return pb::JsonFormatter.ToDiagnosticString(this); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void WriteTo(pb::CodedOutputStream output) { | |||||
entries_.WriteTo(output, _repeated_entries_codec); | |||||
if (_unknownFields != null) { | |||||
_unknownFields.WriteTo(output); | |||||
} | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public int CalculateSize() { | |||||
int size = 0; | |||||
size += entries_.CalculateSize(_repeated_entries_codec); | |||||
if (_unknownFields != null) { | |||||
size += _unknownFields.CalculateSize(); | |||||
} | |||||
return size; | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(GeositeList other) { | |||||
if (other == null) { | |||||
return; | |||||
} | |||||
entries_.Add(other.entries_); | |||||
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
} | |||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
public void MergeFrom(pb::CodedInputStream input) { | |||||
uint tag; | |||||
while ((tag = input.ReadTag()) != 0) { | |||||
switch(tag) { | |||||
default: | |||||
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
break; | |||||
case 10: { | |||||
entries_.AddEntriesFrom(input, _repeated_entries_codec); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
#endregion | |||||
#endregion Designer generated code |
@@ -0,0 +1,43 @@ | |||||
syntax = "proto3"; | |||||
// DomainObject for routing decision. | |||||
message DomainObject { | |||||
// Type of domain value. | |||||
enum Type { | |||||
// The value is used as is. | |||||
Plain = 0; | |||||
// The value is used as a regular expression. | |||||
Regex = 1; | |||||
// The value is a root domain. | |||||
Domain = 2; | |||||
// The value is a domain. | |||||
Full = 3; | |||||
} | |||||
// DomainObject matching type. | |||||
Type type = 1; | |||||
// DomainObject value. | |||||
string value = 2; | |||||
message Attribute { | |||||
string key = 1; | |||||
oneof typed_value { | |||||
bool bool_value = 2; | |||||
int64 int_value = 3; | |||||
} | |||||
} | |||||
// Attributes of this domain. May be used for filtering. | |||||
repeated Attribute attribute = 3; | |||||
} | |||||
message Geosite { | |||||
string group_name = 1; | |||||
repeated DomainObject domains = 2; | |||||
} | |||||
message GeositeList{ | |||||
repeated Geosite entries = 1; | |||||
} |
@@ -155,7 +155,6 @@ namespace Shadowsocks | |||||
{ | { | ||||
MainController.AskAddServerBySSURL(addedUrl); | MainController.AskAddServerBySSURL(addedUrl); | ||||
} | } | ||||
Application.Run(); | Application.Run(); | ||||
} | } | ||||
@@ -1,10 +1,10 @@ | |||||
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||
// <auto-generated> | // <auto-generated> | ||||
// This code was generated by a tool. | |||||
// Runtime Version:4.0.30319.42000 | |||||
// 此代码由工具生成。 | |||||
// 运行时版本:4.0.30319.42000 | |||||
// | // | ||||
// Changes to this file may cause incorrect behavior and will be lost if | |||||
// the code is regenerated. | |||||
// 对此文件的更改可能会导致不正确的行为,并且如果 | |||||
// 重新生成代码,这些更改将会丢失。 | |||||
// </auto-generated> | // </auto-generated> | ||||
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||
@@ -13,12 +13,12 @@ namespace Shadowsocks.Properties { | |||||
/// <summary> | /// <summary> | ||||
/// A strongly-typed resource class, for looking up localized strings, etc. | |||||
/// 一个强类型的资源类,用于查找本地化的字符串等。 | |||||
/// </summary> | /// </summary> | ||||
// This class was auto-generated by the StronglyTypedResourceBuilder | |||||
// class via a tool like ResGen or Visual Studio. | |||||
// To add or remove a member, edit your .ResX file then rerun ResGen | |||||
// with the /str option, or rebuild your VS project. | |||||
// 此类是由 StronglyTypedResourceBuilder | |||||
// 类通过类似于 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", "16.0.0.0")] | ||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | ||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | ||||
@@ -33,7 +33,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Returns the cached ResourceManager instance used by this class. | |||||
/// 返回此类使用的缓存的 ResourceManager 实例。 | |||||
/// </summary> | /// </summary> | ||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | ||||
internal static global::System.Resources.ResourceManager ResourceManager { | internal static global::System.Resources.ResourceManager ResourceManager { | ||||
@@ -47,8 +47,8 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Overrides the current thread's CurrentUICulture property for all | |||||
/// resource lookups using this strongly typed resource class. | |||||
/// 重写当前线程的 CurrentUICulture 属性 | |||||
/// 重写当前线程的 CurrentUICulture 属性。 | |||||
/// </summary> | /// </summary> | ||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | ||||
internal static global::System.Globalization.CultureInfo Culture { | internal static global::System.Globalization.CultureInfo Culture { | ||||
@@ -61,7 +61,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to /* eslint-disable */ | |||||
/// 查找类似 /* eslint-disable */ | |||||
///// Was generated by gfwlist2pac in precise mode | ///// Was generated by gfwlist2pac in precise mode | ||||
///// https://github.com/clowwindy/gfwlist2pac | ///// https://github.com/clowwindy/gfwlist2pac | ||||
/// | /// | ||||
@@ -76,7 +76,7 @@ namespace Shadowsocks.Properties { | |||||
///* This file is part of Adblock Plus <http://adblockplus.org/>, | ///* This file is part of Adblock Plus <http://adblockplus.org/>, | ||||
///* Copyright (C) 2006-2014 Eyeo GmbH | ///* Copyright (C) 2006-2014 Eyeo GmbH | ||||
///* | ///* | ||||
///* Adblock Plus is free software: you can redistribute it and/or [rest of string was truncated]";. | |||||
///* Adblock Plus is free software: you can redistribute it and/or [字符串的其余部分被截断]"; 的本地化字符串。 | |||||
/// </summary> | /// </summary> | ||||
internal static string abp_js { | internal static string abp_js { | ||||
get { | get { | ||||
@@ -85,55 +85,29 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to var __USERRULES__ = []; | |||||
///var __RULES__ = [ | |||||
/// "|http://85.17.73.31/", | |||||
/// "||agnesb.fr", | |||||
/// "||akiba-web.com", | |||||
/// "||altrec.com", | |||||
/// "||angela-merkel.de", | |||||
/// "||angola.org", | |||||
/// "||apartmentratings.com", | |||||
/// "||apartments.com", | |||||
/// "||arena.taipei", | |||||
/// "||asianspiss.com", | |||||
/// "||assimp.org", | |||||
/// "||athenaeizou.com", | |||||
/// "||azubu.tv", | |||||
/// "||bankmobilevibe.com", | |||||
/// "||banorte.com", | |||||
/// "||bash-hackers.org", | |||||
/// "||beeg.com", | |||||
/// "||global.bing.com", | |||||
/// "||bloombergview.com", | |||||
/// "||booktopia.com.au", | |||||
/// [rest of string was truncated]";. | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static string default_abp_rule { | |||||
internal static byte[] dlc_dat { | |||||
get { | get { | ||||
return ResourceManager.GetString("default_abp_rule", resourceCulture); | |||||
object obj = ResourceManager.GetObject("dlc_dat", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | } | ||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to en,zh-CN,zh-TW,ja | |||||
///#Restart program to apply translation,,, | |||||
///#This is comment line,,, | |||||
///#Always keep language name at head of file,,, | |||||
///#Language name is output in log,,, | |||||
///"#You can find it by search ""Current language is:""",,, | |||||
///#Please use UTF-8 with BOM encoding so we can edit it in Excel,,, | |||||
///,,, | |||||
///Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks | |||||
///,,, | |||||
///#Menu,,, | |||||
///,,, | |||||
///System Proxy,系统代理,系統代理,システムプロキシ | |||||
///Disable,禁用,禁用,無効 | |||||
///PAC,PAC 模式,PAC 模式,PAC | |||||
///Global,全局模式,全局模式,全般 | |||||
///Servers,服务器,伺服器,サーバー | |||||
///Edit Servers...,编辑服务器...,編輯伺服器...,サーバーの編集.. [rest of string was truncated]";. | |||||
/// 查找类似 en,ru-RU,zh-CN,zh-TW,ja,ko,fr | |||||
///#Restart program to apply translation,,,,,, | |||||
///#This is comment line,,,,,, | |||||
///#Always keep language name at head of file,,,,,, | |||||
///#Language name is output in log,,,,,, | |||||
///"#You can find it by search ""Current language is:""",,,,,, | |||||
///#Please use UTF-8 with BOM encoding so we can edit it in Excel,,,,,, | |||||
///,,,,,, | |||||
///Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks | |||||
///,,,,,, | |||||
///#Menu,,,,,, | |||||
///,,,,,, | |||||
///System Proxy,Системный прокси-сервер,系统代理,系統代理,システムプロキシ,시스템 프록시,P [字符串的其余部分被截断]"; 的本地化字符串。 | |||||
/// </summary> | /// </summary> | ||||
internal static string i18n_csv { | internal static string i18n_csv { | ||||
get { | get { | ||||
@@ -142,7 +116,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static byte[] libsscrypto_dll { | internal static byte[] libsscrypto_dll { | ||||
get { | get { | ||||
@@ -152,16 +126,13 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> | |||||
/// 查找类似 <?xml version="1.0" encoding="utf-8" ?> | |||||
///<!-- Warning: Configuration may reset after shadowsocks upgrade. --> | |||||
///<!-- If you messed it up, delete this file and Shadowsocks will create a new one. --> | |||||
///<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ///<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||||
/// <targets> | /// <targets> | ||||
/// <target name="file" xsi:type="File" fileName="shadowsocks.log"/> | |||||
/// | |||||
/// </targets> | |||||
/// <rules> | |||||
/// <logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> | |||||
/// </rules> | |||||
///</nlog>. | |||||
/// <!-- This line is managed by Shadowsocks. Do not modify it unless you know what you are doing.--> | |||||
/// <target name="file" xsi:type="File" fileName="ss_win_temp\shadowsocks.log" writ [字符串的其余部分被截断]"; 的本地化字符串。 | |||||
/// </summary> | /// </summary> | ||||
internal static string NLog_config { | internal static string NLog_config { | ||||
get { | get { | ||||
@@ -170,7 +141,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ | |||||
/// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ | |||||
///toggle 0 | ///toggle 0 | ||||
///logfile ss_privoxy.log | ///logfile ss_privoxy.log | ||||
///show-on-task-bar 0 | ///show-on-task-bar 0 | ||||
@@ -178,7 +149,7 @@ namespace Shadowsocks.Properties { | |||||
///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . | ///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . | ||||
///max-client-connections 2048 | ///max-client-connections 2048 | ||||
///hide-console | ///hide-console | ||||
///. | |||||
/// 的本地化字符串。 | |||||
/// </summary> | /// </summary> | ||||
internal static string privoxy_conf { | internal static string privoxy_conf { | ||||
get { | get { | ||||
@@ -187,7 +158,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static byte[] privoxy_exe { | internal static byte[] privoxy_exe { | ||||
get { | get { | ||||
@@ -197,7 +168,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static System.Drawing.Bitmap ss32Fill { | internal static System.Drawing.Bitmap ss32Fill { | ||||
get { | get { | ||||
@@ -207,7 +178,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static System.Drawing.Bitmap ss32In { | internal static System.Drawing.Bitmap ss32In { | ||||
get { | get { | ||||
@@ -217,7 +188,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static System.Drawing.Bitmap ss32Out { | internal static System.Drawing.Bitmap ss32Out { | ||||
get { | get { | ||||
@@ -227,7 +198,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static System.Drawing.Bitmap ss32Outline { | internal static System.Drawing.Bitmap ss32Outline { | ||||
get { | get { | ||||
@@ -237,7 +208,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Drawing.Bitmap. | |||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static System.Drawing.Bitmap ssw128 { | internal static System.Drawing.Bitmap ssw128 { | ||||
get { | get { | ||||
@@ -247,7 +218,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static byte[] sysproxy_exe { | internal static byte[] sysproxy_exe { | ||||
get { | get { | ||||
@@ -257,7 +228,7 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// 查找 System.Byte[] 类型的本地化资源。 | |||||
/// </summary> | /// </summary> | ||||
internal static byte[] sysproxy64_exe { | internal static byte[] sysproxy64_exe { | ||||
get { | get { | ||||
@@ -267,9 +238,9 @@ namespace Shadowsocks.Properties { | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized string similar to ! Put user rules line by line in this file. | |||||
/// 查找类似 ! Put user rules line by line in this file. | |||||
///! See https://adblockplus.org/en/filter-cheatsheet | ///! See https://adblockplus.org/en/filter-cheatsheet | ||||
///. | |||||
/// 的本地化字符串。 | |||||
/// </summary> | /// </summary> | ||||
internal static string user_rule { | internal static string user_rule { | ||||
get { | get { | ||||
@@ -121,8 +121,8 @@ | |||||
<data name="abp_js" type="System.Resources.ResXFileRef, System.Windows.Forms"> | <data name="abp_js" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||||
<value>..\Data\abp.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value> | <value>..\Data\abp.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value> | ||||
</data> | </data> | ||||
<data name="default_abp_rule" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||||
<value>..\Data\default-abp-rule.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | |||||
<data name="dlc_dat" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||||
<value>..\data\dlc.dat;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
</data> | </data> | ||||
<data name="i18n_csv" type="System.Resources.ResXFileRef, System.Windows.Forms"> | <data name="i18n_csv" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||||
<value>..\Data\i18n.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | <value>..\Data\i18n.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> | ||||
@@ -46,7 +46,7 @@ namespace Shadowsocks.View | |||||
private MenuItem localPACItem; | private MenuItem localPACItem; | ||||
private MenuItem onlinePACItem; | private MenuItem onlinePACItem; | ||||
private MenuItem editLocalPACItem; | private MenuItem editLocalPACItem; | ||||
private MenuItem updateFromGFWListItem; | |||||
private MenuItem updateFromGeositeItem; | |||||
private MenuItem editGFWUserRuleItem; | private MenuItem editGFWUserRuleItem; | ||||
private MenuItem editOnlinePACItem; | private MenuItem editOnlinePACItem; | ||||
private MenuItem secureLocalPacUrlToggleItem; | private MenuItem secureLocalPacUrlToggleItem; | ||||
@@ -86,8 +86,8 @@ namespace Shadowsocks.View | |||||
controller.ShowPluginOutputChanged += controller_ShowPluginOutputChanged; | controller.ShowPluginOutputChanged += controller_ShowPluginOutputChanged; | ||||
controller.EnableGlobalChanged += controller_EnableGlobalChanged; | controller.EnableGlobalChanged += controller_EnableGlobalChanged; | ||||
controller.Errored += controller_Errored; | controller.Errored += controller_Errored; | ||||
controller.UpdatePACFromGFWListCompleted += controller_UpdatePACFromGFWListCompleted; | |||||
controller.UpdatePACFromGFWListError += controller_UpdatePACFromGFWListError; | |||||
controller.UpdatePACFromGeositeCompleted += controller_UpdatePACFromGeositeCompleted; | |||||
controller.UpdatePACFromGeositeError += controller_UpdatePACFromGeositeError; | |||||
_notifyIcon = new NotifyIcon(); | _notifyIcon = new NotifyIcon(); | ||||
UpdateTrayIconAndNotifyText(); | UpdateTrayIconAndNotifyText(); | ||||
@@ -307,8 +307,8 @@ namespace Shadowsocks.View | |||||
this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), | this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), | ||||
new MenuItem("-"), | new MenuItem("-"), | ||||
this.editLocalPACItem = CreateMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)), | this.editLocalPACItem = CreateMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)), | ||||
this.updateFromGFWListItem = CreateMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), | |||||
this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), | |||||
this.updateFromGeositeItem = CreateMenuItem("Update Local PAC from Geosite", new EventHandler(this.UpdatePACFromGeositeItem_Click)), | |||||
this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for Geosite...", new EventHandler(this.EditUserRuleFileForGeositeItem_Click)), | |||||
this.secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)), | this.secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)), | ||||
CreateMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)), | CreateMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)), | ||||
this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), | this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), | ||||
@@ -387,17 +387,17 @@ namespace Shadowsocks.View | |||||
_notifyIcon.ShowBalloonTip(timeout); | _notifyIcon.ShowBalloonTip(timeout); | ||||
} | } | ||||
void controller_UpdatePACFromGFWListError(object sender, System.IO.ErrorEventArgs e) | |||||
void controller_UpdatePACFromGeositeError(object sender, System.IO.ErrorEventArgs e) | |||||
{ | { | ||||
ShowBalloonTip(I18N.GetString("Failed to update PAC file"), e.GetException().Message, ToolTipIcon.Error, 5000); | ShowBalloonTip(I18N.GetString("Failed to update PAC file"), e.GetException().Message, ToolTipIcon.Error, 5000); | ||||
logger.LogUsefulException(e.GetException()); | logger.LogUsefulException(e.GetException()); | ||||
} | } | ||||
void controller_UpdatePACFromGFWListCompleted(object sender, GFWListUpdater.ResultEventArgs e) | |||||
void controller_UpdatePACFromGeositeCompleted(object sender, GeositeResultEventArgs e) | |||||
{ | { | ||||
string result = e.Success | string result = e.Success | ||||
? I18N.GetString("PAC updated") | ? I18N.GetString("PAC updated") | ||||
: I18N.GetString("No updates found. Please report to GFWList if you have problems with it."); | |||||
: I18N.GetString("No updates found. Please report to Geosite if you have problems with it."); | |||||
ShowBalloonTip(I18N.GetString("Shadowsocks"), result, ToolTipIcon.Info, 1000); | ShowBalloonTip(I18N.GetString("Shadowsocks"), result, ToolTipIcon.Info, 1000); | ||||
} | } | ||||
@@ -685,12 +685,12 @@ namespace Shadowsocks.View | |||||
controller.TouchPACFile(); | controller.TouchPACFile(); | ||||
} | } | ||||
private void UpdatePACFromGFWListItem_Click(object sender, EventArgs e) | |||||
private void UpdatePACFromGeositeItem_Click(object sender, EventArgs e) | |||||
{ | { | ||||
controller.UpdatePACFromGFWList(); | |||||
controller.UpdatePACFromGeosite(); | |||||
} | } | ||||
private void EditUserRuleFileForGFWListItem_Click(object sender, EventArgs e) | |||||
private void EditUserRuleFileForGeositeItem_Click(object sender, EventArgs e) | |||||
{ | { | ||||
controller.TouchUserRuleFile(); | controller.TouchUserRuleFile(); | ||||
} | } | ||||
@@ -917,14 +917,14 @@ namespace Shadowsocks.View | |||||
if (this.localPACItem.Checked) | if (this.localPACItem.Checked) | ||||
{ | { | ||||
this.editLocalPACItem.Enabled = true; | this.editLocalPACItem.Enabled = true; | ||||
this.updateFromGFWListItem.Enabled = true; | |||||
this.updateFromGeositeItem.Enabled = true; | |||||
this.editGFWUserRuleItem.Enabled = true; | this.editGFWUserRuleItem.Enabled = true; | ||||
this.editOnlinePACItem.Enabled = false; | this.editOnlinePACItem.Enabled = false; | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
this.editLocalPACItem.Enabled = false; | this.editLocalPACItem.Enabled = false; | ||||
this.updateFromGFWListItem.Enabled = false; | |||||
this.updateFromGeositeItem.Enabled = false; | |||||
this.editGFWUserRuleItem.Enabled = false; | this.editGFWUserRuleItem.Enabled = false; | ||||
this.editOnlinePACItem.Enabled = true; | this.editOnlinePACItem.Enabled = true; | ||||
} | } | ||||
@@ -4,8 +4,13 @@ | |||||
<package id="Costura.Fody" version="3.3.3" targetFramework="net472" /> | <package id="Costura.Fody" version="3.3.3" targetFramework="net472" /> | ||||
<package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" /> | <package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" /> | ||||
<package id="GlobalHotKey" version="1.1.0" targetFramework="net472" /> | <package id="GlobalHotKey" version="1.1.0" targetFramework="net472" /> | ||||
<package id="Google.Protobuf" version="3.11.4" targetFramework="net472" /> | |||||
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" /> | <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" /> | ||||
<package id="NLog" version="4.6.8" targetFramework="net472" /> | <package id="NLog" version="4.6.8" targetFramework="net472" /> | ||||
<package id="StringEx.CS" version="0.3.1" targetFramework="net472" developmentDependency="true" /> | <package id="StringEx.CS" version="0.3.1" targetFramework="net472" developmentDependency="true" /> | ||||
<package id="System.Buffers" version="4.4.0" targetFramework="net472" /> | |||||
<package id="System.Memory" version="4.5.2" targetFramework="net472" /> | |||||
<package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net472" /> | |||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" /> | |||||
<package id="ZXing.Net" version="0.16.5" targetFramework="net472" /> | <package id="ZXing.Net" version="0.16.5" targetFramework="net472" /> | ||||
</packages> | </packages> |
@@ -77,6 +77,9 @@ | |||||
<Reference Include="GlobalHotKey, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL"> | <Reference Include="GlobalHotKey, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL"> | ||||
<HintPath>..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll</HintPath> | <HintPath>..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll</HintPath> | ||||
</Reference> | </Reference> | ||||
<Reference Include="Google.Protobuf, Version=3.11.4.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> | |||||
<HintPath>..\packages\Google.Protobuf.3.11.4\lib\net45\Google.Protobuf.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="Microsoft.CSharp" /> | <Reference Include="Microsoft.CSharp" /> | ||||
<Reference Include="Microsoft.VisualBasic" /> | <Reference Include="Microsoft.VisualBasic" /> | ||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | ||||
@@ -87,13 +90,26 @@ | |||||
</Reference> | </Reference> | ||||
<Reference Include="PresentationCore" /> | <Reference Include="PresentationCore" /> | ||||
<Reference Include="System" /> | <Reference Include="System" /> | ||||
<Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> | |||||
<HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="System.Configuration" /> | <Reference Include="System.Configuration" /> | ||||
<Reference Include="System.Data" /> | <Reference Include="System.Data" /> | ||||
<Reference Include="System.Data.DataSetExtensions" /> | <Reference Include="System.Data.DataSetExtensions" /> | ||||
<Reference Include="System.Drawing" /> | <Reference Include="System.Drawing" /> | ||||
<Reference Include="System.IO.Compression" /> | <Reference Include="System.IO.Compression" /> | ||||
<Reference Include="System.Management" /> | <Reference Include="System.Management" /> | ||||
<Reference Include="System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> | |||||
<HintPath>..\packages\System.Memory.4.5.2\lib\netstandard2.0\System.Memory.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="System.Net" /> | <Reference Include="System.Net" /> | ||||
<Reference Include="System.Numerics" /> | |||||
<Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> | |||||
<HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> | |||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath> | |||||
</Reference> | |||||
<Reference Include="System.Runtime.Serialization" /> | <Reference Include="System.Runtime.Serialization" /> | ||||
<Reference Include="System.ServiceModel" /> | <Reference Include="System.ServiceModel" /> | ||||
<Reference Include="System.Transactions" /> | <Reference Include="System.Transactions" /> | ||||
@@ -112,6 +128,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<Compile Include="Controller\HotkeyReg.cs" /> | <Compile Include="Controller\HotkeyReg.cs" /> | ||||
<Compile Include="Controller\LoggerExtension.cs" /> | <Compile Include="Controller\LoggerExtension.cs" /> | ||||
<Compile Include="Controller\Service\GeositeUpdater.cs" /> | |||||
<Compile Include="Controller\Service\PACDaemon.cs" /> | <Compile Include="Controller\Service\PACDaemon.cs" /> | ||||
<Compile Include="Controller\Service\NamedPipeServer.cs" /> | <Compile Include="Controller\Service\NamedPipeServer.cs" /> | ||||
<Compile Include="Controller\System\ProtocolHandler.cs" /> | <Compile Include="Controller\System\ProtocolHandler.cs" /> | ||||
@@ -133,6 +150,7 @@ | |||||
<Compile Include="Encryption\Stream\StreamMbedTLSEncryptor.cs" /> | <Compile Include="Encryption\Stream\StreamMbedTLSEncryptor.cs" /> | ||||
<Compile Include="Encryption\Stream\StreamOpenSSLEncryptor.cs" /> | <Compile Include="Encryption\Stream\StreamOpenSSLEncryptor.cs" /> | ||||
<Compile Include="Encryption\Stream\StreamSodiumEncryptor.cs" /> | <Compile Include="Encryption\Stream\StreamSodiumEncryptor.cs" /> | ||||
<Compile Include="Model\Geosite\Geosite.cs" /> | |||||
<Compile Include="Model\HotKeyConfig.cs" /> | <Compile Include="Model\HotKeyConfig.cs" /> | ||||
<Compile Include="Model\NLogConfig.cs" /> | <Compile Include="Model\NLogConfig.cs" /> | ||||
<Compile Include="Model\ProxyConfig.cs" /> | <Compile Include="Model\ProxyConfig.cs" /> | ||||
@@ -155,7 +173,6 @@ | |||||
<Compile Include="Controller\Strategy\StatisticsStrategy.cs" /> | <Compile Include="Controller\Strategy\StatisticsStrategy.cs" /> | ||||
<Compile Include="Controller\System\AutoStartup.cs" /> | <Compile Include="Controller\System\AutoStartup.cs" /> | ||||
<Compile Include="Controller\FileManager.cs" /> | <Compile Include="Controller\FileManager.cs" /> | ||||
<Compile Include="Controller\Service\GFWListUpdater.cs" /> | |||||
<Compile Include="Controller\I18N.cs" /> | <Compile Include="Controller\I18N.cs" /> | ||||
<Compile Include="Controller\Service\Listener.cs" /> | <Compile Include="Controller\Service\Listener.cs" /> | ||||
<Compile Include="Controller\Service\PortForwarder.cs" /> | <Compile Include="Controller\Service\PortForwarder.cs" /> | ||||
@@ -267,10 +284,12 @@ | |||||
<None Include="app.manifest"> | <None Include="app.manifest"> | ||||
<SubType>Designer</SubType> | <SubType>Designer</SubType> | ||||
</None> | </None> | ||||
<None Include="Data\dlc.dat" /> | |||||
<None Include="Data\i18n.csv" /> | <None Include="Data\i18n.csv" /> | ||||
<None Include="Data\libsscrypto.dll.gz" /> | <None Include="Data\libsscrypto.dll.gz" /> | ||||
<None Include="Data\NLog.config" /> | <None Include="Data\NLog.config" /> | ||||
<None Include="Data\privoxy.exe.gz" /> | <None Include="Data\privoxy.exe.gz" /> | ||||
<None Include="Model\Geosite\geosite.proto" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<None Include="Data\sysproxy.exe.gz" /> | <None Include="Data\sysproxy.exe.gz" /> | ||||
@@ -283,7 +302,6 @@ | |||||
</None> | </None> | ||||
<None Include="Resources\ssw128.png" /> | <None Include="Resources\ssw128.png" /> | ||||
<Content Include="Data\abp.js" /> | <Content Include="Data\abp.js" /> | ||||
<Content Include="Data\default-abp-rule.js" /> | |||||
<Content Include="Data\privoxy_conf.txt" /> | <Content Include="Data\privoxy_conf.txt" /> | ||||
<Content Include="Data\user-rule.txt" /> | <Content Include="Data\user-rule.txt" /> | ||||
<None Include="FodyWeavers.xml"> | <None Include="FodyWeavers.xml"> | ||||
@@ -322,6 +340,7 @@ | |||||
<Install>true</Install> | <Install>true</Install> | ||||
</BootstrapperPackage> | </BootstrapperPackage> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup /> | |||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | ||||
<Import Project="..\packages\Fody.4.2.1\build\Fody.targets" Condition="Exists('..\packages\Fody.4.2.1\build\Fody.targets')" /> | <Import Project="..\packages\Fody.4.2.1\build\Fody.targets" Condition="Exists('..\packages\Fody.4.2.1\build\Fody.targets')" /> | ||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | ||||